返回首页 C++ 基础教程

C++ 基础

C++ 面向对象

C++ 进阶

数据封装

所有的 C++ 程序是由以下两个基本要素组成:

  • 程序语句(代码):这是程序执行行为的一部分,他们被称为函数。    
  • 程序数据:数据是受程序函数影响的信息。

封装是一个面向对象编程的概念,它将数据和操作数据的函数结合在一起,并使其免受外部干扰和误用。数据封装是数据隐藏的重要面向对象编程概念。

数据封装是一种将数据和使用数据的函数结合在一起的机制;数据抽象是一种只将接口公开并且向用户隐藏实现细节的机制。

C++ 支持封装的属性和通过创建用户定义类型实现的数据隐藏,这称为类。我们已经研究过,一个类可以包含私有、保护和公有成员。默认情况下,所有定义在一个类中的成员是私有的。例如:

    class Box
    {
       public:
      double getVolume(void)
      {
     return length * breadth * height;
      }
       private:
      double length;  // Length of a box
      double breadth; // Breadth of a box
      double height;  // Height of a box
    };

变量 length 、breadth 和 height 都是私有的。这意味着只有 box 类的其他成员可以访问它们,而程序的任何其它的部分不能访问它们。这是一个封装的实现方式。    

要想使类的某个部分成为共有的(即访问您的程序的其他部分),你必须在 public 关键字后声明它们。公有说明符后定义的所有变量或函数可以被程序中的其它函数访问。    

使一个类成为其它类的友元类就可以获得实现细节,降低封装。这个思想就是获得尽可能多的每个类的对其它类隐藏的细节。

数据封装的例子

任何一个实现有公有和私有成员的类的 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 是用户不需要知道的,但是它是为保证程序正常运行类所必要的。

设计策略

经过一段痛苦的经历,我们大多数人已经学会了使类成员在默认情况下是私有的,除非我们真的需要使它们变成公有的。这就是一个好的的封装。    

这个知识被频繁的应用于数据成员,它同样适用于所有成员,包括虚函数。

上一篇: 数据抽象 下一篇: 接口 (抽象类)