C++引用随笔一

C++引用作为函数的返回值

Posted by jxb2018 on March 14, 2019

我们从以下四种情况来讨论一下:

image

case1: return一个值给变量赋值

image temp是全局变量,存储在全局/静态存储区。当fun1()返回全局变量temp的值时,C++会在内存中创建一个临时变量,然后把temp的值拷贝给临时变量。当在main函数中执行float a = fun1(2);时,C++会再把这个临时变量的值拷贝给main中的变量a。

case2:return一个值给引用变量初始化

image 这种情况下,会产生编译错误。(error:invalid initialization of non-const reference of type ‘float&’ from an rvalue of type ‘float’)

为什么会产生编译错误?因为fun1返回temp的值的时候,C++会在栈上创建一个临时变量,并且temp的值拷贝给这个临时变量。在main函数中执行float &b = fun1()后,使得b成为C++在栈上创建的临时变量的别名。但是在C++标准中临时变量或对象的生命周期短暂,在一个完整语句执行完之后便会消亡。所以b面临无效的危险,很有可能以后的值是个无法确定的值,这显然是不被允许的。

case3:return一个引用给变量赋值

image 这种情况下,不会产生副本。函数fun2()将temp返回给main,直接使用存储在全局静态存储区中的temp将值拷贝给main中的c,这样避免了临时变量的产生。 同时,提高了程序的时间和空间的使用效率。

case4:return一个引用给引用初始化

image 这种情况下,不会产生副本。函数fun2()直接将temp返回给main。在main中float d = fun2(2);执行后,初始化了引用声明d,从此d成为全局变量temp的别名。由于temp是全局变量,所以位置固定,并且在d的有效期中始终有效,所以这样子是安全的。

参考 https://blog.csdn.net/weixin_40539125/article/details/81410008