用函数返回值,要生成一个值的副本,而用引用返回值,不生成值的副本。
example:下面的代码是有关引用返回的4种形式:
代码:
#include <iostream>
using namespace std;
float temp;
float fn1(float r){
temp = r * r * 3.14;
return temp;
}
float& fn2(float r){
temp = r * r * 3.14;
return temp;
}
int main(){
float a = fn1(5.0); //1
float x = fn1(5.0);
float& b = x;
// float& b = fn1(5.0); //2:warning
float c = fn2(5.0); //3
float& d = fn2(5.0); //4
cout <<a << endl;
cout <<b << endl;
cout <<c << endl;
cout <<d << endl;
return 0;
}
测试结果:
78.5
78.5
78.5
78.5
对主函数的4种引用返回的形式,程序的运行结果是一样的,但是他们在内存中的活动情况是各不相同的。其中变量temp是全局变量,驻留在全局数据区data,函数main(),fn1(),fn2()驻留在栈区stack。
第一种情况:一般的函数返回值方式,返回全局变量temp值时,C++创建临时变量并将temp的值78.5复制给该临时变量。返回主函数,赋值语句a=fn1(5.0)把临时变量的值复制给a。
第二种情况:这种情况会出现错误,函数fn1()是以值的方式返回的,返回时,复制temp的值给临时变量。返回到主函数后,引用b以该临时变量来初始化,使得b成为该临时变量的别名。由于临时变量的作用域短暂,所以b面临无效的危险。
第三种情况:这种情况下,函数fn2()的返回值不产生副本,所以,直接将变量temp返回给主函数。主函数的赋值语句中的左值c直接从变量temp中得到复制,这样避免了临时变量的产生。当变量temp是一个用户自定义的类型时,这样方式直接带来了程序执行效率和空间利用的利益。
第四种情况:函数fn2()返回一个引用,因此不产生任何返回值的副本。在主函数中,一个引用声明d用该返回值来初始化,使得d成为temp的别名。由于temp是全局变量,所以在d的有效期内temp始终保持有效。这样做法是安全的。
注意:如果返回不在作用域范围内的变量或对象的引用,那就有问题了。这与返回一个局部作用域指针的性质一样严重。此处的temp是全局变量哦!!!