深入理解C++中的mutablekeyword

kezunhai@gmail.com

http://blog.csdn.net/kezunhai

keywordmutable是C++中一个不经常使用的keyword。它的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。在C++中。mutable也是为了突破const的限制而设置的。被mutable修饰的变量。将永远处于可变的状态,即使在一个const函数中。

mutable仅仅能用于类的非静态和很量数据成员。我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化。

假设一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会改动类的非静态数据成员.可是有些时候须要在该类函数中对类的数据成员进行赋值。这个时候mutablekeyword就派上用场了。

举个样例,如:

class Student
{
public:
Student(){}
~Student(){}
Student( int _age):age(_age){} public:
int getAge() const
{
age++; // 在const函数里试图改动。编译报错
return age;
}
private:
string name;
int age;
};

上面代码在编译时报:“error C2166: 左值指定 const 对象”错误。在上面的样例中,const类型的getAge()函数中改变了类的非静态数据成员age。因此。这个时候须要使用mutable来修饰一下要在const成员函数中改变的非静态数据成员,将上述代码改为:

class Student
{
public:
Student(){}
~Student(){}
Student( int _age):age(_age){} public:
int getAge() const
{
age++; // 在const函数里试图改动。编译报错
return age;
}
private:
string name;
mutable int age;
};

则代码正常编译。

 总结:mutablekeyword可以在保持常量对象中大部分数据成员仍然仅仅是“仅仅读”的情况下。实现个别数据成员的改动,使用mutablekeyword,须要注意下面几点:

(1)mutablekeyword仅仅能作用于类的非静态和很量数据成员。

(2)mutablekeyword提示编译器该变量能够被雷的const函数改动。

(3)在一个类中,用mutable修饰的变量仅仅能是少数,或者根本不使用mutable。

參考资料:

1、C++高级进阶。

作者:kezunhai出处:http://blog.csdn.net/kezunhai欢迎转载或分享,但一定要注明文章来源

版权声明:本文博主原创文章,博客,未经同意不得转载。

深入了解C++中间mutablekeyword的更多相关文章

随机推荐

  1. 从零开始学Xamarin.Forms(一) 概述

    原文:从零开始学Xamarin.Forms(一) 概述     Xamarin 读 "ˈzæmərin",是一个基于开源项目mono的能够使用C#开发的收费的跨平台(iOS.And ...

  2. linux查看CPU和内存信息

    一 先来看看ps命令: 1.查看当前某个时间点的进程:ps命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵死. 哪些进程占用了 ...

  3. HDU 3954 Level up(线段树)

    HDU 3954 Level up 题目链接 题意:k个等级,n个英雄,每一个等级升级有一定经验,每次两种操作,一个区间加上val,这样区间内英雄都获得当前等级*val的经验,还有一个操作询问区间经验 ...

  4. Core 1.0中的管道-中间件模式

    ASP.NET Core 1.0中的管道-中间件模式 SP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middlewar ...

  5. 经常使用的js小方法

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% Strin ...

  6. C该程序生成一个唯一的序列号

    在实际的软件开发项目,通常,它包括产生一唯一的序列号.在本文中,一个切实可行的方案,例如,它引入了一个唯一的序列号生成过程. 本文生成的序列号的样式为:MMDDHHMINSS_XXXXXX. 程序例如 ...

  7. Python编程预约参观北京行动纲要

    通过Python程序来模拟一个统一平台预约参观北京,包含验证码识别.登陆.据医院.时间.有关主管部门号等查询. 此程序仅供学习使用,请勿用于其他用途. 1.验证码图片 def getCodePic() ...

  8. Java面试题集(136-150)

    摘要:目,尽管仅仅有15道题目.可是包括的信息量还是非常大的,非常多题目背后的解题思路和算法是非常值得玩味的. 136.给出以下的二叉树先序.中序.后序遍历的序列? 答:先序序列:ABDEGHCF.中 ...

  9. Java Swing TextArea 滚动条和获得焦点

    JTextArea text=new JTextArea(); text.setLineWrap(true);//设置自己主动换行,之后则不须要设置水平滚动栏 JScrollPane scroll=n ...

  10. ios ios7 取消控制拉升

    //推断是否ios7 取消控制拉升 if ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0) { self.edgesFo ...