首页 > 编程语言 > 详细

C++数据抽象、数据封装、接口(抽象类)

时间:2017-10-22 10:42:15      阅读:238      评论:0      收藏:0      [点我收藏+]

一 、数据抽象

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

数据抽象是一种依赖于接口(抽象类)和实现分离的编程(设计)技术。C++ 类为数据抽象提供了可能

数据抽象有两个重要的优势

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

所有的 C++ 程序都有以下两个基本要素:

  • 程序语句(代码):这是程序中执行动作的部分,它们被称为函数。
  • 程序数据:数据是程序的信息,会受到程序函数的影响。

二 、数据封装

封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据封装引申出了另一个重要的 OOP 概念,即数据隐藏

数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。

C++ 通过创建来支持封装和数据隐藏(public、protected、private)。我们已经知道,类包含私有成员(private)、保护成员(protected)和公有成员(public)成员。默认情况下,在类中定义的所有项目都是私有的。

三、接口(抽象类)

接口描述了类的行为和功能,而不需要完成类的特定实现。

C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。

如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:

 1 class Box
 2 {
 3    public:
 4       // 纯虚函数
 5       virtual double getVolume() = 0;
 6    private:
 7       double length;      // 长度
 8       double breadth;     // 宽度
 9       double height;      // 高度
10 };

 

设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。

因此,如果一个 ABC 的子类需要被实例化,则必须实现每个虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重载纯虚函数,就尝试实例化该类的对象,会导致编译错误。

可用于实例化对象的类被称为具体类

请看下面的实例,基类 Shape 提供了一个接口 getArea(),在两个派生类 Rectangle 和 Triangle 中分别实现了 getArea()

 1 #include <iostream>
 2  
 3 using namespace std;
 4  
 5 // 基类
 6 class Shape 
 7 {
 8 public:
 9    // 提供接口框架的纯虚函数
10    virtual int getArea() = 0;
11    void setWidth(int w)
12    {
13       width = w;
14    }
15    void setHeight(int h)
16    {
17       height = h;
18    }
19 protected:
20    int width;
21    int height;
22 };
23  
24 // 派生类
25 class Rectangle: public Shape
26 {
27 public:
28    int getArea()
29    { 
30       return (width * height); 
31    }
32 };
33 class Triangle: public Shape
34 {
35 public:
36    int getArea()
37    { 
38       return (width * height)/2; 
39    }
40 };
41  
42 int main(void)
43 {
44    Rectangle Rect;
45    Triangle  Tri;
46  
47    Rect.setWidth(5);
48    Rect.setHeight(7);
49    // 输出对象的面积
50    cout << "Total Rectangle area: " << Rect.getArea() << endl;
51  
52    Tri.setWidth(5);
53    Tri.setHeight(7);
54    // 输出对象的面积
55    cout << "Total Triangle area: " << Tri.getArea() << endl; 
56  
57    return 0;
58 }

当上面的代码被编译和执行时,它会产生下列结果:

1 Total Rectangle area: 35
2 Total Triangle area: 17

 

C++数据抽象、数据封装、接口(抽象类)

原文:http://www.cnblogs.com/ivan0512/p/7707867.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!