You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何通过返回const引用的Getter赋值的const引用变量不符合预期?

问题:C++中const引用为何会随原变量更新?

我编写了如下C++代码:

#include <iostream>

class Walltimes 
{
  private:
    double walltime = 0.0;

  public:
    void update_walltime(double delta)
    {
        walltime += delta;
    }

    double const& get_walltime() const
    {
        return walltime;
    }
};

int main(){
    Walltimes myObj;

    double const& t1 = myObj.get_walltime();  // Time "t1"

    myObj.update_walltime(4.78);              // Update the walltime

    double const& t2 = myObj.get_walltime();  // Time "t2"

    std::cout << "t1: " << t1 << "s\n";
    std::cout << "t2: " << t2 << "s" << std::endl;

    return 0;
}

我预期t1的值为0.0,t2的值为4.78,但实际运行输出为:

t1: 4.78s
t2: 4.78s

当将t1和t2的类型改为double const(移除&),或移除get_walltime()声明中的引用符号时,可得到预期结果。我原本使用引用是为了避免拷贝,想获取walltime当前值的const引用,现想了解当前代码出现该现象的原因。


原因分析

核心原因是你用t1绑定的是myObj内部walltime成员的引用,而非它的副本:

  • 执行double const& t1 = myObj.get_walltime();时,t1并没有复制walltime的数值,而是直接成为myObj.walltime的"别名"——二者指向同一块内存地址。
  • 后续调用myObj.update_walltime(4.78);修改的就是这块内存里的值,所以t1再被读取时,自然会拿到更新后的4.78;而t2同样是myObj.walltime的引用,结果和t1完全一致。

当你移除引用符号时:

  • 不管是把t1改成double const,还是让get_walltime()返回值而非引用,本质都是在赋值时创建了walltime的独立副本——t1会存储当时walltime的数值(0.0),后续原变量的修改不会影响这个副本,所以能得到预期结果。

简单总结:引用就是原变量的别名,修改原变量等同于修改引用;值拷贝是独立的副本,原变量变化不会影响副本。


内容的提问来源于stack exchange,提问作者au139801

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:15:44