C++中的this指针

你们都知道this指针的存在,可是我想不多有人可以彻底学会this指针的用法,包括我在内,我也一直在探索this指针的用法,下面是我对this指针的一些理解,有疑问或者有问题的地方欢迎给我留言。函数

下面是一个简单的日期类:

class CDate
{
public:
	CDate()
	{}
	CDate(const int year, const int month, const int day)
	{
		_iYear = year;
		_iMonth = month;
		_iDay = day;
	}
	void SetDate(int year, int month, int day)  
	{
		_iYear = year;
		_iMonth = month;
		_iDay = day;
	}
    void print();
private:
	int _iYear;
	int _iMonth;
	int _iDay;
};

void print()
	{
		cout << _iYear << "-" << _iMonth << "-" << _iDay << endl;
	}

void FunTest()
{
	CDate d1;
	d1.SetDate(2017, 7, 5);
	CDate d2(2016, 8, 20);
	d1.print();
	d2.print();
}
int main()
{
	FunTest();
	return 0;
}

程序运行的结果:

这里写图片描述

在这里,我有一个问题想问你们,在FunTest()函数中,我建立了两个不一样对象,在调用同一个类的时候,它们究竟怎么区分不一样的对象呢? 对于类成员函数而言,并非一个对象对应一个单独的成员函数体,而是此类的全部对象共用这个成员函数体。 当程序被编译以后,此成员函数地址即已肯定。而成员函数之因此能把属于此类的各个对象的数据区别开, 就是靠这个this指针。函数体内全部对类数据成员的访问, 都会被转化为this->数据成员的方式。this

程序在运行时会将代码转换成这样

void print()
	{
		cout << this->_iYear << "-" << this->_iMonth << "-" << this->_iDay << endl;
	}

而一个对象的this指针并非对象自己的一部分,不会影响sizeof(“对象”)的结果。this做用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象自己的地址做为一个隐含参数传递给函数。也就是说,即便你没有写上this指针,编译器在编译的时候也是加上this的,它做为非静态成员函数的隐含形参,对各成员的访问均经过this进行。指针

this的特性

一、this指针的类型 类类型* const 二、this指针并非对象自己的一部分,不影响sizeof的结果。 三、this的做用域在类成员函数的内部(不严谨)。 四、this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。 五、只有在类的非静态成员函数中才可使用this指针,其它任何函数都不能够。code

thiscall调用约定:

a、thiscall只可以用在类的成员函数上。 b、参数从右向左压栈。 c、若是参数个数肯定,this指针经过ecx传递给被调用者;若是参数不肯定(_cdecl),this指针在全部参数被压栈后压入堆栈。 d、对参数个数不定的,调用者清理堆栈,不然函数本身清理堆栈。对象

相关文章
相关标签/搜索