所有的C++程序有以下两个基本要素:
-
程序语句(代码):这是一个程序,执行动作的一部分,并且它们被称为功能。
-
程序数据:数据是受到程序功能的程序影响的信息。
封装是操纵数据的数据和功能结合在一起的面向对象编程的概念,并保持既安全以及不受外界干扰和误用。数据封装是数据隐藏的重要OOP概念。
数据封装是绑定的数据的机制,使用它们和数据抽象的功能是仅暴露的接口和隐藏来自用户的执行细节的机制。
C++支持封装的属性和数据通过创建用户定义类型,称为类的隐藏。我们已经研究学习了类可以包含私有(private),保护(protected)和公共(public)成员。默认情况下,在一个类中定义的所有项目都是私有(private)的。例如:
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关键字后声明。所有变量或公共说明之后定义,函数在程序中的所有其他功能进行访问。
使一个类是另一个友元类公开的实施细节,这降低了封装。理想的是保持尽可能多的每个类隐藏所有其他类可能的细节。
数据封装例子:
这里是实现一个类的公共和私有成员的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是从外界隐藏的,但是需要类能正常工作。
设计策略:
我们大多数人都通过痛苦的经验教训,默认情况下使类成员设置为私有,除非我们真的需要将其暴露。这只是良好的封装。
这是最常用于数据成员,但它同样适用于所有成员,包括虚拟函数。