目录
简单点说,this 指针在 C++ 中是一个特殊的指针,指向当前对象的实例并且每一个对象都可以通过 this 指针来访问自己的地址。当然,this 指针是只能在 class, union 或 struct 类型的非静态成员函数中访问的指针。非静态成员函数是没有 this 指针的。还有就是通常来说友元函数没有 this 指针,原因是友元不是类的成员,只有成员函数才有 this 指针。
我们可以用 this 指针简化我们代码的编写并且可以很方便的调用我们所需的对象。
this 指针的语法表示其实很简单,如下例子:
this->member
当对某个对象调用非静态成员函数时,编译器会将该对象的地址作为隐藏的参数传递给函数,即对象的 this 指针实际上不是对象本身的组成部分。假设你用 sizeof 去查看当前的对象,那么 this 指针不会反映在对象的 sizeof 结果中。
- date.setTime( 12 );
-
- --> 可以翻译为:
-
- setTime( &date, 12 );
假设你要使用对象的地址,其中对象的地址还可以从成员函数的内部作为 this 指针提供。this 指针的使用很多时候是隐式的,即可以不用显式的表达出来,通常在引用某个 class 的成员时使用显式的 this 指针是没有必要的。
- void date::setTime( uint8_t aTime ) {
- // 以下三种表达形式是等同的
- time = aTime;
- this->time = aTime;
- (*this).time = aTime;
- }
有时候我们需要从成员函数中返回当前的对象,可以参考使用 *this,如:
return *this;
this 指针还有一个比较不错的属性,即 this 指针可以用于防止自引用:
- // 以下代码不会被执行
-
- while ( ¤tObject == this ) {
- ......
- }
如果你想要修改 this 指针,比如想对 this 指针进行赋值,那么这是不会被允许的,至少现在的 C++ 版本中是不行的( C++ 早期是实现了这种方法的 )。
你是可以在函数声明中修改 this 指针类型的,需要使用关键字,例如通过 const 和 volatile。假设需要声明具有某种属性的函数,需要将关键字添加到函数参数列表的后面,例如:
- class date {
- void setTime() const;
- };
-
- // 上述 this 指针被视为指向 const 对象的 const 指针
成员函数中 this 的类型可以由下面的语法进行相关描述:
- [cv-qualifier-list] class-type * const this
-
- // cv-qualifier-list 是由成员函数的声明符确定
- // class-type 是当前 class 的名称
-
- // 上面 this 指针是 const 指针且无法重新分配。
- // 成员函数声明中使用的 const 或 volatile 限定符适用于由该函数范围中的 this 指针指向的 class 实例
修饰符 | 语义 |
---|---|
const | 无法调用不是 const 的成员函数且无法更改成员数据。 |
volatile | 禁用某些优化且每当访问成员数据时,都会从内存中加载相应数据 |
this 指针确实在某些地方可以很大程度减少我们开发项目的负担,但同时使用上稍不注意也会比较容易引入问题,所以在使用的时候需要明确自己的需求和方法,这样才能更好地应用 this 指针。
构造函数和析构函数不能被声明为 const 或 volatile 类型,但可以在这两种类型的对象上调用。
The this pointer - cppreference.com
千淘万漉虽辛苦,吹尽狂沙始到金。