[英]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.