赞
踩
上一篇博客 【C++】C++ 引用详解 ③ ( 函数返回值不能是 “ 局部变量 “ 的引用或指针 | 函数内的 “ 局部变量 “ 的引用或指针做函数返回值无意义 ) 得出如下结论 :
函数的返回值 是 “ 局部变量 “ 的 引用 或 指针 时 , 是无意义的 ;
函数 执行完毕后 , 该 函数对应的 栈内存 会被回收 , 相应的 局部变量 地址 也有没有了意义 ,
此时 , 再持有一个 函数返回的 没有意义的 引用 / 指针 , 取出的值是随机无意义的值 ;
函数 返回的是 " 静态变量 " 或 " 全局变量 " 的 引用 / 指针 时 , 是可以的 ;
如果 函数 的 返回值 是 静态变量 或 全局变量 的引用 ,
这两种变量 一旦分配内存后 , 在整个程序的生命周期中 , 该内存都不会被回收 ,
返回它们的 引用 / 指针 , 可以正常访问 对应 内存中的数据 ;
在下面的代码中 ,
fun 函数作为 参照 , 返回普通的 静态变量 ;
fun2 函数 返回 静态变量 的引用 ;
上述两个函数的 静态变量 的生命周期 都是 与 程序生命周期相同的 , 只有程序结束时 , 这两个 静态变量的内存才会被回收 ;
使用 引用 接收 fun2 函数返回的引用 , 获取的是静态变量的引用地址 , 该引用对应的内存一直是有效的 , 因此可以通过该引用获取到内存中正确的 静态变量值 ;
代码示例 :
// 导入标准 io 流头文件 // 其中定义了 std 命名空间 #include <iostream> // 导入 std 命名空间 using namespace std; #include <stdio.h> // 返回静态变量 int fun() { static int a = 10; return a; } // 返回引用 int& fun2() { static int a = 20; return a; } int main() { // 使用普通变量接收变量返回值 int a1 = fun(); // 使用普通变量接收引用返回值 int a2 = fun2(); // 使用引用接收 引用返回值 int& a3 = fun2(); // 混淆栈内存选项 int a4 = fun(); // 打印上述返回结果 printf("a1 = %d , a2 = %d , a3 = %d , a4 = %d\n", a1, a2, a3, a4); return 0; }
执行结果 :
a1 = 10 , a2 = 20 , a3 = 20 , a4 = 10
Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 13496)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。