Effective C++(改善编程的55种做法)第二节

来源:互联网 发布:平果怎吗删软件 编辑:程序博客网 时间:2024/05/17 21:21

Use const whenever possible

1.加上const的限制之后,可以预防一些不必要的改动,并且这种检查操作都是编译器做的。

2.分清楚const int *p 和 int * const p的区别:

const int *p 表示p指向的数据是常量不能更改

int * const p表示p是个常指针不能改变它指向的对象。

另外在函数声明当中 void f1(const Widget *p)和void f2(Widget const *p),这两个函数的p其实是一个东西(注意*号的位置)

3.在STL iterator方面,

cosnt std::vector<int>::iterator it1;  //it1的指向不能改变,也就是说it不能用来进行遍历操作

std::vector<int>::const_iterator it2; //ite2所指向的数据不能改变

4.在函数方面来说,const可以用在返回值,调用参数和子函数中。将函数的返回值定义为const可以预防一些偶然的错误。

class Rational{...};

const Rational operator*(const Rational& lhs, const Rational& rhs);

将这个重载(overload)标志符函数的返回值定义为const的好处是:

Rational a,b,c;

...

(a*b)=c;  //!!将c赋值给两个数相乘的值,本身就是无意义的

当我们偶然的进行了上面的操作的时候,其实上面的操作本身是没意义的,而且我们也没想这样操作,但如果发生逻辑错误了,我们可能会检查不出来。但如果将重载函数的返回值定义为const,编译器将会帮我们检查出上面的逻辑错误。

5.定义const member function的好处:

-可以将interface简单化,这样我们会知道哪个函数会改值,而哪个函数不会改值

-只有const memeber function可以和const object结合使用

-const 的限制还可以让我们重载函数 例如:

class TextBlock

{

public:

...

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

   { return text[position]; }

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

   { return text[position]; }

private:

   std::string text;

};

void main()

{

  TextBlock tb("Hello");

   std::cout<<tb[1];

   tb[3]='x';

}

6.当我们定义的const member function有可能要改变类里面某些变量的值的时候,我们需要将那些变量设成mutable例如:

mutable x;

7.总结

-const 可以帮助编译器检查错误,防止程序中一些不必要的问题

-编译器只能实现bitwise的 常量化(constness),但我们也要保证我们的程序在逻辑上也是常量化的

-如果我们const和non-const的子函数有相同的操作的话,women可以通过non-const版本的函数来调用const版本的函数来避免code duplication

原创粉丝点击