C++——this指针 – 作者:Johnson666

对于类的非静态成员,每一个对象都有自己的一份拷贝,即每个对象都有自己的数据成员,不过成员函数却是每个对象共享的。那么调用共享的成员函数是如何找到自己的数据成员的呢。答案就是通过类中隐藏的this指针。下面通过几个例子来说明this指针的作用。

例如,每一个对象都有自己的一份拷贝。

#include<iostream>
using namespace std;

class CBook
{
public:
	int Pages;
	void outputPages()
	{
		cout << Pages << endl;
	}
};

int main()
{
	CBook vbBook,vcBook;
	vbBook.Pages = 520;
	vcBook.Pages = 570;
	vbBook.outputPages();
	vcBook.outputPages();
	return 0;
}

结果:
image.png

从图中可以发现,vbBook和vcBook两个对象均有自己的数据成员Pages,在调用outputPages成员函数时输出的均是自己的数据成员。在outputPages成员函数中我只是访问了Pages数据成员,每个对象在调用outputPages方法时是如何区分自己的数据成员的呢?答案是通过this指针。在每个类的成员函数(非静态成员函数)中都隐含包含一个this指针,指向被调用对象的指针,其类型为当前类类型的指针类型,在const方法中,为当前类类型的const指针类型。当vbBook对象调用outputPages成员函数时,this指针指向vbBook对象,当vcBook对象调用outputPages成员函数时,this指针指向vcBook对象。在outputPages成员函数中,用户可以显式地使用this指针访问数据成员。例如:

#include<iostream>
using namespace std;

class CBook
{
public:
	int Pages;
	void outputPages()
	{
    cout << this->Pages << endl; //使用this指针访问数据成员
	}
};

int main()
{
	CBook vbBook,vcBook;
	vbBook.Pages = 520;
	vcBook.Pages = 570;
	vbBook.outputPages();
	vcBook.outputPages();
	return 0;
}

结果一样:
image.png

实际上,编译器为了实现this指针,在成员函数中自动添加了this指针对数据成员的方法,类似于上面的outputPages方法。此外,为了将this指针指向当前调用对象,并在成员函数中能够使用,在每个成员函数中都隐含包含一个this指针作为函数参数,并在函数调用时将对象自身的地址隐含作为实际参数传递。例如,以outputPages成员函数为例,编译器将其定义为:

void outputPages(CBook* this)  //隐含添加this指针
{
    cout << this->Pages << endl;
}

在对象调用成员函数时,传递对象的地址到成员函数中。以”vc.outputPages();“语句为例,编译器将其解释为”vbBook.outputPages(&vbBook);“,这就使得this指针合法,并能够在成员函数中使用。

来源:freebuf.com 2021-05-20 14:03:58 by: Johnson666

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论