注:在正式学习C++面向对象之前,需要确保我们已经具备面向过程的基础,故第一课先复习一部分面向过程的重要知识。

变量与类型 Variable & Type

理解数据如何在程序中表示和操作是程序设计的基础,而变量是数据的载体,同时类型又规定了数据的形态和行为。

  • 变量:内存中用于存储数据的命名实体。每个变量都有一个名称,用于在代码中引用该数据。
  • 类型:决定了变量可以存储什么数据,以及能对该数据执行什么操作。类型决定了内存大小和解释方式。
  • 常见类型举例int整型、float/double浮点型、char字符。

    很多初学者以为变量就是数据本身,实则是错误的,实际上,变量是“带名字的盒子”,类型规定了盒子的形状和容量。理解变量与类型的分离是理解指针、引用和动态内存的前提。

作用域 Scope

程序也并不是一个混沌的空间,变量有着自己的“势力范围”。理解作用域是管理程序状态、避免命名冲突和资源泄露的关键。

  • 作用域:变量在程序中可以被访问的范围。通常由一对花括号 { } 界定。
  • 局部作用域:在函数内部或复合语句(如 for 循环内部)定义的变量,其作用域从定义处开始,到对应的 } 结束。离开作用域后变量被销毁。
  • 全局作用域:在函数外定义的变量,在整个程序文件(甚至多个文件)中都可见。

    补充:当程序执行进入 { 时,栈帧为局部变量分配空间,当执行离开 } 时,变量自动销毁,空间被回收。这种机制保证了函数调用的独立性和资源的安全管理。
    理解作用域对于理解C++对象构造/析构的时机(RAII,Resource Acquisition Is Initialization)至关重要。

循环与流程控制 Loop & Flow Control

程序的核心是逻辑,循环和条件语句则是赋予了程序“重复”和“思考”的能力,使其不再是空洞的指令序列。

  • 循环(Loop):反复执行一段代码块。 while:在条件为真时重复执行。for:适合已知循环次数(有初始化、条件、步进三部分)。
  • 流程控制(Flow Control):改变程序顺序执行的走向。if-else:根据条件选择分支。switch-case:多路分支选择。
    重要性: 没有这些机制,程序只能顺序执行,无法实现灵活的算法逻辑(如遍历数组、筛选条件等)

    C++中的 for 循环括号内可以声明变量(如 for (int i = 0; …)),这种变量的作用域被限制在循环内部(C99之前的标准不允许,但C++一直支持)。
    switch 的 case 块中如果忘记加 break,会发生“贯穿”(fall-through)到下一个 case,这是常见的隐蔽bug。

那源代码 (.cpp) 是如何一步步变成计算机可以执行的程序 (.exe) 的?理解这个过程是解决编译错误的根本。

  • 编译(Compile):将人类可读的源代码(.cpp, .c)转换为机器代码(目标文件 .o 或 .obj)。编译器会检查语法、类型等错误。
  • 链接(Link):将多个目标文件(以及标准库、第三方库)合并成一个最终的可执行文件(.exe 或可执行二进制)。链接器主要处理跨文件符号引用和重定位。
    重要性: 你写的每一个 .cpp 文件会分别编译,然后链接在一起。因此一个常见的错误:只修改了一个文件却忘了重编译,或者忘记链接某个库导致“未定义引用”(undefined reference)错误。

Class的宏观分类

在深入学习单个class的细节之前,先建立宏观分类,能让你对后续的“基于对象”与“面向对象”两个学习阶段有更清晰的认识。

C++中的类(class)根据其内部是否管理动态资源(尤其是通过指针),可以划分为两大类。这一分类决定了类的设计哲学和实现细节。

  • 不带指针的class (Class Without Pointer Member):所有数据成员都是值类型(如 int, double, 其他不带指针的结构体)。编译器生成的默认拷贝构造、拷贝赋值、析构函数通常就足够且安全。示例:复数类 Complex、二维点类 Point。重点学习:构造函数、操作符重载。
  • 带指针的class (Class With Pointer Member):包含指向动态分配内存(堆)的指针成员。编译器生成的默认拷贝构造、拷贝赋值会导致浅拷贝(Shallow Copy),引发内存泄漏、双重释放等问题。必须手动定义“Big Three”:拷贝构造、拷贝赋值、析构函数。示例:字符串类 String。重点学习:深拷贝、拷贝控制、资源管理(RAII)。