类内const static(static const)成员变量初始化问题

  在查找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操做时,一不会报错而二报错,因此我支持解释一的说法。若是有哪位大神有幸看到这篇文章,还望指点一二,感激涕零!

相关文章
相关标签/搜索