深入理解C++中的mutable关键字
来源:互联网 发布:用php做购物网站案例 编辑:程序博客网 时间:2024/05/17 08:33
mutalbe的中文意思是“可变的,易变的”,跟constant(即C++中的const)是反义词。
在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。
下面是一个小例子:
01
class
ClxTest
02
{
03
public
:
04
void
Output()
const
;
05
};
06
07
08
void
ClxTest::Output()
const
09
{
10
cout <<
"Output for test!"
<< endl;
11
}
12
13
14
void
OutputTest(
const
ClxTest& lx)
15
{
16
lx.Output();
17
}
类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。
如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。
下面是修改过的代码:
01
class
ClxTest
02
{
03
public
:
04
ClxTest();
05
~ClxTest();
06
07
void
Output()
const
;
08
int
GetOutputTimes()
const
;
09
10
private
:
11
mutable
int
m_iTimes;
12
};
13
14
15
ClxTest::ClxTest()
16
{
17
m_iTimes = 0;
18
}
19
20
21
ClxTest::~ClxTest()
22
{
23
}
24
25
26
void
ClxTest::Output()
const
27
{
28
cout <<
"Output for test!"
<< endl;
29
m_iTimes++;
30
}
31
32
33
int
ClxTest::GetOutputTimes()
const
34
{
35
return
m_iTimes;
36
}
37
38
39
void
OutputTest(
const
ClxTest& lx)
40
{
41
cout << lx.GetOutputTimes() << endl;
42
lx.Output();
43
cout << lx.GetOutputTimes() << endl;
44
}
45
46
计数器m_iTimes被
mutable
修饰,那么它就可以突破
const
的限制,在被
const
修饰的函数里面也能被修改
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 《转》深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- 深入理解C++中的mutable关键字
- MFC文档序列化
- 调停者模式整理
- 比较全的fourcc含义
- 虚拟经济的作用
- 时间服务
- 深入理解C++中的mutable关键字
- 妙用Adobe Audition 系列教程(一):信号发生器
- Microwindows 在 MINI2440 QEMU上的移植
- vmware在ubuntu11.04下的问题
- 在ubuntu10.10中安装sun-java5-jdk的方法
- Hello CSDN!
- Ubuntu Server 10.10 安装配置 Ruby Rails3 passenger nginx MySQL
- Power Designer (PD) 由物理数据模型PDM生成数据库脚本时带双引号的问题
- 微软图表控件使用初探--数据绑定(交叉表)