收藏 分享(赏)

第五章-多文件结构.ppt

上传人:无敌 文档编号:968844 上传时间:2018-05-09 格式:PPT 页数:66 大小:1.03MB
下载 相关 举报
第五章-多文件结构.ppt_第1页
第1页 / 共66页
第五章-多文件结构.ppt_第2页
第2页 / 共66页
第五章-多文件结构.ppt_第3页
第3页 / 共66页
第五章-多文件结构.ppt_第4页
第4页 / 共66页
第五章-多文件结构.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

1、数据的共享与保护,作用域与可见性对象的生存期数据与函数静态成员共享数据的保护友元编译预处理命令多文件结构和工程,5-1-1 标识符作用域,1函数原型作用域,例如,以下函数原型编译器认为是相同的:double funPrototype ( double , double ) ;double funPrototype ( double a , double b ) ;double funPrototype ( double x , double y ) ;,函数原型形式参数表中的标识符具有函数原型作用域,作用域指标识符能够被使用的范围。只有在作用域内标识符才可以被访问(称为可见)。,函数原型中的参

2、数,其作用域始于(,结束于)。例如,设有下列原型声明:double Area(double radius);,radius 的作用域仅在于此,不能用于程序正文其他地方,因而可有可无。,2块作用域,在语句块中声明的标识符具有块作用域,/ 例 不同作用域的同名变量#includeusing namespace std ;int main() int a = 1;/ 外层的a int a = 1 ;/ 内层的a a + ; cout inside a = a endl ; / 内层的a作用域结束cout outside a = a endl ;/ 外层的a作用域结束,2块作用域,在语句块中声明的标识

3、符具有块作用域,/ 例3-25 不同作用域的同名变量#includeusing namespace std ;int main() int a = 1;/ 外层的a int a = 1 ;/ 内层的a a + ; cout inside a = a endl ; / 内层的a作用域结束cout outside a = a M,4类作用域,5文件作用域,任何在函数之外声明的标识符具有文件作用域 这种标识符从声明处起至文件尾的任何函数都可见,/ 例 使用文件作用域变量#include using namespace std ;int a = 1, b = 1 ;void f1( int x ) a

4、 = x * x ; b = a * x ;int c ; void f2( int x, int y ) a = x y ? x : y ; b = x y ? x : y ; c = x + y ; int main() f1( 4 ) ; cout call function f1 :n ; cout a = a , b = b endl ; f2 (10, 23 ) ; cout call function f2 :n ; cout a = a , b = b , c = c y ? x : y ; b = x y ? x : y ; c = x + y ; int main() f1

5、( 4 ) ; cout call function f1 :n ; cout a = a , b = b endl ; f2 (10, 23 ) ; cout call function f2 :n ; cout a = a , b = b , c = c y ? x : y ; b = x y ? x : y ; c = x + y ; int main() f1( 4 ) ; cout call function f1 :n ; cout a = a , b = b endl ; f2 (10, 23 ) ; cout call function f2 :n ; cout a = a ,

6、 b = b , c = c endl ;,/ a, b的作用域从这里开始,/ f1函数可以访问a,b,/ f2函数可以访问a, b,/ main 函数可以访问a, b,/ c 的作用域从这里开始,默认初始值为0,/ f2函数可以访问a, b, c,/ main 函数可以访问a, b, c,6全局变量和局部变量,具有文件作用域的变量称为全局变量;具有函数作用域 或块作用域的变量称为局部变量 全局变量声明时默认初始值为0 当局部量与全局量同名,在块内屏蔽全局量 为了在块内访问全局量,可以用域运算符 : ,6全局变量和局部变量,/ 在函数体内访问全局变量#includeusing namespac

7、e std ;int x ;int main() int x = 256 ; cout global variable x = :x endl ; cout local variable x = x endl ;,6全局变量和局部变量,/ 在函数体内访问全局变量#includeusing namespace std ;int x ;int main() int x = 256 ; cout global variable x = :x endl ; cout local variable x = x endl ;,访问全局量,6全局变量和局部变量,/ 在函数体内访问全局变量#includeus

8、ing namespace std ;int x ;int main() int x = 256 ; cout global variable x = :x endl ; cout local variable x = x endl ;,访问局部量,6全局变量和局部变量,/ 在函数体内访问全局变量#includeusing namespace std ;int x ;int main() int x = 256 ; cout global variable x = :x endl ; cout local variable x = x a; cinb; couta+b=a+ba; cinb;

