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 ...
随机推荐
- TCP/IP 相关总结
1. 三次握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等 ...
- RecyclerView设置verticalSapcing等
RecyclerView没有像GridView那样有提供verticalSpacing属性,上StackOverflow找到了一种替代方法,代码如下 public class SpacesItemDe ...
- iphone练习之手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognizer
首先新建一个基于Sigle view Application的项目,名为GestureTest;我的项目结构如下: 往viewController.xib文件里拖动一个imageView,并使覆盖整个 ...
- php做EXCEL数据导出导入开发的一些小问题
前两天刚刚做开发CRM系统项目,在做要做EXCEL导出导入功能,因为以前做.NET开发用的是NPOI,但可是没找到PHP版本的,所以就网搜找了个国外的开源PHPEXCEL , 一开始只是做了简单的导入 ...
- 剑指OFFER之把数组排成最小的数(九度OJ1504)
题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输 ...
- SQLite使用教程4 创建数据库
http://www.runoob.com/sqlite/sqlite-create-database.html SQLite 创建数据库 SQLite 的 sqlite3 命令被用来创建新的 SQL ...
- Java图片上传压缩处理
所需要的jar包在:\jdk1.7.0_25\jre\lib\rt.jar里面 package util; import java.awt.Image; import java.awt.image.B ...
- 教你50招提升ASP.NET性能(三):使用Microsoft的PDBs调试和分析外部的程序集和库
(3)Use Microsoft’s PDBs to debug or profile external assemblies or libraries 招数3: 使用Microsoft的PDBs调试 ...
- Graph(2014辽宁ACM省赛)
问题 F: Graph 时间限制: 1 Sec 内存限制: 128 MB 提交: 30 解决: 5 [cid=1073&pid=5&langmask=0" style=& ...
- (转) 如何在JavaScript与ActiveX之间传递数据1
本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...