3 数据抽象和类I
抽象数据类型
抽象数据类型(Abstract Data Type,简称 ADT)是计算机科学中一个非常核心的概念。它的核心思想是封装和信息隐藏。描述内容包括:
- 属性(property) - 关于事物数据特征
- 方法(method)- 关于事物的行为与操作特征
ADT 的两个关键层面
一个 ADT 由两个部分组成,这体现了“接口”与“实现”的分离:
-
接口/规范/声明 (Interface)
- 定义了该类型数据的取值范围(比如“栈”里只能存整数)和可执行的操作(比如“入栈”、“出栈”)。
- 这是用户唯一需要关心的部分。
-
实现 (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