要想弄清这些声明的含义最行之有效的办法是从右往左阅读。
《C++ Primer》如是说。
int errNumb = 0;
int *const curErr = &errNumb;
const double pi = 3.14;
const double *const pip = π
所以curErr是一个指向int类型的常量指针
pip是一个指向const double类型的常量指针
//底层const-指针所指的对象是一个常量
//顶层const-指针本身是个常量
int i =0;
int *const p1 =&i;//顶层
const int ci =42;//顶层
const int *p2 =&ci;//底层
const int *const p3 =p2;//顶层
const int &r =ci;//底层
一般的,顶层const可以表示任意的对象是常量。
简单理解就是只要一个变量的类型是常变量,就可以理解为顶层
(如const int a = 20)
顶层const能表示的不止是指针,底层const与指针和引用等复合类型有关
int *const p1 =&i;//顶层
p1是一个常量指针,指向int类型的对象,即指针本身是个常量
const int *p2 =&ci;//底层
p2是一个指针,指向int类型的常量对象,即指针指向的对象是个常量
我们来看下面这段代码
int i =0;
int *const p1 =&i;//顶层
const int ci =42;//顶层
const int *p2 =&ci;//底层
i = 20;
cout << i << ‘ ‘ << *p1 << endl;//ture
*p1 = 20;
cout << i << ‘ ‘ << *p1 << endl;//true
*p2 = 50;
cout << ci << ‘ ‘ << *p2 <<endl;//err
i是一个变量,p1是个常量指针,我们对i进行重新赋值时,p1的值也跟着变化;
ci是个常变量,p2是个指针,对p2解引用重新赋值后,报错
当我们对顶层const执行拷贝操作时,基本上不会出现问题;
但底层const 的限制比较大。
熟练的区分底层与顶层const能让我们知道哪些变量可以重新赋值,哪些不能。
(☆▽☆)
C/C++判断数据类型与顶层const与底层const的区分
原文:https://blog.51cto.com/15093262/2670856