1.为什么要用函数?
当我们在设计程序时,对于某一功能需要用到很多次,此时若我们在代码块中反复写相同的代码,不仅会浪费空间,更会造成代码的不美观,外来者来读我们 设计的程序时也会造成困扰。为此,函数的简便之处就体现出来了。2.为什么要用函数重载
首先,我们来理解一下重载函数的概念:两个以上的函数,具有相同的函数名,但是形参的个数或类型不同,编译器根据实参和形参的类型及个数的最佳匹 配,自动确定调用哪一个函数,这就是函数的重载。 下面我们来举例,进一步加深我们对函数重载的理解: <div class="code">
<pre><code><strong>
include<iostream>
using namespace std;
int SUM(int x,int y)
{
int sum;
sum=x+y;
return sum;
}
float SUM(float x,float y)
{
float sum;
sum=x+y;
return sum;
}
int main()
{
int a=1,b=2;
float A=1.22,B=2.21;
printf("%d
",SUM(a,b));
printf("%.3f
",SUM(A,B));
return 0;
}
运行结果:
3
3.430
3.430
从这个例子中我们就可以发现函数名相同的这两个函数在被调用时没有报错,并且调用的结果也是我们所期待的,那就说明使用重载函数就可以解决因数据类型不同而重新构造函数名的麻烦了。
3.什么是值传递?
值传递的定义:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。 下面我们同样来举一个例子来加深我们对于 值传递的理解:
#include<iostream>
using namespace std;
int swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
cout<<x<<" "<<y<<endl;
return 0;
}
int main()
{
int a=1,b=2;
swap(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
运行结果为:
2 1
1 2
1 2
从这里就可以看出,值传递只能将值在函数体内部进行交换,交换结果并不能影响函数体外部的值。所以当我们需要设计函数交换参数的值时,值传递是不可取的。
4.什么是地址传递?
那我们先来看一个具体的例子:
#include<iostream>
using namespace std;
int swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
printf("%d %d
",*a,*b);
return 0;
}
int main()
{
int x=1,y=2;
swap(&x,&y);
printf("%d %d
",x,y);
return 0;
}
输出结果为:
2 1
2 1
2 1
那上面这个例子不仅将函数体内部的值交换了,还将函数体外部的值也交换了。因为虽然函数传入的值是复制,那么我们来看看这个复制到底是什么。这个复制是一指向原本变量的指针,而我们利用这个指针可以间接访问我们需要交换的原本的变量。然后我们将原本变量交换,后面再使用*p1和*p2访问这个两个变量,其实p1和p2的地址并没有变,而是所指向的内容发生了变化。
5.递归函数
下面是一个斐波拉契求和的实例:
#include<iostream>
using namespace std;
int FBLQ(int num)
{
if(num==0)
return 0;
else if(num==1)
return 1;
return (FBLQ(num-1)+FBLQ(num-2));
}
int main()
{
int x=7;
printf("%d
",FBLQ(x-1));
return 0;
}
斐波拉契数列:
0 1 1 2 3 5 8……
输出结果为:
8
根据斐波拉契数列的性质:数列某一项的值为前两项之和。由此可以设计出了此递归算法。此函数运行到菲波拉契数列的前两项时就终止执行。