目录
一、概述
作用:将一段经常使用的代码单独编写,再进行调用,减少代码的重复。
比如一些比较大的程序,会分为若干个程序块,每一块都会实现不同的功能。
二、函数的定义
有5个部分:1、返回值类型 2、函数名(3、参数列表){4、函数体语句 5、return表达式}
注意:
1、如果函数不需要返回值,那么返回值类型我们可以定义为void,void表示无类型,并且可以不写return表达式。
2、函数名最好能直观体现此函数实现的功能,有利于代码的阅读
3、参数列表中的参数,为形式参数,在函数定义的时候,并没有真实的数据。
语法:
返回值类型 函数名(参数列表)
{
函数体语句
return 表达式;
}
例:定义一个函数,传入两个整形数据,实现两个整形数据相加,并返回相加结果。
代码:
int add(int num1, int num2)//int为返回值类型,add为函数名,int num1、int num2为参数列表
{
int sum = num1 + num2;//sum为两数相加结果变量
//int sum = num1 + num2为函数体语句,实现两数相加,
//并把结果赋给sum
return sum;//返回sum的值
}
三、函数的调用
函数的调用:使用已经定义好的函数
语法:函数名(参数);
注意:这里的参数是实际参数,有具体的数据。
例:在主函数中调用我们所定义的add函数,并打印结果
代码:
#include <iostream>
using namespace std;
int add(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
int main()
{
int a = 5;//定义变量a,值为5
int b = 3;//定义变量b,值为3
int c = add(a,b);//定义变量c存放计算结果。调用add函数,并将返回值赋给c
//()中的a,b为实际参数
//在调用函数时,实参的值会传递给形参
//a的值传递给num1,b的值传递给num2
cout << "a = " << a << endl;//分别打印a、b、c的值
cout << "b = " << b << endl;
cout << "c = " << c << endl;
system("pause");
return 0;
}
运行结果:
四、值传递
值传递,就是函数调用时将实参的数值传递给形参。
注意:值传递时,如果形参发生了改变,并不会影响实参
例:实现两个数交换的函数。
代码:
#include <iostream>
using namespace std;
//实现两数交换函数
void swap(int num1, int num2)
{
cout << "交换前:" << endl;//打印交换前num1和num2的值
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
int temp = num1;
num1 = num2;
num2 = temp;
cout << "交换后:" << endl;//打印交换后num1和num2的值
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl << endl;
//由于我们两数交换,并不需要返回值,
//所以函数返回值类型定义为void, return表达式也可以不写。
//当函数不需要返回值时,如果写了return,程序会报错,说函数类型与返回值类型不匹配。
}
int main()
{
int a = 66;
int b = 99;
swap(a,b);
cout << "a = " << a << endl;//打印交换后a和b的值
cout << "b = " << b << endl;
system("pause");
return 0;
}
运行结果:
从运行的结果可以看出,在我们交换前的形参num1=66,num2=99,交换后的形参num1=99,num2=66,证明我们的交换函数没问题。在调用完交换函数后,a=66,b=99依然没有发生变化,说明在调用函数时,形参发生改变并不影响实参。
五、函数的常见样式
常见的有4种:
1、无参无返
2、有参无返
3、无参有返
4、有参有返
1、无参无返
#include <iostream>
using namespace std;
//无参无返
void t1()
{
cout << "今天是7月15日" << endl;
}
int main()
{
//调用无参无返函数
t1();
system("pause");
return 0;
}
运行结果:
2、有参无返
#include <iostream>
using namespace std;
//有参无返
void t2(int a)
{
cout << "a = " << a << endl;
}
int main()
{
//调用有参无返函数
t2(10);//调用后,会将10赋给a
system("pause");
return 0;
}
运行结果:
3、无参有返
#include <iostream>
using namespace std;
//无参有返
int t3()
{
cout << "无参有返的函数调用" << endl;
return 6;
}
int main()
{
//调用无参有返函数
int a = t3();
cout << "a = " << a << endl;
system("pause");
return 0;
}
运行结果:
4、有参有返
#include <iostream>
using namespace std;
//有参有返
int t3(int num)
{
cout << "有参有返的函数调用" << endl;
return num;
}
int main()
{
//调用有参有返函数
int a = t3(6);
cout << "a = " << a << endl;
system("pause");
return 0;
}
运行结果:
六、函数的声明
作用:告诉编译器函数名称及如何调用函数,函数的主体可以单独定义。
有4个部分:1、返回值类型 2、函数名(3、参数列表) 4、;
语法:返回值类型 函数名(参数列表);
注意:1、当我们没有做函数的声明,并且定义的函数在主函数之后,那么我们的程序将会报错, 因为编译器找不到定义的函数;但如果同样是没做函数声明,但调用的函数写在主程 序之前,就没问题。所以我们需要提前对函数做声明,告诉编译器有这个函数,保证随 时能调用。也就是说,如果没有函数声明,或者声明在主函数后,那么函数必须定义在 主函数之前;如果有声明,且在主函数前面,那么函数定义在哪个位置都可以。
2、函数的声明与函数的定义的区别在于:函数的声明只有返回值类型、函数名以及参数 列表,还有分号;而函数的定义有函数体语句,具体实现什么,还有return返回值。
3、函数可以声明多次,但是函数只能定义一次。虽然声明可以写多次,但是没有必要。
例:定义一个比较函数,实现两个整型数字的比较,并返回较大的值
代码:
#include <iostream>
using namespace std;
int compare(int a, int b);//比较函数声明
int main()
{
int a = 5;
int b = 9;
cout << "较大值为:" << compare(a,b) << endl;//调用比较函数,并输出返回值
system("pause");
return 0;
}
int compare(int a, int b)//定义比较函数
{
return a > b ? a : b;//返回较大值
}
运行结果:
七、函数的分文件编写
作用:让代码结构更加清晰
有4个步骤:
1、创建后缀名为.h的头文件(与创建.cpp文件相同的操作)
2、创建后缀名为.cpp的源文件
3、在头文件中写函数的声明
4、在源文件中写函数的定义
例:实现两个数字进行交换的函数
头文件代码:
//在头文件中做函数的声明
#include <iostream>
using namespace std;//在头文件中,这两句框架不能丢,否则会报错
//函数的声明
void swap(int a, int b);
源文件代码:
#include "swap.h"//""表示是自定义的头文件
//这条代码,将源文件与头文件关联起来
//函数的定义
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
主函数代码:
#include <iostream>
using namespace std;
#include "swap.h"
int main()
{
int a = 10;
int b = 33;
swap(a,b);
system("pause");
return 0;
}
运行结果: