天天看點

類的靜态成量變量必須初始化

因為類的靜态成員變量是所有執行個體共用的.是以得在類外初始化.

調用的時候可以通過對象調用,也可以通過類直接調用

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