《C++程序设计》简明讲义* 潘建瑜 华东师范大学·数学科学学院 2023年9月 又供课堂数学便 本讲义仅供课堂教学使用 ttps://math.ecnu.edu.cn/~jypar
《C++ 程序设计》简明讲义* 潘建瑜 华东师范大学 • 数学科学学院 2023 年 9 月 *本讲义仅供课堂教学使用 https://math.ecnu.edu.cn/~jypan 仅供课堂教学使用,请勿外传
目录 第一讲计算机基础 11信息的表示与存储。. 1.1.1计算机的数字系统 1.1.2 常见的数制及它们之间的转换,········ 1.13 一讲制数的绵码表示 3 1.2算法 4 1.2.1什么是算法 4 12.2 算法的特征与评价 4 1.2.3算法的描述方法与基本控制结构 5 5 14果后练习 6 第二讲C+编程基础 7 2.1C++语言概述 7 2.1.1 C+源程序结构 8 2.1.2C++源程序书写规范 8 2.1.3 程序编译 9 2.2C+基础知识. 9 2.2.1 C+字符集,标识符,关键字 9 2.2.2C++数据类型 2.2.3 变量与常量 2.2.4 typedef与枚举 13 2.2.5 2.2.6常用数学函数 16 23C+简单输入输出. 7 2.3.1输入输出语句 24程序示例 伊 第三讲选择与循环 20 3.1 关系运算与逻辑运算 20 3.2选择结构. 21 3.2.1F语句 21
目 录 第一讲 计算机基础 1 1.1 信息的表示与存储 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.1 计算机的数字系统 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.2 常见的数制及它们之间的转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.3 二进制数的编码表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.1 什么是算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.2 算法的特征与评价 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.3 算法的描述方法与基本控制结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 课后阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.4 课后练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 第二讲 C++ 编程基础 7 2.1 C++ 语言概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.1.1 C++ 源程序结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.2 C++ 源程序书写规范 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.3 程序编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2 C++ 基础知识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.1 C++ 字符集, 标识符, 关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.2 C++ 数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.3 变量与常量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2.4 typedef 与枚举 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2.5 运算与表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2.6 常用数学函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.3 C++ 简单输入输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.3.1 输入输出语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.3.2 操纵符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.4 程序示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.5 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 第三讲 选择与循环 20 3.1 关系运算与逻辑运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.2 选择结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.2.1 IF 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 iii 仅供课堂教学使用,请勿外传
.iv. 目录 3.2.2 SWITCH结构 22 3.3循环结构 3.3.1WHLE循环. 3 332 DO WHILE循环 3.3.3FOR循环. 23 33.4 循环的非正常终止 3.4程序示例 25 3.5应用:定积分的数值计算 3.6上机练习.. 第四讲函数 4.1函数的声明、定义与调用 4.2函数间的参数传递 31 43内联函数,., 3 4.4函数嵌套与递归 32 45数据的作用域 4.6形参带缺省值 35 47函数重 4.8 预编译处理与多文件结构 36 4.9应用:蒙特卡罗算法 4.10上机练习 39 第五讲数组 5.1一维数组 42 5.2 二维数组 43 53数组作为承数参数 5.4字符(字符数组)】 子 5.5上机练习····· 第六讲指针 0 61指针的定义与运算 50 6.2指针与一维数组 52 63指针与二维数组, 53 6.4行指针与二级指针 54 6.4.1行指针 5 6.4.2二级指针 54 6.5指针与引用. 6.6指针与函数 55 67特久动春内军分配 5 68 应用:矩阵乘积的快速算法··· 57 6.9应用:Gauss消去法求解线性方程组 http://math.ecnu.edu.cn/-jypan
· iv · 目 录 3.2.2 SWITCH 结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.3 循环结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.3.1 WHILE 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.3.2 DO WHILE 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.3 FOR 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.4 循环的非正常终止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.4 程序示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.5 应用: 定积分的数值计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.6 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 第四讲 函数 28 4.1 函数的声明、定义与调用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.2 函数间的参数传递 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.3 内联函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.4 函数嵌套与递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.5 数据的作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.6 形参带缺省值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.7 函数重载 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.8 预编译处理与多文件结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.9 应用: 蒙特卡罗算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.10 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 第五讲 数组 42 5.1 一维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.2 二维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.3 数组作为函数参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 5.4 字符串(字符数组) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.5 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 第六讲 指针 50 6.1 指针的定义与运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 6.2 指针与一维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 6.3 指针与二维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 6.4 行指针与二级指针 ∗ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6.4.1 行指针 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6.4.2 二级指针 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6.5 指针与引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 6.6 指针与函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 6.7 持久动态内存分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 6.8 应用: 矩阵乘积的快速算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 6.9 应用: Gauss 消去法求解线性方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 http://math.ecnu.edu.cn/~jypan 仅供课堂教学使用,请勿外传
目录 6.10上机练习 第七讲简单输入输出 60 7.1C+基本输入输出(WO)流 60 61 7.3C语言文件读写 7.3.1 文件的打开和关闭 62 7.3.2 文本文件的读写 7.3.3 二进制文件的读写 63 7.3.4其他文件操作作 6 7.4上机练习 第八讲排序算法及其C+实现 66 8.1引言 66 8.2选择排序 67 8.3插入排序 67 8.4希尔排字 67 8.5冒泡排序 68 8.6快速排序 8.7上机练习 69 第九讲类与对象基础1 71 9.1为什么面向对象 71 9.2类和对象基本操作 72 93构浩函数, 9.4复制构造函数 9.5匿名对象. 9.6类与对象举例:游泳池 78 9.7析构函数····· 9.8 上机练习 79 第十讲类与对象基础Ⅱ 81 10.1类的组合,. 81 10.2结构体与联合体 83 10.3类作用域 10.4静态成员 84 10.5友元关系 10.6类的UML描述 86 10.7上机练习. 第十一讲类与对象基础Ⅲ 11.1常对象与常成员 http://math.ecnu.edu.cn/-jypan
目 录 · v · 6.10 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 第七讲 简单输入输出 60 7.1 C++ 基本输入输出 (I/O) 流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 7.2 C 语言格式化输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 7.3 C 语言文件读写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 7.3.1 文件的打开和关闭 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 7.3.2 文本文件的读写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 7.3.3 二进制文件的读写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 7.3.4 其他文件操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 7.4 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 第八讲 排序算法及其 C++ 实现 66 8.1 引言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 8.2 选择排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 8.3 插入排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 8.4 希尔排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 8.5 冒泡排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 8.6 快速排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 8.7 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 第九讲 类与对象基础 I 71 9.1 为什么面向对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 9.2 类和对象基本操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 9.3 构造函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 9.4 复制构造函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 9.5 匿名对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 9.6 类与对象举例: 游泳池 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 9.7 析构函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 9.8 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 第十讲 类与对象基础 II 81 10.1 类的组合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 10.2 结构体与联合体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 10.3 类作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 10.4 静态成员 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 10.5 友元关系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 10.6 类的 UML 描述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 10.7 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 第十一讲 类与对象基础 III 88 11.1 常对象与常成员 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 http://math.ecnu.edu.cn/~jypan 仅供课堂教学使用,请勿外传
i 目录 11.2对象数组与对象指针 89 113动态对象 91 1l.4向量类:vector. 91 1l.5字符串类:string.· 11.5.1字符串匹配算法· 96 11.6上机练习 第十二讲运算符重载与自动类型转换 99 12.1为什么要重载运算符 99 12.2怎么实现运算符重载 100 123运算符重载:成员函数方式」 100 12.4运算符重载:非成员函数方式 101 12.5成员函数or非成员函数g 102 12.6左值与运算符「1的重载 102 12.7自动类型转换 103 12.8上机练习 104 第十三讲继承与派生 105 13.1继承与派生· 105 13.2派生类的定义 105 13.3派生类构造函数 107 134派生类新增成员与父类成员同名问题 108 13.5派生类的复制构造函数 108 13.6派生类的析构函数 108 13.7类型兼容规则 108 13.8虚父类…………… 109 139上机练习。···… 110 第十四讲多态 111 14.1什么是多态 111 14.2虚函数 111 14.3纯虚函数与抽象类 113 14.3.1纯虚函数 113 14.3.2抽象类 113 14.3.3举例 113 14.4模板 113 14.5模板函数 I 14.6模板类 115 14.7上机练习... 116 第十五讲文件流与输出输人重载 117 http://math.ecnu.edu.cn/~-jypan
· vi · 目 录 11.2 对象数组与对象指针 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 11.3 动态对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 11.4 向量类: vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 11.5 字符串类: string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 11.5.1 字符串匹配算法 ∗ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 11.6 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 第十二讲 运算符重载与自动类型转换 99 12.1 为什么要重载运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 12.2 怎么实现运算符重载 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 12.3 运算符重载: 成员函数方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 12.4 运算符重载: 非成员函数方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 12.5 成员函数 or 非成员函数? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 12.6 左值与运算符 [] 的重载 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 12.7 自动类型转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 12.8 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 第十三讲 继承与派生 105 13.1 继承与派生 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 13.2 派生类的定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 13.3 派生类构造函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 13.4 派生类新增成员与父类成员同名问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 13.5 派生类的复制构造函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 13.6 派生类的析构函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 13.7 类型兼容规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 13.8 虚父类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 13.9 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 第十四讲 多态 111 14.1 什么是多态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 14.2 虚函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 14.3 纯虚函数与抽象类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 14.3.1 纯虚函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 14.3.2 抽象类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 14.3.3 举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 14.4 模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 14.5 模板函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 14.6 模板类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 14.7 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 第十五讲 文件流与输出输入重载 117 http://math.ecnu.edu.cn/~jypan 仅供课堂教学使用,请勿外传