私はこのような状況にあります:
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++では、値を初期化リストで定義する必要があるconst属性の場合を除き、コンストラクターで属性を初期化する必要はありません。
ただし、コンストラクタですべての属性を初期化することは明らかに良い方法です。初期化されていない変数または属性が原因で発生したバグの数を数えることはできません。
最後に、すべてのオブジェクトは永続的にがconsistent状態である必要があります。これには、パブリック(アクセス可能)属性とプライベート属性の両方が含まれます。最適化は、オブジェクトの一貫性を保つ理由にはなりません。
完全を期すために、警告はC/C++コード分析からのものです。特に問題はPotential Programming Problems
/Class members should be properly initialized
コード分析の設定を変更するには(この場合はプロジェクトごとにお勧めします)、プロジェクトのプロパティを編集します。警告全体を無効にするか、警告条件に違反するファイルのみで無効にすることができます。
CDTをGCCまたはCLangと比較する場合、これは、コンパイラーから利用可能なものと比較して、CDTによって追加のコード分析が行われている場合のようです。もちろん、CDTコード分析のレミットはコンパイラーのレミットよりも大きいため、これは予想されることです。
PS、あなたがそれを考えているなら、あなたはこれの実装を読むことができます 特定のチェッカー 。
すべての回答とコメントに完全に同意しない。メンバーが必要ない場合、デフォルトでメンバーを初期化する必要はまったくありません。これが、C/C++が組み込み型をメンバーまたは自動変数として初期化しない理由です。これを行うと、パフォーマンスが低下します。もちろん、オブジェクト/変数を一度作成しても問題はありません(そのため、スタティックがデフォルトで初期化されます)。タイトなループで何かが発生すると、デフォルトの初期化が貴重なナノ秒を消費する可能性があります。
このルールの1つの例外は、私の見解では、ポインターです(コードに未加工のポインターがある場合)。生のポインタはNULLで初期化する必要があります。これは、無効なポインタがあると、未定義の動作が発生するためです。
すでに述べたように、常にポインタを初期化する必要があり、もちろんconstオブジェクトは必須です。
私の意見では、必要がない場合は初期化しないでください。ただし、コンストラクター初期化されていないすべての変数を時々確認することをお勧めします。
数か月ごとにCppcheckを実行しています。これにより、「メンバー変数 'foo :: bar'がコンストラクターで初期化されていません」のような100を超える「false」警告が出ます。しかし、時々それはいくつかの実際のバグを発見するので、それは完全に価値があります。