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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 23:12:00