zoukankan      html  css  js  c++  java
  • 深入了解C++中间mutablekeyword

         深入理解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欢迎转载或分享,但一定要注明文章来源

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

  • 相关阅读:
    .NET Framework 3.0 和 Windows SDK
    用 C# 开发 SQL Server 2005 的自定义聚合函数
    IronPython 源码剖析系列(2):IronPython 引擎的运作流程
    IronPython 个人网站样例宝藏挖掘
    SetRenderMethodDelegate 方法
    使用 Castle ActiveRecord 开发发现的一些问题
    IronPython for ASP.NET CTP WhitePaper 摘要翻译
    关于 IE 模态对话框的两个问题
    逐步改用 IronPython 开发你的 ASP.NET 应用程序
    使用 Flash 和 C# WinForm 配合打造界面漂亮的应用程序(摘要)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4889222.html
Copyright © 2011-2022 走看看