類內const static(static const)成員變量初始化問題


  在查找const相關資料的過程中,又遇到了另外一個問題,就是C++類中const static(或者static const)成員變量應當如何初始化的問題。

  查閱了許多資料,發現VC環境下,只允許const static成員變量在類外初始化,這個應該是編譯器遺留下的bug(你也可以說是要求嚴格)。

  在其他編譯器下,整型以及枚舉類型的const static成員變量是允許在聲明的同時進行初始的,其中整型包括int、short、long、char等,非整型是指浮點型 包括float、double等。盡管可以在類內進行初始化,但是我在網上看到兩種解釋:

解釋一

  雖然可以進行初始化,但是這種初始化時不夠嚴格地,倘若對變量取地址 (這里並不是指 &操作符,而是指所有需要用到這個變量的存儲空間的操作 比如 ++ 之類,其實這兒我也沒看懂到底什么是取地址),就會出現錯誤,這是因為這種在類內的初始化是不會分配內存的,應當再次在類外進行定義來獲取內存分配(無需再賦值)。

class people{

public:

    const static int age = 18;

};

const int people::age;

解釋二

  之所以整型有這種特權,是為了設計一個更明確(類型)的常量定義語法來取代用enum定義常量的舊方式。因為出發點是這個,所以才僅僅只是對靜態整形常量特殊處理,因為enum也只能是整型值。現在的最新標准完全允許在類內進行定義,並且當你用到取地址操作時,它就會分配內存,類似於常量折疊(const folding),所以無需在外再次定義,這是完全沒有問題的。

class people{

public:

    const static int age = 18;

};

//不需要const int people::age;

  

  對於上述解釋,作為一個初學者,也沒法從絕對的知識點上判斷到底哪個是對的,根據我在VS2013中敲代碼實際測試來看,解釋一、二是代碼都是對的,都不會報錯,但是我在codeblock中運行時,如果對age進行const int *p=&people::age操作時,一不會報錯而二報錯,所以我支持解釋一的說法。如果有哪位大神有幸看到這篇文章,還望指點一二,感激不盡!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM