函数是仅在调用时运行的代码块。可以将数据(称为参数)传递给函数。函数可以返回数据。函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。本文主要介绍C++ 函数。

1、定义函数(实现)

在C++中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数。

例如,

#include <iostream>
using namespace std;
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2) 
{
   /* 局部变量声明 */
   int result;
   if (num1 > num2)
      result = num1;
   else
      result = num2;
   return result; 
}
int main ()
{
   /* 局部变量定义 */
   int a = 100;
   int b = 200;
   int ret;
   /* 调用函数来获取最大值 */
   ret = max(a, b);
   cout << "Max value is : " << ret << endl;
   return 0;
}

注意:上面这样调用合法的,但如果调换sum函数和main函数的顺序,在标准的C编译器环境下是不合法的(不过在GCC编译器环境下只是一个警告)。

2、函数声明

如果想把函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数的前面进行函数的声明。

函数声明地格式:

返回值类型 函数名 (参数1, 参数2, ...)

例如,

#include <iostream>
using namespace std;
/* 函数声明 */
int max(int num1, int num2);
int main ()
{
   /* 局部变量定义 */
   int a = 100;
   int b = 200;
   int ret;
   /* 调用函数来获取最大值 */
   ret = max(a, b);
   cout << "Max value is : " << ret << endl;
   return 0;
}
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2) 
{
   /* 局部变量声明 */
   int result;
   if (num1 > num2)
      result = num1;
   else
      result = num2;
   return result; 
}

3、调用函数

函数调用的一般形式为:

函数名(实参列表);

调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。例如:

#include <iostream>
using namespace std;
/* 函数声明 */
int max(int num1, int num2);
int main ()
{
   /* 局部变量定义 */
   int a = 100;
   int b = 200;
   int ret;
   /* 调用函数来获取最大值 */
   ret = max(a, b);
   cout << "Max value is : " << ret << endl;
   return 0;
}
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2) 
{
   /* 局部变量声明 */
   int result;
   if (num1 > num2)
      result = num1;
   else
      result = num2;
   return result; 
}

4、函数参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有三种向函数传递参数的方式:

1)传值

#include <iostream>
using namespace std;
void myswap(int x, int y)
{
    int t;
    t=x;
    x=y;
    y=t;
}
int main()
{
    int a, b;
    cout << "请输入待交换的两个整数:";
    a=10,b=20;
    myswap(a,b);  //作为对比,直接交换两个整数,显然不行
    printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
    return 0;
}

2)传引用

#include <iostream>
using namespace std;
void myswap(int *p1, int *p2)
{
    int  t;
    t=*p1;
    *p1=*p2;
    *p2=t;
}
int main()
{
    int a, b;
    cout << "请输入待交换的两个整数:";
    a=10,b=20;
    myswap(&a,&b);  //交换两个整数的地址
    printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
    return 0;
}

5、函数参数的默认值

定义一个函数,可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。

这是通过在函数定义中使用赋值运算符来为参数赋值的。调用函数时,如果未传递参数的值,则会使用默认值,如果指定了值,则会忽略默认值,使用传递的值。

例如,

#include <iostream>
using namespace std;
int sum(int a, int b=20)
{
  int result;
  result = a + b;
  return (result);
}
int main ()
{
   // 局部变量声明
   int a = 100;
   int b = 200;
   int result;
   // 调用函数来添加值
   result = sum(a, b);
   cout << " result =" << result << endl;
   // 再次调用函数
   result = sum(a);
   cout << " result = " << result << endl;
   return 0;
}

6、函数递归

一个函数在它的函数体内,直接或者间接地调用了他本身。

例如,

问第五个学生,说他比第四个学生大两岁

第四个学生说他比第三个学生大两岁

第三个学生说他比第二个学生大两岁

第二个学生说他比第一个学生大两岁

第一个说他10岁

求第五个学生的年龄,可以使用如下解法:

#include <iostream>
using namespace std;
/*int Age (int n)
{
  int tmp;
  tmp=10;
  for(int i=1;i<n;i++)
  {
    tmp+=2;
  }
  return tmp;
}
*/
//递归法
int Age(int n)
{
  int x=0;
  if(n==1)      //是递归停止的条件,当n=1时停止递归调用
  {
     x=10;
  }
  else
  {
     x=Age(n-1)+2;//调用自身的Age函数
  }
  return x;
}
int main()
{
  cout << Age(5) << endl;
  return 0;
}

注意:函数的递归调用,就是函数本身调用自己。但是应用递归调用的时候,我们有必要设置一个条件,也就是if语句,目的是能够让这个函数停下来,否则程序将进入到死循环。

推荐文档