1、面向对象程序设计第5章 函数长春理工大学计算机科学技术学院 陈纯毅第1页5.1 简单函数double power2(double x);void main()double x=2,y;y=power(x);double power2(double x)return x*x;长春理工大学计算机科学技术学院 陈纯毅第2页5.1 简单函数函数申明、函数调用、函数定义长春理工大学计算机科学技术学院 陈纯毅第3页5.1 简单函数函数申明函数调用前申明或者函数定义时申明void starline();double power2(double x);长春理工大学计算机科学技术学院 陈纯毅第4页5.1 简单函
2、数函数调用void main()double x=2,y;y=power(x);长春理工大学计算机科学技术学院 陈纯毅第5页5.1 简单函数函数定义double power2(double x)return x*x;长春理工大学计算机科学技术学院 陈纯毅第6页5.2 向函数传递参数(1)传递常量(2)传递变量 值传递 引用传递 地址传递长春理工大学计算机科学技术学院 陈纯毅第7页5.2 向函数传递参数(1)传递常量double power2(double x);void main()double y=power2(3);/参数3为常量长春理工大学计算机科学技术学院 陈纯毅第8页5.2 向函数传
3、递参数(1)值传递double power2(double x);void main()double x=3;double y=power2(x);/参数3为常量长春理工大学计算机科学技术学院 陈纯毅第9页5.2 向函数传递参数作为参数结构能够把结构变量看成内置变量在函数之间进行传递。长春理工大学计算机科学技术学院 陈纯毅第10页5.2 向函数传递参数(1)引用传递double power2(double&x);void main()double x=3;double y=power2(x);/double power2(double&x)return x*x;长春理工大学计算机科学技术学院
4、陈纯毅第11页5.2 向函数传递参数(1)地址传递double power2(double*x);void main()double x=3;double y=power2(&x);/double power2(double*x)return(*x)*(*x);长春理工大学计算机科学技术学院 陈纯毅第12页5.3 从函数返回值用return返回一个值能够返回一个结构变量,实现多值返回长春理工大学计算机科学技术学院 陈纯毅第13页5.3 从函数返回值struct Student char name8;int score;长春理工大学计算机科学技术学院 陈纯毅第14页5.3 从函数返回值Stude
5、nt giveMark(Student std)char nameZ4=Jim;for(int i=0;std.namei!=0&nameZi!=0;i+)if(std.namei!=nameZi)break;if(i=3)std.score=90;else std.score=80;return std;长春理工大学计算机科学技术学院 陈纯毅第15页5.3 从函数返回值int main()Student std=Jim,0;std=giveMark(std);coutstd.name,std.score;return 0;长春理工大学计算机科学技术学院 陈纯毅第16页5.3 从函数返回值in
6、t main()Student std=“Kate,0;std=giveMark(std);coutstd.name,std.score;return 0;长春理工大学计算机科学技术学院 陈纯毅第17页5.4 引用参数引用为变量提供一个别名,主要用于参数中参数传递。长春理工大学计算机科学技术学院 陈纯毅第18页5.4 引用参数#include using namespace std;int Increase(int d)d=d+1;return d;int main()int d=1;int b=Increase(d);coutb,d;return 0;长春理工大学计算机科学技术学院 陈纯毅第
7、19页5.4 引用参数#include using namespace std;int Increase(int&d)d=d+1;return d;int main()int d=1;int b=Increase(d);coutb,d;return 0;长春理工大学计算机科学技术学院 陈纯毅第20页5.5 重载函数传递数据种类决定了重载函数活动。(1)不一样参数个数(2)不一样参数种类长春理工大学计算机科学技术学院 陈纯毅第21页5.5 重载函数#include using namespace std;void repchar()for(int i=0;i3;i+)cout+;coutendl
8、;void repchar(char ch)for(int i=0;i3;i+)coutch;coutendl;void repchar(char ch,int n)for(int i=0;in;i+)coutch;coutendl;长春理工大学计算机科学技术学院 陈纯毅第22页5.5 重载函数int main()repchar();repchar(a);repchar(a+1,5);return 0;长春理工大学计算机科学技术学院 陈纯毅第23页5.5 重载函数int main()repchar();repchar(a);repchar(a+1,5);return 0;长春理工大学计算机科学
9、技术学院 陈纯毅第24页5.5 重载函数int divide(int a,int b)return a/b;double divide(double a,int b)return a/b;int main()coutdivide(3,2),divide(3.0,2);return 0;长春理工大学计算机科学技术学院 陈纯毅第25页5.5 重载函数int divide(int a,int b)return a/b;double divide(double a,int b)return a/b;int divide(double a,int b)return static_cast(a)/b;in
10、t main()coutdivide(3,2),divide(3.0,2);return 0;长春理工大学计算机科学技术学院 陈纯毅第26页5.6 递归int fun(int n)if(n=1)return 1;elsereturn n+fun(n-1);int main()coutfun(3);return 0;长春理工大学计算机科学技术学院 陈纯毅第27页5.6 递归fun(3)3+fun(2)3+2+fun(1)3+2+1长春理工大学计算机科学技术学院 陈纯毅第28页5.7 内联函数inline使用函数能节约内存空间,不过必须使用存放器保留指令、存放器恢复指令、返回请求调用指令等额外指令
11、调用,造成时间开销增加。内联函数可将函数体中代码直接嵌入到请求调用程序代码中,从而减小时间开销。长春理工大学计算机科学技术学院 陈纯毅第29页5.7 内联函数inline double area(double r)return 3.14*r*r;int main()coutarea(2);return 0;长春理工大学计算机科学技术学院 陈纯毅第30页5.7 int main()cout 3.14*2*2;return 0;长春理工大学计算机科学技术学院 陈纯毅第31页5.8 默认参数void repchar(char ch=*,int n=3)for(int i=0;in;i+)coutch
12、;coutendl;int main()repchar();repchar(a);repchar(b,5);return 0;长春理工大学计算机科学技术学院 陈纯毅第32页5.8 默认参数void fun(int x=3,char ch=a,double d=3.14)coutx,ch,d;fun(6);fun(6,b);fun(6,b,3.1);fun(b,3.1);fun(3.1);fun(6,3.1);长春理工大学计算机科学技术学院 陈纯毅第33页5.9 域解析运算符和存放类变量域解析运算符决定了程序哪个部分能够访问它。变量存放类决定了它生存期有多长。长春理工大学计算机科学技术学院 陈纯
13、毅第34页5.9 域解析运算符和存放类含有局部域解析运算符变量仅在块内可见。含有文件域解析运算符变量在整个文件中可见。含有automatic存放类型变量,在定义它函数生命周期内存在。含有static存放类型变量,在整个程序生命周期内存在。长春理工大学计算机科学技术学院 陈纯毅第35页5.9 域解析运算符和存放类(1)局部变量在函数中定义变量。定义变量时,默认使用automatic存放类型。实际上函数中automatic存放类型变量是在函数栈空间分配内存空间,当函数退出时,函数栈空间全部变量都被销毁。变量域解析运算符也称为可见性,描述了在程序中变量能够被访问位置。长春理工大学计算机科学技术学院
14、陈纯毅第36页5.9 域解析运算符和存放类void somefunc()int somevar;float othervar;somevar=10;othervar=11;netvar=12;/illegalvoid otherfun()int nextvar;somevar=10;/illegal othervar=1;/illegal nextvar=2;长春理工大学计算机科学技术学院 陈纯毅第37页5.9 域解析运算符和存放类变量初始化int a=1;长春理工大学计算机科学技术学院 陈纯毅第38页5.9 域解析运算符和存放类(2)全局变量全局变量定义在任何函数外部,其对某个文件中全部函数
15、含有可见性,它对全部在变量定义后函数都是可见。长春理工大学计算机科学技术学院 陈纯毅第39页5.9 域解析运算符和存放类char ch=a;void putChar()coutch;int main()coutinput a character:;getChar();coutnthe character is:;putChar();return 0;长春理工大学计算机科学技术学院 陈纯毅第40页5.9 域解析运算符和存放类定义全局变量int exvar=199;全局变量被初始化为199。int exvar;全局变量被默认初始化为0。长春理工大学计算机科学技术学院 陈纯毅第41页5.9 域解析运
16、算符和存放类(3)静态局部变量静态局部变量可见性和自动局部变量相同,但其生命期与全局变量相同,区分仅在当包含它函数第一次被调用时,它才开始存在。长春理工大学计算机科学技术学院 陈纯毅第42页5.9 域解析运算符和存放类(3)静态局部变量float getavg(float d)static float total=0;static int counter=0;counter+;total+=d;return total/counter;长春理工大学计算机科学技术学院 陈纯毅第43页5.9 域解析运算符和存放类int main()float avg;avg=getavg(3);coutavgen
17、dl;coutgetavg(5)endl;coutgetavg(8);return 0;长春理工大学计算机科学技术学院 陈纯毅第44页5.9 域解析运算符和存放类静态局部变量只在函数第一次调用时被初始化,在其后函数调用中不会被再次初始化。长春理工大学计算机科学技术学院 陈纯毅第45页5.9 域解析运算符和存放类存放类型page 145,表5-2.长春理工大学计算机科学技术学院 陈纯毅第46页5.10 经过引用返回(1)等号左方函数调用int x=0;int&setX()return x;int main()setX()=2;coutx;return 0;长春理工大学计算机科学技术学院 陈纯毅第
18、47页5.10 经过引用返回返回值类型函数能够被看成一个值来使用。返回引用类型函数能够被看成一个变量来使用。返回引用类型函数不能返回一个常量值。在返回引用类型函数中,不能将一个局部变量作为引用返回。长春理工大学计算机科学技术学院 陈纯毅第48页5.10 经过引用返回(2)常量类型函数参数void func(int&a,const int&b)a=a+b;int main()int a=2;int b=1;func(a,b);couta,b;return 0;长春理工大学计算机科学技术学院 陈纯毅第49页5.10 经过引用返回void func(int&a,const int&b)a=a+b;b=0;/?int main()int a=2;int b=1;func(a,b);couta,b;return 0;长春理工大学计算机科学技术学院 陈纯毅第50页