图书目录

目    录

第1篇  C++程序设计语言入门

 

第1章  C++程序设计语言概述 2

1.1  C++和C#、Java的区别 2

1.1.1  面向对象还是面向过程 2

1.1.2  内存管理是否自动释放 2

1.1.3  是否跨平台 3

1.1.4  C++与其他语言的主要区别 3

1.2  C++语言的主要应用领域 4

1.3  C++的开发工具以及

Visual C++ 6.0 5

1.3.1  Visual C++ 6.0开发工具简介 5

1.3.2  Visual C++ 6.0的开发过程 6

第2章  Visual C++ 6.0入门 7

2.1  安装Visual C++ 6.0 7

2.1.1  对硬件的要求 7

2.1.2  安装Visual C++ 6.0 8

2.1.3  安装MSDN Library 9

2.1.4  安装源代码管理器 11

2.1.5  完成安装 11

2.1.6  安装Visual C++ 6.0开发

插件 12

2.1.7  编写宏文件 12

2.1.8  使用宏文件 15

2.2  Visual C++ 6.0开发环境介绍 17

2.2.1  熟悉Visual C++ 6.0开发

环境 17

2.2.2  建立一个工程 18

2.2.3  工程菜单 21

2.2.4  编译菜单 22

2.2.5  Tools菜单 23

2.2.6  工具条 23

2.3  创建第一个Visual C++程序 24

2.3.1  编写代码 24

2.3.2  编译程序 25

2.3.3  运行程序 25

2.4  使用源代码管理器 25

2.4.1  基本概念 26

2.4.2  创建数据库 26

2.4.3  根据现有工程在服务端创建

文件夹 27

2.4.4  代码入库和出库 27

2.4.5  版本控制(Label) 29

2.5  常见问题 29

2.5.1  必须安装和Visual C++ 6.0配套发行的MSDN Library吗 29

2.5.2  可以在Visual C++ 6.0下使用

其他的C++编译器吗 29

第3章  C++基础语法 30

3.1  变量和常量 30

3.2  C++基础数据类型 31

3.2.1  整值类型 31

3.2.2  浮点值类型 32

3.2.3  布尔类型 33

3.2.4  字符串类型 33

3.3  C++高级数据类型 34

3.3.1  枚举类型 34

3.3.2  结构类型 36

3.3.3  联合类型 37

3.3.4  数组类型 38

3.4  指针和引用 40

3.4.1  指针变量的声明与初始化 41

3.4.2  指针运算符:& 43

3.4.3  指针运算符:* 44

3.4.4  指针运算符::: 45

3.4.5  指针运算 47

3.4.6  指针与常量限定符 48

3.4.7  指针与数组 49

3.4.8  引用 50

3.5  表达式和运算符 52

3.5.1  表达式的定义 52

3.5.2  基本运算符 52

3.5.3  逻辑运算操作符 53

3.5.4  ==、>、>=、<、<=、!=

运算符 53

3.5.5  ++、--操作符 53

3.5.6  位操作符 54

3.5.7  new/delete操作符 54

3.6  程序控制结构 56

3.6.1  switch/case结构 56

3.6.2  if/else/else if结构 58

3.6.3  goto语句 59

3.6.4  for循环语句 59

3.6.5  while与do/while循环语句 61

3.6.6  break语句 62

3.6.7  continue语句 63

3.7  函数 64

3.7.1  函数的定义 64

3.7.2  函数的返回类型 65

3.7.3  函数的参数 65

3.7.4  参数传递 66

3.7.5  函数的默认参数 68

3.8  常见问题 69

3.8.1  new/delete操作符和malloc/free函数有何区别 69

3.8.2  应该使用const修饰符

还是宏 70

第4章  C++面向对象编程 72

4.1  类的基本概念和特性 72

4.1.1  类和结构 72

4.1.2  类的数据成员 73

4.1.3  类的成员函数 74

4.1.4  类成员访问级别 75

4.1.5  类声明、类定义和类实现 76

4.1.6  类的内联函数和非内联函数 78

4.1.7  构造函数 78

4.1.8  析构函数 81

4.1.9  this指针 82

4.1.10  友元 82

4.1.11  静态成员 84

4.2  类的派生和继承 87

4.2.1  public继承 87

4.2.2  protected继承 98

4.2.3  private继承 100

4.3  常见问题 100

4.3.1  析构函数是否可以定义为虚函数,有何用处 101

