2016-11-15 74 views
-1

最近剛剛得到的反饋代碼審查,說明未初始化變量的不當行爲,我的類變量初始化現在看來很醜陋:初始化變量 - 爲什麼以及有什麼風險?

class MyClass 
{ 
    private: 
    int variable_one; 
    int variable_two; 
    int variable_three; 
    MyClass():variable_one(0),variable_two(0),variable_three(0){}; 
    //... 
}; 

此前,直到需要時我不會定義我的變量:

class MyClass 
{ 
    private: 
    int variable_one; 
    void MyFunction(int x) 
    { 
     variable_one = x; 
    } 
}; 

爲什麼我的第二個例子皺起了眉頭?機器人初始化變量涉及哪些風險?

+0

其他方法可能需要使用成員變量,它們不能保證調用順序。比對不起更安全。 –

+1

由於在構造類變量時沒有設置理智值,因此可以取出垃圾值。如果用戶無法看到垃圾,那麼這並不重要。你的成員變量是私人的;在大綱班級中,班級以外的任何人都無法訪問它們。你可能確定,但​​似乎不太可能。您無法知道這些值是否已在所示的輪廓中設置。而不瞭解狀態是C++中最重要的犯罪。 –

回答

3

將未初始化的變量留在其中的風險是您可能在設置之前先閱讀它們。這可能會導致極難診斷的錯誤和不穩定的行爲。您也可以將它們初始化爲標記值,​​以便更容易檢測它們何時尚未設置。

作爲一個說明,因爲C++ 11(什麼現在是由大多數編譯器支持),你可以這樣做:

class MyClass 
{ 
    private: 
    int variable_one = 0; 
    int variable_two = 0; 
    int variable_three = 0; 

}; 

現在有很少的代碼開銷,並明確指出,他們得到的默認值,除非你專門將它們設置爲別的東西。

2

由於某人,某一天將要使用您的課程,並假定在初始化過程中已經設置了內部狀態,所以這個問題令人不悅。您可能擔心不需要初始化並浪費時間?相反,取決於你擁有多少各種各樣的方法,你將在其中的每一箇中重複初始化代碼,直到你忘記其中的一個,但它工作正常,因爲你運行在調試模式下,所有內存都被清除。然後一個月後,有人在發佈時編譯,突然間他們認爲他們的代碼被破壞,因爲你沒有在中心位置初始化你的代碼。

RAII - 資源分配儘可能初始化。當他們創建你的類的一個實例時,確保它已被初始化。

1

您指定的第一個方法稱爲初始化程序列表,並且它是在您的類中有const或引用數據成員時初始化的唯一方法。

如果您不初始化您的數據成員是C++對象,它仍然會通過調用相應的構造函數被初始化爲默認值,然後當您嘗試在稍後嘗試初始化時重複相同的練習時間(比如你在功能中如何做,如果你認爲這是必要的)。

+0

@ user4581301,謝謝。這句話應該是「當你有C++對象作爲數據成員」的句子。我現在已經重新措辭,我希望它能清楚一點。 –

2

到目前爲止提供的答案都是正確的,但沒有人提到工作中有一個更一般的面向對象原則:對象的方法將其從一個內部一致的狀態轉換爲另一個。在一些愚蠢的東西(除非它是一個愚蠢的對象)的情況下,永遠不可能使用它。

例如,如果一個對象有一個數組和當前在數組中的當前活動元素的計數,那麼當count爲零時,不應該存在活動元素。更新陣列的方法也更新計數,保持與自身的一致性。瞬間的不一致性 - 在元素被添加之後並且在計數被更新之前 - 對於對象的用戶是不可見的。

在你的例子中,MyClass通過創建一個不確定的初始狀態而在錯誤的腳上得到。無論成員變量彼此之間有什麼關係,它們的值都由編譯器發生的情況決定。它使用的越多,這就是你想要的接近零的概率。

相關問題