技术问询:编程中‘return *this’语句的实际作用是什么?
return *this的功能与作用 嘿,这个问题问到点子上了!咱们就以C++(它是最常用到这个语句的语言)为例,把return *this的来龙去脉讲明白。
首先得先搞懂this指针是什么:在类的成员函数里,this是一个指向当前对象的指针——说白了,它存的就是你正在操作的那个对象在内存里的地址。那*this呢?就是对这个指针“解引用”,得到的就是当前对象本身,是实实在在的实例,不是地址。
那return *this到底能干啥?核心作用有两个,咱们一个个说:
1. 实现链式调用,让代码更简洁
这是return *this最常用的场景。比如你有一个类,里面有多个用来设置属性的成员函数,要是每个函数都返回*this(准确说是返回当前对象的引用ClassType&),那你就能把多个函数调用连在一起写,不用每次都写对象名。
举个实际的代码例子:
class Rectangle { private: int width, height; public: // 返回当前对象的引用 Rectangle& setWidth(int w) { width = w; return *this; } Rectangle& setHeight(int h) { height = h; return *this; } void calculateArea() { std::cout << "Area: " << width * height << std::endl; } }; // 调用的时候就可以这么写: Rectangle rect; rect.setWidth(5).setHeight(10).calculateArea(); // 输出 Area: 50
为啥能这么连?因为setWidth(5)返回的是rect这个对象的引用,所以接下来调用setHeight(10)还是在操作rect,最后再调用calculateArea也是操作同一个对象。要是每个函数不返回*this,你就得写成三行:
rect.setWidth(5); rect.setHeight(10); rect.calculateArea();
虽然功能一样,但链式写法明显更紧凑清爽。
2. 支持链式赋值,让赋值操作更灵活
这个场景主要用在重载赋值运算符的时候。比如你自定义了类的赋值运算符,返回*this的话,就能实现类似obj1 = obj2 = obj3这样的链式赋值。
看代码例子:
class Rectangle { // 上面的成员变量和函数省略... public: Rectangle& operator=(const Rectangle& other) { // 先防止自赋值(自己赋值给自己) if (this != &other) { width = other.width; height = other.height; } return *this; } }; // 链式赋值 Rectangle rect1, rect2, rect3; rect3.setWidth(3).setHeight(4); rect1 = rect2 = rect3; // 先把rect3赋值给rect2,再把rect2赋值给rect1
这里rect2 = rect3会返回rect2的引用,然后rect1再接收这个引用完成赋值,整个过程都是操作原对象,不会产生多余的临时对象。
小提醒:为啥要返回引用而不是值?
要是你写成return this;(返回指针)或者return *this;但返回的是值(比如Rectangle而不是Rectangle&),那链式调用的时候就会出问题:返回值的话会创建一个临时对象,后续的函数调用都是操作这个临时对象,而不是你原来的那个对象——这通常不是你想要的结果。所以一般都会返回当前对象的引用(ClassType&),确保所有操作都作用在同一个实例上。
总结一下,return *this就是让成员函数把当前正在操作的对象“传递下去”,让你能连续调用多个函数或者完成链式赋值,既提升了代码的简洁性,也符合面向对象编程的流畅性需求。
内容的提问来源于stack exchange,提问作者Vice

