C++ setter返回*this时链式调用修改失效问题原因分析
问题原因分析
核心问题是setX、setY成员函数的返回值为Point值类型,而非Point&引用类型,具体执行逻辑如下:
- 调用
p.setX(1000)时,确实修改了原对象p的x成员为1000,但执行return *this时,会触发拷贝构造函数生成一个独立的临时Point对象,该临时对象是原p的副本,和原p占用不同的内存空间。 - 后续链式调用的
.setY(2000),实际是作用在上述临时对象上,仅修改了临时对象的y值,完全没有改动原对象p的y成员。临时对象在语句执行结束后就会被销毁,所以最终输出原对象p的属性时,y值还是最初的20。
修复方案
如果要支持链式调用,只需要将两个set函数的返回值修改为Point左值引用即可:
// 原错误写法 Point setX(int x) { this->x = x; return *this; } Point setY(int y) { this->y = y; return *this; } // 修正后写法 Point& setX(int x) { this->x = x; return *this; } Point& setY(int y) { this->y = y; return *this; }
修改后返回的是原对象的引用,不会生成临时拷贝,后续的setY会直接作用在原对象p上,即可得到预期的1000 2000的输出结果。
内容的提问来源于stack exchange,提问作者Ajay kumar soni
相关产品推荐
相关产品推荐

