函数是一段可重复使用的代码块,用来执行特定的任务。它可以接收输入(参数),并返回输出(返回值)。函数有助于将程序分解为更小的、可管理的模块,提高代码的可读性、可维护性和可重用性。C++ 中,函数是代码的基本组织单元,用于实现特定的功能。C++ 提供了丰富的函数特性,包括函数重载、默认参数、内联函数、模板函数和递归等。本文主要介绍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语句,目的是能够让这个函数停下来,否则程序将进入到死循环。

7、内联函数

内联函数使用 inline 关键字定义,建议编译器在调用处展开代码,以减少函数调用的开销(特别适用于短小的函数)。

#include <iostream>
using namespace std;

inline int square(int x) {  // 定义内联函数
    return x * x;
}

int main() {
    cout << "Square(5): " << square(5) << endl;
    return 0;
}

8、函数模板

模板函数是 C++ 的泛型编程机制,可以编写适用于多种数据类型的通用函数。

#include <iostream>
using namespace std;

template <typename T>  // 定义模板
T add(T a, T b) {
    return a + b;
}

int main() {
    // 使用 int  类型
    cout << "Int add: " << add<int>(3, 4) << endl;   
    // 使用 double 类型
    cout << "Double add: " << add<double>(3.5, 4.5) << endl; 
    return 0;
}

9、Lambda 表达式

C++11 引入了 Lambda 表达式,可以在代码中定义匿名函数(无需函数名)。

#include <iostream>
using namespace std;

int main() {
    // 定义 Lambda 表达式
    auto add = [](int a, int b) -> int { return a + b; }; 
    cout << "Lambda add: " << add(3, 4) << endl;
    return 0;
}

推荐文档