C语言程序设计清华大学郑莉第五章C程序的结构.ppt

上传人:max****ui 文档编号:6333062 上传时间:2020-02-23 格式:PPT 页数:58 大小:381.50KB
返回 下载 相关 举报
C语言程序设计清华大学郑莉第五章C程序的结构.ppt_第1页
第1页 / 共58页
C语言程序设计清华大学郑莉第五章C程序的结构.ppt_第2页
第2页 / 共58页
C语言程序设计清华大学郑莉第五章C程序的结构.ppt_第3页
第3页 / 共58页
点击查看更多>>
资源描述
第五章C 程序的结构 清华大学郑莉 C 语言程序设计 2 本章主要内容 作用域与可见性对象的生存期数据与函数静态成员共享数据的保护友元编译预处理命令多文件结构和工程 3 函数原形的作用域 函数原型中的参数 其作用域始于 结束于 例如 设有下列原型声明 doubleArea doubleradius radius的作用域仅在于此 不能用于程序正文其他地方 因而可有可无 作用域与可见性 4 块作用域 在块中声明的标识符 其作用域自声明处起 限于块中 例如 voidfun inta intb a cin b if b 0 intc 作用域与可见性 5 类作用域 类作用域作用于特定的成员名 类X的成员M具有类作用域 对M的访问方式如下 如果在X的成员函数中没有声明同名的局部作用域标识符 那么在该函数内可以访问成员M 通过表达式x M或者X M访问 通过表达式prt M 作用域与可见性 6 文件作用域 不在前述各个作用域中出现的声明 具有文件作用域 这样声明的标识符的作用域开始于声明点 结束于文件尾 作用域与可见性 7 可见性 可见性是从对标识符的引用的角度来谈的概念可见性表示从内层作用域向外层作用域 看 时能看见什么 如果标识在某处可见 则就可以在该处引用此标识符 作用域与可见性 8 可见性 标识符应声明在先 引用在后 如果某个标识符在外层中声明 且在内层中没有同一标识符的声明 则该标识符在内层可见 对于两个嵌套的作用域 如果在内层作用域内声明了与外层作用域中同名的标识符 则外层作用域的标识符在内层不可见 作用域与可见性 9 同一作用域中的同名标识符 在同一作用域内的对象名 函数名 枚举常量名会隐藏同名的类名或枚举类型名 重载的函数可以有相同的函数名 作用域与可见性 10 includeinti 文件作用域intmain i 5 inti 块作用域i 7 cout i i endl 输出7 cout i i 输出5return0 作用域与可见性 例5 1 11 对象的生存期 对象从产生到结束的这段时间就是它的生存期 在对象生存期内 对象将保持它的值 直到被更新为止 12 静态生存期 这种生存期与程序的运行期相同 在文件作用域中声明的对象具有这种生存期 在函数内部声明静态生存期对象 要冠以关键字static 对象的生存期 13 includeinti 5 文件作用域intmain cout i i endl return0 i具有静态生存期 对象的生存期 例 14 动态生存期 块作用域中声明的 没有用static修是的对象是动态生存期的对象 习惯称局部生存期对象 开始于程序执行到声明点时 结束于命名该标识符的作用域结束处 对象的生存期 15 includevoidfun intmain fun fun voidfun staticinta 1 inti 5 a i cout i i a a endl 运行结果 i 6 a 2i 6 a 3i是动态生存期a是静态生存期 对象的生存期 例 16 例5 2变量的生存期与可见性 includeinti 1 i为全局变量 具有静态生存期 intmain staticinta 静态局部变量 有全局寿命 局部可见 intb 10 b c为局部变量 具有动态生存期 intc 0 voidother void cout MAIN n cout i i a a b b c c endl c c 8 other cout MAIN n cout i i a a b b c c endl i i 10 other 对象的生存期 voidother void staticinta 2 staticintb a b为静态局部变量 具有全局寿命 局部可见 只第一次进入函数时被初始化 intc 10 C为局部变量 具有动态生存期 每次进入函数时都初始化 a a 2 i i 32 c c 5 cout OTHER n cout i i a a b b c c endl b a 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 19 例5 3具有静态 动态生存期对象的时钟程序 includeclassClock 时钟类声明 public 外部接口Clock voidSetTime intNewH intNewM intNewS 三个形参均具有函数原型作用域voidShowTime Clock 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 引用具有块作用域的对象 21 程序的运行结果为 Firsttimeoutput 0 0 0Secondtimeoutput 8 30 30 22 23 数据与函数 数据存储在局部对象中 通过参数传递实现共享 函数间的参数传递 数据存储在全局对象中 将数据和使用数据的函数封装在类中 数据与函数 24 使用全局对象 includeintglobal voidf global 5 voidg cout global endl intmain f g 输出 5 return0 数据与函数 25 将函数与数据封装 includeclassApplication public voidf voidg private intglobal voidApplication f global 5 voidApplication g cout global endl intmain ApplicationMyApp MyApp f MyApp g return0 数据与函数 26 静态成员 静态数据成员用关键字static声明该类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化 用 来指明所属的类 静态成员函数类外代码可以使用类名和作用域操作符来调用静态成员函数 静态成员函数只能直接引用属于该类的静态数据成员或静态成员函数 静态成员 27 例5 4具有静态数据成员的Point类 includeusingnamespacestd classPoint public Point intxx 0 intyy 0 X xx Y yy countP Point Point 静态成员 Point Point Point 28 29 静态成员函数举例 includeclassApplication public staticvoidf staticvoidg private staticintglobal intApplication global 0 voidApplication f global 5 voidApplication g cout global endl intmain Application f Application g return0 静态成员 30 静态成员函数举例 classA public staticvoidf Aa private intx voidA f Aa cout x 对x的引用是错误的cout a x 正确 静态成员 31 具有静态数据 函数成员的Point类 includeclassPoint Point类声明 public 外部接口Point intxx 0 intyy 0 X xx Y yy countP Point Point 静态成员 Point Point Point 输出对象号 类名引用 32 33 友元 友元是C 提供的一种破坏数据封装和数据隐藏的机制 通过将一个模块声明为另一个模块的友元 一个模块能够引用到另一个模块中本是被隐藏的信息 可以使用友元函数和友元类 为了确保数据的完整性 及数据封装与隐藏的原则 建议尽量不使用或少使用友元 友元 34 友元函数 友元函数是在类声明中由关键字friend修饰说明的非成员函数 在它的函数体中能够通过对象名访问private和protected成员作用 增加灵活性 使程序员可以在封装和快速性方面做合理选择 访问对象中的成员必须通过对象名 友元 35 例5 6使用友元函数计算两点距离 include includeclassPoint Point类声明 public 外部接口Point intxx 0 intyy 0 X xx Y yy intGetX returnX intGetY returnY friendfloatDistance Point 友元 doubleDistance Point 36 37 友元类 若一个类为另一个类的友元 则此类的所有成员都能访问对方类的私有成员 声明语法 将友元类名在另一个类中使用friend修饰说明 友元 38 友元类举例 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 40 友元关系是单向的 如果声明B类是A类的友元 B类的成员函数就可以访问A类的私有和保护数据 但A类的成员函数却不能访问B类的私有 保护数据 41 常类型 常类型的对象必须进行初始化 而且不能被更新 常引用 被引用的对象不能被更新 const类型说明符 引用名常对象 必须进行初始化 不能被更新 类名const对象名常数组 数组元素不能被更新 下一章介绍 类型说明符const数组名 大小 常指针 指向常量的指针 下一章介绍 共享数据的保护 42 例5 7常引用作形参 includevoiddisplay constdouble 共享数据的保护 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 8常成员函数举例 includeclassR 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 const 46 47 例5 9常数据成员举例 includeclassA public A inti voidprint constint 共享数据的保护 constintA b 10 A A inti a i r a voidA print cout a b r endl intmain 建立对象a和b 并以100和0作为初值 分别调用构造函数 通过构造函数的初始化列表给对象的常数据成员赋初值 Aa1 100 a2 0 a1 print a2 print 48 49 编译预处理命令 include包含指令将一个源文件嵌入到当前源文件中该点处 include按标准方式搜索 文件位于C 系统目录的include子目录下 include 文件名 首先在当前目录中搜索 若没有 再按标准方式搜索 define宏定义指令定义符号常量 很多情况下已被const定义语句取代 定义带参数宏 已被内联函数取代 undef删除由 define定义的宏 使之不再起作用 50 条件编译指令 if和 endif if常量表达式 当 常量表达式 非零时编译程序正文 endif 编译预处理命令 51 条件编译指令 else if常量表达式 当 常量表达式 非零时编译程序正文1 else 当 常量表达式 为零时编译程序正文2 endif 编译预处理命令 52 条件编译指令 elif if常量表达式1程序正文1 当 常量表达式1 非零时编译 elif常量表达式2程序正文2 当 常量表达式2 非零时编译 else程序正文3 其他情况下编译 endif 编译预处理命令 53 条件编译指令 ifdef标识符程序段1 else程序段2 endif如果 标识符 经 defined定义过 且未经undef删除 则编译程序段1 否则编译程序段2 编译预处理命令 54 条件编译指令 ifndef标识符程序段1 else程序段2 endif如果 标识符 未被定义过 则编译程序段1 否则编译程序段2 编译预处理命令 55 多文件结构 例5 10 一个源程序可以划分为多个源文件 类声明文件 h文件 类实现文件 cpp文件 类的使用文件 main 所在的 cpp文件 利用工程来组合各个文件 56 不使用条件编译的头文件 main cpp include file1 h include file2 h intmain file1 h include head h file2 h include head h head h classPoint 多文件结构 57 使用条件编译的头文件 head h ifndefHEAD H defineHEAD H classPoint endif 多文件结构 58 小结与复习建议 主要内容作用域与可见性 对象的生存期 数据的共享与保护 友元 编译预处理命令 多文件结构和工程达到的目标深入理解程序的结构 模块间的关系 数据共享 实验任务实验五
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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