-
-
[分享]《探索现代化C++》泛读笔记摘要2
-
发表于: 2022-9-8 08:01 3950
-
《探索现代化C++》泛读笔记摘要2
Chapter 1 C++ 基础
操作符
- 计算型
1 2 3 4 | 算术类: + + 、 + 、 * 、 % ... Boolean: < = ,! = ,... &&、|| 位运算: ~、<<、>>、&、^、| |
- 赋值型
1 2 | = 、 + = 、... 赋值运算会涉及左值的概念 |
- 程序流
1 2 | ?: , |
- 内存操作
1 2 | new delete |
- 访问
1 2 3 4 | . - > [] * |
- 类型处理
1 2 3 4 | dynamic_cast typeid sizeof alignof |
- 异常处理
1 | throw |
建议总是使用bool 处理逻辑表达式。
不可重载的操作符
1 2 3 4 5 6 7 8 | :: . . * ?: sizeof sizeof... 可变参数模板中会用到的运算符 alignof typeid |
表达式和语句
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分页结构内存区域 6835
- [原创]2022年,工业级EDR绕过蓝图 27739
- [分享]《探索现代化C++》泛读笔记摘要20 完! 7294
- [分享]《探索现代化C++》泛读笔记摘要19 7548
- [原创]摘微过滤驱动回调的研究-续 10122
看原图
赞赏
雪币:
留言: