重新学习顶层const和底层const

这个其实和我另一篇博客内容差不多,就是常量指针,指向常量的指针变量类似。

顶层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 &可以绑定到普通常量上

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/113147311