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

相關文章
相關標籤/搜索