C++数据抽象
数据抽象是指,只提供必要的信息提供给外界,并隐藏其后台的细节,也就是,以表示在程序所需要的信息,而无需呈现的细节。
数据抽象是一种编程(设计)技术,它依赖于接口和实现的分离。
一个现实生活中的例子:一台电视机,可以打开和关闭,换频道,调整音量,并添加外部组件,如扬声器,录像机和DVD播放器,但你不知道它的内部细节,即是,不知道它是如何在空中或通过电缆,如何转化接收信号,并最终在屏幕上显示出来。
因此,我们可以说,电视显然其外部接口的分开内部实现,可以使用它的接口,如电源键,频道转换和音量控制播放,而无需了解其内部零件知识。
现在就C++编程而言,C++类提供的数据抽象很高水平。它们提供足够的公共方法向外界的对象功能发挥和操纵对象数据,即,不用知道类如何在内部实现。
例如,程序中可以调用sort()函数不知道什么算法函数实际使用给定值进行排序。事实上,底层实现的排序功能可以在库版本之间切换,只要接口保持不变,函数调用仍然可以工作。
在C++中,我们使用类来定义自己的抽象数据类型(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是外面世界的接口,用户需要知道它们使用的类。私有成员总和是什么,用户不需要了解,只需要类能正常工作。
设计策略:
抽象的代码分离到接口和实现。所以在设计组件时,必须保持独立的接口执行,这样,如果改变底层实现,那么接口将保持不变。
在任何程序使用接口这种情况下,它们不会受到影响,将只需要使用最新的执行重新编译。