C++のstatic静的修飾子の詳細
2719 ワード
•
静的クラスメンバー:クラスオブジェクトに関連するメンバーデータおよびメンバー関数ではなく、クラス自体に関連するメンバーデータおよびメンバー関数です.
したがって、静的メンバーデータはクラスデータとも呼ばれ、静的メンバー関数はクラスメソッドとも呼ばれます.静的メンバーデータはクラスで説明されているだけで、定義(または初期化)も必要です.静的メンバーデータはクラス定義以外で初期化され(クラス名で修飾を限定する)、プログラムでは1回しか提供されないため、初期化はヘッダファイルに入れられません.
例1:
例2:
C++はconst静的クラスメンバーが直接初期化できることを規定し、他の非constの静的クラスメンバーはクラス宣言以外で初期化する必要があり、私たちは一般的にクラスの実装ファイルで初期化することを選択します.
自分で指定することもできます.
•
にある
inline
コンパイラは、静的メンバーデータが初期化されることを保証できないため、関数に静的メンバーデータを使用しないでください.
•
静的メンバー・データとグローバル変数の比較:静的メンバー・データは、クラスがどのくらいのインスタンスであるかにかかわらず、1つのコピーしかありません.これはグローバル変数と似ています.しかし、静的メンバーデータには役割ドメイン名があり、必ずしも
public
のです.
•
静的メンバー関数は次のように宣言できません.
const
および
volatile
。
•
静的メンバー関数と友元関数の比較:静的メンバー関数と友元関数は抑制されていません.
this
ポインタは、クラスにアクセスできます.
private
および
protected
部分.しかし、静的メンバー関数には役割ドメインの名前があり、必ずしも
public
のです.
•
const
静的メンバー・データ:
C++
コンパイラでは、秩序型(
int,unsigned
long,char
など)
const
静的メンバーデータ
クラスで初期化します.
•
静的メンバーデータ初期化順序:静的初期化メンバーデータ順序とクラス役割ドメインの静的オブジェクト、ファイル役割ドメイン、名前空間役割ドメインのオブジェクトの生存周期が関係します.異なるコンパイルユニット(すなわち
.
cpp
ファイル)の静的初期化には順序依存があり、危険がある可能性があります.解決策は、静的メンバーデータを静的メンバー関数に変換します.
•
volatile:
オブジェクトの値がコンパイラの制御または監視の外で変更される可能性がある場合、オブジェクトは
volatile
. このとき、コンパイラが実行するいくつかのルーチン最適化は適用されません.
volatile
クラスメンバー関数を修飾することもできます.について
volatile
クラスオブジェクト呼び出しのみ
volatile
メンバー関数、コンストラクション関数、およびコンストラクション関数.
静的クラスメンバー:クラスオブジェクトに関連するメンバーデータおよびメンバー関数ではなく、クラス自体に関連するメンバーデータおよびメンバー関数です.
したがって、静的メンバーデータはクラスデータとも呼ばれ、静的メンバー関数はクラスメソッドとも呼ばれます.静的メンバーデータはクラスで説明されているだけで、定義(または初期化)も必要です.静的メンバーデータはクラス定義以外で初期化され(クラス名で修飾を限定する)、プログラムでは1回しか提供されないため、初期化はヘッダファイルに入れられません.
例1:
class Test{
public:
static int k;
Test(int a):k(a){ // !!!
}
};
//error: 'int Test::k' is a static data member; it can only be initialized at its definition
例2:
C++はconst静的クラスメンバーが直接初期化できることを規定し、他の非constの静的クラスメンバーはクラス宣言以外で初期化する必要があり、私たちは一般的にクラスの実装ファイルで初期化することを選択します.
int Test::k;
デフォルト初期化は0です.自分で指定することもできます.
int Test::k(20);
class Test{
public:
static const int a = 10;
static int k;
};
int Test::k;
int main(){
cout << Test::k << endl;
cout << Test::a;
return 0;
}
•
にある
inline
コンパイラは、静的メンバーデータが初期化されることを保証できないため、関数に静的メンバーデータを使用しないでください.
class Test{
public:
static const int a = 10;
static int k;
void f(){
k++;
}
};
int Test::k(20);
int main(){
Test t;
t.f();
cout << Test::k;
return 0;
}
class A{
public:
A(A & e):_e3(e){}
A & _e3;
A * _e1;
static A _e;
A _e2; // error C2460: '_e2' : uses 'A', which is being defined
};
•
静的メンバー・データとグローバル変数の比較:静的メンバー・データは、クラスがどのくらいのインスタンスであるかにかかわらず、1つのコピーしかありません.これはグローバル変数と似ています.しかし、静的メンバーデータには役割ドメイン名があり、必ずしも
public
のです.
•
静的メンバー関数は次のように宣言できません.
const
および
volatile
。
•
静的メンバー関数と友元関数の比較:静的メンバー関数と友元関数は抑制されていません.
this
ポインタは、クラスにアクセスできます.
private
および
protected
部分.しかし、静的メンバー関数には役割ドメインの名前があり、必ずしも
public
のです.
•
const
静的メンバー・データ:
C++
コンパイラでは、秩序型(
int,unsigned
long,char
など)
const
静的メンバーデータ
クラスで初期化します.
•
静的メンバーデータ初期化順序:静的初期化メンバーデータ順序とクラス役割ドメインの静的オブジェクト、ファイル役割ドメイン、名前空間役割ドメインのオブジェクトの生存周期が関係します.異なるコンパイルユニット(すなわち
.
cpp
ファイル)の静的初期化には順序依存があり、危険がある可能性があります.解決策は、静的メンバーデータを静的メンバー関数に変換します.
•
volatile:
オブジェクトの値がコンパイラの制御または監視の外で変更される可能性がある場合、オブジェクトは
volatile
. このとき、コンパイラが実行するいくつかのルーチン最適化は適用されません.
volatile
クラスメンバー関数を修飾することもできます.について
volatile
クラスオブジェクト呼び出しのみ
volatile
メンバー関数、コンストラクション関数、およびコンストラクション関数.