美文网首页
mutable关键字

mutable关键字

作者: YuWenHaiBo | 来源:发表于2017-08-22 08:41 被阅读28次

mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。

在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

下面是一个小例子:

class ClxTest
{
 public:
  void Output() const;
};

void ClxTest::Output() const
{
 cout << "Output for test!" << endl;
}

void OutputTest(const ClxTest& lx)
{
 lx.Output();
}

类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。

函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。

如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。

下面是修改过的代码:

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

  void Output() const;
  int GetOutputTimes() const;

 private:
  mutable int m_iTimes;
};

ClxTest::ClxTest()
{
 m_iTimes = 0;
}

ClxTest::~ClxTest()
{}

void ClxTest::Output() const
{
 cout << "Output for test!" << endl;
 m_iTimes++;
}

int ClxTest::GetOutputTimes() const
{
 return m_iTimes;
}

void OutputTest(const ClxTest& lx)
{
 cout << lx.GetOutputTimes() << endl;
 lx.Output();
 cout << lx.GetOutputTimes() << endl;
}

计数器m_iTimes被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。

总结下,成员函数被申明为const是为了防止修改成员变量,OutputTest函数传入const变量是防止修改成员变量(这里可以这么理解const 传入的是一个实例这个实例是不能改变的,因为是const类型,所以里面的成员变量就不能改变了),如果想改变其中的某一个变量,就是走后门,所以定义了mutable关键字。凡是这个类型的关键字,const修饰就对其无效了。

相关文章

  • mutable关键字

    mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,...

  • C/C++关键字介绍

    一、 typedef typedef为C/C++的关键字,与auto、extern、mutable、static、...

  • C++ 11 新特性(三)

    Lamabda 表达式的语法中有时候会出现 mutable 这个关键字,那么这个关键字有什么讲究吗? 其实昨天的文...

  • 关键字const(3)--mutable关键字

    成员函数后面加const表示在该函数中不能对类的数据成员进行改变,比如: 当然有特殊情况,就是用mutable关键...

  • Objective-c内存管理-笔记

    内存管理 内存管理原则 自己生成的对象自己持有alloc、new、copy、mutable以及符合以这些关键字为前...

  • 2019-06-10

    实现类 DeltaPackedLongValuesPackedInts.Mutable mutable = Pa...

  • c++ supplement之可变数据成员

    之前没有接触到这个概念,其主要是要用到mutable关键字对变量进行修饰。即使该变量实在const函数中使用,其也...

  • mutable

    1,理解 mutable字面意思是可变的,其实直接定义的local variable都是可变的,所以mutable...

  • Python - mutable immutable

    因为python 的数据类型分为两种:mutable(可变的) 与 immutable(不可变的)mutable ...

  • python程序员需要掌握的单词——持续更新

    accumulate 积累 mutable...

网友评论

      本文标题:mutable关键字

      本文链接:https://www.haomeiwen.com/subject/hkykdxtx.html