2012-03-01 111 views
0

在cpp中,這是可能的嗎?只有一個構造函數調用的數組初始化

Foo bar[23] = Foo(); 

編輯:

對於這個問題的動機是,我想我看到有人用這種語法

vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New(); 

,並想知道爲什麼它編譯,實際上是如何創造了許多新對象..

+0

這是什麼意思?都是'Foo bar [i] == f'?他們每個人都有一個新的Foo()? ... – xtofl 2012-03-01 09:00:24

回答

7

不使用此語法,但如果Foo有一個不平凡的默認 構造,

Foo bar[23]; 

會爲每個膜調用它陣列的呃。更一般地,還可以 寫:

Foo bar[23] = { x, y, z... }; 

編譯器將嘗試每個初始化(其可以是 任意表達式)轉換成Foo,並用它來初始化所述陣列的所述元件 。如果沒有足夠的初始化表達式,則 將使用Foo()對以下所有元素進行初始化。

編輯:

因爲一些評論問它:如果富沒有一個用戶定義的 構造,形勢的變化(因爲調用「構造」 什麼都不會做)。在這種情況下,的行爲:

Foo bar[23]; 

取決於變量的生命週期:如果有靜態的一生中,這將是 初始化爲零;否則,它根本不會被初始化。在這兩種情況下 ,您可以使用集合初始化強制初始化 你想:

Foo bar[23] = { { firstMember, secondMember... }, ... }; 

如果沒有足夠的初始化,其餘元素爲零 初始化,因此:

Foo bar[23] = {}; 

將零初始化所有成員。

爲了完整起見,我應該指出的是,集合初始化 不能用於類成員:唯一的方法可以初始化一個C 風格陣列構件是由分配給每個元件的手段,在 體的構造的或者通過複製初始化:定義一個靜態的 Foo並用它初始化成員。

我也許應該指出,以上所有都是指C++ 03。 C++ 11引入了一個擴展的初始化語法;特別是,您可以使用類似 成員的類似於聚合初始化的東西, 也可以。 (我認爲—我不太熟悉C++ 11,因爲不是我所有的編譯器都支持它的 )。

+2

+1精美的簡介。要真的徹底,也許在這裏添加一些關於POD結構的行爲? – 2012-03-01 08:59:41

+0

我同意Karl的觀點:類型'Foo'的行爲最終未初始化可能是一個難題。 – 2012-03-01 11:39:06

1

您可以使用以下語法初始化陣列:

struct Foo 
{ 
}; 

Foo x[2] = {Foo(), Foo()}; 
//or 
Foo y[] = {Foo(), Foo()}; 

在後一種情況下,數組的大小從初始化中推導出來。

+0

你在哪裏看到構造函數初始值設定項列表? – 2012-03-01 08:52:48

+0

@KarlKnechtel我誤解了這個問題。 – 2012-03-01 08:53:45

0

嘗試

Foo bar[23] = { Foo(), Foo(), Foo(), /* ... 23 of them */ }; 
+1

不需要,因爲編譯器無論如何都會這樣做。 – 2012-03-01 08:57:53

+0

那麼,對於默認初始化,當然,但我假設OP正在尋找更多的靈活性。 – 2012-03-01 08:59:09

3

如果你願意使用std::vector,您可以使用此:

std::vector<Foo> bar(23, Foo()); // initialize bar with 23 copies of Foo() 
+1

或者僅僅是'std :: vector bar(23)',它用23個默認構建的'Foo'對象(在C++ 11中通常會稍微優化)初始化'bar'。 – MSalters 2012-03-01 08:58:33