C++传值、引用和指针的区别

来源:互联网 发布:古天乐杨过 知乎 编辑:程序博客网 时间:2024/06/06 06:40

今天重新看了看C++中类的具体实现,发现参数的传值、引用和指针方面认识理解的不够好。所以google了一些,现记录下来帮助自己以后回顾。

值传递:

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

指针传递:

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

引用传递:
形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

#include<iostream>
using namespace std;
void swap(int a,int b) //void swap(int & a,int &b) 函数内容不变 //void swap(int * a,int *b)
函数内容改成相应的指针调用(你懂得 {
int temp;
temp=a;
a=b;
b=temp;
}


 main()
{
int a=3,b=5;
cout<< "before ‘swap’:a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"after  ‘swap’:a="<<a<<",b="<<b<<endl;
}

传值时,相当于a,b新开辟一个内存区域,拷贝复制其值备份进入swap函数;

引用时,引用原来值所在的地址,不另开辟一块内存,但是在使用方法上和传值没有太大区别;

指针时,也要开一片内存来复制传递参数的值。如果是不好的的很容易引发外延性破坏。


应用:

引用和指针在类的多样性方面比较适用。例如:

   1、在赋值和赋值构造函数中,引用能很好轻松的解决问题

2、在重载符号时,需要使用引用;

3、C++调用引用比较安全。


总结:

当参数不希望被修改时,使用引用+const;当有可能要修改时,使用指针。

使用指针很容易引发外延性破坏。虽然引用也可以,但是要稍稍做点手脚。

C++中指针越少出现越好,能用引用替代就替代,能包装就包装。






原创粉丝点击