第一节 · 系统的构造 · 类的定义与封装

到目前为止,我们学习的都是过程式编程——程序由一系列函数组成,数据和操作数据的函数是分离的。

但随着程序规模的增长,这种方式会变得难以管理。想象一下,你有一堆函数,每个函数都可以随意访问和修改全局数据,稍有不慎就可能产生难以追踪的 bug。

面向对象编程(Object-Oriented Programming,OOP)提供了一种更好的组织代码的方式:将数据和操作数据的函数打包在一起,形成一个整体。这个整体就是(Class)。


从结构体到类

我们已经见过结构体(struct):

struct Student
{
    string name;
    int age;
    int score;
};

Student s;
s.name = "Alice";
s.age = 18;
s.score = 95;

结构体将相关的数据组合在一起,但数据仍然是"裸露"的——任何代码都可以直接访问和修改。

类(class)在此基础上更进一步,不仅可以包含数据,还可以包含函数,而且可以控制访问权限:


访问控制

类中的成员可以有不同的访问级别

  • private:私有成员,只能在类内部访问

  • public:公有成员,可以在任何地方访问

  • protected:受保护成员,只能在类内部和派生类中访问(后续章节会学习)

class 与 struct 的区别

在 C++ 中,classstruct 几乎相同,唯一的区别是默认访问级别

  • class:默认是 private

  • struct:默认是 public


封装

封装是面向对象的核心概念之一。它意味着:

  1. 将数据和操作数据的函数绑定在一起

  2. 隐藏实现细节,只暴露必要的接口

为什么要封装?

封装的好处:

  • 数据完整性:可以在 setter 中验证数据

  • 灵活性:可以改变内部实现而不影响外部代码

  • 安全性:防止意外修改数据


成员函数

类中的函数称为成员函数(或方法):

注意到 area()perimeter() 后面有 const 吗?这表示这个函数不会修改对象的状态,称为常量成员函数


在类外定义成员函数

成员函数可以在类内声明,在类外定义:

::作用域解析运算符Rectangle::area 表示 Rectangle 类的 area 函数。

这种分离声明和定义的方式在实际开发中很常见:

  • 声明放在头文件(.h 或 .hpp)中

  • 定义放在源文件(.cpp)中


一个完整的例子


类是 C++ 面向对象编程的基础。通过类,我们可以将相关的数据和操作组织在一起,创建出更加模块化、可维护的代码。

习题

  • 设计一个 Circle 类,包含半径属性,以及计算面积和周长的方法。

  • 设计一个 Counter 类,包含一个计数器,提供增加、减少、重置和获取当前值的方法。

  • 设计一个简单的 Clock 类,包含时、分、秒,提供设置时间和显示时间的方法。

Last updated