c++クラスstaticメンバー

2541 ワード

テーマから,ここではクラスにおけるstaticの役割(クラスの静的メンバー),すなわち2点:staticデータメンバーとstaticメンバー関数のみについて論じる.静的メンバーの提案:データ共有の問題を解決するために.
もちろん、グローバルオブジェクトでもデータ共有が可能ですが、staticには(1)パッケージ性:staticメンバーはプライベートメンバーであってもよく、グローバルオブジェクトはグローバルであり、一般ユーザーコードでこの値を変更できるという2つの利点があります.(2)名前の競合を回避:staticメンバーの名前はクラスの役割ドメインにあるため、他のクラスのメンバーまたはグローバルオブジェクトの名前と競合することを回避できます.注意:staticメンバーはクラスに属し、クラスのオブジェクトには関係ありません.
一、staticデータメンバーstaticは静的であり、修飾された変数の生存期間を指す.静的生存期間とは、「グローバル・データ領域」に格納されたデータを指し、プログラムが実行されると存在し始め、プログラムが終了するとシステムによって自動的に解放されます.定義(初期化):クラスのデータ・メンバーに基づいてクラスの宣言体で初期化できません.staticメンバーの初期化(クラスの体外)形式は、<データ型><クラス名>:<静的データ・メンバー名>=<値>//通常の静的変数やオブジェクトと混同されないように、ここ(定義時)static(クラス内で宣言する場合に必要)は追加されません.宣言:クラス内で宣言する必要があります:static<データ型><静的データメンバー名>;
注意:クラス宣言は、1つのクラスの「サイズと仕様」のみを宣言するため、実際のメモリ割り当ては行われません.クラス宣言で定義を書くのは間違っています.
参照:<クラス名>:<静的データ・メンバー名>次のようになります.
class widget
{
public:
    static int var;//  
...
};
int widget::var = 10; //      

特殊な整形const staticメンバー
:
初期化式が定数式である限り、整数const staticデータメンバーはクラスの定義内で初期化(宣言時に初期化)する必要があります.この場合、クラスの定義の外でメンバーを定義する必要があります(初期値を指定する必要はありません).次のようになります.
class widget
{
public:
    static const int con_var = 10; //  ,  ,     
...
};
const int widget::con_var; //  

staticメンバーを含むクラスサイズ:
次のようになります.
#include <iostream>
using namespace std;

class MyClass
{
public:
	int id;
	static int rootId;
};

int main()
{
	cout << sizeof(MyClass) << endl;

	return 0;
}

出力結果:4.
どうして8じゃないの?クラスのstaticメンバー変数はグローバルデータストレージ領域に配置されているため、通常のクラスメンバー変数とは一緒に配置されません.
二、staticメンバー関数クラスのstaticがオブジェクトに関係ないため、staticメンバー関数にはthisポインタが含まれていません.すなわち、オブジェクトのメンバー変数を操作できません(すなわち、オブジェクト個体を識別しません).
したがってstaticメンバー関数は主にstaticデータメンバー(クラスのみ)を操作するために使用されます.
staticメンバー関数と一般メンバー関数はthisの違いのほかに
2つの違い:
(1)staticメンバー関数のアドレスは通常関数ポインタで格納でき、通常メンバー関数アドレスはクラスメンバー関数ポインタで格納する必要がある.
次のようになります.
class widget
{
public:
    static int funA();
    int funB();
};
int (*pfA)() = &widget::funA; //       
int (base::*pfB)() = &base::funB; //      

(2)静的メンバー関数はvirtual、const、volatileと同時に宣言できません.
次のようになります.
class widget
{
pubilc:
virtual static void funA(); //Error
static void funB() const; //Error
static void funC() volatile; //Error
...
};

参考文献:1.http://www.yesky.com/20010828/194000.shtml 2.http://blog.csdn.net/danky/article/details/1447011 3.《C++Primer》