0. 什么是this指针
this
是C++中的一个关键字,通常称其为this指针。它是一个指向本类对象的常量指针。
// 这是一个顶层const,this指针的值是不允许被修改的
// 即只能指向本类的一个实例自己
ClassType *const this;
例如我定义了一个类MyClass
,那么在类的作用域中可以使用this
:
class MyClass {
int a_;
public:
MyClass(const int &a) : a_(a) {}
void Print() {
cout << this->a_ << endl;
}
};
// 只是示例,当然这完全没有必要
1. this是成员函数的额外隐式参数
C++编译器在编译程序后,通常是将类的成员数据和函数代码分开存放。
这样的话n个同样的类的实例,有n个成员数据,但是只有一套代码来处理,极大程度上优化了存储空间。
那么,C++是如何区分不同的实例的呢?答案就是this指针。
其实,编译器会隐式的在所有成员函数的参数列表中添加一个名为this的额外隐式参数来访问该实例中的成员数据,该参数的类型就是指向本类对象的常量指针。
比如上面的Print
,你可以简单的认为编译器重写成了如下形式:
void MyClass::Print(MyClass *const this) {
...
}
在调用点:
MyClass::Print(&my_class);
2. const成员函数的this指针
成员函数是可以声明为const
的,其作用就是为该类const对象提供接口(参考【C++深陷】之“const”第8节)。
当成员函数声明为const
之后,编译器实际做的工作是将this指针改为指向常量对象的常量指针,即:
// 既包含顶层const,又包含底层const
const MyClass *const this
这样就实现了约束成员函数不可以修改成员数据。
3. this的使用
一般在两种情况下会使用this:
- 区分类成员变量和外部参数。
- 返回*this,即返回类自身,通常在运算符重载处使用。
4. 总结
this指针是类里一个常用的关键字,用来去分成员变量和外部参数,或者返回自身。