** const 对象被设定为仅在文件内有效.当一个程序需要使用多个文件的时候,如果多个文件出现同名的const变量时,其实等同于在不同的文件中分别定义了独立的变量. **
** 如果想在多个文件中共享const对象,最好的做法是:对于const变量不管是声明还是定义都添加extern关键字.
extern const i=1024;
const引用
const int c=1024;
const int &r1=c;//对常量的引用需要在声明前加入const
int &r2=c;//错误,c是常量,而r2是一个非常量引用声明.
const int &r3=1024;//允许声明一个常量引用绑定一个字面值
与之对应的,如果绑定非常量引用
double i=3.14;
int &r=i;//错误,int类型引用不能绑定到double对象上
const和指针
pointer to const:** 指向常量的指针 **
const int i=1024;
int *p=&i;//错误,p是一个非常量指针
const int *p1=&i;//正确,p1是一个指向常量对象的指针
const指针
** 常量指针 ** const pointer 必须初始化
int i=1024;
int *const p=&i;//p指针所存放的地址不会改变
const int ii=2048;
const int *const p1=ⅈ//p1是指向常量对象的常量指针
顶层 const和底层 const
** 顶层const (top-level const) 表示指针本身是一个常量 **
** 底层const (low-level const) 标识指针所对应的对象是一个常量 **
constexpr变量
c++11新标准,允许将变量声明为constexpr类型来由编译器来验证变量的值是否是一个常量表达式,用constexpr声明的变量一定是一个常量,而且必须用常量表达式来初始化.
constexpr int i=1024;
constexpr int sz=size();//只有当将size函数声明为constexpr函数时才成立.
要注意的是,constexpr 后跟的声明类型必须为字面值(literal type)类型(如int,double,引用,指针),而复合类型(包含string,IO)则不属于字面值类型.其中,一个constexpr指针的初始值必须定义为0或者nullptr.
const int *p=nullptr;//指向常量的指针(pointer to const)
constexpr int *p1=nullptr;//指向整数的常量指针