对于什么是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;
 }

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-12-07
  • 2021-06-03
  • 2021-12-02
  • 2022-12-23
  • 2021-10-04
  • 2021-08-14
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-08-23
  • 2021-08-14
  • 2021-10-08
  • 2021-08-26
  • 2022-12-23
相关资源
相似解决方案