📜  如何使用 const 函数中的非 const 函数 - C++ (1)

📅  最后修改于: 2023-12-03 15:23:49.960000             🧑  作者: Mango

如何使用 const 函数中的非 const 函数 - C++

在C++中,我们可以在函数声明中加上 const 关键字,以表示该函数是一个只读函数,代表该函数不会修改对象的状态。但是,在某些情况下,我们需要在一个 const 函数中调用一个非 const 函数,那么该怎么办呢?

我们可以使用 mutable 关键字来解决这个问题。mutable 关键字可以用来修饰类的成员变量,在 const 函数中,被 mutable 修饰的成员变量可以被修改,而其他成员变量则不能被修改。

下面是一个示例代码:

#include <iostream>
using namespace std;

class MyClass {
public:
    void setValue(int val) {
        m_value = val;
    }
    
    void printValue() const {
        cout << "m_value = " << m_value << endl;
        // setValue(100);  // 错误:不能在 const 函数中调用非 const 函数
        // m_otherValue = 200;  // 错误:不能在 const 函数中修改非 mutable 成员变量
        m_mutableValue = 300;  // 正确:可以在 const 函数中修改 mutable 成员变量
        cout << "m_mutableValue = " << m_mutableValue << endl;
    }
    
private:
    int m_value;
    int m_otherValue;
    mutable int m_mutableValue;
};

int main() {
    MyClass obj;
    obj.setValue(50);
    obj.printValue();
    return 0;
}

在上面的示例代码中,我们在 MyClass 类中定义了三个成员变量:m_valuem_otherValuem_mutableValue,其中 m_valuem_otherValue 没有被 mutable 修饰,而 m_mutableValuemutable 修饰。

我们定义了两个成员函数 setValueprintValue,其中 setValue 函数用于设置对象的 m_value 值,而 printValue 函数用于打印对象的 m_valuem_mutableValue 值,该函数被 const 修饰。

printValue 函数中,我们尝试调用了 setValue 函数和修改了 m_mutableValue 成员变量的值,发现第一个尝试调用 setValue 函数时编译器报错了,提示不能在 const 函数中调用非 const 函数;而第二个尝试修改 m_mutableValue 成员变量的值成功了,因为 m_mutableValue 成员变量是被 mutable 修饰的,可以在 const 函数中被修改。

总结:我们可以在 const 函数中使用 mutable 关键字修饰的成员变量,来解决在 const 函数中调用非 const 函数的问题。