9、couta+b=a+ba; cinb; couta+b=a+ba; cinb; couta+b=a+ba; cinb; couta+b=a+ba; cinb; couta+b=a+ba; cinb; couta+b=a+ba; cinb; couta+b=a+ba; cinb; couta+b=a+ba; cinb; couta+b=a+ba; cinb; couta+b=a+ba; cinb; couta+b=a+ba; std:cinb; std:couta+b=a+ba; std:cinb; std:couta+b=a+ba; std:cinb; std:couta+b=a+ba; st

10、d:cinb; std:couta+b=a+bn; ,使用标准名空间,/指定使用std的元素cin,/指定使用std的元素cout,定义名空间,定义命名空间语法:namespace ,namespace A void f(); void g(); namespace B void h(); namespace C /嵌套命名空间 void i(); namespace A /为namespace A追加说明 void j(); ,定义名空间,定义命名空间语法:using namespace 名空间 ;或using 名空间:元素 ;,/例 演示命名空间的使用 #includeusing name

11、space std;namespace A void f() cout f() : from namespace An; void g() cout g() : from namespace An ; namespace B void f() cout f() : from namespace Bn ; namespace C void f() cout f() : from namespace Cn ; void g() cout g() : from global namespace“ endl ;,int main() g() ; using namespace A; f() ; B:f

12、() ; B:C:f() ; A:g() ;,可见性,可见性从另一个角度说明标识符的有效性,可见性与作用域具有一定的一致性。标识符的作用域包含可见范围,可见范围不会超过作用域。可见性在理解同名标识符的作用域嵌套时十分直观。对于外层块与内层块定义了同名标识符的,在外层作用域中,内层所定义的标识符是不可见的,即外层引用的是外层所定义的标识符;同样,在内层作用域中,外层的标识符将被内层的同名标识符屏蔽,变得不可见,即外层中同名标识符的可见范围为作用域中挖去内层块的范围。,可见性,下面的程序段和图示显示作用域与可见性。 int m=1;float x; float m=3.5; X=5.5;m+;,i

13、nt m, float x作用域int m可见float m不可见x可见,float m作用域float m可见int m不可见x可见,5-2 生命期,(1)静态生命期,(2)局部生命期,(3)动态生命期,生命期(Life time)也叫生存期。生命期与存储区域相关,存储区域分为代码区、静态数据区、栈区和堆区,相应地,生命期分为静态生命期、局部生命期和动态生命期。,(1)静态生命期,静态生命期指的是标识符从程序开始运行时存在,即具有存储空间,到程序运行结束时消亡,即释放存储空间。具有静态生命期的标识符存放在静态数据区,属于静态存储类型,如全局变量、静态全局变量、静态局部变量。具有静态生命期的标

14、识符在未被用户初始化的情况下,系统会自动将其初始化为全0。 函数驻留在代码区,也具有静态生命期。所有具有文件作用域的标识符都具有静态生命期。,(2)局部生命期,在函数内部或块中定义的标识符具有局部生命期,其生命期开始于执行到该函数或块的标识符声明处,结束于该函数或块的结束处。具有静态生命期的标识符存放在栈区。具有局部生命期的标识符如果未被初始化,其内容是随机的,不可用。 具有局部生命期的标识符必定具有局部作用域;但反之不然,静态局部变量具有局部作用域,但却具有静态生命期。,(3)动态生命期,具有动态生命期的标识符由特定的函数调用或运算来创建和释放,如调用malloc()或用new运算符为变量分

15、配存储空间时,变量的生命期开始,而调用free()或用delete运算符释放空间或程序结束时,变量生命期结束。具有动态生命期的变量存放在堆区。关于new运算和delete运算将在指针一章中介绍。,#includevoid fun();int main() fun(); fun();void fun() static int a=1; int i=5; a+; i+; couti=i,a=aendl;,运行结果:i=6, a=2i=6, a=3i是动态生存期a是静态生存期,例5-2 变量的生存期与可见性,#includeint i=1; / i 为全局变量,具有静态生存期。int main()

16、static int a;/ 静态局部变量,有全局寿命,局部可见。 int b=-10; / b, c为局部变量,具有动态生存期。 int c=0; void other(void); cout-MAIN-n; cout i: i a: a b: b c: cendl; c=c+8; other(); cout-MAIN-n; cout i: i a: a b: b c: cendl; i=i+10; other(); ,void other(void) static int a=2; static int b; / a,b为静态局部变量,具有全局寿命,局部可见。 /只第一次进入函数时被初始化

