首页 理论教育C++程序设计基础教程:this指针

C++程序设计基础教程:this指针

【摘要】:类的每一个成员函数都有一个隐含的特殊指针,通常称为this指针,this指针的类型就是成员函数所属的类型。通常不显式使用this指针。this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每个对象都拥有自己的成员函数。this指针一般用于返回当前对象自身。程序的执行结果如下:s1∶n=2s2∶n=1s3∶n=3this指针大量用于运算符重载成员函数设计中,这将在后面详细介绍。

类的每一个成员函数都有一个隐含的特殊指针,通常称为this指针,this指针的类型就是成员函数所属的类型。该指针是一个指向正在被某个成员函数操作的对象的指针。

当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,也就是说,当调用成员函数时,this被初始化为被调用的成员函数所在的类实例即对象的地址,然后调用成员函数,每次成员函数存取数据成员时,则隐含使用this指针。通常不显式使用this指针。

this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每个对象都拥有自己的成员函数。

【例2.20】分析以下程序的执行结果。

解:程序执行结果如下:

n=8

n=17

上述程序中,MyClass10类定义了一个addvalue非静态成员函数。在调用它时,需要写成:

MyClass10 s;

s.addvalue(9);

就是说,需要告诉系统是将s对象的私有数据成员n增大9,而不是其他对象。它实际上相当于以下函数调用:

addvalue(&s,9);

即将类对象的地址作为第一个参数传递给了函数。addvalue函数的原型是:

void addvalue(MyClass10*this,intm);

该函数的第一个参数是指向该类对象的一个指针即this指针。我们在定义该成员函数时并没有看到这样一个参数,因为这个参数是系统隐含的。在成员函数的定义体中,可以通过this访问这个地址参数。

实际上,s.addvalue(9)语句的执行过程如图2.11所示,先创建s1对象,将s1对象的n值增大m,再执行*this=s1,等同于s=s1,从而达到将s对象的n增大m的目的。如果了解了this指针的用法,上述MyClass10类的addvalue()成员函数可以等同地改写为:

如果不用this指针,该成员函数等同于以下代码:(www.chuimin.cn)

从上面分析看到,this指针增加了代码的复杂性。本例只是为了讲述this指针而这样设计的,在实际编程中,只有在确实需要时才使用this指针。

图2.11 this指针指向s对象

注意:this指针只能在类的成员函数中使用,它指向该成员函数被调用的对象。this指针一般用于返回当前对象自身。由于this指针始终指向调用对象,因此不能在静态成员函数的定义中使用this指针。静态成员函数一般都不需要调用对象,因此也就没有this指针。

【例2.21】分析以下程序的执行结果。

上述程序中,MyClass11类的add成员函数中使用了this指针,this指针指向当前对象自身,该成员函数中的语句:

this->n=s1.n+s2.n;

用于修改当前对象的数据成员的n值,语句:

return(*this);

返回当前对象自身,即对当前对象进行了修改。对于main()函数的调用add()成员函数语句:

s3.add(s1,s2);

this指针指向的就是s3,执行该语句之前s3的数据成员n未赋值,执行完该语句后,就修改了s3的私有成员的n值,使其为3。程序的执行结果如下:

s1∶n=2

s2∶n=1

s3∶n=3

this指针大量用于运算符重载成员函数设计中,这将在后面详细介绍。

注意:静态成员函数没有this指针。因为类只有一个静态成员函数实例,所以使用this指针没有什么意义。在静态成员函数中使用this指针会引起编译错误。