请考虑以下代码:
#include <iostream>
using namespace std;
class test
{
int& ref;
public:
test(int i):ref(i)
{
cout << "Constructor Called" << endl;
}
void p(){ cout<< ref << "\n";}
};
int main()
{
test obj(5);
obj.p();
return 0;
}
输出:
Constructor Called
5
的疑问: 如何在这里使用整数值(5)初始化非const引用(ref),而以下代码失败:
int& r = 5;
答案 0 :(得分:5)
test's
构造函数:
test(int i)
将int
作为参数按值。
通过将obj
传递给其构造函数来初始化5
对象,即:
test obj(5);
该构造函数的参数i
设置为5
(即:5
被复制到i
),然后成员参考ref
在构造函数成员初始化列表中使用此参数进行初始化(而不是构造函数调用中使用的文字5
):
test(int i):ref(i)
您有一个 danging参考:基准ref
会超越所引用的对象(i
),由于构造&#39; s参数i
不再在构造函数返回后存在。
答案 1 :(得分:4)
引用未直接用5初始化,它正在使用本地i
进行初始化。由于i
在构造函数退出时被销毁,因此您将留下dangling reference,这是一个引用超出范围的对象的引用。像Clang这样的编译器会告诉你这个问题,警告可能是这样的:
警告:绑定参考成员&#39; ref&#39;堆叠分配的参数&#39; i&#39; [<强> -Wdangling场强>