分享
 
 
 

C++ FAQ Lite[7]--类和对象(更新)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

[7] 类和对象

(Part of C++ FAQ Lite, ]Copyright © 1991-2001, Marshall Cline, cline@parashift.com)

简体中文版翻译:申旻nicrosoft@sunistudio.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++ 等成员函数的类。(int 实际并不是一个类,但是基本类似:一个类是一种类型,就如同 int 是一种类型)

注意: C 程序员可以将类看作为成员默认为私有的结构。但是,如果那是你对类的全部认识,那么你可能要经历个人的典范转变了。

[ Top | Bottom | Previous section | Next section ]

[7.2] 对象是什么?

和语义有关的存储区域

当我们声明了int i,我们说:“i 是 int 类型的一个对象”。在 OO/C++ 中,“对象”通常意味着“类的一个实例”。因此,类定义多个对象(实例)的可能的行为。

[ Top | Bottom | Previous section | Next section ]

[7.3] 什么样的接口是“好”的?

提供了一个将“块”状的软件简化了的视图,并且以“用户”的词汇表达的接口。(“块”通常是一个或]一组紧密相连的类;“用户”是指其它的开发者而不是最终客户)

“简化了的视图”指隐藏不必要的细节。这样可以减少用户的错误率。

“用户的词汇”指用户不需要学习新的词汇或概念,这样可以降低用户的学习曲线。

[ Top | Bottom | Previous section | Next section ]

[7.4] 封装是什么?

防止未授权地访问一些信息和功能。

省钱的关键是从软件“块”的稳定部分中分离出可变的部分。封装给这个“块”安置了防火墙,它可以防止其它“块”访问可变的部分;其它“块”仅仅能够访问稳定的部分。这样做,当可变的部分改变后,可以防止其它“块”被破坏。在面向对象软件的概念中,“块(chunk)”通常指一个或]一组紧密相连的类

“可变的部分”是实现的细节。如果“块”是单个类,那么可变的部分通常用 ]private: 和/或 protected: 关键字来封装。如果“块”是]一组紧密相连的类,封装可被用来拒绝对组中全部类的访问。继承也能被用来作为]封装的一种形式

“稳定的部分”是接口。好的接口提供了一个]以用户的词汇简化了的视图,并且被]从外到里的设计。(此处的“用户”是指其它开发者,而不是购买完整应用的最终用户)。如果“块”是单个类,接口仅仅是类的 public: 成员函数和友元函数。如果“块”是]一组紧密相连的类,那么接口可以包括模块中的多个类。

设计一个清晰的接口并且]将实现和接口分离,只不过是允许用户使用接口。而封装实现可以强迫用户使用接口。

[ Top | Bottom | Previous section | Next section ]

[7.5] C++是如何在安全性和可用性间取得平衡的?

在 C 中,]封装是通过在编辑单元或模块中,将对象声明为静态来完成的。这样做防止了其他模块访问静态区域。(顺便说一句,现在这种做法是被遗弃的:不要在 C++中这样做)

不幸的是,由于没有对一个模块的静态数据产生多个实例的直接支持,这种处理方法不支持数据的多个实例。在 C 中如果需要多个实例,那么程序员一般使用结构。但是很不幸,C 的结构不支持]封装。这增加了在安全性(信息隐藏)和可用性(多实例)之间取得平衡的难度。

在 C++中,你可以利用类来同时获得多实例和封装性。类的 public: 部分包含了类的接口,它们通常由类的 public: 成员函数和它的友元函数组成。类的 ]private: 和/或 protected: 部分包含了类的实现,而通常数据就在这里。

最终的结果就象是“封装了的结构”。这样就易于在安全性(信息隐藏)和可用性(多实例)间取得平衡。

[ Top | Bottom | Previous section | Next section ]

[7.6] 我如何才能防止其它程序员查看我的类的私有部分而破坏封装?

不必这么做——封装是对于代码而言的,而不是对人。

只要其它程序员写的代码不依赖于他们的所见,那么即使它们看了你的类的 ]private: 和/或 proteced: 部分,也不会破坏封装。换句话说,封装不会阻止人认识类的内部。封装只是阻止他们写出依赖类内部实现的代码。你的公司不必为维护你眼睛看到的支付维护成本,但是必须为维护你的指尖写出的代码支付维护成本。正如你知道的,倘若他们写的代码依赖于接口而不是实现,就不会增加维护成本。

此外,这很少成为一个问题。我想不会有故意试图访问类的私有部分的程序员。My recommendation in such cases would be to change the programmer, not the code" [James Kanze; used with permission].

[ Top | Bottom | Previous section | Next section ]

[7.7] 封装是一种安全装置吗?

不。

封装 != 安全。

封装要防止的是错误,而不是间谍。

[ Top | Bottom | Previous section | Next section ]

[7.8] 关键字 struct 和 class 有什么区别?

struct 的成员默认是公有的,而类的成员默认是私有的。注意:你应该明白地声明你的类成员为公有的、私有的、或者是保护的,而不是依赖于默认属性

struct 和 class 在其他方面是功能相当的。

好,清晰的技术谈论够多了。从感情上讲,大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!)时,你也许应该使用 struct 关键字,否则,你应该使用 class 关键字。

[ Top | Bottom | Previous section | Next section ]

E-mail the author

[ C++ FAQ Lite | Table of contents | Subject index | ]About the author | | ]Download your own copy ]

Revised Apr 8, 2001

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有