zoukankan      html  css  js  c++  java
  • 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;
     }
    
  • 相关阅读:
    关于位运算(转)
    计蒜客第三场
    数组与指针
    计蒜客第二场
    指针概念
    爬楼梯(动态规划)
    线性表基本操作的实现(合并)
    4123=喵帕斯之天才少女
    3889=神奇的函数
    1586=计算组合数
  • 原文地址:https://www.cnblogs.com/logchen/p/10164972.html
Copyright © 2011-2022 走看看