C++的顶层底层const
顶层const表示指针本身是个常量,底层const表示指针所指的对象是常量。其比较绕的地方是顶层const和底层const之间的拷贝(赋值)关系
1 void testConst2() { 2 3 int i = 0; 4 int* const p1 = &i; //顶层const 5 const int ci = 42; //顶层const 6 const int* p2 = &ci; //底层const 7 const int* const p3 = p2; //底层const且也是顶层const 8 const int& r = ci; //底层const 9 10 int* p; 11 p = p1; //顶层const一般可进行拷贝操作 12 //p = p3; 底层const在进行拷贝操作时会有限制,此处错误 13 //p = p2; 非常量可以转换成常量,但反之不行,此处错误 14 p2 = p3; //把p3当做底层const,才可进行底层const给底层const的拷贝 15 16 }
底层const不能拷贝给顶层const,因为顶层const本身不能修改。
顶层const拷贝给底层const时,一般没有问题
还有一种就是底层const拷贝给底层const,当然了顶层const不能拷贝给顶层const
在12行的代码中,p3作为顶层const拷贝给p没有任何问题,但p指向的是非常量整型,那么可以通过*p来修改p指针所指向地址中的内容,此时p指针的地址和p3指针的地址相同,p3也是底层const,不允许修改其指向地址中的内容,就会发生冲突,所以编译器会直接报错