您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第6章136过程封装-函数.
第6章过程封装--函数函数自己编写函数函数的使用数组作为参数带默认值的函数内联函数重载函数函数模版变量的作用域变量的存储类别递归函数基于递归的算法函数的用途函数是程序设计语言中最重要的部分,是模块化设计的主要工具。每一个C++程序都要用到函数。即使你自己不定义新的函数,在每一个完整的C++程序中都必须有一个main()函数。在C++语言中,字符处理、字符串处理和数学计算都是用函数的方式提供的。第6章过程封装--函数函数自己编写函数函数的使用数组作为参数带默认值的函数内联函数重载函数函数模版变量的作用域变量的存储类别递归函数基于递归的算法如何写一个函数函数定义函数的返回值:返回值类型应与定义中的类型标识符一致。C++的函数只能有一个返回值。表示一个函数没有返回值,类型标识符用void。没有返回值的函数也称为过程类型标识符函数名(形式参数表){变量定义部分语句部分}return返回值;或return(返回值);eg.intmax(inta,intb){if(ab)return(a)elsereturn(b);}函数体函数的命名函数名是一个标识符,符合标识符命名规范函数名要有意义函数名一般是一个动词短语,表示函数的行为函数举例—无参数、无返回值的函数打印一个由五行组成的三角形*************************voidprintstar(){cout“*\n”;cout“***\n”;cout“*****\n”;cout“********\n”;cout“**********\n”;}函数举例—有参数、无返回值的函数打印一个由n行组成的三角形voidprintstar(intnumOfLine){inti,j;for(i=1;i=numOfLine;++i){coutendl;for(j=1;j=numOfLine-i;++j)cout‘‘;for(j=1;j=2*i-1;++j)cout“*”;}}函数举例—无参数、有返回值的函数从终端获取一个1–10之间的整型数intgetInput(){intnum;while(true){cinnum;if(num=1&&num=10)returnnum;}}函数举例—有参数、有返回值的函数计算n!intp(intn){ints=1,i;if(n0)return(0);for(i=1;i=n;++i)s*=i;return(s);}函数举例—返回布尔量的函数判断某一年是否为润年的函数boolIsLeapYear(intyear){boolleapyear;leapyear=(((year%4==0)&&(year%100!=0))||(year%400==0);return(leapyear);}第6章过程封装--函数函数自己编写函数函数的使用数组作为参数带默认值的函数内联函数重载函数函数模版变量的作用域变量的存储类别递归函数基于递归的算法函数的声明所有函数在使用前必须被声明,以便让编译器知道用户的用法是否正确。函数声明包括下列内容:函数名函数的参数类型函数的返回类型函数的声明被称为函数的原型,它的形式为:返回类型函数名(参数表);参数表中的每个参数说明可以是类型,也可以是类型后面再接一个参数名。如:intmax(int,int);intmax(inta,intb);函数说明规则库函数在调用前需要#include相应的头文件。自定义的函数在调用时需要进行函数原型说明。函数原型说明与函数首部写法上需要保持一致,即函数类型、函数名、参数个数和参数顺序必须相同。如果被调函数的定义在主调函数之前,可以不必加声明。如果在所有函数定义之前,在函数外部已经做了函数声明,则在主调函数中无须再作声明。函数调用#includeiostream.hintmax(inta,intb);main(){intx,y;cinxy;coutmax(x+5,y-3);}intmax(inta,intb){if(ab)return(a);elsereturn(b);}函数原型说明函数调用函数实现函数调用#includeiostream.hintmax(inta,intb){if(ab)return(a);elsereturn(b);}main(){intx,y;cinxy;coutmax(x+5,y-3);}函数调用函数实现,无须函数声明建议用前一种方式!!函数调用函数调用形式函数名(实际参数表)eg.max(x,y);注意:形式参数和实际参数的个数、排列次序、类型要完全相同。实际参数可以是常量、变量、表达式,甚至是另一个函数调用传递方式:值传递值传递:函数获得了主调程序参数变量值的拷贝。被调程序可以改变这些拷贝,但这对主调程序的环境没有影响。函数调用调用方式1.作为语句:printstar();2.作为表达式的一部分如要计算5!+4!+7!x=p(5)+p(4)+p(7)3.作为函数的参数Printstar(p(5)+p(4)+p(7));函数执行过程在主程序中计算每个实际参数值用实际参数值初始化形式参数依次执行函数体的每个语句,直到遇见return语句或函数体结束计算return后面的表达式的值,用表达式的值构造一个临时变量回到调用函数,用临时变量置换函数调用,继续主程序的执行函数执行过程intp(int);intmax(inta,intb)main(){intx,y;cinxy;coutmax(x,y);}intp(intn){ints=1,i;if(n0)return(0);for(i=1;i=n;++i)s*=i;return(s);}intmax(inta,intb){intn1,n2;n1=p(a);n2=p(b);return(n1n2?n1:n2);}mainx(2)y(3)mainx(2)y(3)maxa(2)b(3)n1n2mainx(2)y(3)maxa(2)b(3)n1n2pn(2)simainx(2)y(3)maxa(2)b(3)n1(2)n2pn(3)simainx(2)y(3)maxa(2)b(3)n1(2)n2(6)mainx(2)y(3)第6章过程封装--函数函数自己编写函数函数的使用数组作为参数带默认值的函数内联函数重载函数函数模板变量的作用域变量的存储类别递归函数基于递归的算法数组作为函数的参数设计一函数,统计10位同学的平均成绩设计考虑:如何传递参数参数是10位同学的考试成绩,可以用10个整型数来表示。所以有10个整型的形式参数一组同类数据可以用一个数组来描述,所以参数也可以是一个10个元素的整型数组第二种方法更加简练返回值是平均成绩统计函数的实现intaverage(intarray[10]){inti,sum=0;for(i=0;i10;++i)sum+=array[i];returnsum/10;}average函数的使用intmain(){inti,score[10];cout请输入10个成绩:endl;for(i=0;i10;i++)cinscore[i];cout平均成绩是:average(score)endl;return0;}注意:形式参数是数组,实际参数也是一个数组一个有趣的现象在函数average的return语句前增加一个对array[3]赋值的语句,如array[3]=90。在main函数的average函数调用后,即return语句前增加一个输出score[3]的语句结果是什么???你会发现输出的值90而不是80。数组参数的传递机制C++语言规定,数组名是数组的起始地址参数传递时,实际参数是数组名,形式参数也是数组名按照值传递,当用实际参数score调用函数average时,是用score初始化形式参数数组array。如score的首地址为1000,在函数中形参数组array的首地址也为1000。形式参数和实际参数是同一数组!!!数组作为函数的参数在函数中并没有定义新的数组对形式参数数组指定规模是没有意义的形式参数数组不需要指定大小,所以方括号中为空函数如何知道数组的规模?用另一个整型参数表示总结:数组传递需要两个参数,数组名和数组规模第6章过程封装--函数函数自己编写函数函数的使用数组作为参数带默认值的函数内联函数重载函数函数模版变量的作用域变量的存储类别递归函数基于递归的算法默认参数对于某些函数,程序往往会用一些固定的值去调用它.例如对于以某种数制输出整型数的函数print:voidprint(intvalue,intbase);在大多数情况下都是以十进制输出,因此base的值总是为10。C++在定义或声明函数时可以为函数的某个参数指定默认值。当调用函数时没有为它指定实际参数时,系统自动将默认值赋给形式参数。例如,可以将print函数声明为voidprint(intvalue,intbase=10);调用print(20)等价于print(20,10)带有默认参数的函数的使用C++在说明函数原型时,可以为一个或多个参数指定缺省值。调用此函数时,若缺省某一参数,C++自动以缺省值作为此参数的值。如:intspecial(intx=2,floaty=1.5)调用时可用:special(5,3.2)//x=5;y=3.2special(6)//x=6;y=1.5special()//x=2;y=1.5带有默认参数的函数—注意事项缺省参数无论有几个,都必须放在参数序列的最后,例如:IntSaveName(char*first,charsecond=“”,char*third=“”,char*fouth=“”);在函数调用时,若某个参数省略,则其后的参数皆应省略而取其缺省值带有默认参数的函数—注意事项对参数默认值的指定只有在函数声明处有意义。因为函数的默认值是提供给调用者使用的。在不同的源文件中,可以对函数的参数指定不同的默认值。例如对于上面的print函数,如果在某一个功能模块中输出的大多是十进制数,那么在此功能对应的源文件中可以指定base的默认值为10。如果在另一个功能最模块中经常要以二进制输出,那么在此功能模块对应的源文件中可以指定默认值是2。第6章过程封装--函数函数自己编写函数函数的使用数组作为参数带默认值的函数内联函数重载函数函数模版变量的作用域变量的存储类别递归函数基于递归的算法内联函数目的是为了提高执行效率。对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型)。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。在调用内联函数时,编译器直接用内联函数的代码替换函数调用,于是省去了函数调用的开销。内联函数内联函数的定义:在函数头部前加保留词inline#includeiostream.hinlinefloatcube(floats){returns*s*s;}intmain(){floatside;cinside;coutcube(side)endls;return0;}慎用内联函数内联以代码复制(膨胀)为代价,省去了函数调用的开销,提高函数的执行效率。如果相比于执行函数体内代码的时间,函数调用的开销可以忽略不计,那么效率的收获会很小。以下情况不宜用内联:如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。第6章过程封装--函数函数自己编写函数函数的使用数组作为参数带默认值的函数内联函数重载函数函数模版变量的作用域变量的存储类别递归函数基于递归的算法
本文标题:第6章136过程封装-函数.
链接地址:https://www.777doc.com/doc-2110893 .html