您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > C++程序设计――第三章函数和函数模板
第三章函数和函数模板一、函数的参数及其传递方式C++中函数的参数传递有两种方式:传值传引用也称传地址方式区分传地址值和传地址的区别(识记)传地址值是以对象指针作为参数传地址是使用对象引用作为参数在设计函数参数时,可以使用对象、对象指针对象引用作为参数。1、对象作为函数参数这种形式是将实参值的备份传递给形参。当在函数中改变形参的值时,改变的是这个备份的值,不会影响原来实参的值。这种方式可以防止被调用函数改变参数的原始值。例#includeiostream#includestringusingnamespacestd;voidswap(string,string);voidmain(){stringstr1(“现在”),str2(“过去”);swap(str1,str2);cout“str1=”str1“str2=”str2endl;}voidswap(strings1,strings2){stringt=s1;s1=s2;s2=t;}2、对象指针作为函数参数将指向对象的指针作为函数的参数,形参是对象指针,实参是对象的地址值。因为形参传递的是实参本身,所以当形参的值改变时,实参的值也发生改变。例#includeiostream#includestringusingnamespacestd;voidswap(string*,string*);voidmain(){stringstr1(“现在”),str2(“过去”);swap(&str1,&str2);cout“str1=”str1“str2=”str2endl;}voidswap(string*s1,string*s2){stringt=*s1;*s1=*s2;*s2=t;}传递数组名数组名就是数组的指针名,是数组的首地址。因此传递数组名实际传递的就是数组的首地址值。例#includeiostream#usingnamespacestd;voidswap(int*);voidmain(){inta[]={3,8};swap(a);couta[0]a[1]endl;}voidswap(int*b){intt=*(b+0);*(b+0)=*(b+1);*(b+1)=t;}例#includeiostream#usingnamespacestd;voidswap(inta[]);voidmain(){inta[]={3,8};swap(a);couta[0]a[1]endl;}voidswap(inta[]){intt=a[0];a[0]=a[1];a[1]=t;}3、引用作为函数的参数当引用作为函数的参数,这时函数并没有对形参初始化。在函数调用时,形参对象名就成为实参对象名的别名。例#includeiostream#includestringusingnamespacestd;voidswap(string&,string&);voidmain(){stringstr1(“现在”),str2(“过去”);swap(str1,str2);cout“str1=”str1“str2=”str2endl;}voidswap(string&s1,string&s2){stringt=s1;s1=s2;s2=t;}对象指针作为函数参数与引用作为函数参数对比引用对象不是一个独立的对象,不单独占用内存单元,而对象指针要另外开辟内存空间来存放地址,所以传引用必传指针好。思考并调试求8个学生成绩的平均值,并统计其中大于等于90分的人数,要求用一个子函数(被调用函数)实现该功能,并将所求得的两个结果返回给主函数(调用函数)。要求:数组a[10]中前八个元素初始化为八个成绩,后两个元素分别存放调用子函数求得的平均成绩和大于90分的人数,函数的形参为数组或指针来实现4、默认参数默认参数就是指不要求程序员设计该参数,而由编译器在需要时给该参数赋默认值。默认参数一般是在函数原型中声明的,默认参数可以多于一个,但必须放在参数列表的后面。例#includeiostream#includestringusingnamespacestd;voidDisplay(strings1,strings2=“”,strings3=“”);voidmain(){stringstr1(“现在”),str2(“过去”),str3(“将来”);Display(str1);Display(str1,str2,str3);Display(str3,str1);Display(str2,str3);}voidDisplay(strings1,strings2,strings3){couts1“,”s2“,”s3endl;}使用const保护数据使用const修饰传递参数,意思是通知函数只能使用该参数,而不能修改它例#includeiostream#includestringusingnamespacestd;voidchange(conststring&);voidmain(){stringstr(“Canyouchangeit?”);change(str);coutstrendl;}voidchange(conststring&s){strings2=s+”No!”couts2endl;}二、深入讨论函数的返回值C++中函数的返回值类型可以是除数组和函数之外的任何类型。返回引用的函数返回指针的函数返回对象的函数函数的返回值做为参数1、返回引用的函数函数可以返回一个引用,主要目的是为了将该函数用在赋值运算符的左边。函数原型的表示如下:数据类型&函数名(参数列表);例#includeiostreamusingnamespacestd;inta[]={2,4,6,8,10};int&index(int);voidmain(){index(3)=16;coutindex(3)endl;}int&index(inti){returna[i];}2、返回指针的函数函数的返回值可以是某种数据类型的地址(如变量的地址、数组的首地址以及指针变量的地址),称这种函数为指针函数。原型定义如下:数据类型*函数名(参数列表);例#includeiostreamusingnamespacestd;float*input(int&);voidmain(){intnum=0;float*data;data=intput(num);if(data){for(inti=0;inum;i++)coutdata[i]“”;}deletedata;}float*input(int&n){cout“inputnumber0:”;cinn;//设n为3float*buf=newfloat[n];if(buf==0)returnNull;for(inti=0;in;i++)cinbuf[i];//分别输入值589returnbuf;}思考程序运行结果?3、返回对象的函数例#includeiostream#includestringusingnamespacestd;stringinput(constint);voidmain(){intn;cout“inputn=”;cinn;//设n为3stringstr=input(n);coutstrendl;}stringinput(constintn){strings1,s2;for(inti=0;in;i++){cins1;s2=s2+s1+””;}//设输入s1的值分别为wodebanjireturns2;}思考程序运行结果?函数的返回值作为函数的参数如果用函数的返回值作为另一个函数的参数,这个返回值的类型必须与参数的类型一致。例#includeiostream#usingnamespacestd;intmax(int,int);voidmain(){coutmax(59,max(12,54))endl;}intmax(intm1,intm2){return(m1m2)?m1:m2;}练习习题3(四、编程题1,4)晚上实训课p245实训一验证四、编程题1,4课后统一封面实训报告实训一(一)实验名称(二)实验目的与要求(三)实验内容(四)源程序代码(五)调试结果(截图)要求编辑电子稿,上交打印稿(A4纸)。内联函数通过例题说明问题#includeiostreamusingnamespacestd;intisnumber(charc){return(c=‘0’&&c=‘9’)?1:0}voidmain(){charc;cinc;if(isnumber(c))cout“enteradigit”;elsecout“enteranon-digit”;}函数的重载例3.12注意点:仅有参数个数不同时不能实现函数的重载(默认参数的情况下说明了这一点)仅有函数返回值不同也是不能实现函数的重载参数的类型不同时可以实现函数重载直到程序运行时才能确定调用哪个函数成为动态联编编译器在编译时进行的调用函数成为静态联编函数模板当用实际的类型来实例化某个函数,就像按照模板来制造新的函数一样,称这个函数为函数模板将函数模板与某个具体数据类型连用,就产生了模板函数,称这个过程为函数模板实例化。函数模板定义格式例如1templateclassTTmax(Tx,Ty){函数体}其中class可以用typename代替例如2templateclassT1,classT2T1fun(T1a,T2b){T2d;…}用模板改写下面得程序#includeiostream#indcludecomplex#includestringusingnamespacestd;voidprinter(complexint);voidprinter(complexdouble);voidmain(){inti(0);complexintnum1(2,3);complexdoublenum2(3.5,4.5);printer(num1);printer(num2);}voidprinter(complexinta){couta.real()“+”a.imag()“i”;}voidprinter(complexdoubleb){coutb.real()“+”b.imag()“i”;}#includeiostream#indcludecomplexusingnamespacestd;templateclassTvoidprinter(complexTa){couta.real()“+”a.imag()“i”;}voidmain(){…}练习习题3(一~四(6))晚上实训课实训2验证四、编程题7完成实训报告
本文标题:C++程序设计――第三章函数和函数模板
链接地址:https://www.777doc.com/doc-3205139 .html