静的メンバ
クラス定義では、(メンバ変数とメンバ関数を含む)のメンバーは、これらのメンバーは、使用することができ、キーワードの静的宣言静的メンバーとして知られている、などの静的。
オブジェクトの数、静的メンバーのみのコピーを作成し、このクラスにもかかわらず、このコピーは、このクラスに属するすべてのオブジェクトによって共有されています。
例:人の定義が含まれている静的メンバSNUM、sOtherを
/ * * *人SNUMを含む静的メンバを定義し、sOther * / クラス人{ パブリック: // 静的クラスメンバ属性 静的 INT SNUMと、 プライベート: 静的 INT sOther; };
第二に、静的メンバ変数
私たちは、静的メンバ変数を知って、クラスに属する、すべてのオブジェクトが共有しています。
静的変数がされているオブジェクトが作成されていない場合は、コンパイル時にスペースを割り当てられ、それがスペースを割り当てられています。
***注:
(1)静的メンバ変数は、クラス宣言にクラス外で定義されなければなりません。
(2)静的データメンバは静的メンバのフットプリントが含まれていないオブジェクトに割り当てられた空間内のオブジェクトに属していません。
(3)静的データメンバは、クラス名またはオブジェクト名で参照することができます。
例えば:私たちは、定義または静的メンバクラスとだけインターフェイスでを初期化します。アクセス静的メンバを研究するために、我々は、公衆に実験を設計することは容易にそれを設定します。
私たちは見ることができますクラスの初期化、無静的初期外
#include <iostreamの> 使用して名前空間STD; / * * *人SNUMを含む静的メンバを定義し、sOther * / クラス人{ パブリック: // 静的メンバクラス属性静的INT SNUMと、 プライベート: 静的INT sOtherを; }; / /のみクラスの初期化、初期化なし静的外部INT人:: SNUM = 0 ; int型人:: sOther = 0。
例えば、実装のcppファイルに
#include " ../header/Person.h " int型のmain(){ // 直接アクセスするために1クラス名 人数:: SNUM = 100 ; COUT << " 人:: SNUM:" << SNUM人:: < < ENDL; // によってアクセス2.オブジェクト 人物P1、P2; p1.sNum = 200である。 COUT << " p1.sNum:" << p1.sNum << ENDL; COUT << " p2.sNum:" << << p2.sNum てendl; // 3。 静的メンバーは、クラス外部からのアクセスを持っているプライベートメンバーにアクセスすることはできません//裁判所未満<< "人:: sOther:" <<人:: sOther <<てendl; 人物P3; // coutの<< "p3.sOther:" << p3.sOther <<てendl; システム(「一時停止」)。 戻りEXIT_SUCCESS; }
裁判所未満<< "人:: sOther:" <<人:: sOther <<てendl;
COUTは<<「p3.sOther:」<< p3.sOther <<てendl;
上記の文は誤りであるので、静的メンバーは、クラス外部からのアクセスを持っているが、プライベートメンバーにアクセスすることはできません。
次のように実行結果は以下のとおりです。
第三に、静的メンバ関数
クラス定義では、スタティックメンバ関数の前述の説明は、静的メンバ関数と呼ばれています。オブジェクトを呼び出すために、クラス名で作成されていません前と同じ、静的メンバ関数と静的変数を使用してください。主に静的変数にアクセスするための静的メンバ関数は、しかし、通常のメンバ変数にアクセスすることはできません。
静的メンバ関数を意味することは、情報共有、データ通信にあるのではなく、しない、静的データメンバを管理する静的データメンバのためのパッケージを完了します。
(1)静的メンバ関数は静的な変数にアクセスすることができ、変数は一般メンバーにアクセスすることができません
(2)静的メンバ関数と静的メンバ変数の使用を
(3)静的メンバ関数へのアクセス権を持っています
(4)通常のメンバ関数は静的メンバ変数にアクセスすることができ、あなたは非経常メンバ変数にもアクセスすることができます
例えば:人の定義は、通常の変数のようなインタフェース、mParamの静的メンバSNUMを含ん
/ * * *人がSNUMを含む静的メンバを定義し、mParam通常の変数 * / クラス人{ パブリック: // ノーマルと静的メンバ関数属性非静的メンバにアクセスすることができ 、ボイド changeParam1(int型のparamを){ mParam = のparam; SNUM = PARAM; } // 静的メンバ関数は、静的メンバ属性にアクセスできる 静的 ボイド changeParam2(int型PARAM){ // mParam = PARAMを; //はアクセスできない SNUM = PARAMを; } プライベート: 静的 ボイド changeParam3(INTのPARAM){ // mParam = PARAM; //はアクセスできない SNUM = PARAMを; } 公共: INT mParam; 静的 INT SNUM; }; // 外部の静的メンバ属性クラス初期化 INT人:: SNUM = 0。
実装では:
#include " ../header/Person.h " int型のmain(){ // 1.クラス名は直接呼び出す 人を:: changeParam2(100 ); // 2.オブジェクトを呼び出すことによって 人Pを、 p.changeParam2(200されます)。 // 3.静的メンバ関数がアクセス // 人:: changeParam3(100); // プライベート静的メンバ関数にアクセスすることはできませんクラス外部 // 人物P1; // p1.changeParam3(200); 戻りEXIT_SUCCESSを; }
四、CONST静的メンバプロパティ
クラスのメンバーならば、共有することが必要ですが、また達成するために、次に静的定数の変更を使用し、変更することはできません。静的に定義し、最高クラス内で初期化されたときのconstデータメンバ
#include <iostreamの> 使用して名前空間STD; / * * *静的データメンバーしばしばmShareを定義し、より良いクラス定義する* / クラス人数{ パブリック:// 静的定数順序交換// INT mShare静的定数= 10 ; constの静的INT mShare = 10 ; // 読み取り専用領域、変更することができない}; int型のmain(){ COUT << " 人:: mShare:" <<人:: mShare << ENDL; // 人:: = mShare 20;エラーは、外部で定義することができない戻りEXIT_SUCCESSの; }
結果:
第五に、シングルトンの静的メンバを達成するために
シングルトンは、共通のパターンI通常のJava開発であるデザインパターン。
そのコア構造ではシングルトンと呼ばれる特殊なクラスが含まれています。例は、シングルモード保証インスタンスの数の制御を容易にし、システムリソースを節約するように、システムのみ1つのクラスインスタンスのインスタンスと外部への容易なアクセスを。あなたが唯一のいずれかを指定でき、システム内のオブジェクトのクラスをしたい場合は、シングルトンパターンが最適なソリューションです。
シングルトン(シングルトン):内部のように単一の実施形態において実装は一例を生成し、それが静的のgetInstance()ファクトリメソッド(工場出荷時の設計パターン)を提供し、顧客が独自のインスタンスへのアクセスを許可すると、外部のを防止するためにインスタンス化、そのデフォルトコンストラクタとプライベートコピーコンストラクタのために設計され、単一の実施形態の静的オブジェクトはシングルトン、外部共有の例のみのクラスタイプ内。
例えば:コンテンツ出力機能を印刷するために使用され得る、および使用の累積数の関数であってもよいです。
#include <iostreamの> 使用して名前空間STD; / * * *プリンタ定義されたクラス* / クラスプリンタ{ パブリック: 静的プリンタ*のgetInstanceは(){ 戻りpPrinterを;} / * * *パブリッククラス内の定義された、印刷テキストに使用されます、そしてプリントの数を記録 * @paramテキスト* / ボイド PrintText(文字列テキスト){ mtimeの ++ ; COUT << " 印刷内容:" <<テキスト<< ENDL、 COUTは、 << " 回印刷:" <<STEM << endl; COUT << " -------------- " << てendl; } プライベート: // デフォルトコンストラクタとプライベートコピーコンストラクタとして設計された プリンタ(){mtimeの= 0 ;} プリンター(CONSTプリンタ&){} プライベート: 静的プリンタ* pPrinter; INT mtimeの; }; プリンター *プリンタ:: = pPrinter 新しい新しいプリンタ; / * * 試験方法PrintText *テストクラス。 * / ボイド試験(){ プリンタ *プリンタ=プリンター::のgetInstance(); プリンタ - > PrintText(" 内容1 " )。 プリンタ - > PrintText(" 内容2 " )。 プリンタ - > PrintText(" 内容3 " )。 } int型のmain(){ テスト(); 戻りEXIT_SUCCESS; }
結果: