C++中的封装
封装是将数据和特征归入一个单一部分的方法。这个部分被称为类。这样做是为了保护对数据的直接访问。
封装是面向对象编程(OOPs)的特征之一。在C++中构建用户限定的类支持封装和数据隐藏。
封装和抽象
数据抽象是一个过程,程序员通过这个过程来决定哪些数据要显示在公共场合;尽管如此,抽象的实际执行也不过是封装(Encapsulation),它是通过使用访问修饰符来完成的。你可能会说,Encapsulation是Abstraction的实现。
抽象和封装的区别
- 抽象本身是一个涉及获取信息的过程,而封装,在另一边,涉及到包含信息的方法。
- 抽象是一种掩盖不需要的数据并揭示有用信息的技术。另一方面,封装是将代码和数据结合成一个统一的单元,以保护数据不被外界看到的过程。
- 封装涉及掩盖对象如何做某事的内部细节或机制。相比之下,抽象允许你专注于项目的作用,而不是它如何做。
- 抽象是通过使用抽象类和接口来实现的,而封装则是通过使用访问修改器(Public, Protected, and Private)来实现的。
封装与继承
封装将一个代码与它所扭曲的数据联系起来。继承允许一个类继承另一个类的属性和功能。封装的例子是一台ATM机,它绑定了几种面额的钞票和所有取钱的必要活动。
继承可以在汽车、自行车、公共汽车、卡车等车辆的分类中看到。继承意味着一个子类获得其主类的特征和功能。封装指出,一个类不应该访问另一个类的私有数据。
封装是如何实现的
封装在C++中被实现为一个封装数据和对其进行操作的方法的类。数据通常被指定为私有的,这样它就不能被类之外的人访问。
公有函数被定义,可以通过使用类的对象来检索。然而,我们不能公开地访问私有成员的数据,这被称为 "数据隐藏"。数据是受保护的,可以由定义它的类的函数查看,当这一点被执行时。下面是它的执行方式。
#include <iostream>
using namespace std;
class Player {
private:
// Private attribute
int Goals;
public:
// Setter
void setGoals(int g) {
Goals = g;
}
// Getter
int getGoals() {
return Goals;
}
};
int main() {
Player myObj;
myObj.setGoals(10);
cout << myObj.getGoals();
return 0;
}
goals 属性是私有的,它的访问是受限制的。public setGoals() 方法接受一个参数(g) 并将其分配给goals 属性(goals = g) 。public getGoals() 方法返回私有目标属性的值。在main() ,我们创建一个Player 类的对象。现在我们可以使用setGoals() 方法来设置私有属性的值为10。然后我们在该对象上调用getGoals() 方法来返回该值。
为什么要进行封装
封装对于保持一个项目的信息不被用户发现是至关重要的。这就是使一个类别的所有成员变量成为个人的、最大的成员能力成为公共的动机。
成员变量是个人的,这样就不能从类的外部立即访问这些变量。因此,最大的成员能力是公开的,以允许用户通过他们自己的能力进入个人的记录。例如,当你打开一个电水壶,水达到沸点时,它就会自动关闭。我们不知道水壶关闭背后的机制。里面发生的事情就是封装。
封装的类型
在OOP中,有三种形式的封装,如下所示。
- 类的封装。
- 函数封装。
- 成员变量的封装。
如标题所示,在成员变量封装下,所有数据成员都是私有的。任何想要改变或获取数据成员值的对象都可以使用Set和Get函数。相反,函数封装中的一些函数和构造函数被声明为私有。在类封装中,整个类被指定为私有。
封装的作用
- C++中的封装有助于将相关部分组合成一个统一的类,使代码更清晰,更容易理解。
- 用户对get()和set()方法有读和写的权限。这导致了数据的安全保存。
- 数据打包促进了总体上的增长。这些包装可以独立测试、调试和运行而不影响其他元素。
- 数据隐蔽是一种很好的方法,可以使你的数据不受不必要的影响。因此,代码的安全性得到了更进一步的加强。
使用封装的数据隐藏
将数据和操作合并成一个统一的片段的技术被称为数据隐藏。数据隐藏是基于将数据隐藏在一个类中以限制从该类之外直接访问的想法。
数据隐藏有助于程序员创建具有不同数据集和功能的类。它可以防止来自其他程序类的不必要的渗透。数据隐藏掩盖了类的数据集成分,但封装掩盖了类的数据部分以及私有函数。
你现在必须熟悉访问指定器,以理解数据隐藏。类数据通常是私有的,而函数是开放的。数据被埋藏起来以保护它不被无意中修改。
访问指定器在封装中的作用
在C++中,访问指定器被用来隐藏数据。根据使用的访问指定器的类型,类成员可以有不同程度的可访问性。访问规范器的三种类型是:公共规范器、私有规范器和保护规范器。
私有访问修改器
当一个数据组件或成员函数被设置为私有时,它可以被访问,不能被该类以外的任何人查看。当被非该类成员的对象访问时,会产生一个故障。
公共访问修改器
如果在创建类时应用了公共访问指定符,那么基类的公共数据成员就会变为派生类的公共成员,受保护的元素在派生类中也会变成受保护的。然而,基类的秘密成员仍然是隐藏的。
受保护的访问修改器
受保护的访问指定器是一种独特的访问指定器。当一个数据函数被保护时,它的行为类似于私有,可以被类成员访问。它也可以通过该类的任何一个子类来访问。
#include <iostream>
using namespace std;
class Example {
private:
int num;
public:
void set(int input1)
{
num = input1;
}
int get()
{
return num;
}
};
int main()
{
Example obj;
obj.set(10);
cout << obj.get() << endl;
return 0;
}
在上面的例子中,我们使用private访问指定器封装了varnum 。然后我们使用了public 访问指定符,使其可以从其他类中使用,也就是main 类。
现实生活中的封装例子
- 自动售货机。一台自动售货机自动处理客户的请求,而设备本身则提供饮料。在这种情况下,自动售货机就是这个类。它包括封装在自动售货机中的数据(饮料)和操作(服务机制)。这被称为封装。
- 洗衣机。电源按钮的作用是什么?在所有情况下,它都能打开机器。但你有没有考虑过,洗衣机打开后里面会发生什么?这就是封装的意义所在。物体被包裹起来,其内部特征被掩盖起来。
结论
OOP最重要的属性之一就是封装。它允许我们掩盖信息。因此,数据更加安全,并被保护起来,避免了不必要的使用。封装支持抽象化,只向终端用户提供适当的接口,同时隐藏所有其他功能。