前言

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

第二篇:尽可能使用 const的更多相关文章

  1. vue-learning:41 - Vuex - 第二篇:const store = new Vue.Store(option)中option选项、store实例对象的属性和方法

    vuex 第二篇:const store = new Vue.Store(option)中option选项.store实例对象的属性和方法 import Vuex from 'vuex' const ...

  2. 前端工程师技能之photoshop巧用系列第二篇——测量篇

    × 目录 [1]测量信息 [2]实战 [3]注意事项 前面的话 前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇——测量篇 测量信息 在网页制作中需要 ...

  3. 【OpenGL】第二篇 Hello OpenGL

    ---------------------------------------------------------------------------------------------------- ...

  4. Effective C++ 之 Item 3:尽可能使用 const

    Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenev ...

  5. iOS开发——高级技术精选&底层开发之越狱开发第二篇

    底层开发之越狱开发第二篇 今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名: * isJailbroken ...

  6. RabbitMQ学习总结 第二篇:快速入门HelloWorld

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  7. Core Animation 文档翻译 (第二篇)

    Core Animation 文档翻译 (第二篇) 核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系.核心动画不是我们APP内Views的替代品,相反, ...

  8. 小白两篇博客熟练操作MySQL 之 第二篇

    小白两篇博客熟练操作MySQL  之   第二篇 一. 视图 视图是一个虚拟表,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集, 并可以将其当做表来使用. s ...

  9. VueRouter爬坑第二篇-动态路由

    VueRouter系列的文章示例编写时,项目是使用vue-cli脚手架搭建. 项目搭建的步骤和项目目录专门写了一篇文章:点击这里进行传送 后续VueRouter系列的文章的示例编写均基于该项目环境. ...

  10. [翻译]Go与C#的比较,第二篇:垃圾回收

    Go vs C#, part 2: Garbage Collection | by Alex Yakunin | ServiceTitan - Titan Tech | Medium 目录 译者注 什 ...

随机推荐

  1. 在基于or1200处理器的SoC上移植linux

    经历了前端的艰苦奋斗.SoC前端设计已经调试完毕,如今直接进入uboot移植   首先cd入u-boot-master 找到子文件夹include下得de2_115.h文件进行改动: (下一步计划:加 ...

  2. 支付宝支付系统繁忙,请稍后再试(ALI64)错误解决

    解决方法:将商户支付參数的seller邮箱换成与partner同样的数字串,依然无法支付请检查所给參数

  3. Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)

    在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...

  4. 2D游戏平滑的迷雾战争效果

    近期刚好有做2D游戏的点光源效果,然后就扩展一下.研究了一下战争迷雾的效果.主要是想实现相似魔兽争霸那种人物走动,然后黑色的战争迷雾随着人物的移动渐渐打开的效果.使用具有渐变透明图片作为光源来使得战争 ...

  5. 为 jquery validate 添加验证失败回调

    转载自:https://blog.csdn.net/huang100qi/article/details/52619227 1. jquery Validation Plugin - v1.15.1 ...

  6. <转 >socket穿透代理代码(C++版)

    本文转自 http://blog.csdn.net/bodybo/article/details/7274865 写代码经常会遇到socket要通过代理连接服务器的情况,代理类型通畅有三种:HTTP. ...

  7. 工作总结 string类型保存 "" 这种类型

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. PHP经常使用正則表達式汇总

    1.    平时做站点常常要用正則表達式,以下是一些解说和样例,仅供大家參考和改动使用:  2.    "^\d+$" //非负整数(正整数 + 0)  3.    "^ ...

  9. XX年年终总结---重新飞跃

    XX年年终总结---重新飞跃 写之前先解释一下为什么是年终总结,由于在提高班学习,每年结束于暑假:新的一年開始于9月. 肚子里的墨水已经找不到新的词语来形容时间过得快了,一年结束了.还有一年又结束了: ...

  10. HDU 1009:FatMouse&#39; Trade(简单贪心)

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...