C++程序设计(第5章2011924)_第1页
C++程序设计(第5章2011924)_第2页
C++程序设计(第5章2011924)_第3页
C++程序设计(第5章2011924)_第4页
C++程序设计(第5章2011924)_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中原工学院 2022-3-61第第5章章 作用域及预处理作用域及预处理5.1.1 作用域作用域1.1.作用域的概念作用域的概念n作用域是变量在程序中可引用的区域。2.2.作用域的种类作用域的种类n局部作用域n文件作用域n函数声明(原型)作用域n函数作用域n类作用域中原工学院 2022-3-62局部作用域局部作用域概念概念n当标识符的声明出现在有一对花括号括起来的一段程序(块)内时,该标识符的作用域是从变量声明处开始,在块结束处(即块的右花括号处)为止,该作用域的范围具有局部性。局部作用域又称块作用域。n复合语句是一个块。复合语句中定义的变量,作用域仅在该复合语句中。中原工学院 2022-3-6

2、3局部作用域示例局部作用域示例【例【例5.1】 输入两数,按从大到小的顺序保存,并输出结果。输入两数,按从大到小的顺序保存,并输出结果。#includevoid main() int a,b; /具有函数域 cout输入两整数:ab; cout“a=atb=b=a)int t; / t具有块作用域 t=a; a=b; b=t; /交换a,b的值 couta=atb=bendl; / t已经无效中原工学院 2022-3-642文件作用域文件作用域n文件作用域也称全局作用域n定义在所有函数之外的变量,具有文件作用域;n作用域为从定义处到整个源文件结束n文件中定义的全局变量和函数都具有文件作用域。n

3、如果某个文件中说明了具有文件作用域的变量,该文件又被另一个文件包含,则该标识符的作用域延伸到新的文件中。中原工学院 2022-3-653函数声明作用域函数声明作用域 n在作函数声明时,其中的形参作用域只在声明中,即作用域结束于右括号。n正是由于形参不能被程序的其他地方引用,所以通常只要声明形参个数和类型,形参名可省略。 中原工学院 2022-3-66函数作用域和类作用域函数作用域和类作用域4函数作用域函数作用域n函数中定义的变量,包括形参和函数体中定义的局部变量,作用域都在该函数内,也称作函数域。5类作用域类作用域n在介绍类和对象时,可知类作用域是指类定义范围(包括类的声明部分和相应成员函数实

4、现整个范围)。在该范围内,类的成员函数对数据成员有无限访问权限。中原工学院 2022-3-67作用域作用域总结总结n块作用域:从块内变量定义开始到块结束。n文件作用域:从函数外变量定义开始到文件结束 (可用extern进行扩展)。n函数声明作用域:函数声明内部有效。n函数作用域:从函数开始到函数结束。中原工学院 2022-3-685.1.2 局部变量与全局变量局部变量与全局变量根据作用域的不同,程序中的变量分为:根据作用域的不同,程序中的变量分为:n局部变量n全局变量中原工学院 2022-3-691局部变量局部变量n在函数或者块内定义的变量n局部变量仅在定义它的函数或块内起作用,在这个范围之外

5、不能使用这些变量。局部变量的作用域也称为块作用域。例:例: float f1(int a)int b,c; /局部变量a,b,c有效,局部变量m,n无效 void main( )int n,m; /局部变量m,n有效,局部变量a,b,c无效 中原工学院 2022-3-6101局部变量局部变量局部变量的特点:局部变量的特点:n局部变量在程序运行到它所在的函数或块时在栈中建立,该函数或块块执行完毕局部变量占有的空间即被释放。n局部变量在定义时若未初始化,其值为随机数。程序中使用的绝大多数变量都是局部变量。中原工学院 2022-3-6112. 全局变量全局变量特点特点:n全局变量是在函数外部定义的变

