1.为什么要用函数?
- 函数的存在增强了程序的可读性。如果我们为每一个功能编写一个函数,那么根据函数名每个函数的功能就很清晰了。如果我们要修改某一个函数的功能,其他的函数也丝毫不会受到影响
- 函数能提高开发效率。在开发过程中,我们时常会用到一些具有相同功能的代码块,如果用将这些代码用函数封装起来,就只需编写一次,各处使用,使用函数的人不用关心函数内部是怎样实现的,只需要知道该函数的功能是什么,需要传入那些参数就行了,大大缩减了开发时间,提高了开发效率。
实例:
1 #include<iostream> 2 using namespace std; 4 int main(){ 5 int a = 3; 6 int b = 4; 7 int c = 5; 8 int d = 6; 9 if(a <= b){ 10 cout<<a<<endl; 11 }else{ 12 cout<<b<<endl; 13 } 14 if(c <= d){ 15 cout<<c<<endl; 16 }else{ 17 cout<<d<<endl; 18 } 19 return 0; 20 }
上面代码中我们发现
1 if(a <= b){ 2 10 cout<<a<<endl; 3 11 }else{ 4 12 cout<<b<<endl; 5 13 }
和
if(c <= d){ 15 cout<<c<<endl; 16 }else{ 17 cout<<d<<endl; 18 }
具有相似的功能,如果将其用函数封装起来,将会大大改善程序地可读性和可维护性
#include<iostream> using namespace std; void min(int a,int b); int main(){ int a = 3; int b = 4; int c = 5; int d = 6; min(a,b); min(c,d); return 0; } void min(int a, int b){ if(a <= b){ cout<<a<<endl; }else{ cout<<b<<endl; } }
2.为什么要用函数重载?
在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。
下面的实例中,同名函数 print() 被用于输出不同的数据类型:
实例:
#include<iostream> using namespace std; void min(int a,int b); void min(int a, double b); void min(double a,int b); int main(){ int a; int b; double c; min(a,b); min(a,c); min(c,a); return 0; } void min(int a, int b){ cout<<"调用min(int a,int b)方法"<<endl; } void min(int a,double b){ cout<<"调用min(int a,double b)方法"<<endl; } void min(double a,int b){ cout<<"调用min(double a,int b)方法"<<endl; }
得到结果如下:
可见函数重载对于不同的参数会有不同的处理,这样开发时就不用考虑给不同参数但功能相同的函数取不同的名字了
3.值传递和地址传递
值传递是指在传入参数的时候,函数得到的是变量的副本,对副本进行修改不会影响原来的数,这就像某人需要一份你电脑上的资料,你拷贝了一份给他,他无论在上面进行改动,都不会影响你自己的资料。而地址传递就不同了,它是把变量的内存地址给了函数,在函数里面改动,外部变量也会发生变化,这就对应你把你的电脑里面资料的的密码告诉了它,通过密码,它找到了资料,如果他进行了改动,那么实际上你的资料被改动了。
下面举个栗子:
#include<iostream> using namespace std; void swap(int a, int b); int main(){ int a = 3; int b = 4; swap(a,b); cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; return 0; } void swap(int a,int b){ int temp = a; a = b; b = temp; }
运行结果如下:
再看下面的代码:
#include<iostream> using namespace std; void swap(int* a, int* b); int main(){ int a = 3; int b = 4; swap(&a,&b); cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; return 0; } void swap(int* a,int* b){ int temp = *a; *a = *b; *b = temp; }
运行结果如下:
4.递归函数
递归指的是在函数的定义中使用函数自身的方法。
举个例子:
从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'"
语法格式如下:
void recursion() { statements; ... ... ... recursion(); /* 函数调用自身 */ ... ... ... } int main() { recursion(); }
流程图:
实例:
#include<iostream> using namespace std; int fab(int n); int main(){ int n = 10; cout<<fab(n); return 0; } int fab(int n){ if(n == 1 || n == 2) return 1; else return fab(n-1)+fab(n-2); }
结果如下:
如有错误,敬请指正