掌握函数的声明和定义

上传人:hs****ma 文档编号:569923788 上传时间:2024-07-31 格式:PPT 页数:46 大小:342KB
返回 下载 相关 举报
掌握函数的声明和定义_第1页
第1页 / 共46页
掌握函数的声明和定义_第2页
第2页 / 共46页
掌握函数的声明和定义_第3页
第3页 / 共46页
掌握函数的声明和定义_第4页
第4页 / 共46页
掌握函数的声明和定义_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《掌握函数的声明和定义》由会员分享,可在线阅读,更多相关《掌握函数的声明和定义(46页珍藏版)》请在金锄头文库上搜索。

1、第第4 4第章函数第章函数1. 掌握函数的声明和定义、函数的调用及函数的参数传递过程;2. 掌握关键字inline的含义与使用;3. 掌握递归函数的使用;4. 掌握函数重载的使用方法;5. 掌握函数模板的使用方法;6. 了解各类系统函数,掌握常用的系统函数的使用。学习目标 函数的声明函数是面向对象程序设计中的基本抽象单元,是对功能的抽象函数定义的语法形式类型标识符函数名(形式参数表)语句序列函数的声明与使用若无参数,写void是被初始化的内部变量,寿命和可见性仅限于函数内部若无返回值,写void. . 函数的定义和声明函数的定义和声明4.1.1 函数的定义函数的定义函数是一个命名的程序代码块,

2、是程序完成其操作的场所,是将功能重复的程序段抽象出来所形成一个独立的、可重复使用的功能模块。定义函数的一般格式为:定义函数的一般格式为:返回类型 函数名 (数据类型1 参数1, 数据类型2 参数2,. ) 语句序列;形参表F说明说明: :函数必须先定义才可以使用定义函数就是编写完成函数功能的程序块。. . 函数的定义和声明函数的定义和声明在函数的定义中: 返返回回类类型型为函数返回值的类型,可以是系统任一基本数据类型或用户已定义的一种数据类型,它是函数执行过程中通过return语句要求的返回值的类型,又称为该函函数数的的类类型型。当一个函数不需要通过return语句返回一个值时,称为无返回值函

3、数或无类型函数,此时需要使用void作为类型名。函函数数名名是用户为函数所起的名字,它是一个标识符,应符合C+标识符的一般命名规则,用户通过使用这个函数名和实参表可以调用该函数。形形式式参参数数表表可以包含任意多项(可以没有),当多于一项时,前后两个参数之间必须用逗号分开。 用花括号括起来的语句序列组成了函数体,即函数所完成的具体操作,函数体一般分为3部分:第1部分为定义部分,定义函数所需要的局部常量与局局部部变变量量;第2部分为函数的功能部分,完成函数的功能;第3部分为返回值部分,返回函数的结果。如果函数体中没有任何语句,该函数称作空函数。每个函数都是一个功能独立的模块,绝不允许在一个函数体

4、内定义另一个函数。. . 函数的定义和声明函数的定义和声明/*p4_1.cpp*函数的使用,对两个数取大*/#includeusingnamespacestd;int max(int x,int y)intz;z=(xy)?x:y;returnz;void main()inta,b;cinab;coutmax(a,b)endl;123456789101112131415161718运行结果运行结果运行结果运行结果:5 155 15 1515. . 函数的定义和声明函数的定义和声明在C+程序中,使用函数前首先需要对函数原型进行声明,告诉编译器函数的名称、类型和形式参数。在在C+中,函数原型声明原

5、则如下:中,函数原型声明原则如下: (1)如果函数定义在先,调用在后,调用前可以不必声明;如果函数定义在后,调用在先,调用前必须声明。 (2)在程序设计中,为了使程序设计的逻辑结构清晰,一般将主要的函数放在程序的起始位置声明,这样也起到了列函数目录的作用。在C+中,函数原型声明原则如下: (1) 如果函数定义在先,调用在后,调用前可以不必声明;如果函数定义在后,调用在先,调用前必须声明。 (2) 在程序设计中,为了使程序设计的逻辑结构清晰,一般将主要的函数放在程序的起始位置声明,这样也起到了列函数目录的作用。 声明函数原型的形式如下:声明函数原型的形式如下: 例如:例如: intmax(int

6、x,inty);intmax(int,int);.1.2 .1.2 函数原型的声明函数原型的声明 返回类型 函数名 (数据类型1 参数1, 数据类型2 参数2,. ); 加上参数名会使函数的加上参数名会使函数的功能和参数更清晰。功能和参数更清晰。 函数调用的一般形式为:各实际参数表中的实际参数应与形参表中的形参一一对应,即个数相等且对应参数的数据类型相同。函数调用是一个表达式,函数名连同括号是函数调用运算符。表达式的值就是被调函数的返回值,它的类型就是函数定义中指定的函数返回值的类型,即函数的类型。如果函数的返回值为void,说明该函数没有返回值。 例如: coutmax(a,b)endl;.

