内容从侯捷译版的《Effective C++》(第三版)摘录

条款一

C++作为一个多种范式融合的语言,可以看成是语言的联邦,它包含了一下四种主要的次语言:

  • C。C++以C为基础,很多时候C++对于问题的解法其实不过就是较高级的C解法,但是C语言的局限:没有模板,没有异常处理,没有重载。
  • OO C++。包括类,封装,继承,多态,动态绑定。
  • Template C++。 这是C++范型的部分。
  • STL。包括三个主要部分。容器(containers),迭代器(iterator),算法(algorithm)。

高效编程守则视状况而变化,取决于你使用C++的哪一部分。

条款二 尽量以 const, enum, inline替换#define

原因在于,#define RATIO 1.6, 中被替换的记号名称RATIO可能从来都没有出现在symbol table中,这样给debug带来很多困难。

使用const代替#define作为常量时,需要注意对于字符串的使用,即“从右往左读规则”:

const char* const authorName = "Meyers"

常量的指针变量authorName指向常量的char(s)。

另外,#define不具备封装性,比如作为class的专属常量:

class GamePlayer{
private:
static const int NumTurns = ;
int scores[NumTurns];
...
};

然而以上的申明式不会通过某些编译器,所以需要加入一个定义式:

class GamePlayer{
private:
static const int NumTurns;
int scores[NumTurns];
...
};
const int GamePlayer::NumTurns = ;

还有一种使用"enum hack"补偿做法,利用了emun的特点来代替常量,来限制不可取地址的常量成员变量:

class GamePlayer{
private:
enum{NumTurns = };
int scores[NumTurns];
...
};

使用#define定义函数的缺点太多,例如:

#define CALL_WITH_MAX(a,b) f( (a) > (b) ? (a) : (b) )
int a = , b = ;
CALL_WITH_MAX(++a,b); // a被累加二次
CALL_WITH_MAX(++a,b + ); // a被累加一次 而使用template,代替#define就不需要担心这样的不同:
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a > b ? a : b);
}
  • 对于单纯的常量最好以const对象或者enum代替#define
  • 对于宏函数,最好用inline函数替换#define函数

条款三 尽可能使用const

  • 将某些东西声明为const可帮助编译器侦测出错误用法。
  • 编译器强制使用bitwise constness。bitwise constness指常量成员函数不能改变任何成员变量。Logical constness指的是如果在常量成员函数中或者返回值上又想改变成员变量的值,这个时候可以通过mutable或者const_cast将类的const特性去掉。
  • 在有着实质等价实现的时候,non-const成员函数调用const成员函数可以避免代码重复。

条款四 确定对象被使用前已经被初始化

  • 手动为内置型对象初始化,C++不保证初始化他们。
  • 构造函数最好使用成员初值列(member initialization list)。
  • 为避免跨编译单元初始化次序的问题,以local static对象替换non-local static对象

Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++的更多相关文章

  1. Effective Java 第三版笔记(目录)

    <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时 ...

  2. 《Effective C++》第三版笔记

    阅读此笔记前,请先阅读 <Effective C++>第二版笔记  和  <More Effective C++>笔记 这里只记录与上面笔记不同的条款,主要是 "面对 ...

  3. 《Effective Java 第三版》新条目介绍

    版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...

  4. 《CLR.via.C#第三版》第一部分读书笔记(一)

    最近开始仔细研读<CLR.via.C#第三版>这本书.读pdf文档确实很累.建议有条件的朋友还是买书看吧. 我的笔记用来记录我对这本书的理解,简化下逻辑,对每个部分我觉得是要点的进行归纳总 ...

  5. effective java(第三版)---读书笔记

    第一章 引言 < Effective Java>这本书并不厚,而且并不适合初学者,适合有一定的工作经验的java攻城狮.这本书不是百科全书式的JAVA 手册,而是试图在讲述如何正确.高效地 ...

  6. Effective Java第三版(一) ——用静态工厂代替构造器

    此文做为<Effective Java>系列的第一篇,所以有必要大概说下此书的特点,当然很多人可能都看过,毕竟是有着Java四大名著之一的大名在外,不过总会有萌新不了解,例如我!<E ...

  7. 【转】apue《UNIX环境高级编程第三版》第一章答案详解

    原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...

  8. 《Effective Java 第三版》目录汇总

    经过反复不断的拖延和坚持,所有条目已经翻译完成,供大家分享学习.时间有限,个别地方翻译得比较仓促,希望有疑虑的地方指出批评改正. 第一章简介 忽略 第二章 创建和销毁对象 1. 考虑使用静态工厂方法替 ...

  9. C++学习书籍推荐《Effective C++ 第三版》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)>前两个版本抓住了全世界无数程序员的目光.原因十分明显:S ...

随机推荐

  1. eclipse 自动创建web.xml

    eclipse 自动创建web.xml 以前每次创建web项目的时候,总是从其他的项目中拷贝一个web.xml文件到新项目,然后改吧改吧就可以了,但是这终究是一件麻烦的事,要是能够通过软件自动创建,那 ...

  2. Luogu P2661 [NOIP2015] 信息传递

    qwq 今天做完并查集突然想起来这道以前做的好(shui)题, 虽然是黄题,但是是并查集一个比较特别的用法 这道题大概可以用求最小环的方式来做,但是从直觉上果然还是并查集w 乍一看只要求出“父→子”即 ...

  3. Centos7下完美安装并配置mysql5.6

    Centos7将默认数据库mysql替换成了Mariadb,对于我们这些还想用mysql的人来说并不是一个好消息. 最近我搜罗了网上各种安装教程,各种出问题,要么安装失败,要么安装成功了却使用不了my ...

  4. kubespray 容器存储设备 -- rook ceph

    1./root/kubespray/roles/docker/docker-storage/defaults/main.yml  #在用kubespray部署集群是制定docker用什么设备 dock ...

  5. linux中断源码分析 - 概述(一)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 关于中断和异常 一般在书中都会把中断和异常一起说明,因为它们具有相同的特点,同时也有不同的地方.在CPU里,中断 ...

  6. Linux系列教程(七)——Linux常用命令之帮助和用户管理命令

    上篇博客我们介绍了Linux文件搜索命令,其中find是用的最多的也是功能最强大的文件或目录搜索命令,和另一个搜索命令locate的区别是,find命令是全盘搜索,刚创建的文件也能搜索的到,而loca ...

  7. UVA10720 Graph Construction 度序列可图性

    Luogu传送门(UVA常年上不去) 题意:求一个度序列是否可变换为一个简单图.$\text{序列长度} \leq 10000$ 题目看起来很简单,但是还是有一些小细节需要注意首先一个简单的结论:一张 ...

  8. chrome浏览器直接打印 - z

    在地址栏敲: about:flags ,打开设置界面:停用:Enable Print Preview Registration PromosChrome快捷方式增加:--kiosk-printing这 ...

  9. echarts 响应式布局

    <body> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="width: ...

  10. Part 5:Django测试--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. 本节将简要介绍Django的自动化测试相关内 ...