4.3.2  在C++中struct被赋予了哪些

类的特征 102

第5章  异常及其处理 104

5.1  异常的产生 104

5.2  异常的处理 106

5.3  深入了解异常 109

5.3.1  异常的再抛出 109

5.3.2  异常的参数传递 110

5.4  Visual C++ 6.0中的异常 112

5.4.1  关键字_try/_except/_finally 112

5.4.2  TRY/CATCH宏 112

5.5  常见问题 113

5.5.1  应该怎样设计异常 113

5.5.2  如何避免使用异常 114

 

第2篇  使用Visual C++ 6.0进行常用开发

 

第6章  Visual C++ 6.0开发起步 116

6.1  Windows消息机制 116

6.1.1  什么是消息 116

6.1.2  消息的分类 117

6.1.3  消息的处理过程 118

6.2  Win32 API介绍 118

6.2.1  API的分类 118

6.2.2  API的用途 119

6.2.3  在Visual C++ 6.0中使用

Win32 API 119

6.3  MFC介绍 119

6.3.1  MFC的来源和用途 120

6.3.2  MFC的基本框架结构 120

6.3.3  使用MFC 121

6.4  常见问题 122

6.4.1  如何自定义消息 122

6.4.2  Win32 API定义了哪些数据

类型 123

6.4.3  Visual C++、Win32 API和

MFC之间的关系 124

6.4.4  使用C++开发Windows应用

程序必须使用Win32 API

或者MFC吗 124

第7章  开发基于对话框的应用程序 126

7.1  使用向导生成应用程序框架 126

7.1.1  建立基于对话框的应用程序

框架 126

7.1.2  控件 128

7.2  基于对话框的程序基本框架 128

7.2.1  应用程序的入口函数 129

7.2.2  MFC应用程序的入口点 130

7.2.3  CDemo1App类解析 131

7.2.4  CDemo1Dlg类框架解析 132

7.2.5  CDemo1Dlg类解析 134

7.3  实现数据交互 136

7.3.1  使用类向导编辑控件属性 137

7.3.2  使用类向导实现数据交互 137

7.4  实现消息映射 139

7.4.1  消息的分类 140

7.4.2  消息的处理 140

7.4.3  处理【OK】按钮单击事件 141

7.4.4  程序实现 143

7.4.5  自定义控件 145

7.5  实战:简易计算器 148

7.5.1  程序界面设计 148

7.5.2  简易计算器的业务逻辑 149

7.5.3  简易计算器的状态 150

7.5.4  简易计算器的实现 151

7.6  常见问题 159

7.6.1  如何响应自定义消息 159

7.6.2  如何在窗体中使用定时器 160

第8章  文档/视图结构 163

8.1  基础知识 163

8.1.1  单文档视图和多文档视图

结构 163

8.1.2  文件类型 164

8.1.3  使用向导生成一个简单的

记事本 164

8.2  单文档/视图结构 166

8.2.1  CDocViewApp应用程序类

解析 166

8.2.2  修改CDocViewApp类使得程序支持多种文件类型 168

8.2.3  CMainFrame框架类解析 171

8.2.4  CDocViewDoc文档类解析 173

8.2.5  CDocViewView视图类

解析 174

8.3  多文档/视图结构 174

8.4  实战:使用单文档/视图结构

实现八数码游戏 175

8.4.1  需求分析 176

8.4.2  设计并实现操作接口的

主框架 176

8.4.3  设计并实现棋盘数据结构 178

8.4.4  在CEightDoc类中添加棋盘

类的对象 182

8.4.5  在CMainFrame类中实现对

棋盘的控制 182

8.4.6  在CEightView类中实现对

棋盘的控制 184

8.4.7  在CEightView类中实现对

棋盘的绘制 185

8.4.8  实现智能解题 188

8.5  常见问题 194

8.5.1  CFrameWnd、CView、CDocument是如何协作的 194

8.5.2  MFC中包含了哪些CView的

派生类 195

第9章  使用Visual C++ 6.0开发动态

链接库 196

9.1  动态链接库基础 196

9.1.1  创建静态链接库 196

9.1.2  使用静态链接库 197

9.1.3  创建简单的动态链接库 199

9.1.4  使用动态链接库 201

9.1.5  动态链接库和静态链接库的

比较 203

9.1.6  规则DLL和扩展DLL 203

