zoukankan      html  css  js  c++  java
  • 关键字mutable

    1.突破 const 的限制

    class Test {
    public:
        Test() = default;
        Test(unsigned int times):times(times){
        }
        ~Test() = default;
        void printOut() const {
            cout << "out" << endl;
            times++; // 编译报错,const成员函数不能修改成员数据变量
        }
    private:
        unsigned int times; // 用来记录输出操作一共被执行了多少次
    };

    mutable关键字可以突破const的限制。被mutable修饰的成员变量永远处于可变的状态,即使在const成员函数中也是。

    但是有时候我们需要在const修改与类状态无关的数据成员,那么此时应该用mutable修饰。

    class Test {
    public:
        Test() = default;
        Test(unsigned int times):times(times){
    
        }
        ~Test() = default;
        void printOut() const {
            cout << "out" << endl;
            times++; // 编译通过,此时const成员函数也可以修改类数据成员
        }
    private:
        mutable unsigned int times; // 这里加入关键字mutable
    };

    2.可变lambda

    默认情况下,对于一个值被拷贝的lambda表达式,是不会改变其捕获的值的。如果我们需要改变一个被捕获变量的值,就必须在参数列表首加mutable,因此可变lambda能省略参数列表。

    void fun3()
    {
        int sz = 4;
        auto f = [sz]() {return --sz; };  //编译错误: 不可以改变值捕获的变量 
        f();
    }
    void fun3()
    {
        int sz = 4;
        auto f = [sz]() mutable {return --sz; };  // 参数列表首加了mutable,则可以改变值捕获的变量 
        f();
    }
  • 相关阅读:
    [刷题] IDA*
    [BZOJ1330] Editing a Book
    [BZOJ5449] 序列
    [刷题] 搜索剪枝技巧
    [XJOI3529] 左右
    [CF920E] Connected Components?
    [第18届 科大讯飞杯 J] 能到达吗
    洛谷 P4779 【模板】单源最短路径(标准版)
    洛谷 P1175 表达式的转换
    pipioj 1291 中缀表达式转后缀表达式I
  • 原文地址:https://www.cnblogs.com/qiang-wei/p/12332828.html
Copyright © 2011-2022 走看看