C ++用参数初始化引用

时间:2013-04-02 17:30:59

标签: c++

我有以下代码,我想知道它为什么写出“22”而不是垃圾

class example
{

public:

    example(int ea) : ref(ea)
    {
    }

    int& ref;
};

int main ()
{
    example obj(22);

    cout << obj.ref; // Writes out 22

    return 0;
}

我认为这应该发生:

  • obj(22)将22隐式转换为临时整数
  • 将整数复制到int ea参数
  • ref通过引用ea参数
  • 进行初始化
  • ea参数被销毁

为什么参考仍然有效?

3 个答案:

答案 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