目录 1
引言 1
0.1 本书对象 1
0.2 关于C++ 1
第1章 C++程序设计基础 1
1.1 使用Microsoft Windows 1
1.1.1 定义一个通用窗口 1
1.1.2 定义一个对话框 1
0.3 如何使用本书 2
0.4 想学C++必须编写C++程序 3
0.5 本书使用的一些约定 4
0.6 关于示范程序 4
1.2 安装Visual C++ 4
1.3.1 使用Visual工作平台 5
1.3 使用Visual C++ 5
1.3.2 Visual工作平台的工具栏(toolbar) 7
1.3.3 Visual工作平台的帮助系统 8
1.3.3.1 搜索一个帮助主题(topic) 9
1.3.3.2 复制WinHelp信息 9
1.3.4 退出Visual工作平台 9
1.4 Visual工作平台编辑器的用法 9
1.4.1 操纵编辑器 10
1.4.2 选择文本和实施块操作 11
1.4.3 打开已存在的文件 12
1.5 建立第一个C++程序 13
1.5.1 建立一个项目文件 14
1.5.2 编译用户程序 15
1.5.3 运行用户程序 16
1.5.4 QuickWin库 16
1.6 一个C++示范程序 17
1.6.1 cout和cin流 18
1.6.2 编译和运行用户程序 20
1.6.3 选择内存模式 21
1.6.4 编译、链接和语法方面的错误 22
1.7 C++程序的组成部分 23
1.7.1 注解 23
1.7.2 C++输入和输出 23
1.7.3 C++函数 23
1.7.4 变量 23
1.7.5 符号常量 24
1.7.6 表达式 26
1.7.7 语句 27
1.7.7.1 复合语句 28
1.7.7.2 for循环语句 28
1.7.8 函数 30
1.8 本章小结 31
1.9 复习题 32
1.10 练习题 33
第2章 C++的数据类型和表达式 34
2.1 标识符 34
2.2 基本数据类型 35
2.2.1 整型 35
2.2.2 长整数型 36
2.2.3 字符型 37
2.2.4 字符型变量的计算 38
2.2.5 浮点类型 39
2.2.5.1 浮点常量 39
2.2.5.2 各种类型占内存的比较 39
2.3 变量的作用域 40
2.4.1 使用const 44
2.4 定义符号常量 44
2.4.2 使用#define 45
2.5 表达式和C++操作符 47
2.5.1 算术操作符 47
2.5.2 赋值操作符 49
2.5.3 关系操作符(Relational Operators) 50
2.5.4 逻辑操作符(Logical Operators) 52
2.5.5 位操作符 52
2.5.5.1 使用<<和>>进行左移位和右移位 53
2.5.5.2 测试单独的位 54
2.5.5.3 设置位 55
2.5.5.4 异或操作符 55
2.5.6 其他的赋值操作符 56
2.5.6.1 条件表达式操作符 56
2.5.6.2 逗号操作符 57
2.6 操作符的优先级 58
2.7 类型转换 58
2.8 枚举类型和枚举常量 59
2.8.1 使用enum建立枚举类型 60
2.8.2 用枚举类型来说明标志变量 61
2.9 本章小结 62
2.10 复习题 63
2.11 练习题 65
第3章 C++高级数据类型 66
3.1 C++聚合数据类型 66
3.2 数组 66
3.2.1 说明数组 67
3.2.2 初始化数组 68
3.2.3 字符数组和字符串 68
3.2.4 使用数组 70
3.2.5 使用字符型数组的一个例子 71
3.2.6 多维数组 73
3.3 结构 77
3.3.1 在赋值语句中使用结构 79
3.3.2 结构的初始化 79
3.3.3 结构数组 80
3.3.4 结构中的结构 83
3.3.5 位域 84
3.4 typedef的用途 85
3.5 联合 86
3.6 对象简介 88
3.7 本章小结 93
3.8 复习题 94
3.9 练习题 95
4.1.1 if语句 96
第4章 选择语句和循环语句 96
4.1 判断和选择语句 96
4.1.2 if-else 语句 98
4.1.3 if-else if 语句 98
4.1.4 switch 语句 99
4.1.4.1 多个情形 101
4.1.5 break语句 101
4.2 循环语句 101
4.2.1 for循环语句 102
4.2.1.1 在for循环内定义控制变量 103
4.2.1.2 使用字符型循环控制变量 103
4.2.1.3 使用复杂的增量表达式 104
4.2.1.4 省略for循环语句的某个部分 104
4.2.1.5 使用for循环的两个例子 104
4.2.2 break语句作为循环出口 106
4.2.3 continue语句 107
4.2.4 while循环语句 108
4.2.5 do-while循环语句 110
4.3 优化循环 111
4.4 使用goto语句和语句标号 112
4.5 本章小结 113
4.6 复习题 115
4.7 练习题 115
第5章 指针 117
5.1 理解指针 117
5.2 使用指针 118
5.2.1 使用NULL指针 118
5.2.2 使用指针指向数组 118
5.2.3 对指针进行算术运算 119
5.2.4 捷径 120
5.2.5 使用指针来加速数组访问速度 121
5.2.6 指针的运算 122
5.2.7 把一个指针赋给另一个指针 122
5.3 动态内存分配 123
5.3.1 堆 123
5.3.2 操作符new 124
5.3.3 操作符delete 125
5.3.4 使用new和delete的例子 125
5.3.5 用new建立多维数组 127
5.3.6 内存耗尽 127
5.3.7 动态内存空间的初始化 127
5.3.8 指针问题 127
5.3.9.1 方法1:只使用指针 128
5.3.9.2 方法2:使用指针和位移量 128
5.3.9 指针和数组一起使用 128
5.3.9.3 方法3:使用指针作为数组 129
5.3.9.4 上述三种方法的小结 130
5.3.10 使用指针指向数组的程序 130
5.3.11 指针数组 131
5.4 指针和结构 135
5.4.1 把指针放在struct定义中 135
5.4.2 使用自访问结构 136
5.4.3 实现链表 140
5.5 Near,Far和Huge指针 144
5.6 本章小结 146
5.7 复习题 147
5.8 练习题 148
6.1 使用库函数 149
第6章 函数和宏 149
6.1.1 使用特殊的库函数 150
6.1.2 使用字符串函数 153
6.1.2.1 使用strcat() 154
6.1.2.2 使用strcmp() 154
6.1.2.3 使用strstr() 155
6.1.2.4 使用memset() 156
6.2 用户自定义函数 157
6.2.1 函数的结果类型 158
6.2.1.2 使用void返回类型 159
6.2.2 函数的参数 159
6.2.2.1 在参数中使用void 159
6.2.2.2 定义参数变量 159
6.2.2.3 使用传值参数 160
6.2.2.4 使用引用参数 161
6.2.2.5 建立参数的缺省值 161
6.2.2.6 参数类型检查 162
6.2.2.8 传值的过程 163
6.2.2.7 理解参数传递 163
6.2.2.9 传引用的过程 164
6.2.2.10 使用指针作参数变量 165
6.2.2.11 使用数组作为参数 167
6.2.2.12 对数组类型使用引用操作符 168
6.2.2.13 使用指针传递字符串 168
6.2.2.14 使用结构作为参数 168
6.2.2.15 传递结构数组 170
6.2.2.16 使用参数修饰符const 171
6.2.2.17 在参数说明中使用省略号 172
6.3 在函数内部定义变量 172
6.3.2 static变量 173
6.3.3 寄存器变量 173
6.3.1 auto变量 173
6.4 函数定义与函数实现相分离 174
6.5 为什么使用函数原型 175
6.6 一个完整的样本程序 176
6.7 重载函数 181
6.8 函数模板 182
6.9 类似函数的宏 183
6.9.1 #undef指令 186
6.9.2 使用宏的一些问题 186
6.10 本章小结 187
6.11 复习题 188
6.12 练习题 189
第7章 项目 190
7.1 把程序分解成多个源文件 190
7.1.1 分解用户程序 190
7.1.2 建立源程序模块 191
7.1.3 建立头文件 193
7.1.4 建立一个主文件 194
7.2 使用Visual工作平台建立项目 196
7.2.1 向项目加入文件 197
7.2.1.1 编辑项目生成文件中的文件 197
7.2.1.2 编辑项目生成文件 198
7.2.2 使用RebuildAll菜单选择项 198
7.2.3 使用Build菜单选择项 198
7.2.4 使用Compile菜单选择项 199
7.2.5 使用工具栏按钮 199
7.2.6 处理相关的一些问题 199
7.2.7 使用DOS命令行 199
7.3.1 定义标识符号 200
7.3.2 使用#ifdef和#ifndef 200
7.3 条件编译控制指令 200
7.3.3 使用条件编译避免符号多次说明 201
7.3.4 使用#if,#elif,#else和#endif 202
7.3.5 使用defined()操作符 203
7.4 变量的定义域 203
7.4.1 函数域 203
7.4.2 块域 204
7.4.3 文件域 204
7.4.4 函数原型域 204
7.5 通过源文件访问变量及函数 204
7.5.1 内部链接 205
7.5.2 外部链接 205
7.5.2.1 使用关键字extern 205
7.5.2.2 用static关键字来限制链接 206
7.6.2 80x86 CPU的寄存器 207
7.6.1 80x86内存结构 207
7.6 内存模式 207
7.6.2.1 内存寻址 208
7.6.2.2 near和far内存引用 209
7.6.3 选择内存模式 210
7.6.3.1 内存模式的限制 211
7.6.3.2 内存模式的选择 211
7.6.3.3 内存模式的未来 212
7.7 本章小结 212
7.8 复习题 213
7.9 练习题 213
第8章 类 215
8.1 使用struct实现对象 215
8.2 介绍C++的class关键字 218
8.3 外联和内联函数 220
8.4 构造函数 221
8.4.1 使用构造函数 222
8.4.2 具有多构造函数的类 222
8.4.3 拷贝构造函数 222
8.4.4 缺省构造函数 223
8.5 析构函数 223
8.6 对象指针 224
8.6.1 使用指针的第二个例子 226
8.6.2 释放对象指针 227
8.7 对象数组 227
8.8 对象作为函数的参数 228
8.9 类的静态数据成员 228
8.10 实现链表类 232
8.11 *this指针 233
8.12 友元 235
8.13 重载操作符函数 237
8.13.1 重载单目和双目操作符 243
8.13.2 用友元实现重载操作符 244
8.13.3 用重载操作符实现定点运算 245
8.14 本章小结 248
8.15 复习题 248
8.16 练习题 249
第9章 继承性 250
9.1 如何实现继承性 250
9.1.1 protected关键字 254
9.1.2 派生类和访问区分符 255
9.1.3 调用基类的构造函数 256
9.1.4 sprintf()函数 256
9.1.5 继承的成员数据 256
9.1.6 类和类型兼容性 260
9.2 如何实现多重继承性 261
9.3 本章小结 264
9.4 复习题 265
9.5 练习题 265
第10章 虚拟函数与多态性 266
10.1 Overridden函数的问题 266
10.2 为什么需要用虚拟函数 269
10.3 虚拟函数如何工作 272
10.4 选择静态的还是选择虚拟的 273
10.5 多态性 274
10.5.1 设计一个支持多态性的类 274
10.5.2 用虚拟函数实现多态性 278
10.5.3 在图形应用程序中使用多态性函数 284
10.5.4 用多态性函数实现一个列表框 284
10.5.6 从抽象类派生出一个子孙类 287
10.5.5 创建一个函数 287
10.6 对象库 288
10.7 设计面向对象的程序 289
10.8 本章小结 290
10.9 复习题 291
10.10 练习题 291
第11章 C++的输入和输出 292
11.1 屏幕输出 292
11.2 从键盘输入 293
11.2.1 文本和字符输入 294
11.2.1.1 get(char ) 294
11.2.1.2 get() 294
11.2.1.3 getline(char*buffer,int,char=′\n′) 294
11.2.1.4 eatwhite() 294
11.3.1.2 endl 295
11.3.1.1 dec 295
11.3.1.3 ends 295
11.3 格式化输出 295
11.3.1 使用操作器 295
11.2.1.5 ignore(int n=1,int delim=EOF) 295
11.3.1.4 flush 296
11.3.1.5 hex 296
11.3.1.6 oct 296
11.3.1.7 ws 296
11.3.1.8 setbase(int n) 296
11.3.1.9 setfill(int c) 296
11.3.1.10 setprecision(int n) 297
11.3.1.11 setw(int n) 297
11.3.2 设置流的格式化标志 297
11.3.2.1 setiosflags()和resetiosflags() 297
11.3.3.3 width(int)和width() 298
11.3.3.2 precision(int)和precision() 298
11.3.2.2 setf()和unsetf() 298
11.3.3.1 fill(char)和fill() 298
11.3.3 格式输出函数 298
11.4 处理流错误 299
11.4.1 检测流错误 299
11.4.2 测试文件结束状态 299
11.4.3 检测具体的错误状态 299
11.4.4 清除错误状态 300
11.5 用户自定义类的输入和输出 300
11.6 格式化字符串流 303
11.6.1 使用ostrstream 303
11.6.2 使用istrstream 305
11.7 磁盘文件的输入输出 306
11.7.1 向文件写文本输出 306
11.7.2 从文件中读文本输入 307
11.7.2.1 get()和put() 308
11.7.2.2 文件拷贝 310
11.7.3 使用二进制数据文件 311
11.7.4 随机访问数据文件 313
11.8 打印 315
11.9 本章小结 315
11.10 复习题 316
11.11 练习题 317
第12章 Visual C++程序的调试 318
12.1 程序中的三种错误 318
12.1.1 语法错误 318
12.1.2 运行错误 319
12.1.2.1 测试函数返回值 319
12.1.3 逻辑错误 320
12.1.2.2 异常处理 320
12.2 在交付用户之前查找错误 321
12.2.1 使用桌面检查和代码预审 322
12.2.2 使用代码复审 323
12.2.3 防止未来的问题 323
12.3 为调试程序做准备 325
12.3.1 使用DebugBuilds及ReleaseBuilds 325
12.3.2 创建DebugBuild 325
12.4 使用集成调试工具 326
12.4.1 控制程序执行 327
12.4.2 设置断点 327
12.4.3 检查和修改变量 327
12.4.3.1 用QuiCkWatch对话框查看变量 328
12.4.3.2 修改变量 328
12.4.4.2 设置调试工具选项 329
12.4.4.1 使用Call Stack对话框 329
12.4.4 调试工具的其他作用 329
12.5 使用调试窗口 331
12.5.1 Watch窗口 331
12.5.1.1 查看结构、类和表达式 331
12.5.1.2 使用Watch窗口修改数值 332
12.5.2 Local窗口 332
12.5.3 Registers窗口 333
12.5.4 输出窗口 333
12.6 本章小结 333
12.7 复习题 333
第13章 用QuickWin实现图形程序设计 335
13.1 使用Visual C++图形 335
13.2 使用QuickWin图形库 338
13.2.3.1 File菜单 339
13.2.3 QuickWin用户界面 339
13.2.2 QuickWin的视频硬件配置 339
13.2.1 QuickWin库的窗口 339
13.2.3.2 Edit菜单 340
13.2.3.3 View菜单 340
13.2.3.4 State菜单 340
13.2.3.5 Windows菜单 340
13.2.3.6 Help菜单 340
13.3 理解图形坐标系统 340
13.4 画圆 341
13.5 显示文本 342
13.6 选择字体和字符大小 342
13.7 发现图形错误 343
13.7.1 _grstatus()错误报告函数 343
13.8 使用视口 344
13.7.2 QuickWin错误报告 344
13.9 使用当前指示器(Current Pointer) 345
13.10 选择颜色 346
13.10.1 从调色板上选择颜色 347
13.10.1.1 _remappalette()函数 347
13.10.2 为对象选择填充颜色和填充图案 347
13.10.3 使用和填充多边形 352
13.11 用QuickWin应用程序画图表 353
13.12 本章小结 362
13.13 复习题 362
13.14 练习题 363
第14章 MFC通用类与集合类 364
14.1 MFC简介 364
14.2 使用MFC类库之前对QuickWin应用程序的准备 364
14.2.1 在QuickWin应用程序中包含头文件AFX.H 364
14.2.2 使用MFC库的QuickWin应用程序的项目选项 365
14.3 类CString 366
14.4 类CTime 367
14.5 类CFile 369
14.5.1 文本文件与二进制文件 370
14.5.2 使用类CStdioFile 371
14.6 集合类 372
14.6.1 理解集合类 372
14.6.2 了解有关集合类的知识 373
14.7 集合类的使用 374
14.8 数组集合类 374
14.8.1 把一个数据项插入数组集合 375
14.8.2 数组循环 375
14.9 链表集合类 375
14.9.1 向链表集合插入条目 375
14.9.4 查询链表 378
14.9.2 链表循环 378
14.9.3 删除链表 378
14.10 映射集合类 379
14.10.1 将关键字与映射集合中的值联系起来 380
14.10.2 查找映射的定义 380
14.11 本章小结 380
14.12 复习题 381
14.13 练习题 381
第15章 用Visual C++进行Windows程序设计…………………………………(382). 382
15.1 用AppWizard编写自己的第一个Windows程序 382
15.1.1 使用AppWizard 382
15.1.1.1 多文档界面 383
15.1.1.7 外部makefile 384
15.1.1.6 内存模式 384
15.1.1.5 上下文关联帮助 384
15.1.1.4 定制的VBX控制 384
15.1.1.2 初始化工具栏 384
15.1.1.3 打印及打印预审 384
15.1.1.8 产生源注释 385
15.1.1.9 OLE和ODBC 385
15.1.2 AppWizard定义的类 385
15.2 生成应用程序 386
15.3 运行应用程序 386
15.4 一个通用的MFC应用程序 386
15.4.1 WinMain()函数 387
15.4.2 应用程序窗口 387
15.5 FIRSTWIN——第一个应用程序 388
15.7 MFC文档/视图结构 391
15.7.1 建立主框架窗口 391
15.6 初始化步骤 391
15.7.2 显示主框架窗口 392
15.8 信息循环 392
15.9 处理命令信息 393
15.10 使用ClassWizard 394
15.10.1 用ClassWizard工具增加一个消息映射条目 395
15.10.2 用ClassWizard编辑消息映射函数 395
15.11 资源 395
15.12 MFC类层次 400
15.13 FIRSTWIN应用程序——第二部分 400
15.13.1 重温文档 400
15.13.2 重温MFC视图 403
15.14 本章小结 405
15.15 复习题 405
15.16 练习题 406