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

  • 相关阅读:
    Poj 1742 Coins(多重背包)
    Poj 2350 Above Average(精度控制)
    求二进制数中1的个数
    Poj 1659 Distance on Chessboard(国际象棋的走子规则)
    Poj 2411 Mondriaan's Dream(压缩矩阵DP)
    Poj 2136 Vertical Histogram(打印垂直直方图)
    Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)
    poj 2390 Bank Interest(计算本利和)
    Poj 2533 Longest Ordered Subsequence(LIS)
    Poj 1887 Testing the CATCHER(LIS)
  • 原文地址:https://www.cnblogs.com/muchen/p/6353731.html
Copyright © 2011-2022 走看看