C 基礎知識 關於預設建構函式的一切

2021-06-27 17:59:52 字數 2695 閱讀 6024

c++條款—關於預設建構函式的一切

預設建構函式(defaultconstructor):

預設建構函式是在未提供顯示初始值時,用來建立物件的建構函式。如果沒有提供任何建構函式,則c++將自動提供預設建構函式,預設建構函式沒有引數,因為宣告中不包含值。同時,當且僅當沒有定義建構函式時,編譯器才會提供預設建構函式。為類定義了建構函式後,程式設計師就必須為它提供預設建構函式,如果提供了非預設建構函式,但沒有提供預設建構函式,則在初始化物件時呼叫預設建構函式是會出錯的:

stack   ww;// 錯誤

定義預設建構函式有兩種方法,一種是讓所有的引數都有預設值,一種是通過函式過載的方式來定義另乙個建構函式---乙個沒有引數的建構函式。

總而言之,如果程式沒有提供任何建構函式,那麼編譯器會為程式定義乙個預設建構函式;否則,必須自己提供預設構造寒素。預設建構函式可以沒有任何引數,如果有,則必須給所有引數都提供預設值。

明白了這些之後,在進入深層次的分析。

什麼時候編譯器為合成乙個default constructor.當編譯器需要它的時候!被合成出來的constructor值執行編譯器所需要的行動。在沒有任何建構函式的類,在進行初始化此類的物件時,編譯器合成了乙個default constructor,但是這個合成出來的也不會為成員變數進行初始化。如果想為類中的成員變數進行初始化,就必須主動提供乙個顯示的default constructor.

所以,就產生了這麼一說:對於classx,如果沒有任何使用者定義的建構函式,那麼會有乙個default constuctor被暗中(implicitly)申明出來…..乙個被安裝宣告出來的default constructor將是乙個trivial(無用)的建構函式…..

而乙個nontrivial defaultconstructor就是編譯器所需要的那種,有四種情況編譯器會合成nontrivial default constructor,下面就討論有四種情況下編譯器會合成nontrivialdefault constructor。只有在編譯器需要的時候編譯器才有合成default constructor。

1、「帶有defaultconstructor」的member class object(就是乙個類中的乙個成員具有de****lt  constructor)

如果乙個class沒有任何constructor,但它內含乙個memberobject,而後者有default constructor,那麼這個class的implicit default construct即使nontrivial,編譯器需要為此class合成出乙個defaultconstructor.注意,這個class沒有任何constuctor是第乙個前提,如果這個class有任何乙個建構函式,那麼編譯器就不會合成default constructor.同時他們是以內聯的形式被合成的。合成的預設建構函式只負責初始化具有預設建構函式的member class object.

同時,如果使用者定義了預設建構函式,在這個預設建構函式中沒有顯示的呼叫物件成員的預設建構函式,那麼這個物件成員的預設建構函式會被合成到這個定義的預設建構函式的。

2、「帶有defaultconstructor」的base class(從具有預設建構函式繼承的類)

如果沒有任何constructors的class派生自乙個「帶有defaultconstructor」的base class,那麼這個derived class的default constructor會被視為nontiivaial,並因此需要合成出來。

在這種情況下,如果設計者提供多個constructors,但是其中都沒有定義default constructor?在這些字自定義的建構函式內,如果沒有呼叫父類的建構函式來初始化父類成員,那麼父類的default construcots會被新增進去。它不會合成乙個新的default constructor,這是因為已經有了使用者自定義的建構函式存在(看最開始的部分就可以明白)的緣故。如果這個子類同時存在著「帶有default constructor」的member class objects,那麼de****lt constructor也會被呼叫----在所有base class constructor被呼叫之後(為什麼呢?因為有幾成關係的都是先呼叫子類的建構函式,然後才會初始化子類的成員)

3、「帶有乙個virtualfunction」的class

不管是繼承還是宣告,只要在此類中存在了virtual function,同時缺乏使用者自定義的建構函式,編譯器會合成乙個default constructor

4、「帶有乙個virtual baseclass」的class

如果沒有任何使用者自定義的函式,但是這個類繼承了virtual base class,那麼編譯器會合成乙個default constructor

總結:上述四種情況下,編譯器必須為沒有生命建構函式的類合成乙個default constructor,c++標準把那些合成物成為隱式有用預設建構函式(implicitnontrivial default constructors),但是合成出來的建構函式只能滿足編譯器的需要。他們能完成任務,是藉著「呼叫成員物件或基類的default constructor」或是「為滅乙個物件初始化其虛函式機制或虛基類機制」而完成。至於沒有存在那四種情況而又沒有任何建構函式的類,我們說他們擁有的是implicit trivial default constructor(隱式無用預設建構函式)。

在合成的defaultconstructor中,只有base class subobjects和member class objects會被初始化。所有其他的成員都不會被初始化。這些初始化操作對程式而言或許有需要,但對編譯器則並非必要。

c 基礎知識 建構函式的用法

類的建構函式是類的乙個特殊的成員函式,當建立類的新物件時執行。建構函式的名稱與類的名稱完全相同,它沒有任何返回型別。下面的例項說明了建構函式的概念 using system namespace public void setlength double len public double getlen...

C 基礎知識系列五 建構函式

前言本節主要來學習下例項建構函式 私有建構函式和靜態建構函式。建構函式的作用 1 當乙個類在new例項化物件時,可呼叫建構函式進行初始化物件。2 不帶引數的建構函式稱為 預設建構函式 無論何時,只要使用 new 運算子例項化物件,並且不為 new 提供任何引數,就會呼叫預設建構函式。除非類是stat...

PHP基礎知識建構函式

php基礎知識建構函式 created by phpstorm.user administrator date 2016 7 16 0016 time 15 05 header content type text html charset utf 8 class site 析構函式 public f...