当前位置: 首页 > 文档资料 > C++ 中文教程 >

C++ Abstraction

优质
小牛编辑
134浏览
2023-12-01

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

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

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

因此,我们可以说电视清楚地将其内部实现与其外部接口分开,您可以使用其电源按钮,频道切换器和音量控制等接口,而不必了解其内部结构。

在C ++中,类提供了很高级别的data abstraction 。 它们为外界提供了足够的公共方法来使用对象的功能并操纵对象数据,即状态而不实际知道内部如何实现类。

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

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

#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

上面的类将数字加在一起,并返回总和。 公共成员 - addNumgetTotal是外部世界的接口,用户需要知道它们才能使用该类。 私有成员total是用户不需要了解的内容,但是该类需要正常运行。

设计策略

抽象将代码分为接口和实现。 因此,在设计组件时,必须保持接口独立于实现,以便在更改底层实现时,接口将保持不变。

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