C++ FAQ阅读笔记[1]

类别:编程语言 点击:0 评论:0 推荐:

[7.1]什么是类(class)?

它是面向对象软件的基本构成模块.

一个类就定义了一种数据类型,就像在C中的struct的作用相似。在计算机科学角度上讲,一个类型由一系列的状态和一系列的改变这些状态的操作组合。这样的话,int可以说是一个类型,因为它有一系列的状态而且它有一些对于这些状态的操作,如j+j或i++,等。与此完全相同的是,一个类提供了一系列的这样的(通常都是public型的)操作,和一系列的表示这个类型可以是的抽象的值的数据位(通常不是public的)。

你可以把int想象为一个有成员函数"++"的类,等(int其实并不是一个实,这样说是说明了以下的这样一个比喻:一个类是一种类型,就跟int就是一个类型一样。)

注意:C程序员可以把类想成一个默认成员都是私有型(private)的C的struct。但是如果那是你关于一个类想的所有的东西的话,你可能需要自己做一些实例来增加一些面向对象的经验

[7.2] 什么是对象?
一个有相关语义的存储区域称为一个对象。

当你定义了一个变量int i,我们说"i是类型int的一个对象"。在面向对象中,"对象"通常是指"类的一个实例"。这样一个类就定义了很多个该类的实例对象的可能的行为。

[7.3]什么时候使用接口是"好"的?
当它提供了对于一大堆类的简化视图(chunk of software),并且它能使用一个用户的词汇表达出来时,使用接口是"好"的。
"一大堆"的通常是一个或一群紧密关联的类,"用户"是指其他开发者,而不是指最终用户.
简化的视图意思是不必要的细节内容被故意地隐藏起来了。这就减少了用户出错的机率。
用户的词汇是指用户不需要去学新的词或概念就可以理解的意思。这样就降低了用户了解它的弯路。

[7.4]什么叫封装?
为了防止对一些信息和功能的未经认证的访问。

封装关键的思想是把软件中不稳定的块从稳定的块中分离出来。封装把软件块周围围上一个防火墙,这样会阻止软件其他的块访问不到不稳定的块,它们只能访问稳定的部分。这样就防止了它们在不稳定的部分被改动之后不可以正常工作。在面向对象中,"块"(chunk)通常是指一个或一群紧密关联的类。

不稳定的部分指实现的细节。如果块是单个类,不稳定的部分通常用private和protected进行封装。如果它是一群紧密关联的类的块,封装就可以用来防止对这一群类的完全的访问。继承也可以被看为是一种形式的封装。

稳定的部分是指接口部分。一个好的接口可以用用户的词汇来提供简化的视图,而且它是同由外向内设计的(这里"用户"是指另一个开发者,而不是最终的购买用户")。
如果它是单个类的块,这个接口就是这个类的public部分:成员函数和友员函数.
如果它是一群类的块,接口会在块中包括多个类。

设计一个清晰的接口并把接口从实现中分离出来仅是让用户可以使用这些接口,但是封装接口实现的过程是强迫用户去使用这些接口。

[7.5]C++如何平衡安全性和可用性(易用性)?
在C中,封装是通过在一组单元或模块中让成员成为静态来实现的。它防止了其他的模块访问静态内容。(顺便提一下,这样的做法已经是被不赞成的了(deprecated),不要在C++中这样做。)

不幸的是,你可以通过一个类来达到多重实例和封装。public:是一个类中包含类的接口的部分,它通常都由类的public部分构成:成员函数和它的友员函数。private:是类中包含类的实现的部分,也就是数据存在的地方。

最终的结果就是像是一个"封装了的结构体".这就降低了安全性(信息隐藏)和可用性(多重实例).

[7.6]我如何在其他的程序员可以看到我的类的私有部分的情况下造成不稳定的封装呢?
不用那么费劲 ---封装是对代码而言的,而不是对人而言的。

其他的程序员们看到你的private或protected成员不会造成你的封装不稳定,只要他们不根据他们看到的内容写其他的代码。换句话说,封装不能防止人们知道一个类中的内容,它只能防止写的代码与类的内部相独立。你不需要花"维护费用"来维护你两耳之间的灰白色的东西,但是你不得不花"维护费用"来维护从你手间编写出来的代码。你所能知道的就是不要增加维护的费用,写一些依赖于接口的代码而不是依赖于它的实现过程的。

另外,这常不是问题。我不知道哪个程序员会故意写代码来访问一个类的私有成员,"我的建议是在这样的情况下换个程序员,而不是换代码"[James Kanze]


[7.7] 封装是一种安全措施吗?
不。
封装 != 安全
封装只是防止错误,而不是用来查安全问题的间谍。

[7.8] struct关键字和class关键字有什么区别吗?
struct的成员和基本类在默认的情况下是public型的,但是在类中的时候,它们默认是private的。
注意:你应该让你的基成员有明确的public,private,protected性,而不是依赖于默认情况。
另外,struct和class在功能上是相同的。


好的,让我们结束这种纯的技术性讨论。感情上讲,大部分程序员会把一个类跟一个结构体的界限划得很清楚。一个结构体让人感觉是一系列有极少封装性和函数的开放的数据位。一个类让人感觉就是一个活生生的成员的集合和与它们相关的智能的服务,它是一个强封装性的屏障和一个定义的很完善的接口。因为这是大部分人已经有的感觉,你应该在当一个只有极少方法且只有公有成员的类的情况下用结构体来代替类(这样的东西在设计很好的系统中是实际存在的!)

本文地址:http://com.8s8s.com/it/it23310.htm