一.为什么要用函数

1.把大的编程任务用函数划分成若干个小任务,使程序流程结构化。
2.在需要使用同样算法的时候,避免了写大量重复的代码。

二.为什么要用函数重载

C++允许功能相近的函数在相同的作用域内以相同的函数名声明,从而形成重载,方便使用,便于记忆。
减少了函数名的数量与程序复杂性,提高用户使用体验
例:

//返回值不同
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);

注:编译器不以形参名与返回值作为区分重载函数的因素。不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。

三.什么是值传递

例:输入两个整数交换后输出

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);//a与b的值传给了x和y,对形参值的改变无法影响实参
    cout<<"x = "<<x<<"y = "<<y<<endl;
    return 0;
}

//结果为x=5 y=10

因为是值传递,所以此程序只能做到a,b的值进行交换,而x,y的交换失败。

四.什么是地址传递

例:

//修改上题中swap函数,程序运行成功

void swap(int &a,&int b)//此处更改为引用类型
{
    int t=a;
    a=b;
    b=t;
}

引用不占有独立的内存空间,只是别名,将实参变量与引用进行关联,从而使他们的数值可以传递。

5.如何编写递归函数

递归函数即函数的每次调用都要用到自身
例:使用递归编写斐波那契数列

#include<iostream>
using namespace std;

int F(int n)
{
    if (n < 0)
        return 0;
    if (n == 0 || n == 1)
        return n;
    else
        return F(n - 1) + F(n - 2);
}

int main()
{
    int n;
    cout << "input:";
    cin >> n;    
    cout << "F("<<n<<")="<<F(n) << endl;
}

但使用递归,程序运算量庞大,效率低,多数递归程序可以使用迭代代替。