C程序设计第5章函数

PPT
  • 阅读 82 次
  • 下载 0 次
  • 页数 79 页
  • 大小 537.013 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C程序设计第5章函数
可在后台配置第一页与第二页中间广告代码
C程序设计第5章函数
可在后台配置第二页与第三页中间广告代码
C程序设计第5章函数
可在后台配置第三页与第四页中间广告代码
C程序设计第5章函数
C程序设计第5章函数
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 79
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】C程序设计第5章函数.ppt,共(79)页,537.013 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2195.html

以下为本文档部分文字说明:

主讲:刘艳菊第五讲函数2008-2009-2C++程序设计2本章内容提要:函数概述内联函数带默认参数值的函数函数重载作用域与存储类型系统函数C++语言程序设计2008-2009-2C++程序设计函数函数#include<io

stream.h>intsquare(intx)//函数定义{returnx*x;}voidmain(){intx,y;cout<<"\nPleaseinputaninteger:x=";cin>>x;y=square(x);//函数调用cout<<"square="<<y

<<endl;}注:C++源程序都是由若干个函数组成的,每个函数完成一定的功能。运行时,程序总是从主函数main()开始执行,其他函数由main()函数或别的函数调用后执行,最后到main()函数终止运行。2008-2009-2C++程序设

计45.1函数的定义与声明函数是C++程序的基本单元,是组成模块。一个C++程序是由若干个源程序文件构成的,而一个源程序文件是由若干个函数构成。函数类型从用户的角度看,有两种不同的函数:➢库函数➢用户自定义函数库函数也称标准函数,由C++

系统提供。用户自定义函数则需要用户先定义,后使用。函数2008-2009-2C++程序设计55.1.1函数的定义函数的定义格式定义函数的一般形式:函数返回值的数据类型标识符函数名(形式参数表及其类型){函数体}函数voi

ddisplay_larger(intx,inty){if(x<y)cout<<"Thelargeris:"<<y<<"\n";elseif(x>y)cout<<"Thelargeris:"<<x<<"\n";els

ecout<<"Twovaluesareequal."<<"\n";}2008-2009-2C++程序设计65.1.1函数的定义在C++中定义函数时注意:函数的形参及类型说明要采用新的ANSI标准,即必须放在函数名后面的括号内。当形参有多个时,必须用逗号隔开。如果函数

是无参函数,括号也不能省略。所有的函数都要先定义,后使用(调用)。不能省略函数值的类型,必须表明该函数的函数值的类型,即使该函数没有返回值,也要注明函数值的类型为void。函数2008-2009-2C++程序设计5.1.2函数的声明函数声明也称函数模型或函数原型。函数声明的一

般格式为:函数类型名函数名(形式参数表);例如:设有一函数定义为floatfun(chara,intb,floatc){函数体}函数则对fun函数的声明为:floatfun(charm,intn,floati

);//末尾要加上分号2008-2009-2C++程序设计5.1.2函数的声明关于函数声明的几点说明:函数必须先声明(或定义)后使用。必须确保函数声明语句与函数调用表达式出现在同一个文件中。虽然函数声明

与函数头相似,但是它们之间也有细微的差别。如,floatfun(char,int,float);函数声明中当函数返回值类型为int或char时函数类型可以省略,一般情况下不能省略函数类型。函数声明中形参的次序不能写错。函数定义在调用前,

函数声明可以省略。函数可以把例5.1改写为如下形式:#include<iostream.h>intsquare(intx);//声明语句voidmain(){intx,y;cout<<"\nPleaseinputaninteger:x=";cin>>x;y=squ

are(x);//调用语句cout<<"square="<<y<<endl;}intsquare(intx)//函数定义{returnx*x;}2008-2009-2C++程序设计9函数的定义与声明的区别函数的定义与声明

的区别函数的“定义”是一个函数功能的确立,包括指定函数名,函数返回值的类型,形参及其类型,函数体等,它是一个完整的、独立的函数单位。函数的“声明”则只是对已经定义好的函数的接口进行的说明,它包括函数名,函数类型,形参的类型。不包

括形参名和函数体。对函数进行声明的作用是告诉编译系统,在本程序中将要用到的函数是什么类型,参数的个数和类型,以便在主调函数中正确使用函数。函数2008-2009-2C++程序设计105.2函数的调用调用函数所