6、量。n全局变量的作用域从定义点开始直到文件的结束,具有文件作用域。 n全局变量在编译时建立在全局数据区,在未给出初始化值时系统自动初始化为0。n全局变量说明于所有函数之外,可以为本源程序文件中位于该全局变量定义之后的所有函数共同使用。全局变量可以在各个函数之间建立数据传输通道,但滥用会破坏程序的模块化结构。中原工学院 2022-3-6122. 全局变量全局变量如:int p=1, q=5; /*全局变量*/float f1(int a) int b,c /局部变量a,b,c 中原工学院 2022-3-6132. 全局变量全局变量#include #include #include #inclu

7、de int min; /全局变量全局变量minint find( )int max,x;x=rand( )%101+100; /产生一个产生一个100, 200之间的随机数之间的随机数xcoutsetw(4)x; max = x; min =x; / 设定最大数和最小数设定最大数和最小数 for(int i=1;i10;i+)x=rand( )%101+100; /再产生一个再产生一个100, 200之间的随机数之间的随机数xcoutsetw(4) max)max = x; / 若新产生的随机数大于最大数,则进行替换若新产生的随机数大于最大数,则进行替换 if(x min)min = x;

8、/ 若新产生的随机数小于最小数,则进行替换若新产生的随机数小于最小数,则进行替换 return max;void main( ) int m=find( );coutendl最大数:最大数:m,最小数最小数:minendl; 【例【例5.2】编写一个函数实现同时返回】编写一个函数实现同时返回10个数的最大和最小值。个数的最大和最小值。分析:一个函数只能返回一个值,所以可以使用全局变量在函数之间分析:一个函数只能返回一个值,所以可以使用全局变量在函数之间传递另一个值。传递另一个值。中原工学院 2022-3-6142. 全局变量全局变量n当具有块作用域的局部变量与具有文件作用域的全局变量同名时,与

9、局部变量同名的全局变量不起作用,即局部变量优先。n可以通过“:”域运算符访问同名的全局变量。【例【例5.3】全局变量和局部变量的同名使用示例。】全局变量和局部变量的同名使用示例。中原工学院 2022-3-6152 . 全局变量全局变量#include int x; / 定义全局变量定义全局变量void fun1(int x)/ 函数函数func1( )有一个名为有一个名为x的参数的参数x+;coutlocal variable x is xendl;coutglocal variable x is :xendl;void fun2( )int x;/ 函数函数func2( )中定义了一个名为中

10、定义了一个名为x的局部变量的局部变量x=5;coutlocal variable x is xendl;coutglocal variable x is :xendl;void fun3( )x=5; /为全局变量为全局变量x赋值赋值 void main( )x = 2;/ 在主函数中为全局变量在主函数中为全局变量x赋值赋值fun1(5); coutmain:xendl;fun2( ); coutmain:xendl;fun3( ); coutmain:xendl; 运行结果为:运行结果为:local variable x is 6glocal variable x is 2main:2loc

11、al variable x is 5glocal variable x is 2main:2main:5中原工学院 2022-3-6165.1.3 动态存储方式与静态存储方式n按照生存期的不同,可分为两类:按照生存期的不同,可分为两类:n动态变量n静态变量nC+的存储空间分为的存储空间分为n程序区:存放可执行程序的程序代码;n静态存储区:存放静态变量;n动态存储区(栈区):存放动态变量;n堆区(详见第7章动态分配)。1中原工学院 2022-3-6171动态存储方式n在程序执行过程中分配存储空间的变量。它的生存期是定义动态变量的函数运行期。它对存储空间的利用是动态的。其初值是每次为动态变量分配存

12、储空间后都要重新设置。中原工学院 2022-3-6182. 静态存储方式n在程序开始运行前就分配存储空间的变量。它的生存期就是整个程序的运行期。在程序开始运行前就为其分配相应的存储空间,在程序的整个运行期间一直占用,直到结束。中原工学院 2022-3-6195.2 变量的存储类型变量的存储类型 n变量的存储类型分为四种变量的存储类型分为四种n自动类型(auto)n寄存器类型(register)n静态类型(static)n外部类型(extern)。n说明:说明:n自动类型、寄存器类型的变量属于动态变量;静态类型、外部类型的变量属于静态变量。 中原工学院 2022-3-6205.2.1 自动类型自

