Member Function的呼叫方式

2021-07-31 13:40:44 字數 2387 閱讀 9654

一,member function的呼叫方式

c++支援三種型別的member function:static、nonstatic和virtual,每一種型別被呼叫的方式都不同。

二,nonstatic member function

c++的設計準則之一就是:nonstatic member function至少必須和一般的nonmember function有相同的效率。選擇member function不應該帶來什麼額外的負擔,這是因為編譯器已將member函式例項轉換為對等的nonmember函式例項,實際上member function被內化為nonmember的形式,下面就是轉化的步驟:

1,改寫函式的函式原型,以安插乙個額外的引數到member function中,這個額外的引數被稱為this指標。

2,將每乙個對nonstatic data member的訪問操作改為經由this指標來訪問。

3,將member function重寫成乙個外部函式,函式名稱經過"mangling"處理,使它在程式中成為獨一無二的詞彙。

三,static member function

static member function的主要特徵是它沒有this指標,以下的次要特徵都是根源於其主要特徵。

1,不能夠直接儲存nonstatic members。

2,不能被宣告為const、virtual。

3,它不需要經由class object才被呼叫,雖然大部分時候它是這樣被呼叫的。

4,對static member function的呼叫會轉換為乙個直接呼叫操作

class point

};int main()

四,virtual member function如果normalize()是乙個virtual member function,那麼以下的呼叫:

ptr->normalize();
將會被內部轉換為:

(*ptr->vptr[1])(ptr);
vptr表示由編譯器產生的指標,指向virtual table。1 是virtual  table  slot的索引值,關聯到normalize()函式。第二個ptr表示this指標。

五,多型

在c++中,多型表示"以乙個public base class的指標(或引用),定址出乙個derived class object的意思"。

1,當乙個類中宣告有虛函式會發生什麼事情?

(1),編譯器會給這個類建立乙個虛函式表,表中存放的是虛函式的位址。每乙個虛函式都被指定乙個固定的索引值,這個索引在整個繼承體系中保持與特定的虛函式的關係。

(2),會給每個class object增加乙個成員vptr,指向class所擁有的虛函式表。

2,當乙個class派生自point會發生什麼什麼事情?

(1),它可以繼承base class所宣告的virtual function例項。正確地說,該函式例項的位址被拷貝到derived class的virtual table的相應slot中。

(2),對base中的虛函式進行覆蓋,這表示它自己的虛函式例項必須放在對應的slot中。

(3),加入新的virtual function。

3,如何確保呼叫到正確的虛函式?

假設有下面這個虛函式呼叫

ptr->normalize();
我們如何有足夠的知識在執行時,呼叫正確的normalize()函式?

(1),在呼叫normalize()時,經由ptr可以獲取該物件的virtual table。

(2),雖然我們不知道哪乙個normalize()函式例項會被呼叫,但是我們知道每乙個normalize()函式位址都被放在slot 1中。

(3),根據上面這些資訊,編譯器可將上面的呼叫轉換為:

(*ptr->vptr[1])(ptr);

container of 的的的原理

另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...

存在的就是合理的,發生的即是必然的。

筆者有時候會想,什麼是對,什麼是錯?對於追求某一件事情之前首先會考慮,為什麼我要做這件事情。所以經過自我分析和生活周邊環境的總結。我認為,對於乙個人來,這是在站在個體的角度上說。什麼是對的?就是你自己覺得是對的,它就是對的。不過這個只是你自己的想法。主觀上的正確,不代表客觀上也受到了別人的認可。就拿...

Apache的rewrite的重寫相關的引數

apache mod rewrite規則重寫的標誌一覽 使用mod rewrite時常用的伺服器變數 rewriterule規則表示式的說明 匹配任何單字元 chars 匹配字串 chars chars 不匹配字串 chars text1 text2 可選擇的字串 text1或text2 匹配0到1...