• effective C++ 条款 3:尽可能使用const


      const 修饰指针:如果关键字const出现在星号*左边,表示被指物是常量,如果const出现在*右边表示指针自身是常量, 如果出现在两边表示被指物和指针都是常量;

      const std::vector<int>::iterator iter = vec.begin(); //iter的作用就像是T* const; ++iter;错误

      std::vector<int>::const_iterator cIter = vec.begin(); //cIter的作用像个const T*; *cIter = 10;错误

      const 修饰函数返回值:将operator*的返回值声明为const类型避免(a*b) = c;这种没意思的赋值动作

    const 成员函数:表示该成员函数可以作用于const对象身上

      两个成员函数只是常量性不同,可以被重载

      bitwise constness:const成员函数不可以更改对象任何non-static成员变量

      class CTextBlock{

      public:

        std::size_t length() const;

      private:

        char* pText;

        sdt::size_t textLength;

        bool lengthValid;

      };

      std::size_t CTextBlock::length() const

      {

        if(!lengthIsValid)

        {

          textLength = std::strlen(pText);  //错误!在const成员函数内不能赋值给

          lengthIsValid = ture;        //textLength和lengthValid

        }

      }

      此时可以用一个与const相关的摆动场:mutable(可变的)释放掉non-static成员变量的bitwise constness约束

      class CTextBlock{

      public:

        std::size_t length() const;

      private:

        char* pText;

        mutable sdt::size_t textLength;

        mutable bool lengthValid;

      };

      std::size_t CTextBlock::length() const

      {

        if(!lengthIsValid)

        {

          textLength = std::strlen(pText);  //现在可以改变textLength

          lengthIsValid = ture;        //和lengthValid

        }

      }

    在const成员函数和non-const成员函数中避免重复:用non-const调用const兄弟经过两次转换,反向做法不应该const成员函数不改变其对象的逻辑状态

      class TextBlock{

      public:

        const char& operator[](std::size_t position) const

        {

          ......

          return text[opsition];

        }

        char& operator[](std::size_t position)

        {

          return

            const_cast<char&>(              //将op[]的返回值的const移除

              static_cast<const TextBlock&>(*this)[]   //为*this加上const调用op[]

            );

        }

      };

  • 相关阅读:
    python命令行工具模块-click
    python项目代码打包成Docker镜像
    背包九讲
    秒杀项目的3个奇数问题:并发队列的选择,请求接口的合理设计,高并发下的数据安全
    java类加载过程
    索引失效
    java面试
    进程间通信
    HashMap在Jdk1.7和1.8中的实现
    十大排序算法
  • 原文地址:https://www.cnblogs.com/lidan/p/2313793.html
Copyright © 2020-2023  润新知