int temp;
int fun1()
{
temp = 10;
return temp;
}
int& fun2()
{
temp = 10;
return temp;
}
int main()
{
int a = 0, b = 0;
// 1. 返回函数的普通类型
a = fun1();
// 2. 返回函数的引用
b = fun2();
// 3. 返回函数的引用去初始化一个新的引用
int &c = fun2();
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
return 0;
}
// 编译结果:a = 10 b = 10 c = 10
转载:c++中引用作为返回值 - 知乎 (zhihu.com)
-
返回函数的普通类型
返回普通类型对象其实是返回这个对象的拷贝,c++其实会创建一个临时变量,这个临时变量被隐藏了,它会把temp的值拷贝给这个临时变量,当执行语句“a = fun1();”的时候就会把临时变量的值再拷贝给a,假设这个临时变量是t,相当于做了这两个赋值的步骤:t = temp; a = t;
-
返回函数的引用
返回引用实际返回的是一个指向返回值的隐式指针,在内存中不会产生副本,是直接将temp拷贝给a,这样就避免产生临时变量,相比返回普通类型的执行效率更高,而且这个返回引用的函数也可以作为赋值运算符的左操作数,但是这时候需要注意以下两个问题:
1). 千万别返回局部对象的引用,当函数执行完局部对象也就被销毁,栈空间被释放,从而返回的地址已经不存在,导致后面执行出错。
2). 返回堆区对象的引用,这种情况要特别注意,这时候返回函数的引用是作为一个临时变量出现,没有将它赋值给一个实际存在的变量,那么这个堆区对象的内存空间就没有释放,可能造成内存泄漏。有人说这样做是非法的?其实不是绝对的,只能说这种编程习惯很不好,这样做只是容易造成内存泄漏,只是我们要记住,我们在申请堆内存以后必须记得去释放这块内存。