如果你想修改对象,不要做它const
。修改const
对象,例如通过const_cast
,是未定义的行为。
所以不要使用const
for m_data
,但是const
您可以在代码中使用其他几个 s :
- 您可以使用 保护函数参数
const
。这通常不是很有意义,因为您通常不关心指针,而是关心它指向的对象。但它可以帮助您避免错误,例如在代码中意外重新指向d
:
void set_data(Data * const d); // const pointer to (non-const) Data
// this means the function can not change d (the pointer), but it can
// change the object that d points to.
- 您可以制作非修改功能
const
。这声明该函数不会以任何方式更改对象(除非有mutable
成员)。如果您尝试修改此类函数中的任何成员,编译器将出错。const
这些函数也是您可以在对象上调用的唯一函数。
Data * get_data() const; // this function doesn't change anything
请注意,如果您有mutable
成员,则可以从 const 函数更改它们,但这不应被滥用。这适用于互斥锁或缓存等内部事物。
另请注意,引用总是const
- 它们不能重新分配以指向另一个对象。它们引用的对象可以是 const 或非常量。
最后提示:从右到左阅读声明:
Data * d; // pointer to Data (both can be changed)
Data * const d; // const pointer to Data (data can be changed)
Data const * d; // pointer to const Data (pointer can be changed)
Data const * const d; // const pointer to const Data (neither can be changed)
Data & d; // reference to non-const Data
//Data & const d; // invalid - all references are const
Data const & d; // reference to const Data
//Data const & const d; // invalid - all references are const