第1部分 开端 3
第1章 概述 3
FAQ1.01 这一章的目的是什么? 3
FAQ1.02 C++FAQ是什么? 3
FAQ1.03 本书的读者对象是谁? 4
FAQ1.04 这是一本纯粹关于C++的书吗? 4
FAQ1.05 开发人员为什么需要一本C++和OO技术的指导书? 5
FAQ1.06 在对这些FAQ的解答方面给出了哪种类型的指导? 5
FAQ1.07 电子FAQ是什么?当电子FAQ可免费得到时为什么要买这本书? 6
FAQ1.08 假如已拥有该书的第一版,为什么还要买这一版? 6
FAQ1.09 在这本书里都使用了哪些惯例? 7
第2章 基本的C++语法和语义学 9
FAQ2.01 这一章的目的是什么? 9
FAQ2.02 main()的要点是什么? 9
FAQ2.03 函数的要点是什么? 10
FAQ2.04 默认参数的要点是什么? 11
FAQ2.05 局部(自动)对象的要点是什么? 11
FAQ2.06 使用显式参数构造对象的要点是什么? 12
FAQ2.07 动态分配(new)对象的要点是什么? 13
FAQ2.08 内部作用域中的局部对象的要点是什么? 15
FAQ2.09 通过引用传递对象的要点是什么? 16
FAQ2.10 通过数值传递对象的要点是什么? 17
FAQ2.11 通过指针传递对象的要点是什么? 17
FAQ2.12 输出流的要点是什么? 19
FAQ2.13 输入流的要点是什么? 20
FAQ2.14 使用包含重载运算符的类的要点是什么? 21
FAQ2.15 使用容器类的要点是什么? 22
FAQ2.16 创建类的头文件的要点是什么? 23
FAQ2.17 定义一个类的要点是什么? 24
FAQ2.18 定义成员函数的要点是什么? 26
FAQ2.19 往类中增加一个构造函数的要点是什么? 27
FAQ2.20 往类中增加一个析构函数的要点是什么? 29
FAQ2.21 定义一个包含指向堆中对象的指针的类的要点是什么? 30
FAQ2.22 全局对象的要点是什么? 32
FAQ2.23 抛出和捕捉异常的要点是什么? 34
FAQ2.24 继承和动态绑定的要点是什么? 36
第3章 领悟管理观点 39
FAQ3.01 这一章的目的是什么? 39
FAQ3.02 这一章(和这本书)的核心要旨是什么? 39
FAQ3.03 为什么是经理而不是懂技术的开发人员负责? 40
FAQ3.04 如何能管理不熟悉的事物? 41
FAQ3.05 关于C++和OO设计的最普遍的错误是什么? 41
FAQ3.06 “Peter软件原理”是什么? 42
FAQ3.07 机构应该在它的所有项目上都使用OO吗? 42
FAQ3.08 在OO离去之前能忽略它吗? 43
FAQ3.09 什么样的OO语言是最好的? 43
FAQ3.10 对过程和工具来说正确的方法是什么? 44
FAQ3.11 就现有的类库和框架来说,正确的拥有方法是什么? 45
第4章 体系结构观点 46
FAQ4.01 这一章的目的是什么? 46
FAQ4.02 软件体系结构为什么是重要的? 46
FAQ4.03 体系结构应该以什么为基础,是被解决的问题还是问题域? 47
FAQ4.04 软件体系结构应基于问题的策略吗? 48
FAQ4.05 客户可能改变他们的要求吗? 48
FAQ4.06 稳定的要求是令人满意的吗? 49
FAQ4.07 打算变化的关键是什么? 49
FAQ4.08 框架是什么? 50
FAQ4.09 由框架表现的“控制的倒置(inversion of control)”是什么? 50
FAQ4.10 可扩充的特定域框架是什么? 51
FAQ4.11 什么特点才能使框架既是可扩充的又是特定域的? 51
FAQ4.12 假如域分析不正确又会发生什么? 52
FAQ4.13 应该花费多少努力来支持变化——即,可扩充性值多少钱? 52
FAQ4.14 设计师是如何使软件体系结构具有弹性的? 53
FAQ4.15 实现重复使用的秘密是什么? 54
第2部分 面向对象的设计 57
第5章 面向对象的基本原理 57
FAQ5.01 这一章的目的是什么? 57
FAQ5.02 为什么要采用OO技术? 57
FAQ5.03 使用C++进行OO程序设计的好处是什么? 58
FAQ5.04 面向对象技术的基本概念是什么? 59
FAQ5.05 为什么类是重要的? 59
FAQ5.06 对象是什么? 60
FAQ5.07 对象的理想特性是什么? 61
FAQ5.08 类如何好于过程软件的三个基本构成块? 62
FAQ5.09 合成的目的是什么? 62
FAQ5.10 继承的目的是什么? 63
FAQ5.11 多态性和动态绑定的优点是什么? 64
FAQ5.12 OO如何有助于产生弹性的和可扩充的软件? 65
FAQ5.13 旧代码如何调用新代码? 65
FAQ5.14 抽象是什么?它为什么重要? 68
FAQ5.15 抽象应以用户为中心还是以开发人员为中心? 69
FAQ5.16 封装和抽象之间的区别是什么? 69
FAQ5.17 封装一个糟糕的抽象会有什么后果? 70
FAQ5.18 把接口和实现分开的意义是什么? 70
FAQ5.19 把接口和实现分开如何能改善性能以及弹性? 71
FAQ5.20 为抽象创建一个合适的最佳方法是什么? 72
FAQ5.21 get/set成员函数是如何与蹩脚的设计接口相关的? 73
FAQ5.22 每个成员数据都要有get和set成员函数吗? 73
FAQ5.23 类的真正目的是输出数据吗? 74
FAQ5.24 OO是以数据为中心吗? 74
第6章 可觉察行为的说明 75
FAQ6.01 这一章的目的是什么? 75
FAQ6.02 成员函数的用户应该依靠代码实际做的还是说明? 75
FAQ6.03 依靠说明而不是实现的优点是什么? 77
FAQ6.04 什么是通告要求和通告承诺? 78
FAQ6.05 如何确定成员函数的通告要求和通告承诺? 78
FAQ6.06 没有使用说明的开发组织为什么害怕变化? 80
FAQ6.07 开发人员如何判断一个的变化是否会干扰原有的代码? 81
FAQ6.08 在说明里可替代(向后兼容的)变化的特性是什么? 81
FAQ6.09 如何能表明成员函数的实现履行了其说明? 82
FAQ6.10 保持说明与代码同步可能吗? 83
第7章 合适的继承 85
FAQ7.01 合适的继承是什么? 85
FAQ7.02 合适继承的好处是什么? 87
FAQ7.03 不合适的继承是什么? 87
FAQ7.04 合适的和不合适的继承之间的不同很不明显吗? 88
FAQ7.05 替代性是基于代码所做的还是代码将要做的说明承诺? 88
FAQ7.06 废除(隐藏)一个继承的public:成员函数合适吗? 90
FAQ7.07 专门化是什么? 91
FAQ7.08 子集和合适的继承有什么联系? 91
第8章 检测并修改不合适的继承 93
FAQ8.01 不合适的继承能破坏一个项目吗? 93
FAQ8.02 学会避免不合适的继承的最好方法是什么? 93
FAQ8.03 直觉是理解正确继承的可依靠的向导吗? 94
FAQ8.04 驼鸟是一种鸟吗? 94
FAQ8.05 覆盖虚拟函数应该抛出异常吗? 96
FAQ8.06 覆盖虚拟函数可以是空操作(no-op)吗? 98
FAQ8.07 为什么C++修改Ostrich/Bird窘境如此困难? 100
FAQ8.08 Circle应该从Ellipse继承吗? 100
FAQ8.09 对于非对称圆的窘境我们能做些什么? 102
FAQ8.10 在这些FAQ里一直困惑着我们的问题是什么? 103
FAQ8.11 Stack应该从List继承吗? 104
FAQ8.12 代码重用是继承的主要目的吗? 106
FAQ8.13 东西的容器是一种任何东西的容器吗? 107
FAQ8.14 当水果袋允许放进任何种类的水果时,就可以说苹果袋是一种水果袋吗? 108
FAQ8.15 停放小汽车的停车区是一种停放任意的运载工具的停车区吗(假定停放运载工具的停车区允许停放任意种类的运载工具)? 111
FAQ8.16 Derived的数组是一种Base的数组(array-of Base)吗? 113
FAQ8.17 当Derived数组能作为Base数组传递时,意味着该数组是糟糕的吗? 115
第9章 错误处理策略 116
FAQ9.01 适当的错误处理是根本过失的主要来源吗? 116
FAQ9.02 如何用C++对运行时错误进行处理? 116
FAQ9.03 在抛出/捕捉过程期间,在展开的栈帧(stack frame)里面的对象会发生什么? 117
FAQ9.04 什么是异常说明? 118
FAQ9.05 为了错误处理而使用返回码的缺点是什么? 118
FAQ9.06 throw…catch的优点是什么? 119
FAQ9.07 为什么把正常逻辑从异常处理逻辑中分开是有帮助的? 120
FAQ9.08 使用异常处理时最困难的部分是什么? 123
FAQ9.09 函数应该在什么时候抛出异常? 124
FAQ9.10 对于异常对象的层次来讲最好的方法是什么? 126
FAQ9.11 异常类应该如何命名? 127
FAQ9.12 setjmp和longjmp应放在C++的什么地方? 128
第10章 测试策略 129
FAQ10.01 这一章的目的是什么? 129
FAQ10.02 自测对象的优点是什么? 129
FAQ10.03 人们通常因为什么而不把自测加进他们的对象中? 130
FAQ10.04 假如不使用在这里描述的技术将会发生什么情况? 131
FAQ10.05 什么时候类才是正确的? 131
FAQ10.06 什么是行为自测? 132
FAQ10.07 类的不变式是指什么? 134
FAQ10.08 为什么应明确地捕获不变式? 135
FAQ10.09 应该在什么时候调用testInvariant()成员函数? 136
FAQ10.10 我们能为确保对象不被野蛮指针转移做些什么? 137
第3部分 语言组件 141
第11章 引用 141
FAQ11.01 引用是什么? 141
FAQ11.02 “引用物”意味着什么? 142
FAQ11.03 什么时候才能把引用与它的引用物连接起来? 142
FAQ11.04 把一个值赋给一个引用时会发生什么? 143
FAQ11.05 局部引用是什么? 143
FAQ11.06 返回一个引用意味着什么? 144
FAQ11.07 使用引用地址的结果是什么? 145
FAQ11.08 引用能指向其他引用物吗? 146
FAQ11.09 当指针能做引用能做的所有事情时,为什么还要使用引用? 146
FAQ11.10 引用不是伪装的指针吗? 147
FAQ11.11 什么时候需要指针? 147
FAQ11.12 为什么一些人会憎恨引用? 148
FAQ11.13 int&constx有意义吗? 148
第12章 New和Delete 150
FAQ12.01 new比分配内存做得更多吗? 150
FAQ12.02 为什么说new好于可靠的、老的、值得信赖的malloc()? 150
FAQ12.03 在C++中有与new和delete类似的realloc()的等价物吗? 151
FAQ12.04 从new返回的指针能用free()解除分配吗?从malloc()返回的指针能用delete解除分配吗? 151
FAQ12.05 delete p删除的是指针p还是引用物*p? 152
FAQ12.06 应该检查从new Fred()返回的指针以便发现它是否是NULL吗? 152
FAQ12.07 如何让new返回NULL而不是抛出一个异常? 153
FAQ12.08 如何使new在内存用到下限时自动地刷新再循环对象池? 154
FAQ12.09 当p是NULL时,调用delete p会发生什么? 157
FAQ12.10 如果对同一个指针执行两遍删除操作会发生什么? 158
FAQ12.11 如何能分配和解除分配一个对象数组? 158
FAQ12.12 假如使用delete p(不是delete[]p)来删除一个通过new Fred[n]分配的数组将会发生什么? 159
FAQ12.13 当p指向某种内置类型(比如char)的数组时能省略delete[]p中的[]吗? 160
FAQ12.14 如何在一个预定的内存位置建立一个对象? 161
FAQ12.15 Fred类如何保证只是用new而不是在栈上创建Fred对象? 161
FAQ12.16 如何释放由布局new创建的对象? 162
FAQ12.17 在p=new Fred()里,假如Fred构造函数抛出一个异常,那么Fred内存会“泄漏”吗? 163
FAQ12.18 成员函数使用delete this是合法(和规范)的吗? 165
FAQ12.19 在p=new Fred[n]之后,在delete[]p期间编译器如何知道要释放n个对象? 166
第13章 inline函数 167
FAQ13.01 inline函数的作用是什么? 167
FAQ13.02 关键字“inline”和“inlined”函数之间的联系是什么? 168
FAQ13.03 关于直接插入有什么特殊的规则吗? 168
FAQ13.04 一次定义规则(ODR)是什么? 169
FAQ13.05 就inline函数来说要考虑哪些性能? 169
FAQ13.06 内联函数能改善性能吗? 170
FAQ13.07 内联函数能增加可执行代码的大小吗? 171
FAQ13.08 为什么不应在第一次编写代码时做直接插入的决定? 172
FAQ13.09 当程序员使用从第三方获得的直接内联函数时会发生什么? 172
FAQ13.10 inline和非inline代码之间的转换有没有容易的方法? 173
第14章 const正确性 176
FAQ14.01 如何看懂指针的声明? 176
FAQ14.02 C++程序员应如何避免对对象做出不期望的变化? 176
FAQ14.03 const意味着运行时的开销吗? 178
FAQ14.04 const允许编译器产生更有效的代码吗? 178
FAQ14.05 const正确性是冗长乏味的吗? 178
FAQ14.06 为什么实施const正确性应该尽早而不尽晚? 179
FAQ14.07 检查程序和变态程序(mutator)之间的区别是什么? 180
FAQ14.08 应该在什么时候将一个成员函数声明为const? 181
FAQ14.09 const是应用于对象的位状态还是对象的抽象状态? 182
FAQ14.10 在什么情况下不应在声明形参的过程中使用const? 183
FAQ14.11 在什么情况下不应在声明函数返回类型的过程中使用const? 183
FAQ14.12 在const成员函数内如何修改“不能观察到的”数据成员? 184
FAQ14.13 如果对对象有一个const引用(指针),那么我们还能合法地改变该对象吗? 186
FAQ14.14 const_cast意味着失去优化机会吗? 187
第15章 名称空间 188
FAQ15.01 这一章的目的是什么? 188
FAQ15.02 名称空间是什么? 188
FAQ15.03 名称空间外的代码如何使用在名称空间内声明的名字? 190
FAQ15.04 若两个名称空间包含相同的名字会发生什么? 191
FAQ15.05 名称空间的使用规则是什么? 192
FAQ15.06 名字查找是什么? 192
FAQ15.07 使用来自名称空间特别是标准名称空间的名字的各种技术之间的折衷办法是什么? 193
FAQ15.08 名称空间能中断代码吗? 194
FAQ15.09 名称空间还有其他的应用吗? 195
FAQ15.10 名称空间如何解决长标识符的问题? 195
第16章 使用static 196
FAQ16.01 这一章的目的是什么? 196
FAQ16.02 什么是静态类成员? 196
FAQ16.03 可以将静态数据成员类比成什么? 197
FAQ16.04 inline函数能安全地访问静态数据成员吗? 199
FAQ16.05 可将静态成员函数类比成什么? 201
FAQ16.06 静态数据成员与全局变量有多类似? 203
FAQ16.07 静态成员函数是如何类似于友元函数的? 203
FAQ16.08 什么是命名构造函数的习惯语法? 204
FAQ16.09 应该如何调用静态成员函数? 205
FAQ16.10 为什么带有静态数据成员的类会出现连接程序错误? 206
FAQ16.11 如何初始化const静态数据成员? 206
FAQ16.12 实现维护调用之间状态的函数的正确策略是什么? 208
FAQ16.13 函数调用运算符如何帮助函数类? 209
FAQ16.14 忽略静态初始化次序问题是安全的吗? 210
FAQ16.15 解决静态初始化次序问题的简单而又健壮的方法是什么? 212
FAQ16.16 假如静态对象的析构函数有最后一定要出现的重要的副作用怎么办? 213
FAQ16.17 假如静态对象的析构函数有最终一定发生的重要的副作用,并且另一个静态对象的析构函数必须访问该静态对象将怎么办? 214
FAQ16.18 在前面介绍的各种技术之间进行选择的准则是什么? 216
第17章 派生类 218
FAQ17.01 这一章的目的是什么? 218
FAQ17.02 C++如何表达继承? 218
FAQ17.03 具体的派生类是什么? 220
FAQ17.04 为什么派生类不能访问其基类的private:成员? 221
FAQ17.05 基类如何保护派生类以致于基类的变化不会影响到它们? 222
FAQ17.06 能把一个派生类指针转变成它的公共基类的指针吗? 223
FAQ17.07 Y类如何既是X类的子类又能得到X的存储单元? 224
FAQ17.08 如何既不使Y成为X的子类又能使Y类获得当前X类的存储单元? 224
FAQ17.09 Y类如何能既不继承X的存储单元又是X类的子类? 225
第18章 访问控制 227
FAQ18.01 这一章的目的是什么? 227
FAQ18.02 private:、protected:和public:之间有何不同的? 227
FAQ18.03 为什么子类不能访问其基类的private:部分? 228
FAQ18.04 关键字struct和class之间有什么不同? 228
FAQ18.05 什么时候数据成员应该是protected:而不是private:? 229
FAQ18.06 为什么private:是类的默认访问权限? 229
第19章 友元类和友元函数 231
FAQ19.01 友元是什么? 231
FAQ19.02 好的友元类的思维模型应是什么样? 232
FAQ19.03 使用友元类的优点是什么? 233
FAQ19.04 友元类会破坏封装屏障吗? 233
FAQ19.05 友元函数是什么? 234
FAQ19.06 什么时候应该把函数实现为友元函数而不是成员函数? 235
FAQ19.07 保证正确使用友元函数的方针是什么? 235
FAQ19.08 友谊不能传递意味着什么? 236
FAQ19.09 友谊不能继承意味着什么? 237
FAQ19.10 友元不能是虚拟的意味着什么? 239
FAQ19.11 在什么情况下应该使用友元函数而不是成员函数? 240
FAQ19.12 友元函数应被声明在一个类的private:、protected:还是public:部分? 243
FAQ19.13 私有类是什么? 243
FAQ19.14 如何输出类的对象? 244
FAQ19.15 类的对象如何接收输入流? 245
第20章 构造函数和析构函数 246
FAQ20.01 构造函数的作用是什么? 246
FAQ20.02 在C++中,构造函数的规则是什么? 247
FAQ20.03 析构函数的作用是什么? 247
FAQ20.04 在C++中,析构函数的规则是什么? 248
FAQ20.05 当执行一个析构函数时会发生什么? 248
FAQ20.06 拷贝构造函数的目的是什么? 250
FAQ20.07 应在什么时候调用拷贝构造函数? 251
FAQ20.08 什么是“默认构造函数”? 252
FAQ20.09 构造函数应该调用另一个构造函数作为原语吗? 254
FAQ20.10 派生类的析构函数必须明确地调用其基类的析构函数吗? 254
FAQ20.11 如何在一个局部对象的函数结束前释放该对象? 255
FAQ20.12 为类提供直观的、多重构造函数的好方法是什么? 258
FAQ20.13 当基类的构造函数调用一个虚拟函数时,为什么不调用覆盖函数? 259
FAQ20.14 当基类的析构函数调用一个虚拟函数时,为什么不调用覆盖函数? 261
FAQ20.15 布局new的作用是什么? 262
第21章 虚拟函数 264
FAQ21.01 这一章的目的是什么? 264
FAQ21.02 虚拟成员函数是什么? 264
FAQ21.03 和调用普通的函数相比,调用一个虚拟函数的花费有多大? 265
FAQ21.04 C++如何在支持动态绑定(dynamic binding)的时候执行静态定型? 265
FAQ21.05 析构函数能是虚拟的吗? 266
FAQ21.06 虚拟析构函数的作用是什么? 266
FAQ21.07 什么是虚拟构造函数? 267
FAQ21.08 构造函数或者析构函数在其对象里调用虚拟函数时应该使用什么语法? 270
FAQ21.09 在调用虚拟成员函数时应该使用作用域运算符∷吗? 272
FAQ21.10 什么是纯虚拟成员函数? 273
FAQ21.11 能在声明纯虚拟函数的类中定义该函数吗? 273
FAQ21.12 当一个虚拟析构函数没有代码时应如何定义它? 274
FAQ21.13 ABC能有一个纯虚拟析构函数吗? 275
FAQ21.14 如何阻止编译器产生直接插入虚拟函数的重复轮廓的拷贝? 276
FAQ21.15 带有虚拟函数的类至少有一个非直接插入的虚拟函数吗? 276
第22章 初始化列表 278
FAQ22.01 什么是构造函数的初始化列表? 278
FAQ22.02 如果没有使用构造函数初始化列表将会发生什么? 279
FAQ22.03 在构造函数的定义里使用初始化列表的原则是什么? 280
FAQ22.04 构造函数的体内什么都没有是正常的吗? 280
FAQ22.05 如何初始化一个const数据成员? 282
FAQ22.06 如何初始化一个引用数据成员? 283
FAQ22.07 初始化表达式(initializers)是以它们出现在初始化列表中的顺序被执行的吗? 283
FAQ22.08 如何在一个构造函数的初始化列表里安排初始化表达式? 285
FAQ22.09 在构造函数的初始化列表里用一个成员对象来初始化另一个成员对象是可能的吗? 286
FAQ22.10 假如某一个成员对象必须用另一个成员对象来初始化它自己又该怎么办? 288
FAQ22.11 “在一个初始化列表里初始化所有成员对象”的规则有例外吗? 289
FAQ22.12 如何用明确的初始表达式来初始化一个对象数组? 290
第23章 运算符重载 292
FAQ23.01 重载运算符像正常的函数吗? 292
FAQ23.02 什么时候应该使用运算符重载? 293
FAQ23.03 什么样的运算符不能重载? 294
FAQ23.04 使类更易于理解是运算符重载的目的吗? 295
FAQ23.05 为什么下标运算符通常成对出现? 295
FAQ23.06 对于+=、+和=这样的运算符,最重要的是考虑什么? 297
FAQ23.07 如何区分operator++的前缀和后缀两种形式? 298
FAQ23.08 operator++的前缀和后缀形式应该返回什么? 299
FAQ23.09 类似矩阵的类如何能产生带有两个或者更多下标的下标运算符? 300
FAQ23.10 **运算符能当作指数运算符吗? 301
第24章 赋值运算符 303
FAQ24.01 赋值运算符应该返回什么? 303
FAQ24.02 对象自己给自己赋值有错吗? 304
FAQ24.03 关于自我赋值应该做些什么? 305
FAQ24.04 在部分地赋值一个对象之后,赋值运算符是否该抛出一个异常? 306
FAQ24.05 如何在ABC中声明赋值运算符? 308
FAQ24.06 用户定义的赋值运算符什么时候应该模仿编译器自动产生的赋值运算符? 310
FAQ24.07 private:和protected:赋值运算符返回的是什么? 310
FAQ24.08 增加编译器合成的赋值运算符的技术存在吗? 311
FAQ24.09 如何在派生类内使用赋值运算符? 311
FAQ24.10 ABC的赋值运算符能够是虚拟的吗? 313
FAQ24.11 假如基类的赋值运算符是虚拟的,那么派生类应该做什么? 315
FAQ24.12 应该通过使用布局new和拷贝构造函数来实现赋值运算符吗? 317
第25章 模板 318
FAQ25.01 模板的作用是什么? 318
FAQ25.02 类模板的语法和语义是什么? 318
FAQ25.03 如何为处理特殊的情况而专门化模板类? 320
FAQ25.04 函数模板的语法和语义是什么? 323
FAQ25.05 模板应该使用memcpy()来拷贝其模板变元的对象吗? 324
FAQ25.06 当一个模板在它的内部使用另一个模板时为什么编译器会对>>提出警告? 326
第26章 异常策略 328
FAQ26.01 在try块中都有什么? 328
FAQ26.02 函数应该在什么时候捕获异常? 328
FAQ26.03 catch块应该完全地从一个错误中恢复过来吗? 329
FAQ26.04 构造函数如何处理错误? 331
FAQ26.05 僵死(zombie)对象是什么(为什么应该避免它们)? 332
FAQ26.06 假如对象的某一成员对象在其构造函数期间能够抛出异常,该对象应该做些什么? 332
FAQ26.07 当析构函数失败时它们应该抛出异常吗? 334
FAQ26.08 析构函数应该调用可能抛出异常的子程序吗? 335
FAQ26.09 资源释放分配原语应该通过抛出一个异常发出错误的信号吗? 336
FAQ26.10 terminate()函数都做些什么? 336
FAQ26.11 unexpected()函数都做些什么? 337
FAQ26.12 在什么情况下覆盖虚拟成员函数抛出的异常,会与基类里成员函数说明中列出的异常不同? 339
FAQ26.13 异常处理机制是如何引起一个程序默默地崩溃的? 341
第27章 类型和RTTI 342
FAQ27.01 这一章的目的是什么? 342
FAQ27.02 什么是静态类型检查? 342
FAQ27.03 什么是动态类型检查? 343
FAQ27.04 动态类型检查的基本问题是什么? 345
FAQ27.05 如何避免使用动态类型检查? 346
FAQ27.06 对于动态类型检查有没有更好的方案? 346
FAQ27.07 什么是能力询问(capability query)? 347
FAQ27.08 带有容器的动态类型检查的可选方案是什么? 348
FAQ27.09 有没有动态类型检查是必要的情况? 349
FAQ27.10 假定知道指向ABC的指针,那么如何才能查找引用物的类? 349
FAQ27.11 什么是downcast? 351
FAQ27.12 使用向下的类型转换的可选方案是什么? 353
FAQ27.13 为什么向下的类型转换是危险的? 355
FAQ27.14 C++体系的继承图应该是高的还是矮的? 355
FAQ27.15 C++体系的继承图应该是单块的还是一个森林? 355
FAQ27.16 什么是运行时类型标识(RTTI)? 356
FAQ27.17 dynamic_cast<T>()的作用是什么? 356
FAQ27.18 dynamic_cast<T>()是一个包治百病的灵药吗? 357
FAQ27.19 static_cast<T>()的作用是什么? 358
FAQ27.20 typeid()的作用是什么? 358
FAQ27.21 类型安全的向下类型转换(type-safe downcast)有什么隐藏的代价吗? 359
第28章 容器 360
FAQ28.01 容器类是什么?与容器类有关的最普通的错误是什么? 360
FAQ28.02 数组是福还是祸? 361
FAQ28.03 应用程序开发组织应该创建它们自己的容器类吗? 361
FAQ28.04 指针容器的普通错误都是什么? 362
FAQ28.05 这意味着应该避免使用指针容器吗? 362
FAQ28.06 可靠的、老式的char*肯定是一个例外,对吗? 363
FAQ28.07 auto_ptr<T>能简化指针容器的所有权问题吗? 363
FAQ28.08 像Java的Object类能简化C++的容器吗? 363
FAQ28.09 同类和异类容器之间有什么不同? 364
FAQ28.10 用“最好种类”的观点来选择容器类是一个好主意吗? 364
FAQ28.11 所有项目都应使用C++的标准化容器吗? 365
FAQ28.12 什么是C++标准化的容器类? 366
FAQ28.13 什么是标准化的C++数列容器类的最好应用? 366
FAQ28.14 标准C++关联容器类(Associative Container Class)的最好应用场合是什么? 369
第4部分 专题 373
第29章 把继承和重载混合在一起 373
FAQ29.01 重载函数和覆盖函数之间有什么不同? 373
FAQ29.02 什么是隐藏规则(hiding rule)? 374
FAQ29.03 应该如何处理隐藏规则? 377
FAQ29.04 当派生类重新定义从基类继承而来的一组重载成员函数的一部分时,应该怎么做? 379
FAQ29.05 能重载虚拟函数吗? 381
第30章 大三法则 384
FAQ30.01 这一章的目的是什么? 384
FAQ30.02 大三法则是什么? 384
FAQ30.03 当释放一个没有明确的析构函数的对象时会发生什么? 385
FAQ30.04 假如拷贝一个没有明确的拷贝构造函数的对象将会发生什么? 386
FAQ30.05 当给没有明确的赋值运算符的对象赋值时会发生什么? 387
FAQ30.06 大三法则是什么? 389
FAQ30.07 通常三大要素中的哪一个最先出现? 389
FAQ30.08 远程所有权是什么? 390
FAQ30.09 远程所有权是如何特殊的? 391
FAQ30.10 假如类拥有一个引用物,但没有三大要素的其他要素又会怎样? 391
FAQ30.11 是否存在有助于管理远程所有权的C++类? 393
FAQ30.12 auto_ptr能实施大三法则并解决与远程所有权相关的问题吗? 395
FAQ30.13 有没有需要三大要素当中的一个或两个但不是全部的情况? 397
FAQ30.14 有没有明确要求三大要素的情况? 398
FAQ30.15 为什么使用memcpy()拷贝对象会引起程序的崩溃? 399
FAQ30.16 为什么带有可变长度的变元表(argument list)的程序会崩溃? 400
FAQ30.17 为什么使用realloc()重新分配对象数组的程序会崩溃? 401
第31章 使用对象阻止内存泄漏 402
FAQ31.01 什么时候内存泄漏是重要的? 402
FAQ31.02 最简单的避免内存泄漏的方法是什么? 403
FAQ31.03 资源管理最重要的原则是什么? 405
FAQ31.04 管理资源的对象也应该执行可能抛出异常的操作吗? 406
FAQ31.05 对象能够管理两个或更多的资源吗? 407
FAQ31.06 如果对象有一个指向分配的指针,而该对象的某一个成员函数释放了该分配会怎样? 409
FAQ31.07 把指针变量传递给delete之后,还应该怎样处理该指针变量? 409
FAQ31.08 对于指向在同一作用域内被分配和释放的对象的指针,我们应该做些什么? 410
FAQ31.09 实现具有指针语义的引用计数很容易吗? 411
FAQ31.10 很难实现具有copy-on-write语义的引用计数吗? 412
FAQ31.11 如何对类体系实现带有copy-on-write语义的引用计数? 415
第32章 野蛮指针和其他可怕的错误 419
FAQ32.01 野蛮指针是什么? 419
FAQ32.02 拥有野蛮指针的程序会发生什么? 419
FAQ32.03 编译器发出警告“返回对一个局部对象的引用”时,意味着什么? 420
FAQ32.04 如何控制超出块作用域的指针? 420
FAQ32.05 从堆中分配对象会影响引用与指针(reference-versus-pointer)问题吗? 421
FAQ32.06 什么时候应该使用C风格的指针类型转换? 422
FAQ32.07 把引用变量绑定到临时对象是安全的吗? 423
FAQ32.08 通过const引用传递的参数还应该通过const引用返回吗? 423
FAQ32.09 对象min(x,y)或abs(x)的模板函数应该返回一个const引用吗? 424
FAQ32.10 什么时候0不一定是0? 425
第33章 高性能软件 427
FAQ33.01 坏的性能是由坏的设计或者坏的编码造成的吗? 427
FAQ33.02 改善性能的技术都有什么? 428
FAQ33.03 使用指针和引用的优点是什么? 429
FAQ33.04 引用和指针的缺点是什么? 431
FAQ33.05 成员对象如何在改善性能的其他方面超过指针? 433
FAQ33.06 哪一个更好,是++i还是i++? 434
FAQ33.07 Fred x(5);、Fred y=5:和Fred z=Fred(5);之间的性能区别是什么? 435
FAQ33.08 什么种类的应用程序适合使用最终类和最终成员函数? 437
FAQ33.09 什么是最终类? 437
FAQ33.10 什么是最终成员函数? 438
FAQ33.11 最终类和最终成员函数是怎样改善性能的? 439
FAQ33.12 什么时候应该用完全限定名来调用非最终虚拟函数? 440
FAQ33.13 当调用相同类的另一个成员函数时应该使用完全限定吗? 441
FAQ33.14 最终类和最终成员函数会引起许多代码重复吗? 442
FAQ33.15 为什么一些开发人员不喜欢最终成员函数和最终类? 443
FAQ33.16 编程语言(而不仅仅是编译器)能影响软件的性能吗? 444
第34章 COM和ActiveX 445
FAQ34.01 谁应该阅读这一章? 445
FAQ34.02 组件对象模型是什么? 445
FAQ34.03 ActiveX和OLE是什么? 446
FAQ34.04 COM这个名字意味着什么? 447
FAQ34.05 什么是“二进制对象模型”? 447
FAQ34.06 COM的主要的特点是什么? 448
FAQ34.07 GUID是什么? 449
FAQ34.08 为什么COM需要GUID(如CLSID和IID)? 450
FAQ34.09 接口是什么? 451
FAQ34.10 IUnknown接口是什么? 452
FAQ34.11 有多少种详细说明COM接口的方法? 453
FAQ34.12 COM类和COM对象是什么? 455
FAQ34.13 调用程序创建和使用COM对象有多困难? 460
FAQ34.14 COM是如何提供语言透明度的? 462
FAQ34.15 COM是如何提供位置透明度的? 462
FAQ34.16 使用引用计数会出现什么类型的错误? 463
FAQ34.17 COM为错误处理定义了什么机制? 464
FAQ34.18 能改变接口吗? 464
FAQ34.19 COM是面向对象的吗? 466
FAQ34.20 COM最大的问题是什么? 466
FAQ34.21 COM和C++之间的主要区别是什么? 467
FAQ34.22 什么时候应该把一个类定义为COM类? 469
FAQ34.23 自动化是什么? 470
FAQ34.24 什么是调度接口? 471
FAQ34.25 类应该在什么情况下提供调度接口? 472
FAQ34.26 自动化如何工作? 473
FAQ34.27 Invoke如何实现所有上述操作? 474
FAQ34.28 类型库是什么? 475
FAQ34.29 使用类型库的好处是什么? 475
FAQ34.30 类型库如何改善性能? 476
FAQ34.31 双重接口(dual interface)是什么? 476
FAQ34.32 在双重接口上都有什么限制? 478
FAQ34.33 OLE常规控件和ActiveX控件都是什么? 479
FAQ34.34 为什么ActiveX控件不同于OLE常规控件? 480
FAQ34.35 控件容器是什么? 481
FAQ34.36 组件种类(Component Category)是什么? 481
FAQ34.37 事件是什么? 482
FAQ34.38 什么是DCOM? 482
FAQ34.39 DCOM的基础结构是如何稳定的? 483
FAQ34.40 什么是COM+? 483
第35章 过渡到CORBA 486
FAQ35.01 CORBA是什么? 486
FAQ35.02 ORB是什么? 486
FAQ35.03 IDL是什么? 487
FAQ35.04 COS是什么? 487
FAQ35.05 OMA是什么? 487
FAQ35.06 OMG是什么? 487
FAQ35.07 这一章的目的是什么? 488
FAQ35.08 这一章最重要的信息是什么? 488
FAQ35.09 CORBA背后的主要概念是什么? 489
FAQ35.10 OMG IDL和C++非常相像吗? 489
FAQ35.11 CORBA对象和C++对象的生存周期相同吗? 490
FAQ35.12 与CORBA实现相互作用的C++代码可移植给不同的CORBA供应商吗? 491
FAQ35.13 将CORBA异常与C++异常相比会得到什么结果? 492
FAQ35.14 哪一个CORBA实现是最好的?CORBA好于COM吗? 492
第36章 C语言思考 494
FAQ36.01 在同一个应用程序中混合C和C++代码的主要问题是什么? 494
FAQ36.02 C++代码如何调用C代码? 494
FAQ36.03 C代码如何调用C++代码? 496
FAQ36.04 对于从C++函数里调用的C函数,连接器为什么会报错,而反之亦然? 497
FAQ36.05 如何把一个C++类的对象传递给一个C函数或者从一个C函数传出? 497
FAQ36.06 C函数能直接访问C++类对象中的数据吗? 499
FAQ36.07 能把C++I/O(<iostream>)和C I/O(<stdio.h>)混合在一起吗? 499
FAQ36.08 <iostream>和<stdio.h>哪一个是更安全的? 500
FAQ36.09 <iostream>和<stdio.h>哪一个是更可扩充的? 501
FAQ36.10 <iostream>和<stdio.h>哪一个更有弹性? 501
FAQ36.11 为什么C++编程比C感觉好像更远离机器? 501
FAQ36.12 为什么C++要比C在你的背后做更多的事情? 502
第37章 私有和保护继承 503
FAQ37.01 私有继承和保护继承是什么? 503
FAQ37.02 私有继承和保护继承之间的区别是什么? 504
FAQ37.03 私有和保护继承的语法和语义是什么? 504
FAQ37.04 什么时候应该使用正常的has-a而不是私有或保护继承? 505
FAQ37.05 公共、保护和私有继承的访问规则分别是什么? 506
FAQ37.06 在一个私有的或者保护的派生类内,在基类是公共的一个成员函数如何能在派生类内依然是公共的? 507
FAQ37.07 指针应该从私有或者保护派生类转换到它的基类吗? 508
第38章 成员函数的指针 509
FAQ38.01 指向非静态成员函数的指针的类型是什么? 509
FAQ38.02 指向非静态成员函数的指针能够被传递给需要类似C的函数指针的信号和X事件回调等处理程序吗? 510
FAQ38.03 当使用指向成员函数的指针时,最普遍的错误是什么? 512
FAQ38.04 如何声明非静态成员函数指针数组? 512
第39章 过渡到OO和C++ 514
FAQ39.01 谁应该阅读这一章? 514
FAQ39.02 这一章主要的启示是什么? 514
FAQ39.03 过渡阶段划分为多少个技术水平? 515
FAQ39.04 为什么要定义技术水平? 515
FAQ39.05 能从一本书中学会OO/C++吗? 516
FAQ39.06 能从课程中学会OO/C++吗? 517
FAQ39.07 学会OO/C++的关键是什么? 517
FAQ39.08 应该从小项目开始吗? 518
FAQ39.09 优秀C程序员的经历会对学习OO/C++有帮助吗? 519
FAQ39.10 什么技术对学习OO/C++有帮助? 520