在查找const相關資料的過程當中,又遇到了另一個問題,就是C++類中const static(或者static const)成員變量應當如何初始化的問題。 測試
查閱了許多資料,發現VC環境下,只容許const static成員變量在類外初始化,這個應該是編譯器遺留下的bug(你也能夠說是要求嚴格)。 spa
在其餘編譯器下,整型以及枚舉類型的const static成員變量是容許在聲明的同時進行初始的,其中整型包括int、short、long、char等,非整型是指浮點型 包括float、double等。儘管能夠在類內進行初始化,可是我在網上看到兩種解釋: 設計
解釋一 code
雖然能夠進行初始化,可是這種初始化時不夠嚴格地,假若對變量取地址 (這裏並非指 &操做符,而是指全部須要用到這個變量的存儲空間的操做 好比 ++ 之類,其實這兒我也沒看懂到底什麼是取地址),就會出現錯誤,這是由於這種在類內的初始化是不會分配內存的,應當再次在類外進行定義來獲取內存分配(無需再賦值)。 內存
class people{ 編譯器 public: it const static int age = 18; 編譯 }; table const int people::age;class |
解釋二
之因此整型有這種特權,是爲了設計一個更明確(類型)的常量定義語法來取代用enum定義常量的舊方式。由於出發點是這個,因此才僅僅只是對靜態整形常量特殊處理,由於enum也只能是整型值。如今的最新標準徹底容許在類內進行定義,而且當你用到取地址操做時,它就會分配內存,相似於常量摺疊(const folding),因此無需在外再次定義,這是徹底沒有問題的。
class people{ public: const static int age = 18; }; //不須要const int people::age; |
對於上述解釋,做爲一個初學者,也無法從絕對的知識點上判斷到底哪一個是對的,根據我在VS2013中敲代碼實際測試來看,解釋1、二是代碼都是對的,都不會報錯,可是我在codeblock中運行時,若是對age進行const int *p=&people::age操做時,一不會報錯而二報錯,因此我支持解釋一的說法。若是有哪位大神有幸看到這篇文章,還望指點一二,感激涕零!