17、。 int c=10; / C为局部变量,具有动态生存期, /每次进入函数时都初始化。 a=a+2; i=i+32; c=c+5; cout-OTHER-n; cout i: i a: a b: b c: cendl; b=a;,17,运行结果:-MAIN- i: 1 a: 0 b: -10 c: 0-OTHER- i: 33 a: 4 b: 0 c: 15-MAIN- i: 33 a: 0 b: -10 c: 8-OTHER- i: 75 a: 6 b: 4 c: 15,18,例5-3具有静态、动态生存期对象的时钟程序,#includeclass Clock/时钟类声明public:/外部接

18、口Clock();void SetTime(int NewH, int NewM, int NewS); /三个形参均具有函数原型作用域void ShowTime();Clock()private:/私有数据成员int Hour,Minute,Second;,/时钟类成员函数实现Clock:Clock() /构造函数Hour=0;Minute=0;Second=0;void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;void Clock:ShowTime()coutHour:Minute

19、:Secondendl;,20,Clock globClock;/声明对象globClock, /具有静态生存期,文件作用域int main()/主函数coutFirst time output:endl;/引用具有文件作用域的对象:globClock.ShowTime();/对象的成员函数具有类作用域globClock.SetTime(8,30,30);Clock myClock(globClock); /声明具有块作用域的对象myClockcoutSecond time output:endl;myClock.ShowTime();/引用具有块作用域的对象,21,程序的运行结果为:Firs

20、t time output:0:0:0Second time output:8:30:30,22,多文件程序结构,一个C+程序称为一个工程(.dsp) 一个工程由一个或多个文件组成 一个文件可以包含多个函数定义,但一个函数的定义必须 完整地存在于一个文件中 一个文件可以被多个应用程序共享,多文件结构,一个好的软件系统应当分解为各种同构逻辑文件,例 计算圆面积和矩形面积,例计算圆面积和矩形面积,例3-27 计算圆面积和矩形面积,预处理指令,C+编译器工作过程,预处理器 改善程序的组织和管理预处理指令 所有编译指令以 # 开头,每条指令单独占一行,预处理指令,1文件包含,include指令在编译之

21、前把指定文件包含到该命令所在位置,# include 或# include 文件名 ,形式为:,系统头文件,预处理指令,1文件包含,include指令在编译之前把指定文件包含到该命令所在位置,# include 或# include 文件名 ,形式为:,自定义头文件,预处理指令,2条件编译,形式1# if 常量表达式程序段# endif,形式2# if 常量表达式程序段1# else程序段2# endif,形式3# if 常量表达式1程序段1 # elif 常量表达式2程序段2# elif 常量表达式n程序段n# else程序段n+1# endif,预处理指令,3宏定义指令,用指定正文替换程序

22、中出现的标识符 形式#define 标识符 文本,C语言的宏替换直接做文本替换,没有类型检查。C+也支持。,#includeusing namespace std ;/不带参数宏替换。在程序正文中,用3.1415926代替PI#define PI 3.1415926/带参数宏替换。在程序正文中,PI*r*r代替area(x),r是参数#define area(r) PI*r*r int main() double x, s; x=3.6; s=area(x); couts=sendl;,C语言的宏替换直接做文本替换,没有类型检查。C+也支持。,#includeusing namespace s

23、td ;/不带参数宏替换。在程序正文中,用3.1415926代替PI#define PI 3.1415926/带参数宏替换。在程序正文中,PI*r*r代替area(x),r是参数#define area(r) PI*r*r int main() double x, s; x=3.6; s=area(x); couts=sendl;,/不带参数的宏替换,在C+中使用常量定义:const double PI=3.1415926;,/带参数宏替换,C+使用内联函数:inline double area(double r) return PI*r*r;,预处理指令,3宏定义指令,用指定正文替换程序中出

24、现的标识符 形式#define 标识符 文本,#define 的一个有效应用是在条件编译指令中,避免程序中多次用include指令包含这个头文件,出现重定义的错误,预处理指令,3宏定义指令,/ calculate#ifndef CALCULATE_H / 若CALCULATE_H未定义,执行下一宏指令 #define CALCULATE_H / 用后续3行正文代替CALCULATE_H double circle(double radius) const double pi = 3.14159 ; return pi * radius * radius;#endif,预处理指令,3宏定义指令,/ calculate#ifndef CALCULATE_H / 若CALCULATE_H未定义,执行下一宏指令 #define CALCULATE_H / 用后续3行正文代替CALCULATE_H double circle(double radius) const double pi = 3.14159 ; return pi * radius * radius;#endif,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报