第1章 初识C++ 1
1.1 C++简介 1
1.2 C++与C的区别 2
1.3 学习C++之前需要先学C吗 3
1.4 C++与其他语言的区别 3
1.5 C++的版本以及安装问题 3
第2章 做一个最简短的C++程序 4
2.1 简单的屏幕输出小程序 4
2.2 输出语句的使用 5
2.3 std::介绍 6
2.4 iostream与iostream.h的区别 7
2.5 重名问题 8
2.6 注释 9
第3章 初步了解函数 11
3.1 一个简单的函数 11
3.2 函数的传参 12
3.3 函数的返回值、参数与变量 13
3.4 函数的声明与定义 14
3.5 局部变量 16
3.6 全局变量 17
第4章 C++数据类型 19
4.1 变量的定义 19
4.2 将变量及数据存储在内存中 20
4.3 布尔型变量 21
4.4 字符型变量 21
4.5 wchar_t双字节型变量 25
4.6 整型概述 26
4.7 整型变量的定义 28
4.8 浮点型变量 29
4.9 常量 30
4.10 枚举型常量 30
第5章 if语句与逻辑运算符 32
5.1 语句的定义 32
5.2 块的定义 32
5.3 表达式的定义 33
5.4 运算符的定义 34
5.4.1 赋值运算符的定义 34
5.4.2 数学运算符的定义 34
5.4.3 赋值运算符与数学运算符的联合 35
5.5 自加与自减 35
5.5.1 前置 36
5.5.2 后置 36
5.6 表达式的优先级 37
5.7 关系运算符 37
5.8 if语句 37
5.8.1 else语句 39
5.8.2 else if语句 40
5.8.3 if语句的嵌套 41
5.9 逻辑运算符及其使用 44
5.9.1 逻辑“与” 44
5.9.2 逻辑“或” 45
5.9.3 逻辑“非” 46
5.9.4 逻辑运算符的优先级 46
5.9.5 运算式的真假关系 48
5.10 三目运算符 50
5.10.1 三目运算符的优先问题 50
5.10.2 三目运算符的使用问题 51
5.10.3 三目运算符的型别问题 51
5.10.4 三目运算符在字符型变量中的使用 52
5.11 复杂嵌套的if语句 52
第6章 面向对象 54
6.1 面向对象程序语言的主要特征 54
6.2 类、对象和成员 55
6.3 类、对象和成员的使用方法及区别 56
6.3.1 声明一个类 56
6.3.2 命名习惯 57
6.3.3 定义一个对象 57
6.3.4 类与对象的区别 57
6.3.5 对象与成员的关系 57
6.3.6 不要给类赋值 58
6.3.7 对象只能调用类中存在的成员 58
6.4 公有 59
6.5 私有 60
6.6 成员函数的声明和定义 63
6.7 为什么将成员函数的声明和定义分开 64
6.7.1 普通内联函数 65
6.7.2 成员内联函数 66
6.8 将类声明和定义部分保存在头文件中 67
6.9 const成员函数 68
6.10 构造函数 69
6.11 默认构造函数 70
6.12 析构函数 71
6.13 析构对象数组 72
第7章 循环语句 73
7.1 循环语句的前身——goto语句 73
7.2 慎用goto语句 74
7.3 while语句 74
7.3.1 带运算符的while语句 75
7.3.2 以字符为条件的while语句 75
7.3.3 限定while循环的次数 76
7.3.4 continue语句 77
7.3.5 break语句 78
7.3.6 永不休止的while循环 79
7.4 do...while循环 80
7.5 for循环 81
7.5.1 灵活的for循环 83
7.5.2 条件为空的for循环 83
7.5.3 执行为空的for循环 84
7.5.4 嵌套的for循环 85
7.6 switch语句 86
7.6.1 switch语句常见错误 88
7.6.2 switch的菜单功能 89
7.7 总结 90
第8章 指针 91
8.1 什么是地址 91
8.2 用指针来保存地址 92
8.2.1 空指针 92
8.2.2 指针与变量类型 93
8.2.3 用指针来访问值 93
8.2.4 指针地址、指针保存的地址和该地址的值 94
8.2.5 指针对数值的操作 95
8.2.6 更换指针保存的地址 96
8.3 为什么使用指针 97
8.3.1 栈和堆 98
8.3.2 用指针创建堆中空间 101
8.3.3 用指针删除堆中空间 102
8.4 动态内存 103
8.4.1 内存泄漏 103
8.4.2 在堆中创建对象 104
8.4.3 在堆中删除对象 105
8.4.4 访问堆中的数据成员 105
8.4.5 在构造函数中开辟内存空间 106
8.4.6 对象在栈与堆中的不同 107
8.5 this指针 109
8.6 指针的常见错误 110
8.7 指针运算 112
8.7.1 指针的加减运算 112
8.7.2 指针的赋值运算 113
8.7.3 指针的相减运算 114
8.7.4 指针的比较运算 114
8.8 指针 115
8.8.1 常量指针 115
8.8.2 指向常量的指针 116
8.8.3 指向常量的常指针 116
8.9 总结 117
第9章 引用 118
9.1 什么是引用 118
9.1.1 引用的地址 119
9.1.2 引用就是别名常量 119
9.1.3 引用对象 120
9.1.4 空引用 121
9.2 函数的参数传递 121
9.2.1 通过值来传递函数参数 121
9.2.2 通过指针来传递函数参数 122
9.2.3 通过引用来传递函数参数 123
9.2.4 让函数返回多个值 124
9.3 传递对象 127
9.3.1 用值来传递对象 127
9.3.2 使用指针来传递对象 129
9.3.3 使用const指针来传递对象 130
9.3.4 使用引用来传递对象 131
9.3.5 到底是使用引用还是指针 133
9.3.6 引用和指针可以一块用 134
9.4 引用应注意的问题 135
9.4.1 引用容易犯的错误 135
9.4.2 引用一个按值返回的堆中对象 138
9.4.3 引用一个按别名返回的堆中对象 140
9.4.4 在哪里创建,就在哪里释放 141
9.5 总结 142
第10章 深入函数 144
10.1 函数重载 144
10.1.1 普通函数的重载 144
10.1.2 成员函数的重载 145
10.2 函数的默认参数 146
10.3 重载构造函数 148
10.3.1 成员变量的初始化 148
10.3.2 成员变量的初始化与构造函数 149
10.3.3 复制构造函数 152
10.3.4 构造函数和new运算符 153
10.3.5 再谈默认构造函数 155
10.4 析构函数和delete运算符 156
10.4.1 默认析构函数 156
10.4.2 调用构造函数进行类型转换 157
10.5 浅层复制构造函数 158
10.6 深层复制构造函数 160
第11章 运算符重载 162
11.1 运算符重载 162
11.2 在成员函数中实现自加 163
11.3 重载前置自加运算符 163
11.4 创建临时对象 165
11.5 创建无名临时对象 166
11.6 取消创建临时对象 167
11.7 重载后置自加运算符 168
11.8 重载加法运算函数operator+ 170
11.9 重载赋值运算函数operator= 172
11.10 转换类型运算符 178
11.10.1 温习调用构造函数实现的类型转换 178
11.10.2 通过构造函数将变量转换为一个对象的成员变量 179
11.10.3 通过operator关键字进行转换 181
11.11 什么可以被重载,什么不可以 182
第12章 继承 183
12.1 什么是继承和派生 183
12.1.1 复杂的继承和派生 183
12.1.2 继承和派生如何在C++中实现 184
12.1.3 继承的种类及语法 185
12.1.4 单一继承 185
12.2 公有型、保护型和私有型 187
12.3 访问权限 188
12.4 多重继承 192
12.5 继承的构造与析构 194
12.6 向基类构造函数传递参数 197
12.7 继承和重载的两义性问题 200
12.7.1 多重继承容易产生两义性 200
12.7.2 两义性在重载时的一些问题 202
12.7.3 两义性的归属问题 203
12.7.4 减少两义性产生的混淆问题 205
12.7.5 虚基类不会产生两义性 206
12.8 总结 207
第13章 虚函数 209
13.1 指向对象的指针 209
13.2 虚函数 210
13.3 拳击游戏 212
13.4 继承是否可以实现多态性 214
13.5 在编译时的静态联编 216
13.6 在运行时的静态联编 216
13.7 在编译时的动态联编 217
13.8 在运行时的动态联编 218
13.9 调用虚函数 219
13.9.1 在虚函数中调用成员函数 219
13.9.2 三种调用虚函数的方式比较 221
13.10 被继承的虚函数仍然是虚函数 223
13.11 系统是如何调用虚函数的 224
13.12 在虚函数中使用成员名限定 224
13.13 虚析构函数 225
第14章 数组 228
14.1 数组的基本用法 228
14.1.1 什么是数组 228
14.1.2 数组元素 228
14.1.3 数组下标越界 229
14.1.4 倒序输出 230
14.1.5 将数组的下标定义为常量 230
14.1.6 手动操作数组元素 231
14.1.7 数组的初始化 232
14.2 数组的用途 233
14.2.1 求平均考试成绩 233
14.2.2 兔子繁殖问题 235
14.2.3 数字排序问题 237
14.3 数组在内存中的分布 239
14.4 输出数组名 241
14.5 数组名与函数 241
14.6 传递与接收 242
14.7 数组与函数 243
14.7.1 函数传参实例一——求数组所有元素的和 244
14.7.2 函数传参实例二——用递增法查找数据 245
14.7.3 函数传参实例三——用二分法查找数据 246
14.7.4 函数传参实例四——判断数组是否按照顺序排列 247
14.7.5 函数传参实例五——判断数组排列方式后执行不同的函数 247
14.8 数组在对象中的传参 249
14.9 数组对象 250
14.10 在数组对象中初始化成员变量 251
14.11 指针数组 252
14.12 枚举常量与数组 257
14.13 多维数组 258
14.14 多维数组的初始化 259
14.15 字符数组 260
14.16 重载数组下标操作符 269
第15章 链表 272
15.1 声明链表结构 272
15.2 简单的图书链表 273
15.2.1 图书链表 273
15.2.2 类的链表 274
15.3 动态链表 274
15.3.1 动态链表的建立 275
15.3.2 解决输入字符造成死循环的问题 277
15.3.3 动态链表的显示 280
15.3.4 动态链表的删除 280
15.3.5 动态链表的插入 282
15.3.6 链表统计 283
15.3.7 使用链表 284
15.4 完整的动态链表清单 286
15.5 链表使用案例——走迷宫 290
15.5.1 创建Windows应用程序项目 291
15.5.2 创建窗口 291
15.5.3 加载图片 293
15.5.4 句柄是什么 294
15.5.5 显示图片 295
15.5.6 动画 299
15.5.7 键盘控制人物移动 303
15.5.8 迷宫墙壁 307
15.5.9 走迷宫 313
15.5.10 用链表记录行走路线 316
第16章 多态性 322
16.1 为什么要使用多重继承 322
16.2 在派生类中增加函数 324
16.3 使用多重继承 326
16.4 多重继承中初始化构造函数的参数 328
16.5 多个子基类共享一个父基类 330
16.6 虚基类 333
16.7 慎用多重继承 336
16.8 空的虚函数 336
16.9 抽象类和纯虚函数 338
16.10 纯虚函数 340
16.11 复杂的抽象结构 342
第17章 类的特殊成员 346
17.1 静态成员变量 346
17.2 私有静态成员变量 349
17.3 静态成员函数 349
17.4 静态成员的使用 351
17.5 函数指针 353
17.6 函数指针数组 357
17.7 函数指针也可以作为函数的参数 359
17.8 使用typedef简化函数指针的声明及定义 361
17.9 类的函数指针 363
17.10 成员函数指针数组 365
第18章 字符串 368
18.1 char型字符串 368
18.2 string型字符串 371
18.2.1 string型字符串的赋值 376
18.2.2 string型字符串的合并 378
18.2.3 string型字符串的部分合并 380
18.2.4 string型字符串的替换 381
18.2.5 string型字符串的复制 384
18.2.6 string型字符串的插入 385
18.2.7 string型字符串的删除 386
18.2.8 string型字符串的查找 387
18.2.9 string型字符串的比较 388
18.2.10 判断string型字符串是否为空 389
18.3 字符串的使用 389
18.3.1 swap()交换两个字符串的内容 389
18.3.2 将string型字符串转为char型字符串 390
18.3.3 char型字符串与函数 391
18.3.4 函数如何返回字符串 392
18.4 结构体 394
18.4.1 结构体的赋值 397
18.4.2 结构体与函数 398
18.4.3 结构体与string 400
18.5 string数组与函数 401
18.6 流的使用 402
18.6.1 重载输出运算符〈〈 403
18.6.2 友元的方式重载输出运算符 405
18.6.3 重载自加运算符的执行次序 406
18.6.4 重载输入运算符〉〉 407
18.7 编写一个String类 408
18.7.1 创建String类 409
18.7.2 创建可自动调节大小的String类字符串对象 410
18.7.3 限制数组越界 412
18.7.4 用复制构造函数实现字符串的赋值功能 413
18.7.5 用重载赋值运算符函数实现真正的字符串赋值功能 419
18.7.6 用重载输出运算符operator〈〈()函数实现字符串的输出 422
18.7.7 用重载输入运算符operator〉〉()函数实现字符串的输入 424
18.7.8 用重载比较运算符实现字符串的比较 426
18.7.9 为String类添加字符串的相加功能 429
18.7.10 为String类添加字符串的+=功能 435
18.7.11 完成后的String类 439
第19章 代码重用 443
19.1 包含 443
19.2 将String类作为包含类 445
19.3 为book类重载执行相加运算的成员函数 449
19.4 包含对系统造成的消耗 453
19.5 按别名传递book对象 457
19.6 包含指向另一个类的指针 460
19.6.1 数据类Date 460
19.6.2 链表类Node 460
19.6.3 标签类linkelist 461
19.6.4 头节点类HeadNode 462
19.6.5 尾节点TailNode类 463
19.6.6 中间节点InterNode类 464
19.6.7 InterNode类的构造函数 465
19.6.8 InterNode类的插入函数 465
19.6.9 全部程序 467
19.7 将头节点、中间节点和尾节点合并为一个节点 473
19.7.1 数据类Date 473
19.7.2 由Date类派生的图书类Book 474
19.7.3 由Date类派生的药品类medica 474
19.7.4 创建一个节点类Node 475
19.7.5 用来操作节点类Node的list类 475
19.7.6 list类的getfirst()方法 476
19.7.7 list类的operator[]方法 476
19.7.8 list类的repeat()方法 477
19.7.9 list类的insert()方法 477
19.7.10 list类的find()方法 479
19.7.11 重写的药品管理全部程序 480
19.8 利用类的包含来实现代码重用 485
19.9 私有继承 491
19.10 什么时候使用私有继承,什么时候使用包含 496
19.11 保护继承 497
第20章 友元类与嵌套类 498
20.1 友元类 498
20.2 嵌套类 505
第21章 流 510
21.1 流的操作 510
21.1.1 缓冲 510
21.1.2 流和缓冲区 510
21.1.3 标准输入输出对象 511
21.1.4 重定向 511
21.1.5 对象代表流 511
21.2 用cout输出 512
21.2.1 重载运算符operator〈〈 512
21.2.2 清理缓冲区 514
21.2.3 有关输出的相关函数 515
21.2.4 设置输出的字段宽度 516
21.2.5 设置填充字段 517
21.2.6 设置浮点数的显示精度 518
21.2.7 输出末尾的0 519
21.2.8 设置标志 519
21.2.9 setf()函数原型 524
21.2.10 所有15个标志以及3个指示标志 526
21.2.11 unset()函数 527
21.2.12 标准控制符 528
21.2.13 iomanip头文件与标准控制符 530
21.3 用cin输入 532
21.3.1 字符串的输入 533
21.3.2 字符串的输入问题 534
21.3.3 get()函数 534
21.3.4 带字符引用参数的get()函数 540
21.3.5 带2个参数的get()函数 542
21.3.6 带3个参数的get()函数 544
21.3.7 getline()函数 546
21.3.8 read()函数 548
21.3.9 gcount()函数 550
21.3.10 peek()函数 551
21.3.11 putback()函数 552
21.4 文件的输入和输出 553
21.4.1 输出数据到文件 553
21.4.2 读取文件中的数据 554
21.4.3 读取空格及空格后面的字符 556
21.5 多种打开文件的方式 557
21.6 检查文件是否打开 559
21.7 二进制文件和文本文件 562
21.7.1 以文本形式输出到文件 563
21.7.2 以二进制形式输出到文件 564
21.8 打开多个文件 565
21.9 命令行处理文件 566
21.10 使用命令行处理文件例程 568
21.11 指定读取文件中的数据 570
21.12 输出数据到文件指定位置处 572
21.13 seekp()和seekg()函数的结合使用 573
21.14 临时文件 583
21.15 sstream字符串输入输出流类 584
第22章 命名空间 587
22.1 什么是命名空间 587
22.2 创建命名空间 590
22.2.1 扩充命名空间的内容 590
22.2.2 尽量在命名空间之外定义函数 590
22.2.3 命名空间中的成员都是公有的 592
22.3 使用命名空间 592
22.4 使用关键字using 595
22.5 为你的命名空间取个别名 598
22.6 未命名的命名空间 599
22.6.1 未命名命名空间与全局变量的区别 600
22.6.2 未命名命名空间与static的区别 601
22.6.3 未命名命名空间、static与extern的区别 601
22.7 标准命名空间std 602
第23章 模板 603
23.1 什么是模板 603
23.2 重载模板 606
23.3 具体化函数模板 608
23.3.1 函数模板不能重载 608
23.3.2 具体化函数模板解决重载问题 610
23.3.3 具体化函数模板与实例化模板函数 612
23.4 普通函数、函数模板与具体化函数模板的优先级 614
23.4.1 普通函数和函数模板的执行次序 614
23.4.2 函数模板与具体化函数模板的执行次序 615
23.4.3 具体化函数模板与普通函数的优先级 616
23.5 函数模板的匹配 616
23.6 类模板的定义 618
23.7 复杂类模板 619
23.8 数组模板 623
23.9 对象数组模板 627
23.10 具有多个参数的模板 630
23.11 为模板参数提供默认值 632
23.12 约束模板 634
23.13 模板成员 635
23.14 将模板用作参数 637
23.15 模板和友元 639
23.15.1 非模板友元类和友元函数 639
23.15.2 通用模板友元类和友元函数 644
23.15.3 特定类型模板友元函数 647
23.16 多余的临时对象 651
23.17 静态成员和模板 658
23.18 标准模板库 659
23.18.1 容器 659
23.18.2 顺序容器 660
23.18.3 关联容器 675
23.18.4 算法类 691
23.18.5 总结 719
第24章 异常和错误处理 720
24.1 异常 720
24.2 设置多条catch语句 724
24.3 异常的派生 727
24.4 创建异常类的成员函数 729
24.5 异常类的虚函数 731
24.6 异常类与模板的关系 734
第25章 补充内容 738
25.1 预处理过程 738
25.1.1 预处理指令 738
25.1.2 #include指令 738
25.1.3 #define指令 739
25.1.4 用#define指令替换常量 739
25.1.5 用#define定义一个特定字符串并对其进行测试 739
25.1.6 #ifdef、#define和#endif的用途 740
25.1.7 带参数的#define 741
25.1.8 宏与内联函数 743
25.1.9 #运算符 744
25.1.10 ##运算符 744
25.1.11 #undef指令 745
25.1.12 #if指令 745
25.1.13 #endif指令 745
25.1.14 #if defined指令 745
25.1.15 #ifdef和#ifndef指令 745
25.1.16 #elif指令 746
25.1.17 #error指令 746
25.1.18 #line指令 746
25.1.19 #pragma指令 747
25.2 预定义的宏 754
25.3 assert()宏 756
25.4 尝试编写一个简单的assert()宏 756
25.5 不能为0的变量 758
25.6 用宏函数来输出表达式的值 760
25.7 调试的级别 760
25.8 C++类型转换及运行时类型信息(RTII) 762
25.8.1 动态类型转换符 763
25.8.2 静态类型转换 767
25.8.3 重新解释类型转换 769
25.8.4 常类型转换 770
25.8.5 运行时类型信息 771
25.9 关键字volatile 772
25.10 关键字const 774
25.11 关键字mutable 774
25.12 联合数据类型union 775
25.13 联合数据类型的内存占用 776
25.14 匿名联合体 778
25.15 再谈指针 779
25.15.1 指针与数组 779
25.15.2 指针操作多维数组 782
25.15.3 指向多维数组的指针作为函数参数 785
25.15.4 字符串的指针 786
25.15.5 接受字符串指针的函数 787
25.15.6 指向字符串的指针变量与字符数组的区别 788
25.15.7 指向函数的指针 790
25.15.8 指向函数的指针的用途 791
25.15.9 指针数组 794
25.15.10 指向指针的指针 795
25.16 位运算 796
25.16.1 按位与“&”运算符 797
25.16.2 按位或“|”运算符 800
25.16.3 异或“^”运算符 800
25.16.4 取反“~”运算符 802
25.16.5 左移“〈〈”运算符 803
25.16.6 右移“〉〉”运算符 803
25.16.7 复合位运算符 804
25.16.8 不同长度数字的位运算 804
25.16.9 位运算的实例 804
25.17 位字段 805
25.18 区域差异 808
25.18.1 locale类 809
25.18.2 默认区域表示或全局区域表示 809
25.18.3 时间与地理设置 810
25.18.4 locale与time.h中时间函数的搭配使用 829
25.18.5 区域表示locale与流的搭配使用 832
25.18.6 区域表示locale与模板的搭配使用 833
附录A ASCII码对照表 835
附录B C++的关键字 837
附录C C++常用头文件列表 839