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++ 代码不应该通过空对象调用成员函数,再在函数内部补救。
注意事项
this是指针常量,不能改变它指向哪个对象。const成员函数中的this指向 const 对象,见 cppconst成员函数和常对象。
学习路径
- 上一节:cppconst成员函数和常对象
- 当前阶段:cppOOP
- 下一节:cpp匿名对象