首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

除了允许变量被const函数修改之外,'mutable'关键字是否有任何其他用途?

除了允许变量被const函数修改之外,mutable关键字没有任何其他用途。这是因为使用mutable关键字只允许你修改已经声明为可变的数据类型。

如果你声明了一个const mutable变量,它的类型就变成了一个mutable的,这是因为你可以修改它。例如:

代码语言:rust
复制
#[derive(Debug)]
struct MyStruct {
    value: i32,
}

impl MyStruct {
    fn value(&mut self) -> i32 {
        self.value += 1;
        self.value
    }
}

fn main() {
    let mut my_struct = MyStruct { value: 0 };
    my_struct.value(); // 输出:1
    println!("{:?}", my_struct); // 输出: { value: 1 }

    let const_mut_my_struct = MyStruct {
        value: 0,
    };
    const_mut_my_struct.value(); // 这里会编译错误,因为变量无法被const函数修改

    // 将const_mut_my_struct从const mutable类型解绑,变为普通const类型
    const_mut_my_struct = MyStruct::default();
    const_mut_my_struct.value(); // 这里输出:0

    // 使用变量my_struct和const_mut_my_struct,都将是可变的
    my_struct.value(); // 将输出:2
    const_mut_my_struct.value();
}

总之,mutable关键字只允许你修改已经声明为可变的数据类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

那些陌生的C++关键字

三、mutable Mutable的含义是可变的,它和const关键字是相对的。同样是修饰变量的声明,但是mutable的使用范围比const要小。...我们知道类的常成员函数在语义上是不允许修改类的成员变量的,但是有时候可能根据代码的需要并不是这么绝对。那么就可以使用mutable声明一个类的成员变量,它告诉编译器类的常成员函数可以修改这个变量。...四、volatile Volatile是易变的意思,编译器在编译时期可能不能获取变量是否多个线程或者进程修改的信息。这时候一个变量是否在两次“读操作”之间发生改变,编译器肯定无法确定。...如果在实际运行中a的值其他线程修改,这么做就改变了代码的语意。...显然,使用单独的变量初始化const引用的值不会产生额外的存储空间,通过修改原先的变量是可以修改常量引用的值的。 dynamic_cast一般出现在类到子类或兄弟类的转换,并要求基类函数

94770

C++复习笔记——C++ 关键字

const const(常量的,constant)所修饰的对象或变量不能改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何const函数。...(即.c文件)中,在 C 中 const声明一个变量除了不能改变其值外,它仍是一具变量。...除了 const 或 volatile 修饰之外, type_id和 expression 的类型是一样的。...在 C++ 类的成员变量声明为static(称为静态成员变量),意味着它被该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员...如果一个类的成员函数声明为 const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员。

