




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章C 对于C的扩充之处 2 1C 的主要扩充之处2 2控制台应用程序的基本开发过程 C 的主要扩充之处 2 1 1C 发展历史随着面向对象程序设计思想的日益普及 很多支持面向对象程序设计方法语言也相继出现了 C 就是这样一种语言 C 是BjarneStroustrup于1980年在AT T的贝尔实验室开发的一种语言 它是C语言的超集和扩展 是在C语言的基础上扩充了面向对象的语言成分而形成的 最初这种扩展后的语言称为带类 class 的C语言 1983年才被正式称为C 语言 BjarneStroustrup在设计和实现C 语言时 既保留了C语言的有效性 灵活性 便于移植等全部精华和特点 又添加了面向对象编程的支持 具有强大的编程功能 编写出的程序具有结构清晰 易于扩充等优良特性 适合于各种应用软件 系统软件的程序设计 C 语言由C语言扩展而来 同时它又对C语言的发展产生了一定的影响 ANSIC语言在标准化过程中吸收了C 语言中某些语言成分 2 1 2C 对于C语言的扩充之处C 语言是C语言的超集 与C语言具有良好的兼容性 使用C语言编写的程序几乎可以不加修改直接在C 语言编译环境下进行编译 C 语言对C语言做了一定程度的扩充 并在许多方面存在不同之处 主要体现为以下几个方面 1 标准输入 输出输入一般是指从键盘或者从文件中输入数据 由此产生的数据流称为输入流 输出一般是指将数据从内存输出到显示器上或者是文件中 产生的数据流称为输出流 C语言中 主要使用函数来实现输入 输出 比如 标准的输入函数scanf 标准的输出函数printf 字符输入函数getchar等 在C 中标准的输入用cin对象来完成 标准的输出要用cout对象完成 cin cout都是系统预定义好的对象 可以直接使用 但是需要在使用位置之前加上文件包含语句 include 这类似于C语言 请看下面的例子 includevoidmain charname 20 cout name 输入名字cout mynameis name endl 2 注释C 语保留了C语言中以 开始 结束的注释 这种方式适用于多行的注释 同时C 语言中还提供行注释符 该注释在它的行结束处结束 适用于短注释 3 变量的定义方法在C语言中 变量的定义只能出现在变量的定义部分 不能出现在执行语句部分 比如 inta floatb a 20 charc c C语言中编译不能通过 上述代码在C 中是合法的 定义变量可以在执行语句的后面 换句话说 变量的定义可以在程序代码段的任何位置 另外 在C 中支持一种新的变量初始化方式 以整型变量为例 inta 1 下面看一个小例子 voidmain intt 0 a 6 for inti 0 i 10 i for intj 0 j i j intt 1 cout t endl 输出第二行定义的tcout i endl cout j endl 超出j的作用域 4 函数C 对C的函数功能进行了扩充 体现在以下几个方面 1 函数原型即对函数进行声明 在C语言中由于编译器不对函数的参数进行检查 所以在进行函数声明时不需写出函数的参数 只需函数名 即可 请看下面的例子 includefloatmax 函数声明 无须写出参数voidmain floatx 5 y 6 printf f max x y floatmax floatx floaty if x y returnx elsereturny 对函数的实际参数和形式参数不做类型匹配检查 经常会引起系统运行出错 C 的编译器对函数参数做严格类型检查 所以上面例子需将函数声明改为floatmax floatx floaty 才能在C 中顺利执行 另外 函数声明时形参的名字可以省略 floatmax float float 2 缺省参数在C 语言中 函数参数允许使用缺省 默认 值 在函数调用时 若给出的实参个数少于形参个数时 则所缺参数自动取函数参数表中设置的缺省值 看下面的例子 includevoidf intx inty 10 cout x y endl voidmain intx 5 y 6 f x y f x 程序的输出结果 56510该程序定义了一个函数f 它有两个整形参数 第二个参数缺省值为10 函数可以有多个缺省参数 但应注意只能从右往左缺省 例如 intf1 intx inty 0 intz 0 正确intf2 intx inty 0 intz 错误 3 函数重载 函数名重载 函数重载是指同一个作用域内多个函数可以拥有相同的名字 函数重载时 要求重载的函数的函数名要与已定义的函数相同 但是参数必须不同 参数不同是指 参数个数不同 参数类型不同或两者都不同 函数名重载时不允许仅仅函数的返回值类型与已定义的函数不同 下面是函数名重载的例子 其中一种情况是函数的参数个数相同 但参数类型不同 另一种情况是函数的参数个数不同 需要注意 重载本身是相互的 includeintmax intx inty returnx y x y floatmax floatx floaty 参数个数相同 但参数类型不同 returnx y x y intmax intx inty intz 参数个数不同 intt if x y t x x y y t if x z t x x z z t returny z y z voidmain void intx 5 y 6 z 7 t2 t3 floatu 5 5 v 6 6 w t2 max x y cout t2 t2 endl t3 max x y z cout t3 t3 endl w max u v cout w w endl 说明 1 函数重载使得编译器不能只通过函数名来区别不同的函数 必须通过函数名加上参数信息来确定源代码中函数的唯一性 这也是函数重载为什么要求参数不同的原因 函数重载使得C 语言简洁 灵活 具有多种形态 这种多态属于编译时多态 即编译器在编译源代码时不是仅通过函数名来区分函数 而是通过查看相同函数名的函数的参数不同来检查函数 确定函数的唯一性 在调用这些函数时 由于函数名是相同的 所以看起来是一致的 但是实际上调用的是不同的函数 后面讲到的运算符函数实际上也属于函数重载 另外要注意的是 函数名重载时最好不要使用缺省参数 否则可引起二义性 例如 如果把上述三个参数的max 函数设计成带缺省参数的如下形式 intmax intx inty intz 7 参数z可以缺省 此时 若主函数中有下述调用语句t3 max x y 则系统将无法确定该函数应与含三个参数的max函数匹配还是与含两个参数的max函数匹配 2 尽管重载的多个函数各自可以实现毫不相干的功能 但是最好不要这样做 应当保证重载的函数具有相似的功能 这样编写的程序在调用函数时显得非常方便 因为相比于为这些功能编写完全不同的函数名而言 使用相同的函数名便于记忆 4 内联函数让我们首先回顾以下C语言中的宏 C语言中经常将使用频率较高的表达式定义成宏 看下面的例子 definemax x y x y x y voidmain inta 1 b 2 c 5 t t max a b c C编译器的预处理将会对源代码中的宏进行宏替换 其结果是 t a b c a b c 在C 中可以使用内联函数的方法达到类似的效果 includeinlineintmax inta intb inline是将一个函数说明成内联函数的关键字 returna b a b voidmain intt t max 10 20 cout t 经过编译器预处理之后 main函数中对max函数的调用被max函数的函数体所取代 上面的代码变成 voidmain intt t 10 20 10 20 cout t 说明 1 将一个函数说明成内联函数 实际上是取消了对该函数的调用 使程序执行时省去了由于函数调用所花费的开销 节省了时间 对于频繁使用的函数建议使用内联 2 一般来说 使用内联函数的源代码要比不使用的代码要长 因为编译时要在每个内联函数的调用处进行代码扩展 所以一般内联函数不要太长 如果程序本省很长 内联函数又非常庞大且使用频繁 后果可想而知 5 结构体C 中同样可以使用结构体 一个结构体的定义就是一个新的数据类型的定义 与c语言不同的是在使用结构体定义变量时不必加标识符struct 例如 6 作用域限定符在C 语言中增加了作用域限定符 用以解决局部变量名与全局变量的同名重复问题 在局部变量的作用域内可用作用域限定符 对被其隐藏的同名全局变量进行访问 structstudent charname 10 intnumber intpage 则在定义该结构类型变量时可以使用如下方式 students1 s2 下面是一个简单的例子 intx voidtest intx x 5 此处引用局部变量 x 9 此处引用全局变量 7 const修饰符const本身就是常量的意思 在C 中它用来限定某一变量在其作用域内为常量 换句话说 由const修饰的变量不能被修改 例如 constintmaxSize 128 说明 1 由于const修饰的变量的值不能被修改 所以在定义该变量时应当初始化赋值 例 intx 4 constinty 3 y x x y 2 当用const修饰符修饰指针类型数据时要小心辨别const真正限定 冻结 的是哪个数据 voidmain intx 5 y 6 constint p1 3 函数的形参也可以声明为常量 这对于用指针作形式参数的函数可以防止在函数中修改形参指针所指向的数据 例 voidf constchar str while str if str str elsecout str str voidmain f howareyou 4 当const修饰符用于说明类的成员函数时 其作用是不允许该成员函数修改类的数据成员 这样的例子将在以后介绍 8 函数形式的类型转换C 语言对变量提供了类似于函数调用形式的显式类型转换 例 inti 20 floatx i int x 在C语言中 上述例子的显式类型转换方法是 i int x 9 引用引用是C 语言中一个新的类型 引用类型使用标识符ref称为引用类型的变量 它只是整型变量num的别名 看一个具体的实例 includevoidmain inti 5 int 这里 i是求地址 int voidmain intx 5 y 6 swap x y cout x x endl cout y y endl 能否将函数调用形式改为swap 5 6 2 函数的返回值类型定义成引用intindex 0 int 10 new和delete运算符在C 使用new运算符进行动态存储空间的分配 使用delete运算符进行动态存储空间的释放 所谓动态存储空间是指系统提供的一个称为堆 heap 的很大的内存区域 当用户需要动态存储空间时 可以用new运算符向系统动态申请 当用户申请的动态存储空间使用完时 可以用delete运算符再动态释放给系统 C语言进行动态存储空间分配和释放的方法是使用malloc 函数 还有类同的其它几个函数 和free 函数 动态内存分配new运算符的语法格式为 new类型名 初始值 其中 类型名指定了要分配存储空间的类型 当动态申请单个变量或对象时 可以有初始值 也可以没有初始值 当动态申请数组变量或对象时 不允许有初始值 要注意的是 只有类的构造函数参数为空 void 或全部参数都带有缺省值时 才可以动态申请数组对象 当动态空间申请成功时 new运算符按要求分配一块内存 并返回指向该内存起始地址的指针 当动态空间申请不成功时 new运算符返回空指针NULL 下边是几个引自msdn的例子 int pi newint 申请一个整数类型空间由整数类型指针pi指示intn cin n int p newint n char pc newchar a 申请一个字符类型空间由字符类型指针pc指示 该字符初始值为 a 3 Date pmc newDate 9 22 1995 申请一个Date类型空间由Date类型指针pmc指示 该Date类型空间初始值为1995年9月当使用new运算符定义一个一维数组变量或数组对象时 它产生一个指向数组第一个元素的指针 当使用new运算符定义一个多维数组变量或数组对象时 它产生一个指向数组第一个元素的指针 返回的类型保持了除最左边维数外的所有维数 1 char pstr newchar 10 申请一个一维字符类型数组空间由字符类型指针pstr指示 一维数组个数为10 2 char pchar 10 定义pchar为字符类型的一维指针数组变量pchar newchar 10 10 申请一个二维字符类型数组空间由指针变量pchar指示 二维数组为10 10 当申请二维或二维以上数组空间时 除第一维可为变量外 其余维必须为常数 delete运算符用于释放由new运算符分配的动态存储空间 delete运算符的语法格式为 delete指针或delete 指针其中 指针指向的必须是先前用new运算符分配的动态存储空间 当释放动态分配的数组空间时 用指针前加 的第二种格式 控制台应用程序的基本开发过程 2 2 1常见C 编译器简介使用C 语言开发应用程序的过程与C语言相同 首先输入源程序 然后使用编译器编译生成目标代码文件 再由连接程序生成可执行的二进制文件 目前可以选择的C 编译器很多 在PC平台上 常见的操作系统环境下都有可使用的编译器 比较普遍的有微软公司与Borland Inprise 公司的产品 DOS环境下 由于操作系统本身功能的限制 C 编译器提供的功能相对简单 如微软的MSC7 0 BorlandC 3 1等产品 相比而言 BorlandC 的集成环境使用起来更方便 Windows环境下 微软公司与Borland公司都有自己的C 编译器 如微软的VisualC 6 0 Borland公司的BorlandC 5 0 C Builder等 它们所提供的不仅仅是C 编译器 而是一个完整的开发平台 在学习C 基本语法的过程中 建议读者使用VisualC 控制台应用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年广东深圳市教育局招募“柔性”援藏支教教师8人笔试模拟试题及答案解析
- 2025上海华东医院招聘工作人员111人笔试模拟试题及答案解析
- 2025浙江绍兴市上虞区公共文化服务中心招聘编外用工1人笔试备考题库及答案解析
- 2025年上海海事大学公开招聘专任教师(第二批)笔试备考题库及答案解析
- 2025四川阿坝州马尔康市面向阿若红壤四县考调机关事业单位工作人员6人笔试模拟试题及答案解析
- 2025四川省医学科学院四川省人民医院编外招聘院前急救医师3人考试模拟试题及答案解析
- 物流行业仓储数字化升级策略
- 2025贵州贵阳市第一实验小学秋季临聘教师招聘46人笔试模拟试题及答案解析
- 2025云南昭通水富市委统战部市民宗局招聘城镇公益性岗位工作人员1人笔试备考题库及答案解析
- 2025福建福州民天集团有限公司选聘权属企业副总经理1人笔试参考题库附答案解析
- 2025年少儿英语教师职业资格考试试卷:英语教学互动式学习
- 2024年护理综合管理能力考试试题(附答案)
- 培训师必要知识课件
- 2025年事业单位卫生类专业知识试卷(卫生监督与卫生法规)试题
- 新学期-启航出发-2025-2026学年初一上学期新生开学第一课主题班会
- 人教版新教材小学二年级《数学》上册新教材解读课件
- 难治性精神分裂症中国专家共识(2025)解读
- 节假日值班人员安排管理制度
- 2025年新版《食品安全法》知识竞赛试题(附答案)
- 2025至2030中国保护器行业发展趋势分析与未来投资战略咨询研究报告
- 学堂在线 高职实综合英语 章节测试答案
评论
0/150
提交评论