指针:顶层const表明指针本身是个常量,底层const表示指针所指的对象是个常量
顶层const:表示任意对象是常量
int *const p1 = &i; //顶层const指针
const int ci = 42; //顶层const整型变量
底层const:与指针和引用等复合类型有关
const int *p2 = &ci; //正确 常量对象对p2赋值
const int *p2 = &i; // 正确 变量也可以对p2赋值(隐式转换)
const int *p2 = 32; // 错误 整型数据无法对p2赋值
顶层+底层:指针以及所指的对象都是常量
const int *const p3 = p2;
声明引用的const都是底层const(引用本身是const)
const int &r = ci;
在执行拷贝操作时
- 顶层const(作为被拷贝对象)不受影响。
- 底层const:等号左右的对象都需具有底层const资格,或者可以隐式转换,一般来说变量可以转换成常量。
int *p = p3; //错误 p没有底层const资格
p2 = &i; //正确 i是变量,但可以隐式转换
int &r = ci; //错误 r非常量