您现在的位置是:首页 >技术交流 >C++“this”指针的使用网站首页技术交流

C++“this”指针的使用

函数指针 2023-06-18 04:00:02
简介C++“this”指针的使用

1.this指针的引出

先看一段代码:

class Date
{
public:
	Date(int year=0,int month=0,int day=0)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << " "
			<< _month << " "
			<< _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date Day1(2023, 4, 27);
	Date Day2(2023, 4, 28);

	Day1.Print();

	Day2.Print();

	return 0;
}

Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是如何知道应该设置Day1对象,而不是设置Day2对象呢?

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

2.什么是“this指针”

2.1.this指针

        this指针存在于类的成员函数中,指向被调用函数类实例的地址。

         一个对象的this指针并不是对象本身的一部分,不会影响sizeof()的结果。

        this指针的作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。换句话说就是,及时你没有用this指针,编译器在编译的时候也会自动加上this的,它是一个隐含形参,对各成员的访问        均通过this进行。

2.2this指针的特性

 this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
只能在“成员函数”的内部使用this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。

2.3 this的使用

this不能显示在成员函数的形参中,但可以在成员函数中使用。

在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this。

当参数与成员函数的变相名相同使,应该使用this->_year=year。

比如:

 3.this指针的存放

this指针是一个成员函数的一个被隐藏的形参,所以他存放在栈中,随着函数栈帧的销毁而销毁。

来看一段汇编代码:

 this指针传参传的是地址。

 4.this指针传参可以为空吗

先看代码:

class Date
{
public:
	Date(int year=0,int month=0,int day=0)
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
	void Print()
	{
		cout << _year << " "
			<< _month << " "
			<< _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date Day1(2023, 4, 27);
	Date Day2(2023, 4, 28);
	Date* Day3 = nullptr;


	Day1.Print();

	Day2.Print();
	Day3->Print();
	return 0;
}

结果:代码报错

 因为this指针传参传的是空指针,函数成员内部对this指针进行调用,导致出现非法访问,使系统奔溃。但是如果this指针为空,但是函数成员内部没有对this指针进行调用,则不会出现非法访问,系统正常运行。比如:

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。