第3章函数和函数模板3.1函数的声明和调用3.2函数的参数及其传递方式3.3深入讨论函数返回值3.4内联函数3.5变量的存储属性3.6函数重载3.7函数模版2020/2/15/4103.2.1传数值3.2.2传地址值3.2.3传引用方式3.2.4默认参数3.2.5使用const保护数据2020/2/15/411【例3.1】传数值不会改变原来值的例子1.#includeiostream2.#includestring3.usingnamespacestd;4.voidswap(string,string);//函数参数采用传数值方式5.voidmain()6.{7.stringstr1(现在),str2(过去);8.swap(str1,str2);//传数值9.cout返回后:str1=str1str2=str2endl;10.}11.voidswap(strings1,strings2)12.{13.stringtemp=s1;s1=s2;s2=temp;14.cout交换为:str1=s1str2=s2endl;15.}2020/2/15/4123.2.1传数值【例3.2】传地址值改变原来值的例子。1.#includeiostream2.#includestring3.usingnamespacestd;4.voidswap(string*,string*);//函数参数采用传地址值方式5.voidmain()6.{7.stringstr1(现在),str2(过去);8.swap(&str1,&str2);//传地址值9.cout返回后:str1=str1str2=str2endl;10.}11.voidswap(string*s1,string*s2)12.{13.stringtemp=*s1;*s1=*s2;*s2=temp;14.cout交换为:str1=*s1str2=*s2endl;15.}2020/2/15/4133.2.2传地址值【例3.3】传递数组名实例。1.#includeiostream2.usingnamespacestd;3.voidswap(int[]);//数组原型使用类型[]的形式4.voidmain()5.{6.inta[]={3,8};7.swap(a);//传递数组名8.cout返回后:a=a[0]b=a[1]endl;9.}10.voidswap(inta[])11.{12.inttemp=a[0];a[0]=a[1];a[1]=temp;13.cout交换为:a=a[0]b=a[1]endl;14.}2020/2/15/414【例3.4】通过传引用改变原来值的例子。1.#includeiostream2.#includestring3.usingnamespacestd;4.voidswap(string&,string&);//函数参数采用传引用方式5.voidmain()6.{7.stringstr1(现在),str2(过去);8.swap(str1,str2);//传引用9.cout返回后:str1=str1str2=str2endl;10.}11.voidswap(string&s1,string&s2)12.{13.stringtemp=s1;s1=s2;s2=temp;14.cout交换为:str1=s1str2=s2endl;15.}2020/2/15/4153.2.3传引用方式【例3.5】求10个学生成绩的平均值,并统计其中不及格的人数。•要求用一个函数实现,并返回这两个数据给调用函数,并且函数的形参使用引用来实现。61.#includeiostream2.usingnamespacestd;3.typedefdoublearray[12];4.voidavecount(array&b,intn)5.{6.doubleave(0);7.intcount(0);//累加器初始化08.for(intj=0;jn-2;j++)9.{10.ave=ave+b[j];11.if(b[j]60)count++;12.}13.b[n-2]=ave/(n-2);//填入平均成绩14.b[n-1]=count;//填入不及格人数15.}16.voidmain()17.{18.arrayb={12,34,56,78,90,98,76,85,64,43};19.array&a=b;20.avecount(a,12);//调用函数计算统计21.cout平均成绩为a[10]分,不及格人数有22.int(a[11])人。endl;23.}【例3.6】设计一个根据参数数量输出信息的函数。1.#includeiostream2.#includestring3.usingnamespacestd;4.voidDisplay(strings1,strings2=,strings3=);5.voidmain()6.{7.stringstr1(现在),str2(过去),str3(将来);8.Display(str1);9.Display(str1,str2,str3);10.Display(str3,str1);11.Display(str2,str3);12.}13.voidDisplay(strings1,strings2,strings3)14.{15.if(s2==&&s3==)16.couts1endl;17.elseif(s3==&&s2!=)18.couts1、s2endl;19.else20.couts1、s2、s3endl;21.}2020/2/15/4173.2.4默认参数【例3.7】不允许改变作为参数传递的字符串内容的实例1.#includeiostream2.#includestring3.usingnamespacestd;4.voidchange(conststring&);5.voidmain()6.{7.stringstr(Canyouchangeit?);8.change(str);9.coutstrendl;10.}11.voidchange(conststring&s)12.{13.strings2=s+No!;14.couts2endl;15.}2020/2/15/4183.2.5使用const保护数据•用const修饰传递参数,意思是通知函数,它只能使用参数而无权修改它。•这主要是为了提高系统的自身安全。•C++中普遍采用这种方法。2020/2/15/4193.3深入讨论函数返回值一、函数的结构1.函数头:是函数的第一行,3部分组成:①返回值的类型②函数名③函数的形参及其类型例如:doublepower(doublex,intn)2.函数体:位于花括号之间,包含函数的可执行代码。完成函数的功能。四、函数的定义•函数是面向对象程序设计中,对功能的抽象•函数定义的语法形式1.类型标识符函数名(形式参数表)2.{3.语句序列4.}2020/2/15/4110若无返回值,写void①若无参数,写void②是被初始化的内部变量,寿命和可见性仅限于函数内部五、返回语句•函数的返回值由return语句给出,例如:return0;无返回值的函数(void类型),可以不写return语句。六、return语句•通式:returnexpression;•功能:使程序控制从被调用函数回到调用函数中,同时把返回值带给调用函数。•注意:①expression的结果是函数头中的returnType返回值类型;②可以是任意表达式,函数调用;③returnType为viod时,则无expression。•常用3种格式:①return(表达式);②return表达式;③return;2020/2/15/4111return语句特点•函数中可有多个return语句,但只要遇到一个return就返回调用函数处。①return语句只能返回一个值。②若函数类型与return语句中表达式的类型不一致,以“函数类型”为准,进行自动转换,即函数调用转换。•函数中有return语句,但不返回值,只起返回作用。•函数中无return语句,遇到“}”时,返回到调用函数处。例2函数中有多个return语句2020/2/15/4112例3函数类型与return返回值不一致2020/2/15/4113例4函数有return语句,但不返回值2020/2/15/4114三、函数的调用语句•函数调用格式:1.函数名();//无参函数2.函数名(参数表);//有参函数•函数调用方式:①函数语句方式prints();②函数表达式方式z=max(x,y)+3;③函数参数方式coutmax(x,y);z=max(max(a,b),max(c,d));2020/2/15/41153.3深入讨论函数返回值•3.4.1返回引用的函数•3.4.2返回指针的函数•3.5.3返回对象的函数•3.5.4函数返回值作为参数2020/2/15/4116【例3.8】返回引用的函数。1.#includeiostream2.usingnamespacestd;3.inta[]={2,4,6,8,10,12};//全局数组4.int&index(inti);//返回引用的函数原型声明5.voidmain()6.{7.index(3)=16;//将a[3]改为168.coutindex(3)endl;//输出169.}10.int&index(inti)//函数定义11.{12.returna[i];//返回指定下标的整数数组内容13.}2020/2/15/41173.4.1返回引用的函数数据类型&函数名(参数列表);3.4.2返回指针的函数类型标识符*函数名(参数列表);2020/2/15/4118•【例3.9】使用函数input输入一组数并返回一个指针,然后由主函数main将这组数显示出来的例子。2020/2/15/41192020/2/15/41203.5.3返回对象的函数stringinput(constint);//声明返回string类型的函数2020/2/15/41213.5.4函数返回值作为参数2020/2/15/41223.4内联函数inline•使用关键字inline说明的函数称内联函数。•在C++中,除具有循环语句、switch语句的函数不能说明为内联函数外(编译器会对这类错误给出警告信息),其他函数都可以说明为内联函数。•inlineintisnumber(charc)•C++编译器在遇到对函数isnumber调用的地方都用这个函数体替换该调用表达式。2020/2/15/41232020/2/15/4124一、编程:1.课本P55-59:例3.7-3.122020/2/15/4125要求:(程序写好后保存在word中,提交教师机)2020/2/15/4126•下面是一个输入半径,输出其面积和周长的C++程序,在下划线处填上正确的语句。