c++ const 数据成员
const修饰的成员常量,该常量的内存地址是分在常量区。如果该成员常量的值被确定是在对象呗构造之后。也即是说该常量是属于某一个对象的。
而static修饰的静态变量也是存放在静态存储区。他是属于一个类的,并不是专属于某一个对象。而且这个值是可以改变的。该值的初始化是在编译阶段就完成的。
在一个值得注意的小点就是,const成员变量的初始化,一概在构造函数的初始化列表里面而不是在构造函数体内。而且是占用内存的。
现在的一个问题是static const修饰的成员常量存放在什么地方。理解肯定是,该常量属于类共有的,并且不可以改变。
网上讨论比较多的是该常量的定义能不能在头文件内。
这个问题要取决于你的编译器的版本。早起的编译器是不允许你在类声明里面初始化的。
现在版本的大都是支持的。
编译器不支持也是可以理解的,对于static变量来说必须是在类外声明的。
而const变量在定义的时候就必须初始化。而且static不属于某一个具体的类。
所以这就很好理解了。编译器不支持是一种严格的书法检查。
这本来就不符合代码书写规范。定义还是放在 .c 文件比较好。
const 常量的内存分配问题 (基本类型)
如果你定义了一个全局的常量,
const int constant = 3333333;
不分配内存
如果只是将这个constant赋值给其他变量,这个constant是不占用内存的。这就像是宏定义一样。但是比宏定义安全,因为有类型检查。
分配内存
1 const成员变量,这个在上面已经说了。
2 extern const int constant = 3333; 如果你在一个文件里面定义了一个常量,它是内部可见的,在别的文件内不能像是使用全局变量一样使用。
要想在其他文件内使用,必须显示的声明为extern。这样声明后,为该常量分配内存空间。
3 const int constant = 3333;
const int * pconstant = &constant ;
常量是不能在声明之后在进行定义的