C++中的数据封装



所有C++程序都由以下两个基本元素组成:

  • 程序语句(代码) − 这是程序中执行操作的部分,它们被称为函数。

  • 程序数据 − 数据是程序的信息,受程序函数影响。

封装是一个面向对象编程的概念,它将数据和操作数据的函数绑定在一起,并保护两者免受外部干扰和误用。数据封装导致了重要的OOP概念数据隐藏

数据封装是一种将数据及其使用的函数捆绑在一起的机制,而数据抽象是一种仅公开接口并向用户隐藏实现细节的机制。

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关键字之后声明它们。在 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 是对外部世界隐藏的内容,但类需要它才能正常运行。

设计策略

我们大多数人都学会了默认情况下将类成员设为私有,除非我们确实需要公开它们。这只是良好的封装

这最常应用于数据成员,但也同样适用于所有成员,包括虚函数。

广告