- C++基础
- C++首页
- C++概述
- C++环境设置
- C++基本语法
- C++注释
- C++ Hello World
- C++省略命名空间
- C++常量/字面量
- C++关键字
- C++标识符
- C++数据类型
- C++数值数据类型
- C++字符数据类型
- C++布尔数据类型
- C++变量类型
- C++变量作用域
- C++多个变量
- C++基本输入/输出
- C++修饰符类型
- C++存储类
- C++运算符
- C++数字
- C++枚举
- C++引用
- C++日期和时间
- C++控制语句
- C++决策制定
- C++ if 语句
- C++ if else 语句
- C++嵌套 if 语句
- C++ switch 语句
- C++嵌套 switch 语句
- C++循环类型
- C++ while 循环
- C++ for 循环
- C++ do while 循环
- C++ foreach 循环
- C++嵌套循环
- C++ break 语句
- C++ continue 语句
- C++ goto 语句
- C++构造函数
- C++构造函数和析构函数
- C++复制构造函数
C++中的数据抽象
数据抽象是指只向外界提供必要的信息,并隐藏其背后的细节,即在程序中表示所需的信息,而无需呈现细节。
数据抽象是一种编程(和设计)技术,它依赖于接口和实现的分离。
让我们以电视机的真实例子为例,您可以打开和关闭电视机,更改频道,调整音量,并添加外部组件,如扬声器、录像机和 DVD 播放器,但您不知道其内部细节,也就是说,您不知道它是如何接收无线信号或通过电缆接收信号的,如何对其进行转换,以及最终如何在屏幕上显示它们。
因此,我们可以说电视机清楚地将其实现细节与外部接口分离开来,您可以使用其接口,如电源按钮、频道切换器和音量控制,而无需了解其内部结构。
在 C++ 中,类提供了极佳的数据抽象水平。它们向外界提供了足够多的公共方法来使用对象的特性并操作对象数据,即状态,而无需真正了解类是如何在内部实现的。
例如,您的程序可以调用sort()函数,而无需了解该函数实际上使用什么算法对给定值进行排序。事实上,排序功能的底层实现可能会在库的不同版本之间发生变化,只要接口保持不变,您的函数调用仍然可以工作。
在 C++ 中,我们使用类来定义我们自己的抽象数据类型 (ADT)。您可以使用类ostream的cout对象将数据流式传输到标准输出,如下所示:
#include <iostream>
using namespace std;
int main() {
cout << "Hello C++" <<endl;
return 0;
}
这里,您不需要了解cout如何在用户屏幕上显示文本。您只需要了解公共接口,而“cout”的底层实现可以自由更改。
访问标签强制执行抽象
在 C++ 中,我们使用访问标签来定义类的抽象接口。一个类可以包含零个或多个访问标签:
使用 public 标签定义的成员可供程序的所有部分访问。类型的抽象视图由其公共成员定义。
使用 private 标签定义的成员无法被使用该类的代码访问。private 部分隐藏了使用该类型的代码的实现细节。
访问标签出现的次数没有限制。每个访问标签都指定了后续成员定义的访问级别。指定的访问级别一直有效,直到遇到下一个访问标签或类的主体闭合右括号。
数据抽象的优点
数据抽象提供了两个重要的优势:
类内部受到保护,避免用户级错误,这些错误可能会破坏对象的状态。
随着时间的推移,类实现可以根据不断变化的需求或错误报告进行演变,而无需更改用户级代码。
通过仅在类的 private 部分定义数据成员,类作者可以自由地更改数据。如果实现发生变化,只需要检查类代码即可了解更改可能产生的影响。如果数据是 public 的,则任何直接访问旧表示形式的数据成员的函数都可能被破坏。
数据抽象示例
任何实现带有 public 和 private 成员的类的 C++ 程序都是数据抽象的示例。请考虑以下示例:
#include <iostream>
using namespace std;
class Adder {
public:
// constructor
Adder(int i = 0) {
total = i;
}
// interface to outside world
void addNum(int number) {
total += number;
}
// interface to outside world
int getTotal() {
return total;
};
private:
// hidden data from outside world
int total;
};
int main() {
Adder a;
a.addNum(10);
a.addNum(20);
a.addNum(30);
cout << "Total " << a.getTotal() <<endl;
return 0;
}
当以上代码被编译并执行时,它会产生以下结果:
Total 60
以上类将数字加在一起,并返回总和。公共成员 - addNum 和 getTotal 是面向外部世界的接口,用户需要了解它们才能使用该类。私有成员total是用户不需要了解的,但类正常运行需要它。
设计策略
抽象将代码分为接口和实现。因此,在设计组件时,必须使接口独立于实现,以便如果更改底层实现,则接口将保持不变。
在这种情况下,任何使用这些接口的程序都不会受到影响,并且只需要使用最新的实现重新编译即可。