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[]

            );

        }

      };

  • 相关阅读:
    C#初识
    SQL 语言基础
    类;类型
    输入一元二次方程的三个参数,a,b,c,判断是否为一元二次方程,并求解
    输入一个1-100之内的数,判断是否跟7有关
    输入身高、体重、性别,判断是否是标准体重,男性标准=(身高-100)+-3,女性标准=(身高-110)+-3
    分别录入年月日,判断是否是一个正确的日期
    面向对象基础--面向对象思想(理解)
    2015-01-04 Javascript
    2014-12-28 iframe,style,body style
  • 原文地址:https://www.cnblogs.com/lidan/p/2313793.html
Copyright © 2011-2022 走看看