尽可能用const

尽可能用const

细节

const 出现在星号左边,表示被指物是常量

const 出现在星号右边,指针自身是常量

const int * pw;

int const * pw;含义相同

STL 迭代器中

  • const std::vector::iterator // iter 值不可变

  • std::vector::const_iterator cIter;// cIter 指向的内容不可变

  • 将operator* 的返回值设置为const ,防止对* 重载后,的返回值进行误操作

const 参数我们很常见了,就是防止函数内部不小心对传入的值做不必要的修改

const 成员函数

是为了确认该成员函数可以用于const 对象上

C++ 一个很重要的特性,允许,两个成员函数只是常量性不同的重载

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

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

  • 观察上面的函数,返回的是char 的引用,此时我们才能进行赋值操作,如果不是引用,编译器将提醒:
    左操作数必须为左值

  • 在const 和 non-const 成员函数中避免重复

    • 针对上面的两个operator[] 来说,可以利用const 来实现non-const:
      char & operatorp](std::size_t position){
      return const_cast<char&> (
      static_cast<const TextBlock&>(*this)[position]);}
    • 反过来不行,违反语义

成员函数const 的讨论

  • bitwise const

    • 编译器强制实施的

    • 成员函数只有不更改对象任何成员变量时才可以说是const,不更改成员内的任何一个bit

    • 但是,有些函数仍然可以逃过编译器的检测:
      char& operator[](std::size_t position) const//声明为const 内部也不修改,但,返回值为引用,可通过其进行修改,修改为const char& 的输出可解决此问题

    • 还有一个问题,文中列出一个例子:
      函数成员函数,得到字符长度,它有一个缓存机制,此时,length() 虽然声明为const,但其内部不仅仅需要返回当前长度,还需要修改,缓存的,长度。

      • 解决方案:将需要被修改的变量,声明为:
        mutable std::size_t textLength;// 这些成员变量可能总是会被修改,即使在const 成员函数内部
  • logical constness

    • 一个const 成员函数可以修改它所处理的对象内的某些bits,但只有在客户端检测不到的情况下才能如此。

      • 这就是上面的,mutable 用法

总结

将某些东西声明为const 可帮助编译器侦测出错误用法。可用于任何作用域内的对象、函数、函数返回类型、成员函数本体

编译器强制实施bitwise constness,但编写程序时应该使用概念上的常量性

当const 和 non-const 成员函数有实质等价的实现,令non-const 版本调用const 版本可避免代码重复

猜你喜欢

转载自blog.csdn.net/qq_18218335/article/details/84672543