荔园在线

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

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


发信人: Second (石开), 信区: Program
标  题: C++语言常见问题解答(1-3)
发信站: 荔园晨风BBS站 (Wed Sep 19 12:04:57 2001), 转信

===================================
■□ 第3节:周遭的、管理上的事项
===================================

Q3:什麽是 OOP?什麽是 C++?

物件导向(OO)程式技术,是我们所知发展大型而复杂的软体系统最好的方法。
C++ 是个物件导向的程式语言。C++ 可当成一个物件导向程式语言(OOPL),亦可只
当成一个“更好的 C 语言”来使用。不过,若你只把它当成“更好的 C”,你就无
法获得物件导向程式设计的好处。

提一则 OO 的广告词:软体工业刻正无法应付大型而复杂的软体系统需求。但这正是
肇因於我们的「成果」:我们过去的成功促使大家要求得更多,不幸的是,这份市场
渴求却是「结构化」分析(analysis)、设计(design)和程式设计所无法满足的
。因此,我们才得发展一个更好的典□(paradigm)。

========================================

Q4:C++ 的优点是什麽?

「C++ 的成长」:C++ 是到目前为止最受欢迎的语言。每 7.5到 9个月 C++的使用
者都会加倍。「懂 C++」是个很好的求职资格(但你必须把它当成 OOPL,而不只是一
个更好的 C 来用才行)。

「封装性 encapsulation」:藉由隐藏内部的资料结构,让我们可以改变系统的某部
份,而不必更动其他部份。我们为软体元件(称之为 class,类别)提供一个安全的
介面,用户只碰得到这个介面而已;而相对起来比较容易变动的介面「实作」部份,
就被封装起来(就像被包在胶囊里),以避免用户过於依赖他一时的实作决定。在比
较简单的 C 里头,可由模组内的静态(static)资料来办到,以避免其他模组存取
到它。

「多重案例 multiple instances」:典型的 C 语言「封装」方法(刚才有提),
做不到多重的资料案例(我们很难替模组的 "static" 资料做出多重案例)。如果在
C中要做到的话,我们得使用 "struct" 结构(但是它没有「封装性」)。在 C++里,
我们可用 "class"(物件类别)来做到多重案例与封装性:"public"公共部份包含了
它的介面(通常这里会有个特别的函数:成员函数),"private" 私有部份包含了它
的实作细节(通常这儿就是内部资料结构的所在)。

「行内函数呼叫」:在 C 中,可以在 struct 里放个 "void*"(该存取函数 [a
ccess functions] 会用到指标转型)来达到「封装的 structs」。这样会丧失型别
安全性,而且会造成过多的函数呼叫,即使你只存取结构内的小小栏位(假如你允许直
接存取结构内栏位的话,它内部的资料结构就很难再变更了,因为你的程式有太多地方
“依赖”它以前的样子)。函数呼叫的额外负担不大,但是会累积起来。C++ 的类别允
许函数作 "inline" 行内扩展,就有以下好处:□封装的安全性,□多重案例的方便
性,□直接存取的速度。而且,编译器也会检查行内函数的参数,这就比 C 的
#define 巨集更好了。

「多载运算子」:C++ 能对物件类别的运算子加以多载(overload),以合乎我们的
直觉(譬如,"myString + yourString" 可做字串串接,"myDate++"可用来递增日期
 ,"z1 * z2" 可将两复数 z1 及 z2 相乘,"a[i]" 可用来存取 "a" 这个连
结串列的第 i 个元素……等等)。你甚至可以做出个“聪明的指标”(smart pointer)
,以指向磁碟或其他地方去("x = *p" 可 dereference [解参用] 指标,也就可
以在磁碟中找到 p 所“指到”的地方,并传回其值)。这可让使用者以切近该问题的
方式来写程式,而非以机器的语言来解题。

  【译注】STL (Standard Template Library) 就大量利用到「聪明的指标」功
能。

「继承性 inheritance」:我们还只是在表层而已,事实上,我们还没进入「物件导
向」的部份呢!假设你有个 Stack 堆叠型态,有 push、pop 运算。若你还想要个
InvertableStack 型态,它“很像”Stack,只是它还有个 "invert" 运算。以 C
的 方式,你不是得□修改现存的 Stack模组(如果它在其他地方也用到的话,就麻烦了

),就是得□把 Stack拷贝到另一个档案,再加以修改之(这会导致过多重复的程式
码、容易破坏到 InvertableStack 里某些源自 Stack 的小地方,尤有甚者,得维
护双倍的程式码)。C++提供了更乾净的解决法:继承。你可以说:「InvertableStack
继承了 Stack的一切,且 InvertableStack又添加了 invert 运算。」这样子就好
了!Stack本身仍然是封闭的(未被更动到),而 InvertableStack也没重复 push/pop
等的程式码。

