📜  C++中的数据抽象

📅  最后修改于: 2020-12-17 05:12:22             🧑  作者: Mango


数据抽象是指仅向外界提供基本信息并隐藏其背景详细信息,即在程序中表示所需的信息而不显示详细信息。

数据抽象是一种编程(和设计)技术,它依赖于接口和实现的分离。

让我们以一个电视的真实示例为例,您可以打开和关闭电视,更改频道,调节音量并添加外部组件,例如扬声器,VCR和DVD播放器,但是您不知道其内部细节,就是说,您不知道它是如何通过空中或通过电缆接收信号的,如何转换它们的信号,最后将它们显示在屏幕上。

因此,可以说电视将其内部实现与外部接口清楚地分开了,并且您可以在不了解其内部知识的情况下使用电源按钮,频道转换器和音量控制之类的接口进行播放。

在C++中,类提供了高水平的数据抽象。它们向外界提供了足够的公共方法来发挥对象的功能并操纵对象数据(即状态)而实际上不知道内部如何实现类。

例如,您的程序可以调用sort()函数,而无需知道该函数实际用于对给定值进行排序的算法。实际上,排序功能的基础实现可能会在库的发行版之间发生变化,并且只要接口保持不变,您的函数调用仍将起作用。

在C++中,我们使用来定义我们自己的抽象数据类型(ADT)。您可以使用ostream类的cout对象将数据流传输到标准输出,如下所示:

#include 
using namespace std;

int main() {
   cout << "Hello C++" <

在这里,您不需要了解cout如何在用户屏幕上显示文本。您只需要知道公共接口,并且’cout’的基础实现可以自由更改。

访问标签强制抽象

在C++中,我们使用访问标签来定义类的抽象接口。一个类可能包含零个或多个访问标签-

  • 带有公共标签的成员可以访问该计划的所有部分。类型的数据抽象视图由其公共成员定义。

  • 使用私有标签定义的成员不能访问使用该类的代码。专用部分从使用该类型的代码中隐藏实现。

对于访问标签出现的频率没有限制。每个访问标签都指定后续成员定义的访问级别。指定的访问级别一直保持有效,直到遇到下一个访问标签或看到类主体的右右括号为止。

数据抽象的好处

数据抽象提供了两个重要的优势-

  • 保护类内部避免发生意外的用户级错误,这些错误可能会破坏对象的状态。

  • 该类实现可能会随着时间的流逝而变化,以响应不断变化的需求或错误报告,而无需更改用户级代码。

通过仅在类的私有部分中定义数据成员,类作者可以自由地对数据进行更改。如果实现发生更改,则仅需检查类代码以查看更改可能产生的影响。如果数据是公共的,则直接访问旧表示形式的数据成员的任何函数可能会损坏。

数据抽象示例

在其中使用公共成员和私有成员实现类的任何C++程序都是数据抽象的一个示例。考虑以下示例-

#include 
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() <

编译并执行上述代码后,将产生以下结果-

Total 60

上一类将数字相加,然后返回总和。公共成员addNumgetTotal是与外界的接口,用户需要了解它们才能使用该类。私有成员总数是用户不需要了解的,但类正常运行是必需的。

设计策略

抽象将代码分为接口和实现。因此,在设计组件时,必须使接口独立于实现,这样,如果您更改基础实现,则接口将保持不变。

在这种情况下,无论使用这些接口的程序是什么,它们都不会受到影响,只需要使用最新的实现进行重新编译。