const对象必须初始化
赋值对const变量无影响,只要你不改变const变量。
2.4.1 const的引用
引用类型必须与所引用对象类型一致。
常量指针:
int *const pt = &a;
指针为常量不可改变。
指针常量:
int const *pt = &a;
a为常量不可改变。
若a为const型,若一个指针(必须为const类型)指向。(且类型相同)
若const型指针pt,指向,则a只需类型与pt相同即可。
#include <iostream> int main(void) { const int a = 5; //int *const p = &a;错误 //int *p = &a;错误 const int *p = &a;//正确 return 0; }
#include <iostream> int main(void) { int a = 5; int *const p = &a; //const int *p = &a;都对 return 0; }
2.4.3 顶层const
指针本身是一个对象,它又可以指向另一个对象。
顶层 const表示指针本身是一个指针,底层 const表示指针所指对象是一个常量。
2.4.4 constexpr和常量表达式
const int a = 10;//是常量表达式 const int b = Func();//不是常量表达式
b本身是一个常量,但它的值具体要等到运行时才能获取到,所以不是常量表达式。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
constexpr int mf = 10; constexpr int t = mf + 1; constexpr int sz = size();//只有当size()是一个constexpr函数时,才是一个正确的声明语句
constexpr:告诉编译器我可以是编译期间可知的,尽情的优化我吧。
const:告诉程序员没人动得了我,放心的把我传出去;或者放心的把变量交给我,我啥也不动就瞅瞅。
一个constexpr指针的初始值必须是nullptr或者0,或者是存在于某个固定地址中的对象。
函数体内定义的变量一般来说并非放在固定内存中,在自定义函数中用constexpr报错,但在主函数中不会。