mutable关键字意味着不可能是const
- 物理的和逻辑的常量性
一个成员函数逻辑上是const,但它却仍然需要改变某个成员的值。对于用户而言,这个函数看似没有改变对象的状态,然而,它却可能更新了某些用户不能直接访问的细节。这通常被称为逻辑的常量性。例如,Data类可能有一个函数,它应返回一个用户可以用于打印的字符串表示。构造这种表示可能是一个相对费时的操作,因此,保留一个副本,在重复需要的时候直接返回这个副本。
class Data { private: bool m_cacheVaild string m_cache; void ComputeCacheValue( void ); public: string StringRep( void ) const; }; string Data::StringRep( void ) const { if ( false == m_cacheVaild ) { Data* p = const_cast<Data*>(this); p->ComputeCacheValue(); p->m_cacheVaild = true; } return m_cache; }
- 使用mutable关键字
存储描述符mutable特别说明某个成员需要以一种能允许更新的方式存储——即使它是某个const对象的成员。
class Data { private: mutable bool m_cacheVaild mutable string m_cache; void ComputeCacheValue( void ); public: string StringRep( void ) const; }; string Data::StringRep( void ) const { if ( false == m_cacheVaild ) { ComputeCacheValue(); m_cacheVaild = true; } return m_cache; }