首页
社区
课程
招聘
[分享]《探索现代化C++》泛读笔记摘要2
发表于: 2022-9-8 08:01 3964

[分享]《探索现代化C++》泛读笔记摘要2

2022-9-8 08:01
3964

《探索现代化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";

文件系统库支持拷贝文件,创建符号链接和硬链接,以及重命名目录等。这有利于创造可移植的代码。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//