8. 函数进阶——编程世界的“函数魔法升级”
8.1 函数重载
概念 函数重载是指在同一个作用域内,可以定义多个同名的函数,但这些函数的参数列表必须不同(参数的个数、类型或顺序不同)。编译器会根据调用函数时提供的实参来自动选择合适的函数进行调用。
示例代码
#include <iostream> using namespace std; // 计算两个整数的和 int add(int a, int b) { return a + b; } // 计算三个整数的和 int add(int a, int b, int c) { return a + b + c; } // 计算两个双精度浮点数的和 double add(double a, double b) { return a + b; } int main() { int result1 = add(2, 3); int result2 = add(2, 3, 4); double result3 = add(2.5, 3.5); cout << "两个整数的和: " << result1 << endl; cout << "三个整数的和: " << result2 << endl; cout << "两个双精度浮点数的和: " << result3 << endl; return 0; }
在这个程序中,定义了三个同名的 add
函数,分别处理不同数量和类型的参数。在 main
函数中调用 add
函数时,编译器会根据实参的类型和数量自动选择合适的函数进行调用。
8.2 默认参数
概念 默认参数是指在函数定义时,为参数指定一个默认值。如果在调用函数时没有提供该参数的值,就会使用默认值。
示例代码
#include <iostream> using namespace std; // 带有默认参数的函数 void printInfo(string name, int age = 18) { cout << "姓名: " << name << ", 年龄: " << age << endl; } int main() { printInfo("张三", 20); printInfo("李四"); return 0; }
在这个程序中,printInfo
函数的第二个参数 age
有一个默认值 18。当调用 printInfo
函数时,如果提供了第二个参数的值,就使用该值;如果没有提供,就使用默认值 18。
8.3 递归函数
概念 递归函数是指在函数内部调用自身的函数。递归函数通常包含两个部分:递归终止条件和递归调用。递归终止条件用于结束递归,避免无限循环;递归调用则是在函数内部调用自身来解决规模更小的子问题。
示例代码:计算阶乘
#include <iostream> using namespace std; // 递归函数计算阶乘 int factorial(int n) { if (n == 0 || n == 1) { return 1; // 递归终止条件 } else { return n * factorial(n - 1); // 递归调用 } } int main() { int num = 5; int result = factorial(num); cout << num << " 的阶乘是: " << result << endl; return 0; }
在这个程序中,factorial
函数是一个递归函数。当 n
等于 0 或 1 时,满足递归终止条件,函数直接返回 1;否则,函数会调用自身来计算 n - 1
的阶乘,并将结果乘以 n
。
8.4 内联函数
概念 内联函数是一种特殊的函数,编译器会在调用内联函数的地方直接将函数体展开,而不是像普通函数那样进行函数调用。这样可以减少函数调用的开销,提高程序的执行效率。通常在函数定义前加上 inline
关键字来声明内联函数。
示例代码
#include <iostream> using namespace std; // 内联函数 inline int square(int x) { return x * x; } int main() { int num = 5; int result = square(num); cout << num << " 的平方是: " << result << endl; return 0; }
在这个程序中,square
函数被声明为内联函数。当在 main
函数中调用 square
函数时,编译器会直接将 square
函数的函数体展开,而不是进行函数调用。
8.5 函数指针
概念 函数指针是指向函数的指针变量。通过函数指针,我们可以像调用函数一样调用指针所指向的函数。函数指针的类型由函数的返回值类型和参数列表决定。
示例代码
#include <iostream> using namespace std; // 定义一个函数 int add(int a, int b) { return a + b; } int main() { // 定义一个函数指针 int (*p)(int, int); // 让函数指针指向 add 函数 p = add; int result = p(2, 3); cout << "两数之和: " << result << endl; return 0; }
在这个程序中,定义了一个函数 add
,然后定义了一个函数指针 p
,其类型为 int (*)(int, int)
,表示指向一个返回值为 int
,参数为两个 int
类型的函数。将函数指针 p
指向 add
函数后,就可以通过 p
来调用 add
函数。
8.6 课后小练习
- 编写一组重载函数,分别计算两个整数、两个浮点数、三个整数的最大值,并在
main
函数中调用这些函数进行测试。 - 编写一个递归函数,计算斐波那契数列的第
n
项,并在main
函数中调用该函数。
通过这部分的学习,你对函数有了更深入的理解,掌握了函数重载、默认参数、递归函数、内联函数和函数指针等高级特性,这些知识将帮助你编写更复杂、高效的程序。