谓调用函数是指在程序中使用了该函数。函数调用时,中断现行函数(主调用函数),程序的执行流程转向被调用函数的入口。开始执行被调函数。遇到return或}返回主调函数。相关的概念➢主调函数、被调函数、调用点函数调用的格式函数名(实参表)说明➢如果调用的是无参函数,则实参表可略去,但函

数的括号不能省。➢如果实参表中有多个参数,参数之间用逗号隔开,实参的类型、个数应与形参一一对应。函数{语句1,…f1();…fn();…结尾语句}main()程序开始点程序结束点{…f1_1();…return}f1(){…fn_1();…return}fn(){…}f1_1()

{…}fn_1()2008-2009-2C++程序设计111.形参和实参形式参数和实际参数(形参和实参)在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。而函数之间的数据传递途径之一就是靠函数

的参数进行的。在定义函数时,函数名后面括号内的变量名为“形式参数”(形参)。在调用函数时,函数名后面括号内的表达式为“实际参数”(实参)。实参与形参个数相等,类型一致,按顺序一一对应。用实际参数向形式参数传递数据。函数2008-2009-2C++程序设计121.形参和实参举例函数

#include<iostream.h>intmax(int,int);voidmain(){inta,b,c;cin>>a>>b;c=max(a,b);cout<<"maxis"<<c<<endl;}intm

ax(intx,inty){intz;z=x>y?x:y;returnz;}实参形参2008-2009-2C++程序设计131.形参和实参关于形参和实参的几点说明实参可以是变量、常量、或表达式,但必须有确定的值。而形参必须是变量。形参变量,

只有存在发生函数调用时,形参才被分配存储单元,在调用结束时,形参所占的内存单元被释放。实参与形参的类型必须一致,否则会发生“类型不匹配”的错误。实参对形参的数据传递是“值传递”,即单向传递。➢由实参把

数据传给形参,并且存储单元与形参是不同的单元。➢调用结束后,形参单元被释放,而实参单元保留并维持原值。函数2008-2009-2C++程序设计142.函数的返回值函数的返回值是通过函数中的return语句“返回”的。return语句的格式为:

return(表达式);或return表达式;return语句的功能有两个:➢强制程序执行的流程从被调函数返回到主调函数。➢给主调函数带回一个确定的函数值。举例函数intmax(inta,intb){return(a>b?a:b);}2008-2009-2C++程

序设计152.函数的返回值函数返回值的类型函数返回值的类型就是在定义函数时的函数的类型。在定义函数时,函数的类型和return语句中的表达式类型不一致时,则以函数类型为准。如果被调用函数中没有return语句,为了明确表示函数“不返回值”,要用void定义无类型。举例➢这

样系统就保证不使函数带回任何值。函数voidprint(){printf("clanguage");}2008-2009-2C++程序设计163.函数调用的形式函数通过下列三种方式完成函数调用:函数调用语句➢在一个函数调用的后面加上“;”作为一条语

句。如:printf();函数表达式➢即函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。如:c=2*max(a,b);函数参数➢以函数的调用作为一个函数的实参。如:m=max(a,max(b,c));函数2008-2009-2C++程序设计4.函数的调用方式一

个函数被定义后就是为了将来对其调用。调用函数是实现函数功能的手段。正确的数据传递是正确使用函数的前提,C++语言采用函数的形式参数(形参)和实际参数(实参)实现函数间的数据传递。C++中函数的调用方式:赋值调用➢传递变量值的传值调用➢传递变量地址

值的传址调用引用调用2008-2009-2C++程序设计main(){inta,b,c;cin>>a>>b;;c=max(a,b);cout<<"Maxis:"<<c);}max(intx,inty){intz;z=x>y?

x:y;return(z);}4.函数的调用方式例比较两个数并输出大者c=max(a,b);max(intx,inty){intz;z=x>y?x:y;return(z);}2008-2009-2C++程序设计(1)函数的传值调用也称为值传递方式方式:函数调用

时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递实参可以是常量、变量或表达式,但必须有确定的值。2008-2009-2C++程序

