[6] 综述
(Part of C++ FAQ Lite, ]Copyright © 1991-2001, Marshall Cline, cline@parashift.com)
简体中文版翻译:申旻,nicrosoft@sunistudio.com(东日制作室,东日文档)
FAQs in section [6]:
][6.4] C++ 比 Ada 更好吗?(或 Visual Basic, C, FORTRAN, Pascal, Smalltalk,或其它的语言?)
][6.8] 虚函数(动态绑定)对于 OO/C++来说是主要的吗?
][6.9] 我来自密苏里州。你能给我一个理由,为什么虚函数(动态绑定)造成很大的不同?
][6.10] C++ 是否向下兼容 ANSI/ISO 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++道德的指导
你不应该做两件事:
]不应该去学习 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 ]
[ C++ FAQ Lite | Table of contents | Subject index | ]About the author | ]© | ]Download your own copy ]
Revised Apr 8, 2001