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 ...
随机推荐
- hdoj 3790 最短路径问题
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- [C语言 - 12] Union联合
union Student { int age; char *name; } stu; union只按照最长的数据成员分配控件,适用于有N个数据不会同时出现的情况,用以压缩空间.
- android系统自带图标集合(android.R.drawable查看)
alert_dark_frame alert_light_frame arrow_down_float arrow_up_float bottom_bar btn_default btn_defaul ...
- 在Win8 Mertro 中使用SQLite
在Win8 Mertro 中使用SQLite 分类: .net 开发 2012-09-19 18:17 1229人阅读 评论(3) ...
- CF 319B Psychos in a Line 【单调队列】
维护一个单调下降的队列. 对于每一个人,只需要找到在他前面且离他最近的可以杀掉他的人即可. #include <cstdio> #include <vector> #inclu ...
- Lotus分析
一 Lotus的任务 Lotus是一个消息通知服务,topic和subscription是多对多的关系.后面我加了一个发送自定义邮件和自定义短信的功能. 产品里面有个监控报警和通知列表.监控报警里创建 ...
- C++ stringstream介绍,使用方法与例子
From: http://www.usidcbbs.com/read-htm-tid-1898.html C++引入了ostringstream.istringstream.stringstream这 ...
- android开发问题汇总
android开发问题汇总 一. 无法创建新android项目 在eclipse创建新项目时出现: this template depends on the android support libra ...
- Java设计模式之策略模式(一)
今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方 ...
- XMl解析之Pull解析
HttpUtils: package cn.qf.parser; import java.io.BufferedOutputStream; import java.io.FileOutputStrea ...