从C++primer中文第五版 2.4节 const限定符 处开始
1、const限定符
const对象创建后其值不能修改;
const对象必需初始化,反之,有初始值的地方肯定是其定义之处;
默认为文件内有效,多文件共享时,必需加上extern;
2、const的引用
如果ci本身是个常量(const),则对ci的引用时,引用前需要加const,即,const int &n = ci;
引用的类型必须与其所引用对象的类型一致;
对const对象的引用,一定要是const,反之,对非const对象引用,可以是const,但是const引用非const,则不能通过const来修改非const
3、指向常量的指针,不能用于改变其所指对象的值,要想存放常量对象的地址,只能使用指向常量的指针。但是,指向常量的指针既可以指向常量,也可以指向非常量。如,const double *p = π表示指针p指向了一个常量pi,这个pi是不能变的,但是p并不是const,所以这个指针是可以随意变化的。但是不能通过指针p来改变pi的值。
4、const指针,指针是对象而引用不是,因此就像其他对象类型一样,允许把指针本身定为常量。可见,常量指针或者说const指针,就是指一个指针为常量的意思。
5、比较一下int *const curErr = &errNumb;和const double *const p = π
前者说明curErr是一个常量指针,它指向的地址是不变的,但是它指向的地址所对应的内容errNumb是int型整数,而errNumb是否会改变是任意的。后者说明p是一个常量指针,它指向的地址是不变的,但是它所指向的地址所对应的内容pi是const double型浮点数,而pi是不能改变的。
6、指向常量的指针和const 指针(常量指针)是不一样的。
7、顶层const:表示指针本身是个常量;底层const:表示指针所指的对象是一个常量。如,const int c = 32;//不能改变ci的值,这是一个顶层const;const int &r = c;//用于声明引用的const都是底层const
8、常量表达式:值不会改变并且在编译过程就能得到计算结果的表达式。常量表达式的值需要在编译时就能得到计算。
9、C++11新标准规定,允许将变量声明为constexpr类型,以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化。
10、指针和引用都能定义成constexpr,但是一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。如,constexpr int *q = nullptr;//q是一个指向整数的常量指针。constexpr const int *p = &i;//p是一个常量指针,i是一个整型常量。
11、函数体内定义的变量一般来说并非存放在固定的地址中, 因此constexpr指针不能指向这样的变量,但是,定义于所有函数体之外的对象其地址不变,能用来初始化constexpr指针。
未完待续...