引言 1
第一部分 Visual C++ 1
第一章 Microsoft Visual C++ 1
关于Visual C++ 1
目 录 1
Visual C++的其它特点 2
The Visual Work bench编辑器 2
标准版和专业版 5
安装Visual C++需做哪些准备 6
安装Visual C++ 6
单步和多步安装 7
The Visual Work bench 7
使用Visual C++ 8
编写一个Visual C++程序 9
关于Quick Win 9
Visual C++的project 10
建立一个Quick Win示例程序 11
小结 14
C++发展简史 15
第二章 良好的C++ 15
学习C++语言 16
C++的注解行 19
一个较好的办法 19
C语言和C++的混合注释 19
关键字 20
C++的关键字:完整的关键字表 20
Visual C++中未实现的关键字 22
Visual C++独有的关键字 23
标识符 24
数据类型 25
类 25
字符型 25
整型 26
浮点型 26
聚合数据类型 27
结构 30
联合 33
指针类型 35
Void类型 36
引用类型 36
typedef说明语句 38
小结 39
第三章类型限定语 40
const限定语 40
const限定语的使用 40
C语言和C++中的const对象 41
使用const限定语的优点 41
用函数初始化一个const 42
const对象的新特点 42
const对象的增强性能 42
返回const对象的函数 43
把一个const数组传递给函数 43
const修饰语如何工作 44
修改一个const对象的链接 44
在指针说明语句中使用一个const 44
使用带指针的常量 45
何时常量不是const? 45
在哪里放置一个const 46
指向一个const的地址 46
指向const对象的const指针 47
Volatile限定语 47
Volatile限定语的作用 47
说明一个对象既是const又是Volatile 48
小结 48
第四章变量 49
C++中的变量说明 49
初始化与赋值 50
初始化一个const 51
初始化外部数据 51
初始化常量和引用 51
初始化一个引用 51
函数形式的初始化 52
引用 54
定义引用 54
引用的作用能力 56
初始化引用 56
用作别名的引用 57
利用值来传递自变量 59
把引用作为参数传递给函数 59
利用地址传递自变量 60
利用引用传递自变量 61
如何不使用引用 62
访问被引用结构的元素 62
编写一个返回引用的函数 63
使用对Const对象的引用 65
小结 65
存储类 66
外部存储类 66
第五章变量的特性 66
静态存储类 67
作用域 69
局部作用域 69
函数作用域 70
文件作用域 70
原型作用域 71
解决标识符名字中的冲突 71
作用域的优先级 71
作用域分解运算符 72
说明的位置 72
生存期 73
链接 73
小结 74
第六章函数 75
main()函数 75
定义一个函数 76
c++形式的函数定义 77
函数原型的例子 78
函数原型 78
建立函数原型的规则 79
重载函数 80
使用函数重载 80
名字mangling 81
lnline函数 81
缺省的函数自变量 82
可变的自变量表 83
C语言中可变的自变量表 83
C++中可变的自变量表 83
编写可变的自变量表 84
STDARG.H函数 85
给函数传递自变量…………………………………………………………………………………(8?)维护传递函数数据的安全性………………………………………………………………………把一个自变量说明为一个常量 87
调用函数来初始化常量 88
小结 89
第七章编译Visual C++程序 90
建立一个Visual C++程序 90
加快编译速度 91
使用预编译的文件 91
编译一个Visual C++程序 91
使用快速编译选项 92
使用Disk-caching程序 92
使用RAM程序 92
标识符 92
把程序编译成P代码 92
C和C++编译程序 93
利用Visual Workbench编译程序 93
New Project对话框 94
Project Options对话框 95
Quick Win程序和其它应用 95
把系统配置成适于使用命令行编译 98
Visual C++预处理器 99
头文件 100
头文件的使用 100
头文件的内容 101
头文件的嵌套 101
带括号〈 〉和引号“”的#include指令 101
预编译的头文件和预编译的文件 102
预处理器如何找到头文件 102
#define指令 103
用#define建立常量 104
#define指令的局限性 104
用#define建立宏 105
条件编译指令 106
用编译指令来写注释 107
#if指令 107
#else和#elif指令 108
#ifdef和#else指令的组合 108
Charizing 109
其它的预处理指令 109
Visual C++预处理器的特性 109
Stringizing 110
Token合并 111
三字符组的替换 113
预定义的宏 113
小结 114
建立一个project 115
Linker按钮 115
第八章链接Visual C++程序 115
使用Linker Options对话框 116
获得命令行选项的帮助信息 117
链接一个C++程序 117
Visual C++提供的库 117
C++与其它语言的混合 118
名字mangling 119
可供选择的链接说明 119
extern关键字 119
函数修饰语 120
链接说明的影响力 120
C语言调用规范 121
Pascal/FORTRAN调用规范 122
寄存器调用规范 123
——asm修饰语 123
第九章存储管理 125
关于本章 125
分段存储 126
分段存储的工作原理 126
near调用和far调用 127
存储段和段边界 127
80×86芯片的段寄存器 127
段如何进行覆盖 128
段:偏移量寻址 128
存储模式 128
实模式 128
保护模式 129
标准模式和增强模式 129
标准模式 129
存储模型的机理 130
增强模式 130
存储模型 130
存储模型与指针 131
覆盖和MOVE实用程序 131
存储模型的判断 132
使用存储模型的优点 132
六个存储模型 133
Tiny存储模型 133
Small存储模型 133
Huge存储模型 134
near指针 134
关于Visual C++中指针的使用 134
Medium存储模型 134
Large存储模型 134
Compact存储模型 134
far指针 135
huge指针 135
new操作符的实现方法 136
new和delete操作符 136
指向未说明的数据类型的指针 136
指向void的指针 136
给存储空间初始化一个值 137
new操作符的使用 137
给数组分配存储空间 139
交互地分配存储空间 139
给无定长的数组分配存储空间 140
释放分配给数组的存储空间 140
通过调用函数分配存储空间 141
低级存储条件的处理 142
delete操作符的使用 142
_set_new handler()函数 143
new如何分配存储空间 144
near,far和基本存储空间 144
重载new和delete操作符 144
operator new()和operator delete()函数 144
size_t类型 146
给new操作符增加参数 146
重载_set_new_handler() 147
使用new修改存储池(memory pools) 147
保存和恢复一个新的handler 148
恢复_set_new_handler()的缺省行为 148
可修改的_set_new_handler()函数 148
Windows环境下的存储管理 148
Windows系统的工作情况 149
Windows和段寄存器 149
描述符 150
小结 151
关于OOP 153
容易误解的概念 153
第二部分面向对象的程序设计 153
第十章面向对象的程序设计 153
OOP的争议点 154
OOP的原理 154
OOP是如何开始的 155
从COBOL到Simula 155
C++的出台 155
代码重用 156
C++的益处 156
C++程序设计的技巧与宗旨 157
华尔街(Wall Street)的模拟 158
一个工厂的仿真 158
项目(projects)规划中的问题 160
C++的词典 160
C++的特性 162
数据封装与数据抽象 163
多重继承 164
继承性 164
多形性 165
C++程序的组成元素 167
类和对象 167
成员变量 168
成员函数 168
小结 168
第十一章类 170
struct性能的增强 170
对一个struct中的数据的访问限制 171
在struct中保存一个函数 171
C++风格的struct 171
从struct到class 172
例示(initiating)一个对象 173
对象例示的图例 173
访问类的成员 173
成员函数 174
域分解操作符 175
访问限定语 175
类和对象 176
类的图解 181
Zalthar程序中的数据抽象 182
抽象类 183
类的细化(subclassing) 183
虚函数 185
另外一个程序例子 188
类库 190
小结 191
第十二章对象 192
从结构到对象 192
C语言结构的缺点 194
对象的使用 195
如何建立对象 195
初始化对象的两种方法 195
定义一个对象的内容 195
构造函数 196
析构函数 201
成员变量 201
指向成员变量的指针 201
成员变量数组 204
静态成员变量 206
常量型成员变量 206
静态成员函数 213
为对象分配存储空间 213
动态地分配存储空间 214
框架分配 215
堆分配 216
访问对象的成员 217
在函数头中使用(::)操作符 219
封装(Encapsulation) 222
访问限定语 222
对访问限定语的解释 224
使用访问限定语 224
public访问限定语 225
private访问限定语 225
protected访问限定语 226
公用的派生类和私有派生类 226
公用的派生(public Derivation) 226
建立一个类的多个对象 227
建立对象数组 227
私有的派生(private Derivation) 227
建立指向对象的指针数组 231
设计类的技术 233
嵌套类 233
复合类 234
局部类 235
友元类(friend class) 236
不完全类说明 236
空类 237
this指针 238
具有静态生存周期的对象 238
具有外链接的对象 238
对象的作用域和链接 238
小结 240
第十三章成员函数 241
成员函数的功能 241
成员函数的种类 241
访问成员函数 241
说明和定义成员函数 243
指定成员函数的返回值 244
const和volatile关键字 245
具有常量型this指针的成员函数 246
具有可变的this指针的成员函数 247
静态和非静态的成员函数 249
inline成员函数 249
inline成员函数的工作过程 251
访问一个inline成员函数 251
inline成员函数和栈 252
重载成员函数 252
虚函数和多形性 253
超越(overriding)成员函数 253
虚函数 253
纯虚函数 254
友元(friend) 254
friend关键字 254
友元类和友元函数 256
建立友元类之间的联系桥梁(Bridge) 257
使用“桥”(bridge)函数的另一种选择形式 259
静态成员函数 260
static关键字 266
初始化一个静态成员变量 267
使用静态成员函数 267
指向成员函数的指针 268
使用指向普通函数的指针 268
使用指向成员函数的指针 269
指向成员函数的指针数组 270
指向静态成员函数的指针 272
小结 273
两类构造函数 275
建立构造函数 275
第十四章构造函数和析构函数 275
建立无构造函数的对象 277
析构函数 277
安全地使用析构函数 277
如何调用析构函数 278
使用析构函数 278
析构的序 278
构造函数的工作过程 279
Zalthar程序中的析构函数 279
构造函数的种类 280
调用一个构造函数 282
调用构造函数的其它方法 282
使用构造函数的基本规则 283
使用构造函数的优点 283
构造函数有助于存储管理 284
构造函数可以进行初始化和对值进行检查 284
转换构造函数和复制构造函数 286
用构造函数初始化变量 286
缺省的构造函数 288
何时调用缺省的构造函数 289
构造函数重载 289
调用一个缺省的构造函数 289
使用构造函数 290
具有多个构造函数的类 294
构造的顺序 295
在warrior程序中调用构造函数 296
构造一个const对象 296
按顺序的构造 296
小结 298
第十五章函数重载 299
函数重载的原理 299
函数重载的基本规则 300
自变量匹配 301
自变量匹配的工作原理 304
自变量匹配的步骤 304
函数重载和作用域 307
重载构造函数 308
派生类中的重载函数 309
重载虚函数 310
作用域分解操作符 310
重载静态成员函数 311
转换函数 312
小结 314
第十六章操作符重载 315
操作符重载的工作原理 315
操作符重载的一个例子 315
编写操作符重载函数 316
算术操作中使用操作符重载 316
操作符重载函数的作用域 317
操作符重载函数的格式 317
重载一元和二元操作符 317
可被重载的操作符 318
操作符重载:秘密与技巧 318
不可重载的操作符 319
C++如何实现操作符重载 320
操作符重载的规则 321
重载++和--操作符 322
重载操作符的成员函数 322
重载二元操作符+和- 325
重载+=操作符 327
重载=操作符 329
重载关系操作符 345
重载[ ]操作符 347
重载( )操作符 350
重载&操作符 351
重载->操作符 352
重载数据类型 357
重载new和delete 358
重载new和delete的规则 360
非成员的重载函数 361
编写一个非成员的操作符重载函数 362
一个操作符重载的友元函数 363
另一个操作符重载友元函数 365
小结 367
第十七章转换函数 368
转换函数的工作过程 368
函数风格的casts(造型) 369
造型(Casting) 369
造型带来的麻烦 369
使用函数风格的casts 370
函数风格casts的使用规则 370
转换用户自定义的数据类型 370
转换构造函数 371
为转换函数定义一个类 373
定义一个转换构造函数 373
把一个变量转换成一个具有多个元素的类 374
一个更高级的转换函数 376
把一个变元转换成一个多元素的类 377
TIME.H库中的函数 377
转换构造函数的执行步骤 378
成员转换函数 379
编写一个成员转换函数 379
成员转换函数的操作过程 380
使用成员转换函数 381
成员转换函数示例 382
小结 384
1705.CPP程序中使用的数据类型 384
第十八章复制对象 385
复制构造函数和Operator=函数 385
编写一个Operator=函数 386
调用一个复制函数 386
举例说明析构的问题 387
编写一个复制构造函数 389
operator=函数的工作过程 392
strcpy()函数 394
复制串 394
此程序的工作过程 398
给串分配存储空间 398
存储分配的另一种选择 399
在Zalthar程序中增加一个串类 399
新的Zalthar程序的工作过程 404
串类(sting classes) 405
串类的功能 405
使用重载的赋值操作符 406
赋值操作符重载 406
用复制构造函数初始化一个串对象 406
使用串类 406
小结 407
第十九章继承性与多形性 408
派生类 408
使用派生类的理由 408
使用派生类的好处 409
新的Zalthar程序的层次结构 414
构造函数和析构函数的继承原则 415
通过指针来访问对象 417
虚函数 418
调用虚函数 418
纯虚函数 418
超越虚函数 421
域分解操作符 422
虚函数如何实现 422
虚函数:正论与反论 424
多重继承性 424
多重继承性图解 424
动物王国里的多重继承性 425
虚基类 427
继承链中的函数名冲突 428
小结 430
第二十章流(streams) 431
iostream类是如何实现的 431
iostream库 433
与流相关的头文件 433
Microsoft iostream类库 433
ios类和它的子类 434
iostream的层次结构 434
使用流 437
流中的混合数据类型 438
格式化输出 439
setw设备操作符 444
设置补白字符(padding characters) 445
cin〉〉和cout〈〈的多种选择形式 445
cin〈〈的操作符的多种选择形式 446
cout〈〈操作符的多种选择形式 449
重载〉〉操作符 450
重载〈〈和〉〉 450
重载〈〈操作符 450
文件的输入/输出(I/O) 451
打开,使用和关闭一个流文件 452
文件流 452
Of stream和ifstream类 452
fstream类 453
小结 457
第二十一章 The Microsoft Foundation Classes(MFC) 459
第三部分MFC库 459
多种用途的类 460
Cobject类 461
使用Cobject类的优点 461
串行化(serialization) 462
DYNACREATE宏 467
DYNAMIC宏 467
诊断帮助 468
异常处理 471
其它的MFC类 472
文件类 473
收集(collection)类 474
CString类 475
与时间相关的类 475
程序范例 476
程序范例的层次结构 476
编译程序范例 477
运行程序范例 478
小结 497
消息驱动的(message-driven)程序 499
Visual Workbench的组成部分 499
第二十二章 The Visual Workbench 499
C++程序的层次结构 500
Win Main()函数 501
文档和视图 501
Visual Workbench的工具 503
App Wizard 504
App Studio 508
建立人物对话框的工作过程 513
ClassWizard的工作原理 515
使用ClassWizard 515
ClassWizard窗口 515
命令联编(binding) 517
建立对话框 517
程序范例 520
小结 562
第二十三章窗口和视图 564
文档和视图的实现原理 565
CDocument类的特征 565
使用文档 566
CView类的特征 566
Visual C++中Windows(窗口)的工作机理 567
Windows的类 567
CWnd类 568
Windows的五个大类 568
对话框 576
CDialog类 576
对话框的工作原理 577
按照旧的方式检索数据 580
小结 581
第二十四章Visual C++的图形 582
CDC类 582
CDC的子类 583
CGdiObject类 583
使用CDC和CGdiObject类 584
名字的含义 584
在Visual C++中创建图形 584
OnPaint()函数和OnDraw()函数 586
Visual C++图形的建立步骤 586
OnDraw()函数的使用步骤 587
用CDC和GDI对象画出文本 588
创建和删除图形对象 588
图形对象的单步创建过程 589
图形对象的两步建立过程 589
在Visual C++中使用位图 590
创建一个位图对象 590
画不规则形状 593
画出Zalthar程序中的游戏人物 594
动画 596
Zalthar:最后一幕 598
小结 639
附录A ASCII码表 641
附录B 80×86芯片家族 643
8086和8088处理器 643
8086,8088和实模式 643
段:偏移量寻址的机理 643
段寄存器和偏移量寄存器 644
段:偏移量寻址中存在的模糊性 645
段:偏移量寻址:一个更复杂的例子 645
80286微处理器 647
保护模式和段:偏移量寻址 647
386处理器 648
386的保护模式 648
虚拟8086模式 649
486处理器 649
在C++程序中使用指针 649
参考文献 651