Skip to content

3 数据抽象和类I

抽象数据类型

抽象数据类型(Abstract Data Type,简称 ADT)是计算机科学中一个非常核心的概念。它的核心思想是封装信息隐藏。描述内容包括:

  • 属性(property) - 关于事物数据特征
  • 方法(method)- 关于事物的行为与操作特征

ADT 的两个关键层面

一个 ADT 由两个部分组成,这体现了“接口”与“实现”的分离:

  1. 接口/规范/声明 (Interface)

    • 定义了该类型数据的取值范围(比如“栈”里只能存整数)和可执行的操作(比如“入栈”、“出栈”)。
    • 这是用户唯一需要关心的部分。
  2. 实现 (Implementation)

    • 为了完成接口定义的功能,在计算机内部所采用的具体存储结构(如数组或链表)和算法
    • 这部分对用户是隐藏的,是“黑盒”。

声明和实现分离使得模块之间仅通过接口(头文件)通信,内部实现细节互不可见,降低了模块间的依赖关系,使得代码更灵活、更易维护。

ADT 与数据结构的关系

  • 抽象数据类型 (ADT):是逻辑层面的概念,是“蓝图”或“规范”。
  • 数据结构 (Data Structure):是物理层面的概念,是“具体建筑”或“实现”。

同一个 ADT(如“栈”),可以用不同的数据结构(如“数组”或“链表”)来实现。选择哪种数据结构,取决于你对性能(时间/空间复杂度)的具体需求。

类的声明

语法

类关键词  类标识符 {
    访问说明符:可选
        数据成员声明序列;
        函数成员声明序列;
};
  • 类关键词:class或struct或union之一

  • 访问说明符:

    • public 公有,表示后续成员是对象使用者可访问
    • private 私有,表示后续成员仅对象内部可访问
    • protected 受保护,本类内部和派生类(子类)内部可以访问
    • 不写的时候默认是private
  • 类成员:

    • 数据成员,按声明顺序存储,对齐规则同C。一般设计中,数据成员需要隐藏保护。需要通过函数成员访问。
    • 函数成员,公有成员可以被外部使用者访问;私有成员仅内部访问;const 函数成员不能修改数据成员。
class DATE {
    public:
        void Set( int, int, int );
        int getMonth() const;
        int getDay() const;
        int getYear() const;
        void Print() const; //这就是const函数,不能修改数据成员
        void Increment();
        void Decrement();
    private:
        int month;
        int day;
        int year;
};

const成员函数:表示该函数不会修改对象的任何成员变量(除了被声明为 mutable的变量)。const是函数签名的一部分。带 const和不带 const被视为两个不同的函数。头文件(.h)中的函数声明带有 const修饰符,在源文件(.cpp)中的函数定义也必须有 const。

int getLength() const;   //在.h文件中
int Rectangle::getLength() const {  // 在.cpp文件中
    return length;
}

在C++中,如果类的成员函数的参数名与类的成员变量名相同,需要使用 this指针​ 或 成员初始化列表​ 来区分和正确赋值。

class MyClass {
private:
    int value; // 成员变量
public:
    // 构造函数:参数名与成员变量名相同,都是 value
    MyClass(int value) {
        this->value = value; // 用 this-> 指明左侧是成员变量
    }
    void setValue(int value) {
        this->value = value; // 赋值给成员变量
    }
};

struct和class关键字

C 语言:

  • 在纯粹的C89/C99标准C语言中,struct只能包含成员变量(数据),不能直接包含成员函数(操作)的定义。导致数据与操作的函数分离。
  • 结构体类型名称是 struct identifer

C++:

  • 类关键包括 class,struct,union,除了可以包含成员变量,还可以包含成员函数
  • 类型名称就是标识符,是 xxx 不是 struct xxx
  • struct 定义的类成员默认是公有的
  • class 定义的类成员默认是私有的。除此之外,class 和 struct 语法和语义没有区别

内联

内联是C/C++中的一种优化机制,建议编译器将函数调用处直接替换为函数体代码,以避免函数调用的额外开销(压栈、跳转、返回等)。

  • 目的:用空间换时间。牺牲代码体积(可能膨胀),换取执行速度(消除调用开销)。
  • 方式:在函数声明前加关键字 inline。
  • 本质:对编译器的建议。编译器有权拒绝,最终是否内联由编译器优化策略决定。

在类定义内直接实现的成员函数自动视为inline建议。

类与对象

  • 是用户定义的数据类型,它表示一个 ADT。在 C++中,它有属性(数据成员)和能操作数据成员的行为(函数成员)
  • 本质上是定义一个数据类型的蓝图,或者是一个模板。并没有实际数据

  • 对象

  • 类定义的变量称为对象(objects)或者类的实例(instances)
  • 自动对象或动态申请的对象的默认初始化值为不确定。

  • 客户端

  • 使用类的软件称为客户端代码。
  • 客户端代码使用对象的公有方法去处理对象的数据。

创建对象

类名 对象名

访问成员变量和函数

在对象上使用点运算符(.)date.flag