这是我从台湾的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 应用程序就不能用?