深入探索C++物件模型-第二章《建構函式語意學》

來源:互聯網
上載者:User
整理一下第二章的內容,共之後參考回顧。 註:以下部分圖片來源於原書

1. 預設建構函式會在需要的時候被編譯器產生出來,要注意字眼“需要的時候”,例如如下代碼:

class Bat{public:int val;Bat* pNext;void bat_yell();};void Bat::bat_yell(){Bat batMan;if(batMan.val || batMan.pNext)// ...do something// ...}

按照程式員的本意,在bat_yell()方法中,batMan會調用預設建構函式將val和pNext初始化為0,但是實際結果並不是這樣,程式員的需要並不代表編譯器需要,當然,程式員的責任也不該被比那一起所承擔,歸根結底說來,上述程式碼片段中,並不會有預設建構函式被合成。退一步講,即便是有預設的建構函式被合成出來了,也不會將上述的資料成員初始化為0。也就是說此時的預設建構函式是trivial (無用的,不重要的),有四種情況編譯器會產生nontrivial(重要的,有用的)的預設建構函式:

a. 帶有預設建構函式的類成員對象:


Bar的類成員對象foo含有預設建構函式,所以編譯器會為類Bar合成預設建構函式,可能看起來像下面這樣:

值得注意的是,即便是編譯器為我們合成了預設建構函式,但是並不會產生任何代碼來初始化Bar的str成員變數,這個是程式員的責任。那麼程式員如果提供了建構函式(預設或者帶參數的),編譯器會做些什麼呢。答案是編譯器會擴充以後的建構函式,在每一個建構函式中安插代碼,代碼會被安插到程式員代碼的前面,使得每一個建構函式調用每一個帶有預設建構函式的成員變數的預設建構函式,有一點繞,看個具體例子:
b. 第二種情況是基類中由預設建構函式,類似於第一種情況,如果一個沒有定義預設建構函式的類繼承(派生)於一個帶有預設建構函式的基類,那麼這個子類的預設建構函式會被合成出來,在其中以按照聲明順序分別調用基類們的建構函式。如果類設計者提供了多個建構函式,但是沒有預設建構函式,編譯器會擴張已有的建構函式,而不會合成一個新的預設建構函式。如果此類還包含第一種情況:含有存在預設建構函式的成員類對象,那麼他們的預設建構函式會在調用基類預設建構函式之後調用。 c. 帶有虛函數的類,由於虛函數的存在,會產生虛函數表和虛表指標,而這些必須在物件建構期間安排好,所以對於類所定義的每一個建構函式,編譯器會安插一些代碼來做這樣的事情,對於未聲明任何建構函式類,編譯器會為他們產生一個預設的建構函式,以便正確的初始化每一個類對象的虛表指標。 d. 繼承自虛基類的類,由於在虛擬繼承下子類會存在指向虛基類的指標,與第三種情況類似。
總之,以上四種情況編譯器會合成一個隱式的重要的預設建構函式(implicit nontrivial default constructor)來滿足編譯器(而非程式)的需要:調用成員類或者基類的預設建構函式,或者完成每一個對象初始化其虛函數機制或者虛基類機制。對於其他情況並且沒有聲明任何建構函式的類,他們擁有的是隱式的不重要的預設建構函式(implicit trivial default constructor),實際上並不會被合成出來。 一定要注意,合成出來的預設建構函式只會初始化編譯器認為的必要的部分(基類對象,類對象),其他資料成員並不會被初始化。
最後,要記住兩個誤區(都是不對的): 1. 任何類只要沒有定義預設建構函式,就會被合成出來一個。 2. 編譯器合成出來的預設建構函式,會為類內的每一個成員設定預設值。 下一篇中整理關於拷貝建構函式(copy constructor)的內容。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.