我最近阅读了C ++中的引用。我知道引用的基本属性,但我仍然无法弄清楚为什么跟随两个程序产生不同的输出。
#include<iostream>
using namespace std;
int &fun()
{
static int x = 10;
return x;
}
int main()
{
fun() = 30;
cout << fun();
return 0;
}
此程序打印30
作为输出。根据我的理解,函数fun()
返回对x
占用的内存位置的引用,然后为30
分配值,并在fun()
的第二次调用中分配声明被忽略。
现在考虑这个程序:
#include<iostream>
using namespace std;
int &fun()
{
int x = 10;
return x;
}
int main()
{
fun() = 30;
cout << fun();
return 0;
}
此程序将输出生成为10
。是因为,在第一次通话后,x
被分配了30
,并且在第二次通话后,它又被覆盖到10
,因为它是一个局部变量?我错了吗?请解释一下。
答案 0 :(得分:3)
在第一种情况下,无论您调用多少次,fun()
都会返回对同一变量的引用。
在第二种情况下,fun()
会在每次调用时返回对不同变量的悬空引用。函数返回后,引用无效。
使用时
fun() = 30;
在第二种情况下,您要设置的变量值不再有效。从理论上讲,这是不确定的行为。
在第二种情况下第二次拨打fun()
时,变量x
设置为10
。这与对同一函数的第一次调用无关。
答案 1 :(得分:0)
只是添加到已经说过的内容。第一个案例行为背后的原因是因为它是static
变量,具有静态持续时间。静态持续时间表示在程序启动时分配对象或变量,并在程序结束时取消分配。
这意味着第一种情况下x
第一次使用10
初始化后,下一次函数调用将忽略static int x = 10;
,因为x
无法再次实例化,因为它已经被分配,并且只会继续return x;
,这与x
中分配了30
的{{1}}相同。
答案 2 :(得分:0)
基本上,你的理解是正确的,除了在第二种情况下,你正在处理局部变量的悬挂引用已经无效,这是未定义的行为,意味着一切皆有可能。你说的只是其中一种可能性,它也可能导致其他的,例如获取随机数,程序崩溃等。