IE盒子

搜索
查看: 129|回复: 1

Modern C++学习心得笔记(一)

[复制链接]

2

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-1-5 11:03:39 | 显示全部楼层 |阅读模式
本文内容来源于: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,显示声明出来。
回复

使用道具 举报

2

主题

8

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2025-4-20 22:14:51 | 显示全部楼层
路过的帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表