第二篇:尽可能使用 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 目录 译者注 什 ...
随机推荐
- Crontab命令--Linux
Crontab命令--定时任务 命令格式 Example:
- 压测过程中,CPU和内存占用率很高,案例简单分析
Q: 最近公司测试一个接口,数据库采用Mongo 并发策略:并发400个用户,每3秒加载5个用户,持续运行30分钟 数据量:8000条左右 压测结果发现: TPS始终在5左右 ...
- SVN学习(一)——SVN 检出文件步骤、图标显示及含义
May, I come... 1. 创建一个目录用来存放检出得到的文件,例如MyCRM 2. 直接进入目录MyCRM,点右键 3. 可以看到检出得到的文件 此时文件图标上没有任何标识.可能你会想到通过 ...
- MySQL 5.6数据导入报 GTID 相关错误
从阿里云备份数据后还原到本地,用命令行 mysql -uroot -p --default-character-set=<character> -f <dbname> < ...
- MATLAB 的数据类型
在MATLAB中有15种基本的数据类型: 8种整型数据类型.单精度浮点型(float).双精度浮点型(double).逻辑型(logical).字符串型(char).单元数组型(cell).结构体类型 ...
- Spring核心项目及微服务架构方向
spring 顶级项目:Spring IO platform:用于系统部署,是可集成的,构建现代化应用的版本平台,具体来说当你使用maven dependency引入spring jar包时它就在工作 ...
- 深入分析JavaWeb Item22 -- 国际化(i18n)
一.国际化开发概述 软件的国际化:软件开发时,要使它能同一时候应对世界不同地区和国家的訪问,并针对不同地区和国家的訪问.提供对应的.符合来訪者阅读习惯的页面或数据. 国际化(international ...
- SpringCloud系列十四:实现容错的手段
1. 回顾 前面已用Eureka实现了微服务的注册与发现,Ribbon实现了客户端侧的负载均衡,Feign实现了声明式的API调用. 2. 实现容错的手段 如果服务提供者响应非常慢,那么消费者对提供者 ...
- linux杂谈(十一):LDAPserver的搭建
1.LDAP简单介绍 今天我们来介绍LDAPserver的搭建和client的訪问,可是基本的问题在前者.首先我们要知道什么是LDAP. 在日常交谈中.你可能会听到有些人这么说:& ...
- Docker经常使用命令
Usage: docker [OPTIONS] COMMAND [arg...] -H=[unix:///var/run/docker.sock]: tcp://host:port to bind/ ...