C++ this指针

一、this是什么?

在C++中,this是一个关键字,同时,它也是一个指针,C++编译器给每个非静态的成员函数(无static关键字修饰的函数)增加了一个隐藏的指针参数(this),让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

代码实现:

#include
using namespace std;
class Date {
public:
	void InitDate(int year, int month, int day)
	{
		//打印this指针,可以发现this指针的值和调用这个函数对象的地址是一样的
		cout <<"this = " << this << endl;
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << this->_year << "/" << this->_month << "/" << this->_day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	cout << "&d1 = " << &d1 << endl;
	d1.InitDate(2022, 11, 20);
	d1.Print();
	Date d2;
	cout << "&d2 = " << &d2 << endl;
	d2.InitDate(2021, 10, 10);
	d2.Print();
	return 0;
}

C++ this指针_第1张图片

 

C++ this指针_第2张图片

 通过上述例子,我们可以看出,this是实际上是成员函数的一个形参(即编译器将上述例子中的成员函数Ivoid InitDate(int year, int month, int day)解析为void InitDate(Date* const this, int year, int month, int day)),对象在调用成员函数的时候,将对象的地址传递给this(d1.InitDate(2022,11,20)就是将d1的地址传递给this指针)但是C++中不需要我们自己手动添加这个指针,在编译阶段,编译器默认将程序解析,将this指针添加到形参中。

二、this指针的特性

1.this指针的类型为 类的类型 *const (Date* const),表明指针this的指向位置不能改变

2.this指针只能在成员函数内部使用,不能在static静态函数中使用

3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。 所以对象中不存储this指针。

4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用 户传递

两个问题:

(1)this指针存在哪里?

对于这个问题,我们可以通过编译器来进行验证

C++ this指针_第3张图片

 我们可以看出指针this存储在栈上

(2)this指针可不可以为空?

答案:不一定,可以通过以下例子来说明

C++ this指针_第4张图片

 

以上例子,我们定义了一个指向对象a的指针p,通过指针p来访问成员函数Print(),这显然是没有问题的,但是如果将p的值变为空结果会怎么样呢?

C++ this指针_第5张图片

 我们发现程序仍然可以执行,这就说明指针this的值可以为NULL,因为在执行p->Print()这条语句的时候,编译器将p的值传递给指针this,此时this的值为NULL,所以打印出0000 0000

但如果我们继续在Ptint()中打印成员变量_a的值,我们会发现程序出错

C++ this指针_第6张图片

 

 

你可能感兴趣的:(c++,开发语言)