C++函数返回引用

首先需要明白:C++函数为什么要返回引用?

答:这样就不用返回结果的副本。因为返回副本需要做赋值拷贝函数,浪费时间。这时候,实际上,返回是结果的副本,而不是结果本身。如果要返回本身,就返回引用就OK了。

例1:

[cpp]  view plain copy
  1. const string manip2(const string& s){  
  2.     string ret = s;  
  3.     return ret;  
  4. }  
此时,返回的不是ret本身,而是ret的副本。这个副本调用复制构造函数,与ret一摸一样。无法区别它和ret,带来的性能的损失。

记住,C++函数返回引用,一定不能返回指向本地的变量的引用。否则,函数运行完毕,本地变量销毁,那这个引用是谁的别名呢?who knows,程序只有崩溃了。

C++函数如果返回引用,就要返回在这个函数之前就存在的变量的引用才行。

例2C++函数返回本地变量的引用

[cpp]  view plain copy
  1. const string& manip1(const string& s){  
  2.     string ret = s;  
  3.     return ret;               //never do this  
  4. }  

可以看出,例子1和例子2的区别是很微妙的,只有返回值类型不一样:string和string&。如果申明了string&,那么函数就直接返回了ret而不是ret的副本。当函数结束的时候,ret变量被销毁,如果主函数用到了这次函数的调用,程序立即崩溃。我刚才试了试,确实崩溃了。


哈哈,谁都不想看到上面的那个图吧。而且,在编译的时候,编译器也给出了警告:..\test.cpp:4:9: warning: reference to local variable 'ret' returned

这里是测试代码:

[cpp]  view plain copy
  1. # include <iostream>  
  2. using namespace std;  
  3. const string& manip1(const string& s){  
  4.     string ret = s;  
  5.     return ret;  
  6. }  
  7. const string manip2(const string& s){  
  8.     string ret = s;  
  9.     return ret;  
  10. }  
  11. int main(){  
  12.     string test("hello,world");  
  13.     string result1 = manip1(test);  
  14.     string result2 = manip2(test);  
  15.     cout << result1 << endl;  
  16.     cout << result2 << endl;  
  17. }  

我前面自己写两个complex的复数类实现点击查看

在重载+运算符号的时候,我就是返回的引用:

[cpp]  view plain copy
  1. my_complex& my_complex::operator +(const my_complex& rhs) {    
  2.     real = rhs.real + real;    
  3.     imag = rhs.imag + imag;    
  4.     return *this;    
  5. }    
由于我返回的引用在此次调用函数之前就已经存在(*this),那么,我返回的引用是合适的。而我看了看不少网上其它人的实现,这里返回的都是my_complex,不是一个引用。也许还有其它考虑
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值