首页 > 其他 > 详细

mutable关键字理解

时间:2021-03-27 09:08:26      阅读:24      评论:0      收藏:0      [点我收藏+]

原链接:https://blog.csdn.net/zhaoxd200808501/article/details/78622547

mutable关键字

mutable

  • mutable的中文译为 “可变的,易变的”,是constant(即C++中的const)的反义词。

  • C++中为了突破 const 的限制而采用的,被 mutable 修饰的变量将永远处于可变的状态。

为什么要用mutable?

  • 如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。
  • mutable 常用于指定不影响类的外部可观察状态的成员(通常用于互斥体[mutexes]、记忆缓存[memo caches]、惰性求值[lazy evaluation]和访问指令[access instrumentation]等)。

使用mutable的注意事项:

  • mutable只能作用于类的非静态和非常量数据成员。mutable不能修饰static数据成员,因为static数据成员存储在Data段或BSS段,属于类,不属于类对象,因此类的static数据成员不需要 mutable 的修饰。但常对象和常函数可以对其任意地修改,对于常对象的数据成员一般不可以被修改,若想修改,则需要 mutable 的修饰。

  • 在一个类中,应尽量或者不用 mutable,大量使用 mutable表示程序设计存在缺陷。

    例子如下:Test类中有一个输出函数,不会修改类的状态,所以被声明为const的。 如果现在,我们要增添一个功能:统计每个对象调用输出函数Output()的次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。计数器m_cnt 被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。

#include <iostream>
using namespace std;
class Test
{
private:
    mutable int m_cnt;
public:
    Test()
    {
        m_cnt = 0;
    }
    void Output() const
    {
        cout << "Output for test!" << endl;
        m_cnt++;
    }
    int getCnt() const
    {
        return m_cnt;
    }
};
int main()
{
    Test test;
    test.Output();
    cout << "cnt:" << test.getCnt() << endl;
    return 0;
}

mutable关键字理解

原文:https://www.cnblogs.com/jemmyzhong/p/14584725.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!