Tutorial Study Image

C++ 中的封装


2023年6月9日, Learn eTutorial
841

C++ 是一种灵活的编程语言,具有面向对象编程的多种功能。在本教程中,我们将学习如何在 C++ 中实现封装。

C++ 中的封装是什么意思?

封装是指将数据和信息打包成一个单元。在面向对象编程中,封装被描述为数据与其操作函数之间的绑定。

以封装的实际示例为例:示例 1

在一家公司,有多个部门,例如财务部、财务部、销售部等。财务部门负责管理所有财务交易并维护所有财务数据记录。同样,销售部门负责管理所有与销售相关的行动并跟踪所有销售情况。现在可能会出现财务官员出于某种原因需要特定月份的所有销售信息的情况。在这种情况下,他不能直接查看销售部门的数据。要请求特定信息,他必须先与销售部门的另一位官员联系。这就是封装。这里,销售部门的数据以及可以修改它的人员被打包在“销售部门”这个术语下。

  • 类中的任何函数都不能直接访问。为了使用该函数(该函数使用该类的成员变量),我们必须通过对象来访问它。
  • 只有当类中创建的函数使用所有成员变量时,才能实现封装。
  • 如果我们没有在类中创建使用该类成员变量的函数,我们就不能称之为封装。

因此,数据抽象是一种仅公开接口而隐藏实现细节的方法。数据封装是通过将数据和使用它们的功能分组来实现的。

C++ 通过使用类(用户定义的类型)来支持封装和数据隐藏。正如我们已经学习过的,一个类可以有私有、保护和公有成员。类中定义的每个成员默认都是私有的。

例如


class Box {
   public:
      double getVolume(void) {
         return length * breadth * height;
      }

   private:
      double length;      // Length of the box
      double breadth;     // Breadth of the box
      double height;      // Height of the box
};
 

上述代码解释

高度、宽度和长度是私有变量。这意味着它们只能被其他 Box 类成员访问,而不能被你程序中的任何其他部分访问。封装可以通过这种方式实现。

如果想让类组件可供程序中的其他部分使用,则必须在 public 关键字之后指定它们。你的应用程序中的任何其他函数都可以访问 public 说明符之后定义的任何变量或函数。

将一个类变成另一个类的伙伴会暴露实现细节并降低封装性。理想的情况是尽可能地将每个类的细节向所有其他类隐藏起来。

数据抽象或隐藏也是封装的结果。封装也会隐藏数据。在示例 1 中,任何其他区域都无法访问任何部门(如销售、财务或会计)的任何数据。C++ 中的封装可以通过类和访问修饰符来实现。

查看下面的程序

编写一个 C++ 程序以理解 C++ 中的封装概念


#include<iostream>
using namespace std;

class Encapsulation
{
 private:
  // data is hidden mainly from the outside world
  int x;
  
 public:
  // function to set the value of
  // variable x
  void set(int a)
  {
   x =a;
  }
  
  // function to return the  value of
  // variable x
  int get()
  {
   return x;
  }
};

// main function
int main()
{
 Encapsulation obj;
 
 obj.set(9);
 
 cout<<obj.get();
 return 0;
}

 

输出


9

上面的程序中,变量 x 被设为私有。此变量只能通过类的 get() 和 set() 函数来访问和修改。因此,在这种情况下,变量 x 以及 get() 和 set() 函数被绑定在一起,这就是封装。

封装的类型

封装主要有三种类型

成员变量封装: 在此类型的封装中,所有数据成员均被指定为私有。

函数封装: 在此类型的封装中,一些成员函数被声明为私有。这里构造函数将是公有的。

类封装: 在此类型的封装中,类的所有成员均被声明为私有。这主要发生在嵌套类中。

顾名思义,在成员变量封装中,所有数据变量或数据成员都设置为私有。相比之下,在函数封装中,一些函数被声明为私有。类封装将整个类声明为私有。

C++ 中封装的优点

  1. C++ 中的封装通过将相似的成员组合成一个类,使代码看起来更简洁,并且更易于遵循。
  2. 用户只能分别通过 get() 和 set() 操作进行读写。因此,数据必须保持安全。
  3. 数据捆绑使开发整体上更易于管理。这些捆绑包可以独立于其他组件进行测试、调试和执行。
  4. 将数据隐藏起来是一个很好的保护数据的策略。因此,代码的安全性得到了进一步增强。
  5. 由于我们可以更改代码的一个部分而不改变另一部分,封装使我们能够有效地控制数据。

通过学习封装,你将能够更好地定义私有数据成员。我们可以通过这种方式保护我们的数据不被外部访问。虽然成员函数也可以使用此技术,但成员变量是最常用的。因此,封装可以经常以这种方式使用。

封装与数据抽象的区别

数据抽象 封装

通过提出设计,数据抽象解决了问题。

提出的设计通过封装来实现,这也解决了问题。

数据抽象隐藏了代码细节,只显示用户所需的信息

通过封装,将所有数据成员(包括变量和函数)合并到一个类中。

在抽象中使用类和对象可以提高代码的安全性。

封装使用访问修饰符来限制对外部世界数据的访问。

抽象用于隐藏实现。

数据可以通过封装来保密。

总结

在本教程中,我们通过实际示例讨论了封装及其优点。然后我们讨论了一些实际的封装实现示例。

通过这些示例,我们能够理解数据隐藏的概念以及它与封装的区别。我们还讨论了封装的优点以及为什么在我们的代码中包含它是明智的。