C ++中的数据抽象

数据抽象是指仅向外界提供必要信息并隐藏其背景细节,即在不提供详细信息的情况下在程序中表示所需信息.

数据抽象是编程(和设计)技术依赖于界面和实现的分离.

让我们来看一个电视的真实例子,你可以打开和关闭,改变频道,调整音量,并添加外部组件,如扬声器,录像机和DVD播放器,但你不知道它的内部细节,也就是说,你不知道它是如何通过空中或通过电缆接收信号,如何翻译它们,最后将它们显示在屏幕上.

因此,我们可以说电视清楚地将其内部实现与外部接口分开,你可以使用它的接口,如电源按钮,频道转换器,和音量控制,但不知道其内部.

In C ++,类提供了很高级别的数据抽象.它们为外界提供了足够的公共方法来使用对象的功能和操作对象数据,即状态而不实际知道内部是如何实现类的.

例如,你的程序可以调用 sort()函数,而不知道函数实际用于对给定值进行排序的算法.事实上,排序功能的底层实现可能会在库的版本之间发生变化,只要界面保持不变,您的函数调用仍然可以正常工作.

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

#include <iostream>
using namespace std;

int main() {
   cout << "Hello C++" <<endl;
   return 0;
}

在这里,您无需了解 cout 如何在用户屏幕上显示文字.您只需要知道公共接口,并且'cout'的底层实现可以自由更改.

访问标签强制抽象

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

  • 使用公共标签定义的成员可以访问所有部分程序.类型的数据抽象视图由其公共成员定义.

  • 使用该类的代码无法访问使用私有标签定义的成员.私有部分隐藏了使用该类型的代码的实现.

访问标签的出现频率没有限制.每个访问标签指定后续成员定义的访问级别.在遇到下一个访问标签或看到类主体的右右括号之前,指定的访问级别仍然有效.

数据抽象的好处

数据抽象提供了两个重要的优点 :

  • 类内部保护免受无意的用户级错误,这可能会损坏对象的状态.

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

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

数据抽象示例

任何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 是外部世界的接口,用户需要知道它们才能使用该类.私人会员总计是用户不需要了解的内容,但是该课程需要正常运作.

设计策略

抽象将代码分为接口和实现.因此,在设计组件时,必须保持接口独立于实现,这样如果您更改底层实现,那么接口将保持不变.

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