第1章 绪论 2
1.1 C++简史 2
目录 2
第1周课程简介 2
1.1.2 过程化编程、结构化编程和面向对象编程 3
1.1.1 解决问题 3
1.1.4 C++和面向对象编程 4
1.1.3 面向对象编程(OOP) 4
1.6 ANSI标准 5
1.5 微软的C++可控扩展 5
1.2 C++的发展历程 5
1.3 应该先学习C语言吗 5
1.4 C++、Java和C 5
1.8 开发环境 6
1.7 编程准备 6
1.10 程序开发周期 7
1.9.2 用链接器生成可执行文件 7
1.9 创建程序的步骤 7
1.9.1 用编译器生成对象文件 7
1.11 HELLO.cpp:第一个C++程序 8
1.12 编译器初步 9
1.15 问与答 10
1.14 小结 10
1.13 编译错误 10
1.16.2 练习 11
1.16.1 测验 11
1.16 作业 11
2.1 一个简单程序 12
第2章 C++程序的组成部分 12
2.2 cout简介 13
2.3 使用标准名称空间 15
2.4 对程序进行注释 16
2.4.2 使用注释 17
2.4.1 注释的类型 17
2.5 函数 18
2.4.3 有关注释的警告 18
2.5.1 使用函数 19
2.7 问与答 20
2.6 小结 20
2.5.2 方法和函数 20
2.8.2 练习 21
2.8.1 测验 21
2.8 作业 21
3.1.2 预留内存 22
3.1.1 将数据存储在内存中 22
第3章 使用变量和常量 22
3.1 什么是变量 22
3.1.3 整型变量的大小 23
3.1.4 基本变量类型 24
3.2 定义变量 25
3.2.3 关键字 26
3.2.2 命名规则 26
3.2.1 区分大小写 26
3.4 给变量赋值 27
3.3 一次创建多个变量 27
3.5 使用typedef来创建别名 28
3.6 何时使用short和long 29
3.6.2 signed整型变量的回绕 30
3.6.1 unsigned整型变量的回绕 30
3.7 使用字符 31
3.7.2 特殊打印字符 32
3.7.1 字符和数字 32
3.8.2 符号常量 33
3.8.1 字面常量 33
3.8 常量 33
3.9 枚举常量 34
3.11 问与答 36
3.10 小结 36
3.12.2 练习 37
3.12.1 测验 37
3.12 作业 37
4.1.2 语句块和复合语句 38
4.1.1 使用空白 38
第4章 创建表达式和语句 38
4.1 语句简介 38
4.2 表达式 39
4.3.2 数学运算符 40
4.3.1 赋值运算符 40
4.3 使用运算符 40
4.3.3 整数除法和求模 41
4.5 递增和递减 42
4.4 赋值运算符与数学运算符的组合 42
4.6 理解运算符优先级 44
4.8 真值的本质 45
4.7 括号的嵌套 45
4.9 if语句 46
4.9.2 else语句 49
4.9.1 缩进风格 49
4.9.3 高级if语句 51
4.10 在嵌套if语句中使用大括号 52
4.11.1 逻辑AND运算符 54
4.11 使用逻辑运算符 54
4.13 关系运算符的优先级 55
4.12 简化求值 55
4.11.2 逻辑OR运算符 55
4.11.3 逻辑NOT运算符 55
4.15 条件运算符(三目运算符) 56
4.14 再谈真和假 56
4.16 小结 57
4.18.1 测验 58
4.18 作业 58
4.17 问与答 58
4.18.2 练习 59
5.1 什么是函数 60
第5章 组织成函数 60
5.3 声明和定义函数 61
5.2 返回值、参数和实参 61
5.3.2 定义函数 62
5.3.1 函数原型 62
5.5.1 局部变量 64
5.5 确定变量的作用域 64
5.4 函数的执行 64
5.5.2 作用域为语句块的局部变量 65
5.6 参数是局部变量 66
5.6.1 全局变量 67
5.8 再谈函数实参 69
5.7 创建函数语句时的考虑因素 69
5.6.2 有关全局变量的注意事项 69
5.9 再谈返回值 70
5.10 默认参数 71
5.11 重载函数 73
5.12.1 内联函数 76
5.12 函数特有的主题 76
5.12.2 递归 77
5.13.2 划分RAM 81
5.13.1 抽象层次 81
5.13 函数的工作原理 81
5.15 问与答 83
5.14 小结 83
5.13.3 堆栈和函数 83
5.16.2 练习 84
5.16.1 测验 84
5.16 作业 84
6.2 创建新类型 86
6.1 C++是面向对象的吗 86
第6章 理解面向对象编程 86
6.3 类和成员简介 87
6.3.4 类与对象 88
6.3.3 定义对象 88
6.3.1 声明类 88
6.3.2 有关命名规则的说明 88
6.4.2 类不能有没有声明的功能 89
6.4.1 给对象而不是类赋值 89
6.4 访问类成员 89
6.5 私有和公有 90
6.6 实现类方法 94
6.7.2 使用默认构造函数 96
6.7.1 默认构造函数和析构函数 96
6.7 添加构造函数和析构函数 96
6.9 接口与实现 99
6.8 const成员函数 99
6.10 将类声明和方法定义放在什么地方 101
6.11 内联实现 102
6.12 将他类用作成员数据的类 104
6.13 结构 107
6.15 问与答 108
6.14 小结 108
6.16.2 练习 109
6.16.1 测验 109
6.16 作业 109
7.1.1 循环的鼻祖:goto 111
7.1 循环 111
第7章 再谈程序流程 111
7.2 使用while循环 112
7.1.2 为何避免使用goto语句 112
7.2.1 更复杂的while语句 113
7.2.2 continue和break简介 114
7.2.3 while(true)循环 116
7.3 实现do…while循环 117
7.4 使用do…while 118
7.5 for循环 120
7.5.1 高级for循环 122
7.5.3 循环嵌套 124
7.5.2 空for循环 124
7.6 循环小结 126
7.5.4 for循环中声明的变量的作用域 126
7.7 使用switch语句控制程序流程 128
使用switch语句来处理菜单 130
7.9 问与答 133
7.8 小结 133
7.10.2 练习 134
7.10.1 测验 134
7.10 作业 134
8.1.2 获取变量的内存地址 144
8.1.1 内存简介 144
第1周复习 144
第2周课程简介 144
第8章 理解指针 144
8.1 什么是指针 144
8.1.3 将变量的地址存储到指针中 145
8.1.5 获取指针指向的变量的值 146
8.1.4 指针名 146
8.1.7 指针、地址和变量 147
8.1.6 使用间接运算符解除引用 147
8.1.8 使用指针来操纵数据 148
8.1.9 查看地址 149
8.3 栈和自由存储区(堆) 151
8.2 为什么使用指针 151
8.3.2 使用关键字delete归还内存 152
8.3.1 使用关键字new来分配内存 152
8.5 在自由存储区上创建对象 154
8.4 再谈内存泄漏 154
8.6 删除自由存储区中的对象 155
8.7 访问数据成员 156
8.8 在自由存储区中创建成员数据 157
8.9 this指针 159
8.10 迷途指针 160
8.11.1 const指针和const成员函数 162
8.11 使用const指针 162
8.12 小结 164
8.11.2 使用const this指针 164
8.14.2 练习 165
8.14.1 测验 165
8.13 问与答 165
8.14 作业 165
9.1 什么是引用 167
第9章 使用引用 167
9.2 将地址运算符用于引用 168
9.3 引用对象 170
9.5 按引用传递函数参数 172
9.4 空指针和空引用 172
9.5.1 使用指针让swap()管用 173
9.5.2 使用引用来实现swap() 174
9.7 返回多个值 176
9.6 理解函数头和原型 176
9.8 按引用传递以提高效率 179
9.8.1 传递const指针 181
9.8.2 用引用代潜指针 183
9.9 何时使用引用和指针 185
9.11 返回指向不在作用域中的对象的引用 186
9.10 混合使用引用和指针 186
9.12 指针归谁所有 189
9.15.1 测验 190
9.15 作业 190
9.13 小结 190
9.14 问与答 190
9.15.2 练习 191
10.1 重载成员函数 192
第10章 有关函数的高级主题 192
10.2 使用默认值 194
10.5 重载构造函数 196
10.4 默认构造函数 196
10.3 在默认值和重载函数之间做出选择 196
10.6 初始化对象 198
10.7 复制构造函数 199
10.8 运算符重载 202
10.8.2 重载前缀运算符 203
10.8.1 编写一个递增函数 203
10.8.3 运算符重载函数的返回类型 205
10.8.4 返回无名临时对象 206
10.8.5 使用this指针 207
10.8.7 前缀和后缀之间的差别 209
10.8.6 重载后缀运算符 209
10.8.8 重载双目数学运算符 210
10.8.10 对运算符重载的限制 213
10.8.9 运算符重载中存在的问题 213
10.8.12 赋值运算符 214
10.8.11 重载什么 214
10.9 处理数据类型转换 216
10.10 转换运算符 218
10.11 小结 219
10.13.1 测验 220
10.13 作业 220
10.12 问与答 220
10.13.2 练习 221
11.2 软件设计:建模语言 222
11.1 建立模型 222
第11章 面向对象分析及设计 222
11.3.1 迭代式开发和瀑布式开发 223
11.3 软件设计:过程 223
11.3.2 迭代式开发过程 224
11.5.1 用例 225
11.5 第2步:分析阶段——收集需求 225
11.4 第1步:概念化阶段——从愿景开始 225
11.5.3 系统分析 232
11.5.2 应用分析 232
11.5.6 可交付品 233
11.5.5 可视化 233
11.5.4 规划文档 233
11.6.1 什么是类 234
11.6 第3步:设计阶段 234
11.6.3 其他转换 235
11.6.2 转换 235
11.6.4 建立静态模型 236
11.6.5 动态模型 241
11.7 第4~6步:实现、测试和交付 243
11.11 作业 244
11.10 问与答 244
11.8 迭代 244
11.9 小结 244
11.11.2 练习 245
11.11.1 测验 245
12.1.1 继承和派生 246
12.1 什么是继承 246
第12章 实现继承 246
12.1.3 派生的语法 247
12.1.2 动物世界 247
12.2 私有和保护 248
12.3 构造函数和析构函数的继承性 250
12.4 覆盖基类函数 256
12.4.1 隐藏基类方法 258
12.4.2 调用基类方法 259
12.5 虚方法 261
12.5.1 虚函数的工作原理 264
12.5.3 切除 265
12.5.2 通过基类指针访问派生类的方法 265
12.5.5 虚复制构造函数 267
12.5.4 创建虚析构函数 267
12.6 小结 270
12.5.6 使用虚方法的代价 270
12.8.2 练习 271
12.8.1 测验 271
12.7 问与答 271
12.8 作业 271
13.1.1 访问数组元素 273
13.1 什么是数组 273
第13章 管理数组和字符串 273
13.1.2 在数组末尾后写入数据 275
13.1.4 初始化数组 277
13.1.3 护栏柱错误 277
13.1.5 声明数组 278
13.2 使用对象数组 279
13.2.1 声明多维数组 280
13.2.2 初始化多维数组 281
13.3 指针数组 282
13.4 指针算术 284
13.5.1 数组指针和指针数组 286
13.5 在自由存储区声明数组 286
13.5.2 指针和数组名 287
13.5.4 在运行阶段调整数组大小 288
13.5.3 删除自由存储区中的数组 288
13.6 字符数组和字符串 291
13.7 使用方法strcpy()和strncpy() 292
13.8 String类 294
13.9 链表和其他结构 299
13.12 问与答 300
13.11 小结 300
13.10 创建数组类 300
13.13.2 练习 301
13.13.1 测验 301
13.13 作业 301
14.1 单继承存在的问题 302
第14章 多态 302
14.1.2 向下转换 304
14.1.1 提升 304
14.1.3 将对象添加到链表中 306
14.2 多重继承 307
14.2.2 多重继承对象中的构造函数 310
14.2.1 多重继承对象的组成部分 310
14.2.3 歧义解析 312
14.2.4 从共同基类继承 313
14.2.5 虚继承 316
14.2.6 多重继承存在的问题 319
14.3 抽象数据类型 320
14.2.7 混合(功能)类 320
14.3.1 纯虚函数 323
14.3.2 实现纯虚函数 324
14.3.3 复杂的抽象层次结构 327
14.3.4 哪些类是抽象的 330
14.5 问与答 331
14.4 小结 331
14.6.2 练习 332
14.6.1 测验 332
14.6 作业 332
15.1 在同一种类型的对象之间共享数据:静态成员数据 344
第15章 特殊类和函数 344
第2周复习 344
第3周课程简介 344
15.2 静态成员函数 348
15.3 函数指针 350
15.3.1 为什么使用函数指针 353
15.3.2 函数指针数组 356
15.3.3 将函数指针传递给其他函数 358
15.3.4 将typedef用于函数指针 360
15.4 成员函数指针 363
15.7.1 测验 367
15.7 作业 367
15.5 小结 367
15.6 问与答 367
15.7.2 练习 368
16.1 聚合 369
第16章 高级继承 369
16.1.2 控制对被聚合成员的访问 375
16.1.1 访问被聚合类的成员 375
16.1.3 聚合的代价 376
16.1.4 按值传递导致复制 378
16.2 以继承方式实现和聚合/代理 381
16.3 私有继承 390
16.4 添加友元类 398
16.6 友元函数和运算符重载 406
16.5 友元函数 406
16.7 重载插入运算符 410
16.9 问与答 414
16.8 小结 414
16.10.2 练习 415
16.10.1 测验 415
16.10 作业 415
17.1.1 数据流的封装 418
17.1 流概述 418
第17章 处理流 418
17.1.2 理解缓冲技术 419
17.3 标准I/O对象 420
17.2 流和缓冲区 420
17.5 使用cin进行输入 421
17.4 重定向标准流 421
17.5.1 输入字符串 422
17.5.2 字符串的问题 423
17.6.1 单字符输入 425
17.6 cin的其他成员函数 425
17.5.3 >>的返回值 425
17.6.2 从标准输入读取字符串 428
17.6.3 使用cin.ignore() 430
17.6.4 查看和插入字符:peek()和putback( ) 431
17.7.2 执行输出的函数 432
17.7.1 刷新输出 432
17.7 使用cout进行输出 432
17.7.3 控制符、标记和格式化指令 433
17.8 流和printf()函数之比较 437
17.10 使用ofstream 439
17.9 文件输入和输出 439
17.10.2 打开文件进行输入和输出 440
17.10.1 条件状态 440
17.10.3 修改ofstream打开文件时的默认行为 441
17.11 二进制文件和文本文件 443
17.12 命令行处理 445
17.15.1 测验 448
17.15 作业 448
17.13 小结 448
17.14 问与答 448
17.15.2 练习 449
18.2 根据名称解析函数和类 450
18.1 简介 450
第18章 创建和使用名称空间 450
18.2.1 变量的可见性 451
18.2.2 链接性 452
18.3 创建名称空间 453
18.2.3 静态全局变量 453
18.3.1 声明和定义类型 454
18.3.4 嵌套名称空间 455
18.3.3 添加新成员 455
18.3.2 在名称空间外定义函数 455
18.4 使用名称空间 456
18.5.1 using编译指令 457
18.5 关键字using 457
18.5.2 using声明 459
18.7 未命名的名称空间 460
18.6 名称空间别名 460
18.8 标准名称空间std 461
18.9 小结 462
18.11.1 测验 463
18.11 作业 463
18.10 问与答 463
18.11.2 练习 464
19.1 什么是模板 465
第19章 模板 465
19.2 创建模板定义 466
19.2.1 使用名称 467
19.2.2 实现模板 468
19.3 将实例化的模板对象传递给函数 471
19.4.1 非模板友元类和函数 472
19.4 模板和友元 472
19.4.2 通用模板友元类和函数 475
19.5 使用模板对象 479
19.5.1 使用具体化函数 483
19.5.2 静态成员和模板 488
19.6 标准模板库 491
19.6.2 理解顺序容器 492
19.6.1 使用容器 492
19.6.3 理解关联容器 499
19.6.4 使用算法类 502
19.9 作业 505
19.8 问与答 505
19.7 小结 505
19.9.2 练习 506
19.9.1 测验 506
20.1 程序中的各种错误 508
第20章 处理错误和异常 508
20.2 异常的基本思想 509
20.2.1 异常处理的组成部分 510
20.2.2 手工引发异常 512
20.2.3 创建异常类 513
20.3 使用try块和catch块 516
20.4 捕获异常的工作原理 517
20.4.1 使用多条catch语句 517
20.4.2 异常层次结构 520
20.5 异常中的数据及给异常对象命名 522
20.6 异常和模板 529
20.7 没有错误的异常 531
20.8 关于代码蜕变 532
20.9 bug和调试 532
20.9.1 断点 532
20.9.2 监视点 532
20.9.3 查看内存 532
20.9.4 查看汇编代码 532
20.11 问与答 533
20.12 作业 533
20.10 小结 533
20.12.1 测验 534
20.12.2 练习 534
21.1 预处理器和编译器 535
21.2 预处理器指令#define 535
第21章 杂项内容 535
21.2.2 将#define用于检测 536
21.2.3 预编译器命令#else 536
21.2.1 使用#define来定义常量 536
21.3 包含和多重包含防范 538
21.4 宏 538
21.5.1 字符串化 540
21.5.2 拼接 540
21.5 字符串操纵 540
21.6 预定义的宏 541
21.7 assert()宏 541
21.7.1 使用assert( )进行调试 542
21.7.2 assert()与异常之比较 542
21.7.3 副作用 543
21.7.4 类的不变量 543
21.7.5 打印中间值 548
21.7.6 宏与函数及模板之比较 549
21.8 内联函数 549
21.9 位运算 550
21.9.4 “求补”运算符 551
21.9.3 “异或”运算符 551
21.9.5 设置位 551
21.9.2 “或”运算符 551
21.9.1 “与”运算符 551
21.9.7 反转位 552
21.9.8 位字段 552
21.9.6 清除位 552
21.10.2 大括号 555
21.10.1 缩进 555
21.10.3 长代码行和函数长度 555
21.10 编程风格 555
21.10.5 程序文本 556
21.10.6 标识符命名 556
21.10.4 格式化switch语句 556
21.10.8 注释 557
21.10.9 设置访问权限 557
21.10.7 名称的拼写和大写 557
21.10.13 使用const 558
21.10.12 使用assert() 558
21.11 C++开发工作的下一步 558
21.11.1 从何处获得帮助和建议 558
21.10.11 包含文件 558
21.10.10 类定义 558
21.12 小结 559
21.11.3 保持联系 559
21.13 问与答 559
21.11.2 相关的C++主题:受控C++、C#和Microsoft的.NET 559
21.14 作业 560
21.14.1 测验 560
21.14.2 练习 561
附录A 二进制和十六进制 574
A.1 其他进制 574
第3周复习 574
A.2 不同进制之间的转换 575
A.2.1 二进制 575
A.2.4 什么是KB 576
A.2.3 位、字节和半字节 576
A.2.5 二进制数 576
A.2.2 为什么使用二进制 576
A.3 十六进制 577
附录B C++关键字 580
附录C 运算符优先级 581
第1章 582
第2章 582
附录D 答案 582
第3章 584
第4章 585
第5章 585
第6章 587
第7章 590
第8章 591
第9章 592
第10章 594
第11章 598
第12章 601
第13章 602
第14章 603
第15章 604
第16章 610
第17章 613
第18章 615
第19章 616
第20章 620
第21章 625
附录E 链表简介 627