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