類的this指標有以下特點:
(1)this只能在成員函式中使用
全域性函式,靜態函式都不能使用this。
實際上,成員函式預設第乙個引數為t* const this。
如:class a };
其中,func的原型在編譯器看來應該是:
int func(a* const this,int p);
(2)由此可見,this在成員函式的開始前構造,在成員的結束後清除。
這個生命週期同任何乙個函式的引數是一樣的,沒有任何區別。
當呼叫乙個類的成員函式使時,編譯器將類的指標作為函式的this引數傳遞進去。如:
a a;
a.func(10);
此處,編譯器將會編譯成:
a::func(&a,10);
看起來和靜態函式沒有差別,對嗎?不對,區別還是有的。編譯器通常會對this指標做一些優化,因此,this指標的傳遞效率比較高。
(3)幾個this指標的易混淆問題。
1)this指標是什麼時候建立的?
this在成員函式的開始執行前構造,在成員的執行結束後清除。
2)this指標存放在何處?堆、棧、全域性變數,還是其他?
this指標會因編譯器不同而又不同的放置位置。可能是棧,也可能是暫存器,甚至全域性變數。
3)this指標是如何傳遞給類中的函式的?繫結?還是在函式引數的首引數就是this指標?那麼this指標又是如何找到「類例項後的函式」的?
大多數編譯器通過eax暫存器傳遞this指標。事實上,這也是乙個潛規則。一般來說,不同編譯器都會遵從一致的傳參規則,否則不同編譯器產生的obj就無法匹配了。
在call之前,編譯器會把對應的物件位址放到eax中。this是通過函式引數的首引數來傳遞的。
4)我們只有獲得乙個物件後,才能通過物件使用this指標。如果我們知道乙個物件this指標的位置,可以直接使用嗎?
this指標只有在成員函式中才有定義。因此,你獲得乙個物件後,也不能通過物件使用this指標。所以,我們無法知道乙個物件的this指標的位置(只有成員函式裡才有this指標的位置)。當然,在成員函式裡,你是可以知道this指標的位置的(可以通過&this獲得),也可以直接使用它。
6)每個類編譯後,是否建立乙個類中函式表儲存函式指標以便用來呼叫函式?
普通函的類函式(不論是成員函式,還是靜態函式)都不會建立乙個函式表來儲存函式指標。只有虛函式才會被放到函式表中。
但是,即使是虛函式,如果編譯器能明確知道呼叫的是哪個函式,編譯器就不會通過函式表中的指標來間接呼叫,而是會直接呼叫該函式。
關於類的this指標總結
this指標其實就是在例項化乙個物件後產生的指標,並且是指向物件本身。也就是說,即使沒有寫上this指標,編譯器在編譯的時候也會加上this指標。它作為非靜態成員函式的隱含形參,對各成員的訪問可以通過this來實現。它的特點可以概括為 1 this只能在成員函式中使用。而在全域性函式或者靜態函式中不...
總結 分類 聚類的評估指標
精確率 precision 指的是模型判為正的所有樣本中有多少是真正的正樣本 召回率 recall 指的是所有正樣本有多少被模型判為正樣本,即召回。感覺精確率是個區域性的,召回率是個全域性的。精確率與召回率 真正類率 true positive rate tpr 刻畫的是分類器所識別出的 正例項佔所...
總結四類智慧型指標
c 中的動態記憶體管理通過 new delete運算子來完成的 new 在動態記憶體中為物件分配空間並且返回乙個指向該物件的指標,可對物件進行初始化 delete 接受乙個動態物件的指標,銷毀該物件,並釋放與之關聯的記憶體。首先說一下為什麼使用智慧型指標,存在以下幾種情形 申請的空間在使用完 甚至程...