设计例5.2问题使用传值调用方式完成两整数交换。#include<iostream.h>voidchange(inta,intb){inttemp;temp=a;a=b;b=temp;cout<<"a="<<a<<","<<”b="<<b<<endl;}voi

dmain(){intx=0;inty=1;change(x,y);cout<<"x="<<x<<","<<"y="<<y<<endl;}a=1,b=0x=0,y=12008-2009-2C++程序设计值传递调用演示711x:y:调用前:调用结束:71

1实参x:实参y:调用:711形参a:形参b:711实参x:实参y:change:711实参x:实参y:117形参a:形参b:temp2008-2009-2C++程序设计(2)函数的传址调用调用函数的实参地址值,被调用函数的形参用指针。调用时系统将实参的地址值赋给对应的形参指针

,使形参指针指向实参变量。传址调用的特点是可以通过改变形参所指向的变量值来影响实参。2008-2009-2C++程序设计例5.3问题使用传址调用方式完成两整数交换。#include<iostream.h>voidchange1(int*a,int*b){

inttemp;temp=*a;*a=*b;*b=temp;cout<<"a="<<*a<<","<<"b="<<*b<<endl;}voidmain(){intx=0;inty=1;change1(&x,&y);cout<<"x="<<x<<","<<"y="<<y<<endl;}a=1,b=

0x=1,y=02008-2009-2C++程序设计址传递调用演示59a:b:调用前:调用结束:95实参x:实参y:调用:ab形参a:形参b:59实参x:实参y:change:59实参x:实参y:59形参*a(a):形参*b(b):temp2008-2

009-2C++程序设计(3)函数的引用调用在函数定义时,函数的参数(形参)可以说明为引用类型,这样在函数的调用过程中,实参与形参的结合就属于引用调用。引用主要用于函数的形参和返回值。对形参引用的改变,实质就是直接地通过引用(实参的别名)来改变实参的变量值。这

种调用也起到了传址调用的作用,但更直接、方便。注意:引用调用方式中,实参用变量名,形参用引用,调用时将实参的变量名赋给对应的形参引用。在被调用函数中,改变引用的值就直接改变了对应的实参值。尽量避免使用传址方式来传递参数。20

08-2009-2C++程序设计例5.4问题使用引用调用方式完成两整数交换。#include<iostream.h>voidchange2(int&a,int&b){inttemp;temp=a;a=b;b=temp;cout<<"a="<<a<<",

"<<"b="<<b<<endl;}voidmain(){intx=0;inty=1;change2(x,y);cout<<"x="<<x<<","<<"y="<<y<<endl;}a=1,b=0x=1,y=02008-2009-

2C++程序设计5.函数的参数(1)设置函数参数的默认值C++中,允许在函数的说明或定义时给一个或多个参数指定默认值。但是,要求在一个指定了默认值的参数右边,不能出现没有指定默认值的参数。intadd_in

t(intx,inty=10);在函数调用时,编译器按从左至右的顺序将实参与形参结合,当实参的数目不足时,编译器将按同样的顺序用说明中或定义中的默认值为补遗缺少的实参。add_int(15);等价于add_int(15,10

);给某个参数指定默认值时,不仅可以是一个数值,而且还可以是任意复杂的表达式。例5.5设置默认参数值函数2008-2009-2C++程序设计5.函数的参数(2)使用数组作函数参数数组作函数参数可分为三种情况:形参和实参都用数组名、形参和实参都用对应数组的指针、实参用数组名形参用引

用。三种情况的结果相同,只是所采用的调用机制不同形参和实参都用数组例5.6➢形参和实参共用内存中同一个数组。在被调用函数中改变了数组中某个元素的值,对调用函数该数组的该元素的值也被改变。形参和实参都用对应数组的指针例5.7➢数组名规定是一个指针常量,所以在使用指针时,可以用数组

名,也可以用另外定义的指向数组的指针。实参用数组名形参用引用例5.8➢对数组类型使用引用方式,先要用类型定义语句定义一个数组类型;然后再用新定义的类型别名来定义数组和引用。2008-2009-2C++程序设计295.3内联函数内联函数内联函数的定义方法和格式:inlin

e函数值的类型函数名(形参表){函数体}举例函数voidmain(){doublex;cout<<"inputadata:";cin>>x;cout<<"thesqureis"<<square(x)<<en

dl;}#include<iostream.h>inlinedoublesquare(doublex){returnx*x;}2008-2009-2C++程序设计305.3内联函数内联函数与普通函数的区别和联系在

