为何通过返回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
相关产品推荐
相关产品推荐

