代碼清理工具是正確的。此代碼不會做你認爲它的作用:
void Init()
{
double array2D[10][10] = {0.0};
bool logicalarray[2] = {false};
}
你認爲這個代碼初始化MyClass
的成員變量。它實際上做的是聲明兩個本地(自動)變量,初始化它們,然後返回。成員變量沒有被觸及,並在Init()
的身體內hidden。
您可以通過解決這個問題:
void Init()
{
array2D[10][10] = {0.0};
logicalarray[2] = {false};
}
但我認爲,這在技術上是正確的,但仍然是錯誤的。你正在使用所謂的兩相結構。這兩個階段是:1)構建一個MyObject
。 2)通過調用它的Init()
函數初始化MyObject
。
醜。討厭。容易出錯&忘記。語義錯誤,因爲構造函數不是使對象保持完全初始化狀態。作爲一般規則,您應該不惜一切代價避免兩階段建設。更好的方法是在對象的構造函數中執行所有初始化 - 最好在成員初始化列表中進行,但對於聚合成員來說,這是很難/不可能的。在這種情況下,初始化在構造函數的身體:
class MyClass
{
public:
MyClass()
{
array2D[10][10] = {0.0};
logicalarray[2] = {false};
}
// ...
};
現在,MyObject
的建設也意味着初始化MyObject
。畢竟,這就是構造函數的用途。相反。
這裏的問題是我們不能像這樣初始化聚集。我們只能在構建時使用這種語法來初始化一個聚合,但發生在(不存在的)初始化列表中。我們不能在C++ 03中使用初始化列表來初始化聚合。所以,你留下了一個醜陋的情況:
MyClass()
{
memset (logicalarray, logicalarray+2, 0);
memset (array2D, array2D+sizeof (array2D), 0);
}
這使我認爲你不應該擺在首位使用原始陣列進行爭論,而是一個vector
(或東西),並通過一些初始化像:
class MyClass
{
public:
std::vector <bool> mBools;
std::vector <std::vector <double> > mDoubles;
MyClass()
{
std::fill_n (std::back_inserter (mBools), 2, false);
}
};
我會留下的mDoubles
初始化練習。
[this](http://stackoverflow.com/questions/10694689/how-to-initialize-an-array-in-c-objects)可能很有用 – streppel
你目前正在做什麼創建* new *數組'Init'會在'Init'的持續時間內影響類成員,然後超出範圍。你的代碼不*初始化類成員。 – us2012
重新編輯:我的答案不依賴於C++ 11。 –