C 預設建構函式

2021-06-14 14:19:52 字數 2551 閱讀 7004

c++ 預設建構函式

一直認為若程式設計師沒有自己定義無引數的建構函式,那麼編譯器會自動生成預設建構函式,來進行對成員函式的初始化,但這種認為是有誤的,不全面的.

預設的建構函式分為有用的和無用的,所謂無用的預設建構函式就是乙個空函式、什麼操作也不做,而有用的預設建構函式是可以初始化成員的函式。

對建構函式的需求也是分為兩類:一類是編輯器需求,一類是程式的需求。

程式的需求:若程式需求建構函式時,就是要程式設計師自定義建構函式來顯示的初始化類的資料成員。

編輯器的需求:編輯器的需求也分為兩類:一類是無用的空的建構函式,一類是編輯器自己合成的有用的建構函式。

在使用者沒有自定義建構函式的情況下:一、由於編輯器的需求,編輯器會呼叫空的無用的預設建構函式。二、但在下列情況下:編輯器就一定會合有用的預設建構函式。

看下面的例子:

#include using namespace std;

class foo

; void foo_bar()

int main()

程式可以通過編譯,但是顯示:the variable 'bar' is being used without being initialized.

這就說明建立foo bar; 這個物件編輯器並沒有自動合成預設建構函式。

預設的建構函式也分為:有用的建構函式和無用的建構函式,所謂有用的建構函式就是建構函式會為我們的類做一些初始化的工作,而無用的建構函式對我們的類沒有任何意義,我們常說的預設建構函式就是值有用的建構函式,英文為:nontrivial default constructor。

什麼情況下編輯器才會自動合成有用的預設建構函式?(以下的預設建構函式均值有用的預設建構函式)

下面四種情況,編輯器才會揹著使用者自己合成預設建構函式:

一、帶有「default constructor"的member class object.

如果乙個類沒有任何constructor,但它內含乙個帶有default constructor的member class object。編輯器就會自動為此類合成乙個預設的建構函式。

看下面的例子:

#includeusing namespace std;

class foo

; foo::foo()

foo::foo(int i)

class bar

; void foo_bar()

} int main()

輸出為:

call foo::foo() constructor !

print the content !

類class bar 沒有自己定義的constructor,而成員中的foo foo; 卻帶有字定義的constructor(foo::foo()),這種情況符合:"帶有「default constructor"的member class object."

由輸出結果可以看出:編輯器為class bar合成了預設的建構函式,並呼叫了foo的自定義建構函式。

那麼編輯器為class bar合成了預設的建構函式應該是什麼樣子呢?

inline bar::bar()

編輯器會自動合成如上的預設建構函式。

如果乙個類自定義了constructor,但它內含乙個帶有default constructor的member class object。編輯器就會自動擴充此類的自定義建構函式。

如果類bar自定義了建構函式,那麼編輯器會怎麼做,如下**:

class bar 

; bar::bar()

輸出為:

call foo::foo() constructor !

call bar::bar() constructor !

看到輸出結果仍然是呼叫了foo的自定義的建構函式」call foo::foo() constructor !「。

那麼這是如何做到的呢?

編輯器會擴充bar自定義的建構函式,其結構如下:

bar::bar()

二、如果派生列的基類中有自定義的nontrivial default constructor,那麼編輯器會為每乙個派生類合成乙個nontrivial default constructor,以呼叫基類自定義的nontrivial default constructor。

三、如果乙個類裡隱式的含有virtual tabel(vtbl)或者pointer member(vptr)

vtbl或vptr需要編輯器隱式的合成出來,那麼編輯器就把合成動作放在了預設建構函式裡,所以編輯器必需自己產生乙個建構函式來完成這些動作。

所以你的類裡只要含有virtual function,那麼編輯器就會生成預設的建構函式。

四、如果乙個類虛繼承與其他類

理由和上面一樣,虛基類也需要vtbl和vptr管理,那麼這些管理就需要合成建構函式來實現管理,則需要生成預設的建構函式。

所以類的基類有虛類,那麼編輯器就會合成預設的建構函式。

c 預設建構函式

c 什麼時候合成預設建構函式?c 合成的預設建構函式都做些什麼?以下三個條件同時滿足 源程式中沒有宣告任何建構函式 編譯器需要該類有預設建構函式 程式中需要呼叫預設建構函式 預設建構函式是以編譯單元為單位生成的 什麼時候編譯器需要預設建構函式 該類中有 有預設建構函式 的成員物件 該類繼承乙個有預設...

C 預設建構函式

先說c 新手一般的誤解 1.任何乙個類如果沒有定義預設建構函式,編譯器會自動合成乙個預設建構函式。2.編譯器合成出來的預設建構函式,會顯式的設定類中成員變數的值。先看乙個最基本的例子 從圖中可以看到物件a並沒有被初始化,即編譯器沒有為類a合成乙個預設建構函式。其實c 標準委員會曾敘述,如果沒有任何使...

C 預設建構函式

c 預設建構函式是對類中的引數提供預設值的建構函式,一般情況下,是乙個沒有引數值的空函式,也可以提供一些的預設值的建構函式,如果使用者沒有定義建構函式,那麼編譯器會給類提供乙個預設的建構函式,但是只要使用者自定義了任意乙個建構函式,那麼編譯器就不會提供預設的建構函式,這種情況下,容易編譯報錯,所以正...