C++面向对象:C++ 数据抽象

数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。ios

 

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

 

 

C/C++的学习裙【七一二 二八四 七零五 】,不管你是小白仍是进阶者,是想转行仍是想入行均可以来了解一块儿进步一块儿学习!裙内有开发工具,不少干货和技术资料分享!编程

 

让咱们举一个现实生活中的真实例子,好比一台电视机,您能够打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD 播放器),可是您不知道它的内部实现细节,也就是说,您并不知道它是如何经过缆线接收信号,如何转换信号,并最终显示在屏幕上。函数

 

所以,咱们能够说电视把它的内部实现和外部接口分离开了,您无需知道它的内部实现原理,直接经过它的外部接口(好比电源按钮、遥控器、声量控制器)就能够操控电视。工具

如今,让咱们言归正传,就 C++ 编程而言,C++ 类为数据抽象提供了可能。它们向外界提供了大量用于操做对象数据的公共方法,也就是说,外界实际上并不清楚类的内部实现。学习

例如,您的程序能够调用 sort() 函数,而不须要知道函数中排序数据所用到的算法。实际上,函数排序的底层实现会因库的版本不一样而有所差别,只要接口不变,函数调用就能够照常工做。开发工具

 

在 C++ 中,咱们使用来定义咱们本身的抽象数据类型(ADT)。您可使用类 iostreamcout 对象来输出数据到标准输出,以下所示:spa

#include <iostream>
using namespace std;


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

 

在这里,您不须要理解 cout 是如何在用户的屏幕上显示文本。您只须要知道公共接口便可,cout 的底层实现能够自由改变。设计

访问标签强制抽象

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

  • 使用公共标签订义的成员均可以访问该程序的全部部分。一个类型的数据抽象视图是由它的公共成员来定义的。
  • 使用私有标签订义的成员没法访问到使用类的代码。私有部分对使用类型的代码隐藏了实现细节。

访问标签出现的频率没有限制。每一个访问标签指定了紧随其后的成员定义的访问级别。指定的访问级别会一直有效,直到遇到下一个访问标签或者遇到类主体的关闭右括号为止。

数据抽象的好处

数据抽象有两个重要的优点:

  • 类的内部受到保护,不会因无心的用户级错误致使对象状态受损。
  • 类实现可能随着时间的推移而发生变化,以便应对不断变化的需求,或者应对那些要求不改变用户级代码的错误报告。

若是只在类的私有部分定义数据成员,编写该类的做者就能够随意更改数据。若是实现发生改变,则只须要检查类的代码,看看这个改变会致使哪些影响。若是数据是公有的,则任何直接访问旧表示形式的数据成员的函数均可能受到影响。

数据抽象的实例

C++ 程序中,任何带有公有和私有成员的类均可以做为数据抽象的实例。请看下面的实例:

#include <iostream>
using namespace std;


class Adder{
   public:
      // 构造函数
      Adder(int i = 0)
      {
        total = i;
      }
      // 对外的接口
      void addNum(int number)
{
          total += number;
      }
      // 对外的接口
      int getTotal()
{
          return total;
      };
   private:
      // 对外隐藏的数据
      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 是用户不须要了解的,但又是类能正常工做所必需的。

设计策略

抽象把代码分离为接口和实现。因此在设计组件时,必须保持接口独立于实现,这样,若是改变底层实现,接口也将保持不变。

在这种状况下,无论任何程序使用接口,接口都不会受到影响,只须要将最新的实现从新编译便可。

相关文章
相关标签/搜索