美·Scott Meyers 侯捷
More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions
红黑树:
从根到每个叶子节点的路径 都包含相同数目的黑链
从根到每个叶子节点的路径 不能包含两个或更多的连续红链
红黑树是引来表示2-3-4树的
每个节点最多保存3个数据
每个非叶结点要么是2节点,要么是3节点,要么是4节点
所有叶子同一层
2-3-4树 BST树 红黑树 都是内部查找树
B-树是外部查找类型
1,仔细区别指针和引用
- 指针使用*和 -> ;引用使用.
- 没有空引用,一个引用总代表一个对象.因此C++规定引用必须有初值,但指针无此限制.
- 指针可以重新赋值指向另一个对象, 引用却总指它最初的那个对象.
- 实现操作符返回值能被当作右值,只能用引用
2,最好使用C++转型
- static_cast 类型
- const_cast 常量性
- dynamic_cast 安全向下转型
- reinterpret_cast 不具移植性
3,不要以多态处理数组
继承的最重要性质之一:通过指向基类对象的指针/引用,来操作子类对象 .如此的子针/引用称其行为是多态的,就像有多重类型似的.数组也可如此,但总非所愿.
基类指针无法删除子类对象构成的数组.C++语言规范示定义.多态和指针算术不能合用.所以数组和多态不能合用.
4,不要提供默认构造
自己定义构造,保证初始化
5,对定制的类型转换函数警觉
explicit 解决隐式转型带来的问题,将构造声明为explicit编译器不能因隐式转换的需要调用它们,显示转换仍然是可以的.
6,区别增量/减量操作符
重载函数是以参数类型来区别的.后置式有一个int 自变量. const UPint operator ++(int); 前置式UPint& operator++ ();
7,不要重载三个操作符&& || ,
8,意义丰富的new delete
请说明 new operator 和 operator new 之差别?
operator new 唯一任务是分配内存,它都不知道什么是构造.取得operator new 返回来的内存 并转换为一个对象 是new operator .
placement new 将它获得的内存指针返回, #include<new>
如果希望内存产生于堆 使用new operator 它分配内存并调用一个构造
如果只是分配内存 使用operator new 它不知道什么是构造
如果在堆内对象产生时自己决定内存分配 写一个自己的operator new, 并使用new operator 自动调用operator new ,
如果打算在已分配的内存中构造对象 使用placement new
9,利用析构避免泄漏
把资源封装在对象内
10,利用构造避免泄漏
C++只析构已经构造完成的对象.
用智能指针取代指针类成员
11,禁止异常流出析构
Destructors that throw and why they're evil.
12,抛异常与传参数与调虚函数
传参和抛异常的方式有三种 by value, by reference , by pointer
- 但调用一个函数控制权最终回到调用端,但抛一个异常控制权不会再回到抛出端.
- 一个对象被抛出作为异常,总是会发生复制.因此抛异常比传参要慢.如果以by value 方式抛出则会复制2次.
- 被抛出的异常对象,允许的类型转换比 传参要少
- 异常catch子句是最先匹配原则,与出现先后顺序相关. 传参时的函数匹配是类型最佳吻合,无关顺序
13,引用捕捉异常
14,异常声明
函数希望抛什么样的异常
15,异常成本
最低消息,存放一些数据结构
try语块
16,80/20
80/20简化你的生活
17,缓式评估
引用计数
区分读写
缓式取出
表达式缓评估
18,分期摊还预期的计算成本
较佳的速度往往导致较大的内存成本,
19,Amortize the cost of expected computations.
临时对象的来源
20, facilitate the return value optimization.
协助完成返回值优化
21, Overlaoad to avoid implicit type conversions.
利用重载来避免隐式转换
22, Consider using op = insetead of standalone op
考虑使用复合操作符
23,conside alternamteive libraries.
使用其它程序库
24,virtual funtions,multiple inheritance, virtaul base classes,runtive type indetification cost
虚函数表virtual tables vtbls 虚表指针virtual table pointers vptrs
凡有虚函数的class其对象都有一个隐藏的data member 用为指向该class 的vtbl.这个隐藏的vptr是虚函数对象的额外代价,如果对象只含4byte,vptr会使它大小加倍.
虚函数不可inlned的成本
RTTI 运行时期类型辨识:根据class 的vtbl来实现.一个class只需要一份RTTI不会增加对象大小
Inside the c++ object mode . by Stanley B.Lippman,AW 1996.
25, virtualizeing constructors and non member functions.
将构造和非成员函数虚化
所谓虚构造是一个函数,视其输入可以产生不同类型的对象.
虚拷贝构造 返回一个指针,指向其调用者的一个新副本.
26,limiting the number of objects of a class
限制某个class产生的对象数量
允许一个或零个对象 单例
函数static 与class static: class static 即使从未用到也会构造,函数static 在函数第一次调用才产生,如果从未调用则不产生.此外,class static 初始化的时机无法保证
27,Requiring or prohibiting heap based object.
要求/禁止对象产生于堆中
阻止客户不得使用new以外的方式产生对象, 构造/析构私有,
判断某个对象是否位于堆内
28,Smart Pointers.
智能指针
构造和的构 复制和赋值 解引
29,Reference counting.
引用计数
30,Proxy classes.
代理类
31,Making functions virtual with respect ot ore than one object.
让虚函数根据一个以上的对象类型 决定如何虚化
32,Progaram in the future tense.
在未来状态下发展程序
33, Make nonleaf classes abstract
非尾端类设计为抽象类
34,Understand how to combine c and c++ in the same
C 和C++相融
35,familiarize yourself with the language.
习惯C++语言