深入理解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. js 自定义方法 实现停留几秒 sleep

    function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMillis; wh ...

  2. 每日算法之三十三:Trapping Rain Water

    这是一个非常有意思的问题,求解最大容积问题,值得动脑筋想一想. 原题例如以下: Given n non-negative integers representing an elevation map ...

  3. HashMap两种类型

    Map<String, Integer> map = new HashMap<String, Integer>(); map.put("d", 2); ma ...

  4. 为什么android你用的越多,速度较慢的手机

    依据第三方的调研数据显示,有 77% 的 Android 手机用户承认自己曾遭遇过手机变慢的影响,百度搜索"Android+ 卡慢",也有超过 460 万条结果. 在业内.Andr ...

  5. MVC Controller向View传值(ViewData与ViewBag)

    近期在开发项目中,使用的是ASP.NET MVC因为之前并没有接触,对于它的传值方式有些陌生,在这里进行初步总结积累学习. 一:使用 ViewData使用: public ActionResult I ...

  6. go语言实现遍历目录,及查找特定的文件类型

    // filelist.go package main import ( //"flag" "fmt" "os" "path/fi ...

  7. 重新想象 Windows 8 Store Apps (20) - 动画: ThemeAnimation(主题动画)

    原文:重新想象 Windows 8 Store Apps (20) - 动画: ThemeAnimation(主题动画) [源码下载] 重新想象 Windows 8 Store Apps (20) - ...

  8. DM8168 CameraLink 视频噪点问题解决

    几天前写过FPGA採集LVDS视频(噪点去除),当时的情况是CameraLink视频出现了非常多噪点,不堪入目,硬件方面没有找到毛病,仅仅能是用硬件描写叙述语言对採集前端的FPGA又一次进行了处理,效 ...

  9. effective c++ 条款4 make sure that objects are initialized before they are used

    1 c++ 类的数据成员的初始化发生在构造函数前 class InitialData { public: int data1; int data2; InitialData(int a, int b) ...

  10. hdu 1429 胜利大逃亡(延续)(BFS+比特压缩)

    #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm& ...