前言:上课和书中对const的介绍仅仅局限于定义常量,而没有深入讲解const,本博客将用简短的语言小谈const,希望能让新人尽早入门c++。
1 const的位置?
const int a;<span style="white-space:pre"> </span>//1
int const b;<span style="white-space:pre"> </span>//2
const int *c;<span style="white-space:pre"> </span>//3
int * const d;<span style="white-space:pre"> </span>//4<span style="white-space:pre"> </span>
const int * const e ;<span style="white-space:pre"> </span>//5
2 C语言有const吗?
C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用
当使用&操作符取const常量的地址 分配内存
C++中的const常量类似于宏定义
const int c = 5; ≈ #define c 5
C++中的const常量在与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器(CPP)处理,单纯的文本替换3 const的注意事项
const 限定符定义常量时 ①常量名一般全用大写,便于与变量区分; ②要直接初始化,否则将无法初始化
4 const与类
4.1 类成员变量的属性如果有const变量,只能用初始化成员列表的方法进行初始化!
4.2 const在类成员函数的最后
4.3 可以在类定义的时候对const进行初始化吗?
class A
{
public const a = 10;
};
5 更深一步探讨const
const定义的常量在函数执行之后其空间会被释放,而static定义的静态常量在函数执行后不会被释放其空间。
static 表示的是静态的。类的静态成员函数,成员变量是和类相关的,不是和类的具体对象相关,即使没有具体的对象,也能调用类的静态成员函数,成员变量。一般的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。
class foo
{
private:
const int i = 100; // error !!!
public:
foo(){}
......
};
这样的初始化方式是不能通过编译的,因为在类对象里进行了存储空间分配,编译器不能知道const的内容是什么,所以不能把它用作编译期间的常量。这意味着对于类里的常数表达式来说,const就像它在C中一样没有作用。因此这个初始化工作必须发生在构造函数里,并且,要在构造函数的某个特别的地方。因为const必须在建立它的地方被初始化,所以在构造函数的主体里,const必须已初始化了,否则,就只有等待,直到在构造函数主体以后的某个地方给它初始化,这意味着过一会儿才给const初始化。当然,无法防止在在构造函数主体的不同地方改变const的值。