Effective C++ 沉思录
1.视C++是一个联邦语言。由C,Object-Oriented C++,Templete C++,和STL组成。其中面对不同的语言,采用不同的规约这样编程效率会提高很多。例如C和STL 都是有C-Style 的指针塑造出来的,所以采用Pass-by-value 比较适用。而Object-Oriented C++和Templete C++则采用pass-by-reference-to-const比较好。
2.尽量以const,enum,inline 替换#define。
//#define->const //原因: #define MAXNUM 100 若MaxNum出错,则编译器只会显示100这个魔鬼数字。(什么是魔鬼数字详见《C++ Primer》),因为define定义的记号不会被编译器看见。 synbol table不会记下MaxNum这个符号。所以如果在一个庞大的工程中,再根据一个魔鬼数字来寻找出错的地方。 --很蛋疼。 而const不一样。 const int MAXNUM=100; const定义的常量是会进入symbol table的,查找错误也变得更加清晰。
//#define->enum //原因 想过一个问题没有。C++怎么实现在类中(in-class)实现常量的定义。用static?NO~很多旧的编译器不支持~ 对,可以用enum,例如 class Week { enum{SUN,MON,....}//星期一到星期天 //还有,enum定义的是常量,不是变量,所以在以后的代码中也不可以去改变。 }
//#define->inline //原因 #define MAX_CALL(a,b) f((a)>(b)?(a)(b))//根据a,b大小来确定调用f(a)和f(b),明显不好。 改为inline(内联函数)函数。 template<typename T> inline void MAX_CALL(const T&a,const T&b) { f(a>b?a:b); } //总结:单纯的常量可以用const和enum来替换掉#define,而函数宏可以用inline内联函数来替换#define //当然。#define之类的预处理器还没有完全被完全抛弃。
3.尽可能使用const。
//STL是根据C语言的指针塑造出来的。所以声明const std::vector<int>::iterator iter=vec.begin(); //实质是声明了T *const,这个是const-pointer non-const-value。若想声明一个const-value的迭代器,那么 //你需要的是const_iterator.
std::vector<int> ivec; ...... const std::vector<int>::iterator iter = ivec.begin(); *iter=100;//OK 因为T const *,是const-pointer; ++iter// 错误。
std::vector<int>::const_iterator cIter = ivec.begin(); *iter=100;//错误,因为是const T *,是const-value; ++iter//OK。
令函数返回一个常量值。往往可以降低因为客户的低级错误而造成的意外,又不至于放弃安全性和高效性。
class cMath{....} const cMath operator *(const cMath &lhs,const cMath &rhs) { ... }
cMath a,b,c; if(a*b = c)//万一写成这样?不会报错哦。
关于bitwise-constness 和 logical-constness都不再这里赘述,有兴趣可以自己去看看这两个理论。
Effective C++ 沉思录的更多相关文章
- 【C++沉思录】句柄2
1.[C++沉思录]句柄1 存在问题: 句柄为了绑定到Point的对象上,必须定义一个辅助类UPoint,如果要求句柄绑定到Point的子类上,那就存在问题了.2.有没有更简单的办法呢? 句柄使用Po ...
- 【C++沉思录】句柄1
1.在[C++沉思录]代理类中,使用了代理类,存在问题: a.代理复制,每次创建一个副本,这个开销有可能很大 b.有些对象不能轻易创建副本,比如文件2.怎么解决这个问题? 使用引用计数句柄,对动态资源 ...
- 生活沉思录 via 哲理小故事(四)
1.围墙里的墓碑 第一次世界大战期间,驻守意大利某小镇的年轻军官结识了镇上的牧师.虽然军官信仰信教,而牧师是天主教牧师,但两人一见如故. 军官在一次执行任务中身负重伤,弥留之际嘱托牧师无论如何要把自己 ...
- 生活沉思录 via 哲理小故事
本文转载:http://www.cnblogs.com/willick/p/3174803.html 1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛, ...
- 生活沉思录 via 哲理小故事(一)
1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛,但却是失明的. 原来,托蒂刚出生时,这只眼睛轻度感染,曾用绷带缠了两个星期.这对常人来说几乎没有人任何 ...
- Atitit。 沉思录 与it软件开发管理中的总结 读后感
Atitit. 沉思录 与it软件开发管理中的总结 读后感 1. <沉思录>,古罗马唯一一位哲学家皇帝马可·奥勒留所著 2 2. 沉思录与it软件开发管理中的总结 2 2.1. 要有自己的 ...
- C++模板沉思录(上)
花下猫语: 在我们读者群里,最近出现了比较多关于 C++ 的讨论,还兴起了一股学习 C++ 的风气.樱雨楼小姐姐对 C++ 的模板深有研究,系统地梳理成了一篇近 4 万字的文章!本文是上篇,分享给大家 ...
- C++模板沉思录
0 论抽象--前言 故事要从一个看起来非常简单的功能开始: 请计算两个数的和. 如果你对Python很熟悉,你一定会觉得:"哇!这太简单了!",然后写出以下代码: def Plus ...
- 【C++沉思录】代理类
1.考虑下面的场景:设计一个容器,包含一组类型不同但相互关联的对象(比如:Animal,Dog,Cat),对象具备多态行为.2.容器一般只能包含一种类型的对象,使用vector<Animal&g ...
随机推荐
- Hadoop MapReduce概念学习系列之mr程序详谈(二十三)
这个暂时,没写好. K1,v1 这是增强的for循环. for(Sting w : words) { } 迭代器里,前面,放的是什么类型,后面,迭代的是谁.
- python 调用函数
Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://doc ...
- 安装Python
因为Python是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上.在Windows上写Python程序,放到Linux上也是能够运行的. 要开始学习Python编程,首先 ...
- elecworks 电缆型号管理器
部件的命名:系列 导线数x尺寸 (不含保护类型的电线) 或:系列 导线数G尺寸 G(指保护线颜色gr ...
- Windows 窗体启动和关闭的事件顺序
本文系转载学习. 对于关注对 Windows 窗体应用程序中引发的每个事件按次序进行处理的开发人员来说,事件引发的顺序特别重要.当某种情况需要小心处理事件时(如重绘窗体的某些部分时),必须知道事件在运 ...
- 剑指OFFER之第一个只出现一次的字符(九度OJ1283)
题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...
- mysql之存储引擎
1.存储引擎概念 打比方说:一部电影有mp4,wmv,avi,flv...等格式.同样的一部电影在硬盘上有不同的存储格式,所占的空间与清晰程度也各不一样. 那么我们表里的数据存储在硬盘上,是如何存储的 ...
- JNI-数据类型
转载:http://blog.csdn.net/conowen/article/details/7523145 在Java中有两类数据类型:primitive types,如,int, float, ...
- 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- CPU相关信息
unit untCpuInfo;interface{ 获取 CPU 制造商 }function GetCpuFactory: String;{ 获取 CPU 家族系统 }function GetCpu ...