《C++教程》的内容涵盖了C++语言的基本语法、面向对象的概念和程序设计方法、数据结构基础、模板和泛型程序设计简介。对于每一个知识点,都是先给出一个简要的综述,然后通过例题来讲解。全书一共有174个例题,每个例题包括题目、主要知识点、源程序、运行结果、思考与提示几个部分。
《C++教程》是面向没有程序设计基础的读者编写的入门教材,特点是问题驱动、案例教学,适用于大学的C++程序设计课程,也可用于自学。
《C++教程》是针对零起点的读者编写的计算机程序设计入门教材,基于作者在清华大学18年的程序设计课程教学经验和教学成果,是国家精品课“面向对象的程序设计”建设成果之一 书中对于每一个知识点,都是先给出一个简要的综述,然后通过例题来讲解每个例题包括题目、主要知识点、源程序、运行结果、思考与提示几个部分书中的习题包含了很多“国家计算机等级考试二级(C++)笔试”的真题,对于检验学生的学习情况和准备相关的考试都有裨益。
C++语言是目前广泛使用的一种程序设计语言。它支持面向过程、面向对象和泛型程序设计,主要应用于面向对象的程序设计。C++语言课程是在大学里普遍开设的程序设计基础类课程。学习c++的途径大致有两种,一种是首先学习一种面向过程的语言(通常是c语言),熟悉程序设计的基础知识,然后再学习c++;另一种是,直接以c++作为程序设计的入门课程。这两种途径各有优点。
本书是面向没有程序设计基础的读者编写的入门教材,适用于大学的c++程序设计课程,也可用于自学。
从1999年开始,我在清华大学讲授c++课程,以前也出版过c++教材,还算是受欢迎的书。这些年来与各个学校的同行有过很多交流、探讨。除了我自己教的学生,还收到过大量读者的来信。师生们在教学过程中,对教材有着多种不同的需求。其中有一些教师,会抱怨讲大课的时候学生坐不下、听不进;有一些学生会抱怨老师讲得没意思、听不懂。虽然我自己授课的时候没遇到这样的情况,但是这样的情况确实是存在的。我理解不同学校的学生,学习习惯和学习兴趣可能有所差别,所以教材的编写思路和讲述形式也需要多样化,以适应不同的需求。
本书的内容涵盖了C++语言的基本语法、面向对象的概念和程序设计方法、数据结构基础、模板和泛型程序设计简介。对于每一个知识点,都是先给出一个简要的综述,然后通过例题来讲解。全书一共有174个例题,每个例题包括:题目、主要知识点、源程序、运行结果、思考与提示几个部分。书中的习题主要是选择题和填空题。这些习题中包含了很多“国家计算机等级考试二级(C++)笔试”的真题,对于检验学生的学习情况和准备相关的考试都有裨益。学生编程能力的训练主要是通过实验来完成的,本书另外配有实验指导书。
我写这本书的初衷,就是想给师生们提供一本容易教、容易学的教材:没有长篇大论的理论,以问题驱动,将概念和语法都融在例题之中;还有很多知识点是以启发式的方法,出现在例题的“思考与练习”中。这样,老师讲的时候就可以很生动,先提出问题,再介绍解决这个问题需要的概念和语法,然后讲解源程序、演示运行结果,最后对运行时的现象进行分析,巩固概念和语法,并对学生的进一步思考和练习给出提示;也可以针对“思考与练习”中的问题组织课内外的讨论。
郑莉,清华大学计算机科学与技术系副教授。本科及研究生毕业于清华大学计算机系,国家级教学团队骨干,ISO/IEC JTC1 SC36国际标准组织专家及联合编辑。教育部教育信息化技术标准委员会副秘书长;从事计算机基础课教学及软件工程、网络教育技术研究;创建了国家精品课“面向对象的程序设计”,主持863重点项目课题,作为主要起草人起草了多部信息技术国家标准。作为联合编辑起草了国际标准草案;获国家级教学成果二等奖、北京市教学成果一等奖、教育部中国高校科学技术奖一自然科学二等奖;主编了多本计算机程序设计的畅销教材。
第1章 绪论 1
1.1 C++语言的特点 1
1.2 面向对象程序设计 1
1.3 C++语言的基本符号 2
1.4 C++语言的词汇 3
1.4.1 关键字 3
1.4.2 标识符 3
1.4.3 常量 3
1.4.4 运算符 3
1.5 最简单的C++程序 4
小结 5
习题 5
第2章 简单数据及运算 7
2.1 程序中的数据 7
2.2 基本数据类型 11
2.2.1 整数类型 11
2.2.2 浮点数类型 15
2.2.3 字符类型 16
2.2.4 字符串类型 17
2.2.5 布尔类型 18
2.3 简单运算 19
2.3.1 算术运算 19
2.3.2 赋值运算 21
2.3.3 逗号运算 23
2.3.4 关系运算 23
2.3.5 逻辑运算 24
2.3.6 sizeof运算 25
2.3.7 位运算 26
2.4 语句 27
2.4.1 声明语句 28
2.4.2 表达式语句 28
2.4.3 复合语句 28
小结 28
习题 28
第3章 流程控制 30
3.1 分支结构 30
3.1.1 用if语句实现选择结构 30
3.1.2 switch语句 34
3.2 循环语句 36
3.2.1 while语句 36
3.2.2 do while语句 37
3.2.3 for语句 38
3.3 循环与选择结构的嵌套 40
3.4 break & continue语句 41
3.5 goto语句 43
小结 44
习题 44
第4章 复杂数据及运算 47
4.1 数组 47
4.1.1 一维数组的声明与使用 48
4.1.2 多维数组的声明与使用 50
4.2 指针 52
4.2.1 数据在内存中的地址 53
4.2.2 指针及指针运算 56
4.3 字符串 61
4.3.1 以数组存放C风格的字符串 61
4.3.2 string类型字符串 63
4.4 枚举类型 67
4.5 运算优先级与类型转换 68
4.5.1 运算优先级 68
4.5.2 类型转换 70
小结 71
习题 71
第5章 抽象与分类 74
5.1 面向过程的功能抽象——函数 74
5.1.1 函数的定义与调用 74
5.1.2 函数参数的单向传递 77
5.1.3 引用类型的参数 78
5.1.4 指针类型的参数 81
5.1.5 数组类型的参数 81
5.1.6 缺省参数值 84
5.1.7 省略参数 85
5.1.8 嵌套与递归调用 85
5.1.9 内联函数 87
5.1.10 函数指针 88
5.1.11 函数的重载 89
5.2 类与对象的概念 91
5.2.1 分类与抽象的思想 91
5.2.2 对象的属性与行为 91
5.3 程序中类的设计 91
5.3.1 对象属性的抽象 92
5.3.2 对象功能与行为的抽象 93
5.4 类的对象 94
5.4.1 对象的定义与初始化 94
5.4.2 对象的析构 99
5.4.3 对象数组 100
5.4.4 通过指针访问对象 103
5.4.5 以对象作为函数的参数 106
5.5 特殊的类 106
5.5.1 结构体 107
5.5.2 联合体 109
5.6 友元 111
5.6.1 友元函数 111
5.6.2 友元类 112
小结 113
习题 113
第6章 自定义类型的运算 121
6.1 用函数实现对象的运算 121
6.2 运算符重载函数 124
6.2.1 运算符重载为成员函数 125
6.2.2 运算符重载为非成员函数 127
6.3 典型运算符的重载 129
6.3.1 重载乘法运算符 129
6.3.2 重载求相反数运算符 131
6.3.3 重载相等比较运算符 133
6.3.4 重载++运算符 135
6.3.5 重载赋值运算符 138
6.3.6 重载类型转换符 142
6.3.7 重载下标访问运算符 144
小结 145
习题 145
第7章 多文件工程和编译预处理命令 150
7.1 多文件工程 150
7.2 外部变量与外部函数 152
7.3 标准C++库和命名空间 154
7.3.1 标准C++库 154
7.3.2 什么是命名空间 155
7.3.3 命名空间的定义 155
7.3.4 命名空间的使用 157
7.3.5 命名空间的嵌套 161
7.4 编译预处理 162
7.4.1 在程序中包含头文件 163
7.4.2 程序中的置换 163
7.4.3 条件预编译 165
小结 168
习题 169
第8章 类的重用 171
8.1 类的组合 171
8.1.1 类的组合的含义 171
8.1.2 类的组合实现 172
8.1.3 前向引用声明 175
8.2 类的继承 176
8.2.1 什么是继承 176
8.2.2 派生类的定义 177
8.2.3 继承成员的访问控制 179
8.2.4 派生类的构造函数和析构函数 182
8.2.5 向上转型 185
8.3 多继承与虚基类 187
8.3.1 多继承中同名隐藏和二义性问题 187
8.3.2 重复继承与虚基类 188
小结 190
习题 191
第9章 数据的共享与保护 195
9.1 变量的生存期与作用域 195
9.1.1 对象的生存期 195
9.1.2 作用域及可见性 196
9.2 同类对象间的数据共享——静态成员 199
9.2.1 静态数据成员 199
9.2.2 静态函数成员 200
9.3 共享数据的保护 202
9.3.1 常引用 202
9.3.2 常成员 203
9.3.3 常对象 206
小结 208
习题 208
第10章 多态性 213
10.1 多态性概述 213
10.2 虚函数 214
10.2.1 函数的覆盖 214
10.2.2 虚函数成员 215
10.2.3 虚析构函数 219
10.3 抽象类 221
小结 223
习题 223
第11章 输入/输出流 230
11.1 C++输入/输出流的概念 230
11.1.1 什么是输入/输出流 230
11.1.2 流类库的头文件 231
11.1.3 预定义流对象 231
11.1.4 I/O流库的类体系 231
11.1.5 输出流举例 232
11.1.6 输入流举例 233
11.2 无格式的输入/输出 234
11.2.1 无格式输入 235
11.2.2 无格式输出 236
11.3 有格式输入/输出 236
11.3.1 默认的输入/输出格式 236
11.3.2 格式标志的设置 237
11.3.3 格式控制操纵符 238
11.4 I/O流的状态 248
11.5 文件流 249
11.5.1 文件的概念 250
11.5.2 文件流的建立 250
11.5.3 文件流的关闭 251
11.5.4 两种特殊的文件流 251
11.6 字符串流 253
11.6.1 字符串流的建立 253
11.6.2 字符串流的缓冲区操作 254
11.7 针对自定义类型重载和 255
小结 257
习题 257
第12章 容错及异常处理基础 260
12.1 异常处理的基本思想 260
12.2 抛出异常 261
12.3 捕获异常 263
12.4 异常对象 266
12.5 标准程序库异常处理 267
12.6 异常规范 269
小结 270
习题 270
第13章 数据结构简介 273
13.1 线性群体 273
13.1.1 线性群体的概念 273
13.1.2 直接存取群体——数组 274
13.1.3 顺序存取群体——链表 277
13.1.4 栈 286
13.1.5 队列 288
13.2 群体数据的组织 290
13.2.1 顺序查找 290
13.2.2 折半查找 291
13.2.3 插入排序 293
13.2.4 选择排序 294
13.2.5 交换排序 295
小结 297
习题 297
第14章 模板简介 301
14.1 函数模板 301
14.1.1 函数模板的定义和实例化 301
14.1.2 模板实参的使用 304
14.1.3 模板的常规参数 306
14.2 类模板 307
14.3 类模板与继承 310
小结 312
习题 312
第15章 泛型程序设计与C++ STL简介 319
15.1 泛型程序设计的概念和术语 319
15.1.1 泛型程序设计 319
15.1.2 STL的相关概念和术语 320
15.2 C++ STL中的容器 322
15.2.1 顺序容器 322
15.2.2 关联容器 333
15.2.3 容器适配器 335
15.3 迭代器 338
15.3.1 迭代器的分类 339
15.3.2 迭代器适配器 341
15.3.3 迭代器相关的辅助函数 341
15.4 标准C++库中的算法简介 342
15.4.1 非可变序列算法 343
15.4.2 可变序列算法 345
15.4.3 排序及相关算法 348
15.4.4 数值算法 350
15.5 函数对象 351
15.5.1 函数对象 351
15.5.2 函数适配器 351
小结 352
习题 352
本节的例题以数值型(整数、实数)的数据为例,介绍了常量与变量的概念和使用方法。这样的概念和使用方法也同样适用于其他类型的数据,比如字符数据。其实程序中的“Please enter theradius!\n”就是字符串常量。2.2节将详细介绍各种不同的数据类型。
2.2 基本数据类型
程序需要处理的数据,具有很多不同的类型,有简单的,也有复杂的。不同类型的数据在内存中的存放形式也不一样,那么在程序中如何规范地存放和使用数据呢?这就是对数据类型的规定。程序中的数据类型,是对现实世界中的数据类型的一种模拟。例如,整数、实数、字符这些数据类型,在c++程序中都有对应的类型。对于这些比较简单的数据类型,c++语言通过基本数据类型来模拟。这些基本类型在内存中的存储形式以及它们的运算规则,是c++语言预定义的,我们在程序中可以直接使用。一些稍微复杂的数据,可以由基本类型简单复合而成。而对于各种对象的模拟,就不仅需要详细定义其数据,还需要定义处理数据的方法。
在这一章里,我们仅仅介绍c++的基本数据类型,第4章将介绍复杂数据类型,第5章将介绍类的定义。
数据可以依其本身的特点进行分类。C++预定义的基本数据类型可以用来表示整数(如int)、浮点数(如double)、字符(如char)和布尔类型(bool)。
2.2.1整数类型
c++的整数类型有多种形式,读者可以根据数据的特点选择最合适的形式使用。基本整数类型是int类型,按符号可以分为有符号的(signed)和无符号的(unsigned)两类;按照数据范围大小,又可以分成短整数(short)和长整数(10ng),用于存放字符数据的char类型实质上也是整数类型。