引用传回左值,左值可赋值,右值不可赋值

函数返回值分为:值,引用,指针三种。引用是c没有而c++有的,并且因为引用是左值实现了运算符连续运算的基础,而值和引用都不可以。下面我们就来看一下这三种返回方式的各自的特点:

1、返回值

[cpp]  view plain copy
  1. int test1()  
  2. {  
  3.     int a = 1;  
  4.     retur a;  
  5. }  
返回值是最简单有效的方式,他的操作主要在栈上,根据函数栈的特性局部变量a会在函数结束时被删除,为了返回a的值,需要产生a的复制。如果a原子类型这当然也无所谓,但是如果a是大的对像,那么对a的复制将会产生比较严重的资源和性能消耗。注意函数返回值本身因为没有名称或引用是右值,是不能直接操作的。

2、返回指针

[cpp]  view plain copy
  1. int* test2()  
  2. {  
  3.     int *b = new int();  
  4.     *b = 2;  
  5.     return b;  
  6. }  
返回指针是在C中除了返回值以外的唯一方式,根据函数栈的特性也会产生复制,但是这个复制只是4(8)字节的指针,对于返回大型对像来说确实能够减少不少的资源消耗。但是返回指针资源的清理工作交给了调用者,这某种意义上违反了谁申请谁销毁的原则。指针也是右值同样无法操作。

3、返回引用

[cpp]  view plain copy
  1. int& test2()  
  2. {  
  3.     int *b = new int();  
  4.     *b = 2;  
  5.     return *b;  
  6. }  
引用是C++中新添加的概念,所以返回引用也是C++中相对于C来说所没有的。引用是值的别名,和指针一样不存在对大对像本身的复制,只是引用别名的复制。引用是左值,返回引用可以直接操作,也就可以进行连续赋值,最经典的示例是拷贝构造函数和运算符重载一般返回引用。

[cpp]  view plain copy
  1. test2()+=1;  

但是,返回引用会带来一个问题,那就是返回局部变量内存空间,会产生异常,也就是说局部变量是不能作为引用返回的。局部指针可以作为引用返回但是和返回指针一样需要调用者自己去清理内存。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值