Lecture 1:C++ 回顾与系统编程背景

enter image description here

- 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. 引出一个重大主题:

⭐ “指针行为能否被抽象化?”

enter image description here

评论