`

深入理解C++中的mutable关键字

    博客分类:
  • C++
阅读更多
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修饰的函数里面也能被修改。
分享到:
评论

相关推荐

    深入解析C++中的mutable关键字

    在C++编程语言中,`mutable`关键字是一个特殊的关键字,它的主要作用是允许在const成员函数中修改对象的某些特定成员变量。这在某些情况下非常有用,因为const成员函数通常承诺不改变对象的状态,但有时我们需要在...

    浅谈C++中的mutable和volatile关键字

    总的来说,`mutable`和`volatile`都是C++中用于特定目的的关键字。`mutable`是为了在const上下文中修改对象的非关键状态,而`volatile`则确保了对可能由外部因素改变的变量的正确访问。理解并恰当使用这两个关键字...

    深入理解C++中常见的关键字含义

    const:定义常成员,包括const数据成员和const成员函数,const数据成员必须,也只能通过构造函数的初始化列表进行初始化,const成员函数只能访问类的成员,不能进行修改,如果需要修改,则引入下面的mutable关键字。...

    c++关键字mutable深入解析

    在C++编程语言中,`mutable`是一个特殊的关键字,它的主要作用是允许在const成员函数内部修改对象的成员变量。通常,const成员函数承诺不修改对象的状态,但`mutable`关键字提供了一种机制,使得程序员可以在保持...

    C++11新特性.pdf

    * mutable:用来说明是否可以修改捕获的外部变量,mutable关键字为一个修饰符,在默认情况下,lambda函数总是返回一个const,而当我们在形参列表后面加了mutable关键字后,则可以取消这种默认常量设置,当以传值方式...

    C++中mutable与volatile的深入理解

    C++中修饰数据可变的关键字有三个:const、volatile和mutable。const比较好理解,表示其修饰的内容不可改变(至少编译期不可改变),而volatile和mutable恰好相反,指示数据总是可变的。mutable和volatile均可以和...

    深入分析C++中几个最不常用的关键字

    在C++编程语言中,有几个不常用但重要的关键字,本文将深入探讨其中的`mutable`和`volatile`关键字。 首先,`mutable`关键字用于类的非静态数据成员,它的主要作用是在const成员函数中允许修改对象的状态。通常,当...

    多个关键字标准C++应用程序

    标题中的“多个关键字标准C++应用程序”意味着我们要讨论的是使用C++编程语言开发的应用程序,这些应用程序可能涉及了C++中的多个关键特性。C++是一种强类型、静态类型的编程语言,它提供了丰富的语法结构和高级编程...

    c++关键字解释

    在深入探讨C++的关键字之前,我们先简要回顾一下C++作为一种静态类型的、通用的...以上是C++中部分关键字的详细解析,这些关键字是构建复杂和高效程序的基础,理解和熟练运用它们对于成为一名优秀的C++程序员至关重要。

    More-Effective-CPP_cn.zip_模板类

    3. **mutable关键字**:在C++中,类的成员变量默认为const,一旦声明为const,在类的非静态成员函数中就不能修改。但是,有时候我们希望在不改变对象状态的情况下改变某些内部辅助数据,这时候就可以使用mutable...

    Effective C++中文第三版清晰.zip

    9. **成员函数**:了解静态成员函数与非静态成员函数的区别,以及const成员函数和mutable关键字的应用。 10. **命名空间**:命名空间用于避免名字冲突,合理使用std命名空间,以及使用using声明和using指令。 11. ...

    C++ 程序员学习过程

    - 理解 C++ 中的关键特性,包括友元(friend)、虚函数(virtual)/运行时类型识别(RTTI)、const 和 mutable 关键字、异常(exception)处理以及模板(template)。 2. **阅读《C++ Primer》**: - 这本书适合初学者,...

    关于const在C++中的用法

    关于`const`在C++中的用法,是一个深入理解C++编程语言的关键点。`const`关键字在C++中主要用于声明常量或者指定某个变量、指针或成员函数的某些特性不可修改,它增强了代码的安全性和可读性,同时也提高了程序的...

    C++复习大全资料

    ### C++复习大全知识点解析 #### 一、C++概述与发展历史 C++是一种由Bjarne Stroustrup博士在1980年开始研发的面向对象的编程语言,旨在为C语言...对于学习和掌握C++的开发者来说,深入理解这些核心概念至关重要。

    Effective_C++3 学习笔记.pdf.rar

    3. **常量与引用**:笔记会阐述常量对象的使用规则,以及常量引用如何增强程序的安全性和可读性,同时讲解const成员函数和mutable关键字的用途。 4. **运算符重载**:C++允许用户为自定义类型重载运算符,笔记会...

    C++Primer分析学习

    9. mutable关键字: - `mutable`标记的数据成员可以在const成员函数中修改,提供了一种灵活的常量性控制。 10. this指针: - 在非const成员函数中,`this`指向当前对象的非const指针。 - 在const成员函数中,`...

    C++ const应用总结

    本文将深入探讨`const`在C++中的各种应用,帮助你更好地理解和运用这一关键概念。 1. 常量声明: `const`关键字用于声明常量变量,一旦赋值后,其值不能被改变。例如: ```cpp const int a = 5; // 声明一个整型...

Global site tag (gtag.js) - Google Analytics