- 1 const和星号位置关系:
- 2 const利于编译器侦测错误用法
- 3 编译器强制实行bitwise constness, 编程时因使用conceptual constness
- 4 减少代码重复
星号左侧:被指物为const
星号右侧:指针本身为const
STL迭代器以指针为依据塑造,迭代器作用类似T*指针
const iterator不能改变指针自身,但可改变所指内容,类似T* const
const_iterator类似const T*,被指物为常量,指针自身可改变
vector2 const利于编译器侦测错误用法vec; const vector ::iterator iter=vec.begin(); //类似T* const,不能改变指针本身,但可以改变指针所指内容 *iter=10; //right ++iter; //wrong vector ::const_iterator cIter=vec.begin(); //类似const T*,被指物为常量,指针自身可改变 *cIter=10; ++cIter;
例如手滑将==打成=
3 编译器强制实行bitwise constness, 编程时因使用conceptual constness- bitwise constness:又称physical constness, 必须不改变对象任何成员变量才行(static除外)
优点:编译器易于侦测违反点,只需找成员变量赋值操作
缺点:如果一个指针隶属于某个对象,改变指针所指物体依旧能通过bitwise constness测试 - conceptual constness:又称logical constness,const成员函数在客户端侦测不出时,可以改变处理对象内某些bit
mutable关键字:释放掉non-static成员变量的bitwise constness约束
当const和non-const成员函数具实质等价的实现时,令non-const调用const版本可避免代码重复
常量性转除, casting away constness
class A
{
public:
const int& operator[](int i) const{...}
int& operator[](int i){...}
//上述两者代码完全一致
}
//优化:
const int& operator[](int i) const{...}//不改变
int &operator[](int i){
return
const_cast(
static_cast(*this)[position]
);
}
优化分为三步:
- static_cast转化为const
- 调用const版本operator[]
- const_cast去除const
反之不行,因为const成员函数承诺不改变对象的逻辑状态,但non-const未必;在const成员函数中调用non-const必然存在风险



