C++ Programming
LovisMind · 阅读与思考

C++ Programming

系统跟完的 C++ 课程笔记:从工具链与第一个程序讲到变量、内存模型、指针与引用、泛型以及面向对象设计,每章配可运行示例和常见错误。

22 章

目录

  1. 01第 1 章:开发工具链与第一个 C++ 程序中 / EN整门课原本是一个 31 小时的无分章长视频,本章对应 0:00–1:55:35。内容是把编辑器、编译器与构建配置接到一起,并在 Windows、Linux、macOS 上各跑通一个 C++20 测试程序,最后读懂第一个程序里的 include、main、cout、endl 与 return。2022.02.17
  2. 02第 2 章:注释、错误、语句与函数中 / EN本章对应长视频 1:55:35–3:00:43。从注释与三类错误讲起,建立语句、函数与输入输出流的基本模型,再用一个简化内存模型解释程序是怎样被 CPU 逐条执行的,最后区分核心语言、标准库与 STL。2022.02.17
  3. 03第 3 章:变量、数据类型与进制中 / EN本章对应长视频 3:00:43–4:16:37。先说明变量只是「一块有名字的内存」,再用二进制、八进制、十六进制解释内存里的 0 和 1 怎样变成人可读的数,然后逐一讲清整数、修饰符与浮点数的字节数、取值范围、三种初始化方式与窄化陷阱。2022.02.17
  4. 04第 4 章:布尔、字符与 auto中 / EN本章对应长视频 4:16:37–4:45:33。补齐剩下三种基本类型:bool 只有两个状态并占 1 字节,char 用 ASCII 编码把字符映射成 0–255,auto 让编译器从初始化式推导类型;最后演示初始化之后重新赋值,以及 auto 配合无符号类型时的静默溢出。2022.02.17
  5. 05第 5 章:算术、优先级与逻辑运算中 / EN本章对应长视频 4:45:33–5:55:57。讲清整数除法的截断与取模、表达式的优先级与结合性、前后缀自增自减、复合赋值、比较运算符与逻辑运算符,并解释为什么打印比较结果时必须加括号。2022.02.17
  6. 06第 6 章:输出格式化、数值范围与数学函数中 / EN本章对应长视频 5:55:57–7:03:15。系统讲解 iomanip 的流操纵器:宽度、对齐、填充、进制、浮点格式与精度;再用 limits 查询类型范围、用 cmath 做数学运算,最后解释小于 4 字节的整型在运算时会被提升为 int。2022.02.17
  7. 07条件分支:if、else if、switch 与三元运算符中 / EN这一章讲 C++ 的全部条件控制结构:if 与 else 的语法、嵌套与逻辑运算符的等价写法、else if 链的短路语义、switch 的 break 与贯穿陷阱,以及三元运算符。2022.02.17
  8. 08循环:for、while、do-while 的五个组成部分中 / EN这一章把循环拆成初始化、起点、测试、推进与循环体五部分,讲清 for 的执行顺序与迭代器作用域,再比较 while 与 do-while 在「先判断」和「先执行」上的差别。2022.02.17
  9. 09数组:连续内存、零索引与 C 字符串中 / EN这一章讲数组的声明与初始化、为什么下标从 0 开始、未初始化元素的垃圾值与越界风险;再讲 std::size 与 sizeof 求长度、范围 for 循环,以及字符数组必须空字符结尾才能直接打印的原因。2022.02.17
  10. 10指针、字符指针与程序内存模型中 / EN这一章讲指针如何保存地址、取地址与解引用、为什么所有指针同样大、跨类型赋值为何被拒绝;再讲字符指针与字符串字面量的只读性,以及虚拟内存、栈与堆的分工和 new/delete 的基本用法。2022.02.17
  11. 11动态内存:悬空指针、分配失败、泄漏与动态数组中 / EN这一章讲三类悬空指针及其对策、new 失败时的异常与 nothrow 两种处理、delete 空指针的安全性,以及三种内存泄漏和动态数组 new[]/delete[] 的限制。2022.02.17
  12. 12引用:不能为空的别名,以及它与指针的分工中 / EN这一章把引用与指针逐条对照:引用声明时必须初始化、不能改绑、使用时无需解引用;再讲 const 引用只读的边界,以及用「指向 const 的 const 指针」模拟引用的写法。2022.02.17
  13. 13字符与字符串:cctype、cstring 与 std::string中 / EN先把单个字符当作整数来分类与转换,再用 cstring 处理以空字符结尾的字符数组,最后引出 std::string——它把长度与空字符的管理藏到类型内部。2022.02.17
  14. 14程序如何组装:单一定义规则、函数声明与分离编译中 / EN一个名字在全程序里只能定义一次,类却可以在每个翻译单元各定义一次;函数可以拆成声明与定义,编译器各管一段、链接器负责拼接。这一章把「编译器错误」与「链接器错误」彻底分开。2022.02.17
  15. 15函数参数与返回值:值、指针、引用与输出参数中 / EN按值传递给的是副本,按指针与按引用才能改到调用者的变量;把参数当输出通道是 C 风格接口的常见做法。返回值默认也是拷贝,但编译器会用返回值优化把拷贝省掉。2022.02.17
  16. 16函数重载与 Lambda:同名函数的挑选规则与匿名函数中 / EN重载只允许参数列表不同,返回类型不参与签名;lambda 是一个没有名字的函数对象,用捕获列表拿到外部变量——按值捕获是副本,按引用捕获是别名。2022.02.17
  17. 17模板与 Concepts:从函数蓝图到编译期约束中 / EN函数模板不是代码,而是编译器据以生成实际函数的蓝图;类型推导决定生成哪一份实例,显式模板实参可以覆盖它,特化可以替换默认实现,concepts 则把「这个类型必须支持什么」写进签名。2022.02.17
  18. 18类、构造与析构:从圆柱体到 this 指针中 / EN用 Cylinder 类建立成员变量与成员函数的分工,讲清 public/private 默认规则、构造函数与编译器默认构造、setter/getter、多文件拆分与 include guard、用指针管理对象、析构函数的调用时机与逆序销毁,以及 this 指针的三种用法。2022.02.17
  19. 19struct、对象大小与继承入门中 / ENstruct 与 class 的唯一区别是默认访问级别;对象大小由成员变量决定并受对齐影响;继承把基类作为子对象嵌入派生类,public 继承不改变成员的可见性,protected 让派生类可访问但外部不可见,private 继承则把所有继承来的成员降为私有。2022.02.17
  20. 20继承中的构造、拷贝与名称遮蔽中 / EN用 using 复活被 private 继承遮蔽的成员;派生对象按基类到派生类的顺序分层构造,自定义构造通过初始化列表向基类转发参数;拷贝构造要用切片写法复用基类版本;基类构造函数可用 using 继承但只初始化基类部分;析构顺序与构造相反;同名成员会遮蔽基类版本,需要 Parent:: 显式指定。2022.02.17
  21. 21虚函数与多态:动态绑定、切片与 override中 / ENvirtual 让调用在运行时按真实对象选择版本;多态对象因虚表指针而变大;把派生对象按值存进基类容器会切片,引用不能存进容器,指针与智能指针可以;override 防止签名写错,重载与覆盖会互相遮蔽;多态可以在任意层级建立;静态成员不随继承各自独立;final 限制覆盖与继承;默认参数在编译期绑定,虚析构保证整条链被销毁。2022.02.17
  22. 22dynamic_cast、抽象类与接口中 / ENdynamic_cast 在运行时把基类指针或引用安全地转为派生类型,指针失败返回空指针、引用失败抛异常;构造与析构中调用虚函数只得到基类版本;纯虚函数让类成为抽象类,派生类必须实现全部纯虚函数;只有纯虚函数且没有成员变量的类就是接口。2022.02.17