Default Constructor 的構造操作

2021-09-06 15:49:18 字數 790 閱讀 5322

如何檢視編譯是否生成了預設建構函式?

示例:

class a  };

class b ;

int main()

使用gcc編譯:(關閉編譯優化)

gcc -c -o0 a.cpp -o a.o
使用objdump檢視:

objdump -t a.o
發現有函式符號 _zn1ac2ev,使用 c++filt 方便檢視,發現就是a的預設建構函式

0000000000000000 .text._zn1ac2ev

# c++filt _zn1ac2ev

a::a()

使用 ida 檢視

編譯器何時為你生成預設建構函式?

包含帶有預設建構函式的成員變數

父類有預設建構函式

有虛函式

有虛基類 原則

編譯器需要時才會自動生成預設建構函式,注意不是程式需要,而是編譯器需要。如給成員變數 int i 賦初值為0是程式需要,是程式設計師的職責,編譯器一概不管。若成員變數有建構函式,則在構造期間,編譯器會呼叫這些成員變數的建構函式初始化,此時該類若沒有預設建構函式,則會自動建立乙個。

誤區如果沒有,編譯器會自動建立預設建構函式 ×

編譯器合成的預設建構函式會顯式的設定每個成員變數的預設值 ×

default constructor 的建構函式

裡總結了如下四種情況 1.如果類內部有成員物件,並且成員物件帶有預設建構函式,那麼編譯器有必要為 這個類合成預設建構函式,以初始化這些成員物件。並且成員物件初始化的順序是按他們在類中宣告的順序。例 class blackball class redball class whiteball class...

default constructor 的建構函式

裡總結了如下四種情況 1.如果類內部有成員物件,並且成員物件帶有預設建構函式,那麼編譯器有必要為 這個類合成預設建構函式,以初始化這些成員物件。並且成員物件初始化的順序是按他們在類中宣告的順序。例 class blackball class redball class whiteball class...

預設建構函式 建構函式 複製建構函式和賦值操作符

這幾個概念比較容易混淆,總結一下。預設建構函式是沒有引數 和類同名的建構函式。當乙個類沒有任何建構函式時,編譯器將會合成乙個預設建構函式。那麼編譯器合成的預設建構函式是做什麼用的呢?是初始化類的成員變數嗎?事實上不是。編譯器合成的預設建構函式只是滿足編譯器的需要,而不是按照程式設計師想的去做。更詳細...