版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、会计学1c程序设计函数和函数模板程序设计函数和函数模板第一页,编辑于星期六:四点 二分。C+中函数的参数有两种传递方式:传值和传引用。传引用就是传对象的地址,所以也称传地址方式。一、对象做函数参数 将对象作为函数参数,是将实参对象的值传递给形参对象,形参拥有实参的备份。这种传递是单向的。 当在函数中改变形参的值时,改变的是这个备份中的值,不会影响原来实参的值。第1页/共55页第二页,编辑于星期六:四点 二分。例题:分析以下程序的结果(lt3_1.cpp)#include #include #include using namespace std;void strsort(string);voi
2、d main()string s=China;cout原字符串为:sendl;strsort(s);cout变化后的字符串为:sendl;void strsort(string c)sort(c.begin(),c.end();第2页/共55页第三页,编辑于星期六:四点 二分。请分析以下程序的结果(lt3_1a.cpp)#include #include using namespace std;void strswap(string,string);void main()string s1=China,s2(beijing);cout原字符串为:s1:s1,s2:s2endl;strswap(
3、s1,s2);cout交换后的字符串为:s1:s1,s2:s2endl;void strswap(string c1,string c2)c1.swap(c2);注:直接使用基本数据类型的对象,或使用类和结构的对象作为参数,均是传值方式。第3页/共55页第四页,编辑于星期六:四点 二分。 将指向对象的指针作为函数参数,形参是对象指针,实参是对象的地址值。 因为实参和形参的地址相同,所以改变形参就是改变实参。第4页/共55页第五页,编辑于星期六:四点 二分。请分析以下程序的结果(lt3_2.cpp)#include #include using namespace std;void strswa
4、p( string , string );void main()string s1=China,s2(beijing);cout原字符串为:s1:s1,s2:s2endl;strswap( s1, s2);cout交换后的字符串为:s1:s1,s2:s2endl;void strswap( string c1,string c2 )c1 .swap( c2);&*( )*实参是对象形参是对象实参是对象的地址值形参是对象指针第5页/共55页第六页,编辑于星期六:四点 二分。例题:请分析以下程序的结果(lt3_3.cpp)#include #include #include using n
5、amespace std;void strsort(string *c,int n);void main()string s=China,Beijing,Jinan;int i;cout原字符串为:endl;for(i=0;i3;i+) coutsiendl; strsort(s,3);cout反转后的字符串为:endl;for(i=0;i3;i+) coutsiendl;void strsort(string *c,int n)for(int i=0;in;i+)reverse(ci.begin(),ci.end();第6页/共55页第七页,编辑于星期六:四点 二分。 当引用做函数参数时,在
6、函数调用时,实参对象名传递给形参对象名,形参对象名就成为实参对象名的别名。此时,实参对象和形参对性爱那个代表的是同一个对象,所以改变形参对象的值就是改变实参对象的值。 实际上,在函数调用时,是把实参对象的地址传给形参对象,是形参对象的地址取得实参对象的地址,从而使形参对象和实参对象共享同一个单元。这就是地址传递方式。第7页/共55页第八页,编辑于星期六:四点 二分。请分析以下程序的结果(lt3_4.cpp)#include #include using namespace std;void strswap( string , string );void main()string s1=Chin
7、a,s2(beijing);cout原字符串为:s1:s1,s2:s2endl;strswap( s1, s2);cout交换后的字符串为:s1:s1,s2:s2endl;void strswap( string c1,string c2 )c1 .swap( c2);对象做函数参数&引用做函数参数#include #include using namespace std;void strswap(string *,string *);void main()string s1=China,s2(beijing);cout原字符串为:s1:s1,s2:s2endl;strswap(&am
8、p;s1,&s2);cout交换后的字符串为:s1:s1,s2:s2endl;void strswap(string *c1,string *c2)(*c1).swap(*c2);指针做函数参数第8页/共55页第九页,编辑于星期六:四点 二分。 默认参数可以多于1个,但必须放在参数序列的后部。在函数调用时,如果一个默认参数需要指明一个特定值,则在其之前的所有参数都必须赋值。因为系统是按从左到右的顺序将实参与形参结合,当实参的数目不足时,系统将按同样的顺序用声明中或定义中的默认值来补齐所缺少的参数。 C+允许在定义函数时给其中的某个或某些形式参数指定默认值,这样,当发生函数调用时,如果省
9、略了对应位置上的实参的值时,则在执行被调函数时,以该形参的默认值进行运算。当程序员需要传递特殊值时,必须显式地指明。 默认参数一般在函数说明中提供。如果程序中既有函数的说明又有函数的定义时,则定义函数时不允许再定义参数的默认值。如果程序中只有函数的定义,而没有说明函数,则默认参数才可出现在函数定义中。 第9页/共55页第十页,编辑于星期六:四点 二分。#include #include using namespace std;void display(int x ,int y );void main()int a=3,b=5;display(a,b);void display(int x,in
10、t y)coutx,yendl;display(a);display();=0=0错误第10页/共55页第十一页,编辑于星期六:四点 二分。练习:判断以下函数声明的正确与错误:f(int p1=1,int p2,int p3=3);f(int p1=1,int p2=2,int p3);f(int p1,int p2=2,int p3);f(int p1,int p2,int p3=3);f(int p1,int p2=2,int p3=3);XXX注:形参分布中默认参数应从右到左逐渐定义。也就是说默认参数必须放在参数序列的后部。第11页/共55页第十二页,编辑于星期六:四点 二分。练习:若有
11、函数的声明如下:void mal(int a, int b=3, int c=5); 判断以下函数调用的正误: mal(3, , 9) mal(3); mal(3, 5); mal(3, 8, 9 ); mal() XX第12页/共55页第十三页,编辑于星期六:四点 二分。/请分析以下程序的运行结果(lt3_6.cpp)#include #include using namespace std;void display(string s1,string s2=,string s3=);void main()string s1(现在),s2(过去),s3(将来);display(s1);disp
12、lay(s1,s2,s3);display(s3,s1);display(s2,s3);void display(string s1,string s2 ,string s3)if(s2=&s3=) couts1endl;else if(s3=& s2!=) couts1、s2endl;else couts1、s2、s3endl;第13页/共55页第十四页,编辑于星期六:四点 二分。 用const修饰传递参数,意义在于通知函数,它只能使用参数而无权修改它。第14页/共55页第十五页,编辑于星期六:四点 二分。例题:请分析以下程序结果(lt3_7.cpp)#include usi
13、ng namespace std;void change( int &a, int &b);void main() int x=2,y=5; coutx=x,y=yendl; change(x,y); coutx=x,y=yendl;void change( int &a,int &b) b=b*b;consta=a*a;consterror C2166: l-value specifies const object第15页/共55页第十六页,编辑于星期六:四点 二分。课本65页:改错题:3题编程题:2、4题第16页/共55页第十七页,编辑于星期六:四点 二分。
14、1在函数调用时,如某一默认参数要指明一个特定值,则有( )(2008.10)A其之前所有参数都必须赋值B其之后所有参数都必须赋值C其前、后所有参数都必须赋值D其前、后所有参数都不必赋值2.函数默认参数在函数原型中说明,默认参数必须放在参数序列的( )(2009.1)A.前部 B.中部 C.后部 D.两端AC第17页/共55页第十八页,编辑于星期六:四点 二分。 c+函数的返回值类型可以是除了数组和函数以外的任何类型。非void类型的函数必须向调用者返回一个值。 当函数返回值是指针或者引用对象时,需要注意的是:函数返回值所指的对象必须继续存在,因此不能将函数内部的局部对象作为函数的返回值。第18
15、页/共55页第十九页,编辑于星期六:四点 二分。 注:函数可以返回一个引用,将函数说明为返回一个引用的主要目的是为了将该函数用在赋值运算符的左边。除此之外,一个函数是不能直接作为被赋值的对象的。#include /lt3_8.cppusing namespace std;int a =0,1,2,3,4,5;int & index(int i);void main()couta3endl;index(3)=16;couta3endl;int &index(int i)return ai;全局的!第19页/共55页第二十页,编辑于星期六:四点 二分。#include /分析程序结
16、果(lt3_8a.cpp)using namespace std;class Aint x;public:A(int a=0)x=a;void set(int y)x=y;int &f()return x;void disp()coutx:xendl;void main()A a;a.disp();a.set(1);a.disp();a.f()=2;a.disp();通过返回引用的成员函数使用类的私有成员第20页/共55页第二十一页,编辑于星期六:四点 二分。 函数的返回值可以是存储某种类型数据的内存地址,称这种函数为指针函数。定义的一般形式:类型标识符 * 函数名(参数列表)第21页
17、/共55页第二十二页,编辑于星期六:四点 二分。练习:定义一个input函数,该函数可以输入一组float型数据,并将头指针返回:float *input(int &n)coutn;if(n=0)return NULL;=new floatn;if(buf=0)return NULL;for(int i=0;ibufi;return思考:如何开辟n个float型的空间,并将头指针赋值给变量buffloat *buf思考:如何通过键盘输入给这n个空间赋值?buf;cout请输入n个数据:endl;或者*(buf+i)思考:如何将头指针返回?第22页/共55页第二十三页,编辑于星期六:四点
18、 二分。float *input(int &n)coutn;if(n=0) return NULL;float *buf=new floatn;if(buf=0) return NULL;for(int i=0;ibufi;return buf;编写一个简单的程序,通过main函数验证input函数的正确性。#include using namespace std;void main()请写出input函数的原型int num;float *p;p=input(num);if( )p !=NULLfor(int i=0;inum;i+)coutpi ; delete p;float *
19、input(int &);第23页/共55页第二十四页,编辑于星期六:四点 二分。#include /lt3_10.cpp#include using namespace std;string input(int );void main()int n;coutn;string s=input(n);couts;string input(int n) string s1,s2;for(int i=0;is1;s2=s2+s1+ ;return s2;第24页/共55页第二十五页,编辑于星期六:四点 二分。/请分析以下程序的结果(lt3_11.cpp)#includeusing names
20、pace std;int max(int,int);void main()int x=2,y=8,z=5,m;m=(max(x,y),z);coutmb) return a; else return b;注:如果用函数返回值作为另一个函数的参数,这个返回值必须与参数的类型一致。第25页/共55页第二十六页,编辑于星期六:四点 二分。注意:(1)内联函数中不能出现循环、switch语句(2)内联函数一般短小,不宜过长,如果函数体语句过多,则会增加程序代码的大小,不宜说明为内联函数。(3) 应在调用之前声明或定义(4)在类体内定义的函数自动为内联函数。 如果程序中多次调用某个函数,将会大大降低使用
21、效率。为提高效率,通常将多次调用的函数说明为内联函数。 说明方式:在函数定义钱加inline关键字即表示该函数为内联函数 程序中的内联函数在程序编译时,将函数体替换至程序中函数调用位置,造成程序变长,效率提高。第26页/共55页第二十七页,编辑于星期六:四点 二分。/lt3_inline.cpp#includeusing namespace std; int max(int,int);void main()int x=2,y=3,m;m=max(x,y);coutmb) return a;else return b;inline第27页/共55页第二十八页,编辑于星期六:四点 二分。 函数重载
22、可以使一个函数名具有多种功能,即具有多种形态,称这种特性为 。多态性第28页/共55页第二十九页,编辑于星期六:四点 二分。#include using namespace std;int max(int,int);double max(double,double);char max(char,char);int max(int,int,int); void main()coutmax(5,8)endl;coutmax(3.6,5.8)endl;coutmax(a,A)endl;coutmax(12,65,78)b) return a; else return b;double max(dou
23、ble a,double b)if(ab) return a; else return b; char max(char a,char b)if(ab) return a; else return b;int max(int a,int b,int c)if(max(a,b)c) return max(a,b);else return c;由上可知,当函数的参数类型不同,或者参数个数不同时,函数可以重载。仅有函数返回值不同不能区分重载函数。第29页/共55页第三十页,编辑于星期六:四点 二分。/分析以下程序的结果(lt3_13a.cpp)#includeusing namespace std;
24、int add(int ,int);int add(int,int,int );void main()int a=3,b=5,c=6,sum;sum=add(a,b);coutsumendl;sum=add(a,b,c);coutsumb) return a; else return b;double max(double a,double b)if(ab) return a; else return b; char max(char a,char b)if(ab) return a; else return b;编制这些函数所提供的程序文本完全相同!比较这三个函数的异同!处理的数据类型不同!
25、第32页/共55页第三十三页,编辑于星期六:四点 二分。T max(T a, T b)if(ab) return a; else return b;int max(int a,int b)if(ab) return a; else return b;double max(double a,double b)if(ab) return a; else return b; char max(char a, char b)if(ab) return a; else return b;如果把其中的类型名称抽象出来用一个符号(比如T)来表示,则有如下的抽象形式:函数模板TTT T T T T T T第3
26、3页/共55页第三十四页,编辑于星期六:四点 二分。 很多情况下,设计的函数可以处理多种数据类型,但是即使设计为函数重载也只是使用相同的函数名,函数仍然要分别定义。 函数模板之所以能以同样的程序代码对不同类型的数据进行处理,其关键是将所处理的数据类型声明为参数,即类型参数化。函数重载通常基于不同的数据类型实现类似的操作,而对不同数据类型的操作完全相同,用函数模板更为简洁方便。 函数模板是对一组函数的描述,它不是一个真实的函数,编译系统并不产生任何执行代码。当编译系统在程序中发现有与函数模板中相匹配的函数调用时,便生成一个重载函数,该重载函数的函数体与函数模板的函数体相同,该重载函数就是模板函数
27、。第34页/共55页第三十五页,编辑于星期六:四点 二分。一般格式:template 类型形参表返回类型 函数名(形参表) 函数体例如:T max(T a, T b)if(ab) return a; else return b;注:“类型形参表”可以包含基本数据类型,也可以包含类类型。类型形参需要加前缀class或者typename。如果类型形参多于一个,则每个类型形参都需要使用class或者typename。template 模版以template关键字和一个形参表开头。第35页/共55页第三十六页,编辑于星期六:四点 二分。编写函数模板的一般方式如下:(1)定义一个普通的函数,数据类型采用
28、具体的普通的数据类型。如求两个整数中的较大者:int max(int a,int b)if(ab) return a; else return b;(2)将数据类型参数化,将其中具体的数据类型名(如int)全部替换成由自己定义的抽象的类型参数名(如T),T max(T a,T b)if(ab) return a; else return b;(3)在函数头钱用关键字template引出对类型参数名的声明。这样就把一个具体的函数改造成了一个通用的函数模板。T max(T a,T b)if(ab) return a; else return b;template 第36页/共55页第三十七页,编辑
29、于星期六:四点 二分。 模板(template)把函数或类要处理的数据类型参数化,表现为参数的多态性。模板用于表达逻辑结构相同,且具体数据元素类型不同的数据对象的通用行为,从而使得程序可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。C+提供了两种模板机制:函数模板和类模板(第七章)。 在声明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的类型形参,然后生成一个重载函数。该重载函数的定义体与函数模板中的函数定义体相同,称之为模板函数(template function)。 函数模板与模板函数的区别是:函数模板是一个模板,其中用
30、到通用类型参数,不能直接执行。模板函数是一个具体的函数,它由编译系统在遇到具体函数调用时所生成,具有程序代码,可以执行。第37页/共55页第三十八页,编辑于星期六:四点 二分。#include using namespace std;template T max(T a,T b)if(ab) return a;else return b;void main()int m1;double m2;char m3;m1=max(3,8);m2=max(3.6,12.5);m3=max(a,A);coutm1,m2,m3endl;在调用函数模板时,函数参数的类型决定到底使用模板的哪个版本。也就是说,模
31、板的参数是由有数的参数推断出来的。第38页/共55页第三十九页,编辑于星期六:四点 二分。 1.一个函数功能不太复杂,但要求被频繁调用,选用( )A.内联函数 B重载函数 C递归函数 D嵌套函数内2下列哪个类型函数不适合声明为内联函数( )A函数体语句较多 B函数体语句较少 C函数执行时间较短 D函数执行时间过长AA第39页/共55页第四十页,编辑于星期六:四点 二分。3.下列关于函数的重载说法正确的是( )(A)重载函数必须具有不同的返回值类型(B)重载函数形参个数必须不同(C)重载函数必须具有不同的形参列表(D)重载函数名可以不同C4.包含哪种语句的函数不能声明为内联函数( )A.循环B.
32、变量自增自减C.if.elseD.变量声明A第40页/共55页第四十一页,编辑于星期六:四点 二分。5int Func(int,int);不可与下列哪个函数构成重载( )(2008.10)Aint Func(int,int,int);Bdouble Func(int,int);Cdouble Func(double,double);Ddouble Func(int,double);B6.联函数的特点是( )A.减少代码量,加快访问速度 B.减少代码量,减缓访问速度C.增加代码量,减缓访问速度 D.增加代码量,加快访问速度C7.声明函数为内联函数时所使用的关键字为( ) A.const B.in
33、line C.short D.signedB第41页/共55页第四十二页,编辑于星期六:四点 二分。8.在下划线处填上缺少的部分。源程序如下(2009.1) #include using namespace std;_ T fun(T x) _y; y=x*x-T(5); return y; void main() float a=2; coutfun(a); template T第42页/共55页第四十三页,编辑于星期六:四点 二分。 函数模板是不能直接执行的,需要实例化为模板函数后才能执行。使用格式:模板函数名 (实参表)或者:模板函数名 (实参表)显式比较准则默认方式 当编译系统发现有一
34、个函数调用时,c+将根据“实参表”中的类型生成一个重载函数即模板函数。该模板函数的定义体与函数模板的函数定义体相同,而“形参表”的类型则以“实参表”的实际类型为依据。第43页/共55页第四十四页,编辑于星期六:四点 二分。如有函数模板如下:template T max(T a,T b)if(ab) return a;else return b;m1=max(3,8);m2=max(3.6,12.5);m3=max(a,A);m1=max(3,8);m2=max(3.6,12.5);m3=max(a,A);或者则对该函数模板的使用有:m4=max(a,A);m4=max(97,A);error:
35、template parameter T is ambiguousXm4=max(char(97),A);m4=max(97,int(A);注:要想省去显式调用的麻烦,条件是由这个调用的函数参数表能够惟一地去标识出模板参数的一个集合。第44页/共55页第四十五页,编辑于星期六:四点 二分。练习:利用函数模板设计一个求两个数之和的函数,并检验之。template T sum(T n1,T n2)return (n1+n2);void main()coutsum(3,5)endl;coutsum(3.3,9.9)b) return a;else return b;练习1:利用函数模板设计一个求两个
36、数中较大者的函数。练习2:利用函数模板设计一个求三个数中较大者的函数。template T max(T a,T b,T c) T m;if(ab) m= a;else m= b;if(cm) m=c;return m;第47页/共55页第四十八页,编辑于星期六:四点 二分。#include using namespace std;template T max(T a,T b)if(ab) return a;else return b;template T max(T a,T b,T c) T m;if(ab) m= a;else m= b;if(cm) m=c;return m;void ma
37、in() coutmax(5,6,8)endl; coutmax(6.8,12.5)endl;函数模板的重载第48页/共55页第四十九页,编辑于星期六:四点 二分。#include template T max(T x,T y)couty)?x:y;int max(int x,int y,int z=0)int m; couty)?x:y; else m=(xy)?x:y; return (mz)?m:z;char max(char x,char y)couty)?x:y;void main() coutmax(3,6)endl;coutmax(3,6,9)endl;coutmax(a,c)endl;coutmax(3.6,5.9)endl;第49页/共55页第五十页,编辑于星期六:四点 二分。练习1:利用函数模板
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河西成功学校2027届数学九上期末质量检测模拟试题含解析
- 小学三年级综合实践活动“爱惜粮食 从我做起”教学设计
- 小学三年级道德与法治教学设计《生活离不开规则》
- 高二英语听力教学设计:语篇重构与策略内化的单元实践
- 初中八年级德育活动课《校园火灾疏散实战演练》教案
- 初中语文七年级上册第9课从百草园到三味书屋创新教学设计
- 九年级语文《海燕》审美意象与革命精神融合教学设计
- 初中语文中考作文日记体模板教学设计
- 四年级数学(四则混合运算)计算题专项练习与答案
- 小学一年级音乐《小进行曲》体验式教学设计
- 2026年广东省广州市辅警人员招聘考试试卷(含答案及解析)
- 2026新版检验检测机构管理评审报告
- 实验室生物安全演练脚本
- 2026年西南电力设计院招聘考试指南及模拟题
- 2026年流感预防知识宣传测试题及答案
- 中英文产品研发项目合同协议
- 《内科学》名词解释
- 人教PEP版三年级英语上册第一单元Unit 1 Making friends 单元试卷(含答案含听力原文)
- 胎盘早剥教学课件
- 农业机械化智能化发展现状下的农业人才培养模式研究报告
- CJ/T 454-2014城镇供水水量计量仪表的配备和管理通则
评论
0/150
提交评论