引用
- 作用
- 作为函数返回值
1、作用
普通的函数的参数传递方式是值传递,即在函数域中为参数重新分配内存空间,然后把实参的数值传递进去(会在传递前创建一个无名的副本,通过副本传)。它的优点是有效的避免了函数的副作用,在函数调用时不会无意中的修改实参的值。如果需要改变实参的值,该怎么办?
在实际中如果遇到实参是一个非常复杂的对象,重新分配内存会引起程序执行的效率大大下降。所以C++就导出来新的数据类型——引用,来解决。它是一种非常特殊的数据类型,它不去定义一个新的变量,而是给已经定义好的变量重新起一个“别名”,也就是系统不会为引用变量分配内存空间(主要用于函数之间的数据传递)。逻辑上和原先定义的变量指向同一块内存空间。定义形式:
类型 & 引用变量名 = 已定义过的变量名;
double number;
double & newnum = number;
其中newnum是新定义的类型变量,它是变量number的别名。number和newnum是同一变量,如果程序修改了newnum,也就修改了number,内存分配如下图:
引用的目的是为了使函数的参数传递过程更加的灵活方便和具有多样性。
2、作为函数返回值
引用可以作为函数的返回值。一般的函数返回一个值时,要生成一个临时的变量作为返回值的副本,而使用引用作为返回值时,不生成值副本(生成地址副本)。
#include<iostream>
using namespace std;
double temp;
double fspr1(double a){
temp = a*a;
return temp;
}
double &fspr2(double a){
temp = a*a;
return temp;
}
int main(){
double x = fspr1(5.5); //第一种情况
double y = fspr2(5.5); //第二种情况
cout<<"x="<< x <<'\t'<<"y="<< y <<endl;
return 0;
}
运行结果为:x=30.25 y=30.25
参数的传递情况如下:
如上图所示在普通返回方式时,函数fsqr1()返回全局变量temp,先将temp的值赋给一个无名的临时变量,回到主函数后,赋值语句x=fsqr1(5.5)再把临时变量的值赋给x,则无名临时变量的生命周期介绍。
对于引用返回方式时,没有使用无名的临时变量过度,而是直接返回temp本身给y。无名临时变量中存放的是temp的地址,不产生副本,效率更高。
注意:对于数组,只能引用数据的元素,不能引用数组(数组名本身为地址)。