本节书摘来自异步社区出版社《c++面向对象高效编程(第2版)》一书中的第2章,第2.26节,作者: 【美】kayshav dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。
c++面向对象高效编程(第2版)
在编写成员函数(构造函数、析构函数、操作符等)的代码时,如何显式表示调用该成员函数的对象?或者,如果需要,如何显式返回目标对象(target object)的值?在成员函数内部,如何访问调用该成员函数的对象中的数据成员?
这就是this指针发挥作用的地方。类的每个成员函数都有一个特殊的指针——<code>this</code>。这个this指针内含调用成员函数的对象的地址(即this指针总是指向目标对象)。this指针只在成员函数内部有效,<code>this</code>是c++中的关键字。
this指针的类型是“指向成员函数所属类的指针”,也可以说“this的类型是类名”。在成员函数内部,<code>this</code>指针指向调用该成员函数的类实例。
编译器对待成员函数并没有什么特别。实际上,编译器就像实现普通函数那样实现成员函数,但是,它会专门对成员函数进行名称重整(<code>name mangling</code>)以确保其唯一性。每个成员函数接受的第一个参数就是this指针。尽管程序员从未显式声明<code>this</code>指针,但是它一定存在。<code>this</code>指针通常是每个(非静态)成员函数隐含的第一个参数,编译器在每个成员函数的声明中都会插入这个隐含的参数。为了说明这个概念,显式声明<code>this</code>指针如下,<code>print()</code>成员函数应是:
void print_3tintfv(const tint* this)
{
cout << "0x" << this->_mostsignificantpart << ", 0x" <<
this->_leastsignificantpart;
}<code>`</code>
一旦离开成员函数,this名称将不再有效。
hand是否一定要使用this指针来引用目标对象中的成员?
不是所有情况都需要这样做。只有在成员函数使用该类成员(数据成员或成员函数)的非限定(unqualified name)名时,才意味着使用this指针。如果在成员函数内部引用类的成员,编译器会在每条表达式中均插入this指针(如果用户没有这样做)。回顾print()函数,可以这样改写:
tint aint;
aint.print();<code>`</code>
对象aint调用print()(即向对象aint发送print()消息)。在print()函数中this指针将指向aint。
由于this是指向对象的指针,因此,如果要使用this指针获得整个对象,我们必须使用操作符对this指针解引用(<code>de-reference</code>)为<code>*this</code>。正如其他指针那样,<code>this</code>内部存放的是对象的地址,this则是该对象的值。
this指针的概念非c++独享。oop语言在涉及接收消息的对象时,使用不同的名称。如<code>smalltalk</code>称为<code>self</code>,eiffel称之为<code>current</code>。
c++:
现在,把我们的注意力转到tint类的一些操作符函数上。