mutable

本文探讨了C++中mutable关键字的独特用法,特别是在与const成员函数配合时,如何允许在不破坏const特性的情况下修改对象状态。通过实例,展示了mutable如何使const成员函数能够修改特定的成员变量,同时保持函数调用的const性质不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  mutable只能用于修饰类的非静态数据成员。对于使用使用mutable修饰的成员变量,const成员函数可以调用它,并改变它的值。如果缺少mutable,那么就无法编译通过。

  mutable具有欺骗性,使用它可以使const的成员函数悄悄的改变的类的成员函数,而无须使用const_cast来转换this指针。

class X{ 
public: 
  void foo() const 
  { 
     if (!changed_){ 
       changed_ = true; 
     } 
     // do something 
  } 
private: 
  mutable bool changed_; 
};

//--------------------------------------------------

另外一个例子:
class String{
public:
      String(char* pstring):pstring_(pstring)
      {
      }
      char& operator[](int index)const
      {
            ...
            return pstring_[index];
      } 
private:
      char* pstring_; 
};

main中的代码:
const String str("any man of mine!");
char& c=str[0]; //call const-function
c='B'; //modified 'pstring_ ' from outer

这些代码将会通过编译,虽然会出现运行时错误。

转载于:https://www.cnblogs.com/RoyCNNK/articles/3351416.html

### Qt 中 `mutable` 关键字的用法与含义 在 C++ 编程语言中,`mutable` 是一个修饰符,用于指定类中的某些成员变量可以在常量方法(即被标记为 `const` 的方法)内部修改其值。尽管这些方法本身声明为不可改变对象的状态,但通过使用 `mutable` 修饰的成员变量可以绕过这一限制。 #### 基本概念 当一个类的方法被定义为 `const` 方法时,该方法承诺不会更改任何属于这个类的数据成员。然而,在实际开发过程中,可能会遇到一些特殊情况,比如需要缓存计算结果或者记录访问次数等操作,而这些行为并不影响对象逻辑上的状态一致性。此时就可以利用 `mutable` 关键字来实现这种需求[^1]。 #### 使用场景举例 下面是一个简单的例子展示了如何在 Qt 或其他基于 C++ 的项目里运用 `mutable`: ```cpp #include <QObject> #include <QDebug> class MyClass : public QObject { Q_OBJECT public: explicit MyClass(QObject *parent = nullptr) : QObject(parent), m_count(0) {} void doSomething() const { qDebug() << "Doing something..."; ++m_count; // Normally, modifying a member variable inside a const method would cause an error. // But since 'm_count' is declared as mutable, it can be modified here without issues. } int getCount() const { return m_count; } private: mutable int m_count; }; ``` 在这个示例中,即使 `doSomething()` 函数是作为一个 `const` 成员函数存在的,它依然能够更新由 `mutable` 所限定的整型数据成员 `m_count` 的数值。这表明虽然从外部看来此实例保持不变态,但实际上我们允许特定部分发生有限度的变化以便于优化性能或其他目的。 需要注意的是,滥用 `mutable` 可能会破坏程序设计初衷——使得原本应该只读的对象变得可写入,从而引发潜在风险或混淆开发者意图。因此应当谨慎考虑何时以及为何要采用这种方式编程[^2]。 #### 总结 综上所述,`mutable` 提供了一种机制让程序员能够在遵循面向对象原则的同时灵活处理那些真正意义上的副作用问题;但在具体实践中应权衡利弊合理应用以免造成不必要的复杂性和隐患。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值