diff --git a/README.md b/README.md index 0bcd4ea..e4e8eed 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ ## 📑 目录 * [➕ C/C++](#-cc) +* [⭐️ Effective](#-effective) * [📦 STL](#-stl) * [〽️ 数据结构](#️-数据结构) * [⚡️ 算法](#️-算法) @@ -1171,6 +1172,9 @@ class doSomething(Flyable *obj) // 做些事情 }; ``` + +## ⭐️ Effective + ### Effective C++ 1. 视 C++ 为一个语言联邦(C、Object-Oriented C++、Template C++、STL) @@ -1229,15 +1233,29 @@ class doSomething(Flyable *obj) // 做些事情 54. 让自己熟悉包括 TR1 在内的标准程序库(TR1,C++ Technical Report 1,C++11 标准的草稿文件) 55. 让自己熟悉 Boost(准标准库) +### More Effective c++ + +1. 仔细区别 pointers 和 references(当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由 pointers 达成,你就应该选择 references;任何其他时候,请采用 pointers) +2. 最好使用 C++ 转型操作符(`static_cast`、`const_cast`、`dynamic_cast`、`reinterpret_cast`) +3. 绝不要以多态(polymorphically)方式处理数组(多态(polymorphism)和指针算术不能混用;数组对象几乎总是会涉及指针的算术运算,所以数组和多态不要混用) +4. 非必要不提供 default constructor(避免对象中的字段被无意义地初始化) +5. 对定制的 “类型转换函数” 保持警觉(单自变量 constructors 可通过简易法(explicit 关键字)或代理类(proxy classes)来避免编译器误用;隐式类型转换操作符可改为显式的 member function 来避免非预期行为) +6. 区别 increment/decrement 操作符的前置(prefix)和后置(postfix)形式(前置式累加后取出,返回一个 reference;后置式取出后累加,返回一个 const 对象;处理用户定制类型时,应该尽可能使用前置式 increment;后置式的实现应以其前置式兄弟为基础) +7. 千万不要重载 `&&`,`||` 和 `,` 操作符(`&&` 与 `||` 的重载会用 “函数调用语义” 取代 “骤死式语义”;`,` 的重载导致不能保证左侧表达式一定比右侧表达式更早被评估) +8. 了解各种不同意义的 new 和 delete(`new operator`、`operator new`、`placement new`、`operator new[]`;`delete operator`、`operator delete`、`destructor`、`operator delete[]`) +9. 利用 destructors 避免泄漏资源(在 destructors 释放资源可以避免异常时的资源泄漏) +10. 在 constructors 内阻止资源泄漏(由于 C++ 只会析构已构造完成的对象,因此在构造函数可以使用 try...catch 或者 auto_ptr(以及与之相似的 classes) 处理异常时资源泄露问题) +11. 禁止异常流出 destructors 之外(原因:一、避免 terminate 函数在 exception 传播过程的栈展开(stack-unwinding)机制种被调用;二、协助确保 destructors 完成其应该完成的所有事情) +12. 了解 “抛出一个 exception” 与 “传递一个参数” 或 “调用一个虚函数” 之间的差异(第一,exception objects 总是会被复制(by pointer 除外),如果以 by value 方式捕捉甚至被复制两次,而传递给函数参数的对象则不一定得复制;第二,“被抛出成为 exceptions” 的对象,其被允许的类型转换动作比 “被传递到函数去” 的对象少;第三,catch 子句以其 “出现于源代码的顺序” 被编译器检验对比,其中第一个匹配成功者便执行,而调用一个虚函数,被选中执行的是那个 “与对象类型最佳吻合” 的函数) +13. 以 by reference 方式捕获 exceptions(可避免对象删除问题、exception objects 的切割问题,可保留捕捉标准 exceptions 的能力,可约束 exception object 需要复制的次数) +14. 明智运用 exception specifications(exception specifications 对 “函数希望抛出什么样的 exceptions” 提供了卓越的说明;也有一些缺点,包括编译器只对它们做局部性检验而很容易不经意地违反,与可能会妨碍更上层的 exception 处理函数处理未预期的 exceptions) +15. 了解异常处理的成本(粗略估计,如果使用 try 语句块,代码大约整体膨胀 5%-10%,执行速度亦大约下降这个数;因此请将你对 try 语句块和 exception specifications 的使用限制于非用不可的地点,并且在真正异常的情况下才抛出 exceptions) +16. 谨记 80-20 法则(软件的整体性能几乎总是由其构成要素(代码)的一小部分决定的,可使用程序分析器(program profiler)识别出消耗资源的代码) + ### Google C++ Style Guide -> 英文:[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) -> 中文:[C++ 风格指南](https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/) -Google C++ Style Guide 图 - -![Google C++ Style Guide](https://raw.githubusercontent.com/huihut/interview/master/images/GoogleCppStyleGuide.png) - -> 图片来源于:[CSDN . 一张图总结Google C++编程规范(Google C++ Style Guide)](https://blog.csdn.net/voidccc/article/details/37599203) +* 英文:[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) +* 中文:[C++ 风格指南](https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/) ### 其他 diff --git a/docs/README.md b/docs/README.md index 174529d..0f46658 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1136,6 +1136,9 @@ class doSomething(Flyable *obj) // 做些事情 }; ``` + +## ⭐️ Effective + ### Effective C++ 1. 视 C++ 为一个语言联邦(C、Object-Oriented C++、Template C++、STL) @@ -1194,15 +1197,29 @@ class doSomething(Flyable *obj) // 做些事情 54. 让自己熟悉包括 TR1 在内的标准程序库(TR1,C++ Technical Report 1,C++11 标准的草稿文件) 55. 让自己熟悉 Boost(准标准库) +### More Effective c++ + +1. 仔细区别 pointers 和 references(当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由 pointers 达成,你就应该选择 references;任何其他时候,请采用 pointers) +2. 最好使用 C++ 转型操作符(`static_cast`、`const_cast`、`dynamic_cast`、`reinterpret_cast`) +3. 绝不要以多态(polymorphically)方式处理数组(多态(polymorphism)和指针算术不能混用;数组对象几乎总是会涉及指针的算术运算,所以数组和多态不要混用) +4. 非必要不提供 default constructor(避免对象中的字段被无意义地初始化) +5. 对定制的 “类型转换函数” 保持警觉(单自变量 constructors 可通过简易法(explicit 关键字)或代理类(proxy classes)来避免编译器误用;隐式类型转换操作符可改为显式的 member function 来避免非预期行为) +6. 区别 increment/decrement 操作符的前置(prefix)和后置(postfix)形式(前置式累加后取出,返回一个 reference;后置式取出后累加,返回一个 const 对象;处理用户定制类型时,应该尽可能使用前置式 increment;后置式的实现应以其前置式兄弟为基础) +7. 千万不要重载 `&&`,`||` 和 `,` 操作符(`&&` 与 `||` 的重载会用 “函数调用语义” 取代 “骤死式语义”;`,` 的重载导致不能保证左侧表达式一定比右侧表达式更早被评估) +8. 了解各种不同意义的 new 和 delete(`new operator`、`operator new`、`placement new`、`operator new[]`;`delete operator`、`operator delete`、`destructor`、`operator delete[]`) +9. 利用 destructors 避免泄漏资源(在 destructors 释放资源可以避免异常时的资源泄漏) +10. 在 constructors 内阻止资源泄漏(由于 C++ 只会析构已构造完成的对象,因此在构造函数可以使用 try...catch 或者 auto_ptr(以及与之相似的 classes) 处理异常时资源泄露问题) +11. 禁止异常流出 destructors 之外(原因:一、避免 terminate 函数在 exception 传播过程的栈展开(stack-unwinding)机制种被调用;二、协助确保 destructors 完成其应该完成的所有事情) +12. 了解 “抛出一个 exception” 与 “传递一个参数” 或 “调用一个虚函数” 之间的差异(第一,exception objects 总是会被复制(by pointer 除外),如果以 by value 方式捕捉甚至被复制两次,而传递给函数参数的对象则不一定得复制;第二,“被抛出成为 exceptions” 的对象,其被允许的类型转换动作比 “被传递到函数去” 的对象少;第三,catch 子句以其 “出现于源代码的顺序” 被编译器检验对比,其中第一个匹配成功者便执行,而调用一个虚函数,被选中执行的是那个 “与对象类型最佳吻合” 的函数) +13. 以 by reference 方式捕获 exceptions(可避免对象删除问题、exception objects 的切割问题,可保留捕捉标准 exceptions 的能力,可约束 exception object 需要复制的次数) +14. 明智运用 exception specifications(exception specifications 对 “函数希望抛出什么样的 exceptions” 提供了卓越的说明;也有一些缺点,包括编译器只对它们做局部性检验而很容易不经意地违反,与可能会妨碍更上层的 exception 处理函数处理未预期的 exceptions) +15. 了解异常处理的成本(粗略估计,如果使用 try 语句块,代码大约整体膨胀 5%-10%,执行速度亦大约下降这个数;因此请将你对 try 语句块和 exception specifications 的使用限制于非用不可的地点,并且在真正异常的情况下才抛出 exceptions) +16. 谨记 80-20 法则(软件的整体性能几乎总是由其构成要素(代码)的一小部分决定的,可使用程序分析器(program profiler)识别出消耗资源的代码) + ### Google C++ Style Guide -> 英文:[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) -> 中文:[C++ 风格指南](https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/) -Google C++ Style Guide 图 - -![Google C++ Style Guide](https://raw.githubusercontent.com/huihut/interview/master/images/GoogleCppStyleGuide.png) - -> 图片来源于:[CSDN . 一张图总结Google C++编程规范(Google C++ Style Guide)](https://blog.csdn.net/voidccc/article/details/37599203) +* 英文:[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) +* 中文:[C++ 风格指南](https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/) ### 其他