这是我从台湾的http://www.cis.nctu.edu.tw/chinese/doc/research/c++/C++FAQ-Chinese/发现的《C++ Frequently Asked Questions》的繁体翻译,作者是:叶秉哲,也是《C++ Programming Language》3/e繁体版的译者,该文章是非常的好,出于学习用途而将它转贴,本人未取得作者的授权,原文章的版权仍然归属原作者.
C++语言常见问题解
第1节:内容介绍 ---------------- ⊙1A:「FAQ 书」与「FAQ 文件」 ⊙1B:目录 ⊙1C:术语及常用的缩写
第2节:我该如何参与讨论?(发信之前请务必一读) ------------------------------------------------ Q1:我该在哪个讨论区中发问? Q2:我该怎么提出「我的程序有毛病」的问题呢?
第3节:周遭的﹑管理上的事项 ---------------------------- Q3:什么是 OOP?什么是 C++? Q4:C++ 的优点是什么? Q5:谁在用 C++? Q6:有任何 C++ 标准化方案在进行吗? Q7:该到哪里索取最新的 ANSI-C++ 标准草案? Q8:C++ 对 ANSI-C 回溯兼容吗? Q9:多久才能学会 C++?
第4节:C++ 的基础 ------------------ Q10:什么是类别(class)? Q11:什么是对象(object)? Q12:什么是参考(reference)? Q13:如果设定某值给参考会怎么样? Q14:怎样才能将参考改设成别的对象? Q15:何时该用参考,何时又该用指针? Q16:行内函数是做什么的?
第5节:建构子和解构子 ---------------------- Q17:建构子(constructor)是做什么的? Q18:怎样才能让建构子呼叫另一个同处一室的建构子? Q19:解构子(destructor)是做什么的?
第6节:运操作数多载 ------------------ Q20:运操作数多载(operator overloading)是做什么的? Q21:哪些运操作数可以/不能被多载? Q22:怎样做一个 "**"「次方」运操作数?
第7节:伙伴 ------------ Q23:伙伴(friend)是什么? Q24:「伙伴」违反了封装性吗? Q25:伙伴函数的优缺点? Q26:「伙伴关系无继承及递移性」是什么意思? Q27:应该替类别宣告个成员函数,还是伙伴函数?
第8节:输入/输出:<iostream.h> 和 <stdio.h> --------------------------------------------- Q28:该怎样替 "class Fred" 提供输出功能? Q29:为什么我该用 <iostream.h> 而不是以前的 <stdio.h>? Q30:为什么我处理输入时,会超过档案的结尾? Q31:为什么我的程序执行完第一次循环后,会对输入的要求不加理睬? Q32:在 DOS 及 OS/2 的 binary 模式下,要怎样来 "reopen" cin 及 cout?
========== POSTING #2 ==========
第9节:自由内存管理 ---------------------- Q33:"delete p" 会删去 "p" 指针,还是它指到的资料,"*p" ? Q34:我能 "free()" 掉由 "new" 配置到的、"delete" 掉由 "malloc()" 配置到的 内存吗? Q35:为什么该用 "new" 而不是老字号的 malloc() ? Q36:为什么 C++ 不替 "new" 及 "delete" 搭配个 "realloc()" ? Q37:我该怎样配置/释放数组? Q38:万一我忘了将 "[]" 用在 "delete" 由 "new Fred[n]" 配置到的数组,会发生 什么事? Q39:成员函数做 "delete this" 的动作是合法的(并且是好的)吗? Q40:我该怎么用 new 来配置多维数组? Q41:C++ 能不能做到在执行时期才指定数组的长度? Q42:怎样确保某类别的对象都是用 "new" 建立的,而非区域或整体/静态变量?
第10节:除错与错误处理 ------------------------ Q43:怎样处理建构子的错误? Q44:如果建构子会丢出例外的话,该怎么处理它的资源?
第11节:Const 正确性 ---------------------- Q45:什么是 "const correctness"? Q46:我该早一点还是晚一点让东西有常数正确性? Q47:什么是「const 成员函数」? Q48:若我想在 "const" 成员函数内更新一个「看不见的」资料成员,该怎么做? Q49:"const_cast" 会不会丧失最佳化的可能?
第12节:继承 -------------- Q50:「继承」对 C++ 来说很重要吗? Q51:何时该用继承? Q52:怎样在 C++ 中表现出继承? Q53:把衍生类别的指针转型成指向它的基底,可以吗? Q54:Derived* --> Base* 是正常的;那为什么 Derived** --> Base** 则否? Q55:衍生类别的数组「不是」基底的数组,是否表示数组不好?
⊙12A:继承--虚拟函数 Q56:什么是「虚拟成员函数」? Q57:C++ 怎样同时做到动态系结和静态型别? Q58:衍生类别能否将基底类别的非虚拟函数覆盖(override)过去? Q59:"Warning: Derived::f(int) hides Base::f(float)" 是什么意思?
⊙12B:继承--一致性 Q60:我该遮蔽住由基底类别继承来的公共成员函数吗? Q61:圆形 "Circle" 是一种椭圆 "Ellipse" 吗? Q62:对「圆形是/不是一种椭圆」这两难问题,有没有其它说法?
⊙12C:继承--存取规则 Q63:为什么衍生的类别无法存取基底的 "private" 东西? Q64:"public:"﹑"private:"﹑"protected:" 的差别是? Q65:当我改变了内部的东西,怎样避免子类别被破坏?
⊙12D:继承--建构子与解构子 Q66:若基底类别的建构子呼叫一个虚拟函数,为什么衍生类别覆盖掉的那个虚拟函 数却不会被呼叫到? Q67:衍生类别的解构子应该外显地呼叫基底的解构子吗?
⊙12E:继承--Private 与 protected 继承 Q68:该怎么表达出「私有继承」(private inheritance)? Q69:「私有继承」和「成份」(composition) 有多类似? Q70:我比较该用哪一种:成份还是私有继承? Q71:我应该用指针转型方法,把「私有」衍生类别转成它的基底吗? Q72:保护继承 (protected inheritance) 和私有继承有何关连? Q73:"private" 和 "protected" 的存取规则是什么?
第13节:抽象化(abstraction) ------------------------------- Q74:分离接口与实作是做什么用的? Q75:在 C++ 里,我该怎样分离接口与实作(像 Modula-2 那样)? Q76:ABC ("abstract base class") 是什么? Q77:「纯虚拟」(pure virtual) 成员函数是什么? Q78:怎样替整个类别阶层提供打印的功能? Q79:何时该把解构子弄成 virtual? Q80:虚拟建构子 (virtual constructor) 是什么?
========== POSTING #3 ==========
第14节:程序风格指导 ---------------------- Q81:有任何好的 C++ 程序写作的标准吗? Q82:程序撰写标准是必要的吗?有它就够了吗? Q83:我们的组织该以以往 C 的经验来决定程序撰写标准吗? Q84:我该在函数中间或是开头来宣告区域变量? Q85:哪一种原始档命名惯例最好? "foo.C"? "foo.cc"? "foo.cpp"? Q86:哪一种标头档命名惯例最好? "foo.H"? "foo.hh"? "foo.hpp"? Q87:C++ 有没有像 lint 那样的指导原则?
第15节:Smalltalk 程序者学习 C++ 之钥 --------------------------------------- Q88:为什么 C++ 的 FAQ 有一节讨论 Smalltalk?这是用来攻击 Smalltalk 的吗? Q89:C++ 和 Smalltalk 的差别在哪? Q90:什么是「静态型别」?它和 Smalltalk 有多相似/不像? Q91:「静态型别」与「动态型别」哪一种比较适合 C++? Q92:怎样分辨某个 C++ 对象链接库是否属于动态型别的? Q93:在 C++ 里怎样用继承?它和 Smalltalk 有何不同? Q94:Smalltalk/C++ 不同的继承,在现实里导致的结果是什么? Q95:学过「纯种」的 OOPL 之后才能学 C++ 吗? Q96:什么是 NIHCL?到哪里拿到它?
第16节:参考与数值语意 ------------------------ Q97:什么是数值以及参考语意?哪一种在 C++ 里最好? Q98:「虚拟数据」是什么?怎么样/为什么该在 C++ 里使用它? Q99:虚拟数据和动态数据有何差别? Q100:我该正常地用指针来配置资料成员,还是该用「成份」(composition)? Q101:动态配置成员对象有三个效率因素,它们的相对代价是多少? Q102:"inline virtual" 的成员函数真的会被 "inline" 吗? Q103:看起来我不应该用参考语意了,是吗? Q104:参考语意效率不高,那么我是否应该用传值呼叫?
========== POSTING #4 ==========
第17节:和 C 连结/和 C 的关系 -------------------------------- Q105:怎样从 C++ 中呼叫 C 的函数 "f(int,char,float)"? Q106:怎样才能建一个 C++ 函数 "f(int,char,float)",又能被 C 呼叫? Q107:为什么 linker 有这种错误讯息:C/C++ 函数被 C/C++ 函数呼叫到? Q108:该怎么把 C++ 类别的对象传给/传自 C 的函数? Q109:C 的函数能不能存取 C++ 类别的对象资料? Q110:为什么我总觉得 C++ 让我「离机器更远了」,不像 C 那样?
第18节:指向成员函数的指针 ---------------------------- Q111:「指向成员函数的指针」和「指到函数的指针」的型态有差别吗? Q112:怎样把指向成员函数的指针传给 signal handler﹑X event callback 等等? Q113:当我想以成员函数做为中断服务例程 (ISR) 时,为什么编译器产生(型态不 符)的错误? Q114:为什么我取不出 C++ 函数的地址? Q115:怎样宣告指向成员函数的指针数组?
第19节:容器类别与 template ----------------------------- Q116:怎样自一个连结串行/杂凑表等等里面,插入/存取/改变元素? Q117:「样版」(template)的用意是什么? Q118:"function template" 的语法/语意是什么? Q119:"class template" 的语法/语意是什么? Q120:什么是「参数化型别」(parameterized type)? Q121:「泛型」(genericity)是什么?
第20节:链接库 ---------------- Q122:怎样拿到 "STL"? Q123:怎样 ftp 到 "Numerical Recipes" 附的程序? Q124:为什么我的执行档会这么大?
第21节:特定系统的细节 ------------------------ Q125:GNU C++ (g++) 把小程序造出大大的执行档,为什么? Q126:有 YACC 的 C++ 文法吗? Q127:什么是 C++ 1.2? 2.0? 2.1? 3.0? Q128:如果签名编码标准化了,我能否将不同厂商编译器产生的程序代码连结起来?
第22节:其它的技术和环境的事项 -------------------------------- ⊙22A:其它的技术事项 Q129:为什么有 static 资料成员的对象类别产生了 linker 错误? Q130:"struct" 和 "class" 关键词差别在哪? Q131:为什么不能以函数的传回值来多载(overload)它? Q132:什么是「持续性」?什么是「持续性对象」? Q133:为什么浮点数 (floating point) 这么不精确?为什么这段程序不会印出 0.43?
⊙22B:其它环境下的琐事 Q134:有任何 TeX 或 LaTeX 的宏,能处理 "C++" 的留白效果(spacing)吗? Q135:在哪儿可拿到 C++2LaTeX 这个 C++原始码的 LaTeX 美编工具(pretty printer)? Q136:该到哪里取得 "tgrind" 这个 C++/C/etc 的原始码美编工具? Q137:有给 GNU emacs 编辑器用的 C++-mode 吗?有的话,该怎么拿? Q138:我要到哪儿得到和操作系统相关的 FAQs( 譬如:BC++﹑DOS﹑Windows 等等)? Q139:为什么我的 DOS C++ 程序说 "Sorry: floating point code not linked" “抱歉,浮点运算程序代码未连结进来”? Q140:为什么当我没执行 BC45 IDE 的话,BC++ 做出来的 Windows 应用程序就不能用? 
|