您好,欢迎访问三七文档
20.1.28陕西理工学院计算机系《C++程序设计》第1页第2章函数与引用2.1函数概述2.2函数重载2.3内联函数2.4具有默认参数值的函数2.5引用小结及练习题第2章函数与引用20.1.28陕西理工学院计算机系《C++程序设计》第2页教学目的•了解简单的C++程序的特点;•掌握函数重载;•掌握内联函数与一般函数的区别•了解参数特殊的函数•掌握引用,区分引用调用与值调用的区别.教学重点与难点本章重点:•函数重载;•内联函数;•参数特殊的函数•引用。本章难点:函数重载;内联函数与一般函数的区别;•引用调用与值调用的区别第2章函数与引用20.1.28陕西理工学院计算机系《C++程序设计》第3页2.1函数概述•C++语言程序的结构特点:–程序整体由一个或多个称为函数的程序块组成–每个函数都具有各自独立的功能和明显的界面2.1函数概述20.1.28陕西理工学院计算机系《C++程序设计》第4页问题1:函数是什么?–就是编写完成函数功能的程序块问题2:函数定义的一般格式?–函数值类型函数名(形式参数表)–{函数体}问题3:函数返回值类型?数值类型、指针类型、void类型2.1函数概述20.1.28陕西理工学院计算机系《C++程序设计》第5页2.2函数重载函数的重载又称函数名重载,是指同一个函数名可以有多个函数实现,或者说实现不同功能的函数可以具有相同的函数名。两个条件参数的个数不同参数的类型不同一组参数和返回值不同的函数共用一个函数名。2.2函数重载20.1.28陕西理工学院计算机系《C++程序设计》第6页当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用相应的函数。匹配过程如下:(1)如果有严格匹配的函数,就调用该函数;(2)参数内部转换后如果匹配,调用该函数;(3)通过用户定义的转换寻求匹配。2.2函数重载20.1.28陕西理工学院计算机系《C++程序设计》第7页例2-1:voidprint(double);voidprint(int);voidfunc(){print(1);print(1.0);print(double);print(3.1415f);pirnt(double);}2.2函数重载20.1.28陕西理工学院计算机系《C++程序设计》第8页例2-2利用参数类型的不同实现重载函数。#includeiostreamusingnamespacestd;intAbs(intx){cout调用函数Abs(int).'\n';returnx=0?x:-x;}doubleAbs(doublex){cout调用函数Abs(double).'\n';returnx=0?x:-x;}voidmain(){cout-20的绝对值是:Abs(-20)endl;cout-111.11的绝对值是:Abs(-111.11)endl;}2.2函数重载20.1.28陕西理工学院计算机系《C++程序设计》第9页intmax(inta,intb);intmax(inta,intb,intc);intmax(inta,intb,intc,intd);voidmain(){coutmax(3,5)endl;coutmax(-7,9,0)endl;coutmax(23,15,3,6)endl;}intmax(inta,intb){returnab?a:b;}intmax(inta,intb,intc){intt=max(a,b);returnmax(t,c);}intmax(inta,intb,intc,intd){intt1=max(a,b);intt2=max(c,d);returnmax(t1,t2);}例2-3利用参数个数不相同实现重载函数。2.2函数重载20.1.28陕西理工学院计算机系《C++程序设计》第10页定义重载函数需要注意以下两点:1)定义的重载函数必须具有不同的参数个数或不同的参数类型,只有这样编译系统才能根据不同的参数决定调用哪一个函数版本。2)仅仅是函数返回值不同并不能区分两个函数,因此不能根据函数的返回值定义函数的重载,否则会发生二义性的错误。例如:intsum(inta){…..}voidsum(inta){……}2.2函数重载20.1.28陕西理工学院计算机系《C++程序设计》第11页2.3内联函数将一个函数声明为内联函数时,只要在函数定义前加关键字inline即可,格式如下:inline类型函数名(《参数表》){…//函数体}编译系统对内联函数的处理与一般函数的处理方式不同,在编译调用内联函数的语句时,编译器将内联函数的代码插入到函数调用,这样在运行过程中,将直接运行插入的代码,而不需要花费实参入栈等一系列的开销,从而可以提高程序运行的速度。2.3内联函数20.1.28陕西理工学院计算机系《C++程序设计》第12页例2-4用内联函数计算立方体的体积inlinefloatCube(floata){returna*a*a;}#includeiostreamusingnamespacestd;voidmain(){cout输入立方体的边长:;floatside;cinside;cout边长为side的立方体的体积为:Cube(side)'\n';}问题:内联函数使用是否受限制?适用于简短函数,且在内联函数中不包含复杂的控制结构语句2.3内联函数20.1.28陕西理工学院计算机系《C++程序设计》第13页2.4具有默认参数值的函数定义:在函数定义和函数原型说明中,给函数的参数指定值。在定义具有默认参数值的函数时,要为参数指定一个值。比如:voidFun(intx=1,inty=2){…}在进行函数调用时,如果给出了实参值,则将实参传递给对应的形参;如果没有给出实参值,则利用指定的参数默认值进行调用。例子如下:2.4具有默认参数值的函数20.1.28陕西理工学院计算机系《C++程序设计》第14页参数默认是通过不同参数来分辨一个函数调用中的行为差异•例2-5具有默认参数值的延时函数。•#includeiostream•usingnamespacestd;•voidDelay(intn=1000)//A•{for(;n0;n--);}•voidmain(void)•{cout延时500个单位时间…\n;•Delay(500);//B•cout延时1000个单位时间…\n;•Delay();//C•}2.4具有默认参数值的函数20.1.28陕西理工学院计算机系《C++程序设计》第15页•默认参数规则函数参数默认值只能从后往前设置,例:voidfunc(inta=1,intb,intc=3,intd=4);voidfunc(inta,intb=1,intc=3,intd=4);调用时的实参按位置解析,默认参数也只能从后往前逐个替换尾部的“缺漏”,例:func(10,15,20,30);func(0);func(12,12);func(2,15,,20);注:既有函数声明又有函数定义时,默认参数值只能置身于声明中.2.4具有默认参数值的函数20.1.28陕西理工学院计算机系《C++程序设计》第16页例2-6设计一程序,输入圆柱体的半径和高度,求出圆柱体的体积。#definePI3.1415926floatV(floatr,floath=10);//Avoidmain(void){floatr,h;cout输入第一个圆柱体的半径和高度:;cinrh;cout第一个圆柱体的体积为:V(r,h)'\n';cout输入第二个圆柱体的半径:;cinr;cout第二个圆柱体的体积为:V(r)'\n';floatV(float=5,float=20);//Bcout第三个圆柱体的体积为:V()'\n';}floatV(floatr,floath){return(PI*r*r*h);}2.4具有默认参数值的函数20.1.28陕西理工学院计算机系《C++程序设计》第17页2.5引用2.5.1函数的原型说明与变量一样,函数的定义和使用也必须遵循先定义后使用的原则。如果函数的调用在函数的定义之前,就会出现编译错误。//intMax(intx,inty);intMax(intint);voidmain(){…….t=Max(a,b);t=Max(c,t);Print(t);}intMax(intx,inty){return(xy?x:y);}voidPrint(intx){cout三个数中最大的数为:xendl;}2.5引用20.1.28陕西理工学院计算机系《C++程序设计》第18页消除这种错误的方法的方法之一是在调用函数之前对该函数进行函数的原型说明。函数原型说明的一般格式为:《类型》函数名(形参表);或《类型》函数名(形参类型说明表);函数原型说明的目的是告诉编译程序,该函数的参数个数、各参数的类型和返回值类型,以便其后调用该函数时,编译程序对函数的参数的类型、个数、顺序及函数的返回值做有效性检查。函数原型说明可以出现在程序中的任何位置,只要在调用前即可,且对函数原型说明的次数没有限制。注意,函数的原型说明只是引用性说明,它以分号结束,没有函数体部分。而函数的定义则必须有函数体。2.5引用20.1.28陕西理工学院计算机系《C++程序设计》第19页•值传递(值调用)–在调用时仅将实参的值赋给形参,在函数中对形参值的任何修改都不会影响到实参的值。•好处:–减少了调用函数与被调用函数之间的数据依赖,增强了函数自身的独立性。•缺点:–被调用函数向调用函数传递的数据仅有一个返回值,有时显得不够用2.5.2函数的值调用2.5引用20.1.28陕西理工学院计算机系《C++程序设计》第20页例2-7值传递应用--两数交换#includeiostreamvoidswap(inta,intb);//voidswap(int&a,int&b);?voidmain(){intx,y;cinxy;cout实参x、y的原值为:x'\t'yendl;swap(x,y);cout“实参x、y经过交换后的值为:”x'\t'yendl;}voidswap(inta,intb)//voidswap(int&a,int&b)?{intt;cout形参a、b的原值为:a'\t'bendl;t=a;a=b;b=t;cout形参a、b经过交换后的值为:a'\t'bendl;}2.5引用20.1.28陕西理工学院计算机系《C++程序设计》第21页9797axby(a)交换前9779ybxa(b)交换后执行函数Swap(int,int)2.5引用20.1.28陕西理工学院计算机系《C++程序设计》第22页引用是另一个变量别名,或另一个变量的同义词,引用变量依附于另一个变量而定义。定义引用类型变量的一般格式为:类型&变量名1=变量名2;其中变量名1为引用类型的变量,而变量名2必须是已经定义过的且与引变量同类型的变量。2.5.3引用在定义一个引用变量时,编译系统并不会为其单独分配存储空间,因此必须对它进行初始化,将它与某个已定义的同类型的变量相关联。inti;int&r=i;2.5引用20.1.28陕西理工学院计算机系《C++程序设计》第23页例2-8引用类型变量的定义及使用voidfun(){inti=10;staticint&j=i;j++;coutj'\n';}voidmain(){floatk,&ref=k;k=100.0;cout&k:&k\t&ref:&ref'\n';coutk=k\tref=ref'\n';ref+=200;cou
本文标题:第2章 函数与引用
链接地址:https://www.777doc.com/doc-3357049 .html