C++程序设计
C++ Programming
📖这门课到底讲什么
C++ 程序设计在 C 的基础上引入面向对象与泛型编程:类与对象、构造与析构、拷贝与移动语义、运算符重载、继承与虚函数与多态、模板与 STL 容器算法、异常处理、智能指针与 RAII、以及现代 C++ 特性(auto、lambda、右值引用、并发初步)。它同时拥有底层性能与高层抽象,是游戏引擎、高频交易、图形系统、数据库与大型基础设施的首选语言。学完你应能设计带封装与继承的类层次、用虚函数实现运行时多态、熟练使用 vector/map/unordered_map 与算法库、写出无内存泄漏的 RAII 代码,并理解移动语义与零开销抽象的含义。
🎯为什么必须学好
它是竞赛与算法面试的主流语言(STL 让代码量骤减),也是后台、游戏、量化、音视频岗位的核心技能;面试中虚函数表如何实现多态、C++ 内存模型与智能指针、为什么使用 RAII,都是区分度极高的题。大二学完 C++ 能显著提升数据结构与算法课的实验效率,也为读研做系统研究打下语言基础。掌握现代 C++ 书写规范,是进入工业级代码库的通行证。
📌核心知识清单
- 从 C 到 C++:引用、函数重载与默认参数、命名空间、内联函数、const 正确性
- 类与对象:封装与访问控制、构造函数与析构函数、初始化列表、拷贝构造与赋值运算符、移动构造与右值引用
- 运算符重载与友元:常见运算符(+、==、<<、[])的重载方式与适用场景,避免滥用
- 继承与多态:公有/私有/保护继承、虚函数与虚函数表、纯虚函数与抽象类、虚析构的必要性、多重继承与菱形问题
- 泛型编程与模板:函数模板与类模板、模板特化、可变参数模板简介、编译期计算(constexpr)
- STL 标准库:容器(vector/list/deque/stack/queue/map/set/unordered_map)、迭代器与范围 for、算法库(sort/find/lower_bound)、仿函数与 lambda
- 资源管理与异常安全:RAII 思想、智能指针 unique_ptr/shared_ptr/weak_ptr、异常机制与 noexcept、构造函数异常的安全处理
- 现代 C++ 与工程实践:auto 与类型推导、移动语义与完美转发、结构化绑定、并发基础(thread/mutex)、CMake 构建与单元测试入门
✍️怎么学(可执行步骤)
- 主教材用《C++ Primer(第5版)》,按部分推进,每章示例代码全部敲一遍并改写;配套《Effective C++》与《Effective Modern C++》作为习惯纠正手册
- 用 LeetCode 与洛谷刷题时全程使用 STL,刻意练习 map 计数、priority_queue、sort 自定义比较、lower_bound 二分,尽快形成战斗风格
- 自己实现两个小项目:用类与模板写一个 Matrix 类支持加减乘与转置,写一个简单的日志库用 RAII 与智能指针管理文件句柄
- 用 CMake 组织多文件项目,开启 -Wall -Wextra,用 gdb 与 AddressSanitizer 排查越界与泄漏,养成工程化习惯
📚推荐教材与书籍
最权威的 C++ 入门到进阶教材,第7至16章类设计、模板与 STL 是核心
条目式讲清最佳实践,重点是拷贝/移动语义、智能指针、类型推导与 auto 的陷阱
STL 与标准库完整参考,用容器与算法时按需查阅
讲透 vtable、对象内存布局与构造析构过程,面试多态原理问题的答案来源
🎬视频课程 / 公开课
北京大学与清华大学版本质量高,含大量编程练习
侯捷的 STL 源码剖析与面向对象课程非常经典,适合深度学习
🌐网站与文档
C++ 标准库与语言规则最权威参考,写代码遇到疑问第一站
英文教程站,讲解现代 C++ 规范用法,章节循序渐进
🐙GitHub 开源资料
C++ 核心准则,告诉你哪些写法该避免、为什么,是写出工业级代码的规范手册
现代 C++ 特性速查表,含代码示例,快速了解 C++11 到 C++20 的演进
C/C++ 面试题库,虚函数、内存管理、STL 相关高频问题集合
🧪动手实践任务
实践 1
用类模板实现一个 Matrix 类:支持构造、拷贝与移动、加减乘、转置与打印,用运算符重载让矩阵乘法写成 A*B,并测试移动时未发生深拷贝
实践 2
用智能指针与 RAII 实现一个文件日志器:支持分级日志、自动刷盘、析构时安全关闭,禁止手动 new/delete
实践 3
实现一个简化的 STL 容器:自己写动态数组模板与迭代器,支持 push_back、resize、范围 for,并解释扩容策略为什么按倍数增长
实践 4
用虚函数与抽象类设计一个图形系统:基类 Shape 派生 Circle/Rectangle,通过基类指针容器统一调用 area 与 draw,验证多态行为并打印 vtable 相关现象
🧾考试与面试
💼 面试会怎么考
高频:多态是如何实现的(虚函数表与虚指针,对象内存布局);为什么基类析构函数要声明为虚函数;拷贝构造与赋值运算符的区别、为什么需要三五法则(Rule of 3/5);shared_ptr 的引用计数原理与循环引用问题(weak_ptr);vector 扩容规则与迭代器失效场景;move 语义解决了什么问题;sizeof 空类为什么是 1、结构体对齐规则。手撕常见:手写 shared_ptr、string 类、单例模式。
📝 期末与考研怎么过
期末多为笔试加机考:笔试考类设计(写出一个完整类)、继承与多态的输出判断题、运算符重载与拷贝构造的语义题;机考用 STL 解算法题。备考要点是把拷贝控制(拷贝/赋值/移动/析构)三件套写熟,多态的输出题多练,机考熟悉 vector/map 与排序。目标八十分以上,实用价值高于分数,建议把课后实验当作真正的能力训练。
⚠️ 常见坑
- 用 C 的思维写 C++:到处 new 和裸指针、手写数组与链表而不用 STL,代码又长又容易泄漏
- 忘记虚析构导致通过基类指针删除派生对象时资源泄漏,这是经典面试陷阱也是真实事故来源
- 拷贝与移动语义没搞清,出现意外的深拷贝性能问题或双重释放
- 滥用继承与多重继承,类层次设计混乱;应优先组合而非继承
- 不开启编译警告、不用 AddressSanitizer,越界与悬垂指针问题在演示时才爆发