封装与数据隐藏

时间:2012-03-13 14:10:11

标签: c++ oop

封装是一种技术,通过该技术提供(公共)功能,这些功能对隐藏数据(私有)进行操作并返回结果。

内部数据可以通过多种方式实现(bcoz隐藏),而不会影响界面。

这是否意味着,封装与数据隐藏相同?

3 个答案:

答案 0 :(得分:2)

你有谷歌吗?

前几个答案还可以:

检查一下:

http://www.cplusplus.com/forum/general/21916/

数据隐藏是一种极端的封装版本,您不仅不希望用户访问数据成员,而且您甚至不希望他们能够看到它们是什么。这通常通过使用void指针或前向声明的struct指针作为类数据来完成。

答案 1 :(得分:2)

我不会这么说。封装更像是一种OOP习语。它与您想要隐藏数据的事实几乎没有关系,而是控制它的访问方式。仅仅因为某些数据是私有的,并不意味着它是隐藏的。

想象一下调试并且无法看到私人成员。

对于数据隐藏,可以使用其他技术 - 如the Cheshire cat pattern (or Opaque pointer pattern)

在这种情况下,实际数据的大部分知识都会在实现中丢失,而不是因为它是private,而是因为它是隐藏的。

答案 2 :(得分:1)

使用private或protected as encapsulation提供保护shell但不完全隐藏实现。

如果更改了类的私有实现,则仍需要重建所有使用它的类,这就是人们使用“pImpl”和类似技术完全隐藏实现细节的原因。

在C中,没有私有或受保护,但是通常会在前向声明的结构上创建一个用户永远不会看到的实现(例如FILE *),甚至是void *指针,这些指针通常是某些Handle类型的类型定义

我将参考 Herb Sutter's blog about using pImpls

我通常会说通过私有/公共使用封装是一种弱抽象形式,数据隐藏是一种更强大的抽象形式(如果抽象是隐藏实现细节的好词),但术语一直是我的一个弱点。

然而,即使你打算使用pImpl或其他什么,你也不希望任何类或任何你喜欢的任何你喜欢的实现细节。通常有关于什么可以做什么的规则,这就是“封装”模型真正带来的。

有些人认为朋友打破了封装,但它实际上可以增强封装,例如,让工厂对象写入类的私有成员。工厂对象就像正在建造房屋的建筑商一样,并且您可以让他们将所有东西都放在正确的位置。

如果您编写单元测试(并且您应该),您也可以允许您的单元测试访问您班级的私人成员,以测试您的实施是否正确。

因此,封装和数据(实现)隐藏都是很好的事情,应该以适当的方式使用。他们在分配角色方面也达到了类似的目的,但并不完全相同。