我有以下代码,我想知道它为什么写出“22”而不是垃圾
class example
{
public:
example(int ea) : ref(ea)
{
}
int& ref;
};
int main ()
{
example obj(22);
cout << obj.ref; // Writes out 22
return 0;
}
我认为这应该发生:
为什么参考仍然有效?
答案 0 :(得分:5)
简短回答:它无效,只是恰好工作。
答案很长:您的活动顺序是正确的。引用指向超出范围的变量(在构造函数的末尾)。因此,它是一个悬垂的参考。从那一点开始对该引用的任何使用都表现出不确定的行为。在这种情况下,它恰好打印出值,但它可以轻松地做任何其他事情。
答案 1 :(得分:3)
引用仍然无效,并且访问它引用的内存会给出未定义的行为。对于你来说,它碰巧引用了一些曾经包含一个值为22的整数但尚未被重用的内存。
答案 2 :(得分:2)
其未定义的行为。
尝试使用此代码查看差异:
example obj(22);
example obj2(33);
example obj3(44);
cout << obj.ref; // <-- writes out 44 instead of 22