你们都知道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指针的类型 类类型* const 二、this指针并非对象自己的一部分,不影响sizeof的结果。 三、this的做用域在类成员函数的内部(不严谨)。 四、this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。 五、只有在类的非静态成员函数中才可使用this指针,其它任何函数都不能够。code
a、thiscall只可以用在类的成员函数上。 b、参数从右向左压栈。 c、若是参数个数肯定,this指针经过ecx传递给被调用者;若是参数不肯定(_cdecl),this指针在全部参数被压栈后压入堆栈。 d、对参数个数不定的,调用者清理堆栈,不然函数本身清理堆栈。对象