顶层const和底层const
顶层const的含义是:指针本身是一个常量
底层const的含义是:指针所指的对象是一个常量
最简单的区别例子(看const后面是指针p还是指针对应的值*p):
const int *p = 10; // 底层const
int *const P = 10; // 顶层const
但是个人还有一些特殊的不好判别,需要单独说一下的:
const int p = 10; // 顶层const,这种不涉及指针和引用的都是顶层const
---
int i = 10;
const int &p = &i; // 底层const,用于声明引用的const都是底层const
---
const int *pp = 10; // 底层const
const int *const p = pp; // 靠左边的是底层const,靠右边的是顶层const
对与一个等式,左边的对象必包含右边对象的底层const(左右都有限制可以;左边有限制右边没限制可以。其余不行),或者两个对象的数据类型能够转换也是可以赋值。
const int a = 10; // 顶层const
int i = a; // 因为右边只是顶层const,有没有底层const限制,所以可以赋值
const int *p = &i;
int *pp = p; // 因为右边是顶层const,且没有底层const限制,所以可以赋值
int *const cp = &i;
const int *ccp = cp; // 因为右边是顶层,左边是底层,可以赋值
int *ip = p; // 因为右边是底层const,左边是非const指针,所以不行
总结:
- 最简单数据结构中,靠左边的const(左边的)和引用的const是底层const;靠右边的(右边的)和非指针、引用的const是顶层引用
- 等式右边有底层const限制而左边无底层const限制的等式会报错
以上只是个人学习后的一些观点,若有错误之处,欢迎指出!