9.2  开发Win32动态链接库 204

9.2.1  动态链接库的初始化和反

初始化 204

9.2.2  导出、导入函数和数据 206

9.3  开发基于MFC的动态

链接库 208

9.3.1  创建链接MFC的规则DLL 208

9.3.2  MFC扩展 DLL 210

9.4  实战:使用动态链接库实现界面

和功能实现的分离 212

9.5  常见问题 217

9.5.1  AFX_MANAGE_STATE宏有何作用,何时需要使用该宏 217

9.5.2  MFCDLL能导出C++类、成员

函数吗 218

9.5.3  如何只导出部分类成员 218

9.5.4  LoadLibrary和FreeLibrary函数的用途有哪些,什么是显式加载动态链接库 219

9.5.5  DEPENDS工具的用处有

哪些 220

9.5.6  Windows操作系统用来定位DLL

的搜索路径是怎样的 220

 

第3篇  使用Visual C++ 6.0进行高级开发

 

第10章  多线程开发 222

10.1  为什么需要多线程 222

10.2  基础知识 222

10.2.1  进程与线程 222

10.2.2  关于“同时执行”、“并发

处理” 223

10.3  线程的创建与结束 224

10.3.1  Sleep函数 224

10.3.2  CreateThread/ExitThread

函数 225

10.3.3  _beginthreadex/_endthreadex

函数 227

10.3.4  AfxBeginThread/AfxEndThread

函数 228

10.3.5  选择哪种函数创建线程 231

10.4  线程的调度 233

10.4.1  优先权类别 233

10.4.2  优先权层级 234

10.5  核心对象 234

10.5.1  什么是核心对象 235

10.5.2  CloseHandle函数 235

10.6  线程同步 236

10.6.1  同步机制简介 236

10.6.2  临界区域(Critical Section) 236

10.6.3  使用临界区域保证数据访问的安全性 238

10.6.4  安全退出临界区域 240

10.6.5  互斥器(Mutexes) 242

10.6.6  使用互斥器设计线程

安全的数据结构 244

10.6.7  信号量(Semaphores) 249

10.6.8  事件(Event Objects) 251

10.6.9  使用事件通知线程安全地

退出 253

10.6.10  WaitForSingleObject系列

函数 254

10.7  再论线程的创建和退出 255

10.7.1  回顾 255

10.7.2  创建线程的一个习惯用法 256

10.7.3  协作式退出线程 257

10.8  实战:多线程实现百米赛跑

模拟 258

10.8.1  设计界面 259

10.8.2  设计相关数据结构 259

10.8.3  实现自定义消息响应 262

10.9  常见问题 265

10.9.1  在多线程情况下,使用STL

(标准模板库)应该注意

什么 265

10.9.2  临界区域(Critical Section)相比本章介绍的相关核心对象有何优缺点 265

第11章  数据库应用开发 266

11.1  数据库应用开发介绍 266

11.1.1  ODBC技术介绍 266

11.1.2  OLE DB、ADO技术介绍 267

11.1.3  使用数据库API接口 268

11.1.4  准备工作 268

11.2  使用ODBC开发数据库

应用 269

11.2.1  创建ODBC数据源 269

11.2.2  连接数据源 271

11.2.3  CRecordSet类介绍 273

11.2.4  添加、修改和删除数据 276

11.2.5  撤销操作 277

11.2.6  查询记录 278

11.2.7  读取数据 278

11.3  使用ADO开发数据库应用 280

11.3.1  ADO内置对象简介 281

11.3.2  使用ADO注意事项 281

11.3.3  连接数据库 281

11.3.4  记录集-填充和读取数据 283

11.3.5  记录集-添加数据 284

11.3.6  记录集-删除数据 284

11.3.7  记录集-编辑数据 285

11.3.8  命令 286

11.4  使用数据库API开发数据库

应用 287

11.4.1  MySQL数据库介绍 287

11.4.2  安装MySQL数据库 288

11.4.3  准备工作 288

11.4.4  配置编译环境 289

11.4.5  连接MySQL数据库 290

11.4.6  执行SQL语句 291

11.4.7  读取数据 291

11.5  实战:使用ODBC操作MS

SQL Server数据库 291

11.5.1  需求分析 292

11.5.2  界面设计及实现 292

11.5.3  实现数据源的连接和关闭 294

11.5.4  数据显示 295

11.5.5  删除数据 296

11.5.6  添加、编辑数据 297

