目录
1:什么是引用
引用就是别名,如:int &rnum = num;
rnum 是整型变量 num 的别名,这样,对 rnum 的操作实际就是对 num 的操作。
&rnum的值&num的值(地址)是一样。
注意:定义引用时一定要同时对该引用进行初始化,如:
int a;
int &b = a;
而不能写成
int a;
int &b;
b = a;
这样是错误的。引用就如同常量,只能对其初始化,不能赋值
2:函数的参数传递
1:按值传递
2:指针传递
3:引用传递
void fun(int &aa,int &bb)
{
int c;
cout<<"fun:交换前,a = "<<aa<<", b = "<<bb<<endl;
c = aa;
aa = bb;
bb = c;
cout<<"fun:交换后,a = "<<aa<<", b = "<<bb<<endl;
}
int main()
{
int a=3,b=4;
cout<<"main:交换前,a = "<<a<<", b = "<<b<<endl;
fun(a,b);
cout<<"main:交换后,a = "<<a<<", b = "<<b<<endl;
return 0;
}
它类似于指针的传递方式,仅仅是将 a 和 b 的内存地址以直接引用的方式传递到函
数体中,因此不会复制 a 和 b 的数据到栈中,这样在函数内的操作就是对 a 和 b 的别名 aa 和bb 的操作,我们知道对象的别名与其内存地址相同,因此对 aa 和 bb 的操作就是对 a 和 b 的操作
注意:
指针是间接访问,比如它要用*来读取*后面地址处的数据,而引用则是直接访问,它是某个对象的别名,因此不用任何符号就可以直接读取该对象的数据。因此将指针作为函数的接收参数是间接引用方式来接收参数,而将别名作为函数的接收参数是以直接引用方式来接收参数。
3:传递对象
1:通过值传递对象
按值传递在向函数传递一个对象时,会像传递变量那样建立一个该对象的拷贝,而从函数返回一个对象时,也要建立这个被返回的对象的一个拷贝。(浪费)
2:通过指针传递对象
传递的对象的地址,不用建立一个新的对象的拷贝,节省了资源
3:用const指针传递对象
这样可以保证该函数接收和返回的对象是不可修改的,同时因为传递的地址,同样节省了资源
4:通过引用传递对象
由于引用不能重新分配去引用另一个对象,它始终是常量,因此我们不用将它设置为常量。(既节省资源,又保证了不可修改)
4:总结
在函数中按地址返回一个栈中对象时,由于该对象是从函数中创建的,函数返回后,该函数的栈中对象也被销毁了,因此不要对这个不存在的对象进行任何操作。