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 是private 的。这意味着它们只能由 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是与外界的接口,用户需要知道它们才能使用该类。私有成员总数是对外界隐藏的,但对于类的正常运行是必需的。

设计策略

我们大多数人都已经学会默认将类成员设置为私有,除非我们确实需要公开它们。这就是很好的封装

这最常应用于数据成员,但它同样适用于所有成员,包括虚拟功能。