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

上传人:tia****nde 文档编号:14142082 上传时间:2020-07-06 格式:PPT 页数:79 大小:537KB
返回 下载 相关 举报
C程序设计第5章函数.ppt_第1页
第1页 / 共79页
C程序设计第5章函数.ppt_第2页
第2页 / 共79页
C程序设计第5章函数.ppt_第3页
第3页 / 共79页
点击查看更多>>
资源描述
第五讲 函数,2,本章内容提要:,函数概述 内联函数 带默认参数值的函数 函数重载 作用域与存储类型 系统函数,C+语言程序设计,函数,函数,#include int 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+程序的基本单元,是组成模块。 一个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+中定义函数时注意: 函数的形参及类型说明要采用新的ANSI标准,即必须放在函数名后面的括号内。 当形参有多个时,必须用逗号隔开。 如果函数是无参函数,括号也不能省略。 所有的函数都要先定义,后使用(调用)。 不能省略函数值的类型,必须表明该函数的函数值的类型,即使该函数没有返回值,也要注明函数值的类型为void。,函数,5.1.2 函数的声明,函数声明也称函数模型或函数原型。 函数声明的一般格式为: 函数类型名 函数名(形式参数表); 例如:设有一函数定义为 float fun(char a, int b, float c) 函数体 ,函数,则对fun函数的声明为: float fun(char m, int n, float i);/末尾要加上分号,5.1.2 函数的声明,关于函数声明的几点说明: 函数必须先声明(或定义)后使用。 必须确保函数声明语句与函数调用表达式出现在同一个文件中。 虽然函数声明与函数头相似,但是它们之间也有细微的差别。 如,float fun(char, int, float); 函数声明中当函数返回值类型为int或char时函数类型可以省略,一般情况下不能省略函数类型。 函数声明中形参的次序不能写错。 函数定义在调用前,函数声明可以省略。,函数,可以把例5.1改写为如下形式: #include int square(int x);/声明语句 void main() int x,y; coutx; y=square(x);/调用语句 coutsquare=yendl; int square(int x)/函数定义 return x*x;,9,函数的定义与声明的区别,函数的定义与声明的区别 函数的“定义”是一个函数功能的确立,包括指定函数名,函数返回值的类型,形参及其类型,函数体等,它是一个完整的、独立的函数单位。 函数的“声明”则只是对已经定义好的函数的接口进行的说明,它包括函数名,函数类型,形参的类型。不包括形参名和函数体。 对函数进行声明的作用是告诉编译系统,在本程序中将要用到的函数是什么类型,参数的个数和类型,以便在主调函数中正确使用函数。,函数,10,5.2函数的调用,调用函数 所谓调用函数是指在程序中使用了该函数。 函数调用时,中断现行函数(主调用函数),程序的执行流程转向被调用函数的入口。开始执行被调函数。遇到return或返回主调函数。 相关的概念 主调函数、被调函数、调用点 函数调用的格式 函数名(实参表) 说明 如果调用的是无参函数,则实参表可略去,但函数的括号不能省。 如果实参表中有多个参数,参数之间用逗号隔开,实参的类型、个数应与形参一一对应。,函数,程序 开始点,程序 结束点,11,1.形参和实参,形式参数和实际参数(形参和实参) 在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。 而函数之间的数据传递途径之一就是靠函数的参数进行的。 在定义函数时,函数名后面括号内的变量名为“形式参数”(形参)。 在调用函数时,函数名后面括号内的表达式为“实际参数”(实参)。 实参与形参个数相等,类型一致,按顺序一一对应。用实际参数向形式参数传递数据。,函数,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.形参和实参,关于形参和实参的几点说明 实参可以是变量、常量、或表达式,但必须有确定的值。而形参必须是变量。 形参变量,只有存在发生函数调用时,形参才被分配存储单元,在调用结束时,形参所占的内存单元被释放。 实参与形参的类型必须一致,否则会发生“类型不匹配”的错误。 实参对形参的数据传递是“值传递”,即单向传递。 由实参把数据传给形参,并且存储单元与形参是不同的单元。 调用结束后,形参单元被释放,而实参单元保留并维持原值。,函数,14,2.函数的返回值,函数的返回值是通过函数中的return语句“返回”的。 return语句的格式为: return(表达式); 或 return 表达式; return语句的功能有两个: 强制程序执行的流程从被调函数返回到主调函数。 给主调函数带回一个确定的函数值。 举例,函数,int max(int a,int b) return(ab?a:b); ,15,2.函数的返回值,函数返回值的类型 函数返回值的类型就是在定义函数时的函数的类型。在定义函数时,函数的类型和return语句中的表达式类型不一致时,则以函数类型为准。 如果被调用函数中没有return语句,为了明确表示函数“不返回值”,要用void定义无类型。 举例 这样系统就保证不使函数带回任何值。,函数,void print() printf(c language); ,16,3.函数调用的形式,函数通过下列三种方式完成函数调用: 函数调用语句 在一个函数调用的后面加上“;”作为一条语句。如:printf(); 函数表达式 即函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。如:c=2*max(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 z; z=xy?x:y; return(z); ,形参,实参,(1)函数的传值调用,也称为值传递方式 方式: 函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值 特点: 形参与实参占用不同的内存单元 单向传递 实参可以是常量、变量或表达式,但必须有确定的值。,例5.2,问题 使用传值调用方式完成两整数交换。,#include void 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=yendl; ,a=1,b=0 x=0,y=1,值传递调用演示,(2)函数的传址调用,调用函数的实参地址值,被调用函数的形参用指针。调用时系统将实参的地址值赋给对应的形参指针,使形参指针指向实参变量。 传址调用的特点是可以通过改变形参所指向的变量值来影响实参。,例5.3,问题 使用传址调用方式完成两整数交换。,#include void 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,形参a:,形参b:,5,9,实参x:,实参y:,(3)函数的引用调用,在函数定义时,函数的参数(形参)可以说明为引用类型,这样在函数的调用过程中,实参与形参的结合就属于引用调用。 引用主要用于函数的形参和返回值。 对形参引用的改变,实质就是直接地通过引用(实参的别名)来改变实参的变量值。 这种调用也起到了传址调用的作用,但更直接、方便。 注意: 引用调用方式中,实参用变量名,形参用引用,调用时将实参的变量名赋给对应的形参引用。 在被调用函数中,改变引用的值就直接改变了对应的实参值。 尽量避免使用传址方式来传递参数。,例5.4,问题 使用引用调用方式完成两整数交换。,#include void change2(int ,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)使用数组作函数参数 数组作函数参数可分为三种情况:形参和实参都用数组名、形参和实参都用对应数组的指针、实参用数组名形参用引用。 三种情况的结果相同,只是所采用的调用机制不同 形参和实参都用数组 例5.6 形参和实参共用内存中同一个数组。在被调用函数中改变了数组中某个元素的值,对调用函数该数组的该元素的值也被改变。 形参和实参都用对应数组的指针 例5.7 数组名规定是一个指针常量,所以在使用指针时,可以用数组名,也可以用另外定义的指向数组的指针。 实参用数组名形参用引用 例5.8 对数组类型使用引用方式,先要用类型定义语句定义一个数组类型 ;然后再用新定义的类型别名来定义数组和引用。,29,5.3内联函数,内联函数 内联函数的定义方法和格式: 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”关键字,而普通函数在定义时没有此关键字。 程序中调用内联函数与调用普通函数的方法相同。 当在程序中调用一个内联函数时,是将该函数的代码直接插入到调用点,然后执行该段代码,所以在调用过程中不存在程序流程的跳转和返回问题。 从调用机理看,内联函数可加快程序代码的执行速度和效率,但这是以增加程序代码为代价来求得速度的。,函数,31,5.3内联函数,对内联函数的限制 应注意:不是任何一个函数都可定义成内联函数。 内联函数的函数体内不能含有复杂的结构控制语句,如:switch和while,如果内联函数的函数体内有这些语句,则编译器将该函数视同普通函数那样产生函数调用代码。 递归函数不能被用来作为内联函数。 内联函数一般适合于只有15条语句的小函数,对一个含有很多语句的大函数,没有必要使用内联函数来实现。,函数,32,5.4函数重载,函数重载 函数重载是指一个函数可以和同一作用域中的其他函数具有相同的名字,但这些同名函数的特征标(参数类型、参数个数)、返回值类型、函数功能可以完全不同。 举例,函数,#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+中采用了函数重载后,对于具有同一功能的函数,如果只是由于函数参数类型不一样,则可以定义相同名称的函数。,函数,34,5.4函数重载,匹配重载函数的顺序 由于重载函数具有相同的函数名,在进行函数调用时,系统一般按照调用函数时的参数个数、类型和顺序来确定被调用的函数。 具体来说,按以下步骤找到并调用那个函数: 寻找一个严格的匹配。即:调用与实参的数据类型、个数完全相同的那个函数。 通过内部转换寻求一个匹配。即:通过(1)的方法没有找到相匹配的函数时,则由C+系统对实参的数据类型进行内部转换,转换完毕后,如果有匹配的函数存在,则执行该函数。 通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就调用那个函数。即:在函数调用处由程序员对实参进行强制类型转换,以此作为查找相匹配的函数的依据。,函数,35,5.4函数重载,匹配重载函数的顺序 由于重载函数具有相同的函数名,在进行函数调用时,系统一般按照调用函数时的参数个数、类型和顺序来确定被调用的函数。 具体来说,按以下步骤找到并调用那个函数: 寻找一个严格的匹配。即:调用与实参的数据类型、个数完全相同的那个函数。 通过内部转换寻求一个匹配。即:通过(1)的方法没有找到相匹配的函数时,则由C+系统对实参的数据类型进行内部转换,转换完毕后,如果有匹配的函数存在,则执行该函数。 通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就调用那个函数。即:在函数调用处由程序员对实参进行强制类型转换,以此作为查找相匹配的函数的依据。,函数,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)通过内部转换匹配函数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: 1 this is a double: 1 this is an integer: 97 this is a double: 10 Press any key to continue,this is an integer: 1 this is a double: 1 this is a character: a this is a double: 10 Press any key to continue,37,5.4函数重载,定义重载函数时的注意事项 重载函数间不能只是函数的返回值不同,应至少在形参的个数、参数类型或参数顺序上有所不同。 这种重载就是错误的。 强烈建议: 应使所有的重载函数的功能相同。 如果让重载函数完成不同的功能,会破坏程序的可读性。,函数,void myfun(int i) int myfun(int i) ,38,5.5函数的嵌套调用和递归调用,函数的嵌套调用 C+语言中函数的定义是平行的、独立的,所以,函数的定义是不能嵌套的,但函数的调用可以。 嵌套调用即在调用一个函数的过程中,又调用另一函数。,函数,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; 有一个递归调用语句,并且该递归调用语句的参数应该逐渐逼近不满足条件,以致最后停止递归调用。 先测试,后递归调用。 也就是说,递归是有条件的,满足了条件后,才可以递归; 否则就不再递归调用。,函数,41,5.6 作用域,标识符的作用范围 变量的存储类别 包含多个源文件的程序 编译和链接 外部函数 内部函数 名称空间,C+语言程序设计,42,1.简介,变量定义的完整格式: 存储类别 数据类型 变量名 数据类型 占用存储空间的大小 取值范围 存储类别 在内存中持续的时间(生存期) 在硬件中存放的位置 例5.15分析下列变量的输出结果。 其它属性 作用范围 可以被引用的程序部分(可见性),作用范围和存储类别,43,2.作用范围,程序中的所有标识符构成了名称空间。 需要一个机制来避免和解决名称的冲突问题。 标识符的作用范围 能够引用该标识符的程序部分。 有四种作用范围: 文件作用范围 函数作用范围 程序块作用范围 函数原型作用范围,作用范围和存储类别,44,2.作用范围,文件作用范围 在函数外声明的标识符,可以在所有函数中被引用。 包括:全局变量(在函数外定义的变量),函数。,作用范围和存储类别,int total; int max(int, int); void main() int limit; int max(int x, int y) ,作用范围 从声明的位置开始,到文件的末尾。,45,2.作用范围,函数作用范围 在函数体内定义的标识符,只能在函数体内被引用。 包括:语句标号(无需单独声明),作用范围和存储类别,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,关于声明和定义,定义声明 定义一个标识符,同时也是声明。 对于变量,定义意味着创建,即为其分配内存。 对于函数,需要给出函数体。 引用声明 只是声明一个需要引用的标识符。 例如 函数的原型 变量的引用声明需要带extern,作用范围和存储类别,49,3.存储类别,四种存储类别说明符 auto register extern static 两种存储时期 自动存储时期 auto register 静态存储时期 extern static,作用范围和存储类别,50,自动存储类别,自动存储 程序执行到变量所在的程序块内时创建它,退出时销毁。 不会被自动初始化。 auto(自动变量):局部变量的缺省类别。 程序块中定义的变量,函数的参数。 register(寄存器变量):建议编译器把变量放进CPU的寄存器。 只适用于自动变量。,作用范围和存储类别,auto int a, b;,register int count = 1;,51,静态存储类别,静态存储 程序开始执行时创建,在程序执行期间,变量一直存在。 自动被初始化,缺省初值:0 或 0。 static(静态局部变量):可以用于局部变量。 退出程序块后依然存在,并保留值。 但不改变其作用范围,即只能在所在的程序块内被使用。 extern(外部变量):用来声明在“外部”定义的全局变量。 仅用于声明变量。,作用范围和存储类别,static int a, b;,extern int total;,全局变量具有静态存储期,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=11 a=2b=11c=12 a=3b=11c=13,53,案例分析:存储类别,存储类别 结果分析,作用范围和存储类别,1,2,3,c,b,a,b,a,b,a,a=1b=11c=11 a=2b=11c=12 a=3b=11c=13,54,C+语言程序的内存映像,C+语言程序的内存映像,作用范围和存储类别,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 = 1 inner c = 5 c = 3,56,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,#include void a(void); /*function prototype*/ void b(void); /*function prototype*/ void c(void); /*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(); 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 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 5 local x in inner scope of main is 7 local x in outer scope of main is 5 local x in a is 25 after entering a local x in a is 26 before exiting a local x in b is 50 after entering b local x in b is 51 before exiting b global x is 1 on entering c global x is 10 on exiting c,60,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,local x in a is 25 after entering a local x in a is 26 before exiting a local x in b is 51 after entering b local x in b is 52 before exiting b global x is 10 on entering c global x is 100 on exiting c local x in main is 5,61,包含多个源文件的程序,包含多个源文件的程序 每个函数的定义必须在一个文件内,不能被分割。 全局变量可以被同一文件内的函数访问。 如果需要被其他文件内的函数访问,则必须在其他文件内声明。 extern 表示变量myGlobal是在另一个文件内有定义。 一个文件内定义的函数,也可以被其他文件内的函数调用。 在每个文件内加入该函数的原型(声明为外部函数)。 函数的声明可以不需要 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.cpp,63,包含多个源文件的程序,包含多个源文件的程序 static 限制全局变量只能被同一文件内的函数访问。 限制函数只能被同一文件内的函数调用。 说明:“同一文件”是指包含变量的定义、函数的定义的那个文件。,作用范围和存储类别,static int myGlobal; static void myFunc() ,64,编译包含多个源文件的程序,编译包含多个源文件的程序 每个源文件必须被编译,然后链接成一个可执行文件。 如果有一个文件作了改动,则必须重新编译所有相关的文件。 一般会提供 make 工具用来管理和编译多源文件的程序。 创建 makefile 文件,记录编译规则。 自动查找必须编译的源文件。 可以创建工程(project)文件来管理多源文件的程序。 举例:演示在VC中创建工程,并加入多个文件。,作用范围和存储类别,65,名称空间,名称空间 通过定义一种新的声明区域来创建命名的名称空间。 允许创建名称空间的目的 提供了一个声明名称的区域。 一个名称空间中的名称不会与另外一个名称空间中的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的对象。 创建名称空间 使用namespace关键字,作用范围和存储类别,66,名称空间,名称空间举例,作用范围和存储类别,namespace Tom int count; int sum; void sort(); namespace Jack double sum; void hello() coutHello!endl; namespace Jimmy int count; ,可以是全局的; 也可以嵌套定义。 但不能在代码块中定义。,void main() namespace error int count; ,67,名称空间,名称空间中声明的名称是全局的。 具有文件作用范围。 也可以在文件间共享具有程序作用范围。 有一个缺省的全局名称空间 对应文件声明区域。 例如,全局变量就位于此名称空间中。,作用范围和存储类别,68,名称空间,名称空间是开放的 可以把名称加入到一个已有的名称空间中。 例如 把square加入名称空间Tom中。 为square()函数提供代码。,作用范围和存储类别,namespace 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() Tom:count = 10; using Tom:count; double count = 20; coutcountendl; cout:countendl; ,错误! 因为已经声明了Tom的count。,全局名称空间的count。,10 1,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的count。,20 1 10,使用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 = countendl; ,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编译指令。 对于using声明,首选将其作用域设置为局部而不是全局。 对于using编译指令,要放在所有#include命令之后 尽量避免名称的二义性!,作用范围和存储类别,5.7 C+的系统函数,C+编译系统提供了几百个函数供编程者调用。本节介绍使用系统函数的方法,及字符串系统函数。 C+系统所提供的系统函数的说明分类放在不同的.h文件中。 math.h数学常用函数 ctype.h判断字母、数字、大小写字母 string.h字符串处理函数 conio.h屏幕处理函数 graph.h图形处理函数,76,小结,用于存储程序数据的内存可用存储时期和作用范围来表征。 存储时期可以是静态的或自动的。 作用范围决定了哪一部分程序可以访问某个对象。 C+语言程序可以包含多个源文件,在编译时,逐一编译各文件,然后通过链接器链接所有的目标代码构成可执行文件。 名称空间允许定义一个可在其中声明标识符(名称)的命名区域,目的是减少名称冲突。,作用范围和存储类别,77,小结,函数 当程序代码量较大时,可根据功能的不同分成更小、更容易管理的模块,这种模块就是函数。 程序中所用的函数有两类,一类是库函数,另一类是用户自定义函数,库函数可直接使用,而用户自定义函数要先定义后使用。 一个函数可定义成有参函数,也可定义成无参函数,当函数无返回值时,要把函数的类型定义成void。 定义函数时,函数名称后面括号内的参数是形式参数,形式参数可以是普通变量、数组名、指针变量、引用等。当发生函数调用时,实参与形参间发生了数据传递,要注意传值与传地址间的区别。,函数,78,小结,内联函数 内联函数是为了提高编程的效率而实现的,它适用于函数体代码较少且程序中不含有复杂程序结构的情况。 带默认形参值的函数 在函数定义中通过赋值运算可指定参数的默认值。 函数重载 函数重载允许用同一个函数名定义多个函数,系统会根据传递给函数的参数的数目、类型和顺序调用相匹配的函数,函数重载使程序设计简单化。,函数,79,小结,用于存储程序数据的内存可用存储时期和作用范围来表征。 存储时期可以是静态的或自动的。 作用范围决定了哪一部分程序可以访问某个对象。 C+语言程序可以包含多个源文件,在编译时,逐一编译各文件,然后通过链接器链接所有的目标代码构成可执行文件。 名称空间允许定义一个可在其中声明标识符(名称)的命名区域,目的是减少名称冲突。,作用范围和存储类别,
展开阅读全文
相关资源
相关搜索

最新文档


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


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

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


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