C++ 速查表
最后更新
Hello World 和程序结构
程序从 main 开始执行,它返回一个 int。
| 元素 | 代码 |
|---|---|
| 引入头文件 | #include <iostream> |
| 程序入口 | int main() { ... } |
| 打印一行 | std::cout << "Hello, World!" << std::endl; |
| 读取输入 | std::cin >> x; |
| 使用 std 命名空间 | using namespace std; |
| 返回成功 | return 0; |
| 注释 | // line 和 /* block */ |
数据类型
| 类型 | 说明 |
|---|---|
int | 整数(通常为 32 位) |
long / long long | 更宽的整数 |
float / double | 浮点数 |
char | 单字节 / 字符 |
bool | true 或 false |
std::string | 来自 <string> 的动态文本 |
auto | 由编译器推断类型 |
std::size_t | 表示大小和索引的无符号类型 |
变量和引用
引用是别名,指针保存的是地址。
| 操作 | 语法 |
|---|---|
| 声明并初始化 | int x = 5; |
| 花括号初始化 | int x{5}; |
| 常量 | const double PI = 3.14159; |
| 编译期常量 | constexpr int N = 10; |
| 引用(别名) | int &r = x; |
| 指针 | int *p = &x; |
| 解引用指针 | *p = 10; |
| 类型推断 | auto y = 3.14; |
控制流程
| 语句 | 语法 |
|---|---|
| if / else | if (x > 0) { ... } else { ... } |
| switch | switch (n) { case 1: ...; break; default: ...; } |
while 循环 | while (i < n) { ... } |
do-while 循环 | do { ... } while (i < n); |
for 循环 | for (int i = 0; i < n; i++) { ... } |
| 范围 for 循环 | for (auto x : vec) { ... } |
| 按引用的范围 for 循环 | for (auto &x : vec) { ... } |
| break / continue | break; 退出循环,continue; 跳到下一次迭代 |
函数
| 操作 | 语法 |
|---|---|
| 定义函数 | int add(int a, int b) { return a + b; } |
| 无返回值 | void greet() { ... } |
| 默认参数 | int pow(int b, int e = 2) { ... } |
| 按引用传参 | void inc(int &x) { x++; } |
| const 引用(不复制) | void print(const std::string &s) { ... } |
| 函数重载 | int max(int a, int b); 和 double max(double a, double b); |
| Lambda 表达式 | auto f = [](int x) { return x * 2; }; |
| 带捕获的 Lambda | auto g = [n](int x) { return x + n; }; |
类和面向对象
| 操作 | 语法 |
|---|---|
| 定义类 | class Dog { ... }; |
| 访问修饰符 | public:, private:, protected: |
| 成员变量 | std::string name; |
| 构造函数 | Dog(std::string n) : name(n) {} |
| 析构函数 | ~Dog() { ... } |
| 成员函数 | void bark() { ... } |
| 创建对象 | Dog d("Rex"); |
| 继承 | class Puppy : public Dog { ... }; |
| 虚函数 | virtual void speak(); |
STL 容器
标准库中的常用容器。
| 容器 | 用途和示例 |
|---|---|
std::vector<int> | 动态数组:v.push_back(1); v.size(); |
std::string | 文本:s += "!"; s.length(); |
std::array<int, 3> | 带边界信息的定长数组 |
std::map<K, V> | 有序键值对:m["a"] = 1; |
std::unordered_map<K, V> | 哈希表(查找更快,无序) |
std::set<T> | 有序且唯一的值:s.insert(5); |
std::pair<A, B> | 一对值:make_pair(1, "x") |
std::queue / std::stack | 先进先出队列 / 后进先出栈适配器 |
STL 算法和迭代器
来自 <algorithm>,大多数接收一对 begin/end 迭代器范围。
| 操作 | 语法 |
|---|---|
| 起始 / 结束迭代器 | v.begin(), v.end() |
| 排序 | std::sort(v.begin(), v.end()); |
| 降序排序 | std::sort(v.begin(), v.end(), std::greater<int>()); |
| 查找值 | auto it = std::find(v.begin(), v.end(), 5); |
| 统计匹配个数 | std::count(v.begin(), v.end(), 5); |
| 最小 / 最大元素 | std::max_element(v.begin(), v.end()); |
| 区间求和 | std::accumulate(v.begin(), v.end(), 0); |
| 转换每个元素 | std::transform(v.begin(), v.end(), v.begin(), fn); |
智能指针和现代 C++
优先使用智能指针而不是裸 new/delete,内存会自动清理。
| 特性 | 语法 |
|---|---|
| 独占所有权 | auto p = std::make_unique<Dog>("Rex"); |
| 共享所有权 | auto p = std::make_shared<Dog>("Rex"); |
| 非拥有引用 | std::weak_ptr<Dog> w = p; |
| 移动语义 | auto v2 = std::move(v1); |
| 空指针 nullptr | int *p = nullptr; |
| 结构化绑定 | auto [key, val] = *it; |
| 可选值 | std::optional<int> maybe; |
| 模板 | template <typename T> T add(T a, T b) { return a + b; } |
最常用的 C++ 语法、STL 容器和现代特性,全部放在一页上。这份 C++ 速查表是写 C++ 代码时的快速参考:数据类型、引用、类,vector 和 unordered_map 等标准库容器,以及取代裸 new/delete 的智能指针。
这里的内容都是标准 C++(C++11 及以后),可以用 g++ 或 clang++ 编译。复制你需要的代码,或者在 C++ 在线编辑器里直接运行任意代码片段,无需安装编译器。正在学这门语言?Coddy 的免费交互式 C++ 课程会一步步带你掌握指针、STL 和类。
C++ 速查表常见问题
这份 C++ 速查表免费吗?
免费。这份 C++ 速查表完全免费,无需注册。收藏起来,需要查语法、STL 容器或智能指针时随时回来看。
C++ 中指针和引用有什么区别?
*p 解引用。引用(int &r = x)是已有变量的别名:声明时必须绑定,永远不能为空,也不能重新绑定,用起来和变量本身一样。按引用传参时用引用更简洁;需要可选或可重新指向的间接访问时用指针。应该用 new/delete 还是智能指针?
std::unique_ptr 和 std::shared_ptr(通过 make_unique/make_shared 创建)在离开作用域时会自动释放内存,避免了手动 new/delete 带来的内存泄漏和重复释放。只有在有特殊理由的底层代码中,才使用裸 new/delete。可以在线练习 C++ 吗?
可以。打开 C++ 在线编辑器,就能在浏览器里编译并运行这份速查表中的任意代码片段,无需安装编译器。如果你想系统学习,Coddy 的免费交互式 C++ 课程会一步步带你从变量和循环学到类和 STL。
这份速查表适合初学者吗?
适合。它从最常用的基础内容(类型、控制流程、函数)一直讲到进阶内容(STL 和智能指针),你第一天就能用上前面的部分,再慢慢掌握后面的内容。