第一章 Microsoft Visual C++集成环境 1
1.1 Microsoft Visual C++简介 1
目录 1
1.2 Microsoft Visual C++安装指南 5
1.3 如何构造DOS MFC库文件 8
1.4.1 Visual Workbench简介 9
1.4 如何使用Visual Workbench 9
1.5 Visual Workbench的帮助系统 10
1.4.2 Visual Workbench命令行参数简介 10
1.6 使用Visual Workbench的菜单系统 12
1.6.1 用鼠标进行菜单选择 13
1.6.2 使用键盘进行菜单选择 14
1.7 如何编辑一个程序 17
1.8 如何编译、链接和运行一个程序 19
1.9 Visual C++的浏览功能 20
1.10 如何设置工程文件选项 21
1.11 Visual C++的调试功能 22
1.12 如何使用CL 23
1.13 如何用CL进行编译和链接 24
1.15 CL选项简介 25
1.14 如何使用CL环境变量 25
1.17 小结 31
1.16 一个Visual Workbench实例 31
2.1 LINK链接器 33
第二章 Visual C++程序开发工具概述 33
2.1.2 LINK的文件名选项 34
2.1.1 如何使用LINK 34
2.1.3 覆盖技术 35
2.2 LINK选项 37
2.3.1 如何使用LIB 39
2.3 库文件管理程序LIB 39
2.3.2 LIB选项及命令的用法 40
2.4.1 建立MAKE文件 41
2.4 程序维护实用程序NMAKE 41
2.4.2 运行NMAKE 44
2.5.1 如何使用CodeView 45
2.5 CodeView调试程序 45
2.5.3 程序调试的方法 46
2.5.2 如何启动CodeView 46
2.6 小结 52
3.1 C程序的结构 54
第三章 ANSI标准C简介 54
3.3 ANSI C预处理器伪指令 57
3.2 ANSI C转义序列和trigraph 57
3.3.2 定义宏 58
3.3.1 包含文件 58
3.3.4 其他伪指令 60
3.3.3 条件编译伪指令 60
3.4.1 基本变量类型 61
3.4 变量的声明和定义 61
3.5 结构、联合及位字段 62
3.4.2 枚举类型 62
3.5.1 数组 63
3.5.3 类型的定义 64
3.5.2 指针 64
3.6 表达式 65
3.5.4 类型修饰符const和volatile 65
3.6.1 操作符的优先级 67
3.7.1 break语句 68
3.7 语句 68
3.7.6 do语句 69
3.7.5 default标记 69
3.7.2 case语句 69
3.7.3 复合语句或块 69
3.7.4 continue语句 69
3.7.10 if语句 70
3.7.9 goto语句 70
3.7.7 表达式语句 70
3.7.8 for语句 70
3.7.14 switch语句 71
3.7.13 return语句 71
3.7.11 if-else语句 71
3.7.12 null语句 71
3.8.1 函数原型 72
3.8 函数 72
3.7.15 while语句 72
3.8.3 带有可变个数参数的函数 73
3.8.2 void类型 73
3.10 小结 74
3.9 ANSI C库 74
4.1 Visual C++特有的关键字 75
第四章 Visual C++对标准C的扩展 75
4.1.1 支持内存模式的关键字 76
4.2 内存模式的定制 77
4.2.1 其他特殊的关键字 79
4.3 全局变量及预处理器宏 80
4.4 预编译指令 83
4.5 基本数据类型的大小和容量 84
4.6 小结 85
5.1 什么是面向对象的程序设计 86
第五章 面向对象程序设计基础 86
5.1.1 面向过程的程序设计 87
5.2.1 数据抽象 93
5.2 面向对象程序设计技术术语 93
5.2.3 多态性 94
5.2.2 继承 94
5.3.1 在C语言中定义对象 95
5.3 C语言中的面向对象程序设计 95
5.3.2 实现几何形状 97
5.3.3 使用图形 103
5.3.4 增加一个新图形对象 104
5.4 小结 107
5.3.5 用C语言实现OOP的问题 107
6.1 C++与面向对象的程序设计 109
第六章 C++和面向对象的程序设计 109
6.1.1 C++中的数据抽象 110
6.1.2 C++类的继承 113
6.1.3 多态和动态链接 114
6.2.1 图形类 115
6.2 用C++设计几何图形 115
6.2.2 添加新的图形类 118
6.3 小结 120
6.2.3 运行时创建对象 120
7.1.1 C++函数的新特性 121
7.1 C++的特性 121
第七章 C++与ANSI标准C的区别 121
7.1.2 C++和C的区别 127
7.2 小结 130
8.2 C++中的流I/O 131
8.1 C++中的I/O库 131
第八章 用于标准I/O的C++类 131
8.2.1 使用iostream 132
8.2.2 使用操作符 133
8.2.3 使用操作符完成格式化I/O 134
8.2.5 重载<< 136
8.2.4 控制浮点格式 136
8.2.6 iostream类的层次 137
8.3 文件I/O 138
8.3.1 简单文件I/O 139
8.3.2 文件定位 141
8.4.1 向一个串写入 143
8.4 字符串I/O 143
8.4.2 从一个串读取 144
8.5 小结 145
9.1.1 用户定义的数据结构 146
9.1 对象与类 146
第九章 创建类的对象 146
9.1.2 对类成员的访问控制 147
9.1.3 public函数如何返回private值 148
9.1.4 成员函数 149
9.2.1 头文件描述界面 150
9.2 类的实现 150
9.2.2 从界面分离操作 152
9.3 类的使用 153
9.3.1 动态创建对象 154
9.3.2 在自由存储区中分配对象数组 155
9.3.4 使用static成员变量 156
9.3.3 调用成员函数 156
9.3.5 初始化static成员变量 159
9.3.6 使用静态成员函数 160
9.3.7 使用指向类成员的指针 161
9.4 小结 163
10.1.1 理解指针和引用 164
10.1 参数和返回值 164
第十章 定义对象的操作 164
10.1.2 值传递与引用传递的比较 165
10.1.3 返回一个引用 166
10.2 对象的创建和释放 167
10.1.4 使用引用的准则 167
10.2.1 类String的构造函数和析构函数 168
10.2.2 缺省构造函数 169
10.2.3 拷贝构造函数 170
10.2.4 提供一个拷贝构造函数的时机 172
10.2.5 成员初始化表 173
10.2.6 利用构造函数和析构函数的副作用 175
10.3 定义函数和操作符 176
10.3.2 操作符作为函数 177
10.3.1 指针this 177
10.3.3 为类String定义operator+ 180
10.3.5 访问并改变串中的某个字符 181
10.3.4 验证串是否相等 181
10.3.7 为类String定义赋值操作符 182
10.3.6 定义类型转换操作符 182
10.3.9 装载输入和输出操作符 183
10.3.8 为什么operator=返回一个引用 183
10.3.10 装载操作符new和delete 184
10.3.12 把文件当作数组来使用 186
10.3.11 使用friend类 186
10.4 小结 189
11.1.2 继承和类扩展 190
11.1.1 继承和“is a”关系 190
第十一章 在C++中使用继承 190
11.1 派生类 190
11.1.3 派生类的语法 191
11.1.4 访问基类 192
11.1.5 使用继承来建造子串类 193
11.1.6 派生类的其他情况 200
11.1.7 多重继承 201
11.1.9 虚拟基类 202
11.1.8 iostream与多重继承 202
11.2 使用继承 204
11.2.1 链表 205
11.2.2 single_link类 206
11.2.3 双向链表 213
11.2.4 String对象的队列 217
11.3 小结 219
12.1.1 静态链接 221
12.1 动态链接 221
第十二章 虚拟函数和多态性 221
12.1.2 通过指针调用函数 222
12.2.1 纯虚拟函数 223
12.2 虚拟函数 223
12.2.3 通过虚拟函数的动态链接 224
12.2.2 虚拟函数的具体实现 224
12.2.4 使用多态 226
12.2.5 隐含的类的多态用法 227
12.3 小结 229
13.1 函数和类模板 231
第十三章 C++的高级技术 231
13.1.2 类模板 232
13.1.1 整型和浮点型的栈 232
13.1.4 成员函数模板 233
13.1.3 函数模板 233
13.2.1 异常处理的优点 234
13.2 异常处理 234
13.1.5 模板的优越性 234
13.2.2 setjmp和longjmp的问题 235
13.2.3 C++建议的异常处理原理 236
13.3 小结 238
14.1.1 路径名 239
14.1 MS-DOS文件系统 239
第十四章 文件和目录管理函数 239
14.1.3 文件属性 240
14.1.2 作为文件的设备 240
14.2 基本文件和目录管理任务 241
14.1.4 文件句柄 241
14.2.1 改变驱动器和目录 242
14.2.2 改变文件属性 244
14.3.1 _access 245
14.3 函数参考 245
14.3.2 _chdir 246
14.3.4 _chmod 247
14.3.3 _chdirve 247
14.3.6 _filelength 248
14.3.5 _chsize 248
14.3.7 _fstat 249
14.3.9 _getcwd 250
14.3.8 _fullpath 250
14.3.11 _getdrive 251
14.3.10 _getdcwd 251
1 4.3.13 _locking 252
14.3.12 _isatty 252
1 4.3.14 _makepath 253
1 4.3.16 _mktemp 254
1 4.3.15 _mkdir 254
1 4.3.18 rename 255
1 4.3.17 remove 255
14.3.19 _rmdir 256
14.3.20 _searchenv 256
14.3.22 _splitpath 257
14.3.21 _setmode 257
14.3.24 _umask 258
14.3.23 _stat 258
14.3.25 _unlink 259
15.1.1 I/O缓冲 260
15.1 流 260
第十五章 流I/O函数 260
15.1.4 文件的当前位置 261
15.1.3 I/O的格式化和非格式化 261
15.1.2 FILE类型 261
15.2 基本流I/O任务 262
15.1.6 字符串输入/输出 262
15.1.5 预定义流 262
15.2.1 给文件添加行号 264
15.2.2 简单的通信录 266
15.2.3 显示错误信息的简单方法 272
15.3.2 fclose 273
15.3.1 clearerr 273
15.3 函数参考 273
15.3.4 _fdopen 274
15.3.3 _fcloseall 274
15.3.5 feof 275
15.3.7 fflush 276
15.3.6 ferror 276
15.3.9 _fgetchar 277
15.3.8 fgetc 277
15.3.11 fgets 278
15.3.10 fgetpos 278
15.3.12 _fileno 279
15.3.14 fopen 280
15.3.13 _flushall 280
15.3.16 fputc 281
15.3.15 fprintf 281
15.3.18 fputs 282
15.3.17 _fputchar 282
15.3.20 freopen 283
15.3.19 fread 283
15.3.21 fscanf 284
15.3.23 fsetpos 285
15.3.22 fseek 285
15.3.24 _fsopen 286
15.3.26 fwrite 287
15.3.25 ftell 287
15.3.28 getchar 288
15.3.27 getc 288
15.3.30 _getw 289
15.3.29 gets 289
15.3.32 printf 290
15.3.31 perror 290
15.3.33 putc 292
15.3.35 puts 293
15.3.34 putchar 293
15.3.38 _imtmp 294
15.3.37 rewind 294
15.3.36 _putw 294
15.3.39 scanf 295
15.3.41 setvbuf 297
15.3.40 setbuf 297
15.3.43 sprintf 298
15.3.42 _snprintf 298
15.3.44 sscanf 299
15.3.46 tmpfile 300
15.3.45 _tempnam 300
15.3.48 ungetc 301
15.3.47 tmpnam 301
15.3.49 vfprintf 302
1 5.3.51 _vsnprintf 303
15.3.50 vprintf 303
15.3.52 vsprintf 304
16.1.2 通过操作系统完成缓冲 305
16.1.1 文本和二进制模式 305
第十六章 低级I/O函数 305
16.1 低级I/O函数基础 305
16.2 基本的低级I/O任务 306
16.1.4 最大文件句柄数 306
16.1.3 文件句柄 306
16.2.1 拷贝文件 307
16.2.2 用_dup和_dup2重定向stdout 309
16.3.2 _commit 311
16.3.1 _close 311
16.3 函数参考 311
16.3.4 _dup 312
16.3.3 _creat 312
16.3.6 _eof 313
16.3.5 _dup2 313
16.3.7 _lseek 314
16.3.8 _open 315
16.3.10 _sopen 316
16.3.9 _read 316
16.3.11 _tell 317
16.3.12 _write 318
17.1.1 控制台和端口I/O的任务 319
17.1 控制台和端口I/O基础 319
第十七章 控制台和端口I/O函数 319
17.1.2 用_inp和_outp产生声音 320
17.2.2 _cprintf 322
17.2.1 _cgets 322
17.2 函数参考 322
17.2.4 _cscanf 323
17.2.3 _cputs 323
17.2.6 _getche 324
17.2.5 _getch 324
17.2.8 _inpw 325
17.2.7 _inp 325
17.2.10 _outp 326
17.2.9 _kbhit 326
17.2.12 _putch 327
17. 2.11 _outpw 327
17.2.13 _ungetch 328
18.1.1 字符分类 329
18.1 字符和数据转换基础 329
第十八章 字符和数据转换函数 329
18.2 字符和数据转换任务 330
18.1.2 转换数据 330
18.2.1 将文本字符串转换为小写 332
18.2.2 一个简单的计算器 333
18.3.2 atoi,atol 334
18.3.1 atof 334
18.3 函数参考 334
18.3.4 _ecvt,_fcvt 335
18.3.3 _atold 335
18.3.5 _gcvt 336
18.3.8 __isascii 337
18.3.7 isalpha 337
18.3.6 isalnum 337
18.3.11 _itoa,_ltoa 339
18.3.10 __iscsym,__iscsymf 339
18.3.9 iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,isupper,isxdigit 339
18.3.13 strtol 340
18.3.12 strtod 340
18.3.14 _strtold 341
18.3.16 __toascii 342
18.3.15 strtoul 342
18.3.18 _toupper,toupper 343
18.3.17 _tolower,tolower 343
18.3.19 _ultoa 344
19.1.3 多字节和宽位字符串 345
19.1.2 字典顺序 345
第十九章 串和缓冲区处理函数 345
19.1 C中的串和缓冲区 345
19.1.1 声明串和缓冲区 345
19.2 基本的串和缓冲区处理任务 346
19.1.4 远程缓冲区和串 346
19.2.1 拷贝视频内存 349
19.2.2 分析文本行 350
19.3.1 fmblen,_fmblen 351
19.3 函数参考 351
19.3.2 mbstowcs,_fmbstowcs 352
19.3.4 _memccpy,_fmemccpy 353
19.3.3 mbtowc,_fmbtowc 353
19.3.6 memcmp,_fmemcmp 354
19.3.5 memchr,_fmemchr 354
19.3.7 memcpy,_fmemcpy 355
19.3.9 memmove,_fmemmove 356
19.3.8 _memicmp,_fmemicmp 356
19.3.10 memset,_fmemset 357
19.3.12 strcat,_fstrcat 358
19.3.11 _movedata 358
19.3.14 strcmp,_fstrcmp 359
19.3.13 strchr,_fstrchr 359
19.3.15 _strcmpi 360
19.3.17 strcpy,_fstrcpy 361
19.3.16 strcoll 361
19.3.19 _strdup,_fstrdup,_nstrdup 362
19.3.18 strcspn,_fstrcspn 362
19.3.20 _strerror 363
19.3.22 _stricnp,_fstricmp 364
19.3.21 strerror 364
19.3.24 _strlwr,_fstrlwr 365
19.3.23 strlen,_fstrlen 365
19.3.26 strncmp,_fstrncmp 366
19.3.25 strncat,_fstrncat 366
19.3.27 strncpy,_fstrncpy 367
19.3.29 _strnset,_fstrnset 368
19.3.28 _strnicmp,_fstrnicmp 368
19.3.30 strpbrk,_fstrpbrk 369
19.3.32 _strrev,_fstrrev 370
19.3.31 strrchr,_fstrrchr 370
19.3.34 strspn,_fstrspn 371
19.3.33 _strset,_fstrset 371
19.3.36 strtok,_fstrtok 372
19.3.35 strstr,_fstrstr 372
19.3.37 _strupr,_fstrupr 373
19.3.39 _swab 374
19.3.38 strxfrm 374
19.3.41 wctomb,_fwctomb 375
19.3.40 wcstombs,_fwcstombs 375
20.1.1 查找环境变量 377
20.1 查找和排序的基本任务 377
第二十章 查找和排序函数 377
20.2.1 bsearch 379
20.2 函数参考 379
20.2.2 _lfind,_lsearch 380
20.2.3 qsort 381
21.1.2 时间转换 382
21.1.1 当地时间、GMT和UCT 382
第二十一章 日期和时间管理函数 382
21.1 时间格式 382
21.2 基本的日期和时间管理任务 383
21.2.2 打印某个月的日历 384
21.2.1 获取并打印当前的日期和时间 384
21.3.1 asctime 388
21.3 函数参考 388
21.3.2 clock 389
21.3.4 difftime 390
21.3.3 ctime 390
21.3.6 gmtime,localtime 391
21.3.5 _ftime 391
21.3.7 mktime 392
21.3.9 strftime 393
21.3.8 _strdate 393
21.3.10 _strtime 394
21.3.12 _tzset 395
21.3.11 time 395
21.3.13 _utime 396
22.1.2 浮点变量的类型 398
22.1.1 浮点数的存储格式 398
第二十二章 数学函数 398
22.1 浮点数概述 398
22.2 数学函数的类型 399
22.1.4 数学函数的错误处理 399
22.1.3 浮点库 399
22.2.1 计算债款 402
22.2.2 计算正弦和余弦 403
22.3.2 acos,acos1 404
22.3.1 abs 404
22.3 函数参考 404
22.3.4 atan,atan1 405
22.3.3 asin,asin1 405
22.3.6 贝塞耳函数 406
22.3.5 atan2,atan21 406
22.3.7 _cabs,_cabs1 407
22.3.9 _clear87,_control87 408
22.3.8 ceil,ceil1 408
22.3.10 cos,cos1 409
22.3.12 _dieeetomsbin,_dmsbintoieee 410
22.3.11 cosh,cosh1 410
22.3.14 exp,exp1 411
22.3.13 div 411
22.3.16 _fieeetomsbin,_fmsbintoieee 412
22.3.15 fabs,fabs1 412
22.3.17 floor,floor1 413
22.3.19 _fpreset 414
22.3.18 fmod fmod1 414
22.3.21 _hypot,_hypot1 415
22.3.20 frexp,frexp1 415
22.3.23 ldexp,ldexp1 416
22.3.22 labs 416
22.3.25 log,log10,log1,log101 417
22.3.24 ldiv 417
22.3.27 _matherr,_matherr1 418
22.3.26 _lrot1,lrotr 418
22.3.29 modf,modf1 419
22.3.28 __max,__min 419
22.3.31 rand 420
22.3.30 pow,pow1 420
22.3.33 sin,sin1 421
22.3.32 _rotl,_rotr 421
22.3.35 sqrt,sqrt1 422
22.3.34 sinh,sinh1 422
22.3.37 _status87 423
22.3.36 srand 423
22.3.39 tanh,tanh1 424
22.3.38 tan,tan1 424
23.1.2 信号 426
23.1.1 环境 426
第二十三章 进程控制函数 426
23.1 进程管理 426
23.2 进程控制的基本任务 427
23.1.4 现场 427
23.1.3 可变长度的参数表 427
23.2.1 一个小型shell程序 429
23.3.2 assert 433
23.3.1 abort 433
23.3 函数参考 433
23.3.4 _cexit,_c_exit 434
23.3.3 atexit,_fatexit 434
23.3.5 _execl,_execle,_execlp,_execlpe,_execv,_execve,_execvp,_execvpe 435
23.3.6 exit 436
23.3.8 getenv 437
23.3.7 _exit 437
23.3.10 localeconv 438
23.3.9 _getpid 438
23.3.12 _onexit,_fonexit 439
23.3.11 longjmp 439
23.3.13 _putenv 440
23.3.15 setjmp 441
23.3.14 raise 441
23.3.17 signal 442
23.3.16 setlocale 442
23.3.18 spawnl,_spawnle,_spawnlp,_spawnlpe,_spawnv, _spawnve,_spawnvp,_spawnvpe 443
23.3.20 va_arg,va_end,va_start(ANSI 版本) 445
23.3.19 system 445
23.3.21 va_arg,va_end,va_start(UNIX 版本) 446
24.1.2 内存模式 448
24.1.1 分段内存寻址 448
第二十四章 内存管理函数 448
24.1 内存管理基础 448
24.1.5 堆 449
24.1.4 __near,__far和__huge关键字 449
24.1.3 near,far和huge指针 449
24.1.6 基堆 450
24.2 基本内存管理任务 451
24.1.7 虚拟内存 451
24.2.1 分配内存并检查堆 453
24.3.2 _bfreeseg 456
24.3.1 _alloca 456
24.3 函数参考 456
24.3.4 calloc,_bcalloc,_fcalloc,_halloc,_ncalloc 457
24.3.3 _bheapseg 457
24.3.5 _expand,_bexpand,_fexpand,_nexpand 458
24.3.6 free,_bfree,_ffree,_hfree,_nfree 459
24.3.8 _heapadd,_bheapadd 460
24.3.7 _freect 460
24.3.9 _heapchk,_bheapchk,_fheapchk,_nheapchk 461
24.3.11 _heapset,_bheapset,_fheapset,_nheapset 462
24.3.10 _heapmin,_bheapmin,_fheapmin,_nheapmin 462
24.3.12 _heapwalk,_bheapwalk,_fheapwalk,_nheapwalk 463
24.3.13 malloc,_bmalloc,_fmalloc,_nmalloc 464
24.3.14 _memavl 465
24.3.16 _msize,_bmsize,_fmsize,_nmsize 466
24.3.15 _memmax 466
24.3.18 _stackavail 467
24.3.17 realloc,_brealloc,_frealloc,_nrealloc 467
24.3.20 _vheapinit 468
24.3.19 _vfree 468
24.3.21 _vheapterm 469
24.3.23 _vlock 470
24.3.22 _vload 470
24.3.24 _vlockcnt 471
24.3.26 _vmsize 472
24.3.25 _vmalloc 472
24.3.27 _vrealloc 473
24.3.28 _vunlock 474
25.1.1 BIOS服务 475
25.1访问 BIOS和DOS服务 475
第二十五章 DOS和BIOS调用函数 475
25.1.2 MS-DOS功能 476
25.2 基本DOS和BIOS任务 477
25.2.1 目录清单 478
25.2.2 观察磁盘物理扇区 479
25.3.2 _bios_disk 483
25.3.1 _bdos 483
25.3 函数参考 483
25.3.3 _bios_equiplist 486
25.3.4 _bios_keybrd 487
25.3.6 _bios_printer 488
25.3.5 _bios_memsize 488
25.3.7 _bios_serialcom 489
25.3.8 _bios_timeofday 491
25.3.10 _disable 492
25.3.9 _chain_intr 492
25.3.12 _dos_close 493
25.3.11 _dos_allocmem 493
25.3.14 _dos_creat,_dos_creatnew 494
25.3.13 _dos_commit 494
25.3.15 _dos_findfirst,_dos_findnext 495
25.3.17 _dos_getdate 497
25.3.16 _dos_freemem 497
25.3.18 _dos_getdiskfree 498
25.3.20 _dos_getfileattr 499
25.3.19 _dos_getdrive 499
25.3.21 _dos_getftime 500
25.3.22 _dos_gettime 501
25.3.24 _dos_keep 502
25.3.23 _dos_getvect 502
25.3.25 _dos_open 503
25.3.27 _dos_setblook 504
25.3.26 _dos_read 504
25.3.28 _dos_setdate 505
25.3.30 _dos_setfileattr 506
25.3.29 _dos_setdrive 506
25.3.31 _dos_setftime 507
25.3.32 _dos_settime 508
25.3.33 _dos_setvect 509
25.3.35 _dosexterr 510
25.3.34 _dos__write 510
25.3.37 _FP_OFF,_FP_SEG 511
25.3.36 _enable 511
25.3.38 _harderr,_hardresume,_hardretn 512
25.3.39 _int86,_int86x 514
25.3.40 _intdos,_intdosx 515
25.3.41 _segread 516
参考文献 517
附录A 80×86芯片系列 518
A.1 8086和8088处理器 518
A.1.1 8086,8088和实方式 518
A.1.2 段地址加偏移量寻址 518
A.1.3 段寄存器和偏移量寄存器 519
A.1.4 段:偏移量寻址:一个更复杂的例子 520
A.1.5 段:偏移量寻址的多义性 521
A.2 80286微处理器 522
A.2.1 保护方式和段:偏移量寻址 522
A.3.1 386保护方式 523
A.3.2 虚拟8086方式 523
A.4 486处理器 523
A.3 386处理器 523
A.5 在C++程序中使用指针 524