定义内联函数时,函数值的类型左面有“inline”关键字,而普通函数在定义时没有此关键字。程序中调用内联函数与调用普通函数的方法相同。当在程序中调用一个内联函数时,是将该函数的代码直接插入到调用点,然后执行该段代码,所以在调用过程中不存在

程序流程的跳转和返回问题。从调用机理看,内联函数可加快程序代码的执行速度和效率,但这是以增加程序代码为代价来求得速度的。函数2008-2009-2C++程序设计315.3内联函数对内联函数的限制应注意:不是任何一个函数都可定义成内

联函数。内联函数的函数体内不能含有复杂的结构控制语句,如:switch和while,如果内联函数的函数体内有这些语句,则编译器将该函数视同普通函数那样产生函数调用代码。递归函数不能被用来作为内联函数。内联函数一般适合于只有1~5条语句的小函数,对一个含有很多语句的大函数,没有必要使用

内联函数来实现。函数2008-2009-2C++程序设计325.4函数重载函数重载函数重载是指一个函数可以和同一作用域中的其他函数具有相同的名字,但这些同名函数的特征标(参数类型、参数个数)、返回值类型、函数功能可以完全不同。举例函数#include<io

stream.h>voidwhatitis(inti){cout<<"thisisinteger:"<<i<<endl;}voidwhatitis(charc[]){cout<<"thisisstring:"<<c<<

endl;}voidmain(){inti=1;charc[]="abcdef";whatitis(i);whatitis(c);}2008-2009-2C++程序设计335.4函数重载为什么要使用函数重载在

C语言中,每个函数必须有其唯一的名称,这样的缺点是所有具有相同功能、而只是函数参数不一样的函数,就必须用一个不同的名称。而C++中采用了函数重载后,对于具有同一功能的函数,如果只是由于函数参数类型不一样,则可以定义相同名称的函数。

函数2008-2009-2C++程序设计345.4函数重载匹配重载函数的顺序由于重载函数具有相同的函数名,在进行函数调用时,系统一般按照调用函数时的参数个数、类型和顺序来确定被调用的函数。具体来说,按以下步骤找到并调用那个函数:➢寻找一个严格的匹配

。即:调用与实参的数据类型、个数完全相同的那个函数。➢通过内部转换寻求一个匹配。即:通过(1)的方法没有找到相匹配的函数时,则由C++系统对实参的数据类型进行内部转换,转换完毕后,如果有匹配的函数存在,则执行该函数。➢通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就

调用那个函数。即:在函数调用处由程序员对实参进行强制类型转换,以此作为查找相匹配的函数的依据。函数2008-2009-2C++程序设计355.4函数重载匹配重载函数的顺序由于重载函数具有相同的函数名,在进行函数

调用时,系统一般按照调用函数时的参数个数、类型和顺序来确定被调用的函数。具体来说,按以下步骤找到并调用那个函数:➢寻找一个严格的匹配。即:调用与实参的数据类型、个数完全相同的那个函数。➢通过内部转换寻求一个匹配。即:通过(1)的方法没有找到相匹配的函数时,则由C++系

统对实参的数据类型进行内部转换,转换完毕后,如果有匹配的函数存在,则执行该函数。➢通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就调用那个函数。即:在函数调用处由程序员对实参进行强制类型转换,以此作为查找相匹配的函数的依据。函数2008-2009

-2C++程序设计365.4函数重载重载函数举例函数#include<iostream.h>voidprint(doubled){cout<<"thisisadouble:"<<d<<endl;}voidprint(inti){cout<<"thisisaninteger:"<<

i<<endl;}//voidprint(charc)//{cout<<"thisisacharacter:"<<c<<endl;}voidmain(){intx=1,z=10;floaty=1.0;charc='a';//按规则(1)自动匹配函数voidprint(inti)print(x);

//按规则(2)通过内部转换匹配函数voidprint(doublei)//因为系统能自动将float型转换成double型print(y);//按规则(2)通过内部转换匹配函数voidprint(inti)//因为系统能自动将char型转换成int型p

