因為類的靜态成員變量是所有執行個體共用的.是以得在類外初始化.
調用的時候可以通過對象調用,也可以通過類直接調用
class A
{
public :
int i; // 有預設值
};
class B
{
public :
static int n;
static A Aobj;
};
int B::n = 1 ; // 靜态成員變量的初始化
A B::Aobj; // 靜态成員變量的初始化(執行個體化)
void main()
{
B Bobj; //注釋掉這行也能輸出B::n
printf( " B::n=%d Bobj.n=%d Bobj.Aobj.i=%d\n " , B::n, Bobj.n, Bobj.Aobj.i);
}
輸出“B::n=1 Bobj.n=1 Bobj.Aobj.i=0 ”
私有的靜态成員變量也是放在類外初始化的.這看起來跟它的私有屬性不相符.
再做下面的測試,發現了一個有趣的現象.
class B
{
static int i;
public :
B(){i = 3 ;}; // 把這行注釋掉,輸出變成2
int p(){ return i;};
};
int B::i = 2 ; // 把這行注釋掉,編譯報錯
void main()
{
B Bobj;
printf( " private: static int B::i=%d\n " , Bobj.p()); // 輸出3
}
類外的初始化那一行是必要的,而且是在構造函數之前就執行了的
最重要的一點,如果靜态成員變量不初始化,編譯會報錯.
轉載于:https://www.cnblogs.com/hgy413/archive/2011/07/25/3693622.html