C++中只读函数以及mutable关键字的使用

在我之前写的一篇博客https://www.cnblogs.com/wphl-27/p/17395066.html  (C++中类成员函数参数前const,返回值前加const 以及 函数声明后面加const作用及区别

中说明了在C++中, 在函数后面加上const修饰符的,是只读函数, 比如如下面的函数:

void TestClass::Output() const
{
     cout << "Output for test!" <<end1;
}

 上面TestClass类中的这个Output函数,我们在函数名Output()后面加上关键字const,来表明它是一个只读函数

之前的那篇博客中,我们提到: 我们把类的一个成员函数设置为只读函数, 这意味着,这个成员函数它不会去改变这个类的实例化后的对象的状态,也就是说类的只读成员函数(有时,也叫 “”常成员函数“”),它不会改变对象的内部状态

那么,什么是类实例化后的对象的内部状态呢 => 说的直白点,它就是指对象的成员变量,只读成员函数不能修改对象的内部状态,也就是不能修改这个对象的成员变量. 举个例子:

class TestClass
{
    public:
        TestClass();
        ~TestClass();

       void Output() const;
       

     private:
        int m_iTimes;

   
}

void TestClass::Output() const
{
     cout << "Output for test!" <<end1;
     m_iTimes++;  //这里会报错,
}

上面代码中, m_iTimes是类TestClass的成员变量, 而Output函数时一个只读成员函数,它里面不能改变对象的内部状态,也就是不能改变对象的成员变量的值,所以,在它里面去改变m_iTimes的值是不对的,会报错。

 

但是,在实际的项目开发中,我们有时候需要定义一个类的成员函数为只读成员函数, 但是在这个只读成员函数里面,需要去修改一些和类(对象)状态无关的数据成员, 也就是说我们要在一个只读成员函数里面,去修改这个类的某个成员变量(按道理来讲是不能修改),我们认为这个成员变量和对象状态无关(只读成员函数不能修改对象状态(对象的成员变量),但是又要能够修改这个成员变量, 所以我们必须设置这个成员变量,让它不属于对象的内部状态), 那么怎么来表示这个类的成员变量,不属于对象的内部状态呢 => 这个时候,需要使用关键字mutable来修饰这个成员变量

mutable =>  字面意思就是"可变的",顾名思义, 就是说它修饰的成员变量,是可变的, 即使是在只读成员函数中,也可以修改它的值 => 我们认为用它来修饰的成员变量,不属于对象的内部状态

所以类的只读成员函数 => 不能修改对象的内部状态,也就是对象的成员变量  => 不能修改对象的内部状态,但是可以修改mutable修饰的成员变量,因为mutable修饰的成员变量不属于对象的内部状态

看下面的例子:

 

class TestClass
{
    public:
        TestClass();
        ~TestClass();

       void Output() const;
       

     private:
        int m_iTimes;
        mutable int m_na;

   
}

void TestClass::Output() const
{
     cout << "Output for test!" <<end1;
     m_iTimes++;  //这里会报错,
     m_na++;  //这个是可以的,这里不会报错
}

 

posted on 2023-07-17 16:11  新西兰程序员  阅读(154)  评论(0编辑  收藏  举报