c++用形参初始化引用

C++ initializing reference with a parameter

本文关键字:引用 初始化 形参 c++      更新时间:2023-10-16

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

为什么引用仍然有效?

简短的回答:这是无效的,它恰好工作。

长回答:你的事件顺序是正确的。引用指向已经超出作用域的变量(在构造函数的末尾)。因此,它是一个悬空引用。此后对该引用的任何使用都会显示未定义的行为。在本例中,它只是输出了值,但它也可以很容易地执行其他操作。

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

它的未定义行为

试试下面的代码看看差异:

example obj(22);
example obj2(33);
example obj3(44);
cout << obj.ref; // <-- writes out 44 instead of 22