【问题标题】:Why is Mutable keyword used [duplicate]为什么使用可变关键字[重复]
【发布时间】:2012-08-20 19:09:30
【问题描述】:

可能重复:
C++ 'mutable' keyword

class student {

   mutable int rno;

   public:
     student(int r) {
         rno = r;
     }
     void getdata() const {
         rno = 90;
     } 
}; 

【问题讨论】:

    标签: c++


    【解决方案1】:

    它允许您通过 student 成员函数向 rno 成员写入(即“变异”),即使与 student 类型的 const 对象一起使用也是如此。

    class A {
       mutable int x;
       int y;
    
       public:
         void f1() {
           // "this" has type `A*`
           x = 1; // okay
           y = 1; // okay
         }
         void f2() const {
           // "this" has type `A const*`
           x = 1; // okay
           y = 1; // illegal, because f2 is const
         }
    };
    

    【讨论】:

    • 是否存在任何 const 成员函数使成员变量只读?
    • @IvinPoloSony:是也不是。就在具有 const 限定符的成员函数内部。让我编辑我的答案...
    • 因此,要更新成员变量的 const 函数,它必须是可变的,对吧?普通的成员函数无论如何都可以编辑成员变量。
    • @IvinPoloSony:没错。但是,请注意,这非常脏。使用 mutable 通常是您做错了什么的指标。并非总是如此(有合法的用例),但经常如此。
    【解决方案2】:

    使用mutable 关键字以便const 对象可以更改自身的字段。仅在您的示例中,如果您要删除 mutable 限定符,那么您将在

    行中收到编译器错误
    rno = 90;
    

    因为声明为const 的对象不能(默认)修改它的实例变量。

    除了mutable 之外,唯一的其他解决方法是对this 进行const_cast,这确实很hacky。

    在处理std::maps 时也派上用场,如果它们是 const,则无法使用 indexing 运算符 [] 访问。

    【讨论】:

      【解决方案3】:

      在你的特殊情况下,它被用来撒谎和欺骗。

      student s(10);
      

      你想要数据?当然,只需致电getdata()

      s.getdata();
      

      你以为你会得到数据,但我实际上将 s.rno 更改为 90。哈!而你认为这是安全的,getdataconst 等等......

      【讨论】:

      • 我不确定这种风格的帖子(修辞幽默)是否最适合 SO。我可以理解元数据,但这似乎对 OP 几乎是侮辱。因此,我对您的帖子投了反对票。
      • @RichardJ.RossIII 好吧,我当然明白你的意思,但问题是Why is Mutable keyword used,而不是what does mutable mean...
      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2019-12-07
      • 2012-12-09
      • 2011-05-25
      • 2011-11-26
      相关资源
      最近更新 更多