数据隐藏,数据封装?实际应用

时间:2011-04-06 06:39:03

标签: c++ oop encapsulation

您好,我是C ++新手,阅读C ++概念................我无法理解数据隐藏在某种意义上如何实际使用或实际使用时间。

问题:据我所知,数据隐藏将在C ++中实现,以隐藏正在使用的实际数据 通过在类中声明一些数据私有来假设在程序中幕后。 制作和编译C ++程序时....考虑一些游戏的例子, 可执行文件(.exe或unix中的其他执行文件)将被提供给用户吗?

所以我在这里感到困惑? 现在我的数据隐藏在哪里?当用户使用可执行文件(.exe)时因为我的意见.exe无法被用户读取或打开以查看文件的内容。 即使我公开所有变量...仍然隐藏数据,因为用户只有.exe文件,用户无法读取或操作?

请建议伙计们?在我认为错误的地方给出一些反馈

8 个答案:

答案 0 :(得分:1)

数据隐藏是指当某人使用链接/使用您的代码的代码时隐藏数据。它被用作安全机制,以确保始终正确构造对象。它还用作用户处理接口的抽象方法,但底层实现可以“随意”更改,而无需重新编写使用该代码的任何代码(例如,重命名字段名称或删除它)完全地)。

示例:

日期类可以保存月份的月份,年份和日期。根据月份的不同,本月有效日期不同(有些是30天,有些是31天,2月是28/29)。此外,只有一定数量的有效月份(可以使用枚举)。如果您允许用户直接修改月份日期字段,则无法确保该对象始终包含有效数据。数据隐藏用于防止用户直接访问此数据,并且用户使用访问器方法来获取/修改字段。这些方法可以有代码来确保只输入有效数据。

现在,如果在以后确定将日期表示为2010年1月1日起的天数更好。用户仍然可以使用先前定义的访问器方法,这将适当地转换输入/输出。

答案 1 :(得分:1)

什么是数据封装?
数据封装将数据和对数据进行操作的功能绑定在一个单元中 你如何实现数据封装? 通过创建一个类型。例如:阶级,结构等。

什么是数据抽象?
数据抽象隐藏了您的类型与外部世界的复杂性 您如何实施数据抽象? 使用Access说明符。例如:公共,私人,受保护。

访问说明符是谁隐藏数据?
Access说明符隐藏来自类/结构对象的用户的数据(通过不提供对数据的直接访问)。

将游戏中的类视为一个单独的单元,其他功能(源代码)使用它来执行某些功能。通常,A类具有对状态执行操作的状态和方法。访问说明符隐藏了类的成员与其他源代码(可能是类或结构)。其他代码可以创建类的对象,并可以通过类公开的公共方法修改类数据成员中的状态存储。因此,Access说明符提供了一种有组织的方式来访问类成员。

答案 2 :(得分:1)

举一个简单的例子:

有一个ArrayList,它有一个成员 - listSize来定义它的大小。如果没有数据封装或数据隐藏,此ArrayList的用户可以将其设置为除元素数量以外的任何值。
完全是一个灾难。

答案 3 :(得分:1)

数据隐藏是一种控制应用程序的一部分中的代码依赖的方式应用程序另一部分中的代码。也就是说,当一位代码发生变化时,一个或多个其他代码位是否也需要更新?尽可能地,你希望答案是“不”,因为否则你对程序所做的每一点改变都会在程序进入稳定状态之前开始出现大量的后续变化,然后它将再次正常运行。为了阻止程序员任意依赖于类实现的任何方面,并鼓励他们只依赖于类的对象为客户端执行其预期功能所需的可控部分,您可以指定数据和/或允许客户端使用的功能:即“公共”和/或“受保护”接口。如果没有客户端代码需要关注,您希望能够更改的其他内容应该private

这完全与开发有关,与程序在运行时处理的数据无关,或者保护程序逻辑/数据不被最终用户窥探

作为一个例子,taskinoor适当地引用了一个Date类,它确保存储的日期保持有效,这样客户端代码就不能直接进入并将日期设置为“2月31日”或其他一些非敏感值。此外,在不影响客户的情况下,可以更改数据布局,例如将三个数字存储日,月和年更改为一个数字存储天数,从而在不影响客户的情况下存储天数(产生不同的性能配置文件 - 通过日期更快的相对移动)但转换为D / M / Y值的转换速度较慢。)

答案 4 :(得分:0)

数据隐藏更多的是隐藏其他程序员的实现。

简单示例:

你有一个Car类,它包含一个公共方法Drive 还有一个属性DieselEngine,因为您不希望用户知道您在DieselEngine私密的护理中使用了什么引擎。稍后您可以用PetrolEngine替换引擎,但由于用户只能使用Drive,因此当您给他更新时,他不必更改代码。

答案 5 :(得分:0)

您的术语数据隐藏错误。它不是隐藏在用户之外,它意味着隐藏在其他程序员之外。

例如,您正在使用由另一个程序员开发的Stack类。你有推送和弹出价值的方法。但是你不知道堆栈是如何实现的。它本可以使用数组,或者它可以使用链表来存储值。但是你并不关心作为班级用户的细节。你们都知道你可以推进和弹出它。这里堆栈的内部数据对你来说是隐藏的。堆栈开发人员负责维护内部存储,而不是你使用它时。

答案 6 :(得分:0)

你需要分配比任何人都可以在这个简短的论坛中输入的内容。我会建议这本书:

Design Patterns Explained: A New Perspective on Object-Oriented Design (2nd Edition)

它将解释面向对象设计的各种元素的目的是什么。例如,什么是封装,为什么要使用它?你实际封装的是什么?

答案 7 :(得分:0)

看看std::vector<T>std::map<K, V>等任何非平凡数据结构的实现,您将立即了解数据隐藏的好处:客户端不必知道这些数据的方式结构是在引擎盖下实现的,他可以简单地使用它们。