7、1.2 .1.2 函数原型的声明函数原型的声明 函数名 (参数1, 参数2,. ); 实际参数表F注意注意: : 主函数main()不需要进行原型语声明,也不允许任何函数调用它,它只由操作系统调用并返回操作系统。 当调用一个函数时,整个调用过程分为三步进行:第一步:函数调用; 将函数调用语句下一条语句的地址保存在一种称为“栈栈”的内存中空间中, 以便函数调用完后返回。将数据放到栈空间中的过程称为压栈压栈。 对实参表从后向前从后向前,依次计算出实参表达式的值,并将值压栈。 转跳到函数体处。 第二步:函数体执行,即逐条运行函数体中语句的过程。 如果函数中还定义了变量,将变量压栈。 将每一个形参以栈

8、中对应的实参值对应的实参值取代,执行函数的功能体。 将函数体中的变量、保存在栈中的实参值,依次从栈中取出,以释放栈 空间。从栈中取出数据称为出栈出栈,x出栈用pop(x)表示。第三步:返回,即返回到函数调用表达式的位置。 返回过程执行的是函数体中的return语句。4.2.2 4.2.2 函数调用的执行过程函数调用的执行过程 4.2.2 4.2.2 函数调用的执行过程函数调用的执行过程 以函数max()为例,演示函数调用的详细过程如图4-1所示4.2.3 4.2.3 函数参数的按值传递函数参数的按值传递 函数调用过程实际上执行了一个从参数传递-执行函数体-返回的过程。其中的函数参数传递过程的实

9、质是将实参值通过栈空间一将实参值通过栈空间一一传送给实参的过程一传送给实参的过程,这种把实参表达式的值传送给对应的形参变量传递方式称为“按值传递按值传递”。4.2.3 函数参数的按值传递函数参数的按值传递 /*p4_2.cpp*函数的传值调用,将两个数交换*/#includeusingnamespacestd;void swap(int a,int b)intt;t=a,a=b,b=t;void main()intx=7,y=11;coutx=xy=yendl;swap(x,y);coutafterswap:;coutx=xy=yendl;123456789101112131415161718

10、19函数定义函数定义传值调用传值调用 运行结果运行结果运行结果运行结果:x=7 y=11after swap: x=7 y=11 4.2.4 嵌套调用嵌套调用 /*p4_3.cpp*函数的嵌套调用,求三个数中最大数和最小数的差值*/#includeusingnamespacestd;int max(int x,int y,int z)intt;t=xy?x:y;return(tz?t:z);123456789101112函数定义函数定义 在一个函数中调用其它函数叫函函数数的的嵌嵌套套。C+中函数的定义是平行的,除了main()以外,都可以互相调用。函数不可以嵌套定义,但可以嵌套调用。比如函数1

11、调用了函数2,函数2再调用函数3,这便形成了函数的嵌套调用。int min(int x,int y,int z)intt;t=xy?x:y;return(tabc;coutMax-Min=dif(a,b,c)0) 递归可以分为直接递归调用和间接递归调用。 直接递归调用直接递归调用:是在调用函数的过程中又调用该函数本身;间接递归调用间接递归调用:是在调用f1()函数的过程中调用f2()函数,而f2()中 又需要调用f1()。4.2.4 递归调用递归调用 递归函数设计的一般形式是: 4.2.4 递归调用递归调用 函数类型 递归函数名f (参数x ) if(满足结束条件) 结果=初值; else 结

12、果=含f(x-1)的表达式; 返回结果; 递归方法是从结果出发,归纳出后一结果与前一结果直到初值为止存在的关系,要求通过分析得到:初值初值+ +递归函数递归函数,然后设计一个函数(递归函数),这个函数不断使用下一级值调用自身,直到结果已知处。 4. 2.4 2.4 递归调用递归调用 /*p4_4.cpp*函数的递归调用,求n!*/#includeusingnamespacestd;int fac(int n)intt;if(n=1)t=1;elset=n*fac(n-1);return(t);123456789101112131415递归函数定义递归函数定义4. 2.4 2.4 递归调用递归调