rint(c);//按规则(3)匹配voidprint(doublei)//因为程序中将实参z强制转换为double型。print(double(z));}thisisaninteger:1thisisadouble:1

thisisaninteger:97thisisadouble:10Pressanykeytocontinuethisisaninteger:1thisisadouble:1thisisacharacter:athisisadouble:

10Pressanykeytocontinue2008-2009-2C++程序设计375.4函数重载定义重载函数时的注意事项重载函数间不能只是函数的返回值不同,应至少在形参的个数、参数类型或参数顺序上有所不同。➢这种重载就是错误的。强烈建议:

➢应使所有的重载函数的功能相同。➢如果让重载函数完成不同的功能,会破坏程序的可读性。函数voidmyfun(inti){………………}intmyfun(inti){………………}2008-2009-2C++程序设计385.5函数的嵌套调用和递归调用函数的嵌套调用C++语

言中函数的定义是平行的、独立的,所以,函数的定义是不能嵌套的,但函数的调用可以。嵌套调用即在调用一个函数的过程中,又调用另一函数。函数main()函数{……调用a函数……}a()函数{……调用b函数……}b()函数{…………}2008-2009-2C++程序设计395.5函数的嵌套调用和递归调用函

数的递归调用函数的递归调用就是当一个函数在执行的过程中,出现了直接或间接地调用函数本身的函数调用方式。例5.12:定义求n!的函数。函数longfact(longn){if(n==1)return1;returnn*fact(n-1);//

函数fact直接调用本身}n!=1n=1n*(n-1)!n>12008-2009-2C++程序设计405.5函数的嵌套调用和递归调用函数递归调用的条件必须有完成函数任务的语句。➢如:上例求n!中的return1;有一个递归调用语句,并且该递归调用语句的参数应该逐渐逼近不满足条件,以致最后

停止递归调用。先测试,后递归调用。➢也就是说,递归是有条件的,满足了条件后,才可以递归;➢否则就不再递归调用。函数2008-2009-2C++程序设计415.6作用域标识符的作用范围变量的存储类别包含多个源文件的程序编译和链接外部函数内部函数名称空间C++语言程序设计2008-2009-

2C++程序设计421.简介变量定义的完整格式:存储类别数据类型变量名数据类型➢占用存储空间的大小➢取值范围存储类别➢在内存中持续的时间(生存期)➢在硬件中存放的位置例5.15分析下列变量的输出结果。其它属性作用范围➢可以被引用的程序部分(可见性)作用范围和存储类别2008-

2009-2C++程序设计432.作用范围程序中的所有标识符构成了名称空间。需要一个机制来避免和解决名称的冲突问题。标识符的作用范围能够引用该标识符的程序部分。有四种作用范围:➢文件作用范围➢函数作用范围➢程序块作用范围➢函数原型作用范围作用范围和存

储类别2008-2009-2C++程序设计442.作用范围文件作用范围在函数外声明的标识符,可以在所有函数中被引用。包括:全局变量(在函数外定义的变量),函数。作用范围和存储类别inttotal;intmax(int,int);voidmain(){…}intlimit;intmax(

intx,inty){…}作用范围从声明的位置开始,到文件的末尾。2008-2009-2C++程序设计452.作用范围函数作用范围在函数体内定义的标识符,只能在函数体内被引用。包括:语句标号(无需单独声明)作用范围和存储类别voidmain(){…gotoloop;…loop:…;}

2008-2009-2C++程序设计462.作用范围程序块作用范围在程序块内声明的变量,在程序块内被引用。包括:程序块内定义的变量(局部变量),函数的参数。作用范围和存储类别intmax(intx,inty){…}vo

idmain(){inta;…{inta;…}…}作用范围从声明的位置开始,到程序块的右大括号覆盖同名变量,内部变量“覆盖了”外部变量2008-2009-2C++程序设计472.作用范围函数原型作用范围函数原型中的参数。作用范围和存储类别intmax(intx,i

nty);voidmain(){…}intmax(intx,inty){…}2008-2009-2C++程序设计48关于声明和定义定义声明定义一个标识符,同时也是声明。对于变量,定义意味着创建,即为其分配

内存。对于函数,需要给出函数体。引用声明只是声明一个需要引用的标识符。例如➢函数的原型➢变量的引用声明需要带extern作用范围和存储类别2008-2009-2C++程序设计493.存储类别四种存储类别说明符autor

