8.9.4 this指针

    前面提到,一个类的所有对象共用成员函数代码段,不管有多少个对象,每个成员函数在内存中只有一个版本,那编译器是如何知道是哪个对象在执行操作呢?答案就是“this指针”。

    this指针是隐含在成员函数内的一种指针,称为指向本对象的指针,可以采用诸如“this->数据成员”的方式来存取类数据成员。

    举例说明如下所示。


    class Ex { private: int x; int y; public: void Set() { x=1; y=2; } };set()位于函数代码段,是个全局函数,并不在类的对象内,在程序中使用“Ex a,b”创建了两个Ex类对象,当执行a.Set()和b.Set()时,编译器如何知道是对哪个对象执行操作的呢?编译器隐含在非static成员函数里面插入了一个参数(即this指针),所以,类中的void Set()函数实际上等价于如下所示。 void Set(Ex*this) { this->x=1; this->y=2; }

    调用a.Set()实际上是Set(&a),调用b.Set()实际上是Set(&b),每个对象都有一个指向自己的this指针,该指针在对象创建时由系统自动填充,该指针和对象“同生共亡”,具有类作用域,关于类作用域的相关内容将在第9章介绍。

    编译器不会向静态成员函数传递this指针,这即是“当静态函数成员内访问类的非静态成员时,需要将对象的引用或指向对象的指针作为参数”的原因。

    this指针主要有以下两个作用。

    (1)显式指明类中数据成员,尤其是和形参以及全局变量相区分。

    在第6章中介绍了变量的生存期、作用域和可见域,局部变量对外部变量有屏蔽作用,如果要在代码块内摆脱局部变量的屏蔽,要使用全局作用符:,关于类作用域的相关介绍请参考第9章。

    (2)返回本对象的指针或引用。

    在函数成员返回时,如果需要返回本对象的指针,只须使用“return this;”,同样,在需要返回本对象引用的时候,使用“return*this;”可使代码清晰明了。

    某对象的this指针恒指向该对象,不可修改,对const对象来说,该对象传递的this指针的类型如下所示。


    const类名*const this;

    在程序中既无法修改this指针,也无法通过this指针修改该对象。