2013-01-10 75 views
14

我昨天才知道,指定初始值設定項目的參數是可選的。但是,在這種情況下會發生什麼規則?C++初始值設定項列表中的默認值

在下面的例子中,將ptr初始化爲0,切換爲false,並且Bar默認構造?我猜這個問題有點多餘,因爲如果未指定參數值==未定義行爲,那麼初始化程序列表中會有點小問題。

我還可以指出C++標準中聲明初始化程序列表項沒有被賦予參數情況下的行爲部分嗎?

class Bar 
{ 
    Bar() { } 
}; 

class SomeClass; 
class AnotherClass 
{ 
public: 
    SomeClass *ptr; 
    bool toggle; 
    Bar bar; 

    AnotherClass() : ptr(), toggle(), bar() { } 
    // as opposed to... 
    // AnotherClass() : ptr(NULL), toggle(false), bar(Bar()) { } 
}; 
+0

[構造函數初始化列表空初始化]的可能重複(https://stackoverflow.com/questions/11164394/constructor-initialization-list-with-empty-initialization) – Justin

回答

12

是的,成員將分別初始化爲零和默認構造的對象。

的C++ 11標準規定此問題在12.6.2/7:

在MEM-初始化表達式列表或支撐-INIT-列表用於 初始化指定子對象(或,在 委託構造函數的情況下,完整的類對象)根據初始化規則爲 的直接初始化。

反過來,8.5/10讀取:

其初始化爲空集括號的一個目的,即(), 應值初始化。

段落8.5/7限定值初始化

要值初始化類型T的對象是指:

  • 如果T是一個(可能是CV-合格)類型(第9章)與用戶提供的構造函數 (12.1),然後調用T的默認構造函數(如果T沒有可訪問的默認值,則 初始化不合格3210構造函數);
  • 如果T是一個(可能CV修飾)非工會類類型 無需用戶提供的構造函數,則該對象是 零初始化,並且如果T的隱式聲明的缺省構造 是不平凡的,那構造函數被調用。
  • 如果T是一個數組類型,則 然後每個元素都進行了值初始化;
  • 否則,對象是 零初始化。

最後,8.5/5限定零初始化

要零初始化對象或類型T的參考是指:

  • 如果T是一個標量類型(3.9),將對象設置爲值0(零),取爲 的積分常量表達式,轉換爲T;
  • 如果T是一個 (可能CV修飾)非工會類型,每個非靜態數據 構件,並且每個基礎類子對象是零初始化和填充 被初始化爲零比特;
  • 如果T是(可能是cv-限定的)union 類型,則該對象的第一個非靜態命名數據成員是零 - 初始化並且填充初始化爲零位;
  • 如果T是 數組類型,則每個元素都是零初始化的;
  • 如果T是參考 類型,則不執行初始化。
+0

優秀和詳細。正是我在找的 - 謝謝! –

2

Initialisations覆蓋在[dcl.init](又名8.5)

點10表示:

其初始化爲空集括號的一個目的,即,(),應進行價值初始化。

價值初始化是,簡單地說,缺省建築類和零初始化非類類型。

6

在下面的例子中,將PTR被初始化爲0,切換到錯誤的,酒吧默認構造的?

是的。如果成員初始化程序在空括號內出現在初始化程序列表中,則該成員的初始值爲。這意味着數字類型將被初始化爲零,指向null的指針以及具有使用該構造函數的默認構造函數的類。

如果您根本沒有將成員包含在初始化列表中,那麼它將代替默認初始化;在這種情況下。數字和指針類型將保持未初始化狀態。

我還可以指出C++標準中聲明初始化程序列表項沒有被賦予參數情況下的行爲部分嗎?

C++ 11 12.6.2/7指定規則與直接初始化相同。

C++ 11 8.5/16指定如果初始化程序是(),則該對象將進行值初始化。

C++ 11 8.5/7定義了值的初始化。

相關問題