在函数声明式中使用const可以防止用户错误的使用。
同时在自定义类型中也是如此,要尽量与内置类型兼容。
const修饰成员函数(常成员函数)
作用:
明确了哪个函数可以改动对象内容。
通过const成员函数,来处理const修饰的对象。
//C++中常成员函数与非常成员函数可以构成重载,具体调用根据对象类型是否为const来进行区别调用,
void print(const TextBlock&ctb){
std::cout<<ctb[0]; //调用const版本的operator[]
}
[]运算符重载,最好返回&使得返回值可以被再次修改,否则tb[]只可读,不可写。
bitwise constness:
成员函数不更改对象内任意一个bit。
const CTextBlock cctb("Hello");
char* pc = &cctb[0];
*pc = 'J';
//实际上通过外部指针还是修改了对象的值,变为了“Jello",同时通过了bitwise测试,并未修改成员指针的值。
logical constness:
某些情况下允许在常成员函数下,对成员变量进行修改。
使用mutable修饰符,可以释放掉non-static成员变量的const约束,使得在const成员函数中,也可以对含有mutable修饰的成员变量进行修改。
”运用const成员函数,实现其non-const孪生兄弟“
对于常成员函数造成的重载,可以通过非常版本对另一个调用,来减少代码重复。
先通过*this将对象变为常对象,以便调用常成员函数版本。
返回值去常
char& operator[](std::size_t position)
{
return
const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);
}
其中非常对象转换为常对象是安全行为(安全转型),因此使用static_cast。
去常行为则只能由const_cast完成。
反之则十分危险!