1、引用作为函数的返回值时,必须在定义函数时在函数名前将&
2.用引用作函数的返回值,的最大的好处是在内存中不产生返回值的副本
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); //case 1:返回值
//float &b=fn1(5.0); //case 2:用函数的返回值作为引用的初始化值
float c=fn2(5.0);//case 3:返回引用,返回引用的方式调用函数
float &d=fn2(5.0);//case 4:返回引用,作为新引用的初始化值
//temp是全局变量,所以在d的有效期内temp始终保持有效
}
3.不能返回局部变量的引用。
case 4 ,如果temp是局部变量,那么它会在函数返回后被销毁,此时对temp的引用就会成为“无所指”的引用,程序会进入未知状态。
4.不能返回函数内部通过new分配的内存的引用。
虽然不存在局部变量的被动销毁问题,但如果被返回的函数的引用只是作为一个临时变量出现,而没有将其赋值给一个实际的变量,那么就可能造成这个引用所指向的空间(有new分配)无法释放的情况(由于没有具体的变量名,故无法用delete手动释放该内存),从而造成内存泄漏。因此应当避免这种情况的发生
string& foo()//去掉引用就可以
{
string* str = new string("abc");
return *str;//非法
}
返回的引用是new分配的对象,只是作为一个临时变量出现(是可以的),而没有将其赋值给一个实际的变量,引用所指向的空间无法释放的情况
临时变量
C++ 中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量。
函数返回值
1 string proc()
2 {
3 return string("abc");
4 }
5
6 int main()
7 {
//表达式完成后,就被销毁
8 proc();//没有通过引用,就会出现临时变量,
9 return 0;
10 }
类型转换
1 int a = 3;
2
3 float k = 2.0;
4 float f = k + a;表达式完成后,就被销毁
生存周期延长
初始化引用
第 8 行产生的临时变量因为有 ref 指向,临时变量的生命周期就会被延长至直到 main() 返回,直到引用被销毁
1 string Proc()
2 {
3 return string("abc");
4 }
5
6 int main()
7 {
8 const string& ref = Proc();
9 cout << ref << endl;
10 return 0;
11 }
5当返回类成员的引用时,最好是const引用。
这样可以避免在无意的情况下破坏该类的成员。
6.可以用函数返回的引用作为赋值表达式中的左值
int value[10];
int error=-1;
int &func(int n){
if(n>=0&&n<=9)
return value[n];//返回的引用所绑定的变量一定是全局变量,不能是函数中定义的局部变量
else
return error;
}
int main(){
func(0)=10;
}
10
12