C++学习笔记:const和mutable的多种用法【Cherno】
先来带着几个问题来:
为什么要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】相关推荐
- Vue学习笔记:axios 拦截器的用法
Vue学习笔记:axios 拦截器的用法 什么是axios 拦截器? 拦截器就是拦截每一次的请求和响应,然后进行相应的处理.请求拦截器,它可以统一在你发送请求前在请求体里加上token:响应拦截器,是 ...
- mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解
本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...
- Ext.Net学习笔记22:Ext.Net Tree 用法详解
上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...
- pandas学习笔记:pandas.Dataframe.rename()函数用法
pandas学习笔记:pandas.Dataframe.rename()函数用法 pandas.Dataframe.rename()函数主要是用来修改Dataframe数据的行名和列名. 主要用到的参 ...
- mysql数据库select语句用法_mysql学习笔记之完整的select语句用法实例详解
本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...
- C++笔记-const与mutable、static_cast与reinterpret_cast
目录 const与mutable static_cast与reinterpret_cast const与mutable 如下代码: #include <iostream> using na ...
- Ext.Net学习笔记10:Ext.Net ComboBox用法
ComboBox是最常用的控件之一,它与HTML中的Select控件很像,但可以进行多选.自定义显示格式.分页等. ComboBox用法 <ext:ComboBox runat="se ...
- [51单片机学习笔记ONE]-----LED灯的多种使用方法
一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间 ...
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同.
前言: C#委托是什么 c#中的委托可以理解为函数的一个包装, 它使得C#中的函数可以作为参数来被传递, 这在作用上相当于C++中的函数指针. C++用函数指针获取函数的入口地址, 然后通过这个指针 ...
最新文章
- 赠书:响应式编程到底是什么?
- 利剑无意之面试题(二)
- java犀牛是什么意思_深入浅出Rhino:Java与JS互操作
- 奖学金(洛谷-P1093)
- poj 2253 最短路变形——最大边的最小值
- 通过AT指令实现ESP8266模块和TCP服务器的数据传输
- [backbone] Getting Started with Backbone.js
- 使用iText对pdf中敏感信息进行马赛克处理
- 万网域名证书如何查询下载_备案域名证书获取
- 健身菜鸟需要掌握哪些基本的健身常识
- c++控制台版 俄罗斯方块 闪瞎眼
- python爬虫影评_Python爬虫(二十)_动态爬取影评信息
- 调试SI4432要点
- webview卡顿_分享三个小技巧,微信卡顿的人千万不要错过哦
- python中的global是什么意思_Python中的global关键字,你了解吗?
- linux中进程与线程
- 在线直播源码搭建直播平台的后端
- 1198. Substring
- acdsee 10 注册号和软件下载链接
- 2008中国之殇(转)
热门文章
- php mailer类实例下载,phpmailer
- android 双卡开发获取sim卡默认数据卡,获取sim卡信息,sim1卡,sim2卡 2G/3G/4G信号强度
- php重定向跳页,php重定向跳转
- 研究报告预测手机面部识别将逐步取代指纹识别
- oracle新增id怎么写,oracle插入数据时自增ID的解决思路
- MySQL和Oracle中如何update一张表中的字段赋值给另一张表的字段
- 百万张免抠 PNG 插图素材,非商业性使用下载使用,不断增加中
- React_04 菜谱项目
- 如何重装Ubuntu 系统
- vue定时器无法停止。