信息层级:【有据可查】= 附官方文档或可信来源链接;【社区共识】= 社区用户普遍经验,未经官方确认;【待考察/推测】= 推测或暂未能核实,请谨慎对待。
权威参考:cppreference、C++ Core Guidelines。【有据可查】
1. C++ 是什么?
【社区共识】C++ 在 C 的基础上加入了类、模板、标准库(STL)、RAII 等。用于游戏引擎(Unreal,见 游戏引擎怎么选:目标平台、学习成本与许可)、高性能计算、浏览器、推理引擎(如 llama.cpp)等。
| 对比 C | C++ 多了什么 |
|---|---|
手动 malloc/free |
RAII + 智能指针,离开作用域自动释放 |
| 字符数组 | std::string |
| 手写数组/链表 | std::vector、std::map 等容器 |
| 函数 | 类、继承、模板、lambda |
2. Hello World
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<std::string> names{"Alice", "Bob"};
for (const auto& n : names) {
std::cout << "Hello, " << n << "!\n";
}
return 0;
}
g++ -std=c++20 -Wall -Wextra -g main.cpp -o main && ./main
3. 现代 C++ 语法速查
| 主题 | 示例 | 说明 |
|---|---|---|
| 自动类型推断 | auto x = 3.14; |
编译器推断类型 |
| 引用 | void f(const std::string& s) |
避免拷贝;const 表示不修改 |
| 范围 for | for (auto& v : vec) |
遍历容器 |
| 类 | class Dog { public: void bark(); private: int age_; }; |
封装 |
| 构造/析构 | Dog() {...} / ~Dog() {...} |
RAII 的基础 |
| 智能指针 | auto p = std::make_unique<Dog>(); |
自动释放;共享用 std::shared_ptr |
| lambda | auto add = [](int a, int b){ return a + b; }; |
匿名函数 |
| 模板 | template<typename T> T max(T a, T b) |
泛型 |
| 命名空间 | namespace game { ... } |
避免重名 |
| 异常 | try { ... } catch (const std::exception& e) { ... } |
错误处理 |
4. 常用标准库
| 头文件 | 常用内容 | 用途 |
|---|---|---|
<iostream> |
std::cout / std::cin / std::cerr |
输入输出 |
<string> |
std::string、.size()、.substr()、.find()、std::to_string |
字符串 |
<vector> |
push_back、emplace_back、size、at(带越界检查) |
动态数组 |
<map> / <unordered_map> |
insert、find、operator[]、contains(C++20) |
字典 |
<algorithm> |
std::sort、std::find、std::count_if、std::max |
算法 |
<memory> |
std::unique_ptr、std::shared_ptr、std::make_unique |
内存管理 |
<optional> |
std::optional<T> |
可能没有值 |
<filesystem> |
std::filesystem::path、exists |
文件路径 |
<chrono> |
计时 | 性能测量 |
<thread> / <mutex> |
线程与锁 | 并发 |
来源:cppreference 标准库头文件【有据可查】
5. 读懂报错:C++ 报错为什么那么长?
【社区共识】模板展开会让一个小错误产生几十上百行报错。诀窍:找第一条 error:,并在长串中寻找"你自己的文件名"那一行。
5.1 常见错误对照表
| 报错关键词 | 常见原因 | 处理 |
|---|---|---|
no matching function for call to ... |
参数类型/个数不对;后面的 note: candidate 列出了可选版本 |
对照 candidate 修改参数 |
no match for 'operator<<' |
试图打印一个没定义输出方式的类型 | 打印其成员,或为该类型重载 << |
'xxx' was not declared in this scope |
缺头文件、缺 std::、拼写错误 |
加 #include 或 std:: 前缀 |
use of deleted function |
试图拷贝不可拷贝的对象(如 unique_ptr) |
用 std::move 或改用引用 |
undefined reference to 'Foo::bar()' |
声明了但没实现,或 .cpp 没参与编译/链接 | 检查实现与构建系统(CMake) |
multiple definition of ... |
在头文件里定义了非 inline 函数/变量 | 移到 .cpp 或加 inline |
terminate called after throwing an instance of 'std::out_of_range' |
运行时 .at() 越界 |
检查下标 |
Segmentation fault |
悬空指针/引用、越界 | -fsanitize=address |
5.2 构建系统报错
【社区共识】中大型项目多用 CMake。CMake Error: Could not find a package configuration file provided by "XXX" 通常表示依赖库未安装或路径没告诉 CMake。
6. 和 AI 协作的提示【社区共识】
- 让 AI 写"现代 C++"(C++17/20)、优先智能指针与标准容器,避免裸
new/delete。 - 贴报错时,只贴第一条 error 及其上下几行 + 你的代码,避免整屏模板噪音。
- Unreal 的 C++ 有大量引擎宏(
UCLASS、UPROPERTY等),报错要结合引擎文档看。
7. 本篇无法核实/需谨慎的点
- MSVC 与 GCC/Clang 报错格式差异较大,本文以 GCC 为例。
- 各编译器对 C++20/23 特性的支持程度随版本变化。
小白练习:把本文流程逐项走通
练习目标:保存并编译一个 C++ 程序,识别第一条真实错误。
上文已介绍概念、配置和操作示例。下面侧重第一次实际操作时的顺序、检查点和结果核对;需要查具体参数时回到对应小节。命令逐条输入,看到上一条的结果后再继续。
-
先运行 g++ --version,确认安装了 C++ 编译器;gcc 与 g++ 的编译、链接默认行为不同。
补充说明:
g++负责 C++ 编译与链接;查看版本输出后,再核对编译器是否支持示例的 C++20 标准。 -
把原文代码保存成 main.cpp,打开扩展名显示,再切换终端到文件所在目录。
补充说明:保存上文完整 Hello World,采用 UTF-8。Windows“另存为”可选“所有文件”,确认实际名称不是
main.cpp.txt。 -
先执行编译命令中 && 左边的部分。出现 error 时先修第一条自己的源码错误,不继续运行旧程序。
补充说明:单独编译的命令为
g++ -std=c++20 -Wall -Wextra -g main.cpp -o main。-std=c++20选择标准,其余参数分别控制警告、调试信息和输出名。 -
编译成功后单独运行生成的程序。Linux 或 Bash 用 ./main,Windows PowerShell 的 Windows 目标通常用 .\main.exe。
补充说明:运行方式取决于终端与编译目标。编译尚未成功时,不要运行目录里以前留下的
main或main.exe。 -
预期按顺序出现 Alice 和 Bob 两行问候。修改名单后重新编译,检查输出是否改变。
补充说明:完整输出应为
Hello, Alice!与Hello, Bob!两行。names保存名字,范围for逐个取出,const auto&通过只读引用访问当前名字,std::cout输出文字。可增加"Carol"后重新编译验证。 -
遇到模板错误时保留第一条 error、指向自己文件的 note 和编译命令,按原文方法一起定位。
补充说明:语法表中的
vec、Dog等是片段对象,需要所在程序的定义;不能逐行追加到 Hello World。报错示例中的标准库文件和自己的源码要分开定位。
