-
-
[分享]《探索现代化C++》泛读笔记摘要2
-
发表于: 2022-9-8 08:01 4140
-
《探索现代化C++》泛读笔记摘要2
Chapter 1 C++ 基础
操作符
- 计算型
1 2 3 4 | 算术类:++、+、*、%...Boolean: <=,!=,...&&、||位运算: ~、<<、>>、&、^、| |
- 赋值型
1 2 | =、+=、...赋值运算会涉及左值的概念 |
- 程序流
1 2 | ?:, |
- 内存操作
1 2 | newdelete |
- 访问
1 2 3 4 | .->[]* |
- 类型处理
1 2 3 4 | dynamic_casttypeidsizeofalignof |
- 异常处理
1 | throw |
建议总是使用bool 处理逻辑表达式。
不可重载的操作符
1 2 3 4 5 6 7 8 | ::..*?:sizeofsizeof... 可变参数模板中会用到的运算符alignoftypeid |
表达式和语句
if 语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | double D = q * q / 4.0 + p * p * p / 27.0;if (D > 0.0) { double z1 = ...; complex<double> z2 = ..., z3 = ...; ...}else if (D == 0.0) { double z1 = ..., z2 = ..., z3 = ...; ...}else { // D < 0.0 complex<double> z1 = ..., z2 = ..., z3 = ...; ...} |
空格不影响C++的编译,适当的缩进的方式能很好地反映程序的结构。现在的IDE基本都有自己的C++风格设置方式。
C++17 if语句被扩展,支持在if语句中初始化变量,并使用。
1 2 3 4 5 6 | map<string, double> constants = { {"e",2.7},{"pi",3.14} };if (auto res = constants.insert({ "h", 6.6e-34 }); res.second) cout << "inserted" << res.first->first << " mapping to " << res.first->second << endl;else cout << "entry for " << res.first->first << " already exists.\n"; |
switch语句
C++17 也为switch添加了初始化变量的能力。
Range-Based for 循环
C++11 开始出现
1 2 3 | int primes[] = {2,3,5,7,11,13,17,19};for (int i: primes) std::cout<<i<<" "; |
C++20 支持在Ranged-Based for循环中初始化变量
1 2 | for(int primes[] = {2,3,5,7,11,13,17,19}; int i: primes) std::cout<<i<<" "; |
goto 语句
编写软件时不使用goto语句被称为结构化编程。
错误处理
断言
1 2 3 4 5 6 7 8 | #include <cassert>double square_root(double x){ check_somehow(x>=0); ... assert(result>=0.0); return result;} |
使用断言的好处是我们可以在包含头文件<cassert>之前定义 NDEBUG,让所有的断言消失。
1 2 | #define NDEBUG#include <cassert> |
异常
C++17 介绍了一个关键字 [[nodiscard]] 用来表示函数返回值不应该被抛弃,置之不理。
1 | [[nodiscard]] int read_matrix_file(const char* fname, matrix& A); |
如果直接调用上述函数而不接收其返回值,将会得到一个编译器警告。
C++11 新增限定符一个noexcept
1 | double square_root(double x) noexcept { ... } |
如果这个函数发生异常了,那么将不会抛出异常,程序会被直接终止掉。
静态断言
C++11 如果在编译时期就能检测出来的错误,那么可以使用static_assert
1 | static_assert(sizeof(int) >= 4, "int is too small on this platform for 70000"); |
I/O
格式化
C++20 <numbers> 库中提供了PI的double字面值 std::numbers::pi
1 | std::cout << std::numbers::pi << endl; |
新的格式化方法
C++20 提供了<format>库 但是VS需要将标准设置为最新草案。vs2019的C++20 还不支持std::format。
1 2 3 | std::cout << std::format("this {} a {} example\n", "is", "simple");std::cout << std::format("this {0} a {1} example\n", "is", "simple");std::cout << std::format("this {1} a {0} example\n", "simple", "is"); |
文件系统
C++17 提供了<filesystem>库。
1 2 3 4 5 6 7 8 | namespace fs = std::filesystem; for (auto& p : fs::directory_iterator(".")) if (is_regular_file(p)) cout << p << " is a regular file.\n"; else if (is_directory(p)) cout << p << " is a directory .\n"; else cout << p << " is neither regular file nor directory\n"; |
文件系统库支持拷贝文件,创建符号链接和硬链接,以及重命名目录等。这有利于创造可移植的代码。
赞赏
他的文章
- 定位Windows分页结构内存区域 7582
- [原创]2022年,工业级EDR绕过蓝图 29583
- [分享]《探索现代化C++》泛读笔记摘要20 完! 7596
- [分享]《探索现代化C++》泛读笔记摘要19 7856
- [原创]摘微过滤驱动回调的研究-续 10706
赞赏
雪币:
留言: