
本书通过实例解析的方式全面深入地介绍了标准C++语言及其面向对象的特性,阐述了面向对象的设计思想和编程方法,注重C++面向对象程序设计能力的培养。从认识对象、发现对象和详解对象,揭示面向对象方法的本质; 通过抽象性、封装性、继承性和多态性诠释面向对象技术的特征; 通过案例分析强调面向对象技术的应用。
全书共11章,分为3篇。第1篇是引导篇,主要介绍面向对象的基本原理、概念、特征、UML描述,及C++程序的基本结构和上机指导; 第2篇是基础篇,主要介绍C++的面向对象机制,包括发现、创建和使用对象,派生新类、多态性、模板和STL,输入/输出流,异常处理等; 第3篇是应用篇,主要介绍C++在数学计算、物理计算、STL应用和泛型编程、Windows应用程序设计、网络编程、编译程序设计方面的案例。
本书体系结构新颖,逻辑性强,例题丰富,具有较强的实用性。本书是高等院校计算机及相关专业的教材,可自学使用,也可作为C++程序开发人员的参考书。
从20世纪60年代提出面向对象概念至今,面向对象技术已发展成为一种比较成熟的编程思想,并且逐步成为目前软件开发领域的主流技术。这种技术从根本上改变了人们以往设计软件的思维方式,它集抽象性、封装性、继承性和多态性于一体,实现了代码重用和代码扩充,极大地减少了软件开发的繁杂性,提高了软件开发的效率。C++为面向对象技术提供全面支持,也是最常用的面向对象程序设计语言,它是一个可编写高质量的用户自定义类型库的工具,其核心应用领域是最广泛意义上的系统程序设计。此外,C++还被成功地用到许多应用领域中。从最摩登的小型计算机到最大的超级计算机上,几乎所有操作系统上都有C++的实现。因此,通常结合C++来介绍面向对象技术的原理和方法。
C++是C的一个超集。C++提供了C所提供的各种功能,还为定义新的数据类型提供了灵活而有效的功能。
其核心概念是类,一个类就是一个用户自定义类型。类提供了对数据的隐藏、数据的初始化、用户自定义类型的隐式转换、动态类型识别、用户控制的存储管理以及重载运算符等。在类型检查和表述模块性方面,C++提供了比C更好的功能。它还包含了许多不直接与类相关的改进,包括内联函数、默认函数参数、重载函数名、动态存储管理运算符,以及引用等。C++保持了C高效处理硬件基本对象(位、字节、字、地址等)的能力。这就使用户自定义类型能够在相当高的效率水平上实现。
C++及其标准库也是为了可移植性而设计的。C的库绝大多数也能用于C++程序。目前,国内外许多高等学校计算机专业和相关专业都开设了该课程,其目的是为了让学生掌握面向对象程序设计的概念和方法,深刻理解面向对象程序设计的本质,并用面向对象技术来开发软件。我们的目标是为高等学校学生编写一本教材。本书的结构曾让我们费尽思量,是先介绍C++面向过程编程再介绍C++面向对象编程,还是平衡面向过程编程与面向对象编程的混合方法?市面上的教材大多如此。经过几番思索、讨论,最后我们决定以C++面向对象特征为线索,根据内容的需要适时地介绍C++面向对象与面向过程,使之有机结合,浑然一体。另外,我们强调应用,让读者学习后能动手解决一些实际问题。本书是作者总结教学实践经验,参考国内外有关资料编写而成的,便于大学生学习、研究生参考以及读者自学。
特别说明,本书的对象不是C++的专业开发人员,而是高校的大学生,他们并无从事程序设计的实际经验,将来也不一定是C++的专业开发人员。众所周知,研制C++的初衷是为了解决大型软件开发中遇到的问题,提高软件的开发效率和易维护性。只有参加研制大型软件的人才能真正体会到C++的优越性,并善于利用C++的独特机制去进行软件开发。大学生在学校学习C++的目的是了解面向对象程序设计方法,能够利用C++编写相对简单的程序,为以后进一步学习和应用打下良好的基础。不可能设想,通过几十个小时的学习,能使一个学生变成一个熟练的C++开发人员。因此,本书着力于使读者对C++的全貌和作用有基本的认识,用解析法讲清楚有关的基本概念和基本方法,而不去罗列C++语法中各种烦琐的细节。否则将会使篇幅过大,而且会冲淡重点,主次不分,使读者感到枯燥无味。
本书是依据ANSI C++标准进行介绍的,引导读者从一开始就按标准C++的规定编程。全书共11章,分为3篇,第1篇(第1章)是引导篇,这部分从总体上介绍面向对象技术的基本概念和相关技术; 第2篇(第2章~第10章)是基础篇,这部分以面向对象技术的特征为线索展开对C++的讨论,全面介绍C++面向对象技术; 第3篇(第11章)是应用篇,主要介绍一些典型案例。为了便于读者学习,本书提供了5个附录: C++语法摘要、C++标准库简介、Visual C++开发环境、调试方法、常见C++错误列表等内容,供读者查阅。本书的例题,都在Visual C++6.0上调试通过。
值得一提的是,本书中给出的许多类的示例虽然有一定的用处,但也还是应该归到“玩具”一类。与在完整的精益求精的程序中做解释相比,这里所采用的解说风格能更清晰地呈现那些具有普遍意义的原理和极其有用的技术,在实际例子中它们很容易被细节淹没。
本书由甘玲主编。甘玲编写第2章~第5章、第8章、第10章及附录C,石岩编写第1章和第9章,李盘林编写第7章、第11章(案例3和案例5)及附录D,冯潇编写第6章及附录B,汪建编写第11章(案例4和案例6)及附录E,张璞编写附录A,张慈湑编写第11章(案例1和案例2),参加编写的还有郑莉、王朝霞、于显平、邓东东、贾怀礼。全书由甘玲统稿和校稿。在此,感谢邱玉辉教授和王国胤教授,他们对该书给予了极大的关注和支持。感谢本书所列参考文献的作者!感谢为本书出版付出辛勤劳动的清华大学出版社工作人员!感谢使用系列教材的老师学生们,他们提出了宝贵的意见和建议。
由于作者水平有限,时间仓促,错误与疏漏之处在所难免,恳请批评指正。在使用该书时如遇到什么问题需要与作者交流,或想索取本书例题的源代码与电子讲稿,请与作者联系。联系方式: ganling@cqupt.edu.cn。
作者
于2007年深秋
第1篇引导篇
第1章认识对象
1.1问题的抽象
1.1.1以功能为中心的抽象
1.1.2以对象为中心的抽象
1.2一切事物皆是对象
1.2.1对象
1.2.2类
1.2.3属性、操作和方法
1.3面向对象技术概述
1.3.1面向对象的基本特征
1.3.2面向对象的软件开发方法
1.3.3面向对象的UML描述
1.4C++简介
1.4.1从C到C++
1.4.2简单的C++程序
1.4.3C++程序结构
1.4.4C++程序的上机过程
本章小结
习题1
第2篇基础篇
第2章发现对象和设计类
2.1时钟问题
2.1.1提出问题
2.1.2分析问题
2.2发现对象
2.2.1定义属性
2.2.2定义行为
2.3设计类
2.3.1定义类
2.3.2访问权限控制
2.3.3成员函数的实现方式
2.3.4内联函数
2.4创建对象
2.4.1对象的定义(解决问题)
2.4.2类成员的访问
2.4.3构造函数
2.4.4构造函数的重载
2.4.5带默认参数的构造函数
2.4.6析构函数
2.4.7构造函数和析构函数的调用顺序
2.4.8复制构造函数
2.5对象间的数据共享问题
2.5.1类的静态数据成员
2.5.2静态成员的定义
2.5.3静态数据成员的初始化
2.5.4静态数据成员的使用
2.5.5静态成员函数
2.6举一反三
本章小结
常见错误
习题2
第3章详解对象
3.1多个同类对象信息管理的问题
3.1.1提出问题
3.1.2分析问题
3.2对象的存储
3.2.1变量的作用域
3.2.2变量的生存期
3.2.3动态内存分配
3.2.4动态对象
3.2.5名字空间
3.3对象指针
3.3.1对象指针的定义
3.3.2对象指针的初始化
3.3.3通过指针访问对象成员
3.3.4解析应用实例
3.3.5this指针
3.3.6成员指针
3.4对象引用
3.4.1引用的概念
3.4.2引用的定义
3.4.3引用的作用
3.5共享数据的保护
3.5.1常量
3.5.2const与指针
3.5.3常引用
3.5.4常对象
3.5.5类的常成员
3.6对象数组
3.6.1数组的声明及使用
3.6.2数组的初始化
3.6.3对象数组
3.7字符串对象
3.7.1用字符数组存储和处理字符串
3.7.2string类
3.8对象成员
3.8.1类的聚集与组合
3.8.2对象成员的初始化
3.8.3对象成员数组
3.9解决问题
3.10举一反三
本章小结
常见错误
习题3
第4章派生新类
4.1类层次的问题
4.1.1提出问题
4.1.2分析问题
4.2派生与继承
4.2.1派生
4.2.2继承
4.2.3访问控制
4.3派生类
4.3.1派生类定义
4.3.2派生类成员的构成
4.3.3派生后访问权限控制
4.3.4派生类的构造函数和析构函数
4.4多继承与虚拟继承
4.4.1多继承派生类的定义
4.4.2多继承派生类的构造函数
4.4.3虚拟继承与虚基类
4.5解决问题
4.6举一反三
本章小结
常见错误
习题4
第5章多态与抽象类
5.1类层次的多态问题
5.1.1提出问题
5.1.2分析问题
5.2类型兼容规则
5.3多态的概念
5.4多态的分类
5.5联编
5.5.1静态联编
5.5.2动态联编
5.6虚函数
5.6.1虚函数的声明
5.6.2虚函数的使用
5.6.3虚函数表
5.6.4虚析构函数
5.7抽象类和纯虚函数
5.7.1抽象类
5.7.2纯虚函数
5.8解决问题
5.9举一反三
本章小结
常见错误
习题5
第6章运算符重载与友元
6.1复数的加减运算问题
6.1.1提出问题
6.1.2分析问题
6.2运算符重载
6.2.1运算符重载的定义
6.2.2运算符重载的规则
6.3友元
6.3.1友元的作用
6.3.2友元的定义
6.4运算符重载的使用
6.4.1运算符重载为成员函数
6.4.2运算符重载为友元函数
6.5解决问题
6.6举一反三
本章小结
常见错误
习题6
第7章模板——类的再抽象
7.1标准模板库的设计问题
7.1.1提出问题
7.1.2分析问题
7.2模板的概念
7.3函数模板
7.3.1函数模板的定义
7.3.2模板函数的生成
7.4类模板
7.4.1类模板的定义
7.4.2类模板的使用
7.5解决问题
7.6STL简介
7.6.1STL与C++
7.6.2STL与C++标准函数库
7.6.3使用STL
7.7举一反三
本章小结
常见错误
习题7
第8章输入/输出流对象
8.1螺旋矩阵的输入/输出问题
8.1.1提出问题
8.1.2分析问题
8.2流
8.2.1流的概念
8.2.2I/O流
8.2.3I/O流类库的层次结构
8.2.4I/O流类库的头文件
8.2.5标准输入/输出流对象
8.3无格式输入/输出
8.4输入/输出的格式控制
8.4.1用ios类成员函数格式化
8.4.2用操作符函数格式化
8.5解决问题
8.6自定义类型对象的输入/输出
8.7文件的输入/输出问题
8.7.1提出问题
8.7.2分析问题
8.7.3文件的打开和关闭
8.7.4解决问题
8.8举一反三
本章小结
常见错误
习题8
第9章异常处理
9.1程序中潜在的异常问题
9.1.1提出问题
9.1.2分析问题
9.2异常处理机制
9.2.1传统的异常处理方法
9.2.2系统层次异常处理的标准设施
9.3C++中的异常处理机制
9.3.1异常的抛出、检测和捕获
9.3.2解决问题
9.3.3异常在多层模块间的传递
9.3.4异常接口声明
9.3.5异常处理中析构函数的调用
9.3.6异常类的层次结构
9.4标准异常
9.5使用异常处理应注意的几个问题
9.6举一反三
本章小结
常见错误
习题9
第10章C++面向对象程序设计
10.1实用开发基础
10.1.1工程文件
10.1.2分块开发
10.2设计类和对象
10.2.1正确使用抽象
10.2.2发现对象并建立对象层
10.2.3定义数据成员和成员函数
10.2.4设计类的原则
10.2.5如何发现基类和派生类结构
10.3主函数设计
第3篇应用篇
第11章案例解析
11.1案例1数学计算
11.2案例2大学物理不确定度计算
11.3案例3STL的应用和泛型编程
11.4案例4Windows应用程序设计
11.5案例5网络编程
11.6案例6编译程序设计
附录AC++语法摘要
A.1词法规则
A.1.1标识符
A.1.2关键字
A.1.3常量
A.1.4变量
A.1.5语句
A.1.6注释
A.2数据类型
A.2.1基本数据类型
A.2.2构造数据类型
A.2.3数据类型转换
A.3运算符
A.4表达式
A.5语句
A.5.1带标号语句
A.5.2表达式语句
A.5.3复合语句
A.5.4函数调用语句
A.5.5控制语句
A.6与OOP有关的关键字
A.7与OOP有关的语法
A.7.1类的定义
A.7.2成员函数的定义
A.7.3对象
A.7.4构造函数和析构函数
A.7.5复制构造函数
A.7.6类的继承
A.7.7虚基类
A.7.8虚函数
A.8友元函数与友元类
A.9运算符重载
A.10类模板
A.11函数模板
A.12异常处理
附录BC++标准库简介
B.1标准头文件的包含
B.2标准库的组成
B.3常用标准头文件及其主要内容介绍
B.3.1泛型算法简介
B.3.2容器简介
B.3.3迭代器简介
B.3.4I/O流库简介
B.3.5string类简介
附录CVisual C++开发环境概述
C.1开发环境简介
C.2开发环境的菜单功能
C.3开发环境的工具栏
C.4项目和项目工作区
附录D调试方法简介
D.1修正语法错误
D.2设置断点
D.3启用和终止调试器
D.4控制程序运行
D.5使用QuickWatch窗口查看和修改变量的值
D.6Watch窗口的使用
D.7Variables窗口的使用
附录EC++常见错误
参考文献
ⅩⅦ