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   新西兰程序员  阅读(181)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2018-07-17 ASP.NET MVC中的ActionFilter介绍学习
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示