这个其实和我另一篇博客内容差不多,就是常量指针,指向常量的指针变量类似。
顶层const:
表示指针本身就是一个常量
底层const:
表示指针所指的对象是一个常量
这个东西其实也没什么难度了,下面引用点书本上的原话:
顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用,如算术类型,类,指针等底层const则与指针和引用等复合类型的基本类型部分有关。
比较特殊的是,指针类型既可以是顶层const也可以是底层const。
上面的话为什么顶层都适用呢?
就是因为顶层const直接就写死了。
如:const int a=1;a都被写死了,还想怎么变,所以都适用。
但是底层const没有改变,所以不同情况下要不同对待。
顶层const和底层const指针对比:
int i = 0;
int *const p1 = &i; 顶层,p1值不能改变
const int ci = 42; 顶层,ci值不能改变
const int *p2 = &ci; 底层,p2值能改变
const int *const p3 = p2; 既是底层又是顶层,p值不能改变
const int &r = ci; 用于声明引用的const都是底层const
拷贝操作:
常量是顶层const和底层const区别明显。
int a = 10;
const int * aa = &a;
int * const aaa = &a;
aa = aaa;顶层const可以赋值给底层,因为底层const的值可以改变
//aaa = aa; 反之则不行
当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换,非常量可以转换为常量,反之则不行
//int *p = p3; p3是底层的,p不是
p2 = p3;都是底层const可以
p2 = &i; int *可以转化为const int *
//int &r = ci; 普通的int &不能绑定到常量上
const int &r2 = i; const int &可以绑定到普通常量上