🌟 本仓库旨在为学习 C++ 的程序员们提供学习资源导航
💡 涵盖从基础知识到实战项目的资料与示例,帮助你快速入门并逐步进阶!
- 零基础编程小白
- 在校计算机相关专业学生
- 其他语言转 C++ 开发者
- 需巩固基础、补充面试知识点的初级 C++ 工程师
- 核心优势:性能高效、跨平台、应用场景广泛(后端 / 服务器、嵌入式、游戏开发等)
- 就业前景:互联网、金融科技、物联网、汽车电子等主流行业岗位需求稳定,稀缺性强,薪资溢价明显。
- 生态成熟:STL/Boost等库完善,C++17/20新特性降低开发门槛,经典不过时。
- 技术硬核:培养底层思维与性能优化能力,技术迁移性强(适配Go/Rust等);
关于这个问题,请参考:
目标:搭建开发环境,编译并运行第一个 C++ 程序
- Windows(MinGW + VS Code)
- macOS(Xcode 命令行工具)
- Linux(GCC/Clang)
若尚未完成此步骤或遇到问题,请参考 C++ 开发环境搭建指南。
目标:掌握基础语法,理解编译流程,规避常见陷阱
核心知识点:
- 变量、数据类型、运算符、控制流、函数、数组、字符串
- 指针与引用基础、const/volatile/static 基础用法
- 编译与链接、头文件保护机制
- CMake 基础(多文件项目)
目标:设计规范类,理解多态机制
学习模块:
- 类与对象、构造函数/析构函数
- 拷贝/移动语义、深拷贝 vs 浅拷贝
- 继承、虚函数、虚函数表(vtable)
- 静态成员、友元、模板基础
目标:编写地道、高效的代码
核心知识点:
- 全量 STL 容器与算法
- 迭代器及失效场景
- Lambda 表达式、auto、范围 for、智能指针
- 异常处理、文件 IO
目标:开发生产级核心组件
核心知识点:
- RAII 与智能指针深度解析
- 多线程编程(std::thread、互斥锁、条件变量、原子操作)
- 线程池实现
- Socket 编程(TCP/UDP)
- 设计模式、调试与性能分析
重点项目
目标:自信应对技术面试
- 全知识点复盘
- 150+ 高频面试题训练
- 项目讲解与模拟面试
| 周数 | 阶段 | 推荐资源 | 阶段任务 |
|---|---|---|---|
| 第0周 | 阶段0 | C++ 开发环境搭建指南或清晰易懂的C++开发环境搭建教程 | 完成开发环境搭建 |
| 第1-3周 | 阶段 1 | 黑马程序员 | 完成3个demo放GitHub |
| 第4-7周 | 阶段 2 | 《C++ Primer Plus》 | 学生/图书管理系统完整版 |
| 第7-9周 | 阶段 3 | 《Effective Modern C++》 | 词频统计工具 |
| 第10-15周 | 阶段 4 | 重点项目三选一或实战项目中选一个大项目 | 完成项目传GitHub |
| 第16-18周 | 阶段 5 | 牛客/LeetCode C++ 专区 | 高频笔面题 + 项目复盘 |
- 变量与数据类型:整型/浮点型/字符型/布尔型、const、typedef
- 运算符与表达式:算术/关系/逻辑运算符、复合赋值、自增自减(前置和后置)
- 控制流:if-else、switch、for/while/do-while、break/continue、cin/cout+iomanip、namespace
- 函数:定义/声明、值/引用/指针传参、返回值、函数重载、默认参数、lambda简介
- 数组与字符串:一维数组、C风格字符串和std::string(常用操作)
- 指针入门:定义/解引用/取地址、指针与数组/函数、野指针/nullptr、指针和引用(核心区别)
- 类与对象:class/struct区别、成员变量/函数、对象创建(栈/堆)、访问控制(public/private/protected)
- 构造与析构:默认/带参/拷贝/移动构造与移动赋值、析构函数(虚析构必要性)、初始化列表、RAII原则、智能指针初步认识、Rule of Five
- 继承与多态:继承语法、基类/派生类、虚函数、纯虚函数+抽象类、vtable简介
- 运算符重载:赋值/算术/关系/<<运算符、深拷贝和浅拷贝
- 模板基础:函数模板、类模板、STL容器底层关联
- STL:容器(vector/list/map/unordered_map/set)、迭代器(失效场景)、常用算法(sort/find/count/for_each)、lambda配合STL
- 文件IO:文本/二进制文件读写、fstream、文件指针操作、数据持久化
- 异常处理:try-catch/throw、自定义异常类、noexcept
- 内存管理:new/delete、malloc/free区别、智能指针(unique_ptr/shared_ptr/weak_ptr)、内存泄漏避免
- 现代特性:auto、decltype、lambda
- 多线程:std::thread、mutex/lock_guard、condition_variable、atomic、线程池原理、死锁避免
- 网络编程:TCP/UDP基础、Socket编程流程(服务端/客户端)、TCP粘包问题、IO多路复用简介
- 设计模式:单例(线程安全版)、简单工厂/工厂方法、策略模式(适用场景+核心代码)
作用:对模板参数添加清晰、可读性高的约束,替代复杂的 SFINAE。 什么时候用:所有泛型库、自己写模板函数/类时必开。
template<typename T>
concept Integral = std::is_integral_v<T>;
template<Integral T>
T add(T a, T b) { return a + b; }
// 自定义复杂概念
template<typename T>
concept Hashable = requires(T x) {
{ std::hash<T>{}(x) } -> std::convertible_to<std::size_t>;
};
template<Hashable T>
class Cache { /* ... */ };常见坑:概念太严格会导致本来能编译的代码过不去,建议先写宽松概念,再逐步收紧。
作用:函数式风格处理序列,支持延迟计算与管道写法,代码更简洁高效。 什么时候用:任何需要 filter/map/take/drop/sort 的地方。 优势:不产生中间容器,缓存友好,代码量减半。
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto result = v
| std::views::filter([](int x) { return x % 2 == 0; }) // 偶数
| std::views::transform([](int x) { return x * x; }) // 平方
| std::views::take(4); // 前 4 个
for (int x : result) std::cout << x << ' '; // 4 16 36 64作用:轻量级、非拥有权的固定大小数组/容器视图,安全传递连续数据。 什么时候用:函数参数需要“一段连续内存”时,全部改 span。
void process(std::span<const int> data) {
for (int x : data) std::cout << x << ' ';
}
std::vector<int> vec{1, 2, 3};
int arr[] = {4, 5, 6};
process(vec);
process(arr);常见错误:span 保存的是视图,原始数据析构了会悬空。确保生命周期比 span 长。
作用:编写异步/生成器代码更自然,无需回调或线程。
#include <coroutine>
#include <iostream>
struct Generator {
struct promise_type {
int current_value;
std::suspend_always yield_value(int value) {
current_value = value;
return {};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
Generator get_return_object() { return {}; }
void return_void() {}
void unhandled_exception() {}
};
bool next() { /* 实际使用需配合协程库 */ return false; }
int value() { return 0; }
};作用:让成员函数把 this 当作普通参数传,完美解决 CRTP 和递归 lambda 的痛点。
struct Node {
Node* left = nullptr;
Node* right = nullptr;
int height(this Node const& self) {
if (!self.left && !self.right) return 1;
int l = self.left ? self.left->height() : 0;
int r = self.right ? self.right->height() : 0;
return 1 + std::max(l, r);
}
};作用:携带值或错误信息的现代返回值类型,比异常和返回值对更轻量。 适用场景:所有可能失败但不值得抛异常的操作(解析、IO、计算等)。
std::expected<int, std::string> safe_divide(int a, int b) {
if (b == 0) return std::unexpected("division by zero");
return a / b;
}
auto result = safe_divide(42, 7)
.and_then([](int x) { return safe_divide(100, x); })
.value_or(-1);作用:非拥有权的多维数组视图,适合图像、矩阵、科学计算场景。
#include <mdspan>
void print(std::mdspan<const int, std::dextents<size_t, 2>> matrix) {
for (size_t i = 0; i < matrix.extent(0); ++i) {
for (size_t j = 0; j < matrix.extent(1); ++j)
std::cout << matrix(i, j) << ' ';
std::cout << '\n';
}
}作用:基于连续容器的有序映射/集合,缓存友好,查找速度更快。 什么时候用:配置表、字典、频繁查找的小数据集(< 10万条)全换 flat_map。
std::flat_map<std::string, int> m = {
{"apple", 5}, {"banana", 3}, {"orange", 8}
};
// 自动排序,内存连续,适合热点数据作用:原生支持多维数组下标操作,语法更直观。
int arr[3][4][5]{};
arr[1, 2, 3] = 42; // 相当于 arr[1][2][3] = 42;作用:支持模板参数、属性标记,表达能力更强。
auto templated_lambda = []<typename T>(T a, T b) {
return a + b;
};
auto attributed = [] [[nodiscard]] (int x) { return x * x; };| 视频名称 | 链接 |
|---|---|
| 黑马程序员匠心之作 C++教程从0到1入门编程,学习编程不再难 | Bilibili |
| 【整整300集】这绝对是2025年B站最全最细的C++零基础全套教程 | Bilibili |
| C++ Programming Course - Beginner to Advanced | YouTube |
| Full C++ Crash Course for Beginners (2025 Edition) | YouTube |
| C++ FULL COURSE For Beginners | YouTube |
| The Cherno 的 C++ 系列 | YouTube |
| Coding for Everyone: C and C++ Specialization | Coursera |
| C++ For C Programmers, Part A & B | Coursera |
| C++ Programming: Basic Skills | edX |
| Programming Abstractions (CS106B) | YouTube |
| 书籍名称 | 作者 | 难度 | 简介 |
|---|---|---|---|
| 《C++ Primer Plus》(第 6 版) | Stephen Prata | ★★☆☆☆ | 零基础友好,语言通俗、例子贴近生活,从语法到面向对象逐步递进,每章配套练习题。适合纯新手稳步搭建基础,唯一不足是未涵盖 C++11+ 现代写法。 |
| 《C++ Primer》(第 6 版) | Stanley B. Lippman 等 | ★★★☆☆ | 全面系统的 C++ 圣经,覆盖语法、STL 及 C++11+ 现代特性,强调实战实践。知识点密度高、讲解深入,比第 5 版更易入门,适合有基础后夯实体系或进阶现代写法。 |
| 《Accelerated C++》 | Andrew Koenig & Barbara E. Moo | ★★★☆☆ | 项目驱动式快速入门,跳过冗余内容,聚焦高效、规范的实战代码。适合有轻微编程基础、想快速上手项目的学习者。 |
| 《Programming: Principles and Practice Using C++》(第 2 版) | Bjarne Stroustrup(C++之父) | ★★★☆☆ | 兼顾原则与实践,不只是教语法,更侧重培养抽象思维与算法能力。适合想理解 C++ 设计哲学、打好底层逻辑的学习者。 |
| 《Effective C++》(第 3 版) | Scott Meyers | ★★★★☆ | 提炼 55 条核心最佳实践,直指代码陷阱。是初学者向中级进阶的必备读物,能快速提升代码质量。 |
| 《The C++ Programming Language》(第 4 版) | Bjarne Stroustrup(C++之父) | ★★★★★ | 官方权威参考手册,详尽覆盖 C++ 标准及高级特性(含现代特性)。适合各阶段开发者查阅。 |
| 《Modern C++ Design》 | Andrei Alexandrescu | ★★★★★ | 深入讲解模板元编程与泛型设计模式,聚焦高阶开发技巧。仅针对有丰富经验的 C++ 程序员,新手慎入。 |
难度指数:
★☆☆☆☆ ~ ★★☆☆☆:纯新手可直接阅读
★★★☆☆:需具备一定基础 + 每日编码练习
★★★★☆ ~ ★★★★★:仅限中高级水平学习者
| 书籍名称 | 作者 | 简介 |
|---|---|---|
| A Complete Guide to Programming in C++ | Ulla Kirchartz & Peter Müller | 从零基础到高级,覆盖语法、OOP 和 STL,带练习和参考。 |
| Beginning C++ Programming | Ivor Horton | 入门指南,逐步讲解语法、函数和类,适合初学者。 |
| C++ Tutorial | IISc Bangalore | 简明教程,焦点基础语法、指针和文件 IO,大学讲义风格。 |
| CS 200: Concepts of Programming using C++ (Spring 2025) | Rachel Wil Singh | 2025 课程笔记,覆盖基础概念、数据结构和调试。 |
| C++ Annotations (Version 11.0) | Frank B. Brokken | 全面参考书,详细 OOP、多线程和现代特性,免费开源。 |
| 网站名称 | 简介 |
|---|---|
| 菜鸟教程 | 中文在线C++教程平台,提供从基础语法到高级主题的互动学习资源,适合零基础初学者。 |
| LearnCpp.com | 免费的英文C++教程网站,强调最佳实践和常见错误,避免,覆盖核心概念到现代C++特性。 |
| CPlusPlus.com | 全面的C++参考手册和教程,包括语法解释、示例代码和论坛讨论,适合自学者和开发者。 |
| GeeksforGeeks | 编程知识库,提供C++算法、数据结构和面试题的详细文章与代码片段,面向求职者。 |
| Codecademy | 互动式C++学习路径,通过浏览器编码练习基础到中级技能,结合项目实践。 |
| Coursera | 大学级C++在线课程集合,如加州大学和密歇根大学的专项,包含视频、测验和证书。 |
| CppReference | 权威的C++标准库在线参考文档,精确描述API、模板和语言特性,适合专业开发者查询。 |
| LeetCode | 算法和编码挑战平台,支持C++提交,提供海量题目用于刷题和面试准备。 |
| GitHub Awesome C++ | 精选C++开源资源列表,包括框架、库、书籍和工具,助力深入探索生态系统。 |
- GCC:开源、跨平台
- Clang/LLVM:现代编译器,诊断优秀
- MSVC:Windows 原生
- Visual Studio:全功能 IDE
- CLion:智能 IDE
- VSCode:轻量编辑器
- Code::Blocks:免费开源
- Dev-C++:轻量简单
- Git:分布式控制
- Clang-Tidy:静态分析
- Cppcheck:检测 bug
- Google Test:单元测试
- Catch2:轻量测试
- Clang-Format:代码格式化
- Valgrind:内存检测
- Perf:性能分析
- Docker:容器部署
| 应用方向 | 核心场景 | 推荐框架/库 |
|---|---|---|
| 桌面应用开发 | 办公软件、工业控制界面、桌面工具、设计类软件 | Qt:跨平台全栈框架,集成 GUI、网络、数据库、多媒体。 MFC:Windows 原生框架,适合 legacy 项目。 wxWidgets:跨平台轻量框架,原生风格。 |
| 嵌入式开发 | 车载中控、智能家居面板、医疗设备、工业控制器、路由器固件 | Qt Embedded:嵌入式 GUI,适配 ARM 等。 FreeRTOS:轻量 RTOS,资源受限设备。 Yocto/Buildroot:Linux 嵌入式系统。 |
| 后端/服务器开发 | 分布式系统、API 网关、数据库内核、高并发服务(游戏服务器、支付系统) | Boost.Asio:异步网络库,TCP/UDP/HTTP。 Muduo:Reactor 模式高并发服务器。 Brpc:RPC 框架,多协议支持。 Drogon:HTTP 框架,异步 IO + ORM。 |
| 游戏开发 | 3A 游戏客户端、游戏引擎、游戏服务器、独立游戏 | Unreal Engine:开源引擎,蓝图系统 + C++。 Cocos2d-x:跨平台 2D 引擎。 Unity:C# 上层 + C++ 优化。 |
| 音视频/流媒体开发 | 播放器、直播推流/拉流、视频编辑、音视频转码、监控安防 | FFmpeg:音视频处理库,解码/编码/传输。 GStreamer:流媒体管道框架。 SDL:多媒体库,音频/渲染。 OpenCV:视频分析(如人脸识别)。 |
| 人工智能/机器学习 | 深度学习框架底层、模型推理优化、高性能计算(HPC) | TensorFlow C++ API:模型部署接口。 LibTorch (PyTorch C++):动态图推理库。 OpenCV:图像预处理/特征提取。 Eigen:矩阵运算库。 ONNX Runtime:跨框架推理引擎。 |
| 系统编程/内核开发 | 操作系统内核、驱动程序、数据库内核、文件系统 | Linux Kernel:内核 API 开发。 WDF/KMDF:Windows 驱动框架。 SQLite:嵌入式数据库内核。 |
| 金融科技/高频交易 | 高频交易系统、量化交易引擎、金融风控系统(要求低延迟、高可靠) | QuickFIX:FIX 协议库。 Boost.Asio:低延迟网络。 |
| 项目名称 | 难度 | 核心技能 |
|---|---|---|
| ocornut/imgui | ★★☆☆☆ | 立即模式 GUI、调试工具 |
| zhuzichu520/FluentUI | ★★☆☆☆ | 现代 Qt + Win11 风格 |
| microsoft/terminal | ★★★★☆ | 大型现代化桌面、GPU 渲染 |
| jurplel/qmc-decode-gui | ★★☆☆☆ | Qt 实用工具、跨平台打包 |
| flameshot-org/flameshot | ★★★☆☆ | 截图工具、Qt + 图像处理 |
| deskflow/deskflow | ★★★★☆ | 多设备鼠标共享、跨平台网络 |
| 项目名称 | 难度 | 核心技能 |
|---|---|---|
| bblanchon/ArduinoJson | ★☆☆☆☆ | 静态内存 JSON |
| lvgl/lvgl | ★★☆☆☆ | 嵌入式 GUI 最强库 |
| zephyrproject-rtos/zephyr | ★★★★☆ | 现代 RTOS、BLE、驱动 |
| platformio/platformio-core | ★★★☆☆ | 嵌入式构建系统 |
| RT-Thread/rt-thread | ★★★★☆ | 国产最强 RTOS、组件化 |
| espressif/esp-idf | ★★★★☆ | ESP32 官方 SDK、低功耗 |
| 项目名称 | 难度 | 核心技能 |
|---|---|---|
| yhirose/cpp-httplib | ★☆☆☆☆ | 单头文件 Web 服务器 |
| drogonframework/drogon | ★★☆☆☆ | 高性能 Web 框架、协程 |
| chenshuo/muduo | ★★★★☆ | Reactor 网络库圣经 |
| apache/brpc | ★★★★☆ | 百度 RPC 框架、bthread |
| Tencent/libco | ★★★★☆ | 协程库(微信后台在用) |
| scylladb/seastar | ★★★★★ | 共享无锁、百万 QPS |
| userver-framework/userver | ★★★★★ | C++20 协程服务框架 |
| 项目名称 | 难度 | 核心技能 |
|---|---|---|
| SFML/SFML | ★☆☆☆☆ | 轻量 2D 游戏库 |
| skypjack/entt | ★★☆☆☆ | ECS 架构 |
| RobLoach/raylib-cpp | ★★☆☆☆ | 极简游戏开发库 |
| TheCherno/Hazel | ★★★★☆ | 从零写游戏引擎(教学级) |
| godotengine/godot | ★★★★☆ | 完整开源引擎 |
| cocos2d/cocos-engine | ★★★★☆ | 国内手游最强引擎 |
| 项目名称 | 难度 | 核心技能 |
|---|---|---|
| obsproject/obs-studio | ★★★★☆ | 实时推流、插件系统 |
| FFmpeg/FFmpeg | ★★★★☆ | 音视频编解码全家桶 |
| bluenviron/mediamtx | ★★★☆☆ | 零依赖流媒体服务器 |
| Haivision/srt | ★★★★☆ | 低延迟传输协议 |
| isl-org/Open3D | ★★★★☆ | 3D 数据处理、点云 |
| 项目名称 | 难度 | 核心技能 |
|---|---|---|
| nlohmann/json | ★☆☆☆☆ | 数据预处理必备 |
| opencv/opencv | ★★★☆☆ | 图像预处理、DNN 模块 |
| Tencent/ncnn | ★★★☆☆ | 手机端推理框架 |
| alibaba/MNN | ★★★★☆ | 阿里移动端推理引擎 |
| microsoft/onnxruntime | ★★★☆☆ | 跨平台模型推理 |
| pytorch/pytorch (LibTorch) | ★★★★☆ | C++ 动态图、自定义算子 |
| 项目名称 | 难度 | 核心技能 |
|---|---|---|
| gabime/spdlog | ★☆☆☆☆ | 高性能日志 |
| sqlite/sqlite | ★★★★☆ | 数据库内核、B-tree |
| facebook/folly | ★★★★★ | Facebook 底层库 |
| microsoft/Detours | ★★★★☆ | Windows Hook |
| ClickHouse/ClickHouse | ★★★★★ | 列式数据库、向量化执行 |
| torvalds/linux | ★★★★★ | 内核开发 |
static 关键字的作用
const 关键字的作用
inline 内联函数和宏定义的区别
explicit 关键字的作用
nullptr 和 NULL 的区别
sizeof 和 strlen 的区别
new 和 malloc 的区别
delete 和 delete[] 的区别
四种 cast 转换
C++ 程序编译链接全过程
struct 和 class 的区别
C 和 C++ 的区别
volatile 关键字的作用
多态是怎么实现的?虚函数表了解吗
基类析构函数为什么必须是虚函数
构造函数能否是虚函数?析构函数可以是纯虚函数吗
重载、重写、重定义的区别
拷贝构造函数和赋值运算符重载的区别
深拷贝和浅拷贝的区别
Rule of Three / Rule of Five
final 和 override 关键字
为什么构造函数不能是虚函数
纯虚函数和虚函数的区别
抽象类和接口的区别
friend 关键字的作用
C++ 中如何防止一个类被继承
C++ 内存分区
堆和栈的区别
内存泄漏怎么检测和定位
什么是野指针、悬空指针?如何避免
RAII 原理
智能指针了解哪些
shared_ptr 实现原理?循环引用怎么解决
unique_ptr 可以拷贝吗
weak_ptr 解决循环引用原理
内存对齐规则
vector 底层实现和扩容机制
iterator 失效场景有哪些
map 和 unordered_map 的区别?什么时候用哪个
unordered_map 哈希冲突怎么解决
set 和 map 的底层实现
emplace_back 和 push_back 区别
常用 STL 算法
list 和 vector 的区别
STL 六大组件
红黑树和 AVL 树的区别
C++11 最重要的几个新特性
移动语义和完美转发
std::move 的作用
std::forward 的作用
lambda 表达式底层实现
noexcept 的作用
auto 和 decltype 的区别
右值引用和左值引用的区别
std::atomic 原理?a++ 是原子操作吗
死锁产生的四个条件?如何避免
线程安全单例怎么写
mutex、condition_variable 怎么配合使用
线程同步方式有哪些
进程和线程的区别
TCP 和 UDP 的区别?适用场景?
select、poll、epoll 的区别与原理
什么是粘包/拆包?如何解决?
TCP 三次握手、四次挥手
手撕线程安全单例
手撕 LRU Cache
手撕快速排序
手撕归并排序
手撕字符串反转
手撕两数之和