第1篇 面向过程的C++编程第1章 C++预备知识 2
1.1 概述 2
1.1.1 C++的发展史 2
1.1.2 为什么要选择C++ 2
1.1.3 对面向对象方法的支持 3
1.2 开发工具 3
1.2.1 常见的C++开发工具 3
1.2.2 Visual C++ 6.0开发环境简介 5
1.2.3 Visual C++ 6.0开发环境的使用 6
1.2.4 Visual C++ 6.0使用示例 9
1.3 程序结构 14
1.3.1 第一个程序 14
1.3.2 文件的组织 16
1.4 编码规范 16
1.4.1 风格指南 16
1.4.2 注释的使用 17
1.4.3 美化代码 18
1.5 标识符 19
1.5.1 保留字 19
1.5.2 标识符命名 19
1.6 上机实践 20
1.7 常见问题及解答 20
1.8 小结 21
1.9 习题 21
第2章 数据类型 22
2.1 数字运算型 22
2.1.1 整型 22
2.1.2 实型 23
2.1.3 浮点型 24
2.1.4 双精度型 25
2.2 逻辑运算型 25
2.2.1 与运算 25
2.2.2 或运算 26
2.2.3 非运算 26
2.2.4 逻辑运算的组合 27
2.3 字符型和字符串 27
2.3.1 字符 28
2.3.2 字符串 29
2.3.3 字符与字符串的差异 29
2.4 复合类型 30
2.5 本章实例 30
2.6 上机实践 31
2.7 常见问题及解答 32
2.8 小结 32
2.9 习题 32
第3章 变量和常量 33
3.1 变量 33
3.1.1 什么叫变量 33
3.1.2 种类 36
3.1.3 初始化 37
3.1.4 变量的命名规范 38
3.2 常量 39
3.2.1 什么叫常量 39
3.2.2 种类 39
3.2.3 常量使用的几点说明 41
3.2.4 初始化 42
3.2.5 常量的命名规范 42
3.3 本章实例 42
3.4 上机实践 45
3.5 常见问题与解答 45
3.6 小结 46
3.7 习题 46
第4章 运算符 47
4.1 算术运算符 47
4.2 逻辑运算符 50
4.3 关系运算符 51
4.4 位运算 53
4.5 赋值 57
4.6 运算符的优先级和结合性 58
4.6.1 优先级 58
4.6.2 结合性 61
4.7 本章实例 61
4.8 上机实践 63
4.9 常见问题及解答 64
4.10 小结 65
4.11 习题 65
第5章 表达式 66
5.1 定义和书写 66
5.1.1 表达式的分类 66
5.1.2 表达式的意义 67
5.1.3 表达式的书写 67
5.2 类型转换 68
5.2.1 隐式类型转换 68
5.2.2 显式类型转换 71
5.3 本章实例 74
5.4 上机实践 74
5.5 常见问题及解答 76
5.6 小结 76
5.7 习题 76
第6章 语句 78
6.1 简单语句和语句块 78
6.1.1 简单语句 78
6.1.2 语句块 79
6.2 程序的执行结构 81
6.3 选择型语句 81
6.3.1 if语句 82
6.3.2 switch语句 85
6.4 循环型语句 88
6.4.1 while语句 88
6.4.2 do...while语句 89
6.4.3 for语句 90
6.5 标签语句 92
6.5.1 普通标签语句 92
6.5.2 特殊标签语句 94
6.6 跳转语句 94
6.6.1 break语句 95
6.6.2 continue语句 95
6.6.3 goto语句 96
6.7 语句嵌套 97
6.7.1 自增 97
6.7.2 自减 98
6.7.3 逗号语句 98
6.7.4 ?语句 99
6.8 本章实例 100
6.9 上机实践 101
6.10 常见问题及解答 101
6.11 小结 102
6.12 习题 102
第7章 指针 104
7.1 地址是什么 104
7.2 指针的定义方式 105
7.2.1 指针的定义 105
7.2.2 指针的分析 106
7.2.3 sizeof运算符 106
7.3 指针的种类 108
7.4 初始化 109
7.4.1 用另一个指针的地址初始化 110
7.4.2 用某个变量的地址初始化 110
7.4.3 用new分配内存单元 111
7.4.4 用malloc分配内存单元 112
7.5 指针的运算 113
7.5.1 算术运算 113
7.5.2 关系运算 116
7.6 指针的指针 117
7.7 指针的使用 119
7.7.1 指针的赋值 119
7.7.2 操作符 120
7.8 引用与指针 121
7.9 特殊指针 123
7.9.1 void型指针 123
7.9.2 空指针 124
7.10 指针的命名规范 125
7.11 本章实例 126
7.12 上机实践 128
7.13 常见问题及解答 128
7.14 小结 129
7.15 习题 129
第8章 复合类型 131
8.1 定义数组 131
8.1.1 维数完整 131
8.1.2 维数不全 132
8.1.3 无维数 132
8.2 动态数组 132
8.2.1 在堆上分配空间的动态数组 133
8.2.2 在栈上分配空间的“伪动态”数组 134
8.3 存储 135
8.3.1 按列优先顺序(column maior order) 136
8.3.2 按行优先顺序(row major order) 136
8.4 字符数组 137
8.4.1 字符数组的定义和使用 137
8.4.2 字符数组和字符串间的区别 138
8.4.3 字符数组和字符串指针变量 138
8.5 初始化 139
8.5.1 数组在定义时的初始化 139
8.5.2 用赋值语句初始数组 140
8.6 指针与数组 141
8.6.1 指向数组的指针 141
8.6.2 指针数组 142
8.7 数组的使用 143
8.7.1 索引方式 143
8.7.2 指针方式 145
8.8 枚举 146
8.9 结构体 148
8.10 共用体 150
8.11 自定义型(typedef的使用) 152
8.11.1 typedef的作用 152
8.11.2 定义自己的类型 154
8.12 本章实例 156
8.13 上机实践 157
8.14 常见问题及解答 157
8.15 小结 158
8.16 习题 158
第9章 函数 160
9.1 函数的定义 160
9.1.1 函数的定义方式 160
9.1.2 函数定义的示例 162
9.2 函数的类型 165
9.2.1 根据函数的返回值类型来划分 165
9.2.2 根据作用域来划分 166
9.2.3 根据C++类的成员函数特性来划分 167
9.3 函数的参数 168
9.3.1 形参 169
9.3.2 实参 169
9.4 返回值与返回语句 171
9.4.1 返回值 171
9.4.2 返回语句 171
9.5 函数调用 172
9.5.1 单独调用 172
9.5.2 函数表达式调用 172
9.5.3 函数调用作为实参 173
9.5.4 参数传递方式 173
9.6 递归函数 174
9.7 指向函数的指针 176
9.8 函数作为参数 176
9.9 main()函数及命令行处理 178
9.10 函数的书写规范 180
9.11 本章实例 180
9.12 上机实践 181
9.13 常见问题及解答 182
9.14 小结 182
9.15 习题 182
第10章 C++中的输入/输出 184
10.1 iostream库 184
10.1.1 标准I/O 184
10.1.2 文件I/O 185
10.1.3 字符串I/O 186
10.2 输出 187
10.2.1 预定义类型的输出 187
10.2.2 自定义类型的输出 188
10.3 输入 189
10.3.1 预定义类型的输入 189
10.3.2 自定义类型的输入 190
10.4 输入/输出的格式化 191
10.4.1 使用ios类成员函数进行格式化 191
10.4.2 使用操纵函数进行格式化控制 194
10.5 文件 195
10.5.1 文件的打开与关闭 195
10.5.2 文件的顺序读写 197
10.5.3 文件的随机读写 198
10.6 本章实例 200
10.7 上机实践 202
10.8 常见问题及解答 202
10.9 小结 203
10.10 习题 203
第11章 面向过程的程序设计案例 204
11.1 问题定义 204
11.2 需求分析 205
11.3 总体设计 205
11.3.1 数据结构 205
11.3.2 图书基础数据维护 206
11.3.3 图书借阅 208
11.3.4 图书返还 209
11.3.5 会员基础数据维护 209
11.3.6 总体流程图 211
11.4 编码 212
11.4.1 主控文件bookmanager.cpp 212
11.4.2 菜单处理头文件mainfunction.h 212
11.4.3 数据结构头文件datainfo.h 213
11.4.4 功能函数头文件subfunction.h 213
11.4.5 菜单处理实现文件mainfunction.cpp 214
11.4.6 功能函数实现文件subfunction.cpp 217
11.5 小结 227
第2篇 面向对象的C++程序设计第12章 面向对象 230
12.1 概念 230
12.2 面向对象的程序设计 232
12.3 对象和类 232
12.4 面向对象的3大特点 233
12.4.1 封装 233
12.4.2 继承 234
12.4.3 多态 234
12.5 面向对象的软件开发 234
12.5.1 面向对象分析 235
12.5.2 面向对象设计 235
12.5.3 面向对象测试 236
12.5.4 面向对象维护 236
12.6 本章实例 236
12.7 常见问题及解答 238
12.8 小结 239
12.9 习题 239
第13章 封装 240
13.1 类 240
13.1.1 类的声明 240
13.1.2 类的属性 242
13.1.3 类的方法 243
13.1.4 构造函数 244
13.1.5 析构函数 247
13.1.6 静态成员 248
13.1.7 友元 249
13.1.8 修饰符 251
13.1.9 指向类成员的指针 252
13.1.10 嵌套类 253
13.1.11 类文件的组织 254
13.2 对象 256
13.2.1 对象的定义 256
13.2.2 对象的使用 257
13.2.3 this指针 259
13.3 本章实例 260
13.4 上机实践 261
13.5 常见问题及解答 262
13.6 小结 262
13.7 习题 262
第14章 命名空间和作用域 263
14.1 概述 263
14.2 命名空间的定义 263
14.3 如何使用命名空间 265
14.4 作用域 267
14.4.1 什么叫作用域 267
14.4.2 作用域的分类 268
14.5 本章实例 270
14.6 上机实践 276
14.7 常见问题及解答 277
14.8 小结 277
14.9 习题 277
第15章 继承和派生 278
15.1 继承和派生的关系 278
15.2 派生一个类 279
15.2.1 基类 279
15.2.2 派生 280
15.2.3 构造函数 282
15.2.4 析构函数 284
15.2.5 同名方法的使用 286
15.2.6 同名属性的使用 287
15.3 单重继承 288
15.4 多重继承 289
15.4.1 多重继承的目的 289
15.4.2 构造多重继承 289
15.4.3 析构函数和构造函数 290
15.4.4 多重继承的二义性 292
15.5 虚继承与虚基类 295
15.5.1 虚基类的作用 295
15.5.2 虚基类初始化 298
15.5.3 虚基类的继承 300
15.6 继承中的限制 300
15.7 本章实例 301
15.8 上机实践 304
15.9 常见问题及解答 305
15.10 小结 306
15.11 习题 306
第16章 多态 307
16.1 概念 307
16.2 宏多态 308
16.3 虚函数 309
16.3.1 虚函数的作用 309
16.3.2 静态绑定 311
16.3.3 动态绑定 312
16.3.4 纯虚函数 312
16.4 抽象类 313
16.4.1 什么是抽象类 313
16.4.2 抽象类的派生 314
16.5 运算符重载 315
16.5.1 为什么要重载运算符 315
16.5.2 重载的限制 316
16.5.3 重载一元运算符 317
16.5.4 重载二元运算符 317
16.6 函数重载 319
16.6.1 参数类型不同 319
16.6.2 参数个数不同 320
16.7 流的重载 321
16.7.1 流插入的重载 321
16.7.2 流提取的重载 322
16.8 覆盖 324
16.8.1 覆盖函数 324
16.8.2 覆盖变量 326
16.9 本章实例 327
16.10 上机实践 329
16.11 常见问题及解答 330
16.12 小结 330
16.13 习题 330
第17章 模板 332
17.1 模板的概念 332
17.2 类模板 333
17.2.1 类模板的定义 333
17.2.2 类模板的示例 334
17.2.3 类模板和模板类的区别 336
17.3 函数模板 337
17.3.1 函数模板的定义 337
17.3.2 函数模板的示例 337
17.3.3 函数模板与模板函数的区别 339
17.4 模板的实例化 339
17.5 模板的作用 340
17.6 基于模板的元编程简介 340
17.6.1 元编程的概念 341
17.6.2 基于模板的元编程 341
17.7 本章实例 342
17.8 上机实践 345
17.9 常见问题及解答 345
17.10 小结 346
17.11 习题 346
第18章 面向对象的程序设计案例 347
18.1 问题定义 347
18.2 需求分析 347
18.3 面向对象分析与设计 348
18.3.1 类结构的设计 348
18.3.2 类的可见性 348
18.3.3 类的结构图 349
18.4 编码和测试 350
18.4.1 预编译头文件Stdafx.h 350
18.4.2 CCNTime类的头文件Cntime.h 351
18.4.3 CCNTime类的实现文件Cntime.cpp 352
18.4.4 主文件main.cpp 359
18.5 小结 360
第3篇 高级篇 362
第19章 string类 362
19.1 定义 362
19.2 string类的方法 364
19.3 string类的运算 366
19.3.1 字符串查找 367
19.3.2 字符串替换 369
19.3.3 取子字符串 370
19.3.4 字符串比较 370
19.3.5 字符串连接 371
19.3.6 字符串插入 371
19.3.7 获取字符串大小和容量 371
19.4 本章实例 372
19.5 上机实践 375
19.6 常见问题及解答 376
19.7 小结 376
19.8 习题 376
第20章 异常处理 377
20.1 异常处理的机制 377
20.2 异常的抛出 377
20.3 异常的捕获 379
20.4 异常处理的规格 381
20.5 常见的标准异常 382
20.6 本章实例 382
20.7 上机实践 384
20.8 常见问题及解答 385
20.9 小结 386
20.10 习题 386
第21章 内存管理 387
21.1 内存的分类 387
21.2 栈内存管理 388
21.2.1 申请栈内存 388
21.2.2 使用栈内存 389
21.2.3 释放栈内存 391
21.2.4 改变大小 391
21.3 堆内存管理 392
21.3.1 申请堆内存 392
21.3.2 使用堆内存 393
21.3.3 释放堆内存 394
21.3.4 改变大小 395
21.4 本章实例 396
21.5 上机实践 397
21.6 常见问题及解答 397
21.7 小结 398
21.8 习题 398
第22章 预处理 400
22.1 什么叫预处理 400
22.2 常见的预处理 400
22.2.1 文件包含 401
22.2.2 布局控制 401
22.2.3 宏替换 405
22.2.4 条件编译 406
22.3 其他预处理指令 407
22.4 本章实例 408
22.5 上机实践 410
22.6 常见问题及解答 411
22.7 小结 411
22.8 习题 412
第23章 错误与调试 413
23.1 错误的定义 413
23.2 错误的处理 413
23.2.1 语法错误 414
23.2.2 链接错误 415
23.2.3 运行时错误 416
23.3 错误的排查 417
23.3.1 错误信息的理解 417
23.3.2 错误发现的方法 417
23.3.3 调试的原则 418
23.4 常见bug的分类 419
23.5 调试的技巧 419
23.5.1 断言assert 420
23.5.2 verify 420
23.5.3 assert与Verify的差异 421
23.5.4 轨迹跟踪 421
23.5.5 断点 423
23.6 Visual C++编程环境中的交互式调试 423
23.6.1 设置和删除断点 423
23.6.2 Debug窗口 424
23.6.3 Watch面板 425
23.6.4 调试的步进方式 425
23.7 本章实例 426
23.8 上机实践 427
23.9 常见问题及解答 428
23.10 小结 428
23.11 习题 428
第4篇 应用篇 432
第24章 数据结构案例 432
24.1 案例1——用链表模拟堆栈 432
24.1.1 链栈类的定义文件LinkStack.h 432
24.1.2 链栈类的实现文件LinkStack.cpp 433
24.1.3 链栈类的使用文件example.cpp 435
24.2 案例2——图的遍历 436
24.2.1 图的存储及遍历 437
24.2.2 图遍历的代码 437
24.3 小结 441
第25章 网络应用案例 442
25.1 案例1——客户机/服务器案例 442
25.1.1 Winsocket 2常用函数 442
25.1.2 服务器/客户机编程模式 445
25.1.3 服务器和客户端公用文件 446
25.1.4 服务器端实现 449
25.1.5 客户端实现 450
25.2 案例2——自定义协议 451
25.2.1 自定义协议 452
25.2.2 自定义协议的实现 453
25.3 小结 456