2016-02-16 218 views
0

我想創建一個對象數組。目前我正在使用std::string a[10]類型的語法,但我不確定這是否是最佳做法。在C++中初始化對象數組

首先,std::string a[10]實際調用構造函數併爲10個字符串分配內存?我認爲std::string a聲明a但不綁定對象(我可能是錯的)。那麼std::string a[10]

其次,在通過std::string a[10]「聲明」數組之後(如果我沒有弄錯聲明),如何初始化元素?看到下面的我的困惑。

這給了錯誤:

std::mutex a[100]; 
for (int i = 0; i<100; i++) 
{ 
    a[i] = std::mutex(); // error; 
} 

,而這是好的:

std::thread a[100]; 
for (int i = 0; i<100; i++) 
{ 
    a[i] = std::thread(func, NULL); 
} 

這混亂的我,爲什麼這兩個片段給出不同的結果。第二個片段只是將對象複製到已創建的a[i]?如果是這樣,我可能會做錯事。

+2

C++不是Java ... – Brian

+0

@Brian是啊我得到了基本的錯誤.. – qweruiop

+0

在Java中,T a [100]; a [0] = new T();'產生100個字符串,然後製作一個氣球並將第一個字符串附加到氣球。在C++中,'T a [100]; a [0] = T();'製造100個氣球,然後製造另一個氣球,彈出100個氣球中的第一個,並將新氣球放置在其位置。你不能彈出互斥。 –

回答

2

I might be wrong

你絕對錯了。您錯誤地將C++用於某種其他語言,可能是Java或C#。

在C++中,當你說std::string s;時,你的 a std::string這是完全初始化和構造的。這也適用於數組類型。

此外,pro-tip:刪除C數組,並使用std::array代替,它會更好。

至於你們的例子之間的差異,他們都是不好的做法,但第一個是非法的,主要是因爲mutex是一種不可移動的特殊花卉,這是非常罕見的,但技術上合法。對於無限大多數類型(首先有默認的構造函數),你所做的是不好的做法,但應該是允許的。

如果你想構建這樣一個循環的對象,你應該尋找在std::vector<T>然後用push_back在循環,因爲這避免了不必要的默認施工要求和隨機MAX_SIZE常數。

1

First, does std::string a[10] actually call the constructor and allocate memory for 10 strings?

是的。如果要手動初始化實例,請使用數組指針或就地分配(在堆棧上)。

Second, after ``declaring'' the array via std::string a[10](if I'm not mistaken about the declaration), how to initialize the elements? See below for my confusion.

數組元素由no-args構造函數初始化。在你的代碼中,你爲元素分配了一個不同的值。有些物體允許這樣做,有些則不允許。