读《effective C++》2
条款03:尽可能使用const(Use const whenever possible)
1.const == 奇妙的事
const的一件奇妙的事是,他允许你定义一个约束,(告诉编译器,这是一个“不该被改动的对象”),并且你这样做了之后编译器会协助你执行这条约束,使编译器成为你的助手。
这确实是一件奇妙的事,程序员其实就是在用特定的语言进行说话,而编译器就是你的翻译者,程序员和你的“翻译者”的密切配合才能出好的程序。
2.const语法变化多端(变量上的)
(1)语法
相信用过的人都见过和尝试过这些看着让人头疼的语法了吧。指针和引用都有不同的const语法
const int *p; //
int const *p; //前面两种形式不一样,但是是同一种。都是指针所指向的变量是修饰为常量
int *const p; //const修饰的是指针变量本身,指针变量本身是常量
const int *const p; //合以上两者
这里不得不提一下来自《C++ Templates》作者序的一个说法:
我们都知道int const *p与const int *p 是等同的
但是这里我们更趋向于int const *p
这里提出两点原因:
a.指针对问题“什么是恒定不变的?” int const *p提供很容易理解的答案,“恒定不变的部分”是const限定符前面的int
int const *p //恒定不变的是int (指针所指向整数的部分,整数类型是int)
int* const p //恒定不变的是int*(指针变量本身,指针变量的类型是int*)
提供另外一种理解const指针的方法
b.设计到使用模板时一个常用的语法替换原则
typedef char* CHARS;
typedef CHARS const CPTR; //指向char类型的常量指针(指针本身是不变)
//当我们用CHARS所代表的含义对它进行替换之后
typedef char* const CPTR//任然是char类型的常量指针 //但是当我们把const位置放在前面时,就不在实用了
typedef const CHARS CPTR;//指向char类型的常量指针
//替换之后
typedef const char* CPTR;// 指向常量的char类型的指针
(2)STL迭代器的const
迭代器是以指针为根据塑造出来的,所以迭代器的作用就像T* 指针。
所以声明迭代器为const就像声明指针为const一样(即声明一个T* const指针),迭代器不能指向不同的对象,所指向的对象的值可以改变
std::vector<int> vec;
...
const std::vector<int>::iterator iter = vec.begin(); //iter的作用像个T* const
*iter = ; //改变iter所指向的物
++iter; //错误!!!iter本身是const的 std::vector<int>::const_iterator cIter = vec.begin(); //cIter的作用想个 const T*
*cIter = ; //错误!!!cIter所指向的为const
++cIter; //没问题。
迭代器的使用:const iterator iter; const_iterator iter
(3)const用于函数的返回值和参数值
利用const本身的属性来解决一些不变问题。
3.const成员函数
(1)目的,是为了确认该成员函数可作用于const对象身上。
重要:a.const使你的class接口比较容易被理解,这样可以很清楚的知道哪个函数可以改动对象内容哪个不可以;这很重要
b.它们使“操作const对象”成为可能。(很多时候以pass by reference-to-const方式传递对象),这样可以使const对象呗调用
读《effective C++》2的更多相关文章
- [已读]编写高质量代码 改善JavaScript程序的188个建议
吐槽一万遍,买的最后悔的一本,没有之一,大量篇幅抄袭<高性能javascript>,我记得还有部分抄袭<javascript精粹>,<javascript模式>有没 ...
- 《编写高质量代码改善JavaScript程序的188个建议》读书笔记
逗号运算符比较怪异.如 var a =(1,2,3,4);alert(a);// 4 var a = 1,2,3,4;//报错 注意a++和++a的差别,变量在参与运算中不断地变化.v ...
- 编写高质量代码改善java程序的151个建议——导航开篇
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...
- 编写高质量代码:改善Java程序的151个建议 --[117~128]
编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...
- 编写高质量代码改善C#程序的157个建议——建议150:使用匿名方法、Lambda表达式代替方法
建议150:使用匿名方法.Lambda表达式代替方法 方法体如果过小(如小于3行),专门为此定义一个方法就会显得过于繁琐.比如: static void SampeMethod() { List< ...
- 编写高质量代码改善C#程序的157个建议——建议140:使用默认的访问修饰符
建议140:使用默认的访问修饰符(我不太赞成作者的这个观点,这样减少的代码基本可以忽略不计,但是,如果把访问修饰符补充完整,反而会使代码更加易读.我认为自己写代码时应该尽量加上访问修饰符,看别人写的代 ...
- 编写高质量代码改善C#程序的157个建议——建议25:谨慎集合属性的可写操作
建议25:谨慎集合属性的可写操作 如果类型的属性中有集合属性,那么应该保证属性对象是由类型本身产生的.如果将属性设置为可写,则会增加抛出异常的几率.一般情况下,如果集合属性没有值,则它返回的Count ...
- 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符
建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: ; ; int total = x + y; 而不是用下面的语法来完成一样的事情: ...
- 博友的 编写高质量代码 改善java程序的151个建议
编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html
- 编写高质量代码改善C#程序的157个建议[1-3]
原文:编写高质量代码改善C#程序的157个建议[1-3] 前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理 ...
随机推荐
- Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势
原创文章,同步首发自作者个人博客转载请务必在文章开头处注明出处. 摘要 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitio ...
- appium desktop 版本发布
Appium Desktop is an open source app for Mac, Windows, and Linux which gives you the power of the Ap ...
- SQL Sever数据库的基本操作和它的建立
SQL数据库: 1.数据库概述 (1) 用自定义文件格式保存数据的劣势. (2) DBMS(DataBase Management System,数据库管理系统)和数据库,平时谈到"数据库& ...
- sql 删除重复数据,保留重复数据第一条
SELECT row=ROW_NUMBER() OVER(PARTITION BY 重复字段一,重复字段二 ORDER BY GETDATE()) ,* FROM 筛选重复表名 具体实现如 ...
- android sdk tools 一览
ANDROID SDK ADKROID SDK的工具划分为两部分,一部分是SDK tools,与平台无关,另一部分是Platform tools支持最新的安卓平台 SDK tools有 SDK m ...
- swift -- 类中的方法
一. 引用类型 类 在类中定义方法 class Person { //属性 var name : String = "" //方法 //实例方法 : 在类里面创建一个方法 fun ...
- JavaWeb之Servlet总结
今天上班居然迟到了,昨天失眠了,看完吐槽大会实在不知道做些什么,刚好朋友给我发了两个JavaWeb的练习项目,自己就又研究了下,三四点才睡,可能周日白天睡的太多了,早上醒来已经九点多了,立马刷牙洗脸头 ...
- HTML5学习笔记<一>: 认识H5
什么是 HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍 ...
- 对VC++6.0爱得深沉(二)个性工具的定制
初始界面看起来很简洁,但是经过一番改造后,你会拥有私人定制的壮丽界面O(∩_∩)O~,让我们开始吧. 1)原有工具的显示隐藏.位置调整: 比如你觉得这个插入图标没什么用,想把这个隐藏,那么你可以打开[ ...
- centos6.7搭建DHCP服务器
centos6.7搭建DHCP服务 2017-03-24 09:47:16 系统环境: centos6.7 安装之前首先使用rpm –qa | grep dhcp查看系统中是否已安装了dhcp软件包. ...