C++函数(第一部分)
在这里不对内置函数进行讲解,以后单独作讲解。
在c和c++中,函数是程序的重要组成部分,每个程序都必须有一个主函数。
人们往往还编写一些函数用来实现各种功能。
一个函数就是一个功能。
函数往往分为以下几种类型:
从用户的使用角度分为:
- 系统函数,即库函数
- 用户自己定义的函数
从函数的形式上看:
- 无参函数
- 有参函数
定义函数的一般形式
一般分为两种形式
定义无参函数
一般形式为:
类型名 函数名(void)
{
声明部分
执行语句
}
例如:
int main()
{
int a;
int b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}
这里以主函数为例,int类型的函数,返回一个整型量,在这里是return 0.
主函数名后的()为空说明为无参函数。
定义有参函数
一般形式为
类型名 函数名(形式参数列表)
{
声明部分
执行语句
}
例如:
int sum(int x, int y)
{
return x + y;
}
return的作用是返回一个值给其他函数使用
例如
#include <iostream>
using namespace std;
int sum(int x, int y)
{
return x + y;
}
int main()
{
int a;
int b;
cin >> a >> b;
int c = sum(a, b);
cout << c << endl;
return 0;
}
这里是返回一个值给主函数
运行结果为:
这个函数将a和b的值传递给x与y,并将x+y的值返回给c。
函数参数与实际参数
函数参数分为形式参数和实际参数两种。
形式参数
直接看例子:
int sum(int x, int y)
{
return x + y;
}
规则;
- 在定义函数时指定的形参,在未出现函数调用时,并不占用存储单元,因此称为形式形式参数或者虚拟参数,表示他们并不是实际存在的数据,只是发生在函数调用时,只有在调用是形参才会被分配存储单元,在调用结束后形参所占用的存储单元也会被释放。
- 实参可以是常数、变量或表达式,例如:sum(3,a+b); 但要求a与b有确定的值。
- 在定义函数时,必须在函数首部指定形参的类型。
- 实参对形参的数据传递时值传递,即单行传递,只由实参传递给形参,不能由形参传递给实参。
函数的返回值
通过函数的调用使主调函数能够得到一个确定的函数值,这就是函数的返回值。
直接看例子:
#include <iostream>
using namespace std;
int sum(int x, int y)
{
return x + y;
}
int main()
{
int a;
int b;
cin >> a >> b;
int c = sum(a, b);
cout << c << endl;
return 0;
}
在此程序中,**int sum(int x,int y)**函数的返回值类型为int,即整型。
不难看出,返回值类型为函数类型,即函数名前标注的类型。
函数的调用
函数调用的一般形式为:
函数名(实参列表)
函数的调用方式
按照函数在语句中的作用,大体可以分为以下3种函数调用方式
1.通过函数语句调用
把函数单独作为一个语句,并不要求函数带会一个值,只是要求函数完成一定的操作。
void printfok()
{
cout<<"ok"<<endl;
}
int main()
{
prinfok();
return 0;
}
2.函数表达式
这里采用上面的例子
int sum(int x, int y)
{
return x + y;
}
int main()
{
int a;
int b;
cin >> a >> b;
int c = sum(a, b); //函数表达式
cout << c << endl;
return 0;
}
3.函数参数
函数的调用作为一个函数的实参
sum(a,sum(a,b));
对被调用函数的声明
在这里先说明一下被调用的函数需要满足的条件
条件如下:
- 首先被调用的函数必须是一个已经存在的函数,可以是库函数,也可以是用户自己定义的函数。
- 如果是库函数,需要将包含库函数的头文件用预处理命令#include包含进来。
- 在使用自己定义的函数时,若被调用函数在调用函数在同一个程序单位中,且位置在调用函数之后,则必须对被调用函数进行声明。
在函数尚未定义的情况下,事先将该函数的有关信息通知编译系统,以便编译能够正常进行即为函数声明
例子如下:
#include <iostream>
using namespace std;
int sum(int x, int y);
int main()
{
int a;
int b;
cin >> a >> b;
int c = sum(a, b);
cout << c << endl;
return 0;
}
int sum(int x, int y)
{
return x + y;
}
在此程序中,sum函数的定义在主函数之后,当主函数调用sum函数之前就必须对sum函数进行声明。
在这里进行一下说明:
函数的定义和函数的声明并不是同一回事
定义是对函数功能的确立,包括指定的函数名,函数类型,形参及其类型,函数体等,它是一个完整的,独立的函数单位。
声明的作用则是把函数的名字,函数类型以及形参的个数,类型和顺序(不包括函数体)通知编译系统,以便调用能够正常进行。
在函数的声明中也可以不写形参的形参名,例如:
int sum(int,int );
函数的嵌套调用
c语言和c++都是不允许对函数进行嵌套定义的。
也就是说一个函数的定义中不可以包含另一个函数的定义。
但是c++和c语言都允许嵌套调用函数。也就是说可以在调用一个函数的过程中,调用另一个函数。
例如:
#include <iostream>
using namespace std;
int max(int x, int y)
{
if (x <= y)
return y;
else
return x;
}
int sum(int x, int y)
{
return max(x,y) + y; //嵌套调用
}
int main()
{
int a;
int b;
cin >> a >> b;
int c = sum(a, b);
cout << c << endl;
return 0;
}
在此程序中,sum函数在调用过程中再次调用max函数。
运行结果如下:
函数的递归调用
在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。
例如:
int sum(int x,int y)
{
return sum(x,y)+y;
}
以上为直接调用。
int funtion1(int x,int y)
{
return funtion2(x,y);
}
int funtion(int x,int y)
{
int z;
z=x+y;
return funtion1(z,y);
}
以上为间接调用,即为在调用其他函数的过程中调用自己本身。
在此程序中,funtion2函数在调用funtion1函数的过程中间接调用调用了自己本身。
函数的重载
对一个函数名重新赋予它含义,使一个函数名可以实现多用,即调用一个函数名可以实现不同的功能即为函数的重载
int sum(int x)
{
return x+x;
}
int sum(int x,int y)
{
return x+y;
}
以上为对sum函数进行重载,实现两种功能。
重载函数的参数个数,参数类型或参数顺序三者中必须至少有一种不同,函数返回值类型可以相同也可以不同。
return funtion1(z,y);
}
以上为间接调用,即为在调用其他函数的过程中调用自己本身。
在此程序中,funtion2函数在调用funtion1函数的过程中间接调用调用了自己本身。
---
## 函数的重载
对一个函数名重新赋予它含义,使一个函数名可以实现多用,即调用一个函数名可以实现不同的功能即为**函数的重载**
```c++
int sum(int x)
{
return x+x;
}
int sum(int x,int y)
{
return x+y;
}
以上为对sum函数进行重载,实现两种功能。
重载函数的参数个数,参数类型或参数顺序三者中必须至少有一种不同,函数返回值类型可以相同也可以不同。