引用作为函数的返回值

引用作为函数的返回值——原版

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
  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值