2

我有以下代码,我想知道为什么它写出“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参数被破坏

为什么参考仍然有效?

4

3 回答 3

5

简短的回答:这是无效的,它只是碰巧起作用。

长答案:您的事件顺序是正确的。引用指向一个超出范围的变量(在构造函数的末尾)。因此,它是一个悬空参考。从那时起对该引用的任何使用都会表现出未定义的行为。在这种情况下,它恰好打印出该值,但它也可以轻松地执行其他任何操作。

于 2013-04-02T17:33:56.353 回答
3

该引用仍然无效,并且访问它所引用的内存会产生未定义的行为。对你来说,它恰好指的是曾经包含一个值为 22 的整数并且尚未被重用的内存。

于 2013-04-02T17:34:56.060 回答
2

其未定义的行为。

试试这段代码看看有什么不同:

example obj(22);
example obj2(33);
example obj3(44);

cout << obj.ref; // <-- writes out 44 instead of 22
于 2013-04-02T17:38:47.257 回答