簡體   English   中英

構造函數應該初始化類的所有數據成員嗎?

[英]Should constructor initialize all the data members of the class?

我有這樣的情況:

class A {
public:
  A() : n(0) {}
private:
  int n;
  int m;
}

在構造函數中初始化m的應用程序邏輯中沒有任何意義。 然而,Eclipse的警告我說,構造葉m未初始化。 我現在無法在其他地方運行代碼。 警告是:

成員'm'未在此構造函數中初始化

那么,C ++是否鼓勵我們初始化構造函數中的所有數據成員,或者它只是Eclipse的邏輯?

構造函數應該初始化類的所有數據成員嗎?

那將是一個很好的做法。

那么,C ++是否鼓勵我們初始化構造函數中的所有數據成員?

它不是c ++標准所要求的。 只要您在使用之前初始化所有變量,您的程序在這方面是正確的。

或者它只是Eclipse的邏輯?

很有可能。 當所有警告都啟用時,我測試的g ++和clang版本都沒有警告。 該邏輯可能或可能不是基於高完整性c ++編碼標准12.4.2或一些其他編碼標准或樣式指南。

為完整起見,警告來自C / C ++代碼分析。 特別是問題是Potential Programming Problems / Class members should be properly initialized

要更改代碼分析設置(在本例中我建議按項目),請編輯項目屬性。 您可以禁用整個警告,或僅在違反警告條件的文件上禁用它。

顯示警告

至於將CDT與GCC或CLang進行比較,這似乎是CDT與編譯器提供的內容相比進行額外代碼分析的情況。 當然,這是預期的,因為CDT代碼分析的范圍大於編譯器的范圍。

PS,如果您願意,可以閱讀此特定檢查器的實現。

C ++不要求在構造函數中初始化屬性,除非const屬性必須在初始化列表中定義值。

但是,初始化構造函數中的每個屬性顯然是一種很好的做法。 我無法計算由於未初始化的變量或屬性而遇到的錯誤數量。

最后,每個對象應永久處於一致狀態,包括公共(可訪問)屬性和私有屬性。 優化不應成為保持對象不一致的原因。

完全不同意所有的答案和評論。 在不需要時,絕對不需要默認初始化成員。 這就是為什么C / C ++永遠不會將內置類型初始化為成員或自動變量的原因 - 因為這樣做會妨礙性能。 當然,在創建一次對象/變量時這不是問題(這就是靜態初始化靜態的原因),但是對於在緊密循環中發生的事情,默認初始化可能會耗費寶貴的納秒。

在我看來,這個規則的一個例外是指針(如果你的代碼中碰巧有原始指針)。 原始指針應該是NULL初始化的,因為具有無效指針是未定義行為的直接方式。

正如已經說過的那樣,你應該總是初始化指針,當然const對象是必需的。

在我看來,你不應該在沒有必要時進行初始化,但偶爾檢查所有非構造函數初始化變量是好的,因為它們是非常頻繁且難以發現的錯誤的來源。

我每隔幾個月就會跑一次Cppcheck。 這給了我超過一百個'false'警告,例如“成員變量'foo :: bar'未在構造函數中初始化。” 但有一段時間它會發現一些真正的錯誤,所以它是完全值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM