C++ 中的数据封装
所有 C++ 程序都由以下两个基本元素组成 -
程序语句(代码) - 这是程序中执行操作的部分,它们被称为函数。
程序数据 - 数据是程序中受程序函数影响的信息。
封装是一种面向对象编程概念,它将数据和操作数据的函数绑定在一起,并确保两者免受外界干扰和滥用。数据封装引出了面向对象编程 (OOP) 中一个重要的概念:数据隐藏。
数据封装是一种将数据及其使用方法捆绑在一起的机制,而数据抽象则是一种仅公开接口、向用户隐藏实现细节的机制。
C++ 通过创建用户定义的类型(称为类)来支持封装和数据隐藏的特性。我们已经学习过,类可以包含私有、受保护和公共成员。默认情况下,类中定义的所有项都是私有的。例如:
class Box { public: double getVolume(void) { return length * breadth * height; } private: double length; // box 盒子的长度 double breadth; // box 盒子的宽度 double height; // box 盒子的高度 };
变量 length、breadth 和 height 是 private 的。这意味着它们只能被 Box 类的其他成员访问,而不能被程序的任何其他部分访问。这是实现封装的一种方式。
要使类的某些部分成为 public(即可以被程序的其他部分访问),必须在 public 关键字后声明它们。在 public 说明符后定义的所有变量或函数都可以被程序中的所有其他函数访问。
将一个类设为另一个类的友元会暴露实现细节,并降低封装性。理想情况下,每个类的细节应尽可能地对其他所有类隐藏。
数据封装示例
任何在 C++ 程序中实现具有 public 和 private 成员的类都是数据封装和数据抽象的示例。请考虑以下示例 -
#include <iostream> using namespace std; class Adder { public: // 构造函数 Adder(int i = 0) { total = i; } // 外部接口 void addNum(int number) { total += number; } // 外部接口 int getTotal() { return total; }; private: // 隐藏来自外界的数据 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 对外部世界隐藏,但对于类的正常运行必不可少。
设计策略
我们大多数人都学会了默认将类成员设为私有,除非我们确实需要公开它们。这就是良好的封装。
这最常用于数据成员,但它同样适用于所有成员,包括虚函数。