egisterexternstatic两种存储时期自动存储时期➢auto➢register静态存储时期➢extern➢static作用范围和存储类别2008-2009-2C++程序设计50自动存储类别自动存储程序执行到变量所在的程序块内时创建它,退出时销毁。➢不会被自动初始化。

auto(自动变量):局部变量的缺省类别。➢程序块中定义的变量,函数的参数。register(寄存器变量):建议编译器把变量放进CPU的寄存器。➢只适用于自动变量。作用范围和存储类别autointa,b;registerintc

ount=1;2008-2009-2C++程序设计51静态存储类别静态存储程序开始执行时创建,在程序执行期间,变量一直存在。➢自动被初始化,缺省初值:0或‘\0’。static(静态局部变量):可以用于局部变量。➢退出程序块后依然存在,并保留值。➢但不改变其作用范围,即只能在所

在的程序块内被使用。extern(外部变量):用来声明在“外部”定义的全局变量。➢仅用于声明变量。作用范围和存储类别staticinta,b;externinttotal;全局变量具有静态存储期2008-2009-2C++程序设计52案例分析:存储类别存储

类别读下面的程序,写出结果。作用范围和存储类别voidtest(inta){autointb=10;staticintc=10;b++;c++;cout<<"a="<<a<<"\tb="<<b<<"\tc="<<c<<endl;}voidmain(){inti

;for(i=1;i<=3;i++)test(i);}a=1b=11c=11a=2b=11c=12a=3b=11c=132008-2009-2C++程序设计53案例分析:存储类别存储类别结果分析作用范围和存储类别123动态存储区静态存储区cbababaa=1b=11c=11a=

2b=11c=12a=3b=11c=132008-2009-2C++程序设计54C++语言程序的内存映像C++语言程序的内存映像作用范围和存储类别包含了代码中的字面值常量。存放全局变量和标明为静态类的局部变量。栈:保存函数调用时的返回地址、函数的形参、自动局部变量,以及CPU的当前状态。

堆:自由内存区域。程序代码静态存储变量堆栈程序可以访问的内存区域。数据段代码段动态存储区用户区静态存储区2008-2009-2C++程序设计55案例分析:外部变量外部变量作用范围和存储类别#include

<iostream.h>voidmain(){externinta;intc=3;cout<<"a="<<a<<endl;{externintc;cout<<"innerc="<<c<<endl;}cout<<"

c="<<c<<endl;}inta=1;intc=5;a=1innerc=5c=32008-2009-2C++程序设计56案例分析:作用范围与存储类别作用范围与存储类别作用范围和存储类别#include<stdio.h>voida(void

);/*functionprototype*/voidb(void);/*functionprototype*/voidc(void);/*functionprototype*/intx=1;/*globalvariab

le*/voidmain(){intx=5;printf("localxinouterscopeofmainis%d\n",x);{/*startnewscope*/intx=7;printf("localxininnerscopeofmainis%

d\n",x);}/*endnewscope*/printf("\nlocalxinouterscopeofmainis%d\n",x);2008-2009-2C++程序设计57案例分析:作用范围与存储类别作用范围与存储类

别作用范围和存储类别a();b();c();a();b();c();printf("localxinmainis%d\n",x);}voida(){intx=25;/*initializedeachtimeaiscalled*/prin

tf("\nlocalxinais%dafterentering\n",x);x++;printf("localxinais%dbeforeexiting\n",x);}2008-2009-2C++程序设计58案例分析:作用范围与存储类别作用范围与存储类别作用

范围和存储类别voidb(){staticintx=50;/*staticinitializationonly*//*firsttimebiscalled*/printf("\nlocalxinbis%dafterenteri

ng\n",x);x++;printf("localxinbis%dbeforeexiting\n",x);}voidc(){printf("\nglobalxis%donenteringc\n",x);x*=10;printf("globalxis%donexitingc\n",x

);}2008-2009-2C++程序设计59案例分析:作用范围与存储类别作用范围与存储类别作用范围和存储类别localxinouterscopeofmainis5localxininnerscopeofmainis7localxinouterscopeofma

inis5localxinais25afterenteringalocalxinais26beforeexitingalocalxinbis50afterenteringblocalxinbis51beforeexitingbglobalxis1onent

eringcglobalxis10onexitingc2008-2009-2C++程序设计60案例分析:作用范围与存储类别作用范围与存储类别作用范围和存储类别localxinais25afterenteringalocalxinais26beforeexitingalocalxinbis51aft

erenteringblocalxinbis52beforeexitingbglobalxis10onenteringcglobalxis100onexitingclocalxinmainis52008-2009-2

C++程序设计61包含多个源文件的程序包含多个源文件的程序每个函数的定义必须在一个文件内,不能被分割。全局变量可以被同一文件内的函数访问。➢如果需要被其他文件内的函数访问,则必须在其他文件内声明。➢extern表示变量my

Global是在另一个文件内有定义。一个文件内定义的函数,也可以被其他文件内的函数调用。➢在每个文件内加入该函数的原型(声明为外部函数)。➢函数的声明可以不需要extern。作用范围和存储类别intmyGlobal;externin

tmyGlobal;a.cppb.cpp2008-2009-2C++程序设计62包含多个源文件的程序包含多个源文件的程序举例作用范围和存储类别#include<stdio.h>inta,b;externintmax(void);voidmain(){scanf("%d%d",&a,&

b);printf("%d",max());}externinta,b;intmax(){return(a>b?a:b);}ABcw0604a.cppcw0604b.cpp2008-2009-2C++程序设计

