C++ FAQ Lite[6]--综述(新)

类别:VC语言 点击:0 评论:0 推荐:
[6] 综述
(Part of C++ FAQ Lite, Copyright © 1991-2001, Marshall Cline, [email protected])

简体中文版翻译:申旻,[email protected](东日制作室,东日文档)

FAQs in section [6]: [6.1] C++ 是一种实用的语言吗? [6.2] C++ 是一种完美的语言吗? [6.3] 面向对象(OO)有什么用? [6.4] C++ 比 Ada 更好吗?(或 Visual Basic, C, FORTRAN, Pascal, Smalltalk,或其它的语言?) [6.5] 谁在用C++? [6.6] 学习 OO/C++ 需要多长时间? [6.7] 从商业角度看 C++ 有哪些特征? [6.8] 虚函数(动态绑定)对于 OO/C++来说是主要的吗? [6.9] 我来自密苏里州。你能给我一个理由,为什么虚函数(动态绑定)造成很大的不同? [6.10] C++ 是否向下兼容 ANSI/ISO C? [6.11] C++ 标准化了吗? [6.12] 何处能得到 ANSI/ISO C++ 标准的拷贝?

[6.1] C++ 是一种实用的语言吗?

是的。

C++ 是一种实用的工具。它不完美,但是有用。

在软件产业的世界里,C++被看作一种可靠的,成熟的,主流的工具。它得到普遍的工业支持,因而从一种全面的商业观点来看,它是“优秀”的。

[ Top | Bottom | Previous section | Next section ]

[6.2] C++ 是一种完美的语言吗?

不是。

C++的设计原意不是作为完美的面向对象语言的示范。它被设计为一种实用的工具,来解决现实世界的问题。它有少许的瑕疵,但是在完美之前就没有用的是纯理论的框架。而那不是C++的目标。

[ Top | Bottom | Previous section | Next section ]

[6.3] 面向对象(OO)有什么用?

面向对象技术是我们所知道的开发大型的,复杂的软件应用和系统的最佳方法。

OO:应付大型的,复杂的软件系统时,软件工业是“失败的”。但是这种“失败”实际上归因于我们的成功:我们的成功使得用户想要的更多。不幸的是我们创造了市场的饥渴,而“结构化”分析,设计和编程技术无法满足这种饥渴。因此需要我们创造一种更好的典范。

C++ 是一种面向对象(OO)的编程语言。C++ 也能够被当作传统的编程语言使用(作为“一种更好的 C”)。但是如果你“作为一种更好的C”来使用它,那么就不要期望得到面向对象所带来的好处。

[ Top | Bottom | Previous section | Next section ]

[6.4] C++ 比 Ada 更好吗?(或 Visual Basic, C, FORTRAN, Pascal, Smalltalk, 或其他语言?)

这样的问题没有意义。在对这个问题发表不同意见之前请先阅读下文。

99%的情况下,编程语言的选择是出于商业上的考虑,而不是技术上的考虑。真正重要的是如同开发机器的编程环境,配置机器的运行时环境,运行时和/或开发环境的许可证/合法执照,开发者,咨询服务,和企业文化/政策这些商业上的考虑,它们扮演的角色一般比编译期性能,运行时性能,静态还是动态类型,静态还是绑定等更为重要。

从纯粹的技术角度争论一种语言比另一种更好的人(也就是忽略占支配地位的商业论点的人),正是暴露了他们自己技术上的缺乏,别听他们的。

[ Top | Bottom | Previous section | Next section ]

[6.5] 谁在用 C++?

