宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

const,默认情况下仅在文件内有效

const int i12);

const引用:对常量的引用不能被用作修改它所绑定的对象

const int ci5);

const int &rcici);

rci = 90;//错误 不能修改

 

允许常量引用绑定到非常量的对象、字面值或表达式上

int i = 20;

const int &ri20);

const int &ri3i + ri);

 

常量引用仅对引用可参与的操作作出了限定,对于引用的对象本身未做限定

int i10);

const int &ci);

i = 90;//i不是常量,可以改变值

c = 20;//错误,c是一个常量引用,const限定了c为常量不能修改,i的修改与c的限定无关。

cout << c << endl;//值为90

 

//指针和const

int iv10);

int iv123);

const int * pci1&iv);//指向常量的指针,限定了该指针的操作,pci1的值可以改变,pcil指向的值不能变

pci1 = &iv1;

iv = 30;

int * const pci2&iv);//常量指针,把指针本身定位常量,pci2的值不能改变,pci2指向的值可以改变

*pci2 = 90;

 

cout << *pci1 << endl;//23

cout << *pci2 << endl;//90

 

顶层和底层

顶层:表示指针本身是个常量

底层:指针所指的对象是常量

小技巧:const int * p: const修饰的是*p,也就是*p不能变。

        int * const p: const修饰的是p,也就是p不能变。

 

 

字面值和constexpr

常量表达式:字面值是常量表达式,用常量表达式初始化的const对象也是常量表达式

const int ci = 20;//ci是常量表达式

const int cii = ci + 90;//cii是常量表达式

int iv = 30;//iv不是常量表达式

 

声明为constexpr的变量一定是常量,而且必须用常量表达式初始化

constexpr int cif = 23;

 

constexpr声明的指针,只对指针有效,与指针指向的对象无关

constexpr int cvi12);//必须定义到函数体外部才能被cip使用

constexpr const int * cip&cvi);

cout << *cip << endl;