为什么读
用比较短的篇幅把C++11到C++20的内容系统了解一下。
这本书的中文版的电子版没有找到,被迫买了实体版。
章节
- 基础
- 用户自定义类型
- 模块化
- 错误处理
- 类
- 基本操作
- 模板
- 概念和泛型编程
- 标准库
- 字符串和正则表达式
- 输入和输出
- 容器
- 算法
- 范围
- 指针与容器
- 实用工具
- 数值计算
- 并发
- 历史与兼容性
- 附录A std模块
基础
最新最时髦的Hello, World!
import std;
int main() {
std::cout << "Hello, World!\n";
}
在我2024年末的这个时间点,要在vs2022的项目属性里设置“C++语言标准: /std:c++latest”和“生成ISO C++23 标准库模块:是”才能成功编译运行。
数字字面量分隔符
int x = 2'147'483'647;
隔壁js用的是下划线x = 1_000_000
。
用户自定义类型
可以用std::variant代替union,里面保存了实际使用的类型。
模块化
写一个模块
// Vector.ixx
export module Vector;
export class Vector {
public:
Vector(int s);
double& operator[](int i) const;
int size() const;
private:
double* elem;
int sz;
};
Vector::Vector(int s) : elem{new double[s]}, sz(s) {
}
double& Vector::operator[](int i) const {
return elem[i];
}
int Vector::size() const {
return sz;
}
export bool operator==(const Vector& v1, const Vector& v2) {
if (v1.size() != v2.size()) {
return false;
}
for (int i = 0; i < v1.size(); i++) {
if (v1[i] != v2[i]) {
return false;
}
}
return true;
}
使用模块
import std;
import Vector;
int main() {
Vector v{ 3 };
std::cout << v.size() << "\n";
}
返回类型后置
建议别用
auto sqrt(double) -> double;
结构化绑定
struct Entry {
string name;
int value;
};
Entry read_entry();
// ...
auto [n,v] = read_entry();
遍历map
map<string, int> m;
for (const auto [key, value] : m) {
// ...
}