已阅读5页,还剩136页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖北大学数计学院计科系朱明 1 141 2020年1月5日星期日10时44分8秒 OOP C 程序设计 湖北大学数计学院计科系朱明 2 141 2020年1月5日星期日10时44分8秒 总目录 第1章C 的初步知识第2章类和对象第3章关于类和对象的进一步讨论第4章运算符重载第5章继承与派生第6章多态性与虚函数第7章输入输出流第8章C 工具 湖北大学数计学院计科系朱明 3 141 2020年1月5日星期日10时44分8秒 教材 谭浩强 C 面向对象程序设计 第1版 清华大学出版社 2006 1 湖北大学数计学院计科系朱明 4 141 2020年1月5日星期日10时44分8秒 参考书 BjarneStroustrup著 C 程序设计语言 特别版 机械工业出版社 2002曹计昌等著 C 语言及面向对象程序设计 高等教育出版社 2004钱能 C 程序设计教程 第1版 清华大学出版社 2002 湖北大学数计学院计科系朱明 5 141 2020年1月5日星期日10时44分8秒 第1章C 的初步知识 1 1从C到C 1 2最简单的C 程序1 3C 对C的扩充1 4C 程序的编写和实现1 5关于C 上机实践 湖北大学数计学院计科系朱明 6 141 2020年1月5日星期日10时44分8秒 1 1从C到C 计算机诞生初期 人们要使用计算机必须用机器语言或汇编语言编写程序 世界上第一种计算机高级语言诞生于1954年 它是FORTRAN语言 先后出现了多种计算机高级语言 其中使用最广泛 影响最大的当推BASIC语言和C语言 BASIC语言是1964年在FORTRAN语言的基础上简化而成的 它是为初学者设计的小型解释型高级语言 湖北大学数计学院计科系朱明 7 141 2020年1月5日星期日10时44分8秒 C语言是1972年由美国贝尔实验室的D M Ritchie研制成功的 它不是为初学者设计的 而是为计算机专业人员设计的 大多数系统软件和许多应用软件都是用C语言编写的 C语言的特点语言简洁紧凑 使用灵活方便 C语言只有32个关键字 程序书写形式自由 丰富的运算符和数据类型 C语言可以直接访问内存地址 能进行位操作 使其能够胜任开发操作系统的工作 生成的目标代码质量高 程序运行效率高 可移植性好 湖北大学数计学院计科系朱明 8 141 2020年1月5日星期日10时44分8秒 C语言的局限性类型检查机制相对较弱 使得程序中的一些错误无法在编译时发现 以此为代价保证程序运行的高效率 对程序员要求高 没有支持代码重用的语言结构 当程序的规模达到一定程度时 程序员很难控制程序的复杂性 如C语言在编译时对数组下标越界不作检查 对输入输出也不作类型检查 湖北大学数计学院计科系朱明 9 141 2020年1月5日星期日10时44分8秒 随着软件规模的增大 用C语言编写程序渐渐显得有些吃力了 C 是由AT TBell 贝尔 实验室的BjarneStroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的 C 保留了C语言原有的全部特征 属性和优点 增加了面向对象 OO 的机制 其目的是提高大型软件的开发效率 学习C 既要会利用C 进行面向过程的结构化程序设计 也要会利用C 进行面向对象的程序设计 两者互为补充 并不矛盾 湖北大学数计学院计科系朱明 10 141 2020年1月5日星期日10时44分8秒 include 包含头文件iostreamusingnamespacestd 使用命名空间stdintmain cout ThisisaC program return0 Exg1 1 cpp 1of1 输出一行字符 ThisisaC program 运行结果 ThisisaC program 1 2最简单的C 程序 主函数 cout 输出流对象 提取运算符 当遇到多个 时 从左往右依次进行 而非同时进行 本应是按位左移 右移运算符 但在iostream h头文件中被重载为基本数据类型数据的插入运算符和提取运算符 函数返回 输入输出流 C 标准中规定其返回类型为int型 且正常结束返回0值 否则返回 1值 但在现有的一些C 编译器中写成void型也能通过编译 其原因是在做编译器的过程中 出于多种考虑 如软件开发成本 软件使用时的灵活性 软件执行效率等因素 对C 标准的执行程度不够彻底 类似的问题 即C 标准和编译器之间的出入还有很多 大家可以慢慢体会 注 C语言不要求main函数一定是int型 一般用void型 cplusplus 湖北大学数计学院计科系朱明 11 141 2020年1月5日星期日10时44分8秒 预处理命令 包含命令 两种写法 1 include2 includeusingnamespacestd 由于这类文件都放在程序单元的开头 所以称为 头文件 headfile 在程序进行编译时 先对所有的预处理命令进行处理 将头文件的具体内容代替 include命令行 然后再对该程序单元进行整体编译 C 所有语句都以分号 结尾 而预处理命令不是语句 故末尾无分号 其中 1是C语言中的写法 2是标准C 即ANSIC 中的写法 其原因在于C语言中无 命名空间 的概念 即C中只能用1 而C 中可用1和2 湖北大学数计学院计科系朱明 12 141 2020年1月5日星期日10时44分8秒 命名空间 namespace usingnamespacestd 表示使用命名空间std C 标准库中的类和函数是在命名空间std中声明的 因此程序中如果需要用到C 标准库 此时就需要用 include命令行 时 就需要用 usingnamespacestd 作声明 表示要用到命名空间std中的内容 详见第8章 湖北大学数计学院计科系朱明 13 141 2020年1月5日星期日10时44分8秒 主函数 main函数 C 程序是函数驱动的 即C 程序是由函数组成的 按其地位划分 可分为主函数 main函数 和普通函数 功能函数 C 规定 每个C 程序都有且只有一个main函数 每个C 程序的运行都从main函数开始 到main函数结束 即普通函数间可相互调用 而main函数只能是主调函数 调用函数 它由操作系统调用 最后返回操作系统 湖北大学数计学院计科系朱明 14 141 2020年1月5日星期日10时44分8秒 输入输出流C中用printf scanf等文件操作来完成数据的输入输出 不同于C C 中引入了流的概念 C 的输入输出流是指由若干字节组成的字节序列 这些字节中的数据按顺序从一个对象传送到另一对象 流表示了信息从源到目的端的流动 这一举措既保证了I 0操作的类型安全 typesafe 又实现了I 0操作的可扩展性 从而提高了软件的复用性 当然 为此付出的代价是C 的I 0系统变得复杂 比较难于掌握 详见第7章 湖北大学数计学院计科系朱明 15 141 2020年1月5日星期日10时44分8秒 函数调用与返回若函数f1 调用函数f2 则称f1 为主调函数 f2 为被调函数 函数f2 执行完成后须返回函数f1 调用处继续执行 函数执行完成后 其返回值由return带回 return 返回值 返回值的类型须和函数定义时的数据类型匹配 在C 中 表示一个函数时 即使无参 也应带上括号 即括号不可省 注意 并非一致 此处括号可省 湖北大学数计学院计科系朱明 16 141 2020年1月5日星期日10时44分8秒 求两数之和 本行是注释行 include 预处理命令usingnamespacestd 使用命名空间stdintmain 主函数首部 函数体开始inta b sum 定义变量cin a b 输入语句sum a b 赋值语句cout a b sum endl 输出语句return0 程序正常结束 向操作系统返回一个零值 函数结束 Exg1 2 cpp 1of1 求a和b两个数之和 运行结果 123456 a b 579 换行 endline的缩写 注意 两个数据中间用空格作间隔 此处不能用其他符号间隔 湖北大学数计学院计科系朱明 17 141 2020年1月5日星期日10时44分8秒 关于注释 顾名思义 注释部分只是起到对原程序行的解释说明作用 而本身并不参与编译 C 忽略注释 并把每个注释都视为一个空格 所谓 勤笔免思 在程序适当的地方加上的注释是良好的编程习惯 使得程序功能一目了然 省去了很多不必要的麻烦 降低了维护的成本 是程序员应该注重的一个环节 两种注释方法 C中用 和 将需要注释的部分括起来 可跨行 C 中既可沿用C中的注释方法 也可用 提启某行注释内容 只限于单行 类似地 虽然C 在程序书写格式上不作限制 但一个C 程序员一开始也应该养成一个良好的习惯 采取缩进对齐的编程风格 湖北大学数计学院计科系朱明 18 141 2020年1月5日星期日10时44分8秒 include 预处理命令usingnamespacestd intmax intx inty 定义max函数 函数值为整型 形式参数x y为整型 max函数体开始intz 变量声明 定义本函数中用到的变量z为整型if x y z x if语句 如果x y 则将x的值赋给zelsez y 否则 将y的值赋给zreturn z 将z的值返回 通过max带回调用处 max函数结束 Exg1 3 cpp 1of2 湖北大学数计学院计科系朱明 19 141 2020年1月5日星期日10时44分8秒 intmain 主函数 主函数体开始inta b m 变量声明cin a b 输入变量a和b的值m max a b 调用max函数 将得到的值赋给mcout max m n 输出大数m的值return0 程序正常结束 向操作系统返回一个零值 Exg1 3 cpp 2of2 给两个数x和y 求两数中的大者 运行结果 1825 max 25 编译是由上至下进行的 max函数出现在main函数之前 因此在main函数中调用max函数时 编译系统能识别max是已定义的函数名 如果把两个函数的位置对换一下 即先写main函数 后写max函数 这时在main函数中遇到max函数的调用时 编译系统无法知道max代表什么含义 因而无法编译 按出错处理 为此 即被调函数出现在主调函数之后时 需进行函数声明 换行 转义字符 湖北大学数计学院计科系朱明 20 141 2020年1月5日星期日10时44分8秒 includeusingnamespacestd intmain intmax intx inty inta b m cin a b m max a b couty z x elsez y return z Exg1 3 cpp 1of1 给两个数x和y 求两数中的大者 运行结果 1825 max 25 max函数声明 又称为函数原型 max函数调用 max函数定义 注意类型匹配和使用次序 此处的标识符x y可任意换名 甚至可以不写 湖北大学数计学院计科系朱明 21 141 2020年1月5日星期日10时44分8秒 include 预处理命令usingnamespacestd classStudent 声明一个类 类名为Student private 以下为类中的私有部分intnum 私有变量numintscore 私有变量scorepublic 以下为类中的公用部分voidsetdata 定义公用函数setdata cin num 输入num的值cin score 输入score的值 voiddisplay 定义公用函数display cout num num endl 输出numcout score score endl 输出score 类的声明结束 Exg1 4 cpp 1of2 注意末尾的分号 类 类型 湖北大学数计学院计科系朱明 22 141 2020年1月5日星期日10时44分8秒 Studentstud1 stud2 定义stud1和stud2为Student类的变量 称为对象intmain 主函数首部 stud1 setdata 调用对象stud1的setdata函数stud2 setdata 调用对象stud2的setdata函数stud1 display 调用对象stud1的display函数stud2 display 调用对象stud2的display函数return0 Exg1 4 cpp 2of2 包含类的C 程序 称为成员运算符 此句在语法上等价于inta b 湖北大学数计学院计科系朱明 23 141 2020年1月5日星期日10时44分8秒 在C 中 类是用户自定义的数据类型 称为类类型 和基本数据类型一样 都是C 合法的数据类型 广义上讲 对象是指一切可以被感知和触摸的客观实体 按程序设计的观点 对象则是变量概念的进一步推广和延伸 在声明类类型后 用该类的类名 如上例中的Student 去定义一个变量 则称这个变量为该类的一个对象 如上例中的stud1 stud2 类与对象的关系等价于基本数据类型与变量的关系 面向对象机制 湖北大学数计学院计科系朱明 24 141 2020年1月5日星期日10时44分8秒 类中有两中成员 数据和函数 分别称为数据成员和成员函数 成员访问限定符 memberaccessspecifier 共有三种 public 公用的 protected 保护的 private 私有的 通过它们可以限定类中各成员的访问属性 protected和private的区别在继承时才体现 湖北大学数计学院计科系朱明 25 141 2020年1月5日星期日10时44分8秒 引入了类和对象的概念以后 加上必要的技术手段 C 就可以充分支持面向对象的程序设计 OOP 了 这些技术手段也就是面向对象程序设计的三大特征 封装 Encapsulation 继承 Inheritance 多态性 Polymorphism 湖北大学数计学院计科系朱明 26 141 2020年1月5日星期日10时44分8秒 1 封装 Encapsulation 数据封装涉及两个方面的问题 首先是通过类这种抽象数据类型把数据集和定义在该数据集之上的操作封装成为一体 形成软件系统的基本构成成分 即对象 另外 就是将外界不必知道的信息 不允许外界直接进行操作的数据在对象的内部隐蔽起来 外界只能通过对象提供的接口来完成对对象的操作 从而实现信息隐藏 采用封装的另外一个好处是使对象的使用与对象的维护和更新无关 也就是说 只要对象提供的接口不变 不管在软件的维护和修改过程中对对象内部进行何种变化 它们都不会妨碍对象的使用 也不会对使用这些对象的软件系统产生同步的修改要求 现实生活中 体现封装性的例子很多 如购买电视机 详见第2章 湖北大学数计学院计科系朱明 27 141 2020年1月5日星期日10时44分8秒 2 继承 Inheritance 共性与个性 一般与特殊是客观世界的实体间普遍存在的关系 对这些现实世界中共性与个性 一般与特殊关系的描述与仿真导致了一种机制的产生 即允许子类共享父类的数据和操作的继承机制 基类 间接派生类 直接派生类 详见第5章 湖北大学数计学院计科系朱明 28 141 2020年1月5日星期日10时44分8秒 采用继承机制可实现软件复用 在C 中 继承可分为单继承和多继承 较单继承而言 多继承提供了比单继承对客观世界直接模拟和抽象更好的手段 更强的代码共享和构造能力 但是 多继承的使用会引入继承冲突 多继承的形式语义描述比较困难 如何寻求一种简明的多继承的形式语义描述仍然是计算机科学领域中有待研究的课题 因此 在JAVA和不少面向对象语言中放弃了多继承 这样做的结果使得语言变得简明 编译器易于实现 但是削弱了语言对客观世界模拟和抽象能力的副作用也是显而易见的 多继承 湖北大学数计学院计科系朱明 29 141 2020年1月5日星期日10时44分8秒 3 多态性 Polymorphism 由于类的继承机制 可以轻易地生成一系列虽类似但却独一无二的对象 这些对象可以共享其共同基类中许多相似的特征 但绝不会有完全相同的两个对象 如何让每个对象都有独特的表现方式 这是多态性需要解决的问题 面向对象程序设计中的所谓多态性具体体现在三个方面 重载 包括函数重载和运算符重载 虚函数 子类型化 具体来说 要做到两点 一是同名函数的识别与调用 二是一个基类函数如何为多个派生类的对象所共享的问题 前者涉及函数重载 运算符重载 虚函数问题 后者则与子类型有关 详见第6章 湖北大学数计学院计科系朱明 30 141 2020年1月5日星期日10时44分8秒 C 程序的构成和书写形式 一个C 程序可以由一个程序单位或多个程序单位构成 每一个程序单位作为一个文件 在程序编译时 编译系统分别对各个文件进行编译 因此 一个文件是一个编译单元 在一个程序单位中 可以 并非必须 包括以下几个部分 预处理命令 上节4个程序中都包括 include命令 全局声明部分 在函数外的声明部分 在这部分中包括对用户自定义数据类型的声明和程序中所用到的变量的定义 湖北大学数计学院计科系朱明 31 141 2020年1月5日星期日10时44分8秒 函数 函数是实现操作的部分 因此函数是程序中必须有的和最基本的组成部分 每一个程序必须包括一个或多个函数 其中必须有且只有一个主函数 main函数 函数定义的组成 两部分 函数首部 即函数的第一行 包括函数返回值类型 函数名 函数形式参数表 各形参名及对应类型 中间用逗号间隔 一个函数名后面必须跟一对圆括号 函数参数可以缺省 如intmain 函数体 即函数首部下面的最外层大括号内的部分 函数体一般包括 湖北大学数计学院计科系朱明 32 141 2020年1月5日星期日10时44分8秒 局部声明部分 在函数内的声明部分 包括对本函数中所用到的类型 函数的声明和变量的定义 执行部分 由若干个执行语句组成 用来进行有关的操作 以实现函数的功能 注意 空函数 即既无局部声明部分 又无执行部分 在C 中是合法的 也是有意义的 函数类型函数名 形式参数表 局部声明部分 执行部分 函数定义的基本形式 湖北大学数计学院计科系朱明 33 141 2020年1月5日星期日10时44分8秒 语句C 中的语句必须以分号结束 可分为两类 声明语句 如 inta b 此类数据定义语句被编译时 必然伴随有一个动作的发生 那就是编译器为正在被定义的数据进行内存空间的分配 且定义好的数据有左值和右值之分 执行语句 用来实现用户指定的操作 空语句在C 中是合法的 也是有意义的 一个C 程序总是从main函数开始执行的 且到它结束 而不论main函数在整个程序中的位置如何 教材中有问题 教材中有问题 湖北大学数计学院计科系朱明 34 141 2020年1月5日星期日10时44分8秒 类 class 是C 新增加的重要的数据类型 是C 对C的最重要的发展 有了类 就可以实现面向对象程序设计方法中的封装 信息隐蔽 继承 派生 多态等功能 C 程序书写格式自由 一行内可以写几个语句 一个语句可以分写在多行上 C 程序没有行号 但从一开始养成良好的编程习惯 采取缩进对齐的风格 且特别注意 C 是区分大小写的 即大小写敏感 湖北大学数计学院计科系朱明 35 141 2020年1月5日星期日10时44分8秒 两种注释方法 和 C中方法 可跨行 C 中的新方法 只限于一行 湖北大学数计学院计科系朱明 36 141 2020年1月5日星期日10时44分8秒 1 3C 对C的扩充 1 3 1C 的输入输出 本应是按位左移 右移运算符 但在iostream h头文件中被重载为基本数据类型数据的插入运算符和提取运算符 湖北大学数计学院计科系朱明 37 141 2020年1月5日星期日10时44分8秒 1 输入流与输出流的基本操作 形式 cout 表达式1 表达式n 在定义流对象时 系统会在内存中开辟一段缓冲区 用来暂存输入输出流的数据 在执行cout语句时 先把插入的数据顺序存放在输出缓冲区中 直到输出缓冲区满或遇到cout语句中的endl 或 n ends flush 为止 此时将缓冲区中已有的数据一起输出 并清空缓冲区 cin类似 即预输入与缓输出 湖北大学数计学院计科系朱明 38 141 2020年1月5日星期日10时44分8秒 一个cout语句可以分写在若干行或多个cout语句 cin类似 不能用一个插入运算符 插入多个输出项 如cout a b c error在用cin输入时 系统会根据变量的类型从输入流中提取相应长度的字节 注意 cin语句将跳过空格 回车 换行字符 而在C中将不被跳过 如用函数scanf getchar 湖北大学数计学院计科系朱明 39 141 2020年1月5日星期日10时44分8秒 2 在输入输出流中使用控制符 头文件iomanip h 选讲 湖北大学数计学院计科系朱明 40 141 2020年1月5日星期日10时44分8秒 test3 1 cpp include include 要用到格式控制符usingnamespacestd intmain doubleamount 22 0 7 cout amount endl cout setprecision 0 amount endl setprecision 1 amount endl setprecision 2 amount endl setprecision 3 amount endl setprecision 4 amount endl test1 1 cpp 1of2 控制浮点数值显示 湖北大学数计学院计科系朱明 41 141 2020年1月5日星期日10时44分8秒 cout setiosflags ios fixed cout setprecision 8 amount endl cout setiosflags ios scientific amount endl cout setprecision 6 重新设置成原默认设置return0 test1 1 cpp 2of2 湖北大学数计学院计科系朱明 42 141 2020年1月5日星期日10时44分8秒 设置值的输出宽度除了使用空格来强行控制输出间隔外 还可以使用setw n 控制符 如果一个值需要比setw n 确定的字符数更多的字符 则该值将使用它所需要的字符数 如果一个值的字符数比setw n 确定的字符个数要少 则在数字字符前显示空格 setw n 仅仅影响下一个数值输出 setw n 的默认值为宽度0 即setw 0 湖北大学数计学院计科系朱明 43 141 2020年1月5日星期日10时44分8秒 test3 2 cpp include includeusingnamespacestd intmain intnumber 1001 cout Decimal dec number endl Hexadecimal hex number endl Octal oct number endl return0 test1 2 cpp 1of1 输出8进制和16进制数 湖北大学数计学院计科系朱明 44 141 2020年1月5日星期日10时44分8秒 test3 3 cpp include includeusingnamespacestd intmain cout setfill setw 2 21 endl setw 3 21 endl setw 4 21 endl cout setfill 恢复默认设置return0 test1 3 cpp 1of1 使用填充字符 湖北大学数计学院计科系朱明 45 141 2020年1月5日星期日10时44分8秒 test3 4 cpp include includeusingnamespacestd intmain cout setiosflags ios right setw 5 1 setw 5 2 setw 5 3 endl cout setiosflags ios left setw 5 1 setw 5 2 setw 5 3 endl return0 test1 4 cpp 1of1 左右对齐输出 默认对齐方式 湖北大学数计学院计科系朱明 46 141 2020年1月5日星期日10时44分8秒 test3 5 cpp include includeusingnamespacestd intmain cout 10 0 5 endl cout setiosflags ios showpoint 10 0 5 endl return0 test1 5 cpp 1of1 运行结果为 22 00000 强制显示小数点和符号位 湖北大学数计学院计科系朱明 47 141 2020年1月5日星期日10时44分8秒 test3 6 cpp include includeusingnamespacestd intmain cout 10 20 endl cout setiosflags ios showpos 10 20 endl return0 test1 6 cpp 1of1 运行结果为 10 20 10 20 湖北大学数计学院计科系朱明 48 141 2020年1月5日星期日10时44分8秒 include includeusingnamespacestd intmain doublea 123 456 b 3 14159 c 3214 67 cout setiosflags ios fixed setiosflags ios right setprecision 2 cout setw 10 a endl cout setw 10 b endl cout setw 10 c endl return0 test1 7 cpp 1of1 各行小数点对齐 湖北大学数计学院计科系朱明 49 141 2020年1月5日星期日10时44分8秒 3 用getchar和putchar函数进行字符的输入和输出 1 putchar函数 字符输出函数 函数原型 intputchar int 调用格式 putchar c 函数功能 向标准输出设备 一般为显示器 输出一个字符 并返回输出字符的ASCII码值 函数的参数c可以是字符常量 变量或整型变量 湖北大学数计学院计科系朱明 50 141 2020年1月5日星期日10时44分8秒 include 或者包含头文件stdio h includeusingnamespacestd intmain chara b c a B b O c Y putchar a putchar b putchar c putchar n putchar 66 putchar 79 putchar 89 putchar 10 return0 test1 8 cpp 1of1 输出单个字符运行结果 BOYBOY 湖北大学数计学院计科系朱明 51 141 2020年1月5日星期日10时44分8秒 2 getchar函数 字符输入函数 函数原型 intgetchar void 调用格式 getchar 函数功能 从输入设备 一般为键盘 上输入一个字符 函数的返回值是该字符的ASCII码 可以赋给字符变量或整型变量 湖北大学数计学院计科系朱明 52 141 2020年1月5日星期日10时44分8秒 includeusingnamespacestd intmain charc c getchar putchar c 32 putchar n return0 test1 9 cpp 1of1 输入单个字符运行结果 A a 湖北大学数计学院计科系朱明 53 141 2020年1月5日星期日10时44分8秒 4 用scanf和printf函数进行输入和输出 一般形式 printf 格式控制 输出表列 scanf 格式控制 输出表列 湖北大学数计学院计科系朱明 54 141 2020年1月5日星期日10时44分8秒 includeusingnamespacestd intmain inta floatb charc scanf d c f test1 10 cpp 1of1 用scanf和printf函数进行输入和输出 湖北大学数计学院计科系朱明 55 141 2020年1月5日星期日10时44分8秒 printf与scanf 选讲 printf和scanf是C程序中必不可少的标准输入输出函数 在头文件stdio h中声明 在C 中 I 0流完全代替了它们 1 printf函数格式 printf 格式控制字符串 输出项1 输出项2 格式控制字符串和输出项都是函数参数 格式控制字符串中有格式说明也有普通字符 格式说明由 和格式字符组成 如 d f等 其作用是将输出的数据转换成指定的格式输出 普通字符就是原样输出的字符 输出项n是需要输出的一些数据 可以是表达式 湖北大学数计学院计科系朱明 56 141 2020年1月5日星期日10时44分8秒 include includeusingnamespacestd intmain inta 10 b 20 printf d d a b system pause return0 test1 11 cpp 1of1 运行结果为 10 20 湖北大学数计学院计科系朱明 57 141 2020年1月5日星期日10时44分8秒 d格式符用来输出10进制整数 可以有长度修饰 如 d 5d ld 5ld等 o和 x格式符分别输出8进制和16进制无符号整数 X和 x分别用大写和小写字母输出16进制数 u格式符用来以无符号10进制整数方式输出 可以指定格式宽度 湖北大学数计学院计科系朱明 58 141 2020年1月5日星期日10时44分8秒 c格式符用来以字符方式输出 可以指定格式宽度 一个0 255间的整数也可以字符方式输出 s格式符用来以字符串格式输出 可以指定格式宽度 左右对齐方式 f格式符用来以小数方式输出 可以指定格式宽度 小数位数 左右对齐方式 e格式符或 E 用来以指数方式输出浮点数 还有 g格式符 用来输出浮点数 它根据数值的大小 自动选取f格式和e格式中较短的一种 湖北大学数计学院计科系朱明 59 141 2020年1月5日星期日10时44分8秒 2 scanf函数格式 scanf 格式控制字符串 地址1 地址2 格式控制字符串含义同前 地址n是变量的地址 一般用 变量名 或指针表示 湖北大学数计学院计科系朱明 60 141 2020年1月5日星期日10时44分8秒 1 3 2用const定义常变量 在定义变量时 如果加上关键字const 则变量的值在程序运行期间不能改变 这种变量称为常变量 constantvariable 如constintpi 3 1415926 常量在定义时必须初始化 常量名不能放在赋值号的左边 可以用常量表达式对常量进行初始化 区别 符号常量 define 与const常量 用sizeof 数据类型 可以确定某数据类型的长度 如sizeof int 在16位机上为2 湖北大学数计学院计科系朱明 61 141 2020年1月5日星期日10时44分8秒 includeusingnamespacestd intmain floatadd floatx floaty 对add函数作声明floata b c cout a b c add a b 函数调用cout sum c endl return0 floatadd floatx floaty 定义add函数 floatz z x y return z test1 12 cpp 1of1 对被调用的函数作声明 1 3 3函数原型声明 所谓函数声明 declare 就是在函数尚在未定义的情况下 事先将该函数的有关信息通知编译系统 以便使编译能正常进行 湖北大学数计学院计科系朱明 62 141 2020年1月5日星期日10时44分8秒 在函数声明中也可以省略形参名 而只写形参的类型 如floatadd float float 称为函数原型 其作用是据此在程序编译阶段对调用函数的合法性进行全面检查 以便及时地 尽可能多地在编译阶段发现错误 应当注意函数原型与函数首部写法上的一致 养成对所有用到的函数作声明的习惯 以保证程序的正确性和可读性 函数声明的位置可以在调用函数所在的函数中 也可以在函数之外 函数的全局声明 湖北大学数计学院计科系朱明 63 141 2020年1月5日星期日10时44分8秒 函数调用机制 湖北大学数计学院计科系朱明 64 141 2020年1月5日星期日10时44分8秒 1 3 8内置函数 函数调用机制建立被调函数的栈空间 保护调用函数的运行状态和返回地址 传递参数 将控制转交被调函数 内联函数的需要性函数调用与返回时 都需要一定的时间和空间的开销 而通过关键字inline将一个函数声明成内联函数后 编译器会将该函数的调用处理成编译前的代码替换 而不是象普通函数在编译时的控制转移 从而提高了效率 湖北大学数计学院计科系朱明 65 141 2020年1月5日星期日10时44分8秒 includeusingnamespacestd inlineintmax int int int 声明函数 注意左端有inlineintmain inti 10 j 20 k 30 m m max i j k couta a b 求a b c中的最大者if c a a c returna test1 13 cpp 1of1 函数指定为内置函数 编译前被替换成 if j i i j if k i i k m i 湖北大学数计学院计科系朱明 66 141 2020年1月5日星期日10时44分8秒 先声明后调用内联函数的代码必须在替换之前已经生成 所以内联函数必须在被调用之前声明或定义 湖北大学数计学院计科系朱明 67 141 2020年1月5日星期日10时44分8秒 内联函数的函数体限制内联函数中 不能含有复杂的结构控制语句 如switch while 内联函数不能是递归函数 内联函数只适合于只有1 5行的小函数 对函数作inline声明 只是程序设计者对编译系统提出的一个建议 也就是说它是建议性的 而不是指令性的 编译系统会根据具体情况决定是否采纳该建议 湖北大学数计学院计科系朱明 68 141 2020年1月5日星期日10时44分8秒 内联函数与宏定义宏定义 defineMAX a b a b a b 书写格式有过分的讲究 MAX与括号之间不能有空格 所有的参数都要加括号 求值时会有副作用 不作参数的类型检查 内联函数可以有效解决上述问题 替代宏定义 inlineintMAX inta intb returna b a b 湖北大学数计学院计科系朱明 69 141 2020年1月5日星期日10时44分8秒 1 3 4函数的重载 1 重载的需要性在不同类型上做类似运算而又用相同名字的情况称为重载 functionoverloading 即重新定义语义 重载解析 C 用一种函数命名技术可以准确判断应该调用哪个重载函数 湖北大学数计学院计科系朱明 70 141 2020年1月5日星期日10时44分8秒 voidprint double voidprint int voidfunc print 1 匹配voidprint int printf 1 0 匹配voidprint double print a 匹配voidprint int print 3 1415f 匹配voidprint double 匹配次序 2 匹配重载函数的次序 湖北大学数计学院计科系朱明 71 141 2020年1月5日星期日10时44分8秒 includeusingnamespacestd intmain intmax inta intb intc 函数声明doublemax doublea doubleb doublec 函数声明longmax longa longb longc 函数声明inti1 i2 i3 i cin i1 i2 i3 输入3个整数i max i1 i2 i3 求3个整数中的最大者cout d1 d2 d3 输入3个双精度数d max d1 d2 d3 求3个双精度数中的最大者cout d max d endl Exg1 6 cpp 1of3 湖北大学数计学院计科系朱明 72 141 2020年1月5日星期日10时44分8秒 longg1 g2 g3 g cin g1 g2 g3 输入3个长整数g max g1 g2 g3 求3个长整数中的最大者couta a b if c a a c returna Exg1 6 cpp 2of3 湖北大学数计学院计科系朱明 73 141 2020年1月5日星期日10时44分8秒 doublemax doublea doubleb doublec 定义求3个双精度数中的最大者的函数 if b a a b if c a a c returna longmax longa longb longc 定义求3个长整数中的最大者的函数 if b a a b if c a a c returna Exg1 6 cpp 3of3 求3个数中最大的数 分别考虑整数 双精度数 长整数的情况 湖北大学数计学院计科系朱明 74 141 2020年1月5日星期日10时44分8秒 includeusingnamespacestd intmain intmax inta intb intc 函数声明intmax inta intb 函数声明inta 8 b 12 c 27 cout max a b c max a b c endl 输出3个整数中的最大者cout max a b max a b endl 输出两个整数中的最大者 Exg1 7 cpp 1of2 湖北大学数计学院计科系朱明 75 141 2020年1月5日星期日10时44分8秒 intmax inta intb intc 此max函数的作用是求3个整数中的最大者 if b a a b if c a a c returna intmax inta intb 此max函数的作用是求两个整数中的最大者 if a b returna elsereturnb Exg1 7 cpp 2of2 编写一个程序 用来求两个整数或3个整数中的最大数 运行结果为 max a b c 27max a b 8 湖北大学数计学院计科系朱明 76 141 2020年1月5日星期日10时44分8秒 3 使用说明返回类型不能单独作为重载解析的依据 参数个数 类型 顺序三者种必须至少有一种不同 如 voidfunc int intfunc int error不能用typedef定义的类型名来区分重载函数声明中的参数 让重载执行不同的功能 是不好的编程风格 湖北大学数计学院计科系朱明 77 141 2020年1月5日星期日10时44分8秒 1 3 5函数模板 C 提供了函数模板 functiontemplate 用以解决函数体完全一样 而函数类型和形参类型不一致的情况 所谓函数模板 实际上是建立一个通用函数 其函数类型和形参类型不具体指定 用一个虚拟类型来代表 这个通用函数就称为函数模板 在调用函数时系统会根据实参的类型来取代模板中的虚拟类型 从而实现了不同函数的功能 湖北大学数计学院计科系朱明 78 141 2020年1月5日星期日10时44分9秒 定义函数模板的一般形式template通用函数定义template通用函数定义类型参数可以不只一个 根据需要确定个数 template 用函数模板比函数重载更方便 程序更简洁 但应注意它只适用于函数的参数个数相同而类型不同 且函数体相同的情况 如果参数的个数不同 则不能用函数模板 湖北大学数计学院计科系朱明 79 141 2020年1月5日星期日10时44分9秒 includeusingnamespacestd template 模板声明 其中T为类型参数Tmax Ta Tb Tc 定义一个通用函数 用T作虚拟的类型名 if b a a b if c a a c returna Exg1 8 cpp 1of2 湖北大学数计学院计科系朱明 80 141 2020年1月5日星期日10时44分9秒 intmain inti1 185 i2 76 i3 567 i doubled1 56 87 d2 90 23 d3 3214 78 d longg1 67854 g2 912456 g3 673456 g i max i1 i2 i3 调用模板函数 此时T被int取代d max d1 d2 d3 调用模板函数 此时T被double取代g max g1 g2 g3 调用模板函数 此时T被long取代cout i max i endl cout d max d endl cout g max g endl return0 Exg1 8 cpp 2of2 将例4 6程序改为通过函数模板来实现 湖北大学数计学院计科系朱明 81 141 2020年1月5日星期日10时44分9秒 1 3 6有默认参数的函数 1 默认参数的目的C 可以给函数定义默认参数值 其目的是简化编程 便于某些繁琐的初始化工作 如IC Card类的构造函数 湖北大学数计学院计科系朱明 82 141 2020年1月5日星期日10时44分9秒 2 默认参数的声明既有声明又有定义时 定义中可省略默认参数 只有定义时 默认参数须出现在定义中 湖北大学数计学院计科系朱明 83 141 2020年1月5日星期日10时44分9秒 3 默认参数的顺序规定默认参数应从右向左依次定义 调用函数时 是从左向右匹配参数的 湖北大学数计学院计科系朱明 84 141 2020年1月5日星期日10时44分9秒 4 默认参数与函数重载默认参数可以将一系列简单的重载函数合成为一个 副作用 如果一组可能带有默认参数的重载函数都允许相同实参个数的调用 则会引起调用的二义性 湖北大学数计学院计科系朱明 85 141 2020年1月5日星期日10时44分9秒 5 默认值的限定默认值可以是全局变量 全局常量 甚至是一个函数 默认值不能是局部变量 因为默认参数的函数调用是在编译时确定的 而局部变量的位置与值在编译时均无法确定 湖北大学数计学院计科系朱明 86 141 2020年1月5日星期日10时44分9秒 includeusingnamespacestd intmain intmax inta intb intc 0 函数声明 形参c有默认值inta b c cin a b c couta a b if c a a c returna test1 14 cpp 1of1 求2个或3个正整数中的最大数 用带有默认参数的函数实现 湖北大学数计学院计科系朱明 87 141 2020年1月5日星期日10时44分9秒 1 3 7引用 详见 引用 章 湖北大学数计学院计科系朱明 88 141 2020年1月5日星期日10时44分9秒 1 3 9作用域运算符 作用域是标识符在程序中的有效范围 即可见性区域 C 中的作用域可分为 局部作用域 块作用域 函数作用域函数原型作用域文件作用域类作用域 湖北大
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 蛋白质组生物标志物-洞察与解读
- 数据驱动生态资源整合-洞察与解读
- 发酵废水资源化利用-洞察与解读
- 租赁欺诈检测技术-洞察与解读
- 分布式健康档案管理-洞察与解读
- 无人钻机安全控制-洞察与解读
- 神经保护机制研究-第1篇-洞察与解读
- 日间手术质量控制与安全管理
- 成本考核机制与责任落实路径-1
- 成本效益导向的方案调整策略
- 蜜雪冰城加盟合同协议
- T-CSPSTC 113-2023 跨座式单轨旅游轨道系统设计规范
- DB63T 1600-2025 高海拔高寒地区公路边坡生态防护技术施工规范
- 2025年高中英语50篇语法填空记高考3500词(翻译及原文版)
- JJF1033-2023计量标准考核规范
- 《会计学原理》课件
- DB35T 1111-2019 电动卷门机通 用技术条件
- 浪潮人力岗在线测评题
- 第三单元文言文古诗理解性默写2024-2025学年统编版语文八年级上册
- 中国在线教育市场现状及未来发展趋势分析报告
- 酒店型会议室管理制度
评论
0/150
提交评论