You need to enable JavaScript to run this app. C++使用成员初始化列表初始化类引用成员的正确性疑问
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 10:27:02