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; }