|
本文内容来源于:GitHub - CnTransGroup/EffectiveModernCppChinese: 《Effective Modern C++》- 完成翻译 总结:Modern C++提供了更精准、更便捷的表达方式,尽量使用这些优秀的新特性,一方面让自己的代码避免因为隐式规则导致Bug,另一方面可以提高编码、运行的效率。
1. 优先考虑auto而非显式类型声明
简化代码,避免一些移植和效率性问题,不过注意auto推导若非己愿,使用显式类型初始化惯用法
2. 区别() {}方式创建对象
后者调用的是std::initializer_list方法,前者是构造函数。
3. 指针初始化优先使用nullptr而非0或者NULL
nullptr显式指明它是指针类型的空值,0/NULL存在隐式转换的可能性,表达含义前者更为清晰。
4. 优先考虑using而非typedefs定义类型别名
using更加强大支持模板化,使用更简洁。
5. 优先使用限定域enum::Color而非Color
后者读代码时,很难确定作用域。
6. 优先使用deleted关键词禁用函数(拷贝构造和赋值操作)
相比private方式定义更加清晰,避免友元函数也能访问的Bug。
7. 优先使用override关键词声明重写虚函数
虚函数重写的规则很多,一不留神不满足虚函数重写就犯错了,为了强制编译器检查重写情况,可以加override关键词。
8. noexcept声明对于移动语义、swap、内存释放函数和析构函数非常有用
声明noexcept编译器会少做许多事情,提高效率和性能。
- 简化调用代码,确认不抛出异常的情况下,也能执行一些特殊优化操作。
- 当vector容量调整时,需要移动元素,如果元素的移动拷贝构造函数是noexcept的,那么可以采用move的方式,而不是copy方式,大幅提高效率。
- 应用在移动构造函数、移动复制函数、swap函数场景。
9. 尽量使用constexpr
- constexpr修饰函数或者表达式,可以将函数或者表达式的结果推导为常量,从而用在一些常量限定域的使用场景中,比如数组的维度、模版的参数等。
- 另外是一种很强的约束,更好地保证程序的正确语义不被破坏。
- 比如将用到的constexpr表达式都直接替换成最终结果等。相比宏来说,没有额外的开销,但更安全可靠。
10. 显式按需生成默认函数
C++会缺省生成一些默认函数,比如构造函数、拷贝构造函数等,有时候默认生成的规则还有点问题,建议的办法是当需要生成默认的构造函数时,需要增加=default,显示声明出来。 |
|