C程序设计第5章函数.ppt

上传人:sccc 文档编号:5336447 上传时间:2023-06-27 格式:PPT 页数:79 大小:537.01KB
返回 下载 相关 举报
C程序设计第5章函数.ppt_第1页
第1页 / 共79页
C程序设计第5章函数.ppt_第2页
第2页 / 共79页
C程序设计第5章函数.ppt_第3页
第3页 / 共79页
C程序设计第5章函数.ppt_第4页
第4页 / 共79页
C程序设计第5章函数.ppt_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《C程序设计第5章函数.ppt》由会员分享,可在线阅读,更多相关《C程序设计第5章函数.ppt(79页珍藏版)》请在三一办公上搜索。

1、第五讲 函数,2,本章内容提要:,函数概述内联函数带默认参数值的函数函数重载作用域与存储类型系统函数,C+语言程序设计,函数,函数,#includeint square(int x)/函数定义 return x*x;void main()int x,y;coutx;y=square(x);/函数调用 coutsquare=yendl;,注:C+源程序都是由若干个函数组成的,每个函数完成一定的功能。运行时,程序总是从主函数main()开始执行,其他函数由main()函数或别的函数调用后执行,最后到main()函数终止运行。,4,5.1 函数的定义与声明,函数是C+程序的基本单元,是组成模块。一个

2、C+程序是由若干个源程序文件构成的,而一个源程序文件是由若干个函数构成。函数类型从用户的角度看,有两种不同的函数:库函数用户自定义函数库函数也称标准函数,由C+系统提供。用户自定义函数则需要用户先定义,后使用。,函数,5,5.1.1函数的定义,函数的定义格式定义函数的一般形式:函数返回值的数据类型标识符 函数名(形式参数表及其类型)函数体,函数,void display_larger(int x,int y)if(xy)coutThe larger is:xn;else coutTwo values are equal.n;,6,5.1.1函数的定义,在C+中定义函数时注意:函数的形参及类型说

3、明要采用新的ANSI标准,即必须放在函数名后面的括号内。当形参有多个时,必须用逗号隔开。如果函数是无参函数,括号也不能省略。所有的函数都要先定义,后使用(调用)。不能省略函数值的类型,必须表明该函数的函数值的类型,即使该函数没有返回值,也要注明函数值的类型为void。,函数,5.1.2 函数的声明,函数声明也称函数模型或函数原型。函数声明的一般格式为:函数类型名 函数名(形式参数表);例如:设有一函数定义为float fun(char a,int b,float c)函数体,函数,则对fun函数的声明为:float fun(char m,int n,float i);/末尾要加上分号,5.1.

4、2 函数的声明,关于函数声明的几点说明:函数必须先声明(或定义)后使用。必须确保函数声明语句与函数调用表达式出现在同一个文件中。虽然函数声明与函数头相似,但是它们之间也有细微的差别。如,float fun(char,int,float);函数声明中当函数返回值类型为int或char时函数类型可以省略,一般情况下不能省略函数类型。函数声明中形参的次序不能写错。函数定义在调用前,函数声明可以省略。,函数,可以把例5.1改写为如下形式:#includeint square(int x);/声明语句void main()int x,y;coutx;y=square(x);/调用语句 coutsquar

5、e=yendl;int square(int x)/函数定义 return x*x;,9,函数的定义与声明的区别,函数的定义与声明的区别函数的“定义”是一个函数功能的确立,包括指定函数名,函数返回值的类型,形参及其类型,函数体等,它是一个完整的、独立的函数单位。函数的“声明”则只是对已经定义好的函数的接口进行的说明,它包括函数名,函数类型,形参的类型。不包括形参名和函数体。对函数进行声明的作用是告诉编译系统,在本程序中将要用到的函数是什么类型,参数的个数和类型,以便在主调函数中正确使用函数。,函数,10,5.2函数的调用,调用函数所谓调用函数是指在程序中使用了该函数。函数调用时,中断现行函数(

6、主调用函数),程序的执行流程转向被调用函数的入口。开始执行被调函数。遇到return或返回主调函数。相关的概念主调函数、被调函数、调用点函数调用的格式函数名(实参表)说明如果调用的是无参函数,则实参表可略去,但函数的括号不能省。如果实参表中有多个参数,参数之间用逗号隔开,实参的类型、个数应与形参一一对应。,函数,程序开始点,程序结束点,11,1.形参和实参,形式参数和实际参数(形参和实参)在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。而函数之间的数据传递途径之一就是靠函数的参数进行的。在定义函数时,函数名后面括号内的变量名为“形式参数”(形参)。在调用函数时,函数名后面括号

