C清华大学出版社第四版课件第五章.ppt

上传人:max****ui 文档编号:8297203 上传时间:2020-03-28 格式:PPT 页数:68 大小:586.50KB
返回 下载 相关 举报
C清华大学出版社第四版课件第五章.ppt_第1页
第1页 / 共68页
C清华大学出版社第四版课件第五章.ppt_第2页
第2页 / 共68页
C清华大学出版社第四版课件第五章.ppt_第3页
第3页 / 共68页
点击查看更多>>
资源描述
第五章C 程序的结构 东华理工大学信息工程学院 C 语言程序设计 2 本章主要内容 作用域与可见性对象的生存期数据与函数静态成员共享数据的保护友元编译预处理命令多文件结构和工程深度探索 3 函数原形的作用域 函数原型中的参数 其作用域始于 结束于 例如 设有下列原型声明 doublearea doubleradius radius的作用域仅在于此 不能用于程序正文其他地方 因而可有可无 作用域与可见性 4 局部作用域 函数的形参 在块中声明的标识符 其作用域自声明处起 限于块中 例如 voidfun inta intb a cin b if b 0 intc 作用域与可见性 a的作用域 5 类作用域 类作用域作用于特定的成员名 类X的成员m具有类作用域 对m的访问方式如下 如果在X的成员函数中没有声明同名的局部作用域标识符 那么在该函数内可以访问成员m 通过表达式x m或者X m访问 通过表达式ptr M 作用域与可见性 6 命名空间 命名空间可以解决类名 函数名等的命名冲突命名空间的声明namespace命名空间名 各种声明 函数声明 类声明 例namespaceSomeNs classSomeClass 特殊的命名空间全局命名空间 默认的命名空间匿名命名空间 对每个源文件是唯一的 作用域与可见性 命名空间作用域 一个命名空间确定了一个命名空间作用域引用其它命名空间作用域中的标识符命名空间名 标识符名例 声明一个SomeClass型的对象SomeNs SomeClassobj1 将其它命名空间作用域的标识符暴露于当前作用域对指定标识符using命名空间名 标识符名 对所有标识符usingnamespace命名空间名 7 作用域与可见性 8 可见性 可见性是从对标识符的引用的角度来谈的概念可见性表示从内层作用域向外层作用域 看 时能看见什么 如果标识在某处可见 则就可以在该处引用此标识符 作用域与可见性 9 可见性 标识符应声明在先 引用在后 如果某个标识符在外层中声明 且在内层中没有同一标识符的声明 则该标识符在内层可见 对于两个嵌套的作用域 如果在内层作用域内声明了与外层作用域中同名的标识符 则外层作用域的标识符在内层不可见 作用域与可见性 10 同一作用域中的同名标识符 在同一作用域内的对象名 函数名 枚举常量名会隐藏同名的类名或枚举类型名 重载的函数可以有相同的函数名 作用域与可见性 11 includeusingnamespacestd inti 在全局命名空间中的全局变量namespaceNs intj 在Ns命名空间中的全局变量 intmain i 5 为全局变量i赋值Ns j 6 为全局变量j赋值 子块1usingnamespaceNs 当前块中可以直接引用Ns中的标识符inti 局部变量 局部作用域i 7 cout i i endl 输出7cout j j endl 输出6 cout i i endl 输出5return0 作用域与可见性 例5 1 12 对象的生存期 对象从产生到结束的这段时间就是它的生存期 在对象生存期内 对象将保持它的值 直到被更新为止 13 静态生存期 这种生存期与程序的运行期相同 在文件作用域中声明的对象具有这种生存期 在函数内部声明静态生存期对象 要冠以关键字static 对象的生存期 14 includeusingnamespacestd inti 5 文件作用域intmain cout i i endl return0 i具有静态生存期 对象的生存期 例 15 动态生存期 块作用域中声明的 没有用static修是的对象是动态生存期的对象 习惯称局部生存期对象 开始于程序执行到声明点时 结束于命名该标识符的作用域结束处 对象的生存期 16 includeusingnamespacestd voidfun intmain fun fun voidfun staticinta 1 inti 5 a i cout i i a a endl 运行结果 i 6 a 2i 6 a 3i是动态生存期a是静态生存期 对象的生存期 例 17 例5 2变量的生存期与可见性 includeusingnamespacestd inti 1 i为全局变量 具有静态生存期 voidother staticinta 2 staticintb a b为静态局部变量 具有全局寿命 局部可见 只第一次进入函数时被初始化 intc 10 C为局部变量 具有动态生存期 每次进入函数时都初始化 a 2 i 32 c 5 cout OTHER n cout i i a a b b c c endl b a 对象的生存期 intmain staticinta 静态局部变量 有全局寿命 局部可见 intb 10 b c为局部变量 具有动态生存期 intc 0 cout MAIN n cout i i a a b b c c endl c 8 other cout MAIN n cout i i a a b b c c endl i 10 other return0 17 运行结果 MAIN i 1a 0b 10c 0 OTHER i 33a 4b 0c 15 MAIN i 33a 0b 10c 8 OTHER i 75a 6b 4c 15 18 20 例5 3具有静态 动态生存期对象的时钟程序 includeusingnamespacestd classClock 时钟类定义public 外部接口Clock voidsetTime intnewH intnewM intnewS 三个形参均具有函数原型作用域voidshowTime private 私有数据成员inthour minute second 对象的生存期 Clock Clock hour 0 minute 0 second 0 构造函数voidClock setTime intnewH intnewM intnewS 三个形参均具有局部作用域hour newH minute newM second newS voidClock showTime cout hour minute second endl 20 ClockglobClock 声明对象globClock 具有静态生存期 文件作用域intmain 主函数cout Firsttimeoutput endl 引用具有文件作用域的对象 globClock showTime 对象的成员函数具有类作用域globClock setTime 8 30 30 ClockmyClock globClock 声明具有块作用域的对象myClockcout Secondtimeoutput endl myClock showTime 引用具有块作用域的对象return0 21 程序的运行结果为 Firsttimeoutput 0 0 0Secondtimeoutput 8 30 30 22 24 数据与函数 数据存储在局部对象中 通过参数传递实现共享 函数间的参数传递 数据存储在全局对象中 将数据和使用数据的函数封装在类中 数据与函数 25 使用全局对象 includeusingnamespacestd intglobal voidf global 5 voidg cout global endl intmain f g 输出 5 return0 数据与函数 26 将函数与数据封装 includeusingnamespacestd classApplication public voidf voidg private intglobal voidApplication f global 5 voidApplication g cout global endl intmain ApplicationMyApp MyApp f MyApp g return0 数据与函数 27 静态成员 静态数据成员用关键字static声明该类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化 用 来指明所属的类 静态成员函数类外代码可以使用类名和作用域操作符来调用静态成员函数 静态成员函数只能引用属于该类的静态数据成员或静态成员函数 静态成员 28 例5 4具有静态数据成员的Point类 includeusingnamespacestd classPoint public Point intx 0 inty 0 x x y y count Point Point 静态成员 Point Point Point 28 30 静态成员函数举例 includeusingnamespacestd classApplication public staticvoidf staticvoidg private staticintglobal intApplication global 0 voidApplication f global 5 voidApplication g cout global endl intmain Application f Application g return0 静态成员 31 静态成员函数举例 classA public staticvoidf Aa private intx voidA f Aa cout x 对x的引用是错误的cout a x 正确 静态成员 32 具有静态数据 函数成员的Point类 includeusingnamespacestd classPoint Point类定义public 外部接口Point intx 0 inty 0 x x y y count Point Point 静态成员 Point Point Point 32 34 友元 友元是C 提供的一种破坏数据封装和数据隐藏的机制 通过将一个模块声明为另一个模块的友元 一个模块能够引用到另一个模块中本是被隐藏的信息 可以使用友元函数和友元类 为了确保数据的完整性 及数据封装与隐藏的原则 建议尽量不使用或少使用友元 友元 35 友元函数 友元函数是在类声明中由关键字friend修饰说明的非成员函数 在它的函数体中能够通过对象名访问private和protected成员作用 增加灵活性 使程序员可以在封装和快速性方面做合理选择 访问对象中的成员必须通过对象名 友元 36 例5 6使用友元函数计算两点距离 include includeclassPoint Point类声明public 外部接口Point intx 0 inty 0 x x y y intgetX returnx intgetY returny friendfloatdist Point 友元 floatdist Point 36 38 友元类 若一个类为另一个类的友元 则此类的所有成员都能访问对方类的私有成员 声明语法 将友元类名在另一个类中使用friend修饰说明 友元 39 友元类举例 classA friendclassB public voiddisplay cout x endl private intx classB public voidset inti voiddisplay private Aa 友元 voidB set inti a x i voidB display a display 39 41 友元关系是单向的 如果声明B类是A类的友元 B类的成员函数就可以访问A类的私有和保护数据 但A类的成员函数却不能访问B类的私有 保护数据 42 常类型 常类型的对象必须进行初始化 而且不能被更新 常对象 必须进行初始化 不能被更新 const类名对象名常引用 被引用的对象不能被更新 const类型说明符 引用名常数组 数组元素不能被更新 下一章介绍 类型说明符const数组名 大小 常指针 指向常量的指针 下一章介绍 共享数据的保护 43 常对象举例 classA public A inti intj x i y j private intx y Aconsta 3 4 a是常对象 不能被更新 共享数据的保护 44 用const修饰的对象成员 常成员函数使用const关键字说明的函数 常成员函数不更新对象的数据成员 常成员函数说明格式 类型说明符函数名 参数表 const 这里 const是函数类型的一个组成部分 因此在实现部分也要带const关键字 const关键字可以被用于参与对重载函数的区分通过常对象只能调用它的常成员函数 常数据成员使用const说明的数据成员 共享数据的保护 45 例5 7常成员函数举例 includeusingnamespacestd classR public R intr1 intr2 r1 r1 r2 r2 voidprint voidprint const private intr1 r2 共享数据的保护 voidR print cout r1 r2 endl voidR print const cout r1 r2 endl intmain Ra 5 4 a print 调用voidprint constRb 20 52 b print 调用voidprint constreturn0 45 47 例5 8常数据成员举例 includeusingnamespacestd classA public A inti voidprint private constinta staticconstintb 静态常数据成员 共享数据的保护 constintA b 10 A A inti a i voidA print cout a b endl intmain 建立对象a和b 并以100和0作为初值 分别调用构造函数 通过构造函数的初始化列表给对象的常数据成员赋初值 Aa1 100 a2 0 a1 print a2 print return0 47 49 例5 9常引用作形参 include includeusingnamespacestd classPoint Point类定义public 外部接口Point intx 0 inty 0 x x y y intgetX returnx intgetY returny friendfloatdist constPoint 共享数据的保护 例5 9常引用作形参 floatdist constPoint 50 共享数据的保护 51 编译预处理命令 include包含指令将一个源文件嵌入到当前源文件中该点处 include按标准方式搜索 文件位于C 系统目录的include子目录下 include 文件名 首先在当前目录中搜索 若没有 再按标准方式搜索 define宏定义指令定义符号常量 很多情况下已被const定义语句取代 定义带参数宏 已被内联函数取代 undef删除由 define定义的宏 使之不再起作用 52 条件编译指令 if和 endif if常量表达式 当 常量表达式 非零时编译程序正文 endif 编译预处理命令 53 条件编译指令 else if常量表达式 当 常量表达式 非零时编译程序正文1 else 当 常量表达式 为零时编译程序正文2 endif 编译预处理命令 54 条件编译指令 elif if常量表达式1程序正文1 当 常量表达式1 非零时编译 elif常量表达式2程序正文2 当 常量表达式2 非零时编译 else程序正文3 其他情况下编译 endif 编译预处理命令 55 条件编译指令 ifdef标识符程序段1 else程序段2 endif如果 标识符 经 defined定义过 且未经undef删除 则编译程序段1 否则编译程序段2 编译预处理命令 56 条件编译指令 ifndef标识符程序段1 else程序段2 endif如果 标识符 未被定义过 则编译程序段1 否则编译程序段2 编译预处理命令 57 多文件结构 例5 10 一个源程序可以划分为多个源文件 类声明文件 h文件 类实现文件 cpp文件 类的使用文件 main 所在的 cpp文件 利用工程来组合各个文件 58 不使用条件编译的头文件 main cpp include file1 h include file2 h intmain file1 h include head h file2 h include head h head h classPoint 多文件结构 59 使用条件编译的头文件 head h ifndefHEAD H defineHEAD H classPoint endif 多文件结构 常成员函数的声明原则 适当地将成员函数声明为常成员函数 能够提高代码质量 凡是不会改变对象状态的函数 都应当声明为常成员函数 什么是改变对象状态 改变对象状态 不简单地等同于改变成员数据的值 只要一个成员函数执行与否 不会影响以后接口函数的调用结果 都可以认为它不会改变对象状态 60 深度探索 常成员函数的声明原则 classLine Line类的定义public 外部接口Line constPoint 61 深度探索 改变数据成员 但不改变对象状态 常成员函数的声明原则 在原则上 应当将getLen声明为常成员函数 但由于修改了数据成员的值 语言规则不允许怎么办 使用mutable关键字mutable关键字使得被修饰的成员对象无视 常对象的成员对象被视为常对象 这一语言原则Mutable须慎用 62 深度探索 修改后的程序代码 63 深度探索 classLine Line类的定义public 外部接口Line constPoint 代码的编译 编译 源文件 目标文件源文件的函数代码 目标文件的代码段源文件的静态对象 目标文件的数据段分为初始化的数据段和未初始化的数据段符号表 将静态对象与函数的名字与地址关联重定位信息 其它信息 64 深度探索 示例代码 1 a cppexterninty intfunc intv intmain intz 1 y func z return0 65 深度探索 示例代码 2 66 func的代码 push ebpmov esp ebp 代码段 text x的初值 3 初始化的数据段 data y 未初始化的数据段 bss 符号表 b o b cppintx 3 inty intfunc intv returnv x 深度探索 代码的连接与执行 连接将各段合并将符号表综合根据重定位信息 确定代码中用到的全局地址代码的执行操作系统首先将文件从磁盘读入 初始化各段 一些静态数据就在此时被初始化从引导代码开始执行 引导代码启动main main返回后 引导代码通知操作系统程序结束 67 深度探索 68 小结与复习建议 主要内容作用域与可见性 对象的生存期 数据的共享与保护 友元 编译预处理命令 多文件结构和工程达到的目标深入理解程序的结构 模块间的关系 数据共享 实验任务实验五
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!