函数章节
1. 为什么要用函数
首先了解一下函数:在面向对象程序设计中,函数是面对对象设计中对功能的抽象
函数的作用:
(1)方便调用,提高开发效率
(2)降低程序复杂度,简洁明了,便于理解程序结构
同样编写一个两整数相加的程序,可以这样(如下)
1 //a+b不用函数 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 int a, b; 7 cin >> a >> b; 8 cout << a + b; 9 return 0; 10 }
也可以这样(如下)
1 #include<iostream> 2 using namespace std; 3 int add1() 4 { 5 int a,b,c; 6 cin >> a >> b; 7 c =a + b; 8 cout << c; 9 return c; 10 } 11 int main() 12 { 13 add1(); 14 return 0; 15 }
但是对于代码稍长的程序(如图),在不使用函数的情况下根本不知所云
2. 为什么要用函数重载
(1)避免同名函数混淆
(2)不用为了对不同参数类型或参数个数而写多个函数,提高程序设计的效率
(3)使程序的结构更清楚,可以用多种实现去实现统一接口,更符合人类习惯
如
1 #include <iostream> 2 3 using namespace std; 4 5 void f(){ 6 cout<<"first"<<endl; 7 } 8 9 void f(int x){ 10 cout<<"second"<<endl; 11 } 12 13 void f(int x,int y){ 14 cout<<"third"<<endl; 15 } 16 17 void f(double x){ 18 cout<<"double"<<endl; 19 } 20 21 int main(){ 22 f(); 23 f(1); 24 f(1,2); 25 f(1.4); 26 return 0; 27 }
根据参数的不同来调用不同的同名函数
3.什么是值传递
值传递是指在调用函数时将实参复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实参
通俗来讲就是传递值只在接收的函数内变化,而不会影响到原函数内参数的值
如
1 #include<iostream> 2 using namespace std; 3 4 void swap1(int a, int b) 5 { 6 int t; 7 t = a; 8 a = b; 9 b = t; 10 } 11 12 int main() 13 { 14 int a, b; 15 cin >> a >> b; 16 swap1(a, b); 17 cout << a << b; 18 return 0; 19 }
可以预见,由于值传递的特性,该程序输出的a,b值并不会改变
4.什么是地址传递
地址传递是指将实参的地址传给函数,因此可以在函数内修改实参的值
我们把上面的代码再修改一遍
1 #include<iostream> 2 using namespace std; 3 4 void swap1(int &a, int& b)//修改行 5 { 6 int t; 7 t = a; 8 a = b; 9 b = t; 10 } 11 12 int main() 13 { 14 int a, b; 15 cin >> a >> b; 16 swap1(a, b); 17 cout << a << b; 18 return 0; 19 }
现在程序可以输出交换后的结果
5.递归函数
递归函数的一个重要特征是直接或间接调用函数本身,但是对于一般人的思维是较难理解的,我们先暂时记住这一特征
另外,课堂上老师讲的河内塔的递归实现方式,即是先从n开始,再对n-1执行操作,让我们不免联想到数学归纳法
那么我们不妨假设:
- 当n=0, 1的时候, 结果正确.
- 假设函数对于n是正确的, 函数对n-1结果也正确.
这样就可以一定程度上避开迭代的思维。
以斐波那契数列为例,我们可以这样写出递归函数:
1 int F(int n) 2 { 3 if(n==1||n==2) 4 { 5 return 1; 6 } 7 else 8 { 9 return Fibon(n-1)+Fibon(n-2); 10 } 11 }
if……else……语句即是利用了1、2假设的结论