this指针
由上节介绍的知识我们了解到,类中每个对象的数据成员都占用独立空间,但成员函数是共享的,可是各个对象调用相同的函数时,显示的是对象各自的信息,这是如何实现的呢?
若上节案例中定义两个类对象myfstcar、myseccar,在main()函数中分别调用set_wheels()函数设置两个对象的车轮数量,则显示出的是不同的内容,如例1所示。
例1
1 #include <iostream>
2 using namespace std;
3
4 class Car //定义类Car
5 {
6 //成员函数
7 public:
8 void disp_welcomemsg(); //声明disp_welcomemsg()函数
9 int get_wheels(); //声明get_wheels()函数
10 void set_wheels(int); //声明set_wheels()函数
11 //数据成员
12 private:
13 int m_nWheels;
14 };
15 void Car::disp_welcomemsg() //类成员函数disp_welcomemsg()的实现
16 {
17 cout << "Welcome to the car world!" << endl;
18 }
19 int Car::get_wheels() //类成员函数get_wheels()的实现,获取车轮数
20 {
21 return m_nWheels;
22 }
23 void Car::set_wheels(int n) //类成员函数set_wheels()的实现,设置车轮数
24 {
25 m_nWheels = n;
26 }
27 int main()
28 {
29 Car myfstcar, myseccar; //定义类对象myfstcar、myseccar
30
31 myfstcar.set_wheels(4); //设置myfstcar的车轮数量为4
32 myseccar.set_wheels(6); //设置myseccar的车轮数量为6
33 //访问成员函数,显示车轮数量
34 cout << "my first car wheels num = " << myfstcar.get_wheels() << endl;
35 cout << "my second car wheels num = " << myseccar.get_wheels() << endl;
36
37 system("pause");
38 return 0;
39 }
运行结果如图1所示。
图1 例1运行结果
从运行结果可知myfstcar、myseccar两个不同对象调用相同的成员函数时,操作的内容与对象相关,会得到各个对象对应的显示结果,成员函数是如何区分不同对象的?
每个类的成员函数都隐含有一个指向被调用对象的指针,这个指针被称为“this指针”。程序编译后,成员函数中会包含this指针,如编译后成员函数set_wheels()的形式如下所示:
void Car::set_wheels(int n, Car *this)
{
this->m_nWheels = n;
}
当对象myfstcar调用函数时,this指针指向对象myfstcar,会引用到myfstcar对象的数据成员,myseccar对象调用函数时,则this指针指向myseccar。
C++规定,当一个成员函数被调用时,系统自动向它传递一个隐含的参数,该参数是一个指向调用该函数的对象的指针,从而使成员知道该对哪个对象进行操作,在程序中,使用关键字“this”引用该指针。this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数联系在一起,使得从外部看来,每个对象都拥有自己的成员函数,因此,我们可以在函数中使用this指针访问成员变量或调用成员函数,形式如下所示:
(*this).成员变量或函数
this->成员变量或函数
由于this指针是指向当前对象的指针,所以可以在函数中把this指针当参数使用,或从函数中返回,用作返回值时,形式如下所示:
reutrn this;
return *this;
凡是想在成员函数中操作当前对象,都可以通过this指针完成。