规则:如果关键字const出现在星号左边,表示所指内容是常量。如果出现在星号的右边,表示指针本身是常量(内存的地址不变)。如果出现在星号的两边,表示被指物和指针两者都是常量。
char a[]="hello";
char *p=a;//non-const pointer,non-const data
const char* p=a;//non-const pointer,const data
char* const p=a;//const pointer,non-const data
const char* const p=a;//const pointer,const data
迭代器的作用像个T*指针。声明迭代器为const等价于T* const.表示这个指针的地址时不能变的,但是其内容可以改变。如果希望迭代器所指内容不要变,需要用const_iterator.
std::vector<int> vec;
const std::vector<int>::iterator iter=vec.begin();//T* const
*iter=10;//正确
++iter;//错误
std::vector<int> vec;
std::vector<int>::const_iterator citer=vec.begin();//const T*
*citer=10;//错误
++citer;//正确
成员函数是const:
bitwise constness:
成员函数只有在不更改对象内任何成员变量(static除外)时才可以说是const.
logical constness:
一个const成员函数可以修改它所处理的对象内的某些成员,但只有在客户端侦测不出的情况下才如此。即使用关键字mutable去释放non-static成员变量的bitwise constness约束。
当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。