C++ 封装

2025年6月12日 | 阅读 8 分钟

在 C++ 中,面向对象编程(OOP)的封装是指将数据和相关的函数分组到一个类中。换句话说,封装被定义为将代码和数据绑定(或包装)到单个单元中。

Encapsulation in C++

它限制对数据的直接访问,并通过方法允许受控的修改。它还有助于实现数据隐藏。它有助于保护数据,提供规范化的更新,并增强安全性。它还有助于使代码更易于维护和理解。

封装的现实生活示例

考虑智能手机的现实生活示例。我们使用智能手机拨打电话、拍照和单击即可打开程序。但是,我们看不到内部:电路、电缆,或者系统如何解释每次触摸。信号管理、内存消耗和安全都在后台完成。

在这方面,智能手机的功能类似于编程类。它将数据(包括电池寿命、消息和联系人)和函数(包括呼叫、文本和浏览)存储在一个地方。作为用户,我们可以轻松地与屏幕(公共接口)进行交互,而内部工作则被隐藏起来。这就是封装,它在保护和隐藏内部机制的同时提供了有用的功能。

封装的语法

它具有以下语法:

在这个语法中,

  • Private(私有):它表示不能从类外部直接访问的私有变量。
  • Public(公共):它表示公共变量并提供对数据的安全访问。
  • setData:它有助于安全地修改私有数据。
  • getData:它有助于安全地访问私有数据。

C++ 封装示例

让我们举一个例子来演示 C++ 中的封装。

示例

编译并运行

输出

The name of the student is: Joseph
The roll number is: 1
The grade is: 97.5%

Updated Student Details:
The name of the student is: John
The roll number is: 1
The grade is: 94.3%

说明

在此示例中,我们创建了一个 Student 类,将数据成员(name、roll_no 和 grade)设为私有,并通过公共方法进行访问。之后,我们使用一个初始化这些成员的构造函数,而像 ChangeName() 和 ChangeGrade() 这样的 setter 方法允许受控的更新。最后,像 nameGet() 和 gradeGet() 这样的 getter 方法提供了安全的只读访问。

封装的类型

C++ 中,封装主要分为三类。这些类型如下:

1) 成员变量封装

在 C++ 中,所有数据成员都声明为 private,并且可以通过公共 getter 和 setter 方法进行访问或修改。它有助于保护数据免受直接外部访问。

2) 函数封装

在 C++ 中,一些函数被保留为 private,而其他函数是 public 的。这有助于减少暴露给外部的进程数量。

3) 类封装

嵌套类在其他类中被声明为 private。它使我们能够限制外部代码对内部类的访问。

访问说明符在封装中的作用

在 C++ 中,访问说明符对于实现封装至关重要。它们指定如何在程序的不同部分以及从何处访问类成员(如数据和函数)。C++ 有三个主要的访问说明符:

Encapsulation in C++

1) Public(公共)访问说明符

在 C++ 中,声明为 public 的数据成员可以在程序中的任何位置访问。这意味着任何函数或类都可以直接在类内外访问或修改这些成员。

2) Private(私有)访问说明符

当一个成员被声明为 private 时,它只能被同一类的成员访问。任何外部访问都会导致编译错误。它确保重要信息保持隐藏和受保护。

3) Protected(保护)访问说明符

在 C++ 中,protected 访问说明符主要用于指定一个类成员可以在类本身及其派生类中访问。这意味着任何函数或对象都不能在类外部访问类的 protected 成员。类的 protected 成员通常用于表示必须对其派生类可访问的类的实现。

使用访问说明符的 C++ 封装示例

让我们举一个例子来演示 C++ 中使用访问说明符的封装。

示例

编译并运行

输出

Account Holder: John
Balance: $1670.8

说明

在此示例中,我们使用 Bank_account 类演示了封装,其中我们将账户持有人的姓名和余额作为 private 数据成员。访问成员通过公共 setter 和 getter 方法进行控制。之后,setAccHolder() 方法设置姓名,deposit() 方法向余额中添加资金,getter 函数提供只读访问。

