开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
2.4const限定符
const对象一旦创建后其值就不可以再改变,所以const对象一定要初始化
默认状态下,const对象仅在文件内有效,不同的文件需要重新定义独立的变量为解决此问题,引入关键字extern
2.4.1const的引用
const int ci = 1024;
const int &r1 = ci; //正确 r1和ci都是常量
r1 = 42; //错误:r1是对常量的引用,不可以改变
int &r2 = ci; // 错误:试图让一个非常量引用指向一个常量对象
2.4.2指针和const
//指向常量的指针
const double pi = 3.14;
const double *cptr = π //cptr是一个指向双精度常量的指针
*cptr = 31.4;//err不能通过指向常量的指针改变对象的值
//常量指针
int errNumb = 0;
int const *curErr = &errNumb;//curErr是一个常量指针,将一直指向errNumb且不能改变
想要区分以上不同,最有效得到办法是从右往左看。
2.4.3顶层const
顶层const:指针本事是个常量。更一般的可以表示任意的对象是常量(不限于指针)
底层const:指针所指的对象是一个常量。
当执行对象的拷贝操作时,常量是顶层const和底层const存在明显区别:其中,顶层const不受什么影响,底层const的限制却不能忽视。
const int ci = 42;//不能改变ci的值,顶层const
const int *p2 = &ci;//允许改变p2的值,底层const
const int const *p3 = p2;//靠右的const是顶层const,靠左的const是底层const
p2 = p3; //左右都有底层const可以赋值
int *p = p3;//err p3包含底层const的定义,而p没有
2.4.4constexpr常量表达式
c++11新规,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。 注意:constexpr类型可以是常量表达式,但不一定就是常量表达式。