关键字 const 的一件奇妙事情是,它允许你指定一个语义约束,而编译器是强制实施这项约束。
关键字const多才多艺。
1. 关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针本身两者都是常量。
注意:一下两种类型是一样的
void f1 (const Widget * pw);
void f2 (Widget const *pw); //都是指被指物是常量,没有区别
就迭代器而言,有iterator 和const_iterator ,对于
const std::vectoriterator iter=vec.begin( ); //iter 的作用像个 T* const
意味着可以改变iter指向的物,但是不能改变 iter指针自身。
那么对于
std::vector::const_iterator cIter=vec.begin( ); //cIter的作用相当于 const T*
意味着可以改变cIter指针自身,但是不能改变cIter指向的物。
2. 令函数返回一个常量值,往往可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性。
3. 将const 实施于成员函数的目的,是为了确认该成员函数可作用于 const 对象身上。这一类成员函数之所以重要有两个原因:(1)它们使class接口比较容易被理解。这是因为,得知哪个函数可以改动对象内容而哪个函数不行,很重要;(2)它们使“操作const对象”成为可能,这对编写高效代码是个关键。
许多人漠视一件实事:两个成员函数如果只是常量性不同,可以被重载。
Class TextBlock
{
public:
const char& operator [ ](std::size_t position ) const //operator [] for const对象
{return text [position];}
char&operator [ ](std::size_t position ) //operator [] for non-const对象
{return text [position];}
private:
…
};
如果函数的返回类型是个内置类型,那么改动函数的返回值从来就不合法。
4. 利用C++的一个与const相关的摆动场:mutable(可变的)。mutable释放掉non-static成员变量的 bitwise constness 约束。
5. “运用const成员函数实现出其 non-const孪生兄弟”的技术是值得了解的。但是,反过来,并不是该做的事。令non-const版本调用const版本可以避免代码重复。