在cpp中,這是可能的嗎?只有一個構造函數調用的數組初始化
Foo bar[23] = Foo();
編輯:
對於這個問題的動機是,我想我看到有人用這種語法
vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New();
,並想知道爲什麼它編譯,實際上是如何創造了許多新對象..
在cpp中,這是可能的嗎?只有一個構造函數調用的數組初始化
Foo bar[23] = Foo();
編輯:
對於這個問題的動機是,我想我看到有人用這種語法
vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New();
,並想知道爲什麼它編譯,實際上是如何創造了許多新對象..
不使用此語法,但如果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,因爲不是我所有的編譯器都支持它的 )。
+1精美的簡介。要真的徹底,也許在這裏添加一些關於POD結構的行爲? – 2012-03-01 08:59:41
我同意Karl的觀點:類型'Foo'的行爲最終未初始化可能是一個難題。 – 2012-03-01 11:39:06
您可以使用以下語法初始化陣列:
struct Foo
{
};
Foo x[2] = {Foo(), Foo()};
//or
Foo y[] = {Foo(), Foo()};
在後一種情況下,數組的大小從初始化中推導出來。
你在哪裏看到構造函數初始值設定項列表? – 2012-03-01 08:52:48
@KarlKnechtel我誤解了這個問題。 – 2012-03-01 08:53:45
嘗試
Foo bar[23] = { Foo(), Foo(), Foo(), /* ... 23 of them */ };
不需要,因爲編譯器無論如何都會這樣做。 – 2012-03-01 08:57:53
那麼,對於默認初始化,當然,但我假設OP正在尋找更多的靈活性。 – 2012-03-01 08:59:09
如果你願意使用std::vector
,您可以使用此:
std::vector<Foo> bar(23, Foo()); // initialize bar with 23 copies of Foo()
或者僅僅是'std :: vector
這是什麼意思?都是'Foo bar [i] == f'?他們每個人都有一個新的Foo()? ... – xtofl 2012-03-01 09:00:24