C++ 中为什么要有封装?

在 C++ 中,封装是面向对象编程 (OOP) 的一个基本概念,它需要将数据和操作数据的方法组合到一个类中。它通过限制对数据的直接访问来保护对象的内部状态免受意外或不当的篡改。

封装通过控制方法(通常称为 getter 和 setter)强制进行访问。这些公共方法控制内部数据的读取和更新方式,从而确保只执行有效操作。

封装之所以重要,有几个原因:

  • 它确保对象拥有其数据的所有权,从而防止程序其他部分发生意外更改。
  • 它通过允许类用户依赖函数的行为而无需了解其内部工作原理,从而实现更清晰的代码。
  • 由于数据流受到限制并仅限于指定的访问点,因此调试和测试变得更加容易。
  • 它通过允许内部实现进行演变而不影响外部代码来提高程序的安全性、可维护性和灵活性。

封装的特点

C++ 中的封装有几个特点。一些主要特点如下:

  • 数据隐藏:它维护内部类的私密性,以防止未经授权的访问和修改。它只允许特定的函数访问或修改数据。
  • 抽象:它允许我们只看到必要的信息,而隐藏复杂的内部逻辑。它简化了操作,避免了最终用户的混淆。
  • 访问控制:访问控制通过访问说明符管理数据可访问性。它有助于规范类中显示的内容和隐藏的内容。
  • 模块化:它使我们能够创建类模块,其中类既独立又可重用。每个类都可以独立创建和测试,以提高可维护性。
  • 受控交互:它确保数据仅通过多种方式进行安全修改。它防止对对象状态进行任何意外或不必要的修改。

封装的优点

C++ 中的封装有几个优点。一些主要的封装优点如下:

  • 在 C++ 中,封装通过将类成员声明为 private 并将访问限制为特定功能来保护敏感数据。它有助于避免直接的外部篡改并维护数据完整性。
  • 它有助于防止未经授权的程序部分更改内部数据。这在银行业、医疗保健和金融等关键领域尤其重要,在这些领域,数据安全至关重要。
  • 封装的类作为独立的构建块工作。它有助于提高代码的清晰度和组织性,同时也简化了协作。
  • 由于内部细节是隐藏的,因此可以进行修改而不会影响依赖于该类的外部代码。

封装的缺点

C++ 中的封装有几个缺点。一些主要的封装缺点如下:

  • 在 C++ 中,由于需要许多 getter 和 setter 函数,封装可能会导致代码长度增加。
  • 在 C++ 中,无法直接访问 private 成员。

结论

总之,封装对于创建安全、组织良好且可维护的应用程序至关重要。它通过将数据和相关函数组合到一个类中并通过受控接口限制直接访问来保护对象的内部状态。它不仅确保数据完整性和安全性,还促进了模块化、代码重用和更清晰的软件架构,使其成为有效面向对象编程中的一个关键原则。

C++ 封装选择题

1) C++ 中的封装意味着什么?

  1. 实现数据隐藏
  2. 仅使用继承
  3. 函数可以重载
  4. 编写内联函数
 

答案:a) 实现数据隐藏。


2) 在 C++ 封装中,使用哪种访问说明符来限制对类成员的访问?

  1. public
  2. protected
  3. private
  4. 全局
 

答案:c) private(私有)


3) 如何在 C++ 中实现封装?

  1. 将所有变量定义为全局。
  2. 将变量设为 public(公共)
  3. 编写多个 main 函数
  4. 将数据和函数组合在一个类中
 

答案:d) 将数据和函数组合在一个类中。


4) C++ OOP 中封装为何如此必要?

  1. 增加内存利用率。
  2. 提高安全性和模块化
  3. 减慢程序性能
  4. 增加代码复杂性。
 

答案:b) 提高安全性和模块化


5) 以下哪个选项代表了 C++ 中封装的最佳优势?

  1. 全局数据访问
  2. 直接对象访问
  3. 隔离的修改和安全的数据
  4. 所有成员都公开暴露
 

答案:c) 隔离的修改和安全的数据


下一个主题OpenGL C++