跳到主要内容

简述什么是C++的mutable ?

参考答案:

在C++中,mutable是一个关键字,用于修改一个类的const成员变量的值。当一个类的成员函数被声明为const时,它不能修改类的任何非静态成员变量,这是为了保证在调用该函数时,对象的状态不会发生变化。但是,有时候我们可能需要在const成员函数中修改某个成员变量的值,这时就可以使用Mutable关键字。

一个被Mutable修饰的成员变量可以在const成员函数中被修改,但在其他非const成员函数中,它仍然可以被修改。这是因为Mutable只影响const成员函数的行为,不影响其他成员函数的行为。

下面是一个简单的例子来说明Mutable的用法:

class MyClass {
private:
    mutable int mutableVar;
    int NonMutableVar;

public:
    MyClass() : MutableVar(0), NonMutableVar(0) {}

    void SetMutableVar(int value) const {
        MutableVar = value;  // 可以在const成员函数中修改MutableVar的值
    }

    void SetNonMutableVar(int value) {
        NonMutableVar = value;  // 可以在非const成员函数中修改NonMutableVar的值
    }

    int GetMutableVar() const {
        return MutableVar;
    }

    int GetNonMutableVar() const {
        return NonMutableVar;
    }
};

int main() {
    const MyClass obj;
    obj.SetMutableVar(10);  // 可以调用const成员函数修改MutableVar的值
    // obj.SetNonMutableVar(20);  // 编译错误,不能在const对象上调用非const成员函数
    return 0;
}

在这个例子中,MyClass类有两个成员变量MutableVarNonMutableVar,其中MutableVarMutable修饰。SetMutableVar是一个const成员函数,用于设置MutableVar的值,而SetNonMutableVar是一个非const成员函数,用于设置NonMutableVar的值。在main函数中,我们创建了一个const对象obj,并调用了SetMutableVar函数来修改MutableVar的值,这是合法的。但是,如果我们尝试调用SetNonMutableVar函数来修改NonMutableVar的值,就会导致编译错误,因为不能在const对象上调用非const成员函数。