第三节 · 询问自己 · this指针

当我们在类的成员函数中访问成员变量时,有没有想过一个问题:函数是怎么知道要访问哪个对象的成员的?

class Counter
{
public:
    int value = 0;
    
    void increment()
    {
        value++;  // 这个 value 是哪个对象的?
    }
};

int main()
{
    Counter c1, c2;
    c1.increment();  // 增加 c1 的 value
    c2.increment();  // 增加 c2 的 value
    return 0;
}

答案是 this 指针


什么是 this

this 是一个隐含的指针,指向调用成员函数的那个对象。每个非静态成员函数都有一个隐含的 this 参数。

当你写 c1.increment() 时,实际上编译器会把它转换成类似这样的调用:


this 的类型

对于类 T 的非 const 成员函数,this 的类型是 T*。 对于 const 成员函数,this 的类型是 const T*


this 的用途

1. 解决命名冲突

当参数名与成员名相同时,可以用 this 区分:

2. 返回对象自身的引用

这是实现链式调用的关键:

3. 将对象自身传递给其他函数

4. 在成员函数中创建自身的副本


this 与 const 成员函数

在 const 成员函数中,thisconst T* 类型,这意味着:


链式调用的实际应用

链式调用在很多场景下都很有用:


注意事项

  1. this 只能在非静态成员函数中使用

  2. 不能给 this 赋值,它是一个右值

  3. 静态成员函数没有 this 指针


理解 this 指针,是理解 C++ 面向对象机制的重要一步。它揭示了成员函数是如何"知道"自己在操作哪个对象的。

习题

  • 修改 Person 类的 setter 方法,使其支持链式调用。

  • 设计一个 Calculator 类,支持链式调用进行连续的加减乘除运算。

Last updated