目录 3
第一部分 C++ 3
第1章 基础知识 3
1.1 Borland C++项目文件的结构 3
1.1.1 头文件 3
1.1.2 一个完整的样本程序 5
1.2 变量 9
1.2.1 作用域 9
1.2.2 类型 11
1.2.3 存储类 11
1.2.4 const限定符 12
1.3 语句 14
1.2.5 Volatile限定符 14
1.3.1 表达式语句 15
1.3.2 if语句 16
1.3.3 switch语句 17
1.3.4 标号语句 19
1.3.5 while语句 19
1.3.6 do while语句 20
1.3.7 for语句 20
1.3.8 break语句 21
1.3.9 continue语句 22
1.3.10 GOTO语句 23
1.3.11 return语句 23
1.4.1 参数传递 24
1.4 函数 24
1.4.2 const参数传递 25
1.4.3 使用缺省参数 25
1.4.4 函数返回值 26
1.4.5 返回const项 27
1.4.6 返回值方面的问题 27
1.4.7 使用函数修饰符 28
1.5 指针与引用 30
1.6 指针、引用与const连用 32
1.7 提高部分 33
1.7.1 使用嵌入式汇编语言 33
1.7.3 C和C++合用 35
1.7.2 名字分裂 35
1.7.4 传值方式返回结构 36
1.7.5 使用枚举类型 38
1.7.6 使用内存管理 40
1.7.7 理解C参数传递顺序 42
1.7.8 理解pascal参数传递顺序 43
1.7.9 使用Interrupt处理函数 43
1.7.10 使用参数数目可变的函数 44
第2章 对象和类 47
2.1 定义类 47
2.1.1 类标识符 48
2.1.2 类体 48
2.2 使用类 49
2.2.2 类存取控制 50
2.2.1 封装 50
2.2.3 类私有成员 51
2.2.4 类公有成员 52
2.2.5 类保护成员 53
2.2.6 类对象的存储类 54
2.2.7 类作用域 55
2.2.8 空类 55
2.2.9 类嵌套 55
2.2.10 类的实例化 58
2.2.11 不完全的类声明 58
2.3 使用数据成员 58
2.3.1 静态数据成员 59
2.3.2 private static数据成员 61
2.3.3 类对象用作数据成员 62
2.3.4 数据成员的引用 64
2.3.5 指针数据成员 65
2.3.6 指向类数据成员的指针 65
2.3.7 指向对象数据成员的指针 67
2.4 使用成员函数 67
2.4.1 简单成员函数 68
2.4.2 静态成员函数 69
2.4.3 Const成员函数 70
2.4.4 volatile成员函数 70
2.4.5 内联成员函数 71
2.4.6 带有const this的成员函数 72
2.4.7 带有volatile this的成员函数 73
2.4.9 构造函数 75
2.4.8 特殊类函数 75
2.4.10 析构函数 82
2.4.11 friend(友元)关键字 84
2.4.12 友元的性质 85
2.5 提高部分 86
2.5.1 成员函数指针 86
2.5.2 数组和类 89
2.5.3 成员函数调用的分析 94
2.5.4 类模板 96
2.5.5 函数模板 103
第3章 继承性 106
3.1 可复用性 106
3.2 继承性 106
3.3 继承的作用 107
3.4 C++继承性的局限性 108
3.5 关于继承的不同观察角度 108
3.6 单一继承 109
3.6.1 何时继承 109
3.6.2 不能被继承的成分 109
3.6.3 存取基类的限定符 110
3.6.4 可被继承的类 110
3.6.5 传递给基类的参数 112
3.6.6 构造函数的调用顺序 113
3.6.7 析构函数的调用顺序 114
3.6.8 种子类 114
3.6.9 派生类的类型转换 116
3.6.10 作用域的分辨 117
3.6.11 性质扩展 120
3.6.12 性质约束 122
3.6.13 使用单一继承的例子 124
3.6.14 函数闭包 126
3.7 多重继承 131
3.7.1 声明多基类继承的类 133
3.7.2 调用基类构造函数 133
3.7.3 使用虚基类 134
3.7.4 混合使用虚基类和非虚基类 135
3.7.5 调用析构函数 136
3.7.6 使用类型转换 136
3.7.7 保持基类函数的正确性 137
3.7.8 多继承中作用域分辨的应用 139
3.7.9 跟踪内存 140
3.8 提高部分 141
3.8.1 运行时刻的考虑 141
3.8.2 进入对象内部 142
3.8.3 被继承的Debugger类 144
第4章 重载 149
4.1 重载的原因 149
4.2 函数重载 150
4.2.1 非成员重载函数 150
4.2.2 重载成员函数 152
4.2.3 类等级中的重载函数 152
4.2.5 作用域分辨 154
4.2.4 重载不是覆盖 154
4.2.6 参数匹配 155
4.2.7 重载构造函数 155
4.2.8 一些特殊情况 157
4.2.9 通过重载定义用户转换规则 158
4.2.10 重载静态成员函数 161
4.3 操作符重载 162
4.3.1 操作符用作函数调用 163
4.3.2 重载操作符用作成员函数 164
4.3.3 操作符成员函数的几个注意点 166
4.3.4 重载操作符用作友元函数 166
4.3.5 赋值操作符 168
4.3.6 函数调用操作符() 170
4.3.7 下标操作符 172
4.3.8 操作符重载限制 173
4.3.9 操作符的作用域分辨 174
4.4 提高部分 175
4.4.1 名字分裂的规则 175
4.4.2 重载new和delete 177
4.4.3 前缀和后缀操作符 180
第5章 多态性 182
5.1 先期和迟后联编 182
5.2 C++是一种混合语言 183
5.3 虚函数 183
5.3.1 函数覆盖 184
5.3.3 抽象类 186
5.3.2 改善了的类用户界面 186
5.3.4 虚函数的局限性 189
5.3.5 虚友元 189
5.3.6 虚操作符 190
5.4 多态性的例子 193
5.5 作用域分辨使多态性失效 196
5.6 虚函数与非虚函数连用 197
5.7 vptr和vtab结构的内存布局 198
5.8 虚函数可以不被覆盖 198
5.9 确定是否使用虚函数 200
5.10 私有虚函数 201
5.11.1 多态性机制 202
5.11 提高部分 202
5.11.2 单一继承中的多态性 203
5.11.3 多重继承中的多态性 207
5.11.4 内联虚函数 210
5.11.5 基类中调用多态函数 213
5.11.6 虚函数和分类等级 215
5.11.7 构造函数中调用虚函数 217
第6章 例外处理 219
6.1 处理例外的旧方法 220
6.2 处理例外的OOP方法 221
6.3 扔掉例外 221
6.4 扔掉初始化过的对象 222
6.5 捕获例外 224
6.6 捕获无类型的例外 225
6.7 使用多个catch块 226
6.8 使用catch/throw取代setjmp/longjmp 227
6.9 寻找合适的例外处理程序 227
6.10 清除栈 227
6.11 把例外当作类对象 229
6.12 通过引用处理例外 229
6.13 例外类型的层次 230
6.14 用例外处理常见错误 232
6.15 例外和资源获取 232
6.16 使用函数闭包 233
6.17 例外和构造函数 235
6.18 含子对象的对象中的例外 236
6.19 标准C+十例外 237
6.20 OWL中的错误处理 240
6.21 TXOwl例外 241
6.22 TXCompatibility例外 241
6.23 TXGdi例外 242
6.24 TXInvalidMainWindow例外 242
6.25 TXInvalidModule例外 243
6.26 TXMenu例外 243
6.27 TXOutOfMemory例外 243
6.28 TXPrinter例外 245
6.29 TXValidator例外 245
6.30 TXWindow例外 246
6.30.1 在Windows编程中的一些声明 247
6.30.2 例外处理和回调函数 247
6.32 例外接口规范 248
6.31 多线程程序中的例外处理 248
6.33 函数unexpected() 251
6.34 terminate()函数 252
6.35 跟踪对terminate()的调用 253
第7章 流 255
7.1 stdio方法的缺点 255
7.2 C++流 256
7.3 广义的流 257
7.4 内部数据类型的标准I/O流 258
7.4.1 char和char*类型的I/O操作 259
7.4.2 int和long类型的I/O操作 260
7.4.3 float和double类型的I/O操作 261
7.4.4 用户类的I/O操作 262
7.5 操作函数 264
7.5.1 使用数制(基)操作函数 266
7.5.2 设置和清除格式标志 267
7.5.3 改变域宽及填充 267
7.5.4 使用格式操作函数 268
7.5.5 用户定义的操作函数 270
7.6 文件I/O的流实观 279
7.6.1 文本文件输入 279
7.6.2 流的错误检测 280
7.6.3 文本文件输出 282
7.6.4 二进制文件输入 284
7.6.5 二进制文件输出 286
7.6.6 拷贝文件 289
7.7 内存格式化 291
7.8 将打印机看作流 293
7.9 提高部分 294
7.10 streambuf等级 295
7.11 ios等级 296
7.11.1 类filebuf 296
7.11.2 类fstream 301
7.11.3 类fstreambase 304
7.11.4 类ifstream 307
7.11.5 类ios 310
7.11.6 类iostream 322
7.11.8 类istream 325
7.11.7 类iostream_withassign 325
7.11.9 类istream_withassign 332
7.11.10 类istrstream 333
7.11.11 类ofstream 335
7.11.12 类ostream 338
7.11.13 类ostream_withassign 342
7.11.14 类ostrstream 344
7.11.15 类streambuf 349
7.11.16 从类streambuf中派生类 356
7.11.17 类strstream 359
7.11.18 使用类strstream 360
7.11.19 类strstreambase 362
7.11.20 类strstreambuf 364
8.1 类的分类 371
第8章 基于对象的包容类库 371
8.2 AbstractArray(抽象数组)类 373
8.3 Array类 378
8.4 Array类的使用 379
8.5 数组中某一存储位置的再次使用 380
8.6 Association(关联)类 381
8.7 关联所用到的对象的定义 383
8.8 Association类的使用 384
8.9 由Association派生出类 386
8.10 Bag(包)类 388
8.11 BaseDate(基日期)类 391
8.12 BaseTime(时基)类 394
8.13.1 树的基本概念 397
8.13 Btree(B树)类 397
8.13.2 二叉树 398
8.13.3 二叉树的性能评价 399
8.13.4 B树 399
8.14 Collection(集)类 412
8.15 Container(包容)类 414
8.16 Deque(双端队列)类 419
8.17 Dictionary(字典)类 422
8.17.1 一个Dictionary的例子 423
8.17.2 用外部循环量遍历Dictionary包容 426
8.18 DoubleList(双向链表)类 426
8.19 Error类 431
8.20 HashTable(哈希表)类 434
8.21 List(链表)类 442
8.22 Object类 446
8.23 PriorityQueue(优先队列)类 450
8.23.1 PriorityQueue类的使用 452
8.23.2 把优先队列转换成GIFO队列 455
8.24 Queue(队列)类 456
8.24.1 Set(集合)类 459
8.24.2 处理字符串的Set类 460
8.25 一个更接近数学意义上的集合的Set类 462
8.26 Sortable(排序)类 464
8.27 SortedArray(排序数组)类 466
8.28 Stack(栈)类 468
8.29 String(字符串)类 471
8.30 String类的使用 474
8.30.1 从String类派生出新的类 476
8.30.2 Time(时间)类 478
8.31 Time类的使用 479
8.32 由Time类派生出新类 481
8.33 循环量 484
第9章 基于模板的包容类库 487
9.1 FDS和ADT包容 487
9.2 FDS包容 487
9.3 FDS存储范例 488
9.4 FDS包容的使用 488
9.5 FDS向量包容 488
9.5.1 简单直接向量 489
9.5.2 直接计数向量 491
9.5.3 直接排序向量 492
9.5.4 间接简单向量 495
9.5.5 间接排序向量 497
9.6 FDS表包容 499
9.6.1 直接简单表 499
9.6.2 直接排序表 501
9.6.3 间接表 505
9.6.4 间接排序表 505
9.7 ADT包容 506
9.8 用包容类进行内存管理 507
9.9 ADT数组 508
9.10 ADT排序数组 512
9.12 ADT直接栈 514
9.11 ADT栈 514
9.13 ADT间接栈 517
9.14 ADT队列和双端队列 518
9.15 ADT包和集合 522
9.16 异质ADT包容 526
第二部分 OWL 530
第10章 ObjectWindows(对象窗口)库类 530
10.1 使用OWL的调试版本 530
10.2 OWL应用程序的入口点 530
10.3 定制主窗口 532
10.4 OWL对话框 535
10.4.1 选择对话框风格 535
10.4.2 灰色3D对话框 536
10.4.3 Borland风格对话框 537
10.4.4 对话框中的位图 537
10.4.5 位图式子控制的OWL计数表 539
10.4.6 读写对话框数据 539
10.5 OWL子控制 544
10.6 数据合法性 545
10.7 合法检验函数选项 545
10.7.1 使用TFilterValidator 546
10.7.2 使用TRangeValidator 547
10.7.3 使用TPXPictureValidator 547
10.7.4 使用TStringLookupValidator 548
10.8.1 使用BWCC定制控制 549
10.8 定制控制 549
10.8.2 雕象 550
10.8.3 自画式控制 551
10.8.4 自画式圆按钮 557
第11章 MDI应用程序 564
11.1 窗口层次 566
11.2 定制MDI用户区域 567
11.3 框架和用户区域刷新消息 567
11.4 预定义Windows类属性的修改 568
11.5 刷新纯背景颜色 570
11.6 刷新闪烁的背景颜色 572
11.7 拖动并安置 574
11.8 键盘处理 576
11.9 主消息循环 577
11.10 函数TApplication∷ProcessAppMessage() 578
11.11 允许键盘处理的窗口 579
11.12 带子控制的MDI子窗口 580
11.13 改变MDI子窗口的背景 580
11.14 MDI子窗口中子控制的处理 584
11.15 子控制的两个构造函数 584
11.16 两个构造函数间的区别 584
11.17 一个完整的例子 585
11.18 用对话框作MDI子窗口 590
11.19 MDI应用程序中的菜单 595
11.20 替换主菜单 595
11.22 OLE 2.0菜单合并 599
11.21 合并菜单 599
11.23 OWL如何合并菜单 600
11.24 改变菜单项的状态 604
11.25 命令使能 605
11.26 增添菜单命令的检取标记 606
第12章 列表框的变化 608
12.1 制表点 608
12.2 设置制表点 609
12.3 范例12.1 609
12.4 制表点越界 612
12.5 用多列表框模拟制表点 613
12.5.1 移动列表框选择条 614
12.5.2 范例12.2 615
12.5.4 改变列宽 623
12.5.3 用户可定制的显示格式 623
12.5.6 删除多余的列 624
12.5.5 重排 624
12.5.7 记录字符串长度 627
12.5.8 向列表框增加字符串 627
12.5.9 删除列表框中字符串 627
12.5.10 清空列表框 628
12.5.11 范例12.3 629
12.6 多列列表框 636
12.6.1 列出界 637
12.6.2 范例12.4 638
12.7.1 LBS_HASSTRINGS风格 641
12.7.2 显示图符 641
12.7 自画式列表框 641
12.7.3 WM_MEASUREITEM 消息 642
12.7.4 WM_DRAWITEM消息 643
12.7.5 范例12.5 645
12.7.6 联合使用图符和字符串 650
12.7.7 绘制图符和文本 651
12.7.8 WM-COMPAREITEM消息 653
12.7.9 范例12.6 653
12.8 无制表出界的列式数据 657
12.8.1 长字符串被截断 658
12.8.2 绘制文本 659
12.8.3 范例12.7 660
12.8.4 保存列表框中的列表 664