你們都知道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、對參數個數不定的,調用者清理堆棧,不然函數本身清理堆棧。對象