オブジェクト型クラスの public データメンバーの使用は推奨されていません。
C++ クラスのデータメンバーは、さまざまなレベルの可視属性で宣言することができます。public の場合はどこからでも、protected の場合は派生クラスのメンバー関数から、private の場合はそのクラスのメンバーのみが見ることができます。この警告は、public データメンバーを持つクラスをレポートします。public データメンバーはカプセル化の原理に反するため、推奨されていません。
カプセル化とは、オブジェクトの実装情報を隠蔽することです。これにより、クライアントに影響を与えることなくオブジェクトの実装を変更することができます。データメンバーを public にすると、クラスは変数へのアクセス方法を制御できず、 変数の不変プロパティーが順守されることを保証できなくなります。また、変数を計算値に置換するというような、実装の変更もできなくなります。
protected 可視属性は、public 可視属性よりも可視性が制限されるものの、同じ基本的な問題を抱えています。一般的に、データメンバーは private として宣言するのが最善といえます。変数へのアクセスは、必要に応じて、get/set メンバー関数によって提供されます。通常、これらの関数はインライン展開されるため、実質的なパフォーマンス・ペナルティーはありません。
この診断は、すべてのクラスに対して出力されるわけではありません。POD (Plain old data) クラスや共用体では出力されません。PODS とは、カプセル化やその他のオブジェクト指向機能を使用せずにフィールド値の passive コレクションとして表されるデータ構造です。POD クラス型の正式な定義は、 ユーザーが宣言したコンストラクター、デストラクター、代入演算子、基本クラス、仮想関数、または private、protected、参照型、非 POD、POD へのポインター、非 POD 型配列の非スタティック・データ・メンバーを持たないものです。
ID |
問題箇所 |
説明 |
---|---|---|
1 |
定義 |
クラスが定義された場所 |
#include <stdio.h> // This is an obvious Plain Old Data (POD) datatype so no warning here struct pod1 { int f1; int f2; }; // Same thing using "class" instead of "struct"; it's still a POD class pod2 { public: int f1; int f2; }; // Non-POD because it has a base class class nonpod1 : pod2 { public: int public_field; }; // Non-POD because it has constructor/destructor class nonpod2 { public: int public_field; explicit nonpod2(int x) : public_field(x) { printf("created nonpod2(%d)\n", public_field); } ~nonpod2() { printf("destroyed nonpod2(%d)\n", public_field); } }; int main(int argc, char **argv) { nonpod2 *me = new nonpod2(argc); delete me; return 0; }
© 2010 Intel Corporation. 無断での引用、転載を禁じます。