C 函式語義學

2021-10-01 22:12:09 字數 1595 閱讀 2874

我們或許會認為呼叫類成員函式的開銷會大於呼叫普通函式,但是其實不是這樣的,呼叫普通成員函式和全域性函式開銷差不多,我們可以在vs中除錯,檢視反彙編**。普通成員函式在呼叫的時候編譯器會在傳遞乙個物件的this指標

eg:

#includeusing namespace std;

class a

void test1()

void test() };

int main()

eg:

#includeusing namespace std;

class a

void func1()

void func2() };

int main()

靜態型別:物件定義時的型別,在編譯期間被確定

動態型別:物件目標所指的型別,在執行時決定(伴隨著引用和多型)

eg:

#includeusing namespace std;

class a

;class b : public a

;int main()

靜態繫結:繫結的是靜態型別,所對應的函式或者屬性依賴於物件的靜態型別,發生在編譯期

動態繫結:繫結的是動態型別,所對乙個的函式或者屬性依賴於物件的動態型別,發生在執行期

eg:

#includeusing namespace std;

class a

};class b : public a

};int main()

eg:

#includeusing namespace std;

class a

};class b : public a

};int main()

虛函式中如果有預設引數,那麼這個預設引數的值是靜態繫結

eg:

#includeusing namespace std;

class a

};class b : public a

};int main()

eg:

#includeusing namespace std;

class a

};class b :public a

};class a1

};class b1 :public a1

};class a2

};class b2 :public a2

};int main()

繼承中,只要呼叫了子類的析構函式,那麼就算是對記憶體釋放成功,因為編譯器會在子類的析構函式中去呼叫基類的析構函式,就像遞迴一樣,直到頂層基類的析構函式被呼叫才會逐層返回

eg:

#includeusing namespace std;

class a1{};

class a2{};

class b :public a1, public a2{};

int main()

C 虛函式語義學

c 中的多型通過虛函式表實現,需要在執行時,根據指標所指物件的實際型別,根據物件中的虛函式表指標來索引相應的虛函式來呼叫。對於class derived public base1,public base2 base2 pbase2 new derived pbase2會調整this指標,使pbase...

建構函式語義學

有些書上說,如果乙個類中沒有任何的建構函式,那麼編譯器會為我們預設的合成乙個 合成預設規則函式 其實,系統是在 必要的時候 才會為我們合成預設的建構函式。這個可以去分析obj檔案 情況1 如果乙個類中沒有任何的建構函式,且它的成員變數中含有乙個類型別的成員,那麼這個時候系統會為這個類合成乙個預設的建...

建構函式語義學之程式轉化語義學 2

在 建構函式語義學之程式轉化語義學 1 中編譯器做了一些優化,有時他還會給你的程式更多的優化 1 在使用者層面做優化 如果程式設計師頂乙個計算用的 constructor x bar const t y,const t z x xx 以 y 和 z 來處理 xx return xx 有的編譯器開發人...