静的 (C++)
static のキーワードは変数関数クラスのデータ メンバーとクラスの関数を宣言するために使用できます。
既定ではすべてのブロックの外部で定義された変数またはオブジェクトの静的な期間と外部のリンクがあります。静的な期間はプログラムの終了時にオブジェクトや変数はプログラムの開始時に割り当てられ割り当てされていないことを意味します。外部リンケージが変数の名前は変数が宣言されたファイルの外部から参照できることを意味します。逆に内部リンケージが名前の変数が宣言されたファイルの外部で参照できないことを意味します。
static のキーワードは次の場合に使用できます。
ファイルのスコープの変数またはグローバル関数 (または名前空間スコープ) 宣言するとstatic のキーワードは変数または関数は内部リンケージがあることを指定します。変数を宣言する場合変数は静的な時間を高別の値が指定されていない場合コンパイラは 0 に初期化します。
関数の変数を宣言するとstatic のキーワードは変数はその関数の呼び出しの間の状態を保持することを指定します。
クラス宣言のデータ メンバーを宣言するとstatic のキーワードはメンバーの 1 つが最初のコピーがクラスのすべてのインスタンスで共有されることを指定します。静的データ メンバーはファイル スコープで定義する必要があります。conststatic は初期化子があると宣言に必要なデータ メンバー。
クラス宣言のメンバー関数を宣言するとstatic のキーワードは関数がクラスのすべてのインスタンスで共有されることを指定します。静的メンバー関数は関数に this の暗黙のポインターがないためインスタンス メンバーにアクセスできません。インスタンス メンバーにアクセスする場合はインスタンスのポインターまたは参照であるパラメーターを持つ関数を宣言します。
静的として共用体のメンバーを宣言できません。ただしグローバルに宣言された匿名共用体は明示的に static で宣言する必要があります。
使用例
関数の static を指定して宣言した変数はその関数の呼び出しの間の状態を保持する方法を次の例に示します。
// static1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void showstat( int curr ) {
static int nStatic; // Value of nStatic is retained
// between each function call
nStatic += curr;
cout << "nStatic is " << nStatic << endl;
}
int main() {
for ( int i = 0; i < 5; i++ )
showstat( i );
}
次の例はクラスの static の使用方法を示しています。
// static2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class CMyClass {
public:
static int m_i;
};
int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;
int main() {
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject1.m_i = 1;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject2.m_i = 2;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
CMyClass::m_i = 3;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
}
次の例ではメンバー関数で static で宣言されたローカル変数を示します。静的変数はプログラム全体で使用できます。; 型のすべてのインスタンスは静的変数の同じコピーを共有します。
[!メモ]
マルチスレッド アプリケーションの静的ローカル変数に値を割り当てるスレッド セーフではないためプログラミング手法であることをお勧めします。
// static3.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct C {
void Test(int value) {
static int var = 0;
if (var == value)
cout << "var == value" << endl;
else
cout << "var != value" << endl;
var = value;
}
};
int main() {
C c1;
C c2;
c1.Test(100);
c2.Test(100);
}