13、用 void main()constintmax_n=12;/int类型数能表示的n!的最大的nintn;coutn;if(n=1&n=max_n)coutFactorialofnis:fac(n)endl;elsecoutInvalidn.C), (2, A-B), (2, C-B), (3, A-C), (1, B-A), (2, B-C), (1,A-C)。 分析:分析: 将n个盘子从A柱移到C柱可分解为以下3步: 4.2.4 递归调用递归调用 4. 2.4 2.4 递归调用递归调用 /*p4_5.cpp*汉诺塔问题*/#includeusingnamespacestd;void mov

14、e(int n, char source, char target)cout(n,sourcetarget)endl;void hanoi(int n,char A,char B,char C)if(n=1)move(1,A,C);elsehanoi(n-1, A, C, B);move(n,A,C);hanoi(n-1, B, A, C);1234567891011121314151617181920递归函数定义递归函数定义4. 2.4 2.4 递归调用递归调用 void main()intnum;coutnum;hanoi(num,A,B,C);21222324252627递归函数调用递归

15、函数调用运行结果运行结果运行结果运行结果: Input the number of diskes33(1, A-C)(2, A-B)(2, C-B)(3, A-C)(1, B-A)(2, B-C)(1, A-C) 内联函数的定义形式如下: 4.3 4.3 内联函数内联函数 inline 函数类型 函数名 (形式参数表) 函数体; 内联函数:内联函数: 是通过在编译时将函数体代码插入到函数调用处,将调用函数的方式改为顺序执行方式来节省程序执行的时间开销,这一过程叫做内内联联函数的扩展函数的扩展。因此,内联函数实际上是一种用空间换时间的方案。 在内联函数扩展时也进行了实参与形参结合的过程:先将实参

16、名(而不是实参值),将函数体中的形参处处替换,然后搬到调用处。但从用户的角度看,调用内联函数和一般函数没有任何区别。 . .3 3 内联函数内联函数 /*p4_6.cpp*内联函数的使用*/#includeusingnamespacestd;inline double CirArea(double radius)return3.14*radius*radius;void main()doubler1(1.0),r2(2);coutCirArea(r1)endl;coutCirArea(r1+r2+4)endl;12345678910111213141516内联函数定义内联函数定义内联函数调用内

17、联函数调用运行结果运行结果运行结果运行结果:12479001600 4.3 4.3 内联函数内联函数 注意:如果仅在声明函数原型时加上关键字inlineinline,并不能达到内联效果。内 联 函 数 的 定 义 必 须 出 现 在 对 该 函 数 的 调 用 之 前 , 因 为 编 译 器 在 对函数调用语句进行替换时,必须事先知道替换该语句的代码是 什么。这也是仅在声明函数原型时加上关键字inline,并不能达到 内联效果的原因。 由于计算机的资源总是有限的,使用内联函数虽然节节省省了程序运行的时间开销,但却增增大大了代码占用内存的空间开销。因此在具体编程时应仔细地权衡时间开销与空间开销之

18、间的矛盾,以确定是否采用内联函数。 与处理register变量相似,是否对一个内联函数进行扩展完全由由编编译译器器自自行行决决定定。因此,说明一个内联函数只是请求而不是命令编译器对它进行扩展。事实上,如果将一个较复杂的函数定义为内联函数,大多数编译器会自动地将其作为普通函数处理。 例如: 4.4 4.4 带默认形参值的函数带默认形参值的函数 int sub(int x=8,int y=3)returnx-y;void main(void)sub(20,15);/传递给形参x,y的值分别为20和15sub(10);/传递给形参x,y的值分别为10和3sub();/传递给形参x,y的值分别为8和3

19、 C+语言允许在函数说明或函数定义中为形参预赋一个默认的值,这样的函数就叫做带带有有默默认认形形参参值值的的函函数数。在调用带有默认参数值的函数时,若为相应形参指定了实参,则形参将使用实参的值;否则,形参相使用其默认值默认值。这就大大地方便了函数的使用。 4.4 4.4 带默认形参值的函数带默认形参值的函数intf(inta,floatb=5.0,charc=.,intd=10);/正确intf(inta=1,floatb=5.0,charc=.,intd);/错误,d未给值intf(inta=1,floatb,charc=.,intd=10);/错误,b未给值 (1)(1) 若函数具有多个形

