C++静的メンバー関数のまとめ
2575 ワード
C++静的メンバー関数のノットから
クラスの静的メンバーは本当に愛憎が入り交じる特性です.静的クラスのメンバーの知識点をよくまとめて、今後の面接で受動的ではないようにすることにしました.静的クラスメンバーには、静的データメンバーと静的関数メンバーの2つの部分があります.
静的データ・メンバー:
クラス内のデータ・メンバーの宣言にstaticキーを付けると、そのデータ・メンバーはクラスの静的データ・メンバーになります.他のデータ・メンバーと同様に、静的データ・メンバーもpublic/protected/privateアクセス・ルールを遵守します.また、静的データ・メンバーには、次の機能があります.
1.静的データ・メンバーの定義.静的データ・メンバーは、実際にはクラス・ドメインのグローバル変数です.したがって、静的データ・メンバーの定義(初期化)はヘッダ・ファイルに置くべきではありません.定義はグローバル変数と同じです.例を次に示します.
注意:静的データ・メンバーをヘッダ・ファイルで定義(初期化)しようとしないでください.ほとんどの場合、このようにすると、定義を繰り返すというエラーが発生します.#ifndef#define#endifまたは#pragma onceを付けてもだめです.
2.静的データ・メンバーは、クラスの派生クラスのオブジェクトを含むクラスのすべてのオブジェクトによって共有されます.すなわち、派生クラスオブジェクトとベースクラスオブジェクトがベースクラスの静的データメンバーを共有する.例を次に示します.
3.静的データ・メンバーはメンバー関数のオプション・パラメータになりますが、通常のデータ・メンバーはできません.例を次に示します.
4.★静的データ・メンバーのタイプは、属するクラスのタイプであってもよく、通常のデータ・メンバーではできません.通常のデータ・メンバーは、属するクラス・タイプとして宣言できるポインタまたは参照のみです.例を次に示します.
5.★この特性は、標準c++に属する特性なのか、vc 6独自の特性なのかはわかりません.静的データメンバーの値はconstメンバー関数で合法的に変更できます.例を次に示します.
二、静的メンバー関数静的メンバー関数はあまり話せません.
1.静的メンバー関数のアドレスは、通常の関数ポインタで保存できますが、通常のメンバー関数アドレスは、クラスメンバー関数ポインタで保存する必要があります.例を次に示します.
2.静的メンバー関数は、クラスの非静的メンバーを呼び出すことはできません.静的メンバー関数にはthisポインタが含まれていないためです.
3.静的メンバー関数はvirtual、const、volatile関数として同時に宣言できません.例を次に示します.
最後に、静的メンバーは独立してアクセスできます.つまり、オブジェクトインスタンスを作成する必要がなくアクセスできます.
クラスの静的メンバーは本当に愛憎が入り交じる特性です.静的クラスのメンバーの知識点をよくまとめて、今後の面接で受動的ではないようにすることにしました.静的クラスメンバーには、静的データメンバーと静的関数メンバーの2つの部分があります.
静的データ・メンバー:
クラス内のデータ・メンバーの宣言にstaticキーを付けると、そのデータ・メンバーはクラスの静的データ・メンバーになります.他のデータ・メンバーと同様に、静的データ・メンバーもpublic/protected/privateアクセス・ルールを遵守します.また、静的データ・メンバーには、次の機能があります.
1.静的データ・メンバーの定義.静的データ・メンバーは、実際にはクラス・ドメインのグローバル変数です.したがって、静的データ・メンバーの定義(初期化)はヘッダ・ファイルに置くべきではありません.定義はグローバル変数と同じです.例を次に示します.
xxx.h
class base{
private:
static const int _i;// , c++ , vc6 。
};
xxx.cpp
const int base::_i=10;// ( ) private protected .
注意:静的データ・メンバーをヘッダ・ファイルで定義(初期化)しようとしないでください.ほとんどの場合、このようにすると、定義を繰り返すというエラーが発生します.#ifndef#define#endifまたは#pragma onceを付けてもだめです.
2.静的データ・メンバーは、クラスの派生クラスのオブジェクトを含むクラスのすべてのオブジェクトによって共有されます.すなわち、派生クラスオブジェクトとベースクラスオブジェクトがベースクラスの静的データメンバーを共有する.例を次に示します.
class base{
public :
static int _num;//
};
int base::_num=0;//
class derived:public base{
};
main()
{
base a;
derived b;
a._num++;
cout<
3.静的データ・メンバーはメンバー関数のオプション・パラメータになりますが、通常のデータ・メンバーはできません.例を次に示します.
class base{
public :
static int _staticVar;
int _var;
void foo1(int i=_staticVar);// ,_staticVar
void foo2(int i=_var);// ,_var
};
4.★静的データ・メンバーのタイプは、属するクラスのタイプであってもよく、通常のデータ・メンバーではできません.通常のデータ・メンバーは、属するクラス・タイプとして宣言できるポインタまたは参照のみです.例を次に示します.
class base{
public :
static base _object1;// ,
base _object2;//
base *pObject;// ,
base &mObject;// ,
};
5.★この特性は、標準c++に属する特性なのか、vc 6独自の特性なのかはわかりません.静的データメンバーの値はconstメンバー関数で合法的に変更できます.例を次に示します.
class base{
public:
base(){_i=0;_val=0;}
mutable int _i;
static int _staticVal;
int _val;
void test() const{//const
_i++;// ,mutable
_staticVal++;// ,static
_val++;//
}
};
int base::_staticVal=0;
二、静的メンバー関数静的メンバー関数はあまり話せません.
1.静的メンバー関数のアドレスは、通常の関数ポインタで保存できますが、通常のメンバー関数アドレスは、クラスメンバー関数ポインタで保存する必要があります.例を次に示します.
class base{
static int func1();
int func2();
};
int (*pf1)()=&base::func1;//
int (base::*pf2)()=&base::func2;//
2.静的メンバー関数は、クラスの非静的メンバーを呼び出すことはできません.静的メンバー関数にはthisポインタが含まれていないためです.
3.静的メンバー関数はvirtual、const、volatile関数として同時に宣言できません.例を次に示します.
class base{
virtual static void func1();//
static void func2() const;//
static void func3() volatile;//
};
最後に、静的メンバーは独立してアクセスできます.つまり、オブジェクトインスタンスを作成する必要がなくアクセスできます.