前一时期,人们编写的程序多是面向过程的,设计者必须充分地考虑到程序的每一个细节,要指定程序在每一瞬时应执行的动作。C语言是面向过程的结构化和模块化的语言,用于处理小型问题时得心应手,但在处理大型问题时就显得力不从心了。为了处理大型程序的需要,计算机科学家提出了面向对象程序设计的理论,并于20世纪末期在C语言的基础上研制出支持面向对象的C++语言,为处理大程序提供了有力的工具。
近年来,国内许多大学的计算机类专业都开设了C++程序设计课程,一些大学的非计算机专业也开设了C++面向对象程序设计课程,许多学过C语言程序设计的人也想了解和学习C++和面向对象程序设计的有关知识。但是,由于C++涉及概念很多,语法比较复杂,内容十分广泛,使不少人感到学习难度较大,难以入门。
在许多读者的要求和鼓励下,作者于2004年完成了《C++程序设计》一书的编写工作,由清华大学出版社出版并向全国发行。该书以未学过C语言的读者为对象,从面向过程入手介绍程序设计的基本知识和方法,然后介绍用C++进行面向对象程序设计的方法。该书出版后,由于概念清晰,通俗易懂,受到师生们的欢迎和好评,几年内发行了30多万册。
目前在大学理工类专业,普遍开设了C语言程序设计的课程,许多学生在学习C语言后希望对C++面向对象程序设计有所了解,以便日后在需要时能较快地进入该领域。很多师生希望我能出版一本以C语言为起点的C++教材。
为此,2006年我在清华大学出版社出版了《C++面向对象程序设计》一书。该书是在《C++程序设计》一书的基础上编写而成的。考虑到本书的读者已学习过C语言程序设计,因此不必再重新学习面向过程程序设计的部分,而直接从面向对象程序设计入手,将《C++程序设计》一书中介绍面向对象程序设计的内容抽出来改写后单独成书,并且重新写了第1章,介绍C++面向对象程序设计的初步知识以及C++对C在面向过程程序设计方面的改进与增强,为以后各章的学习打下基础。这样的安排使本书内容更集中,篇幅更紧凑。本书仍然保持了通俗易懂、贴近读者、容易入门的特点。希望有助于大学生学习C++课程,初步掌握面向对象程序设计的方法。
目录
- 第1章C++的初步知识1
- 1.1从C到C++1
- 1.2最简单的C++程序2
- 1.3C++对C的扩充8
- 1.3.1C++的输入输出8
- 1.3.2用const定义常变量11
- 1.3.3函数原型声明11
- 1.3.4函数的重载12
- 1.3.5函数模板14
- 1.3.6有默认参数的函数16
- 1.3.7变量的引用17
- 1.3.8内置函数24
- 1.3.9作用域运算符25
- 1.3.10字符串变量26
- 1.3.11动态分配/撤销内存的运算符new和delete29
- 1.3.12C++对C功能扩展的小结30
- 1.4C++程序的编写和实现31
- 1.5关于C++上机实践32
- 习题33
- 第2章类和对象的特性36
- 2.1面向对象程序设计方法概述36
- 2.1.1什么是面向对象的程序设计36
- 2.1.2面向对象程序设计的特点39
- 2.1.3类和对象的作用40
- 2.1.4面向对象的软件开发41
- 2.2类的声明和对象的定义43
- 2.2.1类和对象的关系432.2.2声明类的类型43
- 2.2.3定义对象的方法45
- 2.2.4类和结构体类型的异同47
- 2.3类的成员函数48
- 2.3.1成员函数的性质48
- 2.3.2在类外定义成员函数48
- 2.3.3内置成员函数(inline成员函数)49
- 2.3.4成员函数的存储方式51
- 2.4对象成员的引用52
- 2.4.1通过对象名和成员运算符访问对象中的成员53
- 2.4.2通过指向对象的指针访问对象中的成员53
- 2.4.3通过对象的引用来访问对象中的成员54
- 2.5类和对象的简单应用举例54
- 2.6类的封装性和信息隐蔽61
- 2.6.1公用接口与私有实现的分离61
- 2.6.2类声明和成员函数定义的分离62
- 2.6.3面向对象程序设计中的几个名词65
- 习题66
- 第3章怎样使用类和对象68
- 3.1利用构造函数对类对象进行初始化68
- 3.1.1对象的初始化68
- 3.1.2用构造函数实现数据成员的初始化69
- 3.1.3带参数的构造函数71
- 3.1.4用参数初始化表对数据成员初始化73
- 3.1.5构造函数的重载74
- 3.1.6使用默认参数的构造函数76
- 3.2利用析构函数进行清理工作79
- 3.3调用构造函数和析构函数的顺序81
- 3.4对象数组83
- 3.5对象指针85
- 3.5.1指向对象的指针85
- 3.5.2指向对象成员的指针85
- 3.5.3指向当前对象的this指针88
- 3.6共用数据的保护90
- 3.6.1常对象90
- 3.6.2常对象成员91
- 3.6.3指向对象的常指针93
- 3.6.4指向常对象的指针变量93
- 3.6.5对象的常引用96
- 3.6.6const型数据的小结97
- 3.7对象的动态建立和释放98
- 3.8对象的赋值和复制99
- 3.8.1对象的赋值99
- 3.8.2对象的复制101
- 3.9静态成员103
- 3.9.1静态数据成员104
- 3.9.2静态成员函数106
- 3.10友元109
- 3.10.1友元函数109
- 3.10.2友元类113
- 3.11类模板114
- 习题118
- 第4章对运算符进行重载122
- 4.1为什么要对运算符重载122
- 4.2对运算符重载的方法124
- 4.3重载运算符的规则127
- 4.4运算符重载函数作为类成员函数和友元函数128
- 4.5重载双目运算符132
- 4.6重载单目运算符137
- 4.7重载流插入运算符和流提取运算符139
- 4.7.1重载流插入运算符“<<”140
- 4.7.2重载流提取运算符“>>”142
- 4.8有关运算符重载的归纳144
- 4.9不同类型数据间的转换145
- 4.9.1标准类型数据间的转换145
- 4.9.2用转换构造函数进行不同类型数据的转换145
- 4.9.3类型转换函数147
- 习题153
- 第5章继承与派生154
- 5.1什么是继承与派生154
- 5.2派生类的声明方式157
- 5.3派生类的构成157
- 5.4派生类成员的访问属性159
- 5.4.1公用继承160
- 5.4.2私有继承162
- 5.4.3保护成员和保护继承165
- 5.4.4多级派生时的访问属性169
- 5.5派生类的构造函数和析构函数170
- 5.5.1简单的派生类的构造函数171
- 5.5.2有子对象的派生类的构造函数174
- 5.5.3多层派生时的构造函数177
- 5.5.4派生类构造函数的特殊形式179
- 5.5.5派生类的析构函数180
- 5.6多重继承180
- 5.6.1声明多重继承的方法181
- 5.6.2多重继承派生类的构造函数181
- 5.6.3多重继承引起的二义性问题184
- 5.6.4虚基类187
- 5.7基类与派生类的转换192
- 5.8继承与组合195
- 5.9继承在软件开发中的重要意义197
- 习题198
- 第6章多态性与虚函数203
- 6.1什么是多态性203
- 6.2一个典型的例子204
- 6.3利用虚函数实现动态多态性209
- 6.3.1虚函数的作用209
- 6.3.2静态关联与动态关联213
- 6.3.3在什么情况下应当声明虚函数215
- 6.3.4虚析构函数215
- 6.4纯虚函数与抽象类217
- 6.4.1纯虚函数217
- 6.4.2抽象类217
- 6.4.3应用实例218
- 习题225
- 第7章输入输出流226
- 7.1C++的输入和输出226
- 7.1.1输入输出的含义226
- 7.1.2C++的I/O对C的发展——类型安全和可扩展性226
- 7.1.3C++的输入输出流227
- 7.2标准输出流232
- 7.2.1cout,cerr和clog流232
- 7.2.2标准类型数据的格式输出234
- 7.2.3用流成员函数put输出字符239
- 7.3标准输入流240
- 7.3.1cin流240
- 7.3.2用于字符输入的流成员函数242
- 7.3.3istream类的其他成员函数245
- 7.4对数据文件的操作与文件流249
- 7.4.1文件的概念249
- 7.4.2文件流类与文件流对象250
- 7.4.3文件的打开与关闭251
- 7.4.4对ASCII文件的操作253
- 7.4.5对二进制文件的操作258
- 7.5字符串流264
- 习题268
- 第8章C++工具270
- 8.1异常处理270
- 8.1.1异常处理的任务270
- 8.1.2异常处理的方法271
- 8.1.3在函数声明中进行异常情况指定278
- 8.1.4在异常处理中处理析构函数279
- 8.2命名空间281
- 8.2.1为什么需要命名空间281
- 8.2.2什么是命名空间284
- 8.2.3使用命名空间解决名字冲突286
- 8.2.4使用命名空间成员的方法288
- 8.2.5无名的命名空间290
- 8.2.6标准命名空间std290
- 8.3使用早期的函数库291
- 习题292
- 附录A常用字符与ASCII代码对照表294
- 附录B运算符和结合性295
- 参考文献297
- 第14章实验安排220
- 14.1实验1C程序的运行环境和运行C程序的方法220
- 14.2实验2最简单的C程序设计——顺序程序设计222
- 14.3实验3选择结构程序设计224
- 14.4实验4循环结构程序设计225
- 14.5实验5利用数组(一)226
- 14.6实验6利用数组(二)227
- 14.7实验7函数调用(一)228
- 14.8实验8函数调用(二)229
- 14.9实验9善用指针(一)230
- 14.10实验10善用指针(二)231
- 14.11实验11使用结构体232
- 14.12实验12文件操作233
- 参考文献234