条款01:视C++为一个语言联邦

C++是个多重范型编程语言,一个同时支持面向过程形式、面向对象形式、函数形式、泛型形式、元编程形式的寓言。

将C++视为几个子语言:

传统C:区块、语句、预处理器、内置数据类型、数组、指针。没有模板、没有异常、没有重载。

面向对象C++:类(包括构造函数析构函数)、封装、继承、多态、虚函数。

Template C++:泛型编程、模板元编程。

STL:容器、迭代器、算法、函数对象(仿函数)。

记住:

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

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

用编译器代替预处理器。#define不被视为语言的一部分,所使用的名称不进入记号表。

 #define ASPECT_RATIO 1.653
const double AspectRatio = 1.653;
const char* const authorName = "Scott Meyers";
const std::string authorName2("Scott Meyers");
class GamePlayer {
static const int NumTurns = ;
enum { NumTurns2 = };// 一个属于枚举类型的数值可以当做int使用
int scores[NumTurns];
};
const int GamePlayer::NumTurns;// 需要取地址时不能省略
#define CALL_WITH_MAX(a, b) f((a)>(b)?(a):(b))
template<typename T>
inline void callWithMax(const T& a, const T& b) {
f(a>b?a:b);
}

记住:

对于单纯常量,最好以const对象或enums替换#defines。

对于形似函数的宏,最好改用inline函数替换#defines。

条款03:尽可能使用const

const 允许指定一个不能被改动的约束,而编译器会强制实施这项约束。

const 可以在 classes 外部修饰 global 或 namespace 作用域中的常量,或修饰文件、函数或区块作用于中被声明为 static 的对象。也可以修饰 classes 内部的 static 和 non-static 成员变量。面对指针,也可以指出指针自身、指针所指物或两者都是 const:如果关键字 const 出现在星号左边,表示被指物是常量;出现在星号右边,表示指针自身是常量;出现在星号两边,表示被指物和指针两者都是常量。

STL迭代器声明为 const 相当声明指针为 const,迭代器不得指向不同的东西,但它所指的值是可以改动的。const_iterator 所指的东西不可改动。

在函数声明式内,const 可以和函数返回值、各参数、函数自身(成员函数)产生关联。令函数返回一个常量值,可以避免客户错误造成的意外。将 const 实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上:第一,它使 class 接口比较容易理解;第二,它使操作 const 对象成为可能,以 pass by reference-to-const 方式传递对象。两个成员函数如果只是常量性不同可以被重载。

一个const成员函数可以修改它处理的对象内的某些数据,但只有在客户端侦测不出的情况下才可以,例如高速缓存的文本区块的长度等。mutable 关键字修饰的成员可以被更改。

运用 const 成员函数实现出其 non-const 孪生兄弟来避免代码重复。

记住:

将某些东西声明为 const 可帮助编译器侦测出错误用法。const 可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。

编译器强制实施 bitwise constness,但你编写程序时应该使用 conceptual constness(概念上的常量性)。

条款04:确定对象被使用前已先被初始化

static 对象,其寿命从被构造出来直到程序结束为止,因此 stack 和 heap-based 对象都被排除。这种对象包括 global 对象、定义于 namespace 作用域内的对象、在 classes 内、在函数内、以及在 file 作用域内被声明为 static 的对象。函数内的 static 对象称为 local static 对象,其他 static 对象称为 non-local static 对象。程序结束时 static 对象会被自动销毁,它们的析构函数会在 main() 结束时被自动调用。

编译单元是指产出单一目标文件的那些源码。基本上是单一源码文件加上其所含入的头文件。

多个编译单元内的 non-local static 对象经由模板隐式具现化形成,不能决定正确的初始化次序。

将每个 non-local static 对象搬到自己的专属函数内,该对象在此函数内被声明为 static。这些函数返回一个指向他所含对象的引用,non-local static 对象被 local static 对象替换了。这是单例模式的一个常见实现手法。

C++保证,函数内的 local static 对象会在该函数被调用期间、首次遇上该对象的定义式时被初始化。

记住:

为内置型对象进行手工初始化,因为C++不保证初始化它们。

构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员,其排列次序应该和它们在class中的声明次序相同。

为避免跨编译单元的初始化次序问题,以 local static 对象替换 non-local static 对象。

Effective C++ 笔记一 让自己习惯C++的更多相关文章

  1. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  2. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  3. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  4. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  5. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  6. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  7. java effective 读书笔记

    java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...

  8. Effective STL 笔记 -- Item 6 ~ 7: Container and Object Pointer

    Effective STL 笔记 – Item 6 ~ 7: Container and Object Pointer 中间两次笔记被删掉了,简单补一下: Item 3 中提到如果将对象直接放入容器中 ...

  9. Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记

    Item 5: Know what functions C++ silently writes and calls 在C++中,编译器会自己主动生成一些你没有显式定义的函数,它们包含:构造函数.析构函 ...

随机推荐

  1. CF_91B

    题目意思是这样的:给定n个整数,求第i个数右边的距离它最远的比它小的数的下标之差然后再减1. 这里既然是需要知道距离该数最远的下标,可以从右至左扫描一遍,然后按照单调递减的顺序入栈,即只把比栈顶元素小 ...

  2. 解决qt5窗口不刷新(测试窗口类型,测试窗口属性)

    QApplication::notify #if QT_VERSION >= 0x050000        if (QEvent::Show == pEvent->type())     ...

  3. app:layout_scrollFlags不起作用

    http://stackoverflow.com/questions/31722798/enteralwayscollapsed-does-not-bring-back-the-toolbar-whe ...

  4. linux下出现+ ls --color=auto -l --color=auto...++ echo -ne '\033]0;root@imon-2:~'等

    [root@imon-2 ~]# cd /root/ + cd /root/ ++ echo -ne '\033]0;root@imon-2:~' [root@imon-2 ~]# ll + ls - ...

  5. 神经网络中误差反向传播(back propagation)算法的工作原理

    注意:版权所有,转载需注明出处. 神经网络,从大学时候就知道,后面上课的时候老师也讲过,但是感觉从来没有真正掌握,总是似是而非,比较模糊,好像懂,其实并不懂. 在开始推导之前,需要先做一些准备工作,推 ...

  6. [LeetCode] Interleaving String 解题思路

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...

  7. [bzoj\lydsy\大视野在线测评]题解(持续更新)

    目录: 一.DP 二.图论 1.最短路 2.强连通分量 三.利用单调性维护 四.贪心 五.数据结构 1.并查集 六.数学 1.计数问题 2.数学分析 七.博弈 八.搜索 /////////////// ...

  8. phonegap与微信开放平台接口整合

    在开发phonegap应用的过程中有个需求需要将应用的消息推送到微信上.于是我自己写了一个微信的phonegap插件,并成功整合进了应用. 插件地址:https://github.com/ajccom ...

  9. oracle删除当前用户下所有表

    1.如果有删除用户的权限,则可以: drop user user_name cascade; 加了cascade就可以把用户连带的数据全部删掉. 删除后再创建该用户.--创建管理员用户create u ...

  10. Oracle 字符集的查看和修改

    Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库工具,错误消息,排序次序,日期 ...