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++ 沉思录的更多相关文章

  1. 【C++沉思录】句柄2

    1.[C++沉思录]句柄1 存在问题: 句柄为了绑定到Point的对象上,必须定义一个辅助类UPoint,如果要求句柄绑定到Point的子类上,那就存在问题了.2.有没有更简单的办法呢? 句柄使用Po ...

  2. 【C++沉思录】句柄1

    1.在[C++沉思录]代理类中,使用了代理类,存在问题: a.代理复制,每次创建一个副本,这个开销有可能很大 b.有些对象不能轻易创建副本,比如文件2.怎么解决这个问题? 使用引用计数句柄,对动态资源 ...

  3. 生活沉思录 via 哲理小故事(四)

    1.围墙里的墓碑 第一次世界大战期间,驻守意大利某小镇的年轻军官结识了镇上的牧师.虽然军官信仰信教,而牧师是天主教牧师,但两人一见如故. 军官在一次执行任务中身负重伤,弥留之际嘱托牧师无论如何要把自己 ...

  4. 生活沉思录 via 哲理小故事

    本文转载:http://www.cnblogs.com/willick/p/3174803.html 1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛, ...

  5. 生活沉思录 via 哲理小故事(一)

    1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛,但却是失明的. 原来,托蒂刚出生时,这只眼睛轻度感染,曾用绷带缠了两个星期.这对常人来说几乎没有人任何 ...

  6. Atitit。 沉思录 与it软件开发管理中的总结 读后感

    Atitit. 沉思录 与it软件开发管理中的总结 读后感 1. <沉思录>,古罗马唯一一位哲学家皇帝马可·奥勒留所著 2 2. 沉思录与it软件开发管理中的总结 2 2.1. 要有自己的 ...

  7. C++模板沉思录(上)

    花下猫语: 在我们读者群里,最近出现了比较多关于 C++ 的讨论,还兴起了一股学习 C++ 的风气.樱雨楼小姐姐对 C++ 的模板深有研究,系统地梳理成了一篇近 4 万字的文章!本文是上篇,分享给大家 ...

  8. C++模板沉思录

    0 论抽象--前言 故事要从一个看起来非常简单的功能开始: 请计算两个数的和. 如果你对Python很熟悉,你一定会觉得:"哇!这太简单了!",然后写出以下代码: def Plus ...

  9. 【C++沉思录】代理类

    1.考虑下面的场景:设计一个容器,包含一组类型不同但相互关联的对象(比如:Animal,Dog,Cat),对象具备多态行为.2.容器一般只能包含一种类型的对象,使用vector<Animal&g ...

随机推荐

  1. hdoj 3790 最短路径问题

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  2. [C语言 - 12] Union联合

    union Student {   int age;   char *name; } stu;   union只按照最长的数据成员分配控件,适用于有N个数据不会同时出现的情况,用以压缩空间.

  3. android系统自带图标集合(android.R.drawable查看)

    alert_dark_frame alert_light_frame arrow_down_float arrow_up_float bottom_bar btn_default btn_defaul ...

  4. 在Win8 Mertro 中使用SQLite

    在Win8 Mertro 中使用SQLite 分类:             .net 开发              2012-09-19 18:17     1229人阅读     评论(3)   ...

  5. CF 319B Psychos in a Line 【单调队列】

    维护一个单调下降的队列. 对于每一个人,只需要找到在他前面且离他最近的可以杀掉他的人即可. #include <cstdio> #include <vector> #inclu ...

  6. Lotus分析

    一 Lotus的任务 Lotus是一个消息通知服务,topic和subscription是多对多的关系.后面我加了一个发送自定义邮件和自定义短信的功能. 产品里面有个监控报警和通知列表.监控报警里创建 ...

  7. C++ stringstream介绍,使用方法与例子

    From: http://www.usidcbbs.com/read-htm-tid-1898.html C++引入了ostringstream.istringstream.stringstream这 ...

  8. android开发问题汇总

    android开发问题汇总 一. 无法创建新android项目 在eclipse创建新项目时出现: this template depends on the android support libra ...

  9. Java设计模式之策略模式(一)

    今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方 ...

  10. XMl解析之Pull解析

    HttpUtils: package cn.qf.parser; import java.io.BufferedOutputStream; import java.io.FileOutputStrea ...