天天看點

C++初級主題--(1)this指針

一.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指針

執行個體化出的對象,資料自己儲存,代碼共用一份。記憶體得到了很好的使用。

C++初級主題--(1)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指針隻會在對象調動方法時,才會被隐蔽的插入參數清單的第一個位置。

繼續閱讀