荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: Part of C++ FAQ Lite[7]--类和对象
发信站: 荔园晨风BBS站 (Thu Jun  7 05:20:22 2001), 转信

[7] 类和对象
(part of c++ faq lite, copyright ? 1991-96, marshall cline, cline@parashift.
com)
----------------------------------------------------------------------------
----
faqs in section [7]:
[7.1] 类是什么?
[7.2] 对象是什么?
[7.3] 什么样的接口是“好”的?
[7.4] 什么是封装?
[7.5] c++是如何在安全性和可用性间取得平衡的?
[7.6] 我如何才能防止其它程序员查看我的类的私有部分而破坏封装?
[7.7] 封装是一种安全装置吗?
[7.8] 关键字 struct 和 class 有什么区别?
----------------------------------------------------------------------------
----
[7.1] 类是什么?
面向对象软件的基本组成物
类定义数据类型,就如同 c 中的结构。从计算机科学的角度来理解,类型由状态集合和
转换
这些状态的操作集合组成。因为 int 既有状态集合,也有象 i+j 或 i++ 等这样的操作
,所
以 int 是一种类型。同样,类提供了一组操作集合(通常是 public: )和一组描述类
型实
例所拥有的抽象值的数据集合。
可以将 int 看作为一个有 operator++ 等成员函数的类。
注意: c 程序员可以将类看作为成员默认为私有的结构。但是,如果那是你对类的全部
认识,
那么你可能需要亲自去体验这种转换。
----------------------------------------------------------------------------
----
[7.2] 对象是什么?
和语义有关的存储区域
当我们声明了 int i,我们说:“i 是 int 类型的一个对象”。在 oo/c++ 中,“对象

通常意味着“类的一个实例”。因此,类定义多个对象(实例)的可能的行为。
----------------------------------------------------------------------------
----
[7.3] 什么样的接口是“好”的?
提供了一个将“模块”的软件简化的视图并且以“用户”的词汇表达的接口。(“模块
”通
常是指一个或一组紧密相连的类;“用户”是指其它的开发者而不是最终客户)
“简化的视图”指隐藏不必要的细节。这样可以减少用户的错误率。
“用户的词汇”指用户不需要学习新的单词或概念,这样可以降低用户的学习曲线。
----------------------------------------------------------------------------
----
[7.4] 什么是封装?
防止未授权地访问一些信息和功能。
关键是从软件模块的稳定部分中分离出可变的部分。封装给模块安置了防火墙,它可
以防止其它模块访问可变的部分;其它模块仅仅能够访问稳定的部分。这样做,当可
变的部分改变后,可以防止其它模块被破坏。在面向对象软件的概念中,“模块”通
常指一个或一组紧密相连的类。
“可变的部分”是实现的细节。如果模块是单个类,那么可变的部分通常用 private:
和/或 protected: 关键字来封装。如果模块是一组紧密相连的类,封装可被用来拒绝
对组中全部类的访问。继承也能被用来作为封装的一种形式。
“稳定的部分”是接口。好的接口提供了一个以用户的词汇简化的视图,并且被从外
到里的设计。(此处的“用户”是指其它开发者,而不是购买完整应用的最终用户)。

如果模块是单个类,接口仅仅是类的 public: 成员函数和友元函数。如果模块是一组
紧密相连的类,那么接口可以包括模块中的多个类。
设计清晰的接口并且将实现和接口区分,只不过是允许用户使用接口。而封装实现可以

强迫用户使用接口。
----------------------------------------------------------------------------
----
[7.5] c++是如何在安全性和可用性间取得平衡的?
在 c 中,封装是通过在编辑单元或模块中,将对象声明为静态来完成的。这样做
防止了其他模块访问静态对象。(顺便说一句,现在这种做法是被遗弃的:不要在
c++中这样做)
不幸的是,由于对一个模块的静态数据制作多个实例的直接支持,所以这种处理方
法不支持数据的多个实例。在 c 中如果需要多个实例,那么程序员一般需要一个结
构。但是很不幸,c 的结构不支持封装。这增加了在安全性(信息隐藏)和可用性
(多实例)之间取得平衡的难度。
在 c++中,你可以利用类来同时获得多实例和封装性。类的public: 部分包含了类
的接口,它们通常由类的 public: 成员函数和它的友元函数组成。类的 private:
和/或 protected: 部分包含了类的实现,而通常数据就在这里。
最终的结果就象是“封装的结构”。这样就易于在安全性(信息隐藏)和可用性(多
实例)间取得平衡。
----------------------------------------------------------------------------
----
[7.6] 我如何才能防止其它程序员查看我的类的私有部分而破坏封装?
不必这么做——封装是对于代码而言的,而不是对人。
只要其它程序员写的代码不依赖于他们的所见,那么即使它们看了你的类的 private:
和/或 proteced: 部分,也不会破坏封装。换句话说,封装不会阻止人认识类的内部。

封装只是阻止他们写出依赖类内部实现的代码。你的公司不必为维护你眼睛看到的支付

维护成本,但是必须为维护你的指尖写出的代码支付维护成本。正如你知道的,倘若他

们写的代码依赖于接口而不是实现,就不会增加维护成本。
此外,这很少成为一个问题。我想不会有故意试图访问类的私有部分的程序员。“在这

种情况下,我的建议将改变程序员,而不是代码”[james kanze, kanze@gabi-soft.fr
;
授权使用]
----------------------------------------------------------------------------
----
[7.7] 封装是一种安全装置吗?
不。
封装 != 安全。
封装要防止的是错误,而不是间谍。
----------------------------------------------------------------------------
----
[7.8] 关键字 struct 和 class 有什么区别?
struct 的成员默认是公有的,而类的成员默认是私有的。注意:你应该明白地声明
你的类成员为公有的、私有的、或者是保护的,而不是依赖于默认属性
struct 和 class 在其他方面是功能相当的。
好,清晰的技术谈论够多了。从感情上讲,大多数的开发者感到类和结构有很大的差
别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠
的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。
既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情

在良好设计的系统中是存在的!)时,你也许应该使用 struct 关键字,否则,你应该
使用 class 关键字

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.16]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店