20、参,则缺省形参值必须自自右右向向左左连连续续地地定定义义,并且在一个缺省形参值的右边不能有未指定缺省值的参数。这是由于C+语言在函数调用时参数是自右至左入栈这一约定所决定的。 例如: 假如有如下声明:int f(int a,float b=5.0,char c=., int d=10);采用如下调用形式是错误的:f(8, , ,4); /语法错误(2)(2) 在调用一个函数时,如果省省去去了某个实参,则直直到到最最右右端端的的实实参参都都要要省省去去(当然,与它们对应的形参都要有缺省值)。 例如: 4.4 4.4 带默认形参值的函数带默认形参值的函数intsub(intx=8,inty=3);

21、/缺省形参值在函数原型中给出voidmain(void)sub(20,15);/20-15sub(10);/10-3sub();/8-3intsub(intx,inty)/缺省形参值没有在函数定义时给出returnx-y;(3)(3) 缺省形参值的说明必须出现在函数调用之之前前。这就是说,如果存在函数原型,则形参的缺省值应在函数原型中指定;否则在函数定义中指定。另外,若函数原型中已给出了形参的缺省值,则在函数定义中不不得得重重复复指指定定,即使所指定的缺省值完全相同也不行。 例如: 4.4 4.4 带默认形参值的函数带默认形参值的函数intf(inta,floatb,char,intd=10)

22、;intf(inta,floatb,charc=.,intd=10);/错误:企图再次定义缺省参数c和d(4)(4)在同一个作用域,一旦定义了缺省形参值,就不能再定义它。 例如: intf(inta=6,floatb=5.0,charc=.,intd=10);voidmain(void)intf(inta=3,floatb=2.0,charc=n,intd=20);coutf()endl;/f函数使用局部缺省参数值(5)(5) 如果几个函数说明出现在不同的作用域内,则允许分别为它们提供不同的缺省形参值。 例如: 4.4 4.4 带默认形参值的函数带默认形参值的函数/d参数的缺省值是函数调用。i

