第1章 面向对象编程 1
1.1面向过程的编程风格与面向对象的编程风格 1
1.1.1面向过程的编程风格 1
1.1.2面向对象的编程风格 2
1.1.3关系 3
1.1.4课后练习 3
1.2类与抽象数据类型 3
1.2.1信息隐藏 3
1.2.2封装 4
1.2.3抽象数据类型 4
1.2.4课后练习 5
1.3客户/服务器模式与消息传递 5
1.3.1客户/服务器模式 6
1.3.2消息传递与方法调用 6
1.3.3课后练习 8
1.4继承与多态 8
1.4.1继承 8
1.4.2多态 9
1.4.3多态与递归 9
1.4.4课后练习 11
1.5接口与组件 11
1.5.1接口 11
1.5.2组件 12
1.5.3课后练习 13
第2章 从C到C++ 14
2.1名字空间 14
2.1.1课后练习 17
2.2 C++输入/输出简介 18
2.2.1操纵符 20
2.2.2混合使用C和C++的输入/输出 23
2.2.3课后练习 24
2.3文件 24
2.3.1测试文件的打开状态 26
2.3.2课后练习 26
2.4若干重要的C++特性 26
2.4.1强制类型转换 26
2.4.2常数 28
2.4.3数据类型bool 28
2.4.4枚举类型 28
2.4.5定义变量 29
2.4.6结构 30
2.4.7课后练习 31
2.5 string类型 31
2.5.1定义string类型的变量 31
2.5.2转换为C风格的字符串 31
2.5.3字符串长度 32
2.5.4读写string 32
2.5.5赋值 33
2.5.6字符串的连接 34
2.5.7修改字符串 34
2.5.8提取子串 36
2.5.9查找 36
2.5.10字符串比较 37
2.5.11课后练习 38
2.6函数 40
2.6.1函数原型 40
2.6.2 main函数 44
2.6.3引用 44
2.6.4引用调用 42
2.6.5引用返回 43
2.6.6内联函数 44
2.6.7函数默认参数 45
2.6.8函数重载 46
2.6.9函数签名 47
2.6.10课后练习 48
2.7 new和delete操作符 51
2.7.1课后练习 53
2.8例外处理 53
2.8.1课后练习 56
2.9补充材料 57
2.9.1 C++关键字 57
2.9.2无名名字空间 57
2.9.3无名联合 57
2.9.4成员选择符 58
2.10常见编程错误 61
2.11编程习题 69
第3章类 72
3.1类和对象 72
3.1.1类声明 72
3.1.2 C++的信息隐藏机制 73
3.1.3成员选择符 74
3.1.4类范围 75
3.1.5关键字class和struct的区别 75
3.1.6类成员函数的定义 76
3.1.7在程序中使用类 78
3.1.8课后练习 78
3.2示例程序:堆栈类 79
3.2.1问题 79
3.2.2示例程序的输出 79
3.2.3解决方案 80
3.2.4类的实现 81
3.2.5代码分析 82
3.2.6程序设计建议 82
3.2.7课后练习 82
3.3效率和健壮性 82
3.3.1通过引用来传递和返回对象 82
3.3.2 coast类型参数的对象引用 83
3.3.3 const成员函数 84
3.3.4对成员函数进行重载以便处理两种类型的字符串 85
3.3.5课后练习 85
3.4示例程序:时间标记类 86
3.4.1问题 86
3.4.2示例程序的输出 86
3.4.3解决方案 88
3.4.4类的实现 88
3.4.5代码分析 89
3.4.6程序设计建议 91
3.4.7课后练习 91
3.5构造函数与析构函数 91
3.5.1构造函数 92
3.5.2对象数组与默认构造函数 93
3.5.3通过构造函数约束对象的创建 94
3.5.4拷贝构造函数 95
3.5.5定义拷贝构造函数 96
3.5.6禁止通过传值方式传递和返回类对象 100
3.5.7转型构造函数 101
3.5.8转型构造函数与隐式类型转换 101
3.5.9构造函数初始化程序 102
3.5.10构造函数与操作符new和new[] 103
3.5.11析构函数 104
3.5.12课后练习 105
3.6示例程序:Task类 108
3.6.1问题 108
3.6.2示例程序的输出 108
3.6.3解决方案 109
3.6.4类的实现 109
3.6.5代码分析 111
3.6.6课后练习 113
3.7类数据成员和类成员函数 113
3.7.1类数据成员 113
3.7.2类成员函数 115
3.7.3在成员函数内定义static变量 116
3.7.4课后练习 117
3.8指向对象的指针 117
3.8.1常量指针this 119
3.8.2课后练习 120
3.9常见编程错误 121
3.10编程习题 126
第4章 继承 131
4.1引言 131
4.1.1课后练习 132
4.2基本概念和语法 132
4.2.1继承机制下的私有成员 133
4.2.2改变访问限制 134
4.2.3名字隐藏 135
4.2.4间接继承 136
4.2.5课后练习 137
4.3示例程序:影片跟踪管理 137
4.3.1问题 137
4.3.2示例程序的输出 138
4.3.3解决方案 138
4.3.4类的实现 139
4.3.5代码分析 140
4.3.6程序设计建议 141
4.4保护成员 141
4.4.1课后练习 144
4.5继承机制下的构造函数与析构函数 145
4.5.1继承机制下的构造函数 145
4.5.2派生类构造函数的规则 147
4.5.3继承机制下的析构函数 150
4.5.4课后练习 152
4.6示例程序:设计序列的类层次结构 153
4.6.1问题 153
4.6.2示例程序的输入与输出 154
4.6.3解决方案 157
4.6.4类的实现 157
4.6.5代码分析 159
4.7多继承 161
4.7.1继承和访问规则 162
4.7.2虚基类 163
4.7.3课后练习 164
4.8补充材料 166
4.8.1保护继承 166
4.8.2私有继承 166
4.9常见编程错误 167
4.10编程习题 169
第5章 多态 172
5.1 C++中的运行期绑定与编译期绑定 172
5.1.1 C++多态的前提条件 173
5.1.2虚成员函数继承 176
5.1.3运行期绑定和虚成员函数表 177
5.1.4构造函数与析构函数 177
5.1.5虚析构函数 178
5.1.6对象成员函数和类成员函数 180
5.1.7课后练习 180
5.2示例程序:改进的影片跟踪管理 182
5.2.1问题 182
5.2.2示例程序的输入/输出 182
5.2.3解决方案 184
5.2.4类的实现 184
5.2.5代码分析 187
5.2.6程序设计建议 189
5.2.7课后练习 189
5.3重载、覆盖和遮蔽 189
5.3.1重载 189
5.3.2覆盖 190
5.3.3遮蔽 192
5.3.4名字共享 193
5.3.5课后练习 194
5.4抽象基类 196
5.4.1抽象基类和纯虚成员函数 196
5.4.2定义纯虚成员函数的限制 198
5.4.3抽象基类的使用 198
5.4.4微软的IUnknown接口 199
5.4.5课后练习 199
5.5运行期类型识别 200
5.5.1 dynamic_cast操作符 200
5.5.2 dynamic_cast的规则 205
5.5.3 dynamic_cast与static_cast小结 205
5.5.4 typeid操作符 205
5.5.5扩展RTTI 206
5.5.6课后练习 206
5.6补充材料 208
5.6.1强多态和弱多态 208
5.7常见编程错误 208
5.8编程习题 211
第6章 操作符重载 215
6.1基本操作符重载 215
6.1.1操作符的优先级和语法 217
6.1.2课后练习 218
6.2示例程序:复数类 219
6.2.1问题 219
6.2.2示例程序的输出 219
6.2.3解决方案 219
6.2.4类的实现 219
6.2.5代码分析 221
6.2.6课后练习 222
6.3用顶层函数进行操作符重载 223
6.3.1课后练习 226
6.4 friend函数 227
6.4.1课后练习 228
6.5输入与输出操作符的重载 229
6.5.1课后练习 230
6.6赋值操作符的重载 231
6.6.1课后练习 233
6.7特殊操作符的重载 234
6.7.1下标操作符的重载 234
6.7.2函数调用操作符的重载 237
6.7.3自增与自减操作符的重载 239
6.7.4转型操作符 241
6.7.5课后练习 243
6.8示例程序:关联式数组 244
6.8.1问题 244
6.8.2示例程序的输入与输出 244
6.8.3解决方案 245
6.8.4类的实现 246
6.8.5代码分析 247
6.8.6课后练习 248
6.9内存管理操作符 248
6.9.1课后练习 251
6.10补充材料 252
6.10.1 friend类 252
6.11常见编程错误 252
6.12编程习题 255
第7章 模板与标准模板库 257
7.1模板的基本知识 257
7.1.1模板实例 260
7.1.2参数表中的模板类 261
7.1.3模板的函数式参数 262
7.1.4课后练习 264
7.2示例程序:模板堆栈类 265
7.2.1问题 265
7.2.2示例程序的输出 265
7.2.3解决方案 265
7.2.4类的实现 266
7.2.5代码分析 268
7.2.6程序设计建议 269
7.2.7断言 270
7.2.8课后练习 271
7.3标准模板库STL 271
7.3.1容器、算法和迭代器 271
7.3.2 STL的优越性 271
7.3.3容器基础知识 273
7.3.4基本序列式容器:vector、deque和list 273
7.3.5 vector、deque和list的效率比较 276
7.3.6基本的关联式容器:set、mult-iset、map和multimap 276
7.3.7容器适配器 278
7.3.8 其他容器 281
7.3.9 STL算法 284
7.3.10其他STL构件 288
7.3.11课后练习 289
7.4示例程序:证券业绩报表 290
7.4.1问题 290
7.4.2示例程序的输入与输出 290
7.4.3解决方案 293
7.4.4类的实现 293
7.4.5代码分析 296
7.5附加材料 298
7.5.1模板类与继承 298
7.6常见编程错误 299
7.7编程习题 300
第8章 C++输入输出类层次 304
8.1概况 304
8.1.1输入输出库中的流类层次 304
8.1.2输入输出库中的缓冲类层次 305
8.1.3缓冲类层次与流类层次的关系 306
8.1.4模板的使用 307
8.1.5课后练习 307
8.2 ios_base和basic_ios类 308
8.2.1 ios_base 308
8.2.2 basic_ios 312
8.2.3例外处理 313
8.2.4课后练习 314
8.3高层输入输出类 315
8.3.1 basic_istream 315
8.3.2 basic_ostream 319
8.3.3 basic_iostream 321
8.3.4课后练习 321
8.4操纵器 322
8.4.1设计不带参数的操纵器 322
8.4.2设计带参数的操纵器 324
8.4.3课后练习 325
8.5文件输入输出类 325
8.5.1 basic_ofstream 325
8.5.2 basic_ifstream 327
8.5.3 basic_fstream 328
8.5.4课后练习 329
8.6示例程序:随机存取文件类 329
8.6.1问题 329
8.6.2示例程序的输入与输出 329
8.6.3解决方案 330
8.6.4类的实现 332
8.6.5代码分析 339
8.7字符流输入/输出类 344
8.7.1 basic_ostringstream 344
8.7.2 basic_istringstream 345
8.7.3 basic_stringstream 346
8.7.4课后练习 347
8.8示例程序:高层拷贝函数 347
8.8.1问题 347
8.8.2解决方案 347
8.8.3类的实现 347
8.8.4代码分析 348
8.8.5课后练习 349
8.9缓冲区类 349
8.9.1 basic_streambuf 349
8.9.2 basic_filebuf 350
8.9.3 basic_stringbuf 355
8.9.4课后练习 356
8.10补充材料 356
8.11常见编程错误 357
8.12编程习题 358
第9章 MFC中的面向对象编程 360
9.1用MFC进行Windows程序设计 360
9.1.1 MFC编程的代码生成器 361
9.1.2课后练习 362
9.2 MFC中的文档/视图结构 362
9.2.1文档序列化 365
9.2.2课后练习 366
9.3示例程序:文档序列化 366
9.3.1问题 366
9.3.2示例程序的输出 366
9.3.3解决方案 367
9.3.4类的实现 367
9.3.5代码分析 375
9.3.6课后练习 378
9.4 COM 378
9.4.1可更改的服务器和不可变更的接口 379
9.4.2 COM接口的层次 380
9.4.3 IDispatch接口 380
9.4.4 COM程序的类型 381
9.4.5 VC++对COM的支持 381
9.4.6 COM和OLE 382
9.4.7课后练习 382
9.5示例程序:自动化服务器与控制器 383
9.5.1问题 383
9.5.2示例程序的输出 383
9.5.3解决方案 383
9.5.4类的实现 384
9.5.5代码分析 391
9.5.6引用计数问题 393
9.5.7课后练习 393
9.6补充材料 394
9.7编程习题 394
附录A ASCII表 396
附录B 用到的C++函数和成员函数 399
附录C 奇数编号练习的提示及答案 428