第二篇:尽可能使用 const
前言
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的更多相关文章
- 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 ...
- 前端工程师技能之photoshop巧用系列第二篇——测量篇
× 目录 [1]测量信息 [2]实战 [3]注意事项 前面的话 前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇——测量篇 测量信息 在网页制作中需要 ...
- 【OpenGL】第二篇 Hello OpenGL
---------------------------------------------------------------------------------------------------- ...
- Effective C++ 之 Item 3:尽可能使用 const
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenev ...
- iOS开发——高级技术精选&底层开发之越狱开发第二篇
底层开发之越狱开发第二篇 今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名: * isJailbroken ...
- RabbitMQ学习总结 第二篇:快速入门HelloWorld
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- Core Animation 文档翻译 (第二篇)
Core Animation 文档翻译 (第二篇) 核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系.核心动画不是我们APP内Views的替代品,相反, ...
- 小白两篇博客熟练操作MySQL 之 第二篇
小白两篇博客熟练操作MySQL 之 第二篇 一. 视图 视图是一个虚拟表,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集, 并可以将其当做表来使用. s ...
- VueRouter爬坑第二篇-动态路由
VueRouter系列的文章示例编写时,项目是使用vue-cli脚手架搭建. 项目搭建的步骤和项目目录专门写了一篇文章:点击这里进行传送 后续VueRouter系列的文章的示例编写均基于该项目环境. ...
- [翻译]Go与C#的比较,第二篇:垃圾回收
Go vs C#, part 2: Garbage Collection | by Alex Yakunin | ServiceTitan - Titan Tech | Medium 目录 译者注 什 ...
随机推荐
- hbase集群安装和shell操作
1.上传hbase安装包 2.解压 3.配置hbase集群,要修改3个文件(首先zk集群已经安装好了) 注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/ ...
- JMS两种消息模型
前段时间学习EJB.接触到了JMS(Java消息服务),JMS支持两种消息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即点对点和公布订阅模型. ...
- 从webstorm转vscode,来一个vscode的教程和心得总结
背景 在公司跑代码,每天卡的吐血,感觉生命都被浪费了. 再在摧残了一段时间,天天想摔电脑以后,被同事安利vscode, 那就开始搞起来 安装 这个我真的不用说了吧 插件 快捷键 shift + alt ...
- MySQL解释--百度百科
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS ...
- 使用eclipse转换普通项目为web项目
1.在项目上,进入属性(properties) 2.左侧列表项目中选择“Project Facets”,在右侧选择“Dynamic Web Module”和"Java",(如果要修 ...
- Leetcode--easy系列3
#26 Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such th ...
- Codeforces #310ACase of Matryoshkas(模拟)
[题目链接]click here~~ [题目大意]给你n个玩具,规定仅仅能小的玩具套在大的上面.并且是规格依次递增的,比方:1->2->3,求全部玩具套完须要的最小时间花费 [解题思路]: ...
- 转-Cannot refer to an instance field arg while explicitly invoking a constructor
编译失败: Cannot refer to an instance field arg while explicitly invoking a constructor 调用方法时不能引用一个实例变量 ...
- spring boot 打包报错
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.3.0.RELEASE:repac ...
- tomcat各目录下的作用
1.tomcat的主目录下的文件 bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令). 重要: 很多环 ...