C++ Encapsulation
所有C ++程序都由以下两个基本元素组成 -
Program statements (code) - 这是执行操作的程序的一部分,它们被称为函数。
Program data - 数据是受程序功能影响的程序信息。
封装是一种面向对象的编程概念,它将操作数据的数据和功能绑定在一起,并保护其免受外部干扰和误用。 数据封装导致了重要的OOP data hiding概念。
Data encapsulation是捆绑数据的机制,使用它们和data abstraction是仅暴露接口并从用户隐藏实现细节的机制。
C ++通过创建用户定义类型(称为classes支持封装和数据隐藏的属性。 我们已经研究过一个类可以包含private, protected和public成员。 默认情况下,类中定义的所有项都是私有的。 例如 -
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,widthth和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
上面的类将数字加在一起,并返回总和。 公共成员addNum和getTotal是外部世界的接口,用户需要知道它们才能使用该类。 私有成员total是对外界隐藏的东西,但是课程需要正常运作。
设计策略
除非我们真的需要公开它们,否则我们大多数人都学会了默认将类成员设为私有。 这只是很好的encapsulation 。
这最常应用于数据成员,但它同样适用于所有成员,包括虚拟功能。