notes-on-effective-cpp
----------------------
item13 以对象管理资源(RAII)
1)[ Lambda + tr1::function ] VS [ auto_ptr ]
item32 确定你的public继承正确模塑出is-a关系
item35 考虑virtual以外的方案
1)
2)
item
notes-on-more-effective-cpp
---------------------------
item01 指针和引用
1)指针可以指向空值,引用必须在初始化时就指定对象
2)指针可以变更指向的对象,引用从始至终无法改变
item02 尽量使用C++风格的类型转换
1)static_cast<double>(first_number)
2)const_cast<SpecialWidget*>(&csw)
3)dynamic_cast<SpecialWidget*>(pw)
4)reinterpret_cast<FuncPtr>(&do_something)
item03 不要对数组使用多态
@@a[i]的指针算法还很原始
item04 避免无用的缺省构造函数
合理:行为特性与数字相仿的对象被初始化为空值或不确定的值
链表、哈希表等数据结构初始化为空容器
不合理:无意义
禁止缺省构造函数的不方便之处
1)数组
2)无法在许多基于模板的容器类使用
template<class T>
class Array {
public:
Array(int size);
...
private:
T* data;
};
template<class T>
Array<T>::Array(int size)
{
data = new T[size]; //为每个数组元素依次调用T::T()
}
3)虚基类的设计
item16 80-20 rule
@@多数人遇到性能问题时都会信心满满的快速猜出瓶颈所在,
@+通常的后果是陷入越来越深的泥沼中,索性推倒重来,从
@+一开始就使用profiler
item17 Lazy Evaluation
据说具有五年工龄的C++程序员才具有这种意识
1)C++ string类的COW机制
2)惰性数据库读取
item18 over-eager evaluation
1)cache
2)prefetch
item19 临时对象
1)call-by-value
2)call-by-reference-to-const
3)函数返回对象
item20 返回值优化
1)C++11貌似解决了这个问题
@@学习计算机以来第一次觉得这是我们的时代的感觉
item21 通过重载避免隐式类型转换
@@以前从来没见识过这种方法
@@每一个重载的operator必须带有一个用户自定义类型的参数,
@+防止用户定义出类似const Type operator+(int a, int b)
@+这样扰乱内置类型的操作
item22 用operator+=实现operator+
@@以前不熟悉这种用法
item23 考虑变更程序库
@@举了个例子用stdio代替iostream
@+不过貌似通过替代库提升效率的
@+可用性不大
item24 理解虚函数、多重继承、虚基类和RTTI
@@vtable:该类和父类里所有的虚函数指针表
@+ 一个类应该只有一份拷贝
@@ vptr:从对象找到正确vtable的指针
@+ 嵌入到每个对象中
Modern-CPP-design
-----------------
1) policy based class design(编译器策略模式?)
do-it-all接口?
@@面向接口 | 组合优于继承 | 可插拔 == 策略模式??
多重继承是救世主么?
policy接口和class接口的不同?
定义“怎样的语法构造符合其所规范的class”而非“必须实现哪些函数”
@@policy似乎更加贴近设计更加抽象
2)智能指针
使指针具备值语义(比如int)
|-- 拥有权
| |-- Deep Copy(拷贝指针时同时拷贝指向的对象)
| | |-- 保持多态性?vtable中加入clone多态行为
| |
| |-- Copy on Write
| | |-- !!没办法!!
| |
| |-- Reference Counting
| | |-- reference-count放在哪里?
| | | 独立存在 | 简单的wrapper类 | 侵入到被指向对象
| |
| |-- Destructive Copy(std::auto_ptr)
| |-- 转移资源
|
|-- 隐式转换(smart pointer至raw pointer的转换)
| |-- 确定要放弃我们精心实现的管理机制么?GetImpl
|
|-- 相等性和不相等性
|
|-- Checking(初始化空值 | deference前测试)
|
|-- const语义
|
|-- 数组
|
|-- 多线程
声明
template
<
typename T,
template <class> class OwnershipPolicy = RefCounted,
class ConversionPolicy = DisallowConversion,
template <class> class CheckingPolicy = AssertCheck,
template <class> class StoragePolicy = DefaultSPStorage
>
class SmartPtr;
The-Design-and-Evolution-of-C++
-------------------------------
TODO
Google-CPP-style
----------------
class
|-- 构造函数
| |-- 构造函数体绝对不要调用virtual函数或者造成致命错误
|
|-- 缺省构造函数
| |-- 如果没有其他的构造函数,则必须自定义一个构造函数,将
| 成员变量初始化为一个可控连续的状态
|
|-- explicit
| |-- 所有的单参数构造函数必须用explicit限制
| |-- 使用强制转型解决带来的不便
|
|-- 禁止拷贝构造函数和赋值运算符重载
| |-- STL容器中存储智能指针
| |-- 函数以指针或引用形式传递参数
|
|-- 继承
| |-- 实现继承造成基类与子类之间的紧耦合-使用组合代替
|
|-- 接口
|
|-- 操作符重载(禁止)
|
|-- 访问控制(私有)
|
|-- 声明顺序(友元函数放在private中)
| |-- typedefs and enum
| |-- static/const成员
| |-- constructor
| |-- destructor
| |-- method(包括静态方法)
| |-- 数据成员
|
|-- write small and focused functions
Composition-versus-Inheritance
------------------------------
inheritance是is-a的关系
composition是has-a的关系
TODO
转载于:https://www.cnblogs.com/Anney/archive/2012/12/30/2840069.html