2008年1月12日星期六

如何修改const类中的变量(或在const函数中修改变量)

有时候,我们需要在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这个用法,但是当我这两天需要再用这个属性时,我忘记了。

没有评论:

发表评论