25.C++的顶层const和底层const

发布时间 2023-07-03 21:31:10作者: CodeMagicianT

任意常量对象为顶层const,包括常量指针;指向常量的指针和声明const的引用都为底层const

  顶层const(top-level const)表示指针本身是个常量int* const ptr=&m;

  此时指针不可以发生改变,但是指针所指向的对象值是可以改变的

  底层const(low-level const)表示指针所指的对象是常量const int* ptr=&m;

  此时指针可以发生改变,但是指针所指向的对象值是不可以改变的

  顶层const可以表示任意的对象是常量(指针、引用、int、double都可以)

  于是只有指针和引用等复合类型可以是底层const

  执行对象的拷贝构造时,常量是顶层const还是底层const差别明显

  顶层const并不会有任何影响

进行拷贝操作的时候,仅仅只是从右值(顶层const)拷贝一个值并给自己赋值,虽然右值是一个不可变的量,但是貌似对我自己的拷贝完全没有影响吧

const int m = 10;
int n = m;
int* const ptr2 = &n;
int* ptr3 = ptr2;
int i= 0; 
int *const p1 = &i;//不能改变p1的值,这是一个顶层const
const int ci = 42;//不能改变ci的值,这是一个顶层const
const int *p2 = &ci;//允许改变p2的值 这是一个底层const
const int *const p3 = p2;//靠右的const是顶层const, 靠左的是底层
const const int &r = ci;//用于声明引用的const都是底层const

  当执行对象的拷贝操作时,常量是顶层const还是底层const区别明显。 其中,顶层const不受什么影响:

i = ci;//正确:拷贝ci的值,CI是 一个顶层const, 对此操作无影响
p2 = p3;//正确:p2和p3指向的对象类型相同,p3顶层const的部分不影响

  执行拷贝操作并不会改变被拷贝对象的值,因此,拷入和拷出的对象是否是常量都没什么影响。

  另一方面,底层const的限制却不能忽视。当执行对象的拷贝操作时拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。非常量可以转换成常量,反之则不行:

int *p = p3;//错误:p3包含底层const的定义,而p没有
p2 = p3;//正确:p2和p3都是底层const ??????????
p2 = &i;//正确:int*能转换成const int* 
int &r = ci;//错误:普通的int&不能绑定到int常量上
const int &r2 = 1;//正确:const int&可以绑定到一个普通int上

  p3既是顶层const也是底层const,拷贝p3时可以不在乎它是一个顶层const,但是必须清楚它指向的对象得是一个常量。因此,不能用p3去初始化p, 因为p指向的是一 个普通的(非常量)整数。 另一方面,p3的值可以赋给p2,是因为这两个指针都是底层const,尽管p3同时也是一个常量指针(顶层const), 仅就这次赋值而言不会有什么影响。

原文链接:https://blog.csdn.net/m0_64860543/article/details/128269607