C++进阶--逻辑常数和比特位常数(Logical constness vs Bitwise constness)

对于什么是const函数,有两种理解

  • Logical constness

实际的数据没有没修改,如下面程序中的vector v

  • Bitwise constness

类的成员变量没有被修改,包括int accessCounter

我们的编程模型是logical constness,而编译器是bitwise constness,两者之间可能存在冲突。

  • 解决办法
    • mutable / const_cast
    • 移除成员函数的const
class BigArray {
   vector<int> v; // 保存实际数据的vector
   mutable int accessCounter;  // mutable关键字,在const函数中也可以修改该值
   
   int* v2; // 另一个int array数组,

public:
   int getItem(int index) const {
      //accessCounter++;
      const_cast<BigArray*>(this)->accessCounter++;  //冲突1:没有修改实际数据,但是const函数中无法修改该值。解决方法:使用mutable或const_cast
      return v[index];
   }
   
    void setV2Item(int index, int x)  const{    //冲突2:修改了指针所指的数据,但是编译器仍然认为是const函数。解决方法:移除const
      *(v2+index) = x;
   }
    
   // 测验: 以下函数定义表示什么意思?
   const int*const fun(const int*const& p)const;
 };

 int main(){
    BigArray b;
 }
原文地址:https://www.cnblogs.com/logchen/p/10164972.html