天天看點

由static關鍵字引發的知識點學習和在類中的使用相關注意事項

比較基礎的是:在類中如果定義了static靜态資料成員,在類中聲明,但是在定義時需要在類外,而不能使用構造函數。比如: //test.h class test { private:              static int num;

…… 在類實作檔案中,給出定義和初值: //test.cpp int test::num = 5; ……

test類的所有對象共享這個靜态變量。一般來說,是不能在類聲明中初始化靜态資料成員的,不過有兩種例外情況:(c++ primer plus 428頁) 1.static const int  2.枚舉型const

但是即使是例外情況,它仍然隻是聲明。

有一種應用場景是,如果想把符号常量放入類的作用域内,比如對所有對象來說,數組的長度時固定的,這個時候,如果你這樣做: class Bakery{ private:     const int Month = 12;

    double cost[Month]; ……

但這樣是不對的(c++ primer plus 371頁),因為上述隻是對Month的聲明而非定義,而且此時類處在聲明階段,還沒有配置設定存儲,此時賦給Month初值是錯誤的。 由上文知,static int類型的變量可以在類聲明中賦初值,是以,可以改寫如下: class Bakery{ private:     static int Month = 12;

    double cost[Month];

    ……

這樣是可以的,但是需要補充的是(effective c++第15頁),由于它是static類型的靜态資料,而上述又隻是聲明,是以必須在類實作檔案中寫: const int Bakery::Month; 這個時候不需要給值,因為在聲明中已經給過了。

還有一種可替代的解決辦法,即使用enum: class Bakery{ private:     enum{Month = 12};

    double cost[Month];

    ……

需要注意的是:并不會建立類資料成員,所有對象中都不會包括枚舉。Month隻是一個符号名稱,在作用域為類的代碼中遇到時,編譯器直接用12來替換。