一、为什么要用函数
函数编写好以后,可以被重复使用,使用时可以只关心函数的功能和使用方法而不必关心函数功能的具体实现。
有利于代码重用,提高开发效率,增强程序的可靠性,也便于分工合作和修改维护。
例如以下程序:输入一个8位二进制,转化为十进制输出
#include <iostream> using namespace std; //计算x的n次方 double power(double x,int n) { double val=1.0; while (n--) val *= x; return val; } int main() { int value = 0; cout<<"Enter an 8 bit binary number: "; for(int i=7;i>=0;i--) { char ch; cin>>ch; if(ch=='1') value+=static_cast<int>(power(2,i)); } cout<<"Decimal value is "<<value<<endl; return 0; }
二、为什么要用函数重载
重载的定义:
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是函数的重载。
重载的好处:
函数的重载使得 C++ 程序员对完成类似功能的不同函数可以统一命名,减少了命名所花的心思。例如,可能会需要一个求两个整数的最大值的函数,也可能还要写一个求三个实数的最大值的函数,这两个函数的功能都是求最大值,那么就都命名为 Max 即可,不需要一个命名为 MaxOfTwoIntegers,另一个命名为 MaxOfThreeFloats。
【注意】重载函数的形参必须不同:个数不同或者类型不同。
例如:
int add(int x,int y); float add(float x,float y); //二者形参类型不同 int add(int x,int y); int add(int x,int y,int z); //二者形参个数不同
- 重载函数举例(编写两个名为sumOfSquare的重载函数,分别求两整数的平方和及两实数的平方和)
#include<iostream> using namespace std; int sumOfSquare(int a,int b) { return a*a+b*b; } double sumOfSquare(double a,double b) { return a*a+b*b; } int main() { int m,n; cout<<"Enter two integer:"; cin>>m>>n; cout<<"Their sum of square: "<<sumOfSquare(m,n)<<endl; double x,y; cout<<"Enter teo real number:"; cin>>x>>y; cout<<"Their sum of square: "<<sumOfSquare(x,y)<<endl; return 0; }
三、什么是值传递
- 值传递是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值的单项传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。
#include<iostream> using namespace std; void swap(int a,int b) { int t=a; a=b; b=t; } int main() { int x=5,y=10; cout<<"x= "<<x<<" y="<<y<<endl; swap(x,y); cout<<"x= "<<x<<" y="<<y<<endl; return 0; }
四、什么是地址传递
传入变量的地址,函数可以根据变量地址,访问变量,自然就能改变变量的值
- 如以下程序
#include<iostream> using namespace std; double add(double,double); double add2(double x,double y); double calculate(double x1,double y1,double(**f)(double,double)) { cout<<"add:"<<(*f[0])(x1,y1)<<endl; cout<<"add2:"<<(*f[1])(x1,y1)<<endl; return 1; } int main() { int x,y; double(*pf[2])(double,double)={add,add2}; x = 2;y = 1; calculate(x,y,pf); system("pause()"); return 0; } double add(double x,double y) { return x+y; } double add2(double x,double y) { return x-y; }
五、递归函数
函数可以直接或间接地调用自身,成为递归调用
递归有两个阶段
第一阶段:递推。
第二阶段:回归。
*实际应用:
> 用递归法计算从n个人中选择k个人组成一个委员会的不同组合数
#include<iostream> using namespace std; //计算从n个人里选k个人的组合数 int comm(int n,int k) { if(k>n) return 0; else if(n==k||k==0) return 1; else return comm(n-1,k)+comm(n-1,k-1); } int main() { int n,k; cout<<"Please enter two integers n and k: "; cin>>n>>k; cout<<"C(n,k)="<<comm(n,k)<<endl; return 0; }
- 汉诺塔问题
#include<iostream> using namespace std; //把src针的最上面一个盘子移动到dest针上 void move(char src,char dest) { cout<<src<<"-->"<<dest<<endl; } //把n个盘子从src针移动到dest针,以medium针作为中介 void hanoi(int n,char src,char medium,char dest) { if(n==1) move(src,dest); else { hanoi(n-1,src,dest,medium); move(src,dest); hanoi(n-1,medium,src,dest); } } int main() { int m; cout<<"Enter the number of diskes:"; cin>>m; cout<<"the steps to moving "<<m<<" diskes:"<<endl; hanoi(m,'A','B','C'); return 0; }