C++-----详谈this指针

C++中this指针就像是一个害羞的孩子,总是藏在一个隐蔽的地方。但是它却拥有着强大的功能,是C++中不可缺少的部分,下面我们就针对它做出详细介绍。

我们首先来看一段代码:

#include<iostream>
using namespace std;

class Test
{
public:
	Test(int data = 0):ma(data){}    //构造函数
	~Test(){}                        //析构函数
	void show(){cout << ma << endl;}
private:
	int ma;
};

int main()
{
	Test A(5);
	Test B(8);
	A.show();
	B.show();
	return 0;
}

我们知道,当定义一个类的若干对象之后,系统会为每一个对象分配存储空间。如果在一个类中包含了数据成员和成员函数,那么当我们每定义一个对象时,我们是不是就要为每一个对象所包含的数据成员和成员函数分配空间呢?答案肯定是不是的。事实上,给对象赋值就是给对象的数据成员赋值,不同对象的存储单元中存放的数据值通常是不同的,而成员函数的代码确实一样的。因此,我们没必要为每一个对象都开辟存储存储成员函数的空间,以免造成资源的浪费。实际中,C++的编译系统只用了一段空间来存放类的数据成员,例如上例A、B两个对象所调用的成员函数show()是同一个成员函数。所以每个对象的存储空间都只是该对象数据成员所占用的存储空间,而不包含成员函数代码所占用的空间。那么问题来了,对象有多个,而成员函数只有一份,对于上述代码中,show()函数完全一样,它是如何知道是那个对象调用的自己,并输出该对象的数据成员ma呢?在此,我们提出this指针,该指针指向对象(this指针一般为隐式使用),它可以让多个对象共享一份成员函数。

下面对于上面代码,我们将this指针修改为显式:

成员函数为:

void show(Test *const this){cout << this->ma << endl;}

其调用过程为:

Test::show(&A);
Test::show(&B);

当创建一个对象时,系统就把this指针初始化为指向该对象,即this指针的值是当前调用成员函数的对象的起始地址。例如:当A调用show时,编译系统就把A的起始地址赋给this指针。这样在执行A.show(),通过this指针,就能得知是A对象在调用,于是对应输出A对象的数据成员ma。

发布了40 篇原创文章 · 获赞 124 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/FDk_LCL/article/details/89552105