C++使用成员初始化列表初始化类引用成员的正确性疑问
代码示例2
.h 文件
struct A { private: int &i; // __change__ public: A(int&); };
.cpp 文件
A::A(int &k1): i(k1) // __change__ { std::cout<<&k1<<" "<<k1<<"\n"; std::cout<<&i<<" "<<i<<"\n"; }
main.cpp
int main() { int x=99; std::cout<<&x<<" "<<x<<"\n"; A a1(x); }
输出结果
0x72fe0c 99 0x72fe0c 99 0x72fe0c 99
疑问解答
- 第一个疑问:你的理解核心是正确的。引用是变量的别名,不存在多层绑定的间接关系:构造函数形参k1是x的别名,成员i绑定到k1,本质就是直接绑定到x本身,只要x的生命周期不短于类实例a1,i就始终是有效引用。
- 第二个疑问:你的理解完全正确。第一组代码中构造函数的形参k1是值传递产生的局部临时变量,仅在构造函数执行期间有效,成员i绑定到这个临时变量后,一旦构造函数执行结束k1销毁,i就会变成悬空引用,后续访问i会触发未定义行为。你看到的输出结果一致,只是因为测试打印操作在构造函数内部执行,此时k1还未销毁。
- 第三个疑问:你的判断正确。第一组写法存在严重的悬空引用隐患,属于错误实现。只有当构造函数参数为引用类型时,才能保证成员引用绑定到外部传入的原变量,只要原变量生命周期足够,引用就有效,这才是类引用成员初始化的正确通用方式。
内容的提问来源于stack exchange,提问作者user15915746
相关产品推荐
相关产品推荐

