链式调用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
相关产品推荐
相关产品推荐