7、内的表达式为“实际参数”(实参)。实参与形参个数相等,类型一致,按顺序一一对应。用实际参数向形式参数传递数据。,函数,12,1.形参和实参,举例,函数,#include int max(int,int);void main()int a,b,c;cinab;c=max(a,b);coutmax is cendl;,int max(int x,int y)int z;z=xy?x:y;return z;,实参,形参,13,1.形参和实参,关于形参和实参的几点说明实参可以是变量、常量、或表达式,但必须有确定的值。而形参必须是变量。形参变量,只有存在发生函数调用时,形参才被分配存储单元,在调用结束时

8、,形参所占的内存单元被释放。实参与形参的类型必须一致,否则会发生“类型不匹配”的错误。实参对形参的数据传递是“值传递”,即单向传递。由实参把数据传给形参,并且存储单元与形参是不同的单元。调用结束后,形参单元被释放,而实参单元保留并维持原值。,函数,14,2.函数的返回值,函数的返回值是通过函数中的return语句“返回”的。return语句的格式为:return(表达式);或return 表达式;return语句的功能有两个:强制程序执行的流程从被调函数返回到主调函数。给主调函数带回一个确定的函数值。举例,函数,int max(int a,int b)return(ab?a:b);,15,2.

9、函数的返回值,函数返回值的类型函数返回值的类型就是在定义函数时的函数的类型。在定义函数时,函数的类型和return语句中的表达式类型不一致时,则以函数类型为准。如果被调用函数中没有return语句,为了明确表示函数“不返回值”,要用void定义无类型。举例这样系统就保证不使函数带回任何值。,函数,void print()printf(c language);,16,3.函数调用的形式,函数通过下列三种方式完成函数调用:函数调用语句在一个函数调用的后面加上“;”作为一条语句。如:printf();函数表达式即函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。如:c=2*ma

