先来带着几个问题来:

为什么要const、mutable声明,const、mutable的运用场景是什么;

1:为什么要有const、mutable声明:

const声明相当于你向系统的一个承诺,承诺不会改变声明对象的值;

但有人想,有必要吗,我不改不就行了吗。当然,如果您一直不改,那声明和不声明const的功效是差不多的,但是事与愿违,很多时候您不小心会改变自己不希望改的值,从而导致bug的产生,而const就是让系统监督这个变量,如果您不小心改变了变量,那么系统就会报错;

而mutable就是在某种特别的情况下,用于违背这个约定的声明;

2:const和mutable的用法:

一般const是运用于指针和类中函数的约束,分3种情况:

(1)不希望改变指针的指向改变

(2)不希望通过指针改变指针指向对象的内容

(3)不希望类中的函数改变类中的变量

可以看出来,这些运用场景都是为了保护某些个量

我们先看第一中场景:

我们知道,定义一个指针的形式为:

int *x;

所以我们不希望指针的指向改变,所以const应该作用于*x,故一个不可改变指向的*x的格式为:

int* const x=&y;

注意,这样的指针应该在定义时就给其赋予一个地址,否则会成为野指针;

这种声明它是可以通过指针改变指向对象的值的;

我们如果希望不可以通过指针改变指向对象的值的话,我们可以通过以下声明完成:

int const* x=&y;

这个时候如果呢通过x改变y的值,那么系统会报错;

但是这种声明它是可以改变指针的指向的,改变指向后仍然不能通过该指针改变指向对象的值;

那么来看类中函数怎么使用const;

有的时候,我们会些一些检测类的函数或者输出类的函数,这些函数往往是不必要改变变量的值的;

如果您有这个述求,那么可以通过const让函数变得更加安全;

看下面的代码:

#include<iostream>
using namespace std;class A {int x;
public:A(int mid) :x(mid){}void Get_x()const {cout << x;}
};int main() {A t (1);t.Get_x();
}

我们可以看到Get_x函数右边有一个const声明,这个声明就是告诉系统,Get_x这个函数不能改变成员变量:

如果我们将Get_x改为:

void Get_x()const {x=2; cout << x;
}

那么系统会报错:

但是有的时候,我们又希望在const声明过的函数中改变某些特定的值,比如我们要计算该函数运行了多少次【当然,我们可以通过一个作用域为该文件的变量来实现,但是那会让程序变得混乱】

,我们在类中声明一个mutable变量,即这种变量在const函数也是允许被改变的,像上面那个函数,如果我们将x声明为:

mutable int x;

那么系统不会报错:

#include<iostream>
using namespace std;class A {mutable int x;
public:A(int mid) :x(mid){}void Get_x() const {x = 2;cout << x;}
};int main() {A t (1);t.Get_x();
}

要注意:类中的static变量它是能够在const声明的类函数中被改变的,即使static变量没有经过mutable声明,因为static变量它是不属于任何一个类实例的,更像是一个作用域为指定类的全局变量;

C++学习笔记:const和mutable的多种用法【Cherno】相关推荐

  1. Vue学习笔记:axios 拦截器的用法

    Vue学习笔记:axios 拦截器的用法 什么是axios 拦截器? 拦截器就是拦截每一次的请求和响应,然后进行相应的处理.请求拦截器,它可以统一在你发送请求前在请求体里加上token:响应拦截器,是 ...

  2. mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  3. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  4. pandas学习笔记:pandas.Dataframe.rename()函数用法

    pandas学习笔记:pandas.Dataframe.rename()函数用法 pandas.Dataframe.rename()函数主要是用来修改Dataframe数据的行名和列名. 主要用到的参 ...

  5. mysql数据库select语句用法_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  6. C++笔记-const与mutable、static_cast与reinterpret_cast

    目录 const与mutable static_cast与reinterpret_cast const与mutable 如下代码: #include <iostream> using na ...

  7. Ext.Net学习笔记10:Ext.Net ComboBox用法

    ComboBox是最常用的控件之一,它与HTML中的Select控件很像,但可以进行多选.自定义显示格式.分页等. ComboBox用法 <ext:ComboBox runat="se ...

  8. [51单片机学习笔记ONE]-----LED灯的多种使用方法

    一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间 ...

  9. [读书笔记]C#学习笔记二: 委托和事件的用法及不同.

    前言:  C#委托是什么 c#中的委托可以理解为函数的一个包装, 它使得C#中的函数可以作为参数来被传递, 这在作用上相当于C++中的函数指针. C++用函数指针获取函数的入口地址, 然后通过这个指针 ...

最新文章

  1. 赠书:响应式编程到底是什么?
  2. 利剑无意之面试题(二)
  3. java犀牛是什么意思_深入浅出Rhino:Java与JS互操作
  4. 奖学金(洛谷-P1093)
  5. poj 2253 最短路变形——最大边的最小值
  6. 通过AT指令实现ESP8266模块和TCP服务器的数据传输
  7. [backbone] Getting Started with Backbone.js
  8. 使用iText对pdf中敏感信息进行马赛克处理
  9. 万网域名证书如何查询下载_备案域名证书获取
  10. 健身菜鸟需要掌握哪些基本的健身常识
  11. c++控制台版 俄罗斯方块 闪瞎眼
  12. python爬虫影评_Python爬虫(二十)_动态爬取影评信息
  13. 调试SI4432要点
  14. webview卡顿_分享三个小技巧,微信卡顿的人千万不要错过哦
  15. python中的global是什么意思_Python中的global关键字,你了解吗?
  16. linux中进程与线程
  17. 在线直播源码搭建直播平台的后端
  18. 1198. Substring
  19. acdsee 10 注册号和软件下载链接
  20. 2008中国之殇(转)

热门文章

  1. php mailer类实例下载,phpmailer
  2. android 双卡开发获取sim卡默认数据卡,获取sim卡信息,sim1卡,sim2卡 2G/3G/4G信号强度
  3. php重定向跳页,php重定向跳转
  4. 研究报告预测手机面部识别将逐步取代指纹识别
  5. oracle新增id怎么写,oracle插入数据时自增ID的解决思路
  6. MySQL和Oracle中如何update一张表中的字段赋值给另一张表的字段
  7. 百万张免抠 PNG 插图素材,非商业性使用下载使用,不断增加中
  8. React_04 菜谱项目
  9. 如何重装Ubuntu 系统
  10. vue定时器无法停止。