13、动类型(auto)1. 1. 定义格式:定义格式: auto 类型类型 变量名;变量名;2. 2. 特性:特性:n自动变量是动态局部变量,具有块作用域,存放在动态存储区。n定义时可加auto说明符,也可以省略,(默认是auto型)n系统以堆栈(Stack)方式为auto变量分配内存空间,在程序运行完毕后,这个堆栈由系统进行自动的回收。中原工学院 2022-3-6215.2.1 自动类型自动类型(auto)【例【例5 5.5】使用自动变量的示例。】使用自动变量的示例。#include void main() int x=5,y=10; /自动变量自动变量x,y for (int k=1;k=2;

14、k+) auto int m=0,n=0; /自动变量自动变量m,n m=m+1; n=n+x+y; coutm=mtn=nendl; 运行结果为:运行结果为:m=1 n=15m=1 n=15 中原工学院 2022-3-6225.2. 2 寄存器类型( register ) n1. 1. 概念概念n用寄存器类型关键词register说明的变量称为寄存器变量。2. 2. 定义格式定义格式 register 类型 变量名;3. 3. 特性特性n寄存器变量是动态局部变量,具有块作用域,存放在CPU的寄存器或动态存储区;这样可以提高存取速度,如果没有存放在通用寄存器中便按自动变量处理。n注意注意n由于

15、通用寄存器的数量有限,寄存器类型的变量不宜过多。n变量的长度应与通用寄存器的长度相当。一般为int型或者char型。n要把一些使用频率高的变量定义为寄存器变量。中原工学院 2022-3-6235.2. 2 寄存器类型(寄存器类型( register )【例【例5.6】使用寄存器变量的示例。】使用寄存器变量的示例。#include void main() int x=5,y=10; for (int k=1;k=2;k+) register int m=0,n=0; /寄存器变量寄存器变量m,n m=m+1; n=n+x+y; coutm=mtn=nendl; 运行结果为:运行结果为:m=1 n

16、=15m=1 n=15 中原工学院 2022-3-6245.2.3 静态类型(静态类型(static) 1.1.概念概念用静态类型关键词static说明的变量称为静态变量。2.2.定义格式定义格式 static 类型 变量名;3.3.分类分类n静态局部变量n静态全局变量。4.4.说明说明n在C+规定静态局部变量有默认值,默认值分别为int型等于0,float型等于0.0,char型为空,静态全部变量也是如此。而自动类型和寄存器类型变量没有默认值。中原工学院 2022-3-6255.2.3 静态类型(静态类型(static)(1)静态局部变量)静态局部变量1.概念概念定义在函数内的静态变量称为静

17、态局部变量特点:特点: 静态局部变量本身也是局部变量,具有局部变量的性质。因此其作用域也是局限在定义它的本函数体内,当离开本函数体,该变量就不再起作用,但其值还继续保留。另一方面,静态局部变量又是静态存储类别的变量,所以,在整个程序运行开始就被分配固定的存储单元(占用静态存储区),整个程序运行期间不再被重新分配,所以其生存期是整个程序运行期间。静态局部变量的赋初值的时间在编译阶段,并不是每发生一次函数调用就赋一次初值。仅初始化一次,当再次调用该函数时,静态局部变量保留上次调用函数时的值。中原工学院 2022-3-6265.2.3 静态类型(静态类型(static)【例【例5.6】自动变量与静态

18、局部变量的区别。】自动变量与静态局部变量的区别。#include void f( ) int x=0; /初始化多次,栈中分配、相当于初始化多次,栈中分配、相当于auto int x=0; static int y=3; /静态局部变量,仅初始化一次,静态区分配静态局部变量,仅初始化一次,静态区分配 x=x+1; y=y+1; coutxtyendl;void main( ) int i; for(i=0;i3;i+) f ( ); 运行结果为:1 41 51 6中原工学院 2022-3-6275.2.3 静态类型(静态类型(static)【例【例5.7】用自动变量与静态局部变量求三个整数的和

19、。】用自动变量与静态局部变量求三个整数的和。 #include void f(int x,int y) int m=0; /自动变量自动变量 static int n=0; /静态局部变量,此处也可静态局部变量,此处也可static int n; m=m+x+y; n=n+x+y; coutm=mtn=nendl;void main( ) int i=5,j=10,k; for (k=1;k=3;k+) f(i,j);运行结果为: m=15 n=15 m=15 n=30 m=15 n=45 中原工学院 2022-3-6285.2.3 静态类型(静态类型(static)(2)静态全局变量)静态全

20、局变量n1. 1. 定义定义n全局变量时加说明符static,就成为为静态全局变量n静态全局变量只能被定义它的文件所独享。中原工学院 2022-3-6295.2.3 静态类型(静态类型(static)2. 2. 静态全局变量的特点:静态全局变量的特点:n与全局变量基本相同,其作用域是定义它的程序文件中,而不是整个程序中的所有文件。n静态全局变量属于静态存储类别的变量,所以它在程序一开始运行时,就被分配固定的存储单元,默认初始化值为0。其生存期是整个程序运行期间。n使用静态全局变量的好处是同一程序的两个不同源程序文件中可以使用相同名称的变量名,而互不干扰。中原工学院 2022-3-6305.2.

21、3 静态类型(静态类型(static)【例【例5.8】编写一个含两个源程序文件程序(参见多文件程序】编写一个含两个源程序文件程序(参见多文件程序5.4节)。在节)。在file2.cpp文件中定义静态全局变量文件中定义静态全局变量n,在含有,在含有main函函数的数的file1.cpp文件中又定义全局变量文件中又定义全局变量n,分析两者是否有联系?,分析两者是否有联系?/file1.cpp#includeint n;void fn();void main()n=20;coutnendl;fn();/file2.cpp#include /不能省略不能省略static int n; / 定义静态全局

22、变量定义静态全局变量n,如果改为,如果改为extern 结果?结果?void fn( ) n=n+1; coutny?x:y; 第二个文件内容如下:/*文件名:exemple5_21.cpp*/#include extern int a,b; /外部变量a,bextern int max(int x,int y);void main( ) int c; c=max(a,b); coutmax=c(b)?(a):(b)如果在程序中出现如下语句:S=MAX(4,6);则被替换为: S=46?4:6;中原工学院 2022-3-6415.3.1 宏定义n3. 内联函数与宏定义内联函数与宏定义n内联函数

23、具有与#define宏定义相同的作用和相似的机理,但消除了#define的不安全因素。请比较下面的两个例子。中原工学院 2022-3-6425.3.1 宏定义【例5.10】使用带参数的宏定义完成某个数乘2的功能#include #define doub(x) x*2int main()for(int i=0;i3;i+) coutidoubled is:doub(i)endl;cout2+3 doubled is: doub(2+3)endl; return 0; 运行结果:0 doubled is: 01 doubled is: 22 doubled is: 42+3 doubled is:

24、 8中原工学院 2022-3-6435.3.2 文件包含命令 1. 1. 概念概念 所谓“文件包含”是指将另一个源文件的内容合并到当前程序中。2. 2. 文件包含命令的一般形式为:文件包含命令的一般形式为:#include 或 #include 文件名3.3.说明说明n文件名一般是以.h为扩展名,因而称它为“头文件”n文件包含的两种格式区别在于:将文件名用“”括起来,用来包含那些由C+系统提供的并放在指定子目录中头文件;将文件名用双引号括起来的,用来包含用户自己定义的放在当前目录或其他目录下的头文件或其他源文件。中原工学院 2022-3-6445.3.2 文件包含命令 中原工学院 2022-3

25、-6455.3.2 文件包含命令 注意:注意:1文件包含命令一般都被放在程序最前端,以便后面程序对它们的引用。2一条#include命令只能包含一个文件,若想包含多个文件,则应使用多条包含命令。例如: #include #include 中原工学院 2022-3-6465.3.3 条件编译命令条件编译命令在在C+中,常用的条件编译命令有如下三种:中,常用的条件编译命令有如下三种:(1)#ifdef 标识符程序段1 #else程序段2 #endif该条件编译命令的功能是:如果在程序中#define中定义了指定的“标识符”时,就用程序段1参与编译,否则,用程序段2参与编译。中原工学院 2022-3

26、-6475.3.3 条件编译命令条件编译命令(2)#ifndef 标识符程序段1#else程序段2#endif中原工学院 2022-3-6485.3.3 条件编译命令条件编译命令(3)#if 常量表达式1程序段1 #elif常量表达式2程序段2 #elif常量表达式n程序段n #else程序段n+1 #endif该条件编译命令的功能是:依次计算常量表达式的值,当表达式的值该条件编译命令的功能是:依次计算常量表达式的值,当表达式的值为真时,则用相应的程序段参与编译,如果全部表达式的值都为假,为真时,则用相应的程序段参与编译,如果全部表达式的值都为假,则用则用else后的程序段参与编译。后的程序段

27、参与编译。中原工学院 2022-3-6495.3.3 条件编译命令条件编译命令【例【例5 5.12】分析下列程序的结果。】分析下列程序的结果。 #include #define k -5 void main( ) #if k0 cout0endl; #elif k0 couta0endl; #else couta=0endl; #endif 运行结果:运行结果:a0如果将如果将#define k -5更改为更改为 #define k 5;将会对程序的运行结果会有什么影响?;将会对程序的运行结果会有什么影响?中原工学院 2022-3-6505.4 程序的多文件组织程序的多文件组织5.4 程序的多

28、文件组织程序的多文件组织5.4.1 头文件头文件考虑标识符在其他文件中的可见性。使用头文件是很有效考虑标识符在其他文件中的可见性。使用头文件是很有效的方法。的方法。如:如:# include 其中的其中的iostream.h是系统定义的一个文件,这种以是系统定义的一个文件,这种以“.h”命命名的文件称为头文件,系统定义的头文件中定义了一些名的文件称为头文件,系统定义的头文件中定义了一些常用的标识符和函数,用户只要将头文件包含进自己的常用的标识符和函数,用户只要将头文件包含进自己的文件,就可使头文件中定义的标识符在用户文件中变得文件,就可使头文件中定义的标识符在用户文件中变得可见,也就可以直接使

29、用头文件中定义的标识符和函数。可见,也就可以直接使用头文件中定义的标识符和函数。中原工学院 2022-3-6515.4.1 头文件头文件除了系统定义的头文件外,用户还可以自定义头文除了系统定义的头文件外,用户还可以自定义头文件。具体地说,头文件中可以包括:用户构造的件。具体地说,头文件中可以包括:用户构造的数据类型(如枚举类型),外部变量,函数声明数据类型(如枚举类型),外部变量,函数声明(原型)、常量等具有一定通用性或常用的量,(原型)、常量等具有一定通用性或常用的量,而一般性的变量和函数定义不宜放在头文件中。而一般性的变量和函数定义不宜放在头文件中。中原工学院 2022-3-6525.4.

30、2 多文件结构多文件结构n在开发较大程序时,通常将其分解为多个源程序文件,每个较小的程序用一个源程序文件建立。n程序经过建立、编译、连接,成为一个完整的可执行程序。n多文件结构通过工程进行管理,在工程中建立若干用户定义的头文件.h和源程序文件.cpp。n头文件中定义用户自定义的数据类型,所有的程序实现则放在不同的源程序文件中。n编译时每个源程序文件单独编译,如果源程序文件中有编译预处理指令,则首先经过编译预处理生成临时文件存放在内存,之后对临时文件进行编译生成目标文件.obj,编译后临时文件撤销。 中原工学院 2022-3-6535.4.2 多文件结构多文件结构所有的目标文件经连接器连接最终生成一个完整的可执行文件.exe。图4-6是一个多文件系统的开发过程。图4-6一个多文件系统的开发过程 中原工学院 2022-3-6545.4.3多文件结构程序示例多文件结构程序示例 【例【例5.13】程序采用多文件形式实现如下功能:】程序采用多文件形式实现如下功能:在两个源程序文件中分别实现计算三角

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论