第1章 C++的发展历程 1
1.1 C++的起源 1
1.1.1 C的诞生 1
目录 1
1.1.2 对C++的需求 3
1.1.3 C++的诞生 3
1.2 C++的发展 4
1.3.1 封装 5
1.3.2 多态 5
1.3 什么是面向对象程序设计 5
1.3.3 继承 6
1.3.4 C++实现OOP 6
1.3.5 C++与Java和C# 6
第2章 C++概览 8
2.1 第一个C++程序 8
2.1.1 键入程序 9
2.1.2 编译程序 9
2.1.3 运行程序 9
2.1.4 逐行解释 10
2.3 第二个C++程序 12
2.2 处理语法错误 12
2.4 一个更实际的例子 13
2.5 一种新的数据类型 14
2.6 快速回顾 15
2.7 函数 15
2.8 函数的参数 16
2.8.1 函数返回值 18
2.8.2 函数main() 19
2.8.3 C++函数的通用形式 19
2.10.1 if语句 20
2.10 两个简单的命令 20
2.9 输出选项 20
2.10.2 for循环 21
2.11 代码块 22
2.12 分号与定位 23
2.13 缩进编排 24
2.14 C++中的关键字 24
2.15 C++的标识符 25
2.16 标准C++库 25
第3章 基本数据类型 26
3.1 变量的声明 27
3.1.1 局部变量 27
3.1.3 全局变量 28
3.1.2 形式参数 28
3.2 类型修饰符 29
3.3 字面量 32
3.3.1 十六进制与八进制的字面量 33
3.3.2 字符串字面量 33
3.3.3 字符转义序列 34
3.4 变量的初始化 34
3.5 运算符 36
3.5.1 算术运算符 36
3.5.2 增量运算与减量运算 37
3.5.3 关系运算符与逻辑运算符 38
3.6 表达式 41
3.6.1 表达式中的类型转换 41
3.6.2 bool类型的转换 41
3.6.3 强制转换 42
3.6.4 空格与圆括号 43
第4章 程序控制语句 44
4.1 if语句 44
4.1.1 条件表达式 45
4.1.2 嵌套if语句 46
4.1.3 if-else-if梯状结构 47
4.2 for循环 48
4.2.1 for循环的变形 49
4.2.2 省略循环组成部分 50
4.2.3 无限循环 51
4.2.4 延时循环 51
4.3 switch语句 51
4.4 while循环 54
4.5 do-while循环 55
4.6 使用continue 56
4.7 用break跳出循环 57
4.9 使用goto语句 58
4.8 嵌套循环 58
4.10 综合应用 59
第5章 数组和字符串 61
5.1 一维数组 61
5.2 字符串 64
5.3 字符串库函数 66
5.3.1 strcpy 66
5.3.2 strcat 67
5.3.3 strcmp 67
5.3.4 strlen 68
5.3.5 使用空字符作为终止符 69
5.4 二维数组 70
5.5 多维数组 71
5.6 数组初始化 72
5.7 字符串数组 75
第6章 指针 79
6.1 什么是指针 79
6.2 指针运算符 80
6.2.1 基本类型的重要性 81
6.2.2 通过指针赋值 82
6.3 指针表达式 82
6.3.1 指针的数学运算 83
6.4 指针和数组 84
6.3.2 指针的比较运算 84
6.4.1 对指针使用下标 86
6.4.2 指针和数组可否互换 87
6.5 指针与字符串字面量 87
6.6 指针比较的示例 88
6.7 指针数组 89
6.8 空指针约定 91
6.9 多重间接 91
6.10 指针带来的问题 93
6.10.1 未初始化的指针 93
6.10.2 无效的指针比较运算 93
6.10.3 忘记复位指针 94
7.1 函数的作用域准则 96
7.1.1 局部变量 96
第7章 函数,第一部分:基础知识 96
7.1.2 形式参数 101
7.1.3 全局变量 101
7.2 传递指针和数组 102
7.2.1 用指针调用函数 103
7.2.2 用数组调用函数 104
7.2.3 传递字符串 106
7.3 argc和argv:函数main()的参数 107
7.4.1 从函数中返回 110
7.4 return语句 110
7.4.2 返回值 111
7.4.3 void函数 112
7.4.4 返回指针的函数 113
7.5 函数原型 114
7.6 头文件:进一步的学习 115
7.7 递归 116
第8章 函数,第二部分:引用,重载和默认参数 119
8.1 两种参数传递的方法 119
8.1.1 C++如何传递参数 119
8.1.2 用指针实现引用调用 120
8.2 引用参数 121
8.2.1 返回引用 123
8.2.2 创建有界数组 126
8.2.3 独立引用 127
8.2.4 使用引用的一些限制 127
8.3 函数的重载 128
8.4 函数的默认参数 130
8.4.1 默认参数与重载 132
8.4.2 正确使用默认参数值 133
8.5 函数重载与歧义性 133
9.1.1 const 136
第9章 更多的数据类型与运算符 136
9.1 限定符const和volatile 136
9.1.2 volatile 138
9.2 存储类型限定符 139
9.2.1 auto 139
9.2.2 extern 139
9.2.3 static变量 141
9.2.4 register变量 143
9.3 枚举 145
9.6 按位运算符 148
9.5 更多运算符 148
9.4 typedef 148
9.6.1 与、或、异或和非 149
9.6.2 移位运算符 152
9.7 运算符? 153
9.8 复合赋值运算 154
9.9 逗号运算符 155
9.10 多重赋值运算 155
9.11 使用sizeof 156
9.12 使用new和delete进行动态分配 156
9.12.1 对动态分配的内存进行初始化 158
9.12.2 分配数组的内存 159
9.13 优先级综述 161
第10章 结构与联合 162
10.1 结构 162
10.1.1 访问结构成员 164
10.1.2 结构数组 164
10.1.3 一个简单的库存信息示例程序 165
10.1.4 传递结构参数 170
10.1.5 结构的赋值 170
10.1.6 结构指针与箭头运算符 171
10.1.7 结构的引用 174
10.1.8 在结构中的数组和结构 175
10.1.9 位域 176
10.2 联合 178
10.3 用sizeof来保证可移植性 182
10.4 转入面向对象程序设计 182
第11章 类 184
11.1 类的基本概念 184
11.2 进一步学习类的成员访问 187
11.3 构造函数和析构函数 189
11.3.1 参数化构造函数 191
11.3.2 另一种初始化方法 194
11.4 类与结构的关系 195
11.5 联合与类 197
11.6 内联函数 197
11.7 对象数组 200
11.8 对象指针 202
11.9 对象引用 203
第12章 类的深入学习 204
12.1 友员函数 204
12.2 重载构造函数 207
12.3 动态初始化 208
12.4 对象赋值 210
12.5 将对象传递给函数 211
12.5.1 构造函数、析构函数和对象传递 212
12.5.2 传递对象时一个潜在的问题 213
12.6 返回对象 215
12.7 创建和使用复制构造函数 217
12.7.1 复制构造函数与参数 218
12.7.2 复制构造函数与初始化 219
12.7.3 在返回对象时使用复制构造函数 220
12.8 关键字this 222
第13章 运算符的重载 223
13.1 使用成员函数重载运算符 223
13.1.1 使用成员函数重载一元运算符 225
13.1.2 运算符重载的技巧与限制 230
13.2 非成员运算符函数 230
13.3 深入学习赋值运算符 236
13.4 重载[] 239
13.5 重载() 241
13.6 重载其他的运算符 242
13.7 运算符重载的另一个示例 243
第14章 继承 247
14.1 继承的介绍 247
14.2 基类的访问控制 249
14.3 使用保护成员 251
14.4 多重继承 255
14.5 构造函数、析构函数和继承 256
14.5.1 何时执行构造函数和析构函数 256
14.5.2 将参数传递给基类构造函数 258
14.6 授权访问 261
14.7 虚基类 263
第15章 虚函数与多态 267
15.1 指向派生类型的指针 267
15.2 虚函数 269
15.2.1 虚函数的继承 271
15.2.3 虚函数的简单应用 273
15.2.2 为什么需要虚函数 273
15.2.4 纯虚函数与抽象类 276
15.3 早绑定与晚绑定 278
第16章 模板 279
16.1 通用函数 279
16.2 显式重载通用函数 281
16.2.1 重载函数模板 283
16.2.2 模板函数使用标准参数 283
16.2.3 通用函数的限制 284
16.3 通用类 285
16.3.1 使用两个通用数据类型的示例 287
16.3.2 创建一个通用数组类 288
16.3.3 在通用类中使用标准类型的参数 289
16.3.4 模板类使用默认参数 290
16.3.5 类的显式特例化 292
第17章 异常处理 293
17.1 异常处理的基础 293
17.1.1 异常类 297
17.1.2 使用多个catch语句 298
17.2 异常处理的选项 299
17.2.1 捕获所有的异常 299
17.2.2 对函数中抛出异常的限制 301
17.2.3 再次抛出异常 302
17.3 处理运算符new抛出的异常 303
17.4 重载new和delete 305
第18章 C++的I/O系统 309
18.1 旧式和现代C++的I/O系统 309
18.2 C++流 309
18.3 C++中的流类型 310
18.4 重载I/O运算符 311
18.4.1 创建插入符 312
18.4.2 使用友员函数重载插入符 313
18.4.3 重载提取符 314
18.5 格式化I/O 316
18.5.1 使用ios的成员函数来格式化数据的I/O 316
18.5.2 使用I/O操控符 319
18.5.3 创建你自己的操控符函数 321
18.6 文件I/O 323
18.6.1 打开和关闭一个文件 323
18.6.2 文本文件的读与写 324
18.6.3 无格式的二进制I/O 325
18.6.4 数据块的读写 327
18.6.6 文件比较的示例程序 328
18.6.5 检测EOF 328
18.7 其他的二进制I/O函数 330
18.8 随机访问 331
18.9 检测I/O状态 333
18.10 定制的I/O与文件 334
第19章 运行时类型识别与强制转换运算符 336
19.1 运行时类型识别(RTTI) 336
19.1.1 运行时类型识别的简单应用 339
19.1.2 typeid可以应用于模板类 341
19.2 强制转换运算符 343
19.2.1 dynamic_cast 344
19.2.2 const_cast 348
19.2.3 static_cast 349
19.2.4 reinterpret_cast 349
第20章 名字空间和其他高级主题 351
20.1 名字空间 351
20.1.1 名字空间的基本概念 351
20.1.2 using 354
20.1.3 匿名名字空间 355
20.2 std名字空间 356
20.3 函数指针 357
20.4 类的静态成员 361
20.5 const成员函数和mutable 362
20.6 显式构造函数 363
20.7 成员初始化语法 365
20.8 关键字asm 367
20.9 链接指定 367
20.10 成员指针运算符.*和-〉* 368
20.11 创建转换函数 370
第21章 标准模板库 372
21.1 STL概览 372
21.2 容器类 374
21.3 vector 375
21.3.1 使用迭代器访问vector 379
21.3.2 在vector中插入和删除元素 380
21.3.3 在vector中保存对象 381
21.4 list 384
21.4.1 list排序 387
21.4.2 list合并 388
21.4.3 在list中存储对象 389
21.5 map 391
21.6 算法 395
21.6.1 统计 397
21.6.2 删除和替换元素 398
21.6.4 序列的变形 400
21.6.3 反序 400
21.6.5 探讨其他的算法 401
21.7 string类 401
21.7.1 string的一些成员函数 404
21.7.2 将字符串放入其他容器中 407
21.8 关于STL的最后思考 408
第22章 C++预处理器 409
22.1 #define 409
22.2 #error 412
22.3 #include 412
22.4.1 #if,#else,#elif和#endif 413
22.4 条件编译指令 413
22.4.2 #ifdef与#ifndef 415
22.4.3 #undef 415
22.4.4 使用defined 416
22.5 #line 416
22.6 #pragma 417
22.7 预处理器运算符#和## 417
22.8 预定义的宏 418
22.9 最后的思考 419
附录A 基于C的I/O 420
A.1 C的I/O系统使用流 420
A.2 函数printf()和scanf() 421
A.3 C的文件系统 426
A.4 fseek()与随机访问I/O 432
A.5 fprintf()和fscanf() 433
A.6 删除文件 433
附录B 使用旧的C++编译器 434
附录C .NET对C++的受控扩展 436
C.1 .NET中的扩展关键字 436
C.2 扩展预处理指令 438
C.3 属性attribute 438
C.4 编译受控C++代码 438