亲宝软件园·资讯

展开

C++ this指针

幻荼 人气:0

简介

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参

数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

特性

1. this指针的类型:类类型* const

2. 只能在“成员函数”的内部使用

3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this

形参。所以对象中不存储this指针。

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

举例

class Data {
public:
	void Printf()
	{
		cout << _year <<" "<<" "<< _month <<" "<< _day << endl;
	}
	void Init(int year=2022,int month=5,int day=25)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1,d2;
	d1.Init(2022,1,1);
	d1.Printf();
	d2.Init(2022,2,2);
	d2.Printf();
	return 0;
}

这是一个简单的日期类,那么这里有一个问题,我们在使用打印函数Printf和初始化函数Init的时候,d1和d2调用的是同一个函数,那么编译器是怎么知道我是应该设置/打印d1还是d2呢?

这其实就使用了this指针

那么具体编译器是怎么做的呢?

void Printf(const* this)//编译器实际上处理的
	{
		cout << this->_year << " " << this->_month << " " << this->_day << endl;
	}
	void Printf()//我们看到的
	{
		cout << _year <<" "<<" "<< _month <<" "<< _day << endl;
	}
void Init(const* this,int year=2022,int month=5,int day=25)//编译器处理的
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
	void Init(int year = 2022, int month = 5, int day = 25)//我们看到的
	{
		_year = year;
		_month = month;
		_day = day;
	}
d1.Init(2022,1,1);//我们看到的
	d1.Init(&d1,2022, 1, 1);//编译器实际上处理的

实际上编辑器取了d1和d2函数的地址,然后传递给了const*this,这样编译器就能自动打印和初始化相应的结构了。

注意

我们不能自己在传参处加const*this和&,这是编译器自己做的,我们不能抢了编译器的活,即使做了,编译也不会通过,但是里面我们可以加

void Printf(const* this)//错误
	{
		cout << _year <<" "<<" "<< _month <<" "<< _day << endl;
	}
void Printf()//可以运行,但是编译器默认都会加this->,所以我们可以不用加,加了也没事
	{
		cout <<this-> _year <<" "<<" "<< this->_month <<" "<< this->_day << endl;
	}

加载全部内容

相关教程
猜你喜欢
用户评论