[Effective cpp]-#3

use const whenever possible

关于const的使用,之前的文章里也做过相似的介绍,但《effective C++》里还是做了一些规则推荐,那就来学习一下。

函数声明

讲道理,之前对这种用法并不熟悉,但书上做了很详细的介绍。令函数返回一个常量值在某些情况下是非常有用的。举个例子,考虑有理数:

1
2
class Rational {};
const Rational operator* (const Rational& lhs, const Rational& rhs);

这样一个重载函数返回的是一个常量值,倘若不加上const关键字,就有可能发生这种情况:

1
2
3
4
Rational a, b, c;
(a * b) = c;//这样做毫无意义
//又或者出现这种情况
if (a*b = c)//也许只是写错

const成员函数

  • 这里需要注意的是如果两个成员函数只是不同,它们是可以被重载的;
  • 由于这个原因,重载的两个成员函数可能会出现代码重复的情况;
  • 因此我们可以这样使用:
1
2
3
4
5
6
7
8
class TextBlock{
public:
const char& operator[](std::size_t position) const{... return text[position];}
private:
char& operator[](std::size_t position){
return const_char<char&>(static_cast<const TextBlock>(*this)[position]);
}
}
  • 通过在non-const operator[]经过两次转换,即可以减少代码量,也可以返回non-const值;
    • non-const转换成const是安全转换;

建议

  • 将某些东西声明为const可以帮助编译器检查出错误的用法;
  • 当const和non-const有着类似的实现时,可以让non-const调用const来避免代码重复;