条款3:尽可能的使用const

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版本。
原文地址:https://www.cnblogs.com/-wang-cheng/p/4854891.html