11.6  实战:使用ADO操作Access

数据库 301

11.6.1  需求分析 301

11.6.2  数据库设计 301

11.6.3  界面设计 302

11.6.4  封装数据结构 303

11.6.5  数据访问层接口设计 304

11.6.6  数据访问层接口实现 305

11.6.7  辅助窗口设计和实现 311

11.6.8  主程序实现 314

11.7  实战:开发MySQL数据库

应用程序 323

11.7.1  设置头文件和导入库 323

11.7.2  编写辅助宏 324

11.7.3  设计数据结构 324

11.7.4  连接数据库 325

11.7.5  添加数据 326

11.7.6  读取数据 326

11.7.7  主程序实现 327

11.8  常见问题 330

11.8.1  如何选择开发数据库应用程序

的技术 330

11.8.2  如何使用基于XML的文本

数据库 330

第12章  Windows网络编程 331

12.1  Winsock基础知识 331

12.1.1  Winsock版本 331

12.1.2  使用Winsock 333

12.1.3  初始化Winsock 334

12.1.4  反初始化Winsock 335

12.1.5  使用WSAGetLastError

函数 336

12.1.6  基本的Winsock初始化、反初

始化代码框架 337

12.1.7  阻塞和非阻塞调用 338

12.2  寻址及套接字的创建与

关闭 338

12.2.1  IPv4寻址 338

12.2.2  创建套接字 340

12.2.3  关闭套接字 341

12.3  使用TCP协议进行网络通信 342

12.3.1  TCP协议通信流程 342

12.3.2  服务端函数 342

12.3.3  客户端函数 345

12.3.4  收发数据 345

12.4  使用UDP协议进行网络

通信 347

12.4.1  UDP协议通信流程 347

12.4.2  服务端函数 348

12.4.3  客户端函数 350

12.5  Winsock I/O模型 353

12.5.1  套接字模式 353

12.5.2  阻塞模型、select模型 354

12.5.3  WSAAsyncSelect模型 357

12.5.4  WSAEventSelect模型 359

12.5.5  重叠模型、完成端口模型 361

12.6  实战:使用UDP协议实现即时通信 361

12.6.1  需求分析 362

12.6.2  通信协议设计 363

12.6.3  服务端设计与实现 363

12.6.4  客户端框架设计 373

12.6.5  设定套接字模型 375

12.6.6  套接字的连接和关闭 375

12.6.7  消息的发送 377

12.6.8  数据接收 378

12.6.9  运行效果 381

12.7  常见问题 382

12.7.1  为什么本章没有介绍使用

MFC类进行Windows网络

编程 382

12.7.2  本章中介绍的Winsock I/O模型对平台有何要求 382

12.7.3  在select模型中,fd_set结构能够绑定多少套接字 382

12.7.4  WSAWaitForMultiple- Events

可以同时等待多少网络事件

对象 382

12.7.5  编写网络应用程序应该注意

什么 382

第13章  一个完整的项目实现 384

13.1  需求分析以及项目框架 384

13.2  服务端设计与实现 385

13.2.1  通信协议的设计 385

13.2.2  多线程模型的设计 387

13.2.3  线程同步 387

13.2.4  文件管理模块的设计 388

13.2.5  用户管理模块的设计 394

13.2.6  线程管理模块设计 400

13.2.7  监听模块设计 408

13.2.8  传输/服务模块设计 411

13.2.9  服务端主程序设计 415

13.3  客户端设计与实现 422

13.3.1  界面设计 422

13.3.2  相关数据结构设计 422

13.3.3  断点续传功能的实现 424

13.3.4  服务器连接模块 426

13.3.5  文件目录信息获取模块 426

13.3.6  文件下载模块 426

13.4  运行情况 429

13.5  常见问题 430

13.5.1  服务端如何管理“正在服务的

客户”和“尚未服务的

客户” 430

13.5.2  为什么在某些网络环境下测试本章程序会出现丢包现象 430

 

第4篇  数据结构和技巧

 

第14章  错误和调试 432

14.1  错误的基本概念和常见问题 432

14.1.1  什么是错误 432

14.1.2  野指针问题 432

14.1.3  空指针问题 433

14.1.4  传值不当引起的问题 434

14.1.5  循环终止条件设置不当引起的

效率问题 435

14.1.6  使用STL中迭代器失效的

问题 435

14.2  使用Visual C++ 6.0进行