10、x(a,b);函数参数以函数的调用作为一个函数的实参。如:m=max(a,max(b,c);,函数,4.函数的调用方式,一个函数被定义后就是为了将来对其调用。调用函数是实现函数功能的手段。正确的数据传递是正确使用函数的前提,C+语言采用函数的形式参数(形参)和实际参数(实参)实现函数间的数据传递。C+中函数的调用方式:赋值调用传递变量值的传值调用传递变量地址值的传址调用引用调用,main()int a,b,c;cinab;c=max(a,b);couty?x:y;return(z);,4.函数的调用方式,例 比较两个数并输出大者,c=max(a,b);,max(int x,int y)int

11、z;z=xy?x:y;return(z);,形参,实参,(1)函数的传值调用,也称为值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递实参可以是常量、变量或表达式,但必须有确定的值。,例5.2,问题使用传值调用方式完成两整数交换。,#includevoid change(int a,int b)int temp;temp=a;a=b;b=temp;couta=a,”b=bendl;void main()int x=0;int y=1;change(x,y);coutx=x,y=yen

12、dl;,a=1,b=0 x=0,y=1,值传递调用演示,(2)函数的传址调用,调用函数的实参地址值,被调用函数的形参用指针。调用时系统将实参的地址值赋给对应的形参指针,使形参指针指向实参变量。传址调用的特点是可以通过改变形参所指向的变量值来影响实参。,例5.3,问题使用传址调用方式完成两整数交换。,#includevoid change1(int*a,int*b)int temp;temp=*a;*a=*b;*b=temp;couta=*a,b=*bendl;void main()int x=0;int y=1;change1(,a=1,b=0 x=1,y=0,址传递调用演示,调用:,a,b,

13、形参a:,形参b:,5,9,实参x:,实参y:,(3)函数的引用调用,在函数定义时,函数的参数(形参)可以说明为引用类型,这样在函数的调用过程中,实参与形参的结合就属于引用调用。引用主要用于函数的形参和返回值。对形参引用的改变,实质就是直接地通过引用(实参的别名)来改变实参的变量值。这种调用也起到了传址调用的作用,但更直接、方便。注意:引用调用方式中,实参用变量名,形参用引用,调用时将实参的变量名赋给对应的形参引用。在被调用函数中,改变引用的值就直接改变了对应的实参值。尽量避免使用传址方式来传递参数。,例5.4,问题使用引用调用方式完成两整数交换。,#includevoid change2(i

14、nt,a=1,b=0 x=1,y=0,5.函数的参数,(1)设置函数参数的默认值C中,允许在函数的说明或定义时给一个或多个参数指定默认值。但是,要求在一个指定了默认值的参数右边,不能出现没有指定默认值的参数。int add_int(int x,int y=10);在函数调用时,编译器按从左至右的顺序将实参与形参结合,当实参的数目不足时,编译器将按同样的顺序用说明中或定义中的默认值为补遗缺少的实参。add_int(15);等价于add_int(15,10);给某个参数指定默认值时,不仅可以是一个数值,而且还可以是任意复杂的表达式。例5.5 设置默认参数值函数,5.函数的参数,(2)使用数组作函数

15、参数数组作函数参数可分为三种情况:形参和实参都用数组名、形参和实参都用对应数组的指针、实参用数组名形参用引用。三种情况的结果相同,只是所采用的调用机制不同形参和实参都用数组 例5.6 形参和实参共用内存中同一个数组。在被调用函数中改变了数组中某个元素的值,对调用函数该数组的该元素的值也被改变。形参和实参都用对应数组的指针 例5.7 数组名规定是一个指针常量,所以在使用指针时,可以用数组名,也可以用另外定义的指向数组的指针。实参用数组名形参用引用 例5.8 对数组类型使用引用方式,先要用类型定义语句定义一个数组类型;然后再用新定义的类型别名来定义数组和引用。,29,5.3内联函数,内联函数内联函

16、数的定义方法和格式:inline 函数值的类型 函数名(形参表)函数体举例,函数,void main()double x;coutx;coutthe squre is square(x)endl;,#include inline double square(double x)return x*x;,30,5.3内联函数,内联函数与普通函数的区别和联系在定义内联函数时,函数值的类型左面有“inline”关键字,而普通函数在定义时没有此关键字。程序中调用内联函数与调用普通函数的方法相同。当在程序中调用一个内联函数时,是将该函数的代码直接插入到调用点,然后执行该段代码,所以在调用过程中不存在程序流程

17、的跳转和返回问题。从调用机理看,内联函数可加快程序代码的执行速度和效率,但这是以增加程序代码为代价来求得速度的。,函数,31,5.3内联函数,对内联函数的限制应注意:不是任何一个函数都可定义成内联函数。内联函数的函数体内不能含有复杂的结构控制语句,如:switch和while,如果内联函数的函数体内有这些语句,则编译器将该函数视同普通函数那样产生函数调用代码。递归函数不能被用来作为内联函数。内联函数一般适合于只有15条语句的小函数,对一个含有很多语句的大函数,没有必要使用内联函数来实现。,函数,32,5.4函数重载,函数重载函数重载是指一个函数可以和同一作用域中的其他函数具有相同的名字,但这些

18、同名函数的特征标(参数类型、参数个数)、返回值类型、函数功能可以完全不同。举例,函数,#include void whatitis(int i)coutthis is integer:iendl;void whatitis(char c)coutthis is string:cendl;,void main()int i=1;char c=abcdef;whatitis(i);whatitis(c);,33,5.4函数重载,为什么要使用函数重载在C语言中,每个函数必须有其唯一的名称,这样的缺点是所有具有相同功能、而只是函数参数不一样的函数,就必须用一个不同的名称。而C+中采用了函数重载后,对于

19、具有同一功能的函数,如果只是由于函数参数类型不一样,则可以定义相同名称的函数。,函数,34,5.4函数重载,匹配重载函数的顺序由于重载函数具有相同的函数名,在进行函数调用时,系统一般按照调用函数时的参数个数、类型和顺序来确定被调用的函数。具体来说,按以下步骤找到并调用那个函数:寻找一个严格的匹配。即:调用与实参的数据类型、个数完全相同的那个函数。通过内部转换寻求一个匹配。即:通过(1)的方法没有找到相匹配的函数时,则由C+系统对实参的数据类型进行内部转换,转换完毕后,如果有匹配的函数存在,则执行该函数。通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就调用那个函数。即:在函数调用处由

20、程序员对实参进行强制类型转换,以此作为查找相匹配的函数的依据。,函数,35,5.4函数重载,匹配重载函数的顺序由于重载函数具有相同的函数名,在进行函数调用时,系统一般按照调用函数时的参数个数、类型和顺序来确定被调用的函数。具体来说,按以下步骤找到并调用那个函数:寻找一个严格的匹配。即:调用与实参的数据类型、个数完全相同的那个函数。通过内部转换寻求一个匹配。即:通过(1)的方法没有找到相匹配的函数时,则由C+系统对实参的数据类型进行内部转换,转换完毕后,如果有匹配的函数存在,则执行该函数。通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就调用那个函数。即:在函数调用处由程序员对实参进行

21、强制类型转换,以此作为查找相匹配的函数的依据。,函数,36,5.4函数重载,重载函数举例,函数,#include void print(double d)coutthis is a double:dendl;void print(int i)coutthis is an integer:iendl;/void print(char c)/coutthis is a character:cendl;void main()int x=1,z=10;float y=1.0;char c=a;,/按规则(1)自动匹配函数void print(int i)print(x);/按规则(2)通过内部转换匹配

22、函数void print(double i)/因为系统能自动将float型转换成double型 print(y);/按规则(2)通过内部转换匹配函数void print(int i)/因为系统能自动将char型转换成int型 print(c);/按规则(3)匹配void print(double i)/因为程序中将实参z强制转换为double型。print(double(z);,this is an integer:1this is a double:1this is an integer:97this is a double:10Press any key to continue,this

23、is an integer:1this is a double:1this is a character:athis is a double:10Press any key to continue,37,5.4函数重载,定义重载函数时的注意事项重载函数间不能只是函数的返回值不同,应至少在形参的个数、参数类型或参数顺序上有所不同。这种重载就是错误的。强烈建议:应使所有的重载函数的功能相同。如果让重载函数完成不同的功能,会破坏程序的可读性。,函数,void myfun(int i)int myfun(int i),38,5.5函数的嵌套调用和递归调用,函数的嵌套调用C+语言中函数的定义是平行的、独

24、立的,所以,函数的定义是不能嵌套的,但函数的调用可以。嵌套调用即在调用一个函数的过程中,又调用另一函数。,函数,39,5.5函数的嵌套调用和递归调用,函数的递归调用函数的递归调用就是当一个函数在执行的过程中,出现了直接或间接地调用函数本身的函数调用方式。例5.12:定义求n!的函数。,函数,long fact(long n)if(n=1)return 1;return n*fact(n-1);/函数fact直接调用本身,n!=,1n=1,n*(n-1)!n1,40,5.5函数的嵌套调用和递归调用,函数递归调用的条件必须有完成函数任务的语句。如:上例求n!中的return 1;有一个递归调用语句

25、,并且该递归调用语句的参数应该逐渐逼近不满足条件,以致最后停止递归调用。先测试,后递归调用。也就是说,递归是有条件的,满足了条件后,才可以递归;否则就不再递归调用。,函数,41,5.6 作用域,标识符的作用范围变量的存储类别包含多个源文件的程序编译和链接外部函数内部函数名称空间,C+语言程序设计,42,1.简介,变量定义的完整格式:存储类别 数据类型 变量名数据类型占用存储空间的大小取值范围存储类别在内存中持续的时间(生存期)在硬件中存放的位置例5.15分析下列变量的输出结果。其它属性作用范围可以被引用的程序部分(可见性),作用范围和存储类别,43,2.作用范围,程序中的所有标识符构成了名称空

26、间。需要一个机制来避免和解决名称的冲突问题。标识符的作用范围能够引用该标识符的程序部分。有四种作用范围:文件作用范围函数作用范围程序块作用范围函数原型作用范围,作用范围和存储类别,44,2.作用范围,文件作用范围在函数外声明的标识符,可以在所有函数中被引用。包括:全局变量(在函数外定义的变量),函数。,作用范围和存储类别,int total;int max(int,int);void main()int limit;int max(int x,int y),作用范围从声明的位置开始,到文件的末尾。,45,2.作用范围,函数作用范围在函数体内定义的标识符,只能在函数体内被引用。包括:语句标号(无

27、需单独声明),作用范围和存储类别,void main()goto loop;loop:;,46,2.作用范围,程序块作用范围在程序块内声明的变量,在程序块内被引用。包括:程序块内定义的变量(局部变量),函数的参数。,作用范围和存储类别,int max(int x,int y)void main()int a;int a;,作用范围从声明的位置开始,到程序块的右大括号,覆盖同名变量,内部变量“覆盖了”外部变量,47,2.作用范围,函数原型作用范围函数原型中的参数。,作用范围和存储类别,int max(int x,int y);void main()int max(int x,int y),48,

28、关于声明和定义,定义声明定义一个标识符,同时也是声明。对于变量,定义意味着创建,即为其分配内存。对于函数,需要给出函数体。引用声明只是声明一个需要引用的标识符。例如函数的原型变量的引用声明需要带extern,作用范围和存储类别,49,3.存储类别,四种存储类别说明符autoregisterexternstatic两种存储时期自动存储时期autoregister静态存储时期externstatic,作用范围和存储类别,50,自动存储类别,自动存储程序执行到变量所在的程序块内时创建它,退出时销毁。不会被自动初始化。auto(自动变量):局部变量的缺省类别。程序块中定义的变量,函数的参数。regis

29、ter(寄存器变量):建议编译器把变量放进CPU的寄存器。只适用于自动变量。,作用范围和存储类别,auto int a,b;,register int count=1;,51,静态存储类别,静态存储程序开始执行时创建,在程序执行期间,变量一直存在。自动被初始化,缺省初值:0 或 0。static(静态局部变量):可以用于局部变量。退出程序块后依然存在,并保留值。但不改变其作用范围,即只能在所在的程序块内被使用。extern(外部变量):用来声明在“外部”定义的全局变量。仅用于声明变量。,作用范围和存储类别,static int a,b;,extern int total;,全局变量具有静态存储

30、期,52,案例分析:存储类别,存储类别读下面的程序,写出结果。,作用范围和存储类别,void test(int a)auto int b=10;static int c=10;b+;c+;couta=atb=btc=cendl;void main()int i;for(i=1;i=3;i+)test(i);,a=1b=11c=11a=2b=11c=12a=3b=11c=13,53,案例分析:存储类别,存储类别结果分析,作用范围和存储类别,1,2,3,c,b,a,b,a,b,a,a=1b=11c=11a=2b=11c=12a=3b=11c=13,54,C+语言程序的内存映像,C+语言程序的内存映

31、像,作用范围和存储类别,55,案例分析:外部变量,外部变量,作用范围和存储类别,#include void main()extern int a;int c=3;couta=aendl;extern int c;coutinner c=cendl;coutc=cendl;int a=1;int c=5;,a=1inner c=5c=3,56,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,#include void a(void);/*function prototype*/void b(void);/*function prototype*/void c(void);/

32、*function prototype*/int x=1;/*global variable*/void main()int x=5;printf(local x in outer scope of main is%dn,x);/*start new scope*/int x=7;printf(local x in inner scope of main is%dn,x);/*end new scope*/printf(nlocal x in outer scope of main is%dn,x);,57,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,a();b();

33、c();a();b();c();printf(local x in main is%dn,x);void a()int x=25;/*initialized each time a is called*/printf(nlocal x in a is%d after enteringn,x);x+;printf(local x in a is%d before exitingn,x);,58,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,void b()static int x=50;/*static initialization only*/*first time b

34、 is called*/printf(nlocal x in b is%d after enteringn,x);x+;printf(local x in b is%d before exitingn,x);void c()printf(nglobal x is%d on entering cn,x);x*=10;printf(global x is%d on exiting cn,x);,59,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,local x in outer scope of main is 5local x in inner scope of main

35、 is 7local x in outer scope of main is 5local x in a is 25 after entering alocal x in a is 26 before exiting alocal x in b is 50 after entering blocal x in b is 51 before exiting bglobal x is 1 on entering cglobal x is 10 on exiting c,60,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,local x in a is 25 after en

36、tering alocal x in a is 26 before exiting alocal x in b is 51 after entering blocal x in b is 52 before exiting bglobal x is 10 on entering cglobal x is 100 on exiting clocal x in main is 5,61,包含多个源文件的程序,包含多个源文件的程序每个函数的定义必须在一个文件内,不能被分割。全局变量可以被同一文件内的函数访问。如果需要被其他文件内的函数访问,则必须在其他文件内声明。extern 表示变量myGloba

37、l是在另一个文件内有定义。一个文件内定义的函数,也可以被其他文件内的函数调用。在每个文件内加入该函数的原型(声明为外部函数)。函数的声明可以不需要 extern。,作用范围和存储类别,int myGlobal;,extern int myGlobal;,a.cpp,b.cpp,62,包含多个源文件的程序,包含多个源文件的程序举例,作用范围和存储类别,#include int a,b;extern int max(void);void main()scanf(%d%d,extern int a,b;int max()return(ab?a:b);,A,B,cw0604a.cpp,cw0604b.

38、cpp,63,包含多个源文件的程序,包含多个源文件的程序static限制全局变量只能被同一文件内的函数访问。限制函数只能被同一文件内的函数调用。说明:“同一文件”是指包含变量的定义、函数的定义的那个文件。,作用范围和存储类别,static int myGlobal;static void myFunc(),64,编译包含多个源文件的程序,编译包含多个源文件的程序每个源文件必须被编译,然后链接成一个可执行文件。如果有一个文件作了改动,则必须重新编译所有相关的文件。一般会提供 make 工具用来管理和编译多源文件的程序。创建 makefile 文件,记录编译规则。自动查找必须编译的源文件。可以创建

39、工程(project)文件来管理多源文件的程序。举例:演示在VC中创建工程,并加入多个文件。,作用范围和存储类别,65,名称空间,名称空间通过定义一种新的声明区域来创建命名的名称空间。允许创建名称空间的目的提供了一个声明名称的区域。一个名称空间中的名称不会与另外一个名称空间中的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的对象。创建名称空间使用namespace关键字,作用范围和存储类别,66,名称空间,名称空间举例,作用范围和存储类别,namespace Tom int count;int sum;void sort();namespace Jack double sum;v

40、oid hello()coutHello!endl;namespace Jimmy int count;,可以是全局的;也可以嵌套定义。但不能在代码块中定义。,void main()namespace error int count;,67,名称空间,名称空间中声明的名称是全局的。具有文件作用范围。也可以在文件间共享具有程序作用范围。有一个缺省的全局名称空间对应文件声明区域。例如,全局变量就位于此名称空间中。,作用范围和存储类别,68,名称空间,名称空间是开放的可以把名称加入到一个已有的名称空间中。例如把square加入名称空间Tom中。为square()函数提供代码。,作用范围和存储类别,n

41、amespace Tom int square(int);,namespace Tom int square(int a)return a*a;,69,名称空间,访问名称空间中的名称使用作用域解析运算符::例如使用using声明使特定的名称可用使用using编译指令使名称空间中的全部名称可用,作用范围和存储类别,Tom:count=10;Tom:square(5);,限定名称,70,名称空间,using声明把特定的名称添加到它(using声明)所属的声明区域中。,作用范围和存储类别,#include namespace Tom int count;int count=1;void main()

42、Tom:count=10;using Tom:count;double count=20;coutcountendl;cout:countendl;,错误!因为已经声明了Tom的count。,全局名称空间的count。,101,71,名称空间,using编译指令,作用范围和存储类别,#include namespace Tom int count;int count=1;void main()Tom:count=10;using namespace Tom;double count=20;coutcountendl;cout:countendl;coutTom:countendl;,覆盖Tom

43、的count。,20110,使用using声明更安全:如果出现名称冲突,编译器会报错。,72,名称空间,名称空间的嵌套,作用范围和存储类别,#include namespace Jack double sum;void hello()coutHello!endl;namespace Jimmy int count;void main()Jack:Jimmy:count=7;using namespace Jack;coutJack:Jimmy:count=Jimmy:countendl;using namespace Jack:Jimmy;coutJack:Jimmy:count=counte

44、ndl;,73,名称空间,未命名的名称空间,作用范围和存储类别,#include namespace double sum;void main()sum=0;coutsum=sumendl;,#include static double sum;void main()sum=0;coutsum=sumendl;,目前等价,74,名称空间,使用名称空间的指导原则使用已命名的名称空间中的变量,而不是外部的全局变量。使用未命名的名称空间中的变量,而不是静态全局变量。把自己开发的函数库或类库放在一个名称空间中。例如std导入名称时,首选使用限定名称或using声明;尽量避免使用using编译指令。对于

45、using声明,首选将其作用域设置为局部而不是全局。对于using编译指令,要放在所有#include命令之后尽量避免名称的二义性!,作用范围和存储类别,5.7 C+的系统函数,C+编译系统提供了几百个函数供编程者调用。本节介绍使用系统函数的方法,及字符串系统函数。C+系统所提供的系统函数的说明分类放在不同的.h文件中。math.h数学常用函数ctype.h判断字母、数字、大小写字母string.h字符串处理函数conio.h屏幕处理函数graph.h图形处理函数,76,小结,用于存储程序数据的内存可用存储时期和作用范围来表征。存储时期可以是静态的或自动的。作用范围决定了哪一部分程序可以访问某

46、个对象。C+语言程序可以包含多个源文件,在编译时,逐一编译各文件,然后通过链接器链接所有的目标代码构成可执行文件。名称空间允许定义一个可在其中声明标识符(名称)的命名区域,目的是减少名称冲突。,作用范围和存储类别,77,小结,函数当程序代码量较大时,可根据功能的不同分成更小、更容易管理的模块,这种模块就是函数。程序中所用的函数有两类,一类是库函数,另一类是用户自定义函数,库函数可直接使用,而用户自定义函数要先定义后使用。一个函数可定义成有参函数,也可定义成无参函数,当函数无返回值时,要把函数的类型定义成void。定义函数时,函数名称后面括号内的参数是形式参数,形式参数可以是普通变量、数组名、指

47、针变量、引用等。当发生函数调用时,实参与形参间发生了数据传递,要注意传值与传地址间的区别。,函数,78,小结,内联函数内联函数是为了提高编程的效率而实现的,它适用于函数体代码较少且程序中不含有复杂程序结构的情况。带默认形参值的函数在函数定义中通过赋值运算可指定参数的默认值。函数重载函数重载允许用同一个函数名定义多个函数,系统会根据传递给函数的参数的数目、类型和顺序调用相匹配的函数,函数重载使程序设计简单化。,函数,79,小结,用于存储程序数据的内存可用存储时期和作用范围来表征。存储时期可以是静态的或自动的。作用范围决定了哪一部分程序可以访问某个对象。C+语言程序可以包含多个源文件,在编译时,逐一编译各文件,然后通过链接器链接所有的目标代码构成可执行文件。名称空间允许定义一个可在其中声明标识符(名称)的命名区域,目的是减少名称冲突。,作用范围和存储类别,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号