
本书由浅入深、循序渐进地从面向过程到面向对象逐步讲授如何使用C++开发系统。全书内容包括4大部分,第1部分是基本语法和概念,包括C++预备知识、Visual C++开发环境、基本数据类型、变量和常量、C++中的运算符、表达式和语句、指针的操作、复合数据类型、函数、输入输出等,还给出了面向过程的编程方法。第2部分是面向对象编程,包括封装、命名空间和作用域、继承和派生、多态、模板,以及面向对象的编程案例。第3部分是高级篇,包括string类、异常处理、内存管理、预处理、错处和调试。第4部分是应用篇,包括4种类型的案例,即用链表模拟堆栈和图的遍历(数据结构型)、用WinSocket编写客户机/服务器模式的系统和自定义协议及其实现的方法(网络型)、利用ODBC API函数实现电话簿和成绩管理(数据库型)、用文件流实现的特征码查毒方法及用堆栈链表实现的表达式求值(其他类型)。
本书适合广大C++语言爱好者和从业者,也适合大专院校学生阅读。该书既能满足初学者入门的需求,也能满足有一定经验的读者继续深入和提高。
前 言
C++是一门应用非常广泛的计算机程序设计语言。它既支持过程化程序设计,也支持面向对象程序设计。从操作系统、设备控制到数据库、网络、多媒体等众多的应用领域都能看到它的身影。C++语言是由C语言扩充而来。它是一门混合型的语言,既支持传统的结构化程序设计,又支持面向对象的程序设计,这使得C++非常流行。因此,它比C更适合人们的思考方式,并且比C要安全、可靠、有效。但是,它并不像Java那样全面实现类的使用,这使得它很灵活,能够适应多种场合的需要。
为了方便广大读者学习,我们花费了一年时间写了这本书。本书全面地介绍了C++知识,并以实例介绍了编写C++系统的方法。学完本书之后,读者将能够对C++编程有一个全面的认识,具备编写C++程序的能力。
本书的特点
1.提供多媒体语音视频讲解和交互式教学体验
作者为本书录制了几百分钟的多媒体语音视频进行讲解,同时还制作了交互式教学内容。读者可以在提示下进行各种C++实战入门操作,以更快地掌握C++。
2.提供完善的售后服务
本书提供学习论坛http://www.wanjuanchina.net,读者可以讨论技术,笔者会及时回答提问,并提供各种技术文章,帮助读者提高开发水平。本书还提供服务邮箱fwjccc@sina.com,读者购买书后向该邮箱发一封邮件,即可获取各种C++学习资料。
3.讲解深刻,内容全面
本书力求向读者传达更多的C++知识,对每个知识点都详细讲解,并给出相应的实例。从C++基础到高级知识,从结构化编程到面向对象编程,涵盖了C++的众多知识点。同时,也向读者传达了成为一个合格的程序员所必须具备的知识和技能。
4.实例众多,深入剖析
根据我们多年的经验,要想学好一门编程语言,重要的是要多看并分析代码,要多练并研究代码。只有先看懂了别人的代码,吸收别人的经验,自己才能写出优秀的代码。而多练则是掌握这些经验和知识点的必由之路。因此本书设计了众多的实例,其中包括小型例子284个,大中型例子26个。本书对每个实例都详细讲解,深入分析,让读者可以轻松阅读和掌握代码传达的知识点。
本书的内容
本书共分4篇,分别为面向过程的C++编程、面向对象的C++程序设计、高级篇和应 用篇。
第1篇(第1~11章):介绍了C++的结构化编程知识。前10章内容包括C++预备知识、数据类型、变量和常量、运算符、表达式、语句、指针、复合类型、函数、C++中的输入/输出等。第11章是对前10章知识点的综合运用与总结,用“图书管理系统”的案例讲解了结构化编程的方法。通过本篇的学习,读者将具备编写结构化编程的能力。
第2篇(第12~18章):介绍了C++面向对象编程的知识。前6章内容包括面向对象的思想、封装、命名空间和作用域、继承和派生、多态、模板等。第18章是对前6章内容的总结与运用,用“日期类”的案例综合演练了面向对象的编程方法。通过本篇的学习,读者将具备编写面向对象程序的能力。
第3篇(第19~23章):介绍了C++程序设计中的高级知识,内容包括string类、异常处理、内存管理、预处理,以及错误与调试等。通过本篇的学习,读者将掌握一些实用的编程技巧,这些内容对编写高效程序很有帮助。
第4篇(第24~25章):本篇是综合案例,分别举出了数据结构、网络等编程实例。通过对这些实例的学习,让读者有实践项目的体会,以达到实战的能力。
适合的读者
* C++入门读者
* C++从业人员
* 大中专院校学生
* 社会培训学生
* 毕业设计的学生
* 程序设计爱好者
本书作者及编委会成员
本书由秦广军主笔编写。其他参与编写和资料整理的人员有陈世琼、陈欣、陈智敏、董加强、范礼、郭秋滟、郝红英、蒋春蕾、黎华、刘建准、刘霄、刘亚军、刘仲义、柳刚、罗永峰、马奎林、马味、欧阳昉、蒲军、齐凤莲、王海涛、魏来科、伍生全、谢平、徐学英、杨艳、岳富军、张健和张娜等。在此一并表示感谢!
本书编委会成员有欧振旭、陈杰、陈冠军、顼宇峰、姚志娟、张帆、陈刚、程彩红、毛红娟、聂庆亮、王志娟、武文娟、颜盟盟、尹继平、张昆、张薛。
编者
??
??
??
??
前 言
前 言
·IV·
·III·
目 录
第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 major 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篇 高 级 篇
第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篇 应 用 篇
第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
??
??
??
??
目 录
目 录
·VIII·
·IX·