63包含多个源文件的程序包含多个源文件的程序static➢限制全局变量只能被同一文件内的函数访问。➢限制函数只能被同一文件内的函数调用。➢说明:“同一文件”是指包含变量的定义、函数的定义的那个文件。作用范围和存储类别staticintm

yGlobal;staticvoidmyFunc(){…}2008-2009-2C++程序设计64编译包含多个源文件的程序编译包含多个源文件的程序每个源文件必须被编译,然后链接成一个可执行文件。如果有

一个文件作了改动,则必须重新编译所有相关的文件。一般会提供make工具用来管理和编译多源文件的程序。➢创建makefile文件,记录编译规则。➢自动查找必须编译的源文件。可以创建工程(project)文件来管理多源文件

的程序。➢举例:演示在VC中创建工程,并加入多个文件。作用范围和存储类别2008-2009-2C++程序设计65名称空间名称空间通过定义一种新的声明区域来创建命名的名称空间。允许创建名称空间的目的提供了一个声明名称的区域。一个名称空间中的名称不会与另外一个名称空间中的相同名称发生冲突,同时允许程序

的其他部分使用该名称空间中声明的对象。创建名称空间使用namespace关键字作用范围和存储类别2008-2009-2C++程序设计66名称空间名称空间举例作用范围和存储类别namespaceTom{intcount;intsum;vo

idsort();}namespaceJack{doublesum;voidhello(){cout<<"Hello!"<<endl;}namespaceJimmy{intcount;}}可以是全局的;也可以嵌套定义。但不能在代码块中定义。vo

idmain(){namespaceerror{intcount;}}2008-2009-2C++程序设计67名称空间名称空间中声明的名称是全局的。具有文件作用范围。也可以在文件间共享——具有程序作用范围。有一个缺省的全局名称空间对应文件声明区域。例如,全局变量就位于此名称空间中。作用范围和存储

类别2008-2009-2C++程序设计68名称空间名称空间是开放的可以把名称加入到一个已有的名称空间中。例如➢把square加入名称空间Tom中。➢为square()函数提供代码。作用范围和存储类别namespaceTom{intsquare(int);}namespaceTom

{intsquare(inta){returna*a;}}2008-2009-2C++程序设计69名称空间访问名称空间中的名称使用作用域解析运算符:::➢例如使用using声明➢使特定的名称可用使用using编译指令➢

使名称空间中的全部名称可用作用范围和存储类别Tom::count=10;Tom::square(5);限定名称2008-2009-2C++程序设计70名称空间using声明把特定的名称添加到它(using声明)所属的声明区域中。作用范围和存储类别#include<io

