this是访问同名成员变量的唯一可靠方式,必须写this->x=x;静态函数不可用this;返回*this实现链式调用需返回引用且各分支均return;lambda捕获this需防循环引用和析构风险。

成员变量和形参同名时,this 是唯一可靠解法
当构造函数或成员函数参数名和成员变量名一样(比如 int x 和参数 int x),不加 this 就会绑定到形参,成员变量被悄悄忽略。编译器不会报错,但值根本没存进去——这是最常踩的坑。
实操建议:
- 必须写
this->x = x,不能省略this->;C++ 不支持像 Java 那样自动区分 - 即使没同名,也建议在所有成员访问前加
this->,增强可读性和一致性(尤其在大型类中) - 注意:在初始化列表里不能用
this->,得直接写成员名,比如X(int x) : x(x) {}
this 指针只能在非静态成员函数里用
静态成员函数没有 this,因为它们不属于任何具体对象。一旦在 static 函数里写 this,编译直接报错:invalid use of 'this' outside of a non-static member function。
常见错误现象:
立即学习“C++免费学习笔记(深入)”;
- 把本该是非静态的工具函数误标为
static,又在里面调用了this->data - 在 lambda 表达式里捕获
this时,忘了外层函数是否是静态的 - 模板类中误以为特化后能绕过限制——不行,
static就是没this
返回 *this 实现链式调用要注意生命周期
想让 obj.setA(1).setB(2) 这种写法生效,得在每个函数末尾写 return *this;。但这里有个关键陷阱:不能返回局部对象、不能返回临时量,否则就是悬垂引用。
实操建议:
- 返回类型必须是
MyClass&(引用),不是MyClass(值),否则每次调用都拷贝,链式调用失效 - 如果函数内部有
if分支,每个分支都得有return *this;,漏一个就编译失败 - 别在 const 成员函数里返回
*this(除非返回const MyClass&),否则破坏 const 正确性
在 C++11 后,this 可用于 lambda 捕获,但要小心循环引用
在类成员函数里定义 lambda 并捕获 this,相当于把当前对象指针传进去。这很常用,但也容易埋雷——尤其是把 lambda 存进 std::function 或发给异步任务时。
使用场景和风险:
- 捕获方式写成
[this]最常见,但对象若提前析构,lambda 再执行就会 crash - 想安全一点,改用
[weak_this = weak_from_this()](需继承std::enable_shared_from_this) - 纯函数式逻辑(不访问成员)就别捕获
this,直接按值捕获需要的变量更干净
真正麻烦的不是语法怎么写,而是什么时候不该用 this——比如在移动构造函数里访问已被移走的资源,或者在多线程里没加锁就通过 this 修改共享状态。这些地方 this 本身没错,错的是对它背后对象生命周期和并发行为的误判。











