一.this指針的出現
1.C++中的指針
C和C++指針的最重要的差別在于C++是一種類型要求更強的語言。就
void*
而言,這一點表現的更突出。C不允許随便的把一個類型的指針賦給另一個類型,但允許通過
void*
來實作。例如:
bird *b;
rock *r;
void *v;
v = r;
b = v;
由于C的這種功能允許把任何一種類型看作别的類型處理,這就在類型轉換系統中留下了一個大的漏洞。C++不允許這樣做,其編譯器會給出出錯資訊。如果要把某種類型當作别的類型進行處理,必須顯式的類型轉換,通知編譯器。
2.this指針的出現
(1)C++對象的存儲模型引出了this指針
執行個體化出的對象,資料自己儲存,代碼共用一份。記憶體得到了很好的使用。
用對象調用fun方法,this指針就代表了對象,接收該對象的位址。
(2)this指針什麼時候出現
隻有當對象調用函數的這一刻,在函數的内部隐蔽的插入this指針。this所接受的位址随着對象的不同而不同,誰調用即是誰的位址。
(3)類執行個體化出的對象調用類内函數時,編譯器的做法
識别類名–>識别資料成員–>對方法(函數)進行識别并且改寫(在所有參數之前加入自身類型的this指針)
)調用時,調用方法的形式
CGoods c1;
//c1.RegisterCoods(&c1, "C++", 1, 1);
c1.RegisterCoods("C++", , );
)調用時,類内部函數的改寫
//void RegisterGoods(CGoods *const this, char name[], int amount, int price);
void RegisterGoods(char name[], int amount, int price);
二.this指針不簡單
1.this不允許改寫,this所指的成員可以修改
)如果不加const
void RegisterGoods(CGoods *this, char name[], int amount, int price)
{
this = NULL;//這樣,編譯器都不允許這樣做。
}
//this所代表的對象,即this指向的位址(注意不是this的位址&this)不能改變
)是以要加const
void RegisterGoods(CGoods *const this, char name[], int amount, int price)
{
this->amount = amount;//this所指的成員可以修改,隻能修改*this
}
//保證this的指向不變
補充:const作用總結:
封鎖參數/修飾函數/修飾傳回值
注:const修飾變量時位置不同,含義不同
三.小結
從對象的存儲模型講起,共有方法如何識别哪個對象在調動它,就是通過this指針,this指針隻會在對象調動方法時,才會被隐蔽的插入參數清單的第一個位置。