• mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
  • 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

mutable的作用有两点:

  1. 保持常量对象中大部分数据成员仍然是“只读”的情况下,实现对个别数据成员的修改;
  2. 使类的const函数可以修改对象的mutable数据成员。

示例代码1

#include <iostream>
using namespace std;//mutable int test;//编译出错class Student
{string name;mutable int getNum;//mutable const int test;    //编译出错//mutable static int static1;//编译出错
public:Student(char* name){this->name=name;getNum=0;}string getName() const{++getNum;return name;}void pintTimes() const{cout<<getNum<<endl;}
};int main(int argc, char* argv[])
{const Student s("张三");//const对象只能访问const成员函数cout<<s.getName().c_str()<<endl;s.pintTimes();return 0;
}
//程序输出结果
//张三
//1

使用mutable的注意事项:

  1. mutable只能作用于类的非静态(static)和非常量(const)数据成员。

    • 静态数据成员存储在Data段或BSS段(静态存储区),属于类,不属于类对象,那么常对象和常函数可以对其任意地修改,所以类的static数据成员根本不需要mutable的修饰,但对于常对象的数据成员则不可以被修改,若想修改,则需要mutable的修饰
    • 因为const 和 mutable 是矛盾的,所以不能同时作用
  2. 在一个类中,应尽量或者不用mutable,大量使用mutable表示程序设计存在缺陷。

示例代码2

#include <iostream>
using namespace std;class Student
{string name;
public:static int test1;void modify() const{test1=15;cout<<test1<<endl;}
};int Student::test1;//申明test1并按照编译器默认的值进行初始化
int main(int argc, char* argv[])
{const Student s("张三");s.test1=5;//常对象可以修改静态类的数据成员test1cout<<Student::test1<<endl;s. modify();//常函数修改return 0;
}

程序输出结果是:

5
15

C++ 关键字之 mutable相关推荐

  1. 【C++入门】const和mutable关键字、常函数介绍

    1.常函数介绍 1.1.什么是常函数 (1)常函数的定义:类的成员函数对类中任何成员不作修改而只能作访问的函数:简单来说,就是调用类的成员函数不会对类做任何修改: (2)常函数的实现:常函数是依靠co ...

  2. 【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值

    这里写目录标题 1. 引言 1.1 mutable关键字的简介 2. mutable关键字的设计意图 (The Design Intent of the mutable Keyword) 2.1 为什 ...

  3. C++类与const关键字

    一句话概括:const成员变量参考C语言:const成员函数中,const写在函数后面,如:func()const,const成员函数只能使用const成员变量,但不能修改const成员变量:cons ...

  4. C++中的const成员函数

    文章目录 1 C++中的const成员函数 1.1 const成员函数的使用 1.2 同名的const成员函数和非const成员函数构成重载关系 2 mutable关键字 1 C++中的const成员 ...

  5. 易混淆的c++知识点

    初始化和赋值的区别 在定义一个变量或常量时为它指定初值叫做初始化,而在定义一个变量或常量以后使用戚值运算符修改它的值叫做赋值,勿将初始化与赋值混淆. 类的组合和友元函数 类组合的情况,类B 中内嵌了类 ...

  6. F#基础教程 大纲

    各位大虾,原文的pdf文档在这里下载. 第一章 简介 什么是函数式编程 为什么函数式编程很重要 什么是F# 谁在使用F# 谁需要这本书 下一步是什么 第二章 如何获取.安装和使用F# 获取F# 在wi ...

  7. C++ 之const的使用

    在类中,有时候为了避免误操作而修改了一些人们不希望被修改的数据,此时就必须借助const关键字加以限定了.借助const关键字可以定义const类型的成员变量.成员函数.常对象以及对象的常引用. co ...

  8. C++解析(31):自定义内存管理(完)

    0.目录 1.遗失的关键字mutable 2.new / delete 3.new[] / delete[] 4.小结 5.C++语言学习总结 1.遗失的关键字mutable 笔试题: 统计对象中某个 ...

  9. 对QT5信号与槽的认识

    关键字参数理解: 在QT中,连接槽与信号的关键字是connect,它里面的参数如下: 按照我的理解,里面四个参数分别如下: 1.信号发送者 2.发送的信号 3.信号接收者 4.接收的信号 [拓]: 信 ...

最新文章

  1. python课程将主要介绍哪些内容-Python课程详细介绍
  2. 经验之谈——送给年轻的职场人
  3. union 和 union all 有什么不同?
  4. java 防止sql xxs注入,Java-JSP网站 防SQL注入,防XSS等攻击有什么好的处理办法?...
  5. 2017年闰秒linux_2017年Linux专业人员的4个热门技能
  6. (8)FPGA实现1s闪灯代码(学无止境)
  7. c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...
  8. iOS核心动画Core Animation(一)
  9. XML学习总结(一)——XML介绍
  10. Mysql中将查询出来的多列的值用逗号拼接
  11. 如何安装uclient_uclient软件
  12. webqq linux,Ubuntu 11.10安装WebQQ
  13. 寻租——乞丐没有白拿施舍
  14. 《丁香花》 一个凄美的故事
  15. leetcode 385. 迷你语法分析器
  16. 对项目经理而言,PMP认证是否对职业生涯的发展有帮助?
  17. 计算机课的教学点评,计算机基础学科的教学评价有效方法
  18. 从2.3.3到4.1.1:最全的android系统源码下载大集合
  19. 第八次CCF计算机软件能力认证
  20. 【bzoj4146】 [AMPPZ2014]Divisors

热门文章

  1. 京牌车辆是否可以继承
  2. arcmap shp导出cad无反应_CAD与GIS互转的两种方法
  3. 怎么理解变量(变量是什么)
  4. 今天和大家分享一下 token 失效的处理方式
  5. P5514 [MtOI2019]永夜的报应(位运算)
  6. Linux查看文件详细信息分析
  7. 使用IDEA连接数据库
  8. 华为云服务器mysql数据恢复案例
  9. 7.node.js的3DES 加密和解密的方法封装
  10. 【软件测试】测试面试,面试官其实想要的答案......