前提条件: C の静的変数
C言語のr
static キーワードは、異なるタイプで使用すると異なる意味を持ちます。静的キーワードは次のように使用できます。
- 静的変数: 関数内の変数、クラス内の変数 クラスの静的メンバー: クラス オブジェクトおよびクラス内の関数 ここで、これらの static の使用法をそれぞれ詳しく見てみましょう。
静的変数
関数内の静的変数 : 変数が静的として宣言されている場合、スペース プログラムの存続期間中割り当てられます 。関数が複数回呼び出された場合でも、静的変数用のスペースは 1 回だけ割り当てられ、前の呼び出しの変数の値が次の関数呼び出しに引き継がれます。これは、関数の以前の状態を保存する必要がある C/C++ またはその他のアプリケーションでコルーチンを実装する場合に便利です。
C++
// C++ program to demonstrate> // the use of static Static> // variables in a Function> #include> #include> using> namespace> std;> void> demo()> {> >// static variable> >static> int> count = 0;> >cout << count <<>' '>;> >// value is updated and> >// will be carried to next> >// function calls> >count++;> }> int> main()> {> >for> (>int> i = 0; i <5; i++)> >demo();> >return> 0;> }> |
>
>出力
0 1 2 3 4>
上記のプログラムでは、変数 count が静的として宣言されていることがわかります。したがって、その値は関数呼び出しを通じて伝達されます。変数 count は、関数が呼び出されるたびに初期化されるわけではありません。余談ですが、Java では関数内で静的ローカル変数を使用できません。
クラス内の静的変数 : 静的として宣言された変数は、別の静的ストレージにスペースが割り当てられるため、一度だけ初期化されるため、静的変数は クラス内のオブジェクトはオブジェクトによって共有されます。 異なるオブジェクトに対して同じ静的変数の複数のコピーを作成することはできません。また、この理由により、コンストラクターを使用して静的変数を初期化することはできません。
C++
Javaは文字列にキャストします
// C++ program to demonstrate static> // variables inside a class> #include> using> namespace> std;> class> GfG {> public>:> >static> int> i;> >GfG(){> >// Do nothing> >};> };> int> main()> {> >GfG obj1;> >GfG obj2;> >obj1.i = 2;> >obj2.i = 3;> >// prints value of i> >cout << obj1.i <<>' '> << obj2.i;> }> |
>
>
出力
undefined reference to `GfG::i' collect2: error: ld returned 1 exit status>
上記のプログラムでは、複数のオブジェクトに対して静的変数 i の複数のコピーを作成しようとしていることがわかります。しかし、これは起こりませんでした。したがって、クラス内の静的変数は、以下に示すように、クラス外でクラス名とスコープ解決演算子を使用してユーザーによって明示的に初期化される必要があります。
C++
// C++ program to demonstrate static> // variables inside a class> #include> using> namespace> std;> class> GfG {> public>:> >static> int> i;> >GfG(){> >// Do nothing> >};> };> int> GfG::i = 1;> int> main()> {> >GfG obj;> >// prints value of i> >cout << obj.i;> }> |
>
>出力
1>
クラスの静的メンバー
オブジェクトを静的としてクラス化する : 変数と同様に、オブジェクトも静的として宣言された場合、プログラムの存続期間までスコープを持ちます。オブジェクトが非静的である以下のプログラムを考えてみましょう。
C++
意図 意図
// CPP program to illustrate> // when not using static keyword> #include> using> namespace> std;> class> GfG {> >int> i;> public>:> >GfG()> >{> >i = 0;> >cout <<>'Inside Constructor
'>;> >}> >~GfG() { cout <<>'Inside Destructor
'>; }> };> int> main()> {> >int> x = 0;> >if> (x == 0) {> >GfG obj;> >}> >cout <<>'End of main
'>;> }> |
>
>出力
Inside Constructor Inside Destructor End of main>
上記のプログラムでは、オブジェクトは if ブロック内で非静的として宣言されています。したがって、変数のスコープは if ブロック内のみにあります。したがって、オブジェクトが作成されるとコンストラクターが呼び出され、オブジェクトのスコープは宣言されている if ブロック内にのみあるため、if ブロックの制御が完了するとすぐにデストラクターが呼び出されます。オブジェクトを静的として宣言した場合の出力の変化を見てみましょう。
C++
// CPP program to illustrate> // class objects as static> #include> using> namespace> std;> class> GfG {> >int> i = 0;> public>:> >GfG()> >{> >i = 0;> >cout <<>'Inside Constructor
'>;> >}> >~GfG() { cout <<>'Inside Destructor
'>; }> };> int> main()> {> >int> x = 0;> >if> (x == 0) {> >static> GfG obj;> >}> >cout <<>'End of main
'>;> }> |
>
>出力
Inside Constructor End of main Inside Destructor>
出力の変化がはっきりとわかります。メインの終了後にデストラクターが呼び出されるようになりました。これは、静的オブジェクトのスコープがプログラムの存続期間全体にわたるために発生しました。
クラス内の静的関数 : クラス内の静的データ メンバーや静的変数と同様に、静的メンバー関数もクラスのオブジェクトに依存しません。オブジェクトと「.」演算子を使用して静的メンバー関数を呼び出すことができますが、クラス名とスコープ解決演算子を使用して静的メンバーを呼び出すことをお勧めします。 静的メンバー関数は、静的データ メンバーまたは他の静的メンバー関数にのみアクセスできます。 、クラスの非静的データ メンバーまたはメンバー関数にはアクセスできません。
C++
// C++ program to demonstrate static> // member function in a class> #include> using> namespace> std;> class> GfG {> public>:> >// static member function> >static> void> printMsg() { cout <<>'Welcome to GfG!'>; }> };> // main function> int> main()> {> >// invoking a static member function> >GfG::printMsg();> }> |
>
>出力
スクラーン精度スコア
Welcome to GfG!>
関連記事:
- 静的キーワードに関するクイズ
- C++ の静的データ メンバー
- 静的オブジェクトはいつ破棄されますか?
- 静的メンバー関数に関する興味深い事実
- 静的関数を仮想化できますか?
- C++ と Java の static キーワードの比較
- C の静的関数