04 引用做函数的返回值
作用:引用可以作为函数的返回值
注意:不要返回局部变量的引用
作用:函数调用作为左值
我们分开理解一下:
-
引用可以作为函数的返回值,但是不要返回局部变量的引用。
如何将引用作为函数的返回值:
int& test1(); int main() { int& ref = test1(); } int& test1() { int a = 10; return (a); }
如上文,返回的是引用时,需要在函数的声明的时候标注引用:也就是:
int& test1();
。但是不能返回局部变量的引用,这是因为函数内的数据存放在栈区,这个区域的数据由编辑器控制开辟和释放。如果离开这个函数,数据将会被编译器清除(虽然会保存一次。)
如果忘记栈区的话可以翻内存四区的笔记。
但是可以试试返回的后果:
#include
using namespace std; int& test1(); int main() { int& ref = test1(); for (int i = 0;i < 3;i++) { cout << ref << endl; } return 0; } int& test1() { int a = 10; return (a); } 结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
10 214 214
第一次能成功打印 10,是因为编译器做了保留。第二次及以上,则会显示乱码。当然,出了函数,在使用引用或者地址,那就是非法操作了。
-
函数的调用可以作为左值
#include
using namespace std; int& test2(); int main() { int& ref = test2(); for (int i = 0;i < 3;i++) { cout << ref << endl; } return 0; } int& test2() { static int a = 10; return a; } 在这里,函数
test2
里面的变量a
不是一个局部变量,而是一个静态变量(静态变量:数据存放在全局区,在程序运行结束后,由操作系统释放。)什么是静态变量:在普通的变量前添加
static
就属于静态变量。(翻内存四区笔记)。这样返回的引用就不会因为函数的运行结束而被删除。
运行一下:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
10 10 10
但是,我们修改一下:
#include
using namespace std; int& test2(); int main() { int& ref = test2(); cout << ref << endl; cout << ref << endl; test2() = 1000; cout << ref << endl; return 0; } int& test2() { static int a = 10; return a; } 仔细观察会发现。新增了一行:
test2() = 1000;
在这一行里面,函数test2
变成了赋值的左值。运行一下:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
10 10 1000
最后会发现,再次打印
ref
,数值变成 1000 了。test2
返回的是a
的引用。相当于返回的就是 a 了(而且这个还是静态变量,不会因为函数运行结束而被删除。)所以test2() = 1000;
相当于就是a = 1000;
。而ref 就是 a 的别名。所以 a 变为了 1000,ref 也会变成 1000。如果函数的返回值是引用,那么这个函数调用可以作为左值
:-)