C++ mutable关键字

对于一个类而言,类的成员发生变化,并不意味着这个类在语义上发生变化。比如:

class Website
{
public:
    void readPage() const
    {
        // show this page
        ++visitorNum;             // 改变访问者数量,并不意味着这个网站发生了变化
    }
private:
    mutable int visitorNum;
};

mutable的出现将const从意义上分成两种层面

  1. 二进制层面:绝对的常量,任何状态下都不可以修改
  2. 逻辑层面:从外部观察是常量不可修改,但是内部却可以有非常量的状态

mutable的两种使用场景

  1. 类的const成员函数
    如上述代码,在类Website中,readPage()理论上不应该修改Website,但是实际上在里面却做了++visitorNum的操作。监视访问者数量,从逻辑上并没有修改这个网站。
  2. lambda表达式
    在lambda表达式中,按值捕获的变量不允许被修改,但是使用mutable可以打破这种限制,如下代码所示。
int x = 0;
auto f1 = [x]() mutable { x = 10; };  // right
auto f2 = [x]() { x = 10; };  // error, 按值捕获的外部变量值不能被修改

在lambda表达式中对x的修改,不会影响到外部变量x,即外部的x始终为0。

reference: https://liam.page/2017/05/25/the-mutable-keyword-in-Cxx/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值