条款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的更多相关文章

  1. [已读]编写高质量代码 改善JavaScript程序的188个建议

    吐槽一万遍,买的最后悔的一本,没有之一,大量篇幅抄袭<高性能javascript>,我记得还有部分抄袭<javascript精粹>,<javascript模式>有没 ...

  2. 《编写高质量代码改善JavaScript程序的188个建议》读书笔记

    逗号运算符比较怪异.如    var a =(1,2,3,4);alert(a);// 4      var a = 1,2,3,4;//报错 注意a++和++a的差别,变量在参与运算中不断地变化.v ...

  3. 编写高质量代码改善java程序的151个建议——导航开篇

    2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...

  4. 编写高质量代码:改善Java程序的151个建议 --[117~128]

    编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...

  5. 编写高质量代码改善C#程序的157个建议——建议150:使用匿名方法、Lambda表达式代替方法

    建议150:使用匿名方法.Lambda表达式代替方法 方法体如果过小(如小于3行),专门为此定义一个方法就会显得过于繁琐.比如: static void SampeMethod() { List< ...

  6. 编写高质量代码改善C#程序的157个建议——建议140:使用默认的访问修饰符

    建议140:使用默认的访问修饰符(我不太赞成作者的这个观点,这样减少的代码基本可以忽略不计,但是,如果把访问修饰符补充完整,反而会使代码更加易读.我认为自己写代码时应该尽量加上访问修饰符,看别人写的代 ...

  7. 编写高质量代码改善C#程序的157个建议——建议25:谨慎集合属性的可写操作

    建议25:谨慎集合属性的可写操作 如果类型的属性中有集合属性,那么应该保证属性对象是由类型本身产生的.如果将属性设置为可写,则会增加抛出异常的几率.一般情况下,如果集合属性没有值,则它返回的Count ...

  8. 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符

    建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: ; ; int total = x + y; 而不是用下面的语法来完成一样的事情: ...

  9. 博友的 编写高质量代码 改善java程序的151个建议

    编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html

  10. 编写高质量代码改善C#程序的157个建议[1-3]

    原文:编写高质量代码改善C#程序的157个建议[1-3] 前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理 ...

随机推荐

  1. Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势

    原创文章,同步首发自作者个人博客转载请务必在文章开头处注明出处. 摘要 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitio ...

  2. appium desktop 版本发布

    Appium Desktop is an open source app for Mac, Windows, and Linux which gives you the power of the Ap ...

  3. SQL Sever数据库的基本操作和它的建立

    SQL数据库: 1.数据库概述 (1) 用自定义文件格式保存数据的劣势. (2) DBMS(DataBase Management System,数据库管理系统)和数据库,平时谈到"数据库& ...

  4. sql 删除重复数据,保留重复数据第一条

      SELECT row=ROW_NUMBER() OVER(PARTITION BY 重复字段一,重复字段二 ORDER BY GETDATE()) ,* FROM 筛选重复表名     具体实现如 ...

  5. android sdk tools 一览

    ANDROID SDK ADKROID SDK的工具划分为两部分,一部分是SDK tools,与平台无关,另一部分是Platform tools支持最新的安卓平台   SDK tools有 SDK m ...

  6. swift -- 类中的方法

    一. 引用类型  类 在类中定义方法 class Person { //属性 var name : String = "" //方法 //实例方法 : 在类里面创建一个方法 fun ...

  7. JavaWeb之Servlet总结

    今天上班居然迟到了,昨天失眠了,看完吐槽大会实在不知道做些什么,刚好朋友给我发了两个JavaWeb的练习项目,自己就又研究了下,三四点才睡,可能周日白天睡的太多了,早上醒来已经九点多了,立马刷牙洗脸头 ...

  8. HTML5学习笔记<一>: 认识H5

    什么是 HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍 ...

  9. 对VC++6.0爱得深沉(二)个性工具的定制

    初始界面看起来很简洁,但是经过一番改造后,你会拥有私人定制的壮丽界面O(∩_∩)O~,让我们开始吧. 1)原有工具的显示隐藏.位置调整: 比如你觉得这个插入图标没什么用,想把这个隐藏,那么你可以打开[ ...

  10. centos6.7搭建DHCP服务器

    centos6.7搭建DHCP服务 2017-03-24 09:47:16 系统环境: centos6.7 安装之前首先使用rpm –qa | grep dhcp查看系统中是否已安装了dhcp软件包. ...