已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020 4 6 C 讲义第1讲C 对C与类无关的性能扩充 2020 4 6 C 对C语言的扩充 2020 4 6 C 中所新增的操作符和功能函数 操作符号 常量定义符变量的引用操作符全局作用域限定符动态内存分配的操作符变量的块内定义 功能函数 内联函数重载函数模板函数含缺省 默认 形参的函数 2020 4 6 本讲主要知识点 一 正确地理解C语言与C 语言的差别二 C 对C语言扩充主要体现在两个方面三 C 中所新增的有关数据的操作符 const new和delete等 四 C 中所新增的几种功能函数 如内联 带缺省形参 重载函数 函数模板 2020 4 6 C语言的优点 高效 灵活并能够对底层操作 C语言的缺点 是不具有支持代码重用的类的机制 类的封装机制 因而无法实现将问题的数据和对问题操作的方法组合在一起 应用场合 一般适用于中小型程序的设计 程序代码长度在1万行之下 的编程 一 C 与C语言主要差别 2020 4 6 C 的产生 产生的时期 80年代早期 贝尔实验室的BjarneStroutStrup在C语言的基础上 同时吸收了BCPL Simula67和Alogl68等语言的精华而发展起来的以适应大型复杂程序开发与维护的一种面向对象的程序设计语言 主要的特性 面向对象的程序设计语言 应用场合 大型复杂程序的开发与维护 2020 4 6 本质差别 编程方法方面 C 对C的兼容是建立在发展和完善的基础上的 即C 是面向对象的程序设计语言 C语言是面向过程的程序设计语言 程序结构方面 C 语言程序的结构采用 对象 消息 模式 C的程序结构采用 数据 算法 模式 2020 4 6 2 兼容性 主要体现在源代码的支持 大量C语言的程序稍微加以修改或不修改就可以在C 中编译通过并支持C语言的库函数和语法规则 对系统库的支持 保持C的简洁 高效和接近汇编语言等特性 3 改良 改进C中一些易产生错误的语法现象 容后介绍 2020 4 6 功能 它用来冻结一个变量的值 使其值在程序中不能被进一步改变 置成只读属性 即变为常量 定义 const类型定义符变量名 初值 如 constintsumValue 10 常量定义constint ptr 限定指针voidFunction constint X 限定函数的形参 二 新增const常量定义符 2020 4 6 语言中为什么要提供常量定义 如果不使用常量 直接在程序中填写数字或字符串 将会有什么麻烦 程序的可读性 可理解性 变差 程序员自己会忘记那些数字或字符串是什么意思 用户则更加不知它们从何处来 表示什么 可读性 可理解性 在程序的很多地方输入同样的数字或字符串 难保不发生书写错误 避免书写错误 如果要修改数字或字符串 则会在很多地方改动 既麻烦又容易出错 方便维护 2020 4 6 C 中为什么要提供const C语言中的常量定义 使用编译预处理 宏定义指令 definesumValue10此时的sumValue是char型还是int型 C 语言中的常量定义 constintsumValue 10 其目的是替代C语言中的编译预处理命令 define 常量定义 但比它更加语义精确 因为 define无法准确地反映常量的数据类型 2020 4 6 const修饰符的含义 不可更改 一经const修饰后便不能修改此符号名之值 例一 constintsumValue 10 sumValue 0 错误 2020 4 6 例二 voidDisplay constint ptr intn cout ptr 0 ptr 0 显示数组中的第一个元素之值 ptr 0 1 错误 不能修改其值 不能通过指针来改变目标单元之值 ptr 1 错误 不能修改其值 不能通过指针来改变目标单元之值 2020 4 6 const修饰指针的两种用法 1 constint ptr 错误的 2020 4 6 2 int constptr ptr 0 2 2020 4 6 区分符号名之前有无const时的不同 intsum 1 无const修饰时此时sum为变量 意味着其值可以被改变 如 sum 2 同时其内存字节数为两个字节 在16位机上 constintsum 1 有const修饰时此时sum为常量 意味着其值不可以被改变 如 sum 2 同时不需要占用内存空间 另外C 语言视经const修饰的符号名为常量特性 因而它可以用于任何可能出现数字常量的场合 如数组的大小的说明等 constintArraySize 10 chararray ArraySize 2020 4 6 区分C语言中的 define与C 中的const的不同 由 define所定义的符号名为全局性常量 因而在整个程序中应保持符号名的唯一性 const可以说明一个局部或全局性同名常量 据此可以改变const符号名之值 另外在语法方面 define为编译预处理命令 而const为定义符 语句以 结束 defineMin1constintMax 100 voidmain void defineMin2 错误 不能再定义同名常量constintMax 200 可以再定义同名局部常量 2020 4 6 const的应用实例 例一 符号常量floatArea intr constfloatPI 3 1415926 returnPI r r 2020 4 6 例二 限制不能通过形参来改变实参 voidmain intx 1 fun voidmain intx 1 fun 错误 2020 4 6 正确理解C中的变量的定义要求 一般应该集中定义出 不能在语句块中定义 程序例 voidmain intx 1 正确for inti 0 i 10 i 错误 inty 2 错误 三 变量的块内定义 引言 2020 4 6 C 中的变量定义的规则 可以采用 随用随定义 的方式定义出变量 即变量的块内定义 C 中允许变量在使用之前的任一语句块中定义出来 包括for循环中 2020 4 6 C 中的变量定义的规则 includevoidmain void intx 1 局部变量 inty 块内变量x 3 y 4 cout y y endl 错误 voidmain void for inti 1 i 10 i intz 1 块内变量 2020 4 6 正确理解C 中的变量的各种作用域 文件域 全局变量 其作用域为从定义点到当前文件结束有效 函数域 局部变量 其作用域为本函数内有效 函数原型域 函数的形参 为局部变量 只在该函数体内有效 块内域 块内定义的变量 比局部变量的作用域更小 块内定义的变量的作用域为从定义点到当前块内有效 语句块执行完毕 自动释放 2020 4 6 演示各种变量的作用域 intX 1 全局变量voidFunction inta 函数的形参 intb a 局部变量X b 正确Y X 错误 voidmain intY 2 局部变量X 2 正确Function X for inti 0 i 10 i 块内定义的变量 X 2 正确intC 0 块内定义的变量 X 2 Y 3 正确C X a 3 b 4 错误 2020 4 6 语句块内变量的应用目的 voidmain intX 局部变量for X 1 X 10 X 在此时X才被释放 voidmain for intX 1 X 10 X 块内变量 在此时X就被释放 通过缩小变量的作用域来缩短变量的生存期 充分利用内存空间 优化内存的使用 2020 4 6 引用 别名的定义 同一实体 两个不同的名称 C 中的引用 同一内存单元两种不同的变量名 作用 通过引用 可以实现在不同的作用域内访问同一内存单元 四 变量的引用操作符 引言 2020 4 6 voidmain intx 1 fun x voidfun int 您知道x与a是什么关系吗 2020 4 6 变量引用定义的语法 类型定义符即sumData与sumValue为同一个变量 但在不同的应用场合下 作用域内 以不同的变量名出现 2020 4 6 为什么要提供引用操作符 C 中的引用主要是用来解决函数调用中形参为指针型的参数时其函数体时的不安全性 易出错 使得操作更加简单 安全 2020 4 6 2020 4 6 引用调用的优点 通过引用调用可以提高调用速度 因为只需要传送地址而不需要直接将大量数据拷贝 因而特别适用于形参为大量数据的应用场合 structData inta 1000 AData voidfun structDataX structData inta 1000 AData voidfun structData X 改进为 您知道为什么要这样做呢 2020 4 6 正确区分传值调用与传地址调用 传值调用 当函数的形参是以 值 的形式定义时 系统将以传值拷贝方式被调用 在调用时实参拷贝到形参 在内存中将同时存在实参和形参 调用时占用两倍的内存空间 调用时的效率较低 传地址调用 当函数的形参是以 地址 的形式定义时 它将以传地址方式被调用 在调用时系统将实参的地址传送到形参中 但在内存中将仅有一份参数存在 此时实参和形参变为同一变量 调用时的效率较高 2020 4 6 区分引用在如下两种场合的差别 1 对一般的变量进行引用 如引用的变量不是用作函数的形参或返回值 则说明时必须加以初始化以指明它的同地址变量 voidmain void intX 3 int a为refX的引用 2020 4 6 第2种场合 intadd int 正确的参数声明 错误的参数声明 2 函数的形参为引用 如引用的变量用作函数的形参或返回值 则说明时不要加以初始化以指明它的同地址变量 此时形参为实参的引用 intadd int 2020 4 6 函数形参定义为引用参数时的调用要求 intadd int 调用错误 您知道为什么错误吗 调用时实参不能为常量而必须为赋已知值的变量 因为编译器无法为常量 无内存地址 建立内存地址 从而无法产生引用 同时在函数调用时系统将实参地址拷贝到形参 从而使形参即为实参 但在函数体内采用形参名来访问它 2020 4 6 函数形参为引用参数时的编程效果 include iostream h voidIncValue int 表面上为改变X的值 其实是改变了main 内的A的值 其一能在一个函数体内访问或修改另一个函数体内定义的变量的值 2020 4 6 其二是能使某一函数间接实现 多个返回值 因为在正常情况下 函数只能实现返回一个值 include iostream h voidCalculate intR float Len引用到Length 2020 4 6 函数的返回值也可以声明为引用 include iostream h int 显示A 2 的值为55 您知道为什么值为55吗 该问题可能有点难 C 中不仅函数的形参可以定义为引用 而且函数的返回值也可以声明为引用 这可以使函数调用的表达式用于左值 2020 4 6 C语言中变量命名的要求 在同一个程序中应该尽可能保持变量名的唯一性 最好不要同名 include iostream h intX 1 voidmain intX 2 cout X 此时输出的X值是为 1 还是 2 应该为2 因为系统采用同名覆盖原则决定 如果要输出全局变量X的值 怎么办 相同吗 五 全局作用域限定符 引言 2020 4 6 C 中的全局作用域限定符 作用 它能使程序员访问在某外部块中所定义的全局变量 以免被同名的局部变量所覆盖 访问规则 有 限定的同名符号是全局变量 无 限定的同名符号是局部变量 include iostream h intX 1 voidmain intX 2 cout localX X 未限定时的符号名为局部符号名cout globalX X 采用 限定时的符号名为全局符号名 2020 4 6 全局作用域限定符的编程规则 1 只能将 放在具有全局符号名说明的变量名之前 不能放在无全局符号名说明的局部变量名之前 intX 1 voidmain void intX 2 intY 3 X 10 正确 因为有同名的全局符号名说明 Y 4 错误 因为无同名的全局符号名说明 2020 4 6 全局作用域限定符的编程规则 2 它为WindowsAPI全局函数 2020 4 6 C语言中的内存分配操作方式 利用malloc 申请内存空间 同时利用free 释放它 程序例 int buffer malloc 1024 buffer 0 1 free buffer 您知道该方法的缺点吗 六 有关动态内存分配的操作符new和delete 2020 4 6 C 语言中的内存分配操作方式 不仅可以采用上述C语言中的方式同时也可以采用C 中新增加的方式 即利用new与delete操作符 这样编程更简单 2020 4 6 为什么C 不把malloc free淘汰 既然new delete的功能完全覆盖了malloc free 为什么C 不把malloc free淘汰出局呢 这是因为C 程序经常要调用C函数 而C程序只能用malloc free管理动态内存 2020 4 6 C 中的new的使用规则 功能 利用它可以申请内存空间 因为它返回指向特定内存的地址 如果申请或分配失败 如内存空间不够 则返回NULL 2020 4 6 C 中的new的使用规则 用法1 new类型定义符 申请单个内存空间时如 int ptr ptr newint 此时在内存中 数据堆中 分配一个int的内存单元 并返回该内存单元的地址 区别堆变量和栈变量的差别 用法2 new类型定义符 元素的个数 申请一批内存空间时如 char ptr ptr newchar 1024 此时在内存中 数据堆中 分配1024个内存单元 1KB的缓冲区 并返回该缓冲区的地址 2020 4 6 区别如下两种不同的用法 int ptr newint 5 定义分配一个int的内存单元并且赋初始值为5 然后返回该内存单元的地址到ptr中 int ptr newint 5 定义分配一个int的数组 总计为5个元素 ptr指向该数组的起始地址 您知道其中的 5 各代表什么含义吗 2020 4 6 C 中的delete的用法 功能 利用它可以将由new所申请的内存空间释放 删除掉 用法 delete内存地址 一般为指针变量名 如 deleteptr 2020 4 6 new与delete的应用要点 利用它们可以替代C语言中的malloc free 函数 但比它们更方便 编程更简单 voidmain int ptr newint 申请内存空间 创建出一个无名的int类型的数据堆变量 ptr 1 操作该无名的int堆变量cout ptr deleteptr 删除该无名的int堆变量 2020 4 6 delete只能删除由new所创建的内存空间 intX 1 int ptr1 错误 应该为ptr2 它们用来管理动态内存空间 内存空间的生存期可以由程序员控制 2020 4 6 voidmain intX 1 创建出栈变量 其生存期为函数结束 并且由系统来自动释放int ptr newint 创建出无名的堆变量 其生存期由程序员控制 ptr 1 deleteptr 此时将删除由new所创建的内存空间 程序员可以控制其生存期 此时变量X才被释放 2020 4 6 具有以函数体语句取代函数调用语句以进行宏替换特性的函数 如 inlineintadd intX intY returnX Y voidmain intSum add 1 2 系统将以Sum 1 2 来替换Sum add 1 2 定义格式 inline函数定义如 inlineintadd intX intY returnX Y 七 C 中的内联函数 2020 4 6 使用内联函数的应用目的 C 中提供内联函数的主要目的是改进C中带参数的宏替换 以提高使用时的安全性 defineSquare X X X即将X2采用Square X 来替换 使用时如Y Square 3 3 3 9正确Y Square 1 2 1 2 1 2 5 9 因而宏替换有错误 如果改用内联函数则可以避免此种错误 系统在调用时首先进行实参的表达式计算 然后再进行宏替换 inlineintSquare intX returnX X 调用时Square 1 2 Square 3 9 结果值为9 2020 4 6 内联函数的应用场合 Function intx inty x y进栈 断点进栈 断点弹栈 x y弹栈 当使用函数的开销 进栈 参数传递 调用 弹栈 返回等 不足以补偿由于使用了这个函数而带来的好处时 此时应放弃函数调用而采用宏替换 这可以采用内联函数 函数体较短小时 如2至3条语句时 2020 4 6 内联函数的编程要求 inlineintadd intX intY returnX Y 内联函数定义在使用之前voidmain void add 1 2 正确 voidmain void add 1 2 inlineintadd intX intY returnX Y 错误 因为内联函数定义在使用之后 无法在编译时替换 因为系统在编译时要进行宏替换 您理解了吗 内联函数应 定义在前 使用在后 以便编译器能正确进行宏替换 2020 4 6 不适宜定义为内联函数的场合 如果函数体内有循环语句 条件语句 开关switch等控制流语句时 不能定义为内联函数 因为它们有改变程序流程的语句 系统无法正确地进行宏替换 inlineintadd inta intb if a b a a b returna 错误 此时不能定义为内联函数 2020 4 6 八 带默认 缺省 形参值的函数 回顾C语言中定义与函数调用规则 必须保证实参与形参在个数与类型两方面相互匹配 2020 4 6 intadd intX intY returnX Y voidmain add 1 2 调用正确 因为实参与形参在个数与类型两方面相互匹配add 1 调用错误 因为实参与形参在个数方面不相互匹配add 1 1 2 2 调用错误 因为实参与形参在类型方面不相互匹配 您回顾起来了吗 2020 4 6 C 语言中的函数定义与调用的规则 一方面遵守C语言的规则 实参与形参在个数与类型两方面相互匹配 同时也允许实参与形参在个数方面不相互匹配 但此时该函数应定义为带缺省形参值的函数 2020 4 6 intadd intX 3 intY 4 returnX Y voidmain add 1 2 调用正确 因为实参与形参在个数与类型两方面相互匹配add 1 调用正确 采用缺少省定义的形参值add 调用正确add 1 1 2 2 调用错误 因为实参与形参在类型方面不相互匹配 您知道这是什么函数吗 2020 4 6 C 中的带缺省形参值的函数 C 中允许函数在定义时可以预先定义出默认的形参值 调用时如给出实参 则采用实参值 否则采用预先定义出的默认形参值作为实参 2020 4 6 intadd intX 5 intY 6 returnX Y voidmain void add 10 20 10 20调用时如给出实参 则采用实参值add 10 10 6采用预先定义出的默认形参值作为实参add 5 6采用预先定义出的默认形参值作为实参 2020 4 6 带缺省形参值的函数定义格式 函数在定义时可以预先以 定义出默认的形参值 intadd intX 5 intY 6 returnX Y 您知道参数5与6是该函数的什么参数吗 2020 4 6 正确设置缺省形参值的方法 缺省形参值必须从右向左顺序定义intadd intX intY 5 intZ 6 正确在缺省形参值的右面不能有非缺省形参值定义 因为调用时实参取代形参是从左向右的顺序 C语言的规则 因而后两种函数定义在调用时将会出现某些形参未被赋值 intadd intX 1 intY 5 intZ 错误 如add 3 4 intadd intX 1 intY intZ 6 错误 如add 2020 4 6 缺省形参值的摆放位置 遵守 先定义后使用的原则 即函数调用出现在定义之前时 缺省形参值必需在函数的原型说明中给出 而当函数调用出现在定义之后时 则需在函数定义时给出 intadd intX 5 intY 6 voidmain void add 函数调用 intadd intX intY returnX Y intadd intX 5 intY 6 returnX Y 函数定义 voidmain void add 函数调用出现在定义之前时 函数调用出现在定义之后时 2020 4 6 缺省形参值的编程特性 在相同的作用域内 缺省形参值的说明应保持唯一 但如在不同的作用域内 可以允许说明不同的缺省形参值 2020 4 6 intadd intX 1 intY 2 定义出全局缺省形参值voidmain void intadd intX 3 intY 4 定义出局部缺省形参值add 使用局部缺省形参值 voidfun void add 使用全局缺省形参值 您知道该定义代表什么含义吗 此时的实参分别是多少 2020 4 6 缺省形参值的应用场合 classTV voidsetChannel intNumber 1 默认为中央一台 voidshowImage voidmain TvmyTV myTV setChannel 使用默认的中央一台myTV showImage myTV setChannel 8 改变为其它的中央台myTV showImage 为了给使用者提供一种功能 但允许以多种方式来操作 2020 4 6 C语言中函数的命名规则 在同一个程序内不能出现同名函数 intadd intX intY returnX Y floatadd floatX floatY returnX Y 错误 出现同名函数 这在C语言中是不允许的 但在C 中又怎样呢 九 C 中的重载函数 2020 4 6 C 中的重载函数的定义 C 中允许将功能相近的函数在相同的作用域内被定义 从而形成重载函数 同名而不同形参定义 的函数 classTV voidsetChannel Remoteobj 使用遥控器来改变电视频道 voidsetChannel Handobj 使用手动方式来改变电视频道 您理解了什么是重载函数吗 2020 4 6 为什么要提供重载函数 在C语言中不允许出现同名函数 但是有许多函数 它们的功能是相近的或相同的 如果它们能以相同的函数名命名 则在功能命名上统一 这样可以减少使用者对函数名的记忆 2020 4 6 intintAdd intX intY floatfloatAdd floatX floatY charcharAdd charX charY intAdd intX ntY floatAdd floatX floatY charAdd charX c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 38717-2026水陆两栖飞机术语
- 协鑫消防制度上墙模板
- 建筑工地消防制度范本
- 预制厂消防制度
- 物流园安全消防制度
- 单位要落实消防制度
- 个体门店消防制度
- 美业卫生监督管理制度
- 连锁内部财务制度
- 餐饮公司卫生防疫制度
- 中科曙光入职在线测评题库
- 叉车初级资格证考试试题与答案
- 2025至2030中国新癸酸缩水甘油酯行业发展研究与产业战略规划分析评估报告
- 剪映完整课件
- 新疆机井管理办法
- 导热油事故现场处置方案夏君96课件
- DB32∕T 310026-2024 雷电防护装置检测部位及检测点确认技术规范
- GB/T 45680-2025起重机风载荷计算
- 会销主持培训课件
- 提高鼻饲护理质量品管圈
- 白酒品鉴酒管理制度
评论
0/150
提交评论