C++ 学习¶
约 1034 个字 预计阅读时间 3 分钟
我在高中阶段打 OI 的时候第一次接触了 C++;那时对 C++ 的掌握差不多就是 C + cin/cout + sort 了。大一下选了 oop,我把 Thinking in C++ 完整地读了一遍,对 C++(尤其是面向对象)有了基本的认识;在此后出于自己的爱好、工程的需要、面试的考察,以及和 27rabbit 等经营鱼肆时的学习,对 C++ 的认识开始深入起来。此时再去反思自己的 C++ 学习,感觉仍然有许多没有完全或者完整理解的地方,学习路径也存在一定问题。因此,我想要展开一次重新学习和整理。
虽然不记得这个概念是从哪里听来的了,但是我认为学习一门知识的重要节点是「自举」。放到 C++ 来说,如果我们了解到一个新的概念并希望学习它时,能比较容易地根据 standard 或者 c++ reference 理解它的各种信息,而不需要去搜索引擎搜索各种讲解,那么我们就算是完成了 C++ 学习的「自举」。
我认为这样的能力比较重要的原因是:首先这种能力说明了我们对于基础概念的理解是达到了基本水平的,同时看「一手」的资料效率也会高很多。我认为达到「自举」的水平并不太难,至少我认为在学校安排的课程时间内足以达到了。所以我也尝试证明一下这种认识——从自己体验和整理一遍开始!
Info
这个课程同样参与了朋辈辅学,录播可以在 B 站 找到!
内容安排¶
初步想的内容(划删除线的是可能延后的内容):
(写好了的就打勾)
- C++ 诞生
- 编程范式
- 引入 oop(list & shape)
- 类 (I): 定义、成员、构造、析构
- 声明与定义
- inline 函数
- 函数默认参数与函数重载(不包含重载解析)
- delegating constructors
- 动态内存分配
- 类 (II): 拷贝赋值
- 运算符重载
- 引用
- I/O stream
- brace initialization
- 转换构造函数
- user-defined conversion function
- const 和 static 成员
- 类 (III): 拷贝构造、SMFs
- copy elision
- const
- cast
- bool
- 模板 (I): 基本知识与 STL 使用
- range-based for loop (C++11); init-statement in range-for (C++20)
- lambda
- auto & return type deduction & trailing return type
- 模板 (II): 理解 STL
- 右值引用和移动语义
- smart pointers
- value categories
- 移动构造与移动赋值
- 类 (IV): 继承与抽象类、访问控制
- final, override
- covariant return types
- inherited constructors
- UB
- signed integers are 2's complement (C++20)
- 初始化
- aggregate
- namespace
- exception
- 模板 (III): 模板进阶
- string
- alias template
- constexpr (C++11); consteval, constinit (C++20)
Topics¶
(已经安排在上面的就打勾了)
- 类 (1979, C with Classes):类与成员、继承、private & public、友元、inline functions
- default arguments,
operator =
overload (1979, C with Classes) - 类 (1985, Release 1.0):虚函数、new & delete、
::
- 函数和运算符重载 (1985, Release 1.0)
- 重载解析
- I/O stream (1985, Release 1.0; C++98)
- string (1985, Release 1.0; C++98)
- 类 (1989, Release 2.0):多继承、抽象类、
const
和static
成员函数、每个类的 new & delete、protected - 类 (1989, Release 2.0):pointers to members
- namespace (1990, ARM)
- exception (1990, ARM)
- 模板 (1990, ARM)
- 类 (C++98):mutable、covariant return types
- 类 (C++98):RTTI
- cast operators (C++98)
- bool (C++98)
- 模板 (C++98):template instantiations、member templates
- STL (C++98):containers, iterators, algorithms, function objects (
std::function
C++11) - 初始化:value initialization (C++03)、 list initialization (C++11)、brace-or-equal initializers (C++11)
- designated initialization (C++20)
- 类 (C++11):defaulted and deleted functions
- 右值引用和移动语义 (C++11)
- 类 (C++11):move constructors and move assignment operators、delegating and inherited constructors
- smart pointers (C++11)
- lambda expressions (C++11); generic lambda (C++14); capture
*this
(C++17) - auto (C++11); return type deduction (C++14)
- range-based for loop (C++11); init-statement in range-for (C++20)
- type aliases (C++11)
- alias template (C++11)
- trailing return type (C++11)
- type traits (C++11)
- constexpr (C++11); consteval, constinit (C++20)
- 一些遗留问题 (C++11): final, override
- nullptr (C++11)
- concurrency support (C++11), memory model (C++11), thread local storage (C++11)
- Parallel algorithms and execution policies (C++17)
- variable template (C++14)
- string_view (C++17)
- inline variables (C++17)
- structured bindings (C++17)
- initializers for if and switch (C++17)
- Order of evaluation
-
std::tuple
,std::any
,std::optional
,std::variant
(C++17) - Class template argument deduction (C++17)
- 3-way comparison (C++20)
- signed integers are 2's complement (C++20)
- modules (C++20)
- UB
- literals
- Explicit object parameter (C++23)
- placement new
- alignas & alignof
- enum
- union
- attribute
- fold expressions
- functional
- Coroutines (C++20)
- explicit(bool) (C++20)