有时候,我们需要在const函数中修改一些变量,比如类的共享标记、共享计数器,如下代码:
class Entity
{
private:
int referenceCounter;
public:
void ref() { referenceCounter++; }
...
};
我们可能会在很多函数中调用Entity::ref()来对这个类增加引用,因为这个函数是如此基础,导致可能有一些被const修饰的函数也可能调用这个方法,那么,我们往往需要将ref()也加上const修饰以方便调用。如下:
public:
void ref() const { ... }
这时我们就会面临一个情况,如何在这个const的函数中修改值?
一种众所周知的方法是:
(Entity *this)->referenceCounter++;
另外,还有一个比较罕见的用法,那就是修改referenceCounter的定义,通过mutable进行修饰:
class Entity
{
private:
mutable int referenceCounter;
public:
void ref() const { referenceCounter++; }
...
};
mutable的含义在这里表示这个变量可以在const中被修改,它overwrite了const修饰。
不可否认,这是C++一个继const之后的又一恶心发明,用一个恶心解决另一个恶心。
mutable修饰的变量,不仅可以在const函数中修改,也可以在无视const类的约速,如下代码是可以运行的:
const Entity e;
e.reference = 1;
我在半年前知道了mutable这个用法,但是当我这两天需要再用这个属性时,我忘记了。
没有评论:
发表评论