函数何时可以返回变量的引用

函数返回值通常有(1)void类型(2)非引用类型(3)引用类型

对于前面两种是经常见到,也是容易理解的。

void princess(){//无返回值类型

//...

}

int count(const string & s) {//返回非引用类型

return s.size();

}

对于无返回类型就不用介绍了,返回非引用类型实际上是把return 后面的值,作为临时变量,对其复制一份返回就行(类似于值传递)。

当然也就不论它后面值是局部变量,还是全局变量或者其他的。


上面两种是大家都容易理解和常用的,但是对于第三个,函数返回引用类型,可能会有疑问。这个疑问可能主要来自于来自于C方面书籍上的一句话,“千万不要返回局部对象的引用”,当时课本的解释大概是,当函数在执行完毕后,会释放分配给局部对象的存储空间,对局部对象的引用就会指向不确定的内存。例如下面代码:

const string & copyl(const string &s) {

string sl = s;

return sl;

}//返回局部变量的引用

如果调用上述代码,程序会在运行的时候出现未知错误(当然,在编译时候不会出错)。既然返回局部变量的引用会出错,那谈何函数返回引用类型呢?

这里得提醒下大家,上面说的是“返回局部变量的引用会出错”,那如果返回的不是局部变量的引用呢,测试代码如下:

const string & copy(const string &s) {

return s;

}//返回参数的引用,即非局部变量的引用



上述代码运行是完全没有问题的。通过上述的具体测试后,大体总结下:

(1)函数返回非引用,实际就是将需要返回的值复制一份返回,无论需要返回的是局部变量还是全局变量

(2)函数千万不能返回局部变量的引用,因为在函数执行后,局部变量内存被计算机回收,局部变量的引用也就指向未知内存了

(3)函数返回引用时,可以是通过参数传递进来的(就是参数列表中有的变量),也可以是全局变量,切记不能是局部变量

(4)上述的引用可以换成指针,同样是成立的


PS:绝不要返回一个局部栈对象的指针或引用,绝不要返回一个被分配的堆对象的引用,如
果存在需要一个以上这样的对象的可能性时,绝不要返回一个局部 static 对象的指针或引
用。(FROM:Effective Cpp   Item 21)

注:如需转载,请注明出处!吐舌头

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值