C++ 常量指针和指针常量的“权限”

115 阅读2分钟

const 是一种“只读”权限

当年初学c++时,被指针常量和常量指针搞得有些头晕,最近重温知识时,又碰到了以下报错:

image.png

C++ 不允许把指向常量的指针常量赋值给指向变量的指针常量,也不允许赋值给指向常量的普通指针引用。抛开语法不谈,为什么C++会这么设计?或许从某种意义上,指针的赋值更像是一种权限的赋予, 我不允许你修改我所保护的永恒(常量指针),也不允许你改变永恒的我(指针常量)

auto的逻辑

其实我们可以在auto的性质上管中窥豹。

const int a_ = 10;
auto a_1 = a_; // type of a_1: int
auto& a_2 = a_;// type of a_2: const int& 

C++ 想尽办法做到只读权限的保护,当然包括类型自动推导。在第一个auto中,a_传递的只是自己的值,a_1怎么变,a_都管不着: 你再怎么改也改不到我身上啊!

但是第二个auto就得提防了,a_传递的不仅是值了,它把自己的地址也交出去了,a_2 现在改就是改自己身上了,那可不行,只读权限不就被破坏了吗?于是a_2 就变成了const int&

对于指针也是一样的,毕竟指针也是一种特殊的基本类型嘛。

   const int* const b = a;
   auto c = b; // type of c: const int*
   auto& d = b; //type of d:const int * const&

一样的道理,第一个auto,b只是值传递,c指向别的地方了,b本身还是不会变,不会破坏对于自身的只读权限,但是我指向的对象的只读权限我得想办法约束你, 所以就成了const int*; 第二种情况,变引用了,所以他就想办法让别人不会破坏对于自身的只读权限,遂有了* const

小结

如果把const理解成权限,就会明白c++允许一定的权限限制甚至提高权限限制,但是永远不允许降低权限性质。 比如:

    int a = 20;
    int*b = &a;
    // 权限提高
    const int*c = b;

可以这么理解,没有权限就代表自由,当然你也有提高权限的自由