2014-01-20 186 views
1

我在試圖找出如何以固定大小初始化std::vector<Object *>,因爲之後我不需要再改變它。所以我使用這個代碼(所述載體是空前):基本類型std :: vector的默認值

mControllerItem.resize(nLines, nullptr); 

按照documentation第二元件可以被用來指定一個默認將被複制到新的元件,但是這是可選的。如果沒有給出第二個參數,那麼使用默認的構造函數。

在指針,int等基本類型的情況下,這裏使用了什麼?在鏈接中它沒有提到任何關於它的內容。他們會被初始化爲0,他們保持未定義,還是有一些其他機制,確定他們將得到什麼值?在鏈接的例子中,輸出爲0,所以我認爲它與此無關,但是這是否是保證,還是這個實現(或未定義)?

+0

'std :: vector v(nLines,nullptr);' – Borgleader

+0

@Borgleader Thx!我改變了這一點。這有什麼不同嗎? – Devolus

+0

他們將零初始化 – user3125280

回答

6

該標準規定resize值初始化任何需要插入的項目,所以這裏的行爲是完全明確的。

簡單來說,值初始化裝置:

  • 類類型,默認構造函數被調用;如果沒有提供構造函數,則對於任何類型T的標量,每個成員都進行了值初始化(遞歸)
  • ,它們的值爲(T)0(這保證瞭如果T是指針,則使用的值將是空的,
+0

@MikeSeymour:謝謝,編輯。 – Jon

3

C++ 03和C++ 11之間的行爲定義略有不同。在前者中,創建了一個初始化值對象,並且向量中的新元素是從中複製構建的。在新版本中,新元素直接進行了值初始化。

對於像指針這樣的內置類型,值初始化等於零初始化,所以事實上,對於這兩個標準版本,您的元素都保證爲零。

請注意,假設使用默認構造函數實際上並不完全正確。它是,但只適用於自定義類型。只是發生值初始化的語法調用自定義類型的默認構造函數,併爲內置類型進行零初始化。

1

是的,如果是指針,它們會被初始化爲空值。所有基類型都有默認的構造函數。唯一不同的是

  1. int a; //默認的構造函數將不會被調用,所以價值是不確定的
  2. class C {int a; C(): a()}; //默認的構造函數將被調用,值爲0
  3. void f(int a = int()) //默認的構造函數將被調用,值爲0