
- C vs C++ - 类型系统 - 作用域 & 生命周期
Lecture 1:C++ 回顾与系统编程背景 / C vs C++ / 类型系统 / 作用域与生命周期
🎓 Lecture 1 的定位:为“C++是系统编程语言”做铺垫
Lecture 1 不是教语法,而是搭建整个课程的思想框架:
让学生理解: C++ ≠ “更复杂的 C”, 而是“一种用来管理资源、构建抽象、写系统级高性能代码”的语言。
因此,本讲重点不是语法,而是:
- C 与 C++ 的哲学差异
- C++ 的内存模型
- 资源管理理念(RAII 的铺垫)
- 对象的生命周期
- 编译器如何理解作用域与对象生灭
- 类型系统如何帮助系统级编程
这是为了让学生从一开始就明白: 后面学到的 指针对象、代理对象、智能指针、所有权语义 都不是“技巧”,而是 C++ 思想的自然延伸。
🧩 第一部分:C vs C++ — 语言哲学差异
讲三个核心思想差异,而不是细节语法差异。
⭐ 1. C 是“结构化过程式语言”,C++ 是“零开销抽象语言”
C 的思维方式是:
用最小抽象直接操纵内存和硬件。
C++ 的核心理念:
用“抽象”表达设计,抽象必须在编译期完全消失(Zero-cost abstraction)。
例如:
| 特性 | C | C++ |
|---|---|---|
| 封装 | 无 | 类、访问控制 |
| 类型系统 | 弱(struct 只是数据包) | 强(类型表达语义) |
| 资源管理 | 手工 memory/IO | RAII |
| 抽象机制 | 函数 + struct | 类、模板、operator overload、泛型 |
会强调:
C++ 的“类”不是 OOP 的重点,而是“资源抽象的单元”。
这为智能指针铺垫: 智能指针 = 对内存资源的抽象。
⭐ 2. C 构建“程序”,C++ 构建“系统”
C++ 的目标:
- 大规模代码库
- 构建库/组件
- 表达复杂语义(生命周期、所有权)
- 可扩展的抽象层次
说一句很经典的:
C++ 的发明目的:让你用更高层的思维写底层逻辑。
⭐ 3. C 的资源管理靠“约定”,C++ 靠“语义与类型”
C:
FILE* fp = fopen(...);
...
fclose(fp); // 记得关哦
C++:
std::ifstream f("data.txt"); // 自动关闭
这是 RAII 的第一节预埋。
🧩 第二部分:C++ 类型系统(为什么比 C 强)
本节极关键,因为全部智能指针、代理对象、所有权,都依附于 C++ 的类型系统来表达。
涉及以下内容:
⭐ 1. C++ 的类型系统表达语义,而不是只表达数据结构
C++ 类型系统能表达:
- 拷贝 vs 不可拷贝(delete copy ctor)
- 持有 vs 不持有(unique_ptr vs weak_ptr)
- 移动语义(T&&)
- 生命周期(构造/析构)
- 资源管理(RAII class)
- 所有权(智能指针)
C 的类型系统做不到这些。
⭐ 2. POD 类型 vs 非 POD 类型
解释:
- C struct 在 C++ 里仍然是 POD
- 类可以有构造、析构、拷贝、移动、虚函数 → 可表达复杂行为
强调这一点是为了说明:
智能指针本质上是“有行为的指针类型”。
⭐ 3. 语义层次上的类型:C++ 重载运算符构造抽象
举例子:
p->foo();
这里 -> 可以由类定义 → 这是智能指针的基础。
C 不能这么做。
⭐ 4. 类型安全与转换规则(隐式 vs 显式)
因为文档里讲 explicit,所以第一节必然讲:
- 隐式构造危险
- 设计禁止隐式转换的策略(explicit)
- 强类型检查对系统编程的重要性
🧩 第三部分:作用域(Scope)与生命周期(Lifetime)
这个部分是智能指针的“思想前置”。
需要把 C++ 的对象生命周期讲得非常清楚:
⭐ 1. 三类存储(三种生命周期)
(1)自动存储(auto / stack)
int x; // 活在作用域内,作用域结束自动销毁
(2)动态存储(heap)
int* p = new int;
// 直到 delete 之前都不会销毁
(3)静态存储(global/static)
static int x;
尤其强调:
C++ 的一切复杂错误,几乎都源于“生命周期不清楚”。
这是所有权模型(ownership semantics)出现的历史背景。
⭐ 2. 对象的构造与析构顺序
- stack 上 → 进入作用域构造,离开作用域析构
- heap 上 → new 时构造,delete 时析构
- static → 程序开始前构造,结束后析构
这为 RAII 做铺垫:
智能指针用析构函数自动调用 delete。
⭐ 3. 生命周期决定资源管理策略
这里提出两个典型问题:
🎯 谁决定删除某个资源?
🎯 删除什么时候发生?
🎯 程序能不能因为异常而跳过删除?
这些问题没有答案,就是智能指针出现的原因。
⭐ 4. 作用域泄漏 vs 内存泄漏
作用域泄漏是:
int* p = new int;
if (...) throw; // delete 不会执行,资源泄漏
这直接引出:
RAII + 智能指针 = 异常安全的资源管理
⭐ 5. 设计良好的 C++ 程序,绝不手写 delete
一句经典结语:
C++ 的目标是让你永远不再写 delete。
🧩 第四部分:智能指针思想的伏笔(第一讲的结尾)
教授不会讲智能指针,但会讲以下内容为后面打基础:
⭐ 1. 资源是对象,生命周期由类型负责(RAII)
比如:
std::lock_guard<std::mutex> lock(m);
资源管理交给类型,而不是程序员:
资源 = 类型 生命周期 = 析构函数负责 安全性 = 编译器确保
这是后面 unique_ptr / shared_ptr 的基础思想。
⭐ 2. 指针不是地址,而是关系(this 是开始)
:
this
不是地址,而是:
- 表达对象身份
- 表达对象关系
- 表达调用语境
这是“指针有语义”的第一步。
⭐ 3. 如果类型可以封装资源,那么也可以封装指针资源(智能指针)
一个“后续预告”:
class SmartPointer {
public:
T& operator*();
T* operator->();
~SmartPointer(); // 自动释放资源
};
学生会意识到:
原来智能指针完全建立在 operator 重载 + RAII + 类型系统上。
🧩 Lecture 1 的整体结构总结
1. C vs C++ 模型差异(抽象能力 vs 底层直接访存)
2. 类型系统是 C++ 最重要的构建语义方式
3. 作用域模型(scope)
4. 生命周期(lifetime)
5. 生命周期与资源管理的连接(RAII)
6. 引出一个重大主题:
⭐ “指针行为能否被抽象化?”


评论