函数声明与取地址运算符:函数func的返回值究竟是什么?
函数
func的返回值到底是什么? 嘿,这个问题问得很到位!咱们先把代码摆出来看清楚:
int a = 10; int &func() { return a; } int main() { int b = func(); std::cout << b; // 输出10 }
首先明确:func的返回值是对全局变量a的左值引用——换句话说,它返回的不是a的数值副本,而是a本身的"别名"或者说"绑定关系"。
接下来拆解main里的行为:
- 当你写
int b = func();时,编译器会先让func()返回指向a的引用,然后触发拷贝初始化:把这个引用指向的a的当前值(也就是10)复制一份,赋值给新的变量b。所以b是一个独立于a的变量,值为10,这就是输出10的原因。
这里有个关键的区分点:
如果把main里的代码改成int &b = func();,那b就会成为a的另一个别名——此时修改b的值,a的值也会跟着变,因为它们本质上是同一个内存地址的不同名字。
另外要提一句:因为a是全局变量,它的生命周期覆盖整个程序运行过程,所以返回它的引用是安全的,不会出现"悬垂引用"(引用指向已经销毁的对象)的问题。要是func返回的是局部变量的引用,那程序就会有未定义行为了。
内容的提问来源于stack exchange,提问作者Etwus
相关产品推荐
相关产品推荐

