⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000002.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>&nbsp;<BR>==&nbsp;Part&nbsp;3/4&nbsp;&nbsp;============================&nbsp;<BR>&nbsp;<BR>comp.lang.c++&nbsp;Frequently&nbsp;Asked&nbsp;Questions&nbsp;list&nbsp;(with&nbsp;answers,&nbsp;fortunately).&nbsp;<BR>Copyright&nbsp;(C)&nbsp;1991-96&nbsp;Marshall&nbsp;P.&nbsp;Cline,&nbsp;Ph.D.&nbsp;<BR>Posting&nbsp;3&nbsp;of&nbsp;4.&nbsp;<BR>Posting&nbsp;#1&nbsp;explains&nbsp;copying&nbsp;permissions,&nbsp;(no)warranty,&nbsp;table-of-contents,&nbsp;etc&nbsp;<BR>&nbsp;<BR>=============================&nbsp;<BR>■□&nbsp;第14节:程式风格指导&nbsp;<BR>=============================&nbsp;<BR>&nbsp;<BR>Q81:有任何好的&nbsp;C++&nbsp;程式写作的标准吗?&nbsp;<BR>&nbsp;<BR>感谢您阅读这份文件,而不是再发明自己的一套。&nbsp;<BR>&nbsp;<BR>但是请不要在&nbsp;comp.lang.c++&nbsp;里问这问题。几乎所有软体工程师,或多或少都把这&nbsp;<BR>种东西看成是「大玩具」。而且,一些想成为&nbsp;C++&nbsp;程式撰写标准的东西,是由那些&nbsp;<BR>不熟悉这语言及方法论的人弄出来的,所以最後它只能成为「过去式」的标准。这种&nbsp;<BR>「摆错位置」的现象,让大家对程式写作标准产生不信任感。&nbsp;<BR>&nbsp;<BR>很明显的,在&nbsp;comp.lang.c++&nbsp;问这问题的人,是想使自己更精进,不会因自己的无&nbsp;<BR>知而绊倒,然而一些回答却只是让情况更糟而已。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q82:程式撰写标准是必要的吗?有它就够了吗?&nbsp;<BR>&nbsp;<BR>程式撰写标准不会让不懂&nbsp;OO&nbsp;的人变懂;只有训练及经验才有可能。如果它有用处的&nbsp;<BR>话,那就是抑制住那些琐碎无关紧要的程式片段--当大机构想把零散的程式设计组&nbsp;<BR>织整合起来时,这些片段常常会出现。&nbsp;<BR>&nbsp;<BR>但事实上你要的不光是这种标准而已。它们提供的架构让新手少去担心一些自由度,&nbsp;<BR>但是系统化的方法论会比这些好看的标准做得更好。组织机构需要的是一致性的设计&nbsp;<BR>与实行“哲学”,譬如:强型别或弱型别?用指标还是参考介面?&nbsp;stream&nbsp;I/O&nbsp;还是&nbsp;<BR>stdio?&nbsp;C++&nbsp;程式该不该呼叫&nbsp;C&nbsp;的?反过来呢?&nbsp;ABC&nbsp;该怎麽用?继承该用为实作的&nbsp;<BR>技巧还是特异化的技巧?该用哪一种测试策略?一一去检查吗?该不该为每个资料成&nbsp;<BR>员都提供一致的&nbsp;&quot;get&quot;&nbsp;和&nbsp;&quot;set&quot;&nbsp;介面?介面该由外往内还是由内往外设计?错误状&nbsp;<BR>况该用&nbsp;try/catch/throw&nbsp;还是传回值来处理?……等等。&nbsp;<BR>&nbsp;<BR>我们需要的是详细的“设计”部份的「半标准」。我推荐一个三段式标准:训练、谘&nbsp;<BR>询顾问以及程式库。训练乃提供「密集教学」,谘询顾问让&nbsp;OO&nbsp;观念深刻化,而非仅&nbsp;<BR>仅是被教过而已,高品质的程式库则是提供「长程的教学」。上述三种培训都有很热&nbsp;<BR>门的市场景况。(【译注】无疑的,这是指美、加地区。)接受过上述培训的组织都&nbsp;<BR>有如此的忠告:「买现成的吧,不要自己硬干&nbsp;(Buy,&nbsp;Don't&nbsp;Build.)。」买程式库,&nbsp;<BR>买训练课程,买开发工具,买谘询顾问。想靠自学来达到成功的工具厂商及应用/系&nbsp;<BR>统厂商,都会发现成功很困难。&nbsp;<BR>&nbsp;<BR>【译注】这一段十分具有参考价值。不过有些背景资料得提供给各位参考。别忘了:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者是美国人,是以该地为背景,且留意一下他所服务的公司是做什麽的..&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;:-)&nbsp;&nbsp;&nbsp;唉!国内有这麽多的专业顾问公司吗?&nbsp;:-&lt;&nbsp;<BR>&nbsp;<BR>少数人会说:程式撰写标准只是「理想」而已,但在上述的组织机构中,它仍有其必&nbsp;<BR>要性。&nbsp;<BR>&nbsp;<BR>底下的&nbsp;FAQs&nbsp;提供一些基本的指导惯例及风格。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q83:我们的组织该以以往&nbsp;C&nbsp;的经验来决定程式撰写标准吗?&nbsp;<BR>&nbsp;<BR>No!&nbsp;<BR>&nbsp;<BR>不论你的&nbsp;C&nbsp;经验有多丰富,不论你有多高深的&nbsp;C&nbsp;能力,好的&nbsp;C&nbsp;程式员并不会让你&nbsp;<BR>直接就成为好的&nbsp;C++&nbsp;程式员。从&nbsp;C&nbsp;移到&nbsp;C++&nbsp;并不仅是学习&nbsp;&quot;++&quot;&nbsp;的语法语意而已&nbsp;<BR>,一个组织想达到&nbsp;OOP&nbsp;的境界,却未将&nbsp;&quot;OO&quot;&nbsp;的精神放进&nbsp;OOP&nbsp;里的话,只是自欺罢&nbsp;<BR>了;会计的资产负债表会把他们的愚蠢显现出来。&nbsp;<BR>&nbsp;<BR>C++&nbsp;程式撰写标准应该由&nbsp;C++&nbsp;专家来调整,不妨先在&nbsp;comp.lang.c++&nbsp;里头问问题(&nbsp;<BR>但是不要用&nbsp;&quot;coding&nbsp;standard&quot;&nbsp;这种字眼;只要这样子问:「这种技巧有何优缺点&nbsp;<BR>?」)。找个能帮你避开陷阱的高手,上个训练课程,买程式库,看看「好的」程式&nbsp;<BR>库是否合乎你的程式撰写标准。绝对不要光靠自己来制定标准,除非你对它已有某种&nbsp;<BR>程度的掌握。没有标准总比有烂标准好,因为不恰当的「官方说法」会让不够聪明的&nbsp;<BR>平民难以追随。现在&nbsp;C++&nbsp;训练课程及程式库,已有十分兴盛的市场。&nbsp;<BR>&nbsp;<BR>再提一件事:当某个东西炙手可热时,招摇撞骗者亦随之而生;务必三思而後行。也&nbsp;<BR>要问一下从某处修过课的人,因为老手不见得也是个好教员。最後,选个懂得指导别&nbsp;<BR>人的从业人员,而不是个对此语言/方法论只有过时知识的全职教师。&nbsp;<BR>&nbsp;<BR>【译注】善哉斯言!&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q84:我该在函数中间或是开头来宣告区域变数?&nbsp;<BR>&nbsp;<BR>在第一次用到它的地方附近。&nbsp;<BR>&nbsp;<BR>物件在宣告的时候就会被初始化(被建构)。如果在初始化物件的地方没有足够的资&nbsp;<BR>讯,直到函数中间才有的话,你可以在开头处初始个「空值」给它,等以後再「设定&nbsp;<BR>」其值;你也可以在函数中间再初始个正确的东西给它。以执行效率来说,一开始就&nbsp;<BR>让它有正确的值,会比先建立它,搞一搞它,之後再重建它来得好。以像&nbsp;&quot;String&quot;&nbsp;<BR>这种简单的例子来看,会有&nbsp;350%&nbsp;的速度差距。在你的系统上可能会不同;当然整个&nbsp;<BR>系统可能不会降低到&nbsp;300+%,但是“一定”会有不必要的性能衰退现象。&nbsp;<BR>&nbsp;<BR>常见的反驳是:「我们会替物件的每个资料提供&nbsp;&quot;set&quot;&nbsp;运作行为,则建构时的额外&nbsp;<BR>耗费就会分散开来。」这比效能负荷更糟,因为你添加了维护的梦靥。替每个资料提&nbsp;<BR>供&nbsp;&quot;set&quot;&nbsp;运作行为就等於对资料不设防:你把内部实作技巧都显露出来了。你隐藏&nbsp;<BR>到的只有成员物件的实体“名字”而已,但你用到的&nbsp;List、String&nbsp;和&nbsp;float(举例&nbsp;<BR>来说)型态都曝光了。通常维护会比&nbsp;CPU&nbsp;执行时间耗费的资源更多。&nbsp;<BR>&nbsp;<BR>区域变数应该在靠近它第一次用到之处宣告。很抱歉,这和&nbsp;C&nbsp;老手的习惯不同,但&nbsp;<BR>是「新的」不见得就是「不好的」。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q85:哪一种原始档命名惯例最好?&nbsp;&quot;foo.C&quot;?&nbsp;&quot;foo.cc&quot;?&nbsp;&quot;foo.cpp&quot;?&nbsp;<BR>&nbsp;<BR>如果你已有个惯例,就用它吧。如果没有,看看你的编译器,看它用的是哪一种。典&nbsp;<BR>型的答案是:&quot;.C&quot;,&nbsp;&quot;.cc&quot;,&nbsp;&quot;.cpp&quot;,&nbsp;或&nbsp;&quot;.cxx&quot;(很自然的,&quot;.C&quot;&nbsp;副档名是假设该&nbsp;<BR>档案系统会区分出&nbsp;&quot;.C&quot;&nbsp;&quot;.c&quot;&nbsp;大小写)。&nbsp;<BR>&nbsp;<BR>在&nbsp;Paradigm&nbsp;Shift&nbsp;公司,我们在&nbsp;Makefiles&nbsp;里用&nbsp;&quot;.C&quot;,即使是在不区分大小写的&nbsp;<BR>档案系统下(在有区分的系统中,我们用一个编译器选项:「假设&nbsp;.c&nbsp;档案都是&nbsp;C++&nbsp;<BR>的程式」;譬如:IBM&nbsp;CSet++&nbsp;用&nbsp;&quot;-Tdp&quot;,Zortech&nbsp;C++&nbsp;用&nbsp;&quot;-cpp&quot;,Borland&nbsp;C++用&nbsp;<BR>&quot;-P&quot;,等等)。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q86:哪一种标头档命名惯例最好?&nbsp;&quot;foo.H&quot;?&nbsp;&quot;foo.hh&quot;?&nbsp;&quot;foo.hpp&quot;?&nbsp;<BR>&nbsp;<BR>如果你已有个惯例,就用它吧。如果没有,而且你的编辑器不必去区分&nbsp;C&nbsp;和&nbsp;C++&nbsp;档&nbsp;<BR>案的话,只要用&nbsp;&quot;.h&quot;&nbsp;就行了,否则就用编辑器所要的,像&nbsp;&quot;.H&quot;、&quot;.hh&quot;&nbsp;或是&nbsp;<BR>&quot;.hpp&quot;。&nbsp;<BR>&nbsp;<BR>在&nbsp;Paradigm&nbsp;Shift&nbsp;公司,我们用&nbsp;&quot;.h&quot;&nbsp;做为&nbsp;C&nbsp;和&nbsp;C++&nbsp;的原始档案(然後,我们就&nbsp;<BR>不再建那些纯粹的&nbsp;C&nbsp;标头档案)。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q87:C++&nbsp;有没有像&nbsp;lint&nbsp;那样的指导原则?&nbsp;<BR>&nbsp;<BR>Yes,有一些常见的例子是危险的。&nbsp;<BR>但是它们都不尽然是「坏的」,因为有些情况下,再差的例子也得用上去。&nbsp;<BR>&nbsp;*&nbsp;&quot;Fred&quot;&nbsp;类别的设定运算子应该传回&nbsp;&quot;*this&quot;,当成是&nbsp;&quot;Fred&amp;&quot;(以允许成串的设&nbsp;<BR>&nbsp;&nbsp;&nbsp;定指令)。&nbsp;<BR>&nbsp;*&nbsp;有任何虚拟函数的类别,都该有个虚拟解构子。&nbsp;<BR>&nbsp;*&nbsp;若一个类别有&nbsp;{解构子,设定运算子,拷贝建构子}&nbsp;其一的话,通常三者也都全&nbsp;<BR>&nbsp;&nbsp;&nbsp;部需要。&nbsp;<BR>&nbsp;*&nbsp;&quot;Fred&quot;&nbsp;类别的拷贝建构子和设定运算子,都该将它们的参数加上&nbsp;&quot;const&quot;:分别&nbsp;<BR>&nbsp;&nbsp;&nbsp;是&nbsp;&quot;Fred::Fred(const&nbsp;Fred&amp;)&quot;&nbsp;和&nbsp;&quot;Fred&amp;&nbsp;Fred::operator=(const&nbsp;Fred&amp;)&quot;&nbsp;。&nbsp;<BR>&nbsp;*&nbsp;类别的子物件一定要用初始化串列&nbsp;(initialization&nbsp;lists)&nbsp;而不要用设定的方&nbsp;<BR>&nbsp;&nbsp;&nbsp;式,因为对使用者自订类别而言,会有很大的效率差距(3x!)。&nbsp;<BR>&nbsp;*&nbsp;许多设定运算子都应该先测试:「我们」是不是「他们」;譬如:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred&amp;&nbsp;Fred::operator=&nbsp;(const&nbsp;Fred&amp;&nbsp;fred)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this&nbsp;==&nbsp;&amp;fred)&nbsp;return&nbsp;*this;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//...normal&nbsp;assignment&nbsp;duties...&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;*this;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;有时候没必要测试,但一般说来,这些情况都是:没有必要由使用者提供外显的&nbsp;<BR>&nbsp;&nbsp;&nbsp;设定运算子的时候(相对於编译器提供的设定运算子)。&nbsp;<BR>&nbsp;*&nbsp;在那些同时定义了&nbsp;&quot;+=&quot;、&quot;+&quot;&nbsp;及&nbsp;&quot;=&quot;&nbsp;的类别中,&quot;a+=b&quot;&nbsp;和&nbsp;&quot;a=a+b&quot;&nbsp;通常应该&nbsp;<BR>&nbsp;&nbsp;&nbsp;做同样的事;其他类似的内建运算子亦同(譬如:a+=1&nbsp;和&nbsp;++a;&nbsp;p[i]&nbsp;和&nbsp;*(p+i);&nbsp;<BR>&nbsp;&nbsp;&nbsp;等等)。这可使用二元运算子&nbsp;&quot;op=&quot;&nbsp;之型式来强制做到;譬如:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred&nbsp;operator+&nbsp;(const&nbsp;Fred&amp;&nbsp;a,&nbsp;const&nbsp;Fred&amp;&nbsp;b)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred&nbsp;ans&nbsp;=&nbsp;a;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;+=&nbsp;b;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ans;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;这样一来,有「建构性」的二元运算甚至可以不是夥伴。但常用的运算子有时可&nbsp;<BR>&nbsp;&nbsp;&nbsp;能会更有效率地实作出来(譬如,如果&nbsp;&quot;Fred&quot;&nbsp;类别本来就是个&nbsp;&quot;String&quot;,且&nbsp;<BR>&nbsp;&nbsp;&nbsp;&quot;+=&quot;&nbsp;必须重新配置/拷贝字串记忆体的话,一开始就知道它的最後长度,可能会&nbsp;<BR>&nbsp;&nbsp;&nbsp;比较好)。&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>==============================================&nbsp;<BR>■□&nbsp;第15节:Smalltalk&nbsp;程式者学习&nbsp;C++&nbsp;之钥&nbsp;<BR>==============================================&nbsp;<BR>&nbsp;<BR>Q88:为什麽&nbsp;C++&nbsp;的&nbsp;FAQ&nbsp;有一节讨论&nbsp;Smalltalk?这是用来攻击&nbsp;Smalltalk&nbsp;的吗?&nbsp;<BR>&nbsp;<BR>世界上「主要的」两个&nbsp;OOPLs&nbsp;是&nbsp;C++&nbsp;与&nbsp;Smalltalk。由於这个流行的&nbsp;OOPL&nbsp;已有第&nbsp;<BR>二大的使用者总数量,许多新的&nbsp;C++&nbsp;程式者是由&nbsp;Smalltalk&nbsp;背景跳过来的。这一节&nbsp;<BR>会回答以下问题:&nbsp;<BR>&nbsp;*&nbsp;这两个语言的差别?&nbsp;<BR>&nbsp;*&nbsp;从&nbsp;Smalltalk&nbsp;跳到&nbsp;C++&nbsp;的程式者,要知道些什麽,才能精通&nbsp;C++?&nbsp;<BR>&nbsp;<BR>这一节&nbsp;*!*不会*!*&nbsp;回答这些问题:&nbsp;<BR>&nbsp;*&nbsp;哪一种语言「最好」?&nbsp;<BR>&nbsp;*&nbsp;为什麽&nbsp;Smalltalk「很烂」?&nbsp;<BR>&nbsp;*&nbsp;为什麽&nbsp;C++「很烂」?&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -