[转]C++类成员修饰const和mutable
const:常量,不变的
mutable:易变的
从意思上理解,可见const和mutable是一对反义词,它们都是C++的关键字。
const成员函数不能修改调用它的对象。类的成员函数可以被声明为const,这将使得函数的隐式参数this将被作为const类型的指针。这也就意味着一个const成员函数不能修改调用它的对象。而且,const对象不能调用非const成员函数。然而,const对象和非const对象都可以调用const成员函数。
要将一个成员函数声明为const,可以使用下面的形式:
1
2 3 4 5 6 |
class X
{ int some_var; public: int f1() const; //const成员函数 }; |
可以看到,关键字const被放在函数声明之后。将一个成员函数声明为const的目的是防止函数修改调用它的对象。例如下面的代码:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream>
using namespace std; //说明const函数的用法,这个程序不能通过编译 void main() |
上面的这个程序不能通过编译,因为函数seti()被声明为const成员函数,这意味着在函数中不能修改调用函数的对象。但是由于seti()试图修改成员变量i,所以程序会产生错误,而在函数geti()中并不修改成员变量i,所以这个函数是正确的。
有时你可能想在const函数中修改类的某些成员,但又不想让函数修改类的其它成员,那么可以通过关键字mutable来实现这种功能。mutable将覆盖const属性。也就是说,在const成员函数中可以修改mutable成员,例如:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream>
using namespace std; //可以通过编译,运行正确 void seti(int x) const void main() //运行结果 |
在上面的程序中,类的成员变量i被定义为mutable,所以在函数seti()中可以修改它的值。
const成员变量的初始化
在构造函数中对成员变量进行初始化是很普遍的初始化方法,然而,这种方法并不是适用于所有情况,例如:如果在类的定义中使用了const来声明成员变量,那么在类的构造函数中将不能对这些成员变量赋初始值,因为const变量必须在构造函数调用之前被初始化,在使用"引用类型的成员"以及"没有默认构造函数的成员"时存在着同样的问题,因为这些成员必须首先被初始化。为了解决这个问题,在C++中定义了一种成员初始化语法,可以在创建对象时为类的成员指定初始值。
成员初始化语法 类似于 调用基类构造函数的语法,它的通用形式如下所示:
1
2 3 4 5 6 7 |
constructor(arg_list)
: member(initlalizer) , member(initlalizer) , member(initlalizer) { //构造函数体 } |
在构造函数的后面指定你想要初始化的成员,同时用冒号将构造函数的名字和参数列表分开。也可以将基类构造函数的调用和成员的初始化放在同一参数列表中。
[转]C++类成员修饰const和mutable的更多相关文章
- python - 类成员修饰符
在java,c#类的成员修饰符包括,公有.私有.程序集可用的.受保护的. 对于python来说,只有两个成员修饰符:公有成员,私有成员 成员修饰符是来修饰谁呢?当然是修饰成员了.那么python类的成 ...
- C#基础--类/接口/成员修饰符,多态、重载、重写,静态和非静态
C#基础--类/接口/成员修饰符,多态.重载.重写,静态和非静态 类/接口/成员修饰符 C#修饰符---接口: 接口默认访问符是internal接口的成员默认访问修饰符是public C#修饰符--类 ...
- Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇
一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传 ...
- Python菜鸟之路:Python基础-类(2)——成员、成员修饰符、异常及其他
三大成员 在Python的面向对象中,主要包括三大成员:字段.方法.属性 字段 类成员的字段又可分为普通字段.静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,代码示例如下: ...
- Python面向对象之成员修饰符
对于这些类成员有修饰符 之前定义字段country任何对象都可以访问,是公有的 可以定义为私用属性,只有类内部的方法可以调用,外部不能直接调用,但是可以间接调用 vim day7-10.py #!/u ...
- const修饰的成员是类成员,还是实例成员?
很抱歉,我以为只有static修饰的成员是类成员,可以通过类名直接访问,然而,const 修饰的成员也属于类成员,直接通过类名访问,不能通过实例变量访问. 做维护久了,深刻的理解,扎实的基础对写出高质 ...
- 【c++】类中的const成员
const成员变量 举个例子 #include <iostream> using namespace std; class A { public: A(int size) : SIZE(s ...
- const与static类成员
const成员函数作用1. 不能修改类的成员变量,同时不能调用类的非const成员函数.(const成员函数中,this的类型是一个指向const类类型对象的const指针,const成员函数返回*t ...
- const型类成员
一.关于const类成员函数有以下几个需要注意的地方: 1. 在普通的非const成员函数中,this的类型是一个指向类类型的const指针,而const成员函数中,this的类型是一个指向const ...
随机推荐
- c语言中的数据类型的最大最小值
#include <float.h>#include <limits.h> int n1 = INT_MIN;int n2 = INT_MAX;float f1 = F ...
- MySql数据库中的datediff函数
MySql数据库中的datediff函数:主要是用来返回两个日期之间相隔的天数 一半情况下是大日期在前,小日期在后的 这样写也是能够运行的 要注意查询结果:
- docker删除镜像Error response from daemon: conflict: unable to remove repository reference
Docker无法删除images,由于是依赖container. 1.进入root权限 sudo su 2. 列出所有运行或没有运行的镜像 docker ps -a 3.停止containe ...
- SpringBoot配置文件加载位置与优先级
1. 项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 –fil ...
- [PHP] Elasticsearch 6.4.2 的安装和使用
Elasticsearch 6.4.2 的安装和使用 一.安装http://www.ruanyifeng.com/blog/2017/08/elasticsearch.htmlhttps://www. ...
- ORM常用的13个方法
介绍一个可以以py脚本方式运行ORM操作的方法: 可在项目内新建个py文件,复制项目内manage.py文件中的以下代码: if __name__ == "__main__": o ...
- pcm音频的格式类型
[文章内容属于多方转载内容] PCM Parameters PCM audio is coded using a combination of various parameters. Resoluti ...
- SpringBoot简介以及案例
1什么是SpringBoot Spring Boot 是所有基于 Spring 开发的项目的起点.Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置 ...
- python requests 上传excel数据流
headers=self.headers #获取导入模版 file_home = self.import_template log.info(file_home) wb = load_workbook ...
- DAVID 进行 GO/KEGG 功能富集分析
何为功能富集分析? 功能富集分析是将基因或者蛋白列表分成多个部分,即将一堆基因进行分类,而这里的分类标准往往是按照基因的功能来限定的.换句话说,就是把一个基因列表中,具有相似功能的基因放到一起,并和生 ...