《C++经典问答 第2版》PDF下载

  • 购买积分:16 如何计算积分?
  • 作  者:(美)Marshall Cline等著;周远成译
  • 出 版 社:北京:中国电力出版社
  • 出版年份:2003
  • ISBN:7508308689
  • 页数:542 页
图书介绍:

第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