C++ 数据封装
所有C++程序都由以下两个基本元素组成 –
- 程序语句(代码) - 这是程序的一部分,执行操作,被称为函数。
-
程序数据 - 数据是程序的信息,受程序函数影响。
封装是面向对象编程的概念,它将操作数据的数据和函数绑定在一起,并使它们免受外部干扰和误用。数据封装引导了重要的面向对象编程概念—— 数据隐藏 。
数据封装 是一种将数据和使用它们的函数捆绑在一起的机制,而 数据抽象 是一种只公开接口并隐藏实现细节的机制。
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
以上类将数字相加,并返回其总和。公共成员 addNum 和 getTotal 是与外界通信的接口,用户需要了解它们才能使用该类。私有成员 total 对外界是隐藏的,但对该类的正常运行是必需的。
设计策略
大多数人都已经习惯了默认将类成员设置为私有,除非我们真的需要将其公开。这就是良好的 封装性 。
这个规则最常应用于数据成员,但同样适用于所有成员,包括虚函数。