调试 436

14.2.1  Debug版本和Release版本 436

14.2.2  以调试模式启动程序 436

14.2.3  断点的使用 437

14.2.4  Step Into和Step Out 438

14.2.5  Step Out和Run to Cursor 440

14.2.6  查看调试断点的上下文

信息 441

14.2.7  调试动态链接库 442

14.3  常见问题 442

14.3.1  如何在Release版本下加入调试符号 443

14.3.2  MFC对程序调试提供了哪些

支持 443

第15章  MFC常用技巧 444

15.1  使CListCtrl控件可以选择一

整行 444

15.2  去除单(多)文档窗口标题栏

的文档名 445

15.3  禁止调整窗口大小 445

15.4  使应用程序在同一时刻只能

运行一个实例 446

15.5  创建选择文件夹的对话框 447

15.6  使窗口置顶 449

15.7  使应用程序支持启动参数 449

15.8  获得程序自身所在的目录 450

15.9  如何播放WAV文件 451

15.10  更改选择文件对话框中的按钮文字 452

15.11  使用CBitmapButton类 453

15.12  使用CToolTipCtrl类实现提示信息效果 455

15.13  判断窗口的最大化、最小化状态并进行控制 457

15.14  如何在运行时动态创建

控件 458

15.15  如何创建“上下文”式右键

菜单 460

15.16  如何获得系统文件夹路径 462

15.17  如何使用RichEdit控件 462

15.18  如何获取当前屏幕的

分辨率 463

15.19  CListCtrl控件无法满足需求,有什么好的控件可以代替 463

15.20  有哪些兼容MFC的界面库 464

第16章  MFC抽象数据类型 465

16.1  链表 465

16.1.1  使用CStringList、CObList、CPtrList简单链表类 465

16.1.2  使用CList链表类 468

16.2  数组 469

16.2.1  使用CDWordArray类 470

16.2.2  使用CArray类 474

16.3  映射 475

16.3.1  使用CMapStringToString等简单映射类 475

16.3.2  使用CMap类 477

16.4  常见问题 478

16.4.1  如何选择适当的MFC抽象

数据类型 478

16.4.2  使用MFC抽象数据类型还是STL(标准模板库) 478

第17章  标准模板库(STL) 479

17.1  基本概念 479

17.1.1  命名空间和头文件 479

17.1.2  异常处理 480

17.1.3  STL的主要组成部分 481

17.2  容器 482

17.2.1  使用动态数组类vector 482

17.2.2  使用队列类deque 489

17.2.3  使用链表类list 491

17.2.4  使用集合类set 498

17.2.5  使用映射类map 501

17.3  常用算法 506

17.3.1  for_each算法 506

17.3.2  count、count_if算法 507

17.3.3  min_element、max_element

算法 508

17.3.4  find、find_if算法 509

17.4  常见问题 511

17.4.1  STL有不同版本吗 511

17.4.2  遍历容器为什么对迭代器进行++ite而不是ite++操作 511

第18章  ERP的进销存管理系统 512

18.1  概念分析阶段 512

18.1.1  需求分析 512

18.1.2  系统功能分析 512

18.1.3  系统模块设计 513

18.1.4  数据库设计 514

18.1.5  创建数据库 516

18.2  项目前期配置 517

18.2.1  选择数据库程序开发技术 517

18.2.2  新建用于实现系统的项目 517

18.2.3  添加用于数据库开发的ADO

封装类和ADO控件 518

18.3  用户管理模块 520

18.3.1  实现用户登录功能 520

18.3.2  实现修改密码功能 526

18.3.3  实现用户的增、删、改 528

18.4  实体信息管理模块 532

18.4.1  客户信息管理 532

18.4.2  供应商信息管理 539

18.4.3  员工信息管理 545

18.4.4  商品信息管理 547

18.5  进销存管理模块 553

18.5.1  销售管理 553

18.5.2  进货管理 560

18.6  统计报表模块 566

18.6.1  创建员工销售业绩报表 566

18.6.2  创建各种商品销售情况

报表 570

18.6.3  员工销售业绩统计报表 572

18.6.4  各种商品销售情况统计

报表 575

18.7  系统运行结果 575

18.8  常见问题 576

18.8.1  什么是水晶报表 576

18.8.2  从程序员的角度看,MIS系统

的开发步骤是怎样的 576

附录A  C++常见面试题 578