zoukankan      html  css  js  c++  java
  • 第二篇:尽可能使用 const

    前言

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

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

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

    指针的 const 关键字

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

    1 const int *pa = &a;

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

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

    1 int * const pa = &a;

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

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

     迭代器的 const 关键字

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

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

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

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

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

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

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

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

           方法如下:

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

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

    成员函数的 const 关键字

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

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

    啰嗦几句

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

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

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

    小结

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

  • 相关阅读:
    对健康的一些思考
    对提问的一些思考
    UVA 10118 Free Candies(免费糖果)(dp记忆化搜索)
    UVA 10285 Longest Run on a Snowboard(最长的滑雪路径)(dp记忆化搜索)
    UVA 12186 Another Crisis(工人的请愿书)(树形dp)
    UVA 10003 Cutting Sticks(切木棍)(dp)
    UVA 11584 Partitioning by Palindromes(划分成回文串)(dp)
    【洛谷P1144】最短路计数【最短路】
    【洛谷P1144】最短路计数【最短路】
    【洛谷P1144】最短路计数【最短路】
  • 原文地址:https://www.cnblogs.com/muchen/p/6353731.html
Copyright © 2011-2022 走看看