比較基礎的是:在類中如果定義了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來替換。