[Recently rewrote (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

很多很多公司和政府部门,非常多。

有大量的开发者(并且因此有大量的底层有效支持,包括卖主,工具开发者,培训等等)是C++的特征之一

[ Top | Bottom | Previous section | Next section ]

[6.6] 学习 OO/C++ 需要多长时间?

一些公司成功地讲授标准的工业界的“短期课程”,将大学一学期的课程压缩到了一个星期40个小时。但是不论你在何处获得培训,要知道课程交给你的是元件,大多数人是在接手项目之后才将概念“凝结成形”,得以学成。即使得到最好的培训,也不是现成的。

精通OO/C++需要6-12个月。如果身边有专家的话,会少些。如果没有一个“好的”通用型的C++类库,则会多一些。成为可以指导别人的专家则需要3年。

有些人永远不行,除非你是可教的“儒子”并且有个人驱动力。可教的最低要求是,当你错了的时候必须能够承认。驱动力的最低要求是,你必须愿意投入一些额外的时间(学习一些新的东西比改变你的典范(paradigm)[也就是说,改变你思考的方法,改变良好的观念,改变你在技术世界中的思维模式]要容易的多)。

你应该做两件事: 找一个“高手” 看两类书:一类是 C++法律的指导, 另一类是 C++道德的指导

你不应该做两件事: 不应该去学习 C 作为学习 OO/C++ 的台阶 不应该去学习 Smalltalk 作为学习 OO/C++ 的台阶

[ Top | Bottom | Previous section | Next section ]

[6.7] 从商业角度看 C++ 有哪些特征?

从商业角度看 OO/C++ 有这样一些特征: C++ 有巨大的安置基础,这意味着你会有很多厂商在工具,环境,咨询服务等上提供支持,而且你可以在你的履历上加上非常有价值的一条。 C++ 让开发者为软件块提供简化的接口,以改善这些软件块被使用(重用)时的错误率。 C++ 通过算符重载让你发掘开发者的直觉,降低重用用户的学习曲线。 C++ 将对软件块的访问局部化,降低更改时的成本。 C++ 减少安全性和可用性的权衡,改善使用(重用)软件块时的成本。 C++ 减少安全性和速度的权衡,改善错误率而不丧失性能。 C++ 给你继承和动态绑定,以便旧的代码调用新的代码,使得针对市场的快速扩展/调整你的软件成为可能。

[ Top | Bottom | Previous section | Next section ]

[6.8] 虚函数(动态绑定)对于 OO/C++来说是主要的吗?

[Recently inserted "the" before "difference" thanks to Stan Brown and reworded references to STL (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

是的!

没有虚函数,C++ 就不是面向对象的了。算符重载和非虚成员函数很好,但毕竟,它们只是更典型的C概念中传递一个struct的指针给函数的句法装饰而已。虽然标准库包含了许多模板以实现同样非常好的“泛型编程(译注:也称通用编程,"generic programming")”技术,但虚函数仍然是用C++进行面向对象编程的核心。

从商业角度看,如果没有虚函数,那么也就没有什么理由要从传统的 C 转移到C++了。(在本 FAQ中我们将忽略泛型编程和标准库)。技术人员通常认为在C和非面向对象的C++之间有很大的区别,但如果没有面向对象,这个区别通常不足以证明培训开发者,新工具等的成本是值得的。换句话说,如果我被某个经理征询意见,是否从C转向非面向对象的C++(也就是说,转换语言而不转换典范),那么我可能会劝阻他这样做,除非有逼不得已的面向工具的原因。从商业角度看,面向对象能使系统具有可扩展性和可适应性,但只有C++类的语法而没有面向对象的话,就不会减少维护成本,而实际上会增加培训成本。

底线:没有虚函数的C++不是面向对象。用类编程而没有动态绑定则称为“基于对象”,而不是“面向对象”。踢出虚函数和踢出OO(译注:即面向对象)是一回事。所剩下的就是基于对象编程了,和最初的Ada语言类似(顺便说一下,新的Ada语言支持OO而不是基于对象编程了)。

[ Top | Bottom | Previous section | Next section ]

[6.9] 我来自密苏里州。你能给我一个理由,为什么虚函数(动态绑定)造成很大的不同?

总体来说:动态绑定能通过使旧的代码调用新的代码来提高重用。

在 OO(译注:即面向对象)之前,重用是通过使新的代码调用旧的代码来完成的。举例来说,程序员可以写一些代码来调用一些重用的代码,如 printf()。

在OO中,重用能够通过使旧的代码调用新的代码来完成。例如,程序员可以写一些代码被非常非常始祖的框架所调用。而不需要修改始祖的代码。事实上,甚至不需要被重新编译。即使源代码已经遗失了25年,你只有目标文件,那个原始的目标文件将会调用新的扩展的代码而不会遗失什么。

这是可扩展性,这是OO。

[ Top | Bottom | Previous section | Next section ]

[6.10] C++ 是否向下兼容 ANSI/ISO C?

差不多。

C++尽可能地兼容C,但不完全。在实践上,主要的区别是,C++需要原型,f()声明一个不带参数的函数(在 C 中,f()和f(...)是相同的)。

还有一些非常微小的差别,象在C++中sizeof('x')等于sizeof(char),而在 C 中等于sizeof(int)。同样,C++在同一个命名空间中放置结构"tags"作为其他名称,而在 C 中,需要显式的struct(举例来说,typedef struct Fred Fred;技巧当然也可以工作,但在C++中是多余的)。

[ Top | Bottom | Previous section | Next section ]

[6.11] C++ 标准化了吗?

[Recently changed "has been finalized" to "was finalized" thanks to Stan Brown (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

是的。

C++标准被ISO(国际标准化组织)和一些国家标准组织,如ANSI美国国家标准协会),BSI(英国标准协会),DIN(德国国家标准组织)所定稿和采用。ISO标准在1997年11月14日经投票一致被定稿和采用。

ANSI C++委员会被称为“X3J16”。ISO C++标准小组被称为“WG21”。ANSI/ISO C++标准的主要参与者几乎包含了每个人:有来自澳大利亚,加拿大,丹麦,法国,德国,爱尔兰,日本,荷兰,新西兰,瑞典,英国和美国的代表,连同大约一百多个公司的代表和感兴趣的个人。主要参与者包括AT&T,爱立信,Digital,Borland,惠普,IBM, Mentor Graphics,微软,Silicon Graphics,Sun Microsystems和西门子。经过大约8年的工作,标准完成了。在1997年11月14日,代表们出席了在莫里森镇的投票,标准被一致认可。

[ Top | Bottom | Previous section | Next section ]

[6.12] 何处能得到 ANSI/ISO C++ 标准的拷贝?

[Recently added URLs to free copies of CD2 (on 7/00) and total rewrite; changed several URLs thanks to Brian K. Hamon and Garen Parham (on 4/01). Click here to go to the next FAQ in the "chain" of recent changes.]

至少有三种方法得到这份文档的软拷贝: $18 [ANSI出版]:到这一页,下拉选择“PDF file”,点击“Place this in your shopping basket”。 $18 [ANSI出版]:到这一页,并点击“Add to Basket”。 $245 [ISO出版]:到这一页并且点击“Add to Basket”。

注意:ISO文档比ANSI昂贵十倍多,但技术内容是一样的。ISO文档的扉页不同,但技术材料和ANSI文档是一样的。请不要email问我为什么ISO对于基本一样的东西收费这么多,那是ISO的商业决定;你必须向ISO的出版/销售部门认购。

至少有两种方法得到这份文档的硬拷贝: $175 [ANSI出版]:到这一页,下拉选择“Hardcopy”,并点击“Place this in your shopping basket”。 未知价格 [ANSI出版]:致电 NCITS(National Committee for Information Technology Standards; 国家信息技术委员会;这是以前称为“X3”的组织的新名称)。联系人是 Monica Vega,202-626-5739 或 202-626-5738。寻求 FDC 14882文档。准备好支付一些钱——文档当然不是免费的。

还有两种潜在的有趣的(并且免费的)文档你也许想看: $0:如果你愿意忍受一份(免费的)无授权的,过期的,并且部分错误的文档,您可以从“委员会草案#2”在这里和/或这里得到。 $0:ISO 委员会的新闻稿(不是 ANSI 或 ISO 标准的拷贝!) 在这里。这份新闻稿对于非程序员来说是易读的。

[ 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

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