首先介绍一下什么是Logic Constness和Bitwise Constness,Logic Constness指的是function 后的const修饰,我们只知道这个function被const修饰了,但是并没有任何变量被const,Bitwise Constness指的是变量(指针,或者引用等,基本上任何的二进制储存值)被const修饰,那么我们下面就用例子来进行探索。
#include<iostream> #include<vector> #include<string> using namespace std; class BigArray{ vector<int> v; int accessCounter; int *v2; public: int getItem(int index) const{ //accessCounter++; const_cast<BigArray*>(this)->accessCounter++; return v[index]; } void setV2Item(int index, int x){ *(v2+index) = x; } // Quiz: const int* const fun(const int* const& p) const{ //return accessCounter++; } }; int main(){ BigArray b; }
首先我们看getItem函数,因为这个函数不对对象的数据进行任何修改,所以我们将其修饰为const,一开始我们注释掉前两句,只有return v[index]; 发现程序编译通过,因为没有任何修改实例变量的操作,但是如果我们注释掉第一行,也就是accessCounter++; 我们就会发现,程序编译报错了,报错的原因就是getItem是Logic Const的函数,所以里面不能够对变量进行修改,因为这样就是打破了Bitwise Constness,但是是不是我们就不能对accessCounter进行修改呢?其实并不是,大致有两种方法可以对其进行修改:
再解答一下Quiz的一长串const修饰到底意味着什么:
Advanced C++ -- Logic Constness and Bitwise Constness
原文:http://www.cnblogs.com/RookieCoder/p/5088895.html