const成员函数的一般好处有:
- 它使得class接口比较容易理解。
- 它使得操纵const对象成为可能。
使用的过程中应该在const与non const成员函数之间避免代码重复:
class TextBlock { public: ... const char & operator[](std::size_t position)const { ... //边界检查 ... //日志数据访问 ... //校验数据完整性 return text[position]; } char & operator[](std::size_t position) { ... //边界检查 ... //日志数据访问 ... //校验数据完整性 return text[position]; } private: std::string text; }
这样做可以但是会导致你代码较为臃肿,做了很多的重复性的工作,事实上可以使用const——cast以及static_cast来实现如下的工作
这个就叫做所谓的常量性的转除,用一个operator[]去掉用另外一个operator[]
一般来说,用non-const来调用其const兄弟一般是一种安全的做法:
const char & operator[](std::size_t position)const { ... //边界检查 ... //日志数据访问 ... //校验数据完整性 return text[position]; } char &operator[]{std:size_t position} { return const_cast<char&> ( static_cast<const TextBlocks&>(*this) [position] ); }
上面这一段可以做一些解释,第二个non-const语句块我们打算让non-const operator调用他的const兄弟,但是non-const操作符的后面如果只是单纯的调用operator[]那么会
导致iwuxian递归的调用自己,所以应该加上static_cast来将*this先进行转型。所以这里总共是有两次的转型。第一次是将*this从Textblocks转型到const Textblocks,就是为*this
来添加上const,之后再为返回的const operator[]中将const来移除。
还有一点应该注意的是,绝对不要用const版本来调用non-const版本。