尽可能使用 const

时间:2020-11-29 17:04:55

前言

  const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const。

  但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能。

  因此很多情况下 const 关键字的使用方法也不是简单的 const + 变量,其用法总的来说是比较灵活的。

指针的 const 关键字

  const 关键字出现在 * 左边或是右边定义出来的指针完全不同。

 const int *pa = &a;

  这样的一行代码定义了一个指向整型变量 a 的指针 pa。

  其中 const 关键字的作用是说明你无法通过指针 pa 来修改变量 a 的值,此后 *pa = 1 这样的语句将被编译器报错。

 int * const pa = &a;

  这样的一行代码同样定义了一个指向整型变量 a 的指针 pa。

  但这时 const 关键字跑到 * 右边来了,此时它的意义是说明指针 pa 本身无法发生改变,此后 pa++ 这样的语句将被编译器报错。

 迭代器的 const 关键字

  迭代器其本质,也就是个指针。

  但请看定义某个迭代器的语句:

 std::vector<int>::iterator iter = v.begin();

  这个迭代器指向整型 vector 容器 v 的第一个元素。

  现在问题是,没有出现 * ,那么我如何控制这个指针是指向的元素不变,还是其本身不变呢?

  答案是,如果直接定义 const 迭代器,如下:

 const std::vector<int>::iterator iter = v.begin();

  那么定义出来的指针其限制是指针本身不变,如同 const 放在 * 右边。那么如何定义一个指向内容不变,但指针本身可以变化的 const 迭代器呢?

  方法如下:

 std::vector<int>::const_iterator cIter = v.begin();

  实际使用中你会发现,后一种迭代器使用频率很高,而第一种迭代器基本没啥作用,纯属卖萌的。

成员函数的 const 关键字

  将一个成员函数的声明末尾加上 const 关键字,可以为该成员函数添加一个约束 - 无法改变其所属对象中成员变量的值。

  这个用法很多人会忽略掉,但是它在调试中会发挥到很多意想不到的作用 :)。

啰嗦几句

  1. 运算符的重载函数在很多情况下应当返回 const 类型。

  2. 成员函数的 const 版本和非 const 版本能够实现重载。

  3. const 成员函数的作用更大在于使操作 const 对象成为可能,这一点将在以后的文中提到并细致分析。

小结

  const 是个非常实用的关键字,对我们写出高效而健全的代码很有帮助,应当尽可能的去使用它,发挥它的作用。