mirror of
https://github.com/huihut/interview.git
synced 2024-03-22 13:10:48 +08:00
增加 More Effective c++
This commit is contained in:
parent
965072b98e
commit
26676e0b6c
32
README.md
32
README.md
|
@ -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 在内的标准程序库(TR1,C++ Technical Report 1,C++11 标准的草稿文件)
|
54. 让自己熟悉包括 TR1 在内的标准程序库(TR1,C++ Technical Report 1,C++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 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
|
||||||
|
|
||||||
> 英文:[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)
|
|
||||||
|
|
||||||
### 其他
|
### 其他
|
||||||
|
|
||||||
|
|
|
@ -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 在内的标准程序库(TR1,C++ Technical Report 1,C++11 标准的草稿文件)
|
54. 让自己熟悉包括 TR1 在内的标准程序库(TR1,C++ Technical Report 1,C++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 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
|
||||||
|
|
||||||
> 英文:[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)
|
|
||||||
|
|
||||||
### 其他
|
### 其他
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user