「多型」与「动态系结」:OOP 真正的力量不仅是继承性,还有把 InvertableStack
当成是一个 Stack来传递的能力。这是安全的,因为(至少在 C++里)此乃「是一个
……」的关系("is-a" relation),透过公共继承达到的(亦即:InvertableStack
“是一个”Stack,且它还能自我 invert 反转)。多型(polymorphism)与动态系
结(dynamic binding)最容易从实例来理解了,所以我提个典型的例子:绘图软体
得处理圆形、方形、矩形、多边形及直线,这些都是「形状 shape」。大部份绘图软
体的内部函数都需要个“形状”的参数(相对於某些像是“方形”这种特定的形状)
,譬如:当我们用滑鼠选取某个图形,它就可能被拖曳放到萤幕某处。多型和动态系
结让程式能正确运作,即使编译器只知道该参数是个「形状」,而不知它到底是什麽
形状。我们再假设刚才提到的 "pick_and_drag(Shape*)" 函数於星期二编译好了,
到了星期三,你打算再加个六边形。听起来很奇怪,但 pick_and_drag() 仍然能够
处理这个六边形,即使当 pick_and_drag() 编译时六边形还不存在!(若你明了
C++ 是怎麽做的,它就再也不惊异了--但它仍然是很方便的!)

========================================

Q5:谁在用 C++?
很多很多的公司及政府部门。相当的多。
统计上来看:当你正在读这份 FAQ文字时,就有 5 个人正成为 C++的程式员。
========================================

Q6:有任何 C++ 标准化方案在进行吗?

有的;ANSI(美国的)和 ISO(国际的)组织正密切合作。ANSI-C++ 委员会称为
"X3J16" ,而 ISO C++ 标准团体称为 "WG21"。ANSI/ISO C++ 的标准过程中包
含了 这些人:
AT&T, IBM, DEC, HP, Sun, MS, Borland, Zortech, Apple, OSF 等等等等
。每次开会约有 70 人,他们来自美、英、日、德、瑞典、丹麦、法国……
========================================

Q7:该到哪里索取最新的 ANSI-C++ 标准草案?

ISO Committee Draft for C++ 以及 ANSI C++ Draft(将要供 public rev
iew 的文
件)可如此取得:
        http://www.cygnus.com/~mrs/wp-draft

你也可以拿到 Postscript 和 Adobe Acrobat 的版本:
        ftp://research.att.com/dist/stdc++/WP

也能拿到 HTML 和 ASCII 的版本:
        ftp://ftp.cygnus.com/pub/g++

也能拿到书面版本:
        X3 Secretariat
        1250 Eye Street NW
        Suite 200
        Washington, DC  20005
        202-626-5738

你也可以用 email:

        lbarra@itic.nw.dc.us (Lynn Barra)

注明要索取最新的 "Draft Proposed American National Standard for Infor
mation
Systems -- Programming Language C++",文件编号 CD14882。它通常是用2日期

FedEx(美国境内)来递送的,所以很快就能收到。

========================================

Q8:C++ 对 ANSI-C 回溯相容吗?

几乎是。

C++ 尽可能地和 C 相容,但不能更相容了。事实上,主要的不同在於 C++ 要求函

原型:"f()" 宣告的是无参数的函数(在 C 里,"f()" 和 "f(...)" 是一样的)

还有些细微的差别,像在 C++ 里 sizeof('x') 等同於 sizeof(char),但在 C
里面
却是等同於 sizeof(int)。 而且,C++ 直接就把结构的标签(tag)当成是型别的名

字,但 C 就需要加个 "struct" 字("typedef struct Fred Fred" 这种技巧
仍然能

用,但在 C++ 中是累赘的)。

========================================

Q9:多久才能学会 C++?

像 Paradigm Shift 公司,成功地教授过标准的工业界「短期课程」,将大学一学期
的课压缩到一周 40 小时。然而真正的精通得由实际经验而来:没有东西能取代时间
。需动手做的指定专题是必要的,因为它们能将你的观念「凝固成形」。

大约要 6-12 个月才能流利使用 C++/OOP,如果身边有高手的话,费时会短些;反之
若没有个“好的”通用型 C++物件程式库,则会耗时更久。想成为顾问级的高手,则
约需 3 年。

有些人却根本办不到。除非你是可造之材,且有强烈的个人驱动力,否则你也做不到
。「孺子可教」最起码的要求是:你必须能「觉今是而昨非」。「驱动力」最起码的
要求是:你愿意多投入时间精力(改变思考的方式〔典□转移 paradigm shift〕要
远比学些新的东西来得困难)。

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

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


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

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