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
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/74089
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!