顶层Const和底层Const
顶层 const 和底层 const
从 const 指针开始说起。const int* pInt; 和 int *const pInt = &someInt;,前者是 *pInt 不能改变,而后者是 pInt 不能改变。因此指针本身是不是常量和指针所指向的对象是不是常量就是两个互相独立的问题。用顶层表示指针本身是个常量,底层表示指针所指向的对象是个常量。
拷贝与顶层和底层 const
1 | int i = 0; |
相关问题:
为什么不能在一个常量对象中调用非常成员函数?
因为在默认情况下,this的类型是指向类的非常量版本的常量指针(意思是this的值不能改变,永远指向那个对象,即“常量指针”,但是被this指向的对象本身是可以改变的,因为是非常量版本,这里this相当于是顶层const),而this尽管是隐式的,它仍然需要遵循初始化规则,普通成员函数的隐式参数之一是一个底层非const指针,在默认情况下我们无法把一个底层const的this指针转化为非const的this指针,因此我们不能在常量对象上调用普通的成员函数。因此在上例中,形参列表后的const就意味着默认this指针应该是一个底层const, 类型是 const ClassName&。而非常对象却可以调用常成员函数,因为底层非const可以默认转化为底层const。