23、ntf(inta,floatb=5.0,charc=.,intd=sub(20,15); (6)(6) 对形参缺省值的指定可以是初始化表达式,甚至可以包含函数调用。 例如: intf(int,float=5.0,char=.,int=sub(20,15); (7)(7) 在函数原型给出了形参的缺省值时,形参名可以省略。 例如: 4.5 4.5 函数重载函数重载 intmax(int,int);intmax(int,int,int);floatmax(float,float);doublemax(double,double);函数重载:函数重载: 就是两个以上的函数,取相相同同的的函函数数名名,

24、但是形形参参的的个个数数和和类类型型不不同同,编译器根据实参和形参的类型及个数的最佳匹配最佳匹配,自动决定调用哪一个函数。 例如: /*p4_7.cpp*函数的重载*/#includeusingnamespacestd;int add(int x,int y) cout(int,int)t;returnx+y;double add(double x,double y)cout(double,double)t;returnx+y;int add(int x,double y)cout(int,double)t;returnint(x+y);1234567891011121314151617181

25、92021函数重载函数重载函数重载函数重载函数重载函数重载double add(double x,int y) cout(double,int)t;returnx+y;void main()coutadd(9,8)endl;coutadd(9.0,8.0)endl;coutadd(9,8.0)endl;coutadd(9.0,8)endl;212223242526272829303132函数重载函数重载运行结果运行结果运行结果运行结果: (int, int) 17(double,double) 17(int, double) 17(double, int) 17 重载函数的调用重载函数的调用4

26、.5 4.5 函数重载函数重载/ C+无法区分这两个函数。因为在没有确定函数调用是对哪一个重载的函数之前,/返回类型是不知道的。 int add(int i1,int i2); float add(int f1,int f2);F注意注意: :(1)(1) 各个重载函数的返回类型可以相同,也可以不同。但如果函数名相同、形参表也相同,仅仅是返回类型不同,则是非法非法的。在编译时会认为是语法错误。 /将char型转换成int型,然后与add(int,int)绑定。 add(A,A+0);/函数实参向(double,double)转换,然后与add(double,double)绑定。 add(flo

27、at(8),float(9);/实参类型为(long double, int),向低类型转化。 add(long double(8),9); (2)(2) 确定对重载函数的哪个函数进行调用的过程称为绑绑定定(binding)(binding), 绑定的优先次序为精确匹配、对实参的类型向高类型转换后的匹配、实参类型向低类型及相容类型转换后的匹配。4.5 4.5 函数重载函数重载 消除这种二义性的办法消除这种二义性的办法有: 添加重载函数定义,使调用获得精确匹配。如:增加定义add(long double,int) 将函数的实参进行强制类型的转换,使调用获得精确匹配。例如: 调用形式可改为add(

28、double(long double(8),9),但改为add(long double(8),long double(9)同样出现绑定二义性。绑定(匹配)二义性绑定(匹配)二义性 两个重载函数,编译器不知道进行哪种类型的转换,与哪个函数绑定与哪个函数绑定,这种现象就叫绑定(匹配)二义性绑定(匹配)二义性。F注意注意: :重载函数与带默认形参值的函数一起使用时,有可能引起二义性重载函数与带默认形参值的函数一起使用时,有可能引起二义性。例如:void add(int x, int y, int z=0); 当调用add(8,9)时,不知与add(int,int) 还是add(int,int,int

29、=0)绑定。消除这种二义性的办法是增加或减少实参个数。 4.6 4.6 函数模板函数模板 template 返回类型 函数名 (形参表) 函数体; 函数模板:函数模板: 可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。函数模板的定义形式为:函数模板的定义形式为: 模板参数表F意义:意义: 对于功能完全一样,只是参数类型不同函数,能写一段通用代码适用于多种不同的数据类型,会使代码的可重用性大大提高,从而提高软件的开发效率提高软件的开发效率。 4.6 4.6 函数模板函数模板/将add函数定义成了一个函数模板:templateTadd(Tx,Ty)returnx

30、+y;例如: F注意注意: :template关键字表示声明的是模板。中是模板的参数表,可以有一项或多项,其中的类型名称为参数化类型参数化类型,是一种抽 象类型或可变类型。class是类型关键字,也可以用typenametypename作为关键字。函数返回值类型可以是普通类型,也可以是模板参数表中指定的类型。模板参数表中的参数类型可以是普通类型。 4.6 4.6 函数模板函数模板说明:说明: 根据中给出的具体类型,用类似于函数调用实参与形参结合的方式,将模板参数表中的参数化类型一一一一实实例例化化成具体的类型, 函数中的参数化类型也一一实例化。 如果模板参数表中有形式参数,还需要用常量表达式常

31、量表达式去初始化。例如: 使用add(8, 9)将T add(T x, T y) 实例化成: double add(double, double) 使用sum 将T sum() 实例化成: int sum(), size获得初值100; 函函数数模模板板定义后,就可以用它生成各种具体的函数(称为模模板板函函数数)。在函数调用时,用函数模板生成模板函数实际上就是将模板参数表中的参数化类型根据实参实例化(具体化)成具体类型。这个过程称为模模板板的的实实例例化化。函数模板实例化分为显式实例化显式实例化与隐式实例化隐式实例化。 (1)(1) 显式实例化显式实例化 函数名 (实参表)4.6 4.6 函数

32、模板函数模板例如: 使用add( A,B) 将T add(T x, T y) 实例化成: char add(char, char)(2)(2) 隐式实例化隐式实例化: 隐式实例化的格式为函数调用式,实例化过程是在实参与形参结合时,用实参的类型实例化形参对应的参数化类型。 F注意注意: : 使用隐式实例化无法初始化模板参数表中的普通类型的形参普通类型的形参,如果模板参数表中使用普通类型参数,必须使用显式初始化显式初始化。4.6 4.6 函数模板函数模板/*p4_8.cpp*函数模板*/#includeusingnamespacestd;template T1 add(T1 x, T2 y)cou

33、t(sizeof(T1),sizeof(T2)t;returnx+y;void main()coutadd(9,8)endl;coutadd(9.0,8.0)endl;coutadd(9,8.0)endl;coutadd(9.0,8)endl;coutadd(A,A-0)endl;coutadd(longdouble(8),9)endl;123456789101112131415161718192021函数模板定义函数模板定义模板函数调用模板函数调用运行结果运行结果运行结果运行结果: (4, 4) 17(8, 8) 17(4, 8) 17(8, 4) 17(1, 4) R(8, 4) 17 4

34、.7 C+4.7 C+系统函数系统函数 C+不仅允许我们根据自己的需要定义函数,C+系统为我们提供了大量的标准库函数,这些函数原型在相应的头文件中,使用时要包含相应的头文件。 C+C+函数分类表函数分类表 分别求x的正弦值、余弦值、正切值;x为弧度数doublesin(doublex)doublecos(doublex)doubletan(doublex)lnx即logexlog10xdoublelog(doublex)doublelog10(doublex)x的y次幂e的x次幂double pow(double x, doubley)doubleexp(doublex)分别求整型数、长整型、

35、浮点数的绝对值intabs(inti)longlabs(longn)doublefabs(doublex)math.hcmath求x的平方根doublesqrt(doublex)数学C C式头文件式头文件C+C+头文件头文件功能简述功能简述 原型原型 类别类别 C C式头文件式头文件C+C+头文件头文件功能简述功能简述 原型原型 类别类别 将整数v按x进制转成字符串schar*itoa(intv,char*s,intx)time.hctime返回1970/1/1零点到目前的秒数time_ttime(time_t*timer)时间设 置 随 机 数 的 种 子产生0-RAND_MAX的随机数ra

36、nd(unsignedseed)intrand()stdlib.hiostream将字符串转化成整数intatoi(char*s)类型转换memory.hiostream将s指向的内存区域的c个字节拷贝到d指向的区域void*memcpy(void*d,void*s,intc)内存操作unsignedstrlen(char*str)unsignedstrlen(char*str)其它字符串字符stdlib.h iostream终止正在执行的程序 exit(int) string.hiostreamchar *strcpy(char *s1, char*s2)char*strcpy(char*s

37、1,char*s2)将c转换成小写、大写字母inttolower(intc),inttoupper(intc)ctype.hiostreamc是否是字母,c是否是数字intisalpha(intc),intisdigit(intc)math.hcmath分别求x的反正弦值、反余弦值、反正切值doubleasin(doublex)doubleacos(doublex)doubleatan(doublex)数学F注意注意: :在C+中,旧式的C风格的头文件去掉了后缀.h,加上了前缀C,如stdlib.h在C+中变成了Cstdlib。当使用了:#include using namespace std

38、; 时,许多头文件不需要包含了。在上面的表中,用 iostream表示不再需要包含相应的C+风格的头文件。 4.7 C+4.7 C+系统函数系统函数 4.7 C+4.7 C+系统函数系统函数/*p4_9.cpp*利用系统函数rand()随机产生学生成绩*/#includeusingnamespacestd;void main()intx,i(0);srand(124);/设置种子dox=rand();if(x=5&x=1000)x=(x/5)*5;coutx/10.0t;i+;while(i100);123456789101112131415161718192021随机函数随机函数【例【例4-

39、94-9】产生】产生100100个学生的某门功课的成绩,要求精确到个学生的某门功课的成绩,要求精确到0.50.5分。分。 解释解释解释解释: 第10行设置随机数种子,使用rand()产生随机数时,以种子为基准,种子相同,每次产生的随机数也相同。4.8 本章小结本章小结 函数是一个功能独立的具有名称的程序代码。在程序的其他地方通过使用函 数名与传递参数对函数进行调用。 一个函数只有先被声明或定义后,才能被调用。函数声明语句与函数定义中 的函数头基本相同,所不同的是:声明语句必须以分号结束,形参表中可以 为任意形参名或者不给出形参名。 函数调用过程包括通过栈内存保存返回地址传递参数、执行函数体、返

40、回三 个阶段。将实参的值传递给形参的这种传值调用方式不改变实参的值。 递归函数适用于以递归方式定义的概念。 带inline关键字定义的函数为内联函数,在编译时将函数体展开到所有调用 处。内联函数的好处是节省函数调用过程的开销。 函数名相同,但对应形参表不同的一组函数称为重载函数。参数表不同是指 参数个数不同或在个数相同的情况下至少有一个参数对应类型不同。 确定对重载函数中函数进行绑定的优先次序为精确匹配、对实参的类型向高 类型转换后的匹配、实参类型向低类型及相容类型转换后的匹配。 对重载函数绑定时可能产生二义性,重载函数与带默认形参值的函数一起使 用时,有可能引起二义性。 当既存在重载函数,又有函数模板,优先绑定重载函数,只有不能精确匹配 重载函数时,才实例化类模板。 内联函数的展开、重载函数的绑定、类模板的实例化与绑定均在编译时进行。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号