您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > c++程序设计第三章函数和函数模板
第三章函数和函数模板在面向对象程序设计中,成员函数也是函数,所以本节关于函数的讨论,也适合类的成员函数。正确设计函数原型和参数类型,不仅能保证函数的真确性,而且能提高程序设计的效率。本章除了介绍选择函数参数和函数返回值等问题之外,还将讨论内联函数、函数重载和函数模板等内容。3.1函数的参数及其传递方式C++中函数的参数有两种传递方式:传值和传引用。传引用就是传对象的地址,所以也称传地址方式。一、对象做函数参数将对象作为函数参数,是将实参对象的值传递给形参对象,形参拥有实参的备份。这种传递是单向的。当在函数中改变形参的值时,改变的是这个备份中的值,不会影响原来实参的值。例题:分析以下程序的结果(lt3_1.cpp)#includeiostream#includestring#includealgorithmusingnamespacestd;voidstrsort(string);voidmain(){strings=China;cout原字符串为:sendl;strsort(s);cout变化后的字符串为:sendl;}voidstrsort(stringc){sort(c.begin(),c.end());}请分析以下程序的结果(lt3_1a.cpp)#includeiostream#includestringusingnamespacestd;voidstrswap(string,string);voidmain(){strings1=China,s2(beijing);cout原字符串为:s1:s1,s2:s2endl;strswap(s1,s2);cout交换后的字符串为:s1:s1,s2:s2endl;}voidstrswap(stringc1,stringc2){c1.swap(c2);}注:直接使用基本数据类型的对象,或使用类和结构的对象作为参数,均是传值方式。二、对象指针作为函数参数将指向对象的指针作为函数参数,形参是对象指针,实参是对象的地址值。因为实参和形参的地址相同,所以改变形参就是改变实参。请分析以下程序的结果(lt3_2.cpp)#includeiostream#includestringusingnamespacestd;voidstrswap(string,string);voidmain(){strings1=China,s2(beijing);cout原字符串为:s1:s1,s2:s2endl;strswap(s1,s2);cout交换后的字符串为:s1:s1,s2:s2endl;}voidstrswap(stringc1,stringc2){c1.swap(c2);}&&***()***实参是对象形参是对象实参是对象的地址值形参是对象指针例题:请分析以下程序的结果(lt3_3.cpp)#includeiostream#includestring#includealgorithmusingnamespacestd;voidstrsort(string*c,intn);voidmain(){strings[]={China,Beijing,Jinan};inti;cout原字符串为:endl;for(i=0;i3;i++)couts[i]endl;strsort(s,3);cout反转后的字符串为:endl;for(i=0;i3;i++)couts[i]endl;}voidstrsort(string*c,intn){for(inti=0;in;i++)reverse(c[i].begin(),c[i].end());}三、引用做函数参数当引用做函数参数时,在函数调用时,实参对象名传递给形参对象名,形参对象名就成为实参对象名的别名。此时,实参对象和形参对性爱那个代表的是同一个对象,所以改变形参对象的值就是改变实参对象的值。实际上,在函数调用时,是把实参对象的地址传给形参对象,是形参对象的地址取得实参对象的地址,从而使形参对象和实参对象共享同一个单元。这就是地址传递方式。请分析以下程序的结果(lt3_4.cpp)#includeiostream#includestringusingnamespacestd;voidstrswap(string,string);voidmain(){strings1=China,s2(beijing);cout原字符串为:s1:s1,s2:s2endl;strswap(s1,s2);cout交换后的字符串为:s1:s1,s2:s2endl;}voidstrswap(stringc1,stringc2){c1.swap(c2);}对象做函数参数&&&&引用做函数参数#includeiostream#includestringusingnamespacestd;voidstrswap(string*,string*);voidmain(){strings1=China,s2(beijing);cout原字符串为:s1:s1,s2:s2endl;strswap(&s1,&s2);cout交换后的字符串为:s1:s1,s2:s2endl;}voidstrswap(string*c1,string*c2){(*c1).swap(*c2);}指针做函数参数四、默认参数默认参数可以多于1个,但必须放在参数序列的后部。在函数调用时,如果一个默认参数需要指明一个特定值,则在其之前的所有参数都必须赋值。因为系统是按从左到右的顺序将实参与形参结合,当实参的数目不足时,系统将按同样的顺序用声明中或定义中的默认值来补齐所缺少的参数。C++允许在定义函数时给其中的某个或某些形式参数指定默认值,这样,当发生函数调用时,如果省略了对应位置上的实参的值时,则在执行被调函数时,以该形参的默认值进行运算。当程序员需要传递特殊值时,必须显式地指明。默认参数一般在函数说明中提供。如果程序中既有函数的说明又有函数的定义时,则定义函数时不允许再定义参数的默认值。如果程序中只有函数的定义,而没有说明函数,则默认参数才可出现在函数定义中。#includeiostream#includestringusingnamespacestd;voiddisplay(intx,inty);voidmain(){inta=3,b=5;display(a,b);}voiddisplay(intx,inty){coutx,yendl;}display(a);display();=0=0错误练习:判断以下函数声明的正确与错误:f(intp1=1,intp2,intp3=3);f(intp1=1,intp2=2,intp3);f(intp1,intp2=2,intp3);f(intp1,intp2,intp3=3);f(intp1,intp2=2,intp3=3);√XXX√注:形参分布中默认参数应从右到左逐渐定义。也就是说默认参数必须放在参数序列的后部。练习:若有函数的声明如下:voidmal(inta,intb=3,intc=5);判断以下函数调用的正误:mal(3,,9)mal(3);mal(3,5);mal(3,8,9);mal()√√√XX//请分析以下程序的运行结果(lt3_6.cpp)#includeiostream#includestringusingnamespacestd;voiddisplay(strings1,strings2=,strings3=);voidmain(){strings1(现在),s2(过去),s3(将来);display(s1);display(s1,s2,s3);display(s3,s1);display(s2,s3);}voiddisplay(strings1,strings2,strings3){if(s2==&&s3==)couts1endl;elseif(s3==&&s2!=)couts1、s2endl;elsecouts1、s2、s3endl;}五、用const保护数据用const修饰传递参数,意义在于通知函数,它只能使用参数而无权修改它。例题:请分析以下程序结果(lt3_7.cpp)#includeiostreamusingnamespacestd;voidchange(int&a,int&b);voidmain(){intx=2,y=5;coutx=x,y=yendl;change(x,y);coutx=x,y=yendl;}voidchange(int&a,int&b){b=b*b;}consta=a*a;consterrorC2166:l-valuespecifiesconstobject课本65页:改错题:3题编程题:2、4题作业课程回顾1.在函数调用时,如某一默认参数要指明一个特定值,则有()(2008.10)A.其之前所有参数都必须赋值B.其之后所有参数都必须赋值C.其前、后所有参数都必须赋值D.其前、后所有参数都不必赋值2.函数默认参数在函数原型中说明,默认参数必须放在参数序列的()(2009.1)A.前部B.中部C.后部D.两端AC3.2深入讨论函数返回值c++函数的返回值类型可以是除了数组和函数以外的任何类型。非void类型的函数必须向调用者返回一个值。当函数返回值是指针或者引用对象时,需要注意的是:函数返回值所指的对象必须继续存在,因此不能将函数内部的局部对象作为函数的返回值。一、返回引用的函数注:函数可以返回一个引用,将函数说明为返回一个引用的主要目的是为了将该函数用在赋值运算符的左边。除此之外,一个函数是不能直接作为被赋值的对象的。#includeiostream//lt3_8.cppusingnamespacestd;inta[]={0,1,2,3,4,5};int&index(inti);voidmain(){couta[3]endl;index(3)=16;couta[3]endl;}int&index(inti){returna[i];}全局的!#includeiostream//分析程序结果(lt3_8a.cpp)usingnamespacestd;classA{intx;public:A(inta=0){x=a;}voidset(inty){x=y;}int&f(){returnx;}voiddisp(){coutx:xendl;}};voidmain(){Aa;a.disp();a.set(1);a.disp();a.f()=2;a.disp();}通过返回引用的成员函数使用类的私有成员二、返回指针的函数函数的返回值可以是存储某种类型数据的内存地址,称这种函数为指针函数。定义的一般形式:类型标识符*函数名(参数列表)练习:定义一个input函数,该函数可以输入一组float型数据,并将头指针返回:float*input(int&n){}cout请输入数据的个数:;cinn;if(n=0)returnNULL;=newfloat[n];if(buf==0)returnNULL;for(inti=0;in;i++)cinbuf[i];return思考:如何开辟n个float型的空间,并将头指针赋值给变量buffloat*buf思考:如何通过键盘输入给这n个空间赋值?buf;cout请输入n个数据:endl;或者*(buf+i)思考:如何将头指针返回?float*input(int&n){cout请输入数据的个数:;cinn;if(n=0)returnNUL
本文标题:c++程序设计第三章函数和函数模板
链接地址:https://www.777doc.com/doc-3376732 .html