返回 *this 是链式调用的基础设施,它返回当前对象的左值引用(classname&),避免拷贝、保持对象同一性、支持连续 . 调用;返回 this(指针)或值类型均不适用于链式调用。

返回 this 指针本身很少见,多数情况该用 *this
直接返回 this(即指针)在实际工程中极少出现,且容易引发误用。比如写成 return this;,调用方拿到的是 ClassName* 类型,后续只能用 -> 调用成员函数,破坏链式调用的自然语法。真正常用、有明确用途的是返回 *this(对象引用),而不是 this(指针)。
return *this 是链式调用的基础设施
链式调用依赖成员函数返回当前对象的引用,让连续点号调用成为可能。关键在于:返回引用避免拷贝、保持对象同一性、支持 . 操作符继续调用。
-
return *this返回的是当前对象的左值引用(ClassName&),调用者可继续用.访问成员 - 若返回
ClassName(值类型),会触发拷贝构造,后续调用操作的是临时副本,无法修改原对象 - 若返回
const ClassName&,则后续只能调用const成员函数,灵活性受限 - 典型场景:流操作符重载(
operator)、Builder 模式、可变状态对象(如 <code>Counter、StringBuilder)
示例:
class Counter {
public:
int val = 0;
Counter& inc() { ++val; return *this; }
Counter& dec() { --val; return *this; }
};
Counter c;
c.inc().inc().dec(); // val == 1
为什么不能在 const 成员函数里返回 *this 引用?
因为 *this 在 const 成员函数中的类型是 const ClassName&,而非常量引用(ClassName&)无法绑定到它。强行返回会导致编译错误。
- 错误写法:
Counter& get() const { return *this; }→ 编译失败:cannot bind non-const lvalue reference to const lvalue - 正确做法:要么去掉
const修饰,要么返回const Counter&,或改用值返回(但失去链式能力) - 这也意味着:链式调用的成员函数通常不能是
const,除非只读操作(如toString())且设计为返回新对象
返回 this 指针的极少数合理场景
真要用 return this;,只在极个别底层或接口适配场景下有意义,比如:
- 需要向 C 接口传递对象地址(如回调函数参数要求
void*,你 castthis过去) - 实现某些模板元编程技巧,例如 SFINAE 中探测成员函数签名时需区分指针/引用返回类型
- 自定义内存池中返回对象原始地址用于后续 placement new 或手动析构
- 但这些都不是“面向使用者”的常规逻辑,而是系统级或框架级需求
普通业务代码里看到 return this; 应当警觉——大概率是误写,本意应为 return *this;。
const 正确性、以及生命周期管理的要求非常严格。一个不小心,就变成静默语义错误或未定义行为。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











