[转]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 ...
随机推荐
- NOIP 2008 笨小猴
洛谷 P1125 笨小猴 洛谷传送门 JDOJ 1539: [NOIP2008]笨小猴 T1 JDOJ传送门 Description 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到 ...
- Selenium请求库
阅读目录 一 介绍 二 安装 三 基本使用 四 等待元素被加载 五 选择器 六 元素交互操作 七 其他 八 项目练习 九 破解登录验证 一 介绍 1.selenium是什么? selenium最初是一 ...
- RabbitMQ消息确认机制
文章目录 1. 事务机制2. Confirm模式2.1 生产者2.1.1 普通Confirm模式2.1.2 批量Confirm模式2.1.3 异步Confirm模式2.2 消费者3. 其他 消费者如何 ...
- ReplaceGoogleCDN 真的好使
在国内访问 stackoverflow快了很多. 谢谢开发者 https://github.com/justjavac/ReplaceGoogleCDN
- Kinect for Windows V2开发教程
教程 https://blog.csdn.net/openbug/article/details/80921437 Windows版Kinect SDK https://docs.microsoft. ...
- 关于Visual Studio源代码文件的行尾
我们都知道,UNIX只使用换行符(linefeed)来结束每一行,而DOS传统上使用CR+LF来结束每一行,Visual Studio应该完全在DOS世界中,但不管出于什么原因,当我们从代码服务器上获 ...
- CPU 的由来
由 c# 的CEF 框架提供的 js 扩展,WebBrowser. JavascriptObjectRepository. 问:为什么要提供这一种方式. 提供了一种 能让js 与后端代码通讯的 方式. ...
- 复旦大学2018--2019学年第二学期(18级)高等代数II期末考试第六大题解答
六.(本题10分) 设 $A$ 为 $n$ 阶实对称阵, 证明: $A$ 有 $n$ 个不同的特征值当且仅当对 $A$ 的任一特征值 $\lambda_0$ 及对应的特征向量 $\alpha$, 矩 ...
- 【cf补题记录】Codeforces Round #607 (Div. 2)
比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...
- SpringMVC拦截器与SpringBoot自定义拦截器
首先我们先回顾一下传统拦截器的写法: 第一步创建一个类实现HandlerInterceptor接口,重写接口的方法. 第二步在XML中进行如下配置,就可以实现自定义拦截器了 SpringBoot实现自 ...