C++是一种高效实用的程序设计语言,它既可进行过程化程序设计,也可进行面向对象程序设计,因而成为编程人员最广泛使用的工具。学好C++,很容易触类旁通其他软件,C++架起了通向强大、易用、真正的软件开发应用的桥梁。许多高等院校已经开设了C++程序设计语言课,急需一本实用的教材。本书是作者总结两年教学实践的经验写成的,适合用作大学计算机专业和非计算机专业的程序设计基础课程教材,也可供自学的读者使用。
本书共分两大部分。第一部分,第1章至第10章是基础部分,主要介绍C++程序设计语言、程序结构和过程化基础。第二部分,第11章至第21章,是面向对象程序设计部分,它建立在C++程序设计基础之上,讲述了面向对象程序设计方法。
前言
C++是一门高效实用的程序设计语言,它既可进行过程化程序设计,也可进行面向对象程序设计。C++语言强调对高级抽象的支持。C++实现了类的封装、数据隐藏、继承及多态,使得其代码容易维护及高度可重用。随着C++渐渐成为ANSI标准,这种新的面向对象程序设计语言迅速成为程序员最广泛使用的工具。几乎在所有计算机研究和应用领域,都能看到C++的影子。
C++从C进化而来,是C语言的超集。C++在程序结构的本质上与C是一致的,都是用函数驱动机制实现。学过C语言,再来看C++,就会感到C++更简单和容易理解。过程化程序设计与面向对象程序设计之间并无水火不容的矛盾,面向对象程序设计是过程化程序设计的自然升华。
本书对于学过或没有学过C语言的读者都是适用的。如果学过ANSI C,则可以跳过第一部分的程序设计基础,直接阅读第二部分。在学习第二部分时,遇到某些概念不清之处,可以根据章节目录查阅第一部分的有关内容。本书配备有《C++习题解答》,这对自学者尤为方便。
本书适合做大学计算机专业和非计算机专业的程序设计基础课程教材。通过本书可达到以下三个培养目标:
1. 程序设计入门,领略什么是面向对象程序设计;
2. 掌握程序设计方法,领会面向对象程序设计;
3. 把握C++程序设计的灵魂,掌握面向对象程序设计的方法。
纵观当前,C++的发展领导了程序设计语言的潮流,大有取代其他程序语言之趋势。在教学上,它以其面向对象的特征和严密的类型系统而正在悄无声息地取代Pascal; 在科学计算功能上,它比Fortran更为可靠和方便; 在系统软件的研究开发上,它又是上选的语种; 在小规模控制应用上,C++的效率比之C毫不逊色; 在大规模应用软件开发上,以Windows环境为代表的C++类库以及组件(组合类库)在迅速发展,它的触角触及各个领域。
C++编译器以Borland C++和Visual C++为典型,其版本在激烈的竞争中快速更新。那些老版本,如Microsoft C和Tubor C已经很少为人所用。即使学习C语言的人们目前也多在C++的编译环境中上机操作与调试。计算机等级考试的程序设计要求也在补充和更新。这就是C++不久即将取代C的无可抗拒的趋势与事实。C++作为程序设计基础教学也将以强有力的态势迅速取代C语言。
C++程序的集成开发器如Borland C++和Visual C++(2.0以下版),作为软件开发工具,已经不再时髦。Borland C++将不再有新版本,Borland公司的C++Builder将取代现在的Borland C++,就像当初Borland C++取代Tubor C一样。软件开发进入了可视化程序开发环境的时代。
一方面是陈旧的软件开发工具在淘汰,另一方面是新的软件开发工具在崛起。作者竭力推崇新的软件开发工具BC++Builder 4.0和Visual C++6.0,因为它们不但是优秀的可视化开发工具,而且由于它们是基于C++的,可以充分发挥C++语言强大灵活的特点,用面向对象程序设计方法去阅读、理解、思考和分析、设计以及编程。
学好C++,很容易触类旁通其他软件,如基于Java语言的Visual J++和J++Builder,而且像ActiveX SDK和DirectX SDK等都是C++形式的。C++架起了通向强大、易用、真正的软件开发应用的桥梁。计算机发展到今天,培养一个具有相当的应用软件开发能力的人才,已经不需要很长的周期了。这给每个人都带来了最好的机遇和最大的挑战。我们的战略是,大学一年级学习C++课程,大学二年级,在适当的指导下就可学习如C++Builder和Visual C++这些快速应用程序开发工具了。这意味着计算机专业的学生,大学二年级就可以冲向计算机应用的前沿,以此与计算机其他课程的学习相辅相成。非计算机专业的学生,同样也可以在应用开发的实践中找到自己的位置。
学程序设计,不仅要在运用程序设计的思想上获得一个大的突破,也应在运用程序设计的开发工具上走向真正的实用。这才是真正的理论联系实际,而且是事半功倍的学习方法。
本书分为两大部分。第一部分,第1章至第10章,是基础部分,主要介绍C++程序设计语言,程序结构和过程化基础。第二部分,第11章至第21章,是面向对象程序设计部分,它建立在C++程序设计基础之上,讲述了面向对象程序设计的方法。
本书内容特点
1. 强化重要概念函数: 函数是理解C/C++语言的重要基础。在书中作了较多的描述。
程序结构: 程序结构的理解与实践是从C++语言的学习跨向实际应用的关键。作者在这方面也注入了较多的笔墨。
指针: 指针是理解各种C++语言现象的关键,透过指针能够更好地理解语言的表达和程序的工作。这本书对指针重点展开介绍。
链表: 链表是数据结构的基础,也是软件设计的重要技术。作者强调链表实现技术,是想从根本上让读者领会程序设计的技术性和艺术性。
引用: 引用是C++特有的,C++面向对象的程序能够被人阅读理解,引用起了很大的作用。本书专辟一章讲述。
类: 类是面向对象程序设计的首要概念。书中从第11章起,不停地描述类类型机制和面向对象程序设计的各项内容。
继承与虚函数: 继承与虚函数是C++实现类的多态性的机制。它因而也是面向对象程序设计的关键之一。理解继承与虚函数能使读者从整体上把握面向对象程序设计的方法,从而走向真正的实用。
2. 舍弃次要内容
联合与位域: 本书只介绍结构而不介绍联合和位域,是考虑到这些内容相对整个程序设计的功能来说已经退化。
多级指针: 书中只介绍多级指针的概念(多维数组也如此),而不具体展开。
考虑到篇幅不讲成员指针: 在《C++习题解答》中,有对成员指针的介绍,作为本书的补充。
3. 不求面面俱到,但求通俗易懂
本书不是语法参考书,是自成体系的C++教科书。它的目的是让读者通过自学或在老师讲授下,能够运用C++语言的基本要素,进行基本的结构化程序设计和面向对象的程序设计。因此全书紧紧围绕着如何进行程序设计而展开。前半部分,讲述C++程序设计基础,在此基础之上,后半部分,介绍面向对象程序设计的具体方法。
4. 以C作为背景
本书讲述的内容以ANSI C++为标准。书中出现的C内容是C++的参照。如关于C库函数printf和scanf,出现在与C++流作比较的场合,库函数malloc和free出现在与C++的new和delete作比较的场合。另外,还有C中的结构与C++中的结构之差异,C中的函数名与C++中的函数名之差异等。
考虑到准备参加C语言等级考试的读者,我们在书中对C的数学和字符串操作库函数作了适当的介绍。
本书编排特点
每章首均引出本章将要讲述的内容和学习要求。
在每章结束时,都做了小结,给出本章内容的概括性描述,指出本章在全书中的重要程度,并且指导学生进一步学习有关内容。
每章末安排的习题都是操作性习题,能通过上机加以验证。
书中遇有在理解上特别重要的内容用黑体标记。
与本书章节内容紧密联系的一些概念和说明用→引导,另起编段。
本书的各章与《C++习题解答》中的各章一一对应。教程中没有写进去的内容有些在习题解答中得到了补充。教程中的习题有些在习题解答中有类似的题解。
本书强调程序的可读性。使用统一的程序设计风格,并希望读者自始至终地模仿。
本书强调程序的可移植性。不以某个C++编译器为标准,而以最新的ANSI C++标准为编书标准。程序中的编译错误,一般用Borland C++(简称BC)中的出错信息给出。有些BC中的警告在Visual C++(简称VC)中是编译错误或反之,则同时也给出VC的出错信息。
本书中包含了大量的程序例子,并附有运行结果。凡在程序开头带有程序名编号的,都是完整的程序,它们经过了上机调试,可以直接在计算机上编译运行。运行结果中,如果是手工键入的字符,则用下划线表示。
本书中所有编号的程序,读者可到网站http://www.tup.com.cn上下载。
大学C++程序设计基础教学尚在起步,教学方法、手段和形式还在摸索中。本教材难免有不足之处,我们诚恳期待读者的批评指正和建议,以供再版时参考,使本书日臻完善。作者的电子邮件地址: qianneng@mail.hz.zj.cn
通信地址: 杭州市德胜新村12幢1单元101室(邮编310014)
目录
第一部分C++过程化语言基础
第1章C++入门
1.1从C到C++
1.2程序与语言
1.3结构化程序设计
1.4面向对象程序设计
1.5程序开发过程
1.6最简单的程序
1.7函数
小结
第2章基本数据类型与输入输出
2.1字符集与保留字
2.2基本数据类型
2.3变量定义
2.4字面量
2.5常量
2.6I/O流控制
2.7printf与scanf
小结
练习
第3章表达式和语句
3.1表达式
3.2算术运算和赋值
3.3算术类型转换
3.4增量和减量
3.5关系与逻辑运算
3.6if语句
3.7条件运算符
3.8逗号表达式
3.9求值次序与副作用
小结
练习
第4章过程化语句
4.1while语句
4.2do...while语句
4.3for语句
4.4switch语句
4.5转向语句
4.6过程应用: 求π
4.7过程应用: 判明素数
4.8过程应用: 求积分
小结
练习
第5章函数
5.1函数概述
5.2函数原型
5.3全局变量与局部变量
5.4函数调用机制
5.5静态局部变量
5.6递归函数
5.7内联函数
5.8重载函数
5.9默认参数的函数
小结
练习
第6章程序结构
6.1外部存储类型
6.2静态存储类型
6.3作用域
6.4可见性
6.5生命期
6.6头文件
6.7多文件结构
6.8编译预处理
小结
练习第7章数组
7.1数组定义
7.2访问数组元素
7.3初始化数组
7.4向函数传递数组
7.5二维数组
7.6数组应用: 排序
7.7数组应用: Josephus问题
7.8数组应用: 矩阵乘法
小结
练习
第8章指针
8.1指针概念
8.2指针运算
8.3指针与数组
8.4堆内存分配
8.5const指针
8.6指针与函数
8.7字符指针
8.8指针数组
8.9命令行参数
8.10函数指针
小结
练习
第9章引用
9.1引用的概念
9.2引用的操作
9.3什么能被引用
9.4用引用传递函数参数
9.5返回多个值
9.6用引用返回值
9.7函数调用作为左值
9.8用const限定引用
9.9返回堆中变量的引用
小结
练习
第10章结构
10.1结构概述
10.2结构与指针
10.3结构与数组
10.4传递结构参数
10.5返回结构
10.6链表结构
10.7创建与遍历链表
10.8删除链表结点
10.9插入链表结点
10.10结构应用: Josephus问题
小结
练习
第二部分面向对象程序设计
第11章类
11.1从结构到类
11.2软件方法的发展必然
11.3定义成员函数
11.4调用成员函数
11.5保护成员
11.6屏蔽类的内部实现
11.7再论程序结构
小结
练习
第12章构造函数
12.1类与对象
12.2构造函数的需要性
12.3构造函数的使用
12.4析构函数
12.5带参数的构造函数
12.6重载构造函数
12.7默认构造函数
12.8类成员初始化的困惑
12.9构造类成员
12.10构造对象的顺序
小结
练习
第13章面向对象程序设计
13.1抽象
13.2分类
13.3设计和效率
13.4讨论Josephus问题
13.5结构化方法
13.6结构化方法的实现
13.7面向对象方法
13.8面向对象方法的实现
13.9程序维护
小结
练习
第14章堆与拷贝构造函数
14.1关于堆
14.2需要new和delete的原因
14.3分配堆对象
14.4拷贝构造函数
14.5默认拷贝构造函数
14.6浅拷贝与深拷贝
14.7临时对象
14.8无名对象
14.9构造函数用于类型转换
小结
练习
第15章静态成员与友元
15.1静态成员的需要性
15.2静态成员的使用
15.3静态数据成员
15.4静态成员函数
15.5需要友元的原因
15.6友元的使用
小结
练习
第16章继承
16.1继承的概念
16.2继承的工作方式
16.3派生类的构造
16.4继承与组合
16.5多态性
16.6多态的思考方式
16.7多态性如何工作
16.8不恰当的虚函数
16.9虚函数的限制
16.10类的冗余
16.11克服冗余带来的问题
16.12类的分解
16.13抽象类
16.14由抽象类派生具体类
16.15纯虚函数的需要性
小结
练习
第17章多重继承
17.1多继承如何工作
17.2继承的模糊性
17.3虚拟继承
17.4多继承的构造顺序
17.5继承的访问控制
17.6保护继承与私有继承
小结
练习
第18章运算符重载
18.1运算符重载的需要性
18.2如何重载运算符
18.3值返回与引用返回
18.4运算符作成员函数
18.5重载增量运算符
18.6转换运算符
18.7赋值运算符
小结
练习第19章I/O流
19.1printf和scanf的缺陷
19.2I/O标准流类
19.3文件流类
19.4串流类
19.5控制符
19.6使用I/O成员函数
19.7重载插入运算符
19.8插入运算符与虚函数
19.9文件操作
小结
练习
第20章模板
20.1模板的概念
20.2为什么要用模板
20.3函数模板
20.4重载模板函数
20.5类模板的定义
20.6使用类模板
20.7使用标准模板类库: Josephus问题
小结
练习
第21章异常处理
21.1异常的概念
21.2异常的基本思想
21.3异常的实现
21.4异常的规则
21.5多路捕捉
21.6异常处理机制
21.7使用异常的方法
小结
练习
参考文献