第1章 C++基础 1
1.1 C++简介 1
1.1.1 C++语言的起源 1
目录 1
1.1.2 C++与面向对象的程序设计 2
1.1.3 C++特点 2
1.1.4 C++术语 2
1.1.5 C++程序示例 2
1.2.1 标识符 4
1.2 变量、表达式及赋值语句 4
1.2.2 变量 5
1.2.3 赋值语句 7
1.2.4 更多赋值语句 9
1.2.5 赋值兼容性 10
1.2.6 文字常量 11
1.2.7 转义序列 12
1.2.8 名字常量 13
1.2.9 算术操作符和表达式 14
1.2.10 整数和浮点数除法 15
1.2.11 类型转换 17
1.2.12 自增和自减操作符 19
1.3 控制台输入/输出 21
1.3.1 使用cout输出 22
1.3.2 输出时的换行 22
1.3.3 格式化带小数点的数字 23
1.3.4 用cerr输出 25
1.3.5 用cin输入 25
注释 27
1.4 程序的风格 27
1.5 库与名字空间 28
1.5.1 库及include命令 28
1.5.2 名字空间 28
第2章 流程控制 34
2.1 布尔表达式 34
2.1.1 创建布尔表达式 34
2.1.2 布尔表达式求值 36
2.1.3 优先级原则 37
2.2.1 if-else语句 41
2.2 分支机制 41
2.2.2 复合语句 43
2.2.3 省略else 45
2.2.4 嵌套语句 45
2.2.5 多分支if-else语句 46
2.2.6 switch语句 47
2.2.7 枚举类型 50
2.2.8 条件操作符 50
2.3.1 while和do-while语句 51
2.3 循环 51
2.3.2 再谈增量、减量操作符 54
2.3.3 逗号操作符 56
2.3.4 for语句 57
2.3.5 break与continue语句 63
2.3.6 嵌套循环 66
第3章 函数基础 72
3.1 预定义的函数 72
3.1.1 返回值的预定义函数 72
3.1.2 预定义的void函数 76
3.1.3 随机数生成器 78
3.2 程序员定义的函数 81
3.2.1 定义返回值的函数 81
3.2.2 函数声明的替代形式 84
3.2.3 调用函数的函数 84
3.2.4 返回布尔值的函数 87
3.2.5 定义void函数 88
3.2.6 void函数中的return语句 89
3.2.8 main函数 91
3.2.7 前提条件和执行结果 91
3.2.9 递归函数 92
3.3 作用域规则 93
3.3.1 局部变量 93
3.3.2 过程抽象 95
3.3.3 全局常量与全局变量 96
3.3.4 语句块 98
3.3.5 嵌套作用域 99
3.3.6 for循环中声明的变量 99
4.1.1 传值调用参数 106
4.1 参数 106
第4章 参数与重载 106
4.1.2 引用调用参数初步 108
4.1.3 引用调用机制详解 111
4.1.4 常量引用参数 113
4.1.5 混合参数列表 114
4.2 重载与默认实参 121
4.2.1 重载简介 121
4.2.2 分辨重载的准则 125
4.2.3 默认实参 128
4.3 测试及调试函数 130
4.3.1 assert宏 130
4.3.2 与位程序和驱动程序 131
第5章 数组 138
5.1 数组简介 138
5.1.1 数组的声明和引用 138
5.1.2 内存中的数组 142
5.1.3 数组的初始化 144
5.2.1 作为函数实参的索引变量 146
5.2 函数中的数组 146
5.2.2 整个数组作为函数实参 147
5.2.3 const参数修饰词 150
5.2.4 返回一个数组的函数 152
5.3 用数组编程 157
部分填充的数组 157
5.4 多维数组 167
5.4.1 多维数组基础 167
5.4.2 多维数组参数 168
6.1 结构 182
第6章 结构和类 182
6.1.1 结构类型 184
6.1.2 结构作为函数参数 187
6.1.3 结构的初始化 190
6.2 类 193
6.2.1 定义类和成员函数 193
6.2.2 封装 198
6.2.3 公有和私有成员 199
6.2.4 取值和赋值函数 202
6.2.5 结构和类 206
第7章 构造函数及其他工具 211
7.1 构造函数 211
7.1.1 构造函数的定义 211
7.1.2 构造函数的显式调用 217
7.1.3 类类型成员变量 226
7.2 其他工具 229
7.2.1 const参数修饰符 229
7.2.2 内联函数 235
7.2.3 静态成员 236
7.2.4 嵌套类和局部类定义 240
7.3 向量——标准模板库预览 240
7.3.1 向量基础 241
7.3.2 效率问题 244
第8章 操作符重载、友元和引用 249
8.1 基本操作符重载 249
8.1.1 重载基础 249
8.1.2 返回常量类型 256
8.1.3 重载一元操作符 259
8.1.4 作为成员函数的操作符重载 260
8.1.5 重载函数调用符() 263
8.2 友元函数和自动类型转换 263
8.2.1 构造函数的自动类型转换 263
8.2.2 友元函数 265
8.2.3 友元类 269
8.3 引用和其他操作符重载 269
8.3.1 引用 270
8.3.2 重载“<<”和“>>” 271
8.3.4 重载自增和自减操作符 280
8.3.3 赋值操作符 280
8.3.5 重载数组操作符[ ] 283
8.3.6 基于左值和右值的重载 285
第9章 字符串 291
9.1 数组类型的字符串 291
9.1.1 C字符串值和C字符串变量 291
9.1.2 <cstring>库中的其他函数 296
9.1.3 C字符串的输入和输出 299
9.2 字符操作工具 301
9.2.1 字符输入/输出 301
9.2.2 成员函数get和put 302
9.2.3 成员函数putback、peek和ignore 307
9.2.4 字符操作函数 309
9.3 标准string类 312
9.3.1 标准类string简介 312
9.3.2 string类的输入/输出 314
9.3.3 使用string类进行字符串处理 319
9.3.4 string类对象和C字符串的相互转换 326
10.1 指针 334
第10章 指针和动态数组 334
10.1.1 指针变量 335
10.1.2 内存管理基础 341
10.1.3 动态变量和自动变量 344
10.1.4 指针的应用 348
10.2 动态数组 348
10.2.1 数组变量和指针变量 348
10.2.2 创建和使用动态数组 350
10.2.3 指针运算 355
10.2.4 多维动态数组 356
10.3.1 ->操作符 358
10.3 类、指针和动态数组 358
10.3.2 this指针 359
10.3.3 重载赋值操作符 360
10.3.4 析构函数 369
10.3.5 复制构造函数 370
11.1 分散编译 378
11.1.1 封装回顾 378
第11章 分散编译和名字空间 378
11.1.2 头文件和实现文件 379
11.1.3 使用#ifndef 388
11.2 名字空间 391
11.2.1 名字空间和using命令 391
11.2.2 创建一个名字空间 393
11.2.3 using声明 396
11.2.4 限定名字 397
11.2.5 未命名的名字空间 401
11.2.6 嵌套名字空间 408
12.1 I/O流 415
第12章 流和文件I/O操作 415
12.1.1 文件I/O 416
12.1.2 向文件中添加内容 419
12.1.3 字符I/O 425
12.1.4 文件末尾检查 425
12.2 流I/O的工具 429
12.2.1 文件名作为输入 429
12.2.2 使用流函数对输出格式化 430
12.2.3 操作算子(Manipulators) 433
12.2.5 其他的输出流成员函数 434
12.2.4 保存设定的标记 434
12.3 流的层次:继承的简要介绍 441
12.4 随机文件存取 446
第13章 递归 455
13.1 递归void函数 455
13.1.1 一个递归调用的跟踪 458
13.1.2 递归的进一步认识 460
13.1.3 递归调用的栈 463
13.1.4 递归与迭代的比较 464
有返回值的递归函数的一般形式 466
13.2 有返回值的递归函数 466
13.3.1 递归设计技术 470
13.3 按递归的方式思考问题 470
13.3.2 二分查找 472
13.3.3 编码 474
13.3.4 检查递归的正确性 476
13.3.5 效率 477
14.1 继承基础 486
14.1.1 派生类 486
第14章 继承 486
14.1.2 派生类的构造函数 495
14.1.3 protected限定词 498
14.1.4 成员函数的重定义 501
14.1.5 重定义与重载 502
14.1.6 访问重定义函数的基类版本 503
14.1.7 不可继承的函数 504
14.2 使用继承进行编程 505
14.2.1 派生类中的赋值操作符和复制构造函数 505
14.2.2 派生类的析构函数 506
14.2.3 保护继承和私有继承 518
14.2.4 多继承 519
第15章 多态与虚函数 524
15.1 虚函数基础 524
15.1.1 后绑定 524
15.1.2 C++中的虚函数 525
15.1.3 抽象类和纯虚函数 532
15.2 指针和虚函数 535
15.2.1 虚函数和扩展类型兼容性 535
15.2.2 向下转换和向上转换 541
15.2.3 C++是如何实现虚函数 543
第16章 模板 546
16.1 函数模板 546
定义函数模板的语法 547
16.2 类模板 558
16.2.1 类模板的语法 558
16.2.2 C++中的模板类vector和basic_stirng 568
16.3 模板和继承 568
17.1 节点和链表 579
第17章 链式数据结构 579
17.1.1 节点 580
17.1.2 链表 584
17.1.3 向链表头插入一个节点 585
17.1.4 向链表中插入或移除节点 589
17.1.5 搜索链表 592
17.2 链表的应用 599
17.3 迭代器 611
17.3.2 迭代器类 612
17.3.1 指针作为迭代器 612
17.4 树 619
树的性质 619
第18章 异常处理 636
18.1 异常处理基础 636
18.1.1 异常处理的一个样例 637
18.1.2 自定义异常类 644
18.1.3 多重抛出和捕获 646
18.1.4 在函数中抛出异常 649
18.1.5 异常说明 651
18.2.1 抛出异常的时机 654
18.2 异常处理的编程技术 654
18.2.2 异常类的层次结构 656
18.2.3 测试可用内存 657
18.2.4 再次抛出异常 657
第19章 标准模板库 660
19.1 迭代器 661
19.1.1 迭代器基础 661
19.1.2 迭代器的种类 665
19.1.3 常量和可变迭代器 669
19.1.4 反向迭代器 670
19.1.5 其他几种迭代器 672
19.2 容器 673
19.2.1 连续容器 673
19.2.2 容器适配器栈和队列 678
19.2.3 关联容器集合和映射 681
19.2.4 效率 685
19.3 泛型算法 685
19.3.1 运行时间和Big-O记法 686
19.3.2 容器访问运行时间 689
19.3.3 不改变序列的算法 690
19.3.4 改变序列的算法 694
19.3.5 集合算法 695
19.3.6 排序算法 697
第20章 模式和UML 703
20.1 模式 703
20.1.1 适配器模式 704
20.1.2 模型-视图-控制器模式 704
20.1.3 排序模式的效率 710
20.1.4 模式形式体系 712
20.2 UML 713
20.2.1 UML的历史 713
20.2.2 UML的类图表 714
20.2.3 类的相互作用 714
附录1 C++关键字 718
附录2 操作符优先级 719
附录3 ASCII字符集 721
附录4 一些库函数 722
附录5 旧的和新的头文件 728