zoukankan      html  css  js  c++  java
  • 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[]

            );

        }

      };

  • 相关阅读:
    ffmpeg rtmp推流 视频转码
    java日志发展史 log4j slf4j log4j2 jul jcl 日志和各种桥接包的关系
    nginx stream 流转发,可以转发rtmp、mysql访问流,转发rtmp、jdbc请求
    java web http 转https 通过nginx代理访问
    linux 服务器磁盘挂载
    novnc 通过websockify代理 配置多点访问
    linux 文件服务 minio 安装部署配置
    AOP实现原理,手写aop
    java 泛型
    JAVA反射getGenericSuperclass()用法
  • 原文地址:https://www.cnblogs.com/lidan/p/2313793.html
Copyright © 2011-2022 走看看