stream.h>namespaceTom{intcount;}intcount=1;voidmain(){Tom::count=10;usingTom::count;doublecount=20;cout<<count<<endl;cout<<::

count<<endl;}错误!因为已经声明了Tom的count。全局名称空间的count。1012008-2009-2C++程序设计71名称空间using编译指令作用范围和存储类别#include<iostream.h>namespaceTom{intcount;}intcoun

t=1;voidmain(){Tom::count=10;usingnamespaceTom;doublecount=20;cout<<count<<endl;cout<<::count<<endl;cout<<Tom::count<<endl

;}覆盖Tom的count。20110使用using声明更安全:如果出现名称冲突,编译器会报错。2008-2009-2C++程序设计72名称空间名称空间的嵌套作用范围和存储类别#include<iostream.h>namespaceJack{doublesum;voidhello(

){cout<<"Hello!"<<endl;}namespaceJimmy{intcount;}}voidmain(){Jack::Jimmy::count=7;usingnamespaceJack;cout<<"Jack::Jimmy::count=

"<<Jimmy::count<<endl;usingnamespaceJack::Jimmy;cout<<"Jack::Jimmy::count="<<count<<endl;}2008-2009-2C++程序设计73名

称空间未命名的名称空间作用范围和存储类别#include<iostream.h>namespace{doublesum;}voidmain(){sum=0;cout<<"sum="<<sum<<endl;}#include<iostream.h>stati

cdoublesum;voidmain(){sum=0;cout<<"sum="<<sum<<endl;}目前等价2008-2009-2C++程序设计74名称空间使用名称空间的指导原则使用已命名的名称空间中的变量,而不是外部的全局变量。使用未

命名的名称空间中的变量,而不是静态全局变量。把自己开发的函数库或类库放在一个名称空间中。➢例如std导入名称时,首选使用限定名称或using声明;尽量避免使用using编译指令。对于using声明,首选将其

作用域设置为局部而不是全局。对于using编译指令,要放在所有#include命令之后尽量避免名称的二义性!作用范围和存储类别2008-2009-2C++程序设计5.7C++的系统函数C++编译系统提供了

几百个函数供编程者调用。本节介绍使用系统函数的方法,及字符串系统函数。C++系统所提供的系统函数的说明分类放在不同的.h文件中。math.h数学常用函数ctype.h判断字母、数字、大小写字母string.h字

符串处理函数conio.h屏幕处理函数graph.h图形处理函数2008-2009-2C++程序设计76小结用于存储程序数据的内存可用存储时期和作用范围来表征。存储时期可以是静态的或自动的。作用范围决定了哪一部分程序可以

访问某个对象。C++语言程序可以包含多个源文件,在编译时,逐一编译各文件,然后通过链接器链接所有的目标代码构成可执行文件。名称空间允许定义一个可在其中声明标识符(名称)的命名区域,目的是减少名称冲突。作用范围和存储类别2008-2009-2C++程序设计77小结函数当程序代码量较大时,可根据功能

的不同分成更小、更容易管理的模块,这种模块就是函数。程序中所用的函数有两类,一类是库函数,另一类是用户自定义函数,库函数可直接使用,而用户自定义函数要先定义后使用。一个函数可定义成有参函数,也可定义成无参函数,当函数无返回值时,要把函数的类

型定义成void。定义函数时,函数名称后面括号内的参数是形式参数,形式参数可以是普通变量、数组名、指针变量、引用等。当发生函数调用时,实参与形参间发生了数据传递,要注意传值与传地址间的区别。函数2008-2009-2C++程序设计78小结内联函数

内联函数是为了提高编程的效率而实现的,它适用于函数体代码较少且程序中不含有复杂程序结构的情况。带默认形参值的函数在函数定义中通过赋值运算可指定参数的默认值。函数重载函数重载允许用同一个函数名定义多个函数,系统会根据传递给函数

的参数的数目、类型和顺序调用相匹配的函数,函数重载使程序设计简单化。函数2008-2009-2C++程序设计79小结用于存储程序数据的内存可用存储时期和作用范围来表征。存储时期可以是静态的或自动的。作用范围决定了哪一部分程序可以访问

某个对象。C++语言程序可以包含多个源文件,在编译时,逐一编译各文件,然后通过链接器链接所有的目标代码构成可执行文件。名称空间允许定义一个可在其中声明标识符(名称)的命名区域,目的是减少名称冲突。作用范围和存储类别

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?