this指针

内容简介

this 指针指向当前调用成员函数的对象。每个非静态成员函数内部都隐含一个 this 指针。

区分形参和成员变量

class Person {
public:
    explicit Person(int age)
    {
        this->age = age;
    }
 
private:
    int age = 0;
};

如果写成:

Person(int age)
{
    age = age;
}

只是把参数 age 赋值给自己,成员变量没有被正确设置。更推荐使用成员变量后缀:

class Person {
public:
    explicit Person(int age) : age_(age) {}
 
private:
    int age_ = 0;
};

返回对象本身

返回 *this 可以支持链式调用:

class Person {
public:
    explicit Person(int age) : age_(age) {}
 
    Person& add_age(const Person& other)
    {
        age_ += other.age_;
        return *this;
    }
 
    int age() const { return age_; }
 
private:
    int age_ = 0;
};
 
Person p1(10);
Person p2(10);
p2.add_age(p1).add_age(p1).add_age(p1);
std::cout << p2.age() << '\n';  // 40

注意返回类型必须是引用 Person&,否则会返回新对象,链式修改就不是同一个对象。

空指针调用成员函数

旧笔记里常见“空指针也能调用不访问成员的成员函数”的示例:

Person* p = nullptr;
// p->show_class_name();

这类写法不应作为正常技巧使用。通过空指针调用非静态成员函数属于未定义行为风险,即使某些编译器和场景看起来能运行,也不要依赖。

最佳代码实践

  • 构造函数中优先使用初始化列表,而不是在函数体里用 this-> 赋值。
  • 需要链式调用时返回 *this 的引用。
  • 不要手动检查 this == nullptr 作为正常逻辑。
  • 静态成员函数没有 this 指针。

错误用法

void show_age()
{
    if (this == nullptr) {
        return;
    }
    std::cout << age_ << '\n';
}

问题:正常 C++ 代码不应该通过空对象调用成员函数,再在函数内部补救。

注意事项

学习路径