增加 More Effective c++

This commit is contained in:
huihut 2019-07-10 00:29:50 +08:00
parent 965072b98e
commit 26676e0b6c
2 changed files with 49 additions and 14 deletions

View File

@ -20,6 +20,7 @@
## 📑 目录 ## 📑 目录
* [ C/C++](#-cc) * [ C/C++](#-cc)
* [⭐️ Effective](#-effective)
* [📦 STL](#-stl) * [📦 STL](#-stl)
* [〽️ 数据结构](#-数据结构) * [〽️ 数据结构](#-数据结构)
* [⚡️ 算法](#-算法) * [⚡️ 算法](#-算法)
@ -1171,6 +1172,9 @@ class doSomething(Flyable *obj) // 做些事情
}; };
``` ```
## ⭐️ Effective
### Effective C++ ### Effective C++
1. 视 C++ 为一个语言联邦C、Object-Oriented C++、Template C++、STL 1. 视 C++ 为一个语言联邦C、Object-Oriented C++、Template C++、STL
@ -1229,15 +1233,29 @@ class doSomething(Flyable *obj) // 做些事情
54. 让自己熟悉包括 TR1 在内的标准程序库TR1C++ Technical Report 1C++11 标准的草稿文件) 54. 让自己熟悉包括 TR1 在内的标准程序库TR1C++ Technical Report 1C++11 标准的草稿文件)
55. 让自己熟悉 Boost准标准库 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 specificationsexception 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
> 英文:[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) * 英文:[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)
> 中文:[C++ 风格指南](https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/) * 中文:[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)
### 其他 ### 其他

View File

@ -1136,6 +1136,9 @@ class doSomething(Flyable *obj) // 做些事情
}; };
``` ```
## ⭐️ Effective
### Effective C++ ### Effective C++
1. 视 C++ 为一个语言联邦C、Object-Oriented C++、Template C++、STL 1. 视 C++ 为一个语言联邦C、Object-Oriented C++、Template C++、STL
@ -1194,15 +1197,29 @@ class doSomething(Flyable *obj) // 做些事情
54. 让自己熟悉包括 TR1 在内的标准程序库TR1C++ Technical Report 1C++11 标准的草稿文件) 54. 让自己熟悉包括 TR1 在内的标准程序库TR1C++ Technical Report 1C++11 标准的草稿文件)
55. 让自己熟悉 Boost准标准库 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 specificationsexception 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
> 英文:[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) * 英文:[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)
> 中文:[C++ 风格指南](https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/) * 中文:[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)
### 其他 ### 其他