1.3K30
  • 【专业技术】C++里面重要的几个关键字的用法

    如果一个类的成员函数声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用到mutable关键字了...,地址不会改变,所以地址声明移动到循环之外。...地址内容是volatile,所以每次循环之中它不断的重新检查。把一个const volatile变量作为参数传递给函数是合法的。...如此的声明意味着函数不能改变变量的值,但是变量的值却可以另一个线程在任何时间改变掉。...关键字起着至关重要的作用,如果没有这个关键字的话,这个构造函数能力将int转换成Array.一旦这种情况发生,你可以给Array支派一个整数值而不会引起任何的问题,比如: 1Array arr; 2

    82570

    C++11 Lambda 表达式

    ,默认是不可变的(immutable),如果需要在Lambda中进行修改的话,需要在形参列表后添加mutable关键字(按值传递无法改变Lambda外变量的值)。...因此,严格来说,lambda函数并非函数指针,但是C++11允许lambda表达式向函数指针转换,前提是没有捕捉任何变量函数指针所指向的函数必须跟lambda函数相同的调用方式。...函数修改按值捕获的变量val auto mutable_val_lambda = [=]() mutable { val = 3; }; auto const_ref_lambda...lambda函数是通过仿函数来实现的,捕捉到的变量相当于是仿函数类中的成员变量,而lambda函数相当于是成员函数const成员函数自然不能修改普通成员变量; (2)使用引用的方式捕获的变量在常量成员函数中值更改则不会导致错误...,其原因简单地说,由于const_ref_lambda 不会改变引用本身,而只会改变引用的值,所以编译通过; (3)使用mutable修饰的mutable_val_lambda,去除了const属性,

    1.9K41

    c++中explicit和mutable关键字探究

    1. explicit关键字 在写c++标准输入输出相关文章,查看iostream实现代码的时候,经常看到构造函数前面带有explicit关键字,那么它到底什么作用呢。...,这个时候没有使用explicit关键字,那么可以直接使用class Base base = 5;来给成员变量赋值,这也就算了,就当他是在构造了,但是到了base = 6这一行代码,就很离谱了,没有调用任何...set函数,直接就改变了私有成员的值,这就相当于,你自己房子里面放的钱,别人可以隔墙修改你的钱的数量,想想看,你10000块钱放家里,个人手指一点,钱变成100了,是不是很可怕。...总结:explicit告诉别人,不允许隔墙修改我家钱的数量,你要修改的话,必须进到屋子里才行。...2. mutable关键字 mutable用于类的非静态和非常量数据成员,一般类的成员函数声明为const,就表示不会修改类的数据成员,但如果要在常成员函数修改类的非静态和非常量数据成员,则可以使用

    26620

    C++编程经验(12):C++11新特性

    不能传递一个 const son* 变量给一个处理 son*类型变量函数 update(const_cast(&csw)); // 正确,csw 的 const 显示地转换掉 update...{statement}:函数体。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。...---- override、final final关键字的作用是使派生类不可覆盖它所修饰的虚函数。 override关键字的作用是使派生类制定的函数必须是覆盖它所修饰的虚函数。...如果对变量 i 加上 volatile 关键字修饰的话,它可以保证当 A 线程对变量 i 值做了变动之后,会立即刷回到主内存中,而其它线程读取到该变量的值也作废,强迫重新从主内存中读取该变量的值,这样在任何时刻...检查当前的线程对象是否表示了一个活动的执行线程,由默认构造函数创建的线程是不能 join 的。

    1K20

    Modern c++快速浅析

    函数体中与其所在的成员函数有着相同的protected,private访问权限•除了引用捕获外,其他各种捕获都会默认加上const修饰符,mutable关键字可以解决这个问题(如果匿名函数体中发生对按值捕获的变量修改...修饰[]() noexcept { /* 函数语句 */ }•当Lambda表达式没有捕获任何参数时,它可以转换成为一个函数指针•Lambda中可以直接使用静态变量以及全局变量,不存在捕获的行为。...T,即匿名函数体中只能调用到常函数,如果想调用其他成员函数,需要加mutable修饰(修改变量同理,需要使用mutable修饰) class MyClass { public: void member_func...,显式要求编译器生成对应版本的函数 override和final 若函数override修饰,那么编译器将会严格检查改函数各部分是否满足重写的要求。...该关键字用于减少程序员犯错 final代表终止继承链,若类或函数final修饰,那么子类将无法再继承或再重写 以上

    17910

    C++11 Lambda表达式

    ,默认是不可变的(immutable),如果需要在Lambda中进行修改的话,需要在形参列表后添加mutable关键字(按值传递无法改变Lambda外变量的值)。...因此,严格来说,lambda函数并非函数指针,但是C++11允许lambda表达式向函数指针转换,前提是没有捕捉任何变量函数指针所指向的函数必须跟lambda函数相同的调用方式。...函数修改按值捕获的变量val auto mutable_val_lambda = [=]() mutable { val = 3; }; auto const_ref_lambda...lambda函数是通过仿函数来实现的,捕捉到的变量相当于是仿函数类中的成员变量,而lambda函数相当于是成员函数const成员函数自然不能修改普通成员变量; (2)使用引用的方式捕获的变量在常量成员函数中值更改则不会导致错误...,其原因简单地说,由于const_ref_lambda 不会改变引用本身,而只会改变引用的值,所以编译通过; (3)使用mutable修饰的mutable_val_lambda,去除了const属性,

    1.2K31

    C++笔记——类(0)定义、访问控制、友元、default、mutable、构造函数

    定义格式、访问控制 C++里面定义类的关键词两个,一个是class,另一个是struct,他们基本没有区别,除了成员变量的默认属性。...当然,除了可以声明函数为友元,还可以声明类为友元,这里就不举例子了。 可变数据成员 有时候我们会希望能够修改类的某个用const修饰过的只读成员函数中的数据成员,例如,用来记录这个函数调用了多少次。...这时候就需要在变量的声明中加入mutable关键字。...,而不能够修改他们,除非成员函数前有mutable来修饰,这样即使是在只读成员函数中这个成员变量的值也可以修改。...}; 使用default关键字(注意,这是C++11的标准)就可以指定该构造函数为默认构造函数,不接受任何实参。

    48820

    【C++】const对象和const成员

    函数 这个规则也就是强制用户不要对const成员进行错误的修改 const成员 1.const数据成员 也就是变量,比如实例中的m_hour,m_minute是普通数据成员 在类内部使用const...关键字来声明const数据成员。...const常对象调用 CTime const time5; cout << time5.getNum() <<endl; 如果在const成员函数的定义中出现了任何修改对象成员数据的现象,都会在编译时检查出来...遇到这种问题,我们可以把一个成员数据定义为mutable(多变的),它表示这个成员变量可以const成员函数修改却不违法。...但需要注意的时,不要滥用mutabe描述符,如果在某个类中只有少数一部分是允许const常量函数修改的,使用mutable是再合适不过的。

    1.1K10

    C++变量的存储说明符和cv-限定符

    存储说明符 存储说明符下面这些: auto register static extern mutable auto修饰符的变量时自动变量,如果变量没有任何修饰符,默认就是自动变量,其作用域在函数内部。...要注意静态变量使用范围: int global = 1000;// 在函数外声明,文件内外皆可使用 // 此时如果其他文件还想创建global同名变量,要么用extern声明(此时用的还是同一个,共享了变量...(int n) { static int count = 0;// 在函数内用static声明,只能在函数内使用,但是无论函数是否执行,变量都存在,且多次调用时其值不会重新初始化,而是保持上一次的结果...// 但这又是允许的,因为结构体person的成员age用mutable修饰了 cv-限定符 cv限定符只有两种: const volatile 这也是为什么它叫cv限定符,取首字母嘛。...const关键字上文已经说过了,很常用,表示变量的内存初始化后,程序不能对它进行修改了。 volatile修饰的变量时告诉程序,即使程序代码本身没有对变量的内存单元进行修改,它却也可能发生变化。

    61010

    C++对象模型和this指针实例分析(一)

    this指针指向 调用的成员函数 所属的对象 this指针是隐含每一个非静态成员函数内的一种指针 this指针不需要定义,直接使用即可 this指针的用途: 1.解决名称冲突:当形参和成员变量同名时...0; } const修饰成员函数函数: 成员函数后加const后我们称为这个函数为常函数函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象: 声明对象前加...//const修饰成员函数,表示指针指向的内存空间的数据不能修改除了mutable修饰的变量 this->m_B = 100; } void MyFunc() const { //mA...= 10000; } public: int m_A; mutable int m_B; //可修改 可变的 }; //const修饰对象 常对象 void test01() { const...= 100; //但是常对象可以修改mutable修饰成员变量 //常对象访问成员函数 person.MyFunc(); //常对象不能调用普通成员函数,因为普通成员函数可以修改属性。

    27920

    lambda表达式的介绍

    lambda表达式我们可以向一个算法传递任何类别可调用对象,如果可以对其使用调用运算符(),则称它为可调用的。c++中可调用对象函数函数指针、重载函数调用运算符类、lambda表达式。...mutable:表示可变性,用于指定 lambda 表达式是否可以修改其捕获的变量。exception:表示异常规格说明。return-type:表示返回值类型。body:表示函数体。...然后定义了一个lambda表达式f,它通过捕获列表绑定了外部变量a、b和c的引用,其中变量c通过mutable关键字标记为可修改的。...在lambda表达式中,sum函数调用,并将其返回值存储在变量ret中。最后,将ret、a、b和c的值打印到标准输出流中。由于在sum函数中,a、b和c是作为引用参数传递的,因此它们的值也修改了。...此外,由于c在捕获列表中被标记为可修改的,因此它的值也修改为13,因为在sum函数中,它的值设置为10。

    13800

    【C++】const关键字

    【C++】const关键字 0x1 常量 C++定义常量两种方式 #define 宏常量:#define 常量名 常量值 通常在文件上方定义,表示一个常量 宏常量不可以修改 // 宏常量 #define...MAX 999 int main() { return 0; } const修饰的变量const 数据类型 常量名 = 常量值 通常在变量定义前加关键字const,修饰该变量为常量,不可修改...0x5 const修饰成员函数 0x51 常函数 成员函数后加const后我们称为这个函数为常函数函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 // /...= 100; // 正确,因为加上了mutable关键字 } public: int m_A; mutable int m_B; // 加上mutable关键字之后成为特殊变量...} void func() { } public: int m_A; mutable int m_B; // 加上mutable关键字之后成为特殊变量,即使在常函数

    45330

    typedef用法

    typedef double REAL;  在连 double 都不支持的平台三上,改为: typedef float REAL;  也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改...标准函数 strcmp()两个‘const char *’类型的参数。...例如:typedef int (*PF) (const char *, const char *);这个声明引入了 PF 类型作为函数指针的同义字,该函数两个 const char * 类型的参数以及一个...问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其它存储类关键字)。...看起来会是下面这样:typedef double REAL; 并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样: 、typedef float REAL; 你不用对源代码做任何修改

    89440

    《C++Primer》第七章 类

    需要注意的是this是一个常量指针,我们不允许改变this中保存的地址。 const成员函数:上面isbn函数在参数列表之后有一个const关键字,这里const的作用是修改隐式this指针的类型。...原因三个: 只有在类没有声明任何构造函数时,编译器才会自动地生成默认构造函数,一旦我们定义了一些其他的构造函数,那么除非我们再定义一个默认的构造函数,否则类将没有默认构造函数。...类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数称为它的友元friend。 类成员 1. 定义一个类型成员 除了定义数据和函数成员外,类可以自定义某种类型在类中的别名。...可变数据成员 有时候我们希望能够修改类的某个数据成员,即使是在一个const成员函数中,可以在变量的声明中加入mutable关键字实现。...类似于全局变量,静态数据成员定义在任何函数之外,因此一旦它被定义,就将一直存在于程序的整个生命周期中 要想确保对象只定义一次,最好的办法是把静态数据成员的定义与其他非内联函数的定义放在同一个文件中 4.

    55520

    C++ const各种用法总结

    例如: 整形int(或其他内置类型:float,double,char) const int bufSize = 512; 或者 int const bufSize = 512; 因为常量在定义后就不能修改...:const int func1(); // 此处返回int 类型的const值,意思指返回的原函数里的变量的初值不能修改,但是函数按值返回的这个变量制成副本,能不能修改就没有了意义,它可以赋给任何的...const或非const类型变量,完全不需要加上这个const关键字。...// const成员函数中不允许对数据成员进行修改,如果修改,编译器将报错。...1.可以定义const常量,具有不可变性。 例如: const int Max=100; int Array[Max]; 2.便于进行类型检查,使编译器对处理内容更多了解,消除了一些隐患。

    1.9K10

    【C++初阶】C++入门

    const表示只读类型(指定类型安全性,保护对象不被意外修改),volatile指定修饰的对象类型的读操作是副作用(因此读取不能随便优化合并,适合映射I/O寄存器等)。...对模板类型,可以在头文件中声明模板类和模板函数;在代码文件中,使用关键字export来定义具体的模板类对象和模板函数;然后在其他用户代码文件中,包含声明头文件后,就可以使用该这些对象和函数。...20、inline 内联函数,在编译时将所调用的函数代码直接嵌入到主调函数中。各个编译器的实现方式可能不同。 21、mutable   mutable也是为了突破const的限制而设置的。...mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 22、namespace   C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。...命名空间除了系统定义的名字空间之外,还可以自己定义,定义命名空间用关键字“namespace”,使用命名空间时用符号“::”指定。

    1.3K30

    Effective C++条款3 我可以不使用const

    一开始,拒绝使用const的最大原因一般是觉得这个关键字比较鸡肋,因为它不会对程序产生实质影响,而且很繁琐,变量加上const关键后只能调用const类型的函数,极不方便。...const函数不会修改任何成员变量,除非这个变量mutable类型的,也就是说,mutable类型的变量可以在const函数中进行赋值操作。...传值需要调用构造函数和析构函数,优点是不会修改数据。 采用const引用,既可以避免多余的函数调用,也能保证数据不被修改。 如果不使用const直接传递引用,调用者会认为这个对象是可以更改的。...const与线程安全 现在,让我们来思考一下const对象是线程安全的吗? 某种程度上来说,const对象是线程安全的,因为const承诺不会修改任何数据。...但是如果你使用了mutable关键字,那么情况就不一样了,因为这个关键字使得你可以在const函数修改mutable类型的值。

    57330

    C++也能像Python一样玩转lambda

    exception-> return type { function body } capture list:捕获外部变量列表 params list:形参列表 mutable指示符:用来说用是否可以修改捕获的变量...第三个问题:如何修改外部变量? 可以通过添加mutable,但是当lambad函数结束后,变量仍旧恢复....另外,如果lambda内部修改变量,但是并没有使用mutable关键字,报错:error: increment of read-only variable ‘id’.且使用mutable后,()必须添加...传递引用可以不加mutable关键字. 其余的一部分传引用,其余传值或者一部分传值,其余传引用,只需要记着,传值必须用mutable关键字进行修改,且对外部变量没有影响.传引用会影响即可....参数列表 前面都是对lambda函数不传递任何参数,传递参数就比较简单了,调用的时候: f(xxx); 即可.

    42040
    领券