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

链式调用C++类成员函数结果异常?基于this指针解析调用差异

链式调用与分两次调用的差异解析(基于this指针)

先贴出问题中的代码:

#include<iostream>
using namespace std;
  
class Test
{
private:
  int x;
  int y;
public:
  Test (int x = 0, int y = 0) { this->x = x; this->y = y; }
  Test setX(int a) { x = a; return *this; }
  Test setY(int b) { y = b; return *this; }
  void print() { cout << "x = " << x << " y = " << y << endl; }
};

核心问题:返回值是对象拷贝而非引用

setX和setY的返回类型是Test,这意味着每次调用都会返回当前对象的一个拷贝副本,而非原对象本身的引用,这是两种调用结果不同的关键。

1. 链式调用 obj1.setX(10).setY(20) 的执行逻辑

  • 调用obj1.setX(10)时,this指针指向原对象obj1,成功把obj1的x改成10。但函数返回的是*this的拷贝——也就是一个和obj1当前状态一致的临时Test对象。
  • 紧接着的.setY(20),此时this指针指向的是刚才生成的临时对象,修改的是这个临时对象的y值,原对象obj1的y完全没被改动。
  • 最后调用obj1.print(),自然只会看到x=10,y还是初始的0。

2. 分两次调用 obj1.setX(10); obj1.setY(20); 的执行逻辑

  • 第一次调用obj1.setX(10):this指向obj1,修改obj1的x为10,返回的拷贝对象因为没人使用,直接被销毁。
  • 第二次调用obj1.setY(20):this依然指向原对象obj1,直接修改obj1的y为20。
  • 最后obj1.print()时,x和y都是原对象被修改后的正确值。

如果想让链式调用达到预期效果,只需要把setX和setY的返回类型改成Test&(对象引用),这样返回的就是原对象本身,后续的链式操作都会直接作用在原对象上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:55:32