一般呢,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,我们就把x称为自变量,把y称为因变量,y是x的函数。

说函数,不得不说 function,英文中 function,有完成一定功能,起作用的意思。所以在程序设计中,function 一词更应该理解成这段代码完成某种功能。
数学是理论科学,计算机程序是应用科学,计算机程序里面的函数概念继承自数学,在数学上,输入、数据处理、输出,这三者缺少任何一个都是没有意义的,而在计算机程序里可以设计成什么都不做。
#include<iostream>using namespace std;int main(){int a,b,c;cin>>a>>b;c=a+b;cout<<c;return 0;}
#include<iostream>using namespace std;int sum(int a,int b){return a+b;}int main(){int a,b,c;cin>>a>>b;c=sum(a,b);cout<<c;return 0;}
我们看到在main()下,cout输出的c的结果变成了sum(a,b),而不是前面的a+b。这里就是对自定义函数sum的调用,我们从sum函数获取结果。
C++中,函数可以看作一种独立的模块,是将重复出现的一些程序整理成独立的模块。在需要使用的时候只需要调用这些模块,而不需要将这些程序再重新写一遍。这样就减少了代码数量,并且让程序的维护更加轻松。
简单说,函数(function)就是一段程序语句的集合,并且给一个名字来代表此程序代码的集合。
C++中自定义函数分为声明和定义两部分。
声明是指:事先告诉编译器这个函数是存在的,并说明相关的信息(函数类型、参数数量、参数类型)。
定义是指:对函数功能的代码描述。
因为C++中程序开始执行是从main()函数开始的,所以我们在main()函数中调用其他函数分两种情况:
1、调用的函数在main()函数之前定义
2、调用的函数在main()函数之后定义
第一种在调用之前定义的函数不需要声明,第二种在调用之后才定义的函数则需要进行声明,否则会出现编译错误。但是由于在编写程序的过程中,我们有时候很难时刻关注函数的位置,因此我们一般习惯上都要对每个自定义函数先进行声明,然后才去定义调用。
如下面这样,不做声明,是无法编译的。
#include<iostream>using namespace std;int main(){int a,b,c;cin>>a>>b;c=sum(a,b);cout<<c;return 0;}int sum(int a,int b){return a+b;}
自定义函数的声明语法格式如下:
返回值类型 函数名(数据类型 参数1,数据类型2 参数2,……);
或
返回值类型 函数名(数据类型,数据类型2,……);
声明部分可以省略大括号,直接以“;”结尾。其中参数名可写可不写。例如:
int sum(int n1,int n2);int sum(int , int);
一个完整的函数分为这么几部分:
函数返回类型,函数名,参数,函数体,返回值。如下面函数,其中int是函数返回值类型,sum是函数名,c是返回值,int a,b是参数,花括号为函数体。
int sum(int a,int b){int c=a+b;return c;}
这里特别注意一下void类型的函数可以省略return语句,其余类型则必须至少含有一个return语句为调用处提供返回值,下面有个小例子。
接下来就是函数的调用,函数的调用就是如何使用函数。在调用函数的时候,需要按照函数定义好的参数数量以及参数类型去传递对应的参数。
语法格式如下:
函数名(参数1,参数2,……);
若函数是无参函数,不需要传递参数或者在小括号写上void 函数名();或函数名(void); 若有返回值,就可以使用赋值运算符“=”将返回值赋给变量。
变量 = 函数名(参数1,参数2,……);
所以上面的代码如果把函数放在main()函数之后的话可以这样写:
#include<iostream>using namespace std;int sum(int a,int b); //函数sum的声明int main(){int a,b,c;cin>>a>>b;c=sum(a,b);//函数sum的调用cout<<c;return 0;}int sum(int a,int b)//函数sum的定义{return a+b;}
#include<iostream>using namespace std;void sum(int a,int b); //函数sum的声明int main(){int a,b;cin>>a>>b;sum(a,b);//函数sum的调用return 0;}void sum(int a,int b)//函数sum的定义{cout<< a+b;}
这里简单提一下函数的嵌套调用和递归调用,嵌套调用指的是函数里面调用另一个函数,刚才我们在main函数调用max函数就是一个嵌套调用行为。仔细阅读下面例子,思考为什么函数a()要放到函数b()后面,如何避免?
#include<iostream>using namespace std;int b(){return 2020;}int a(){return b();}int main(){cout<<a();return 0;}
递归调用则是指的函数自身调用自身的情况,比如我们需要计算n的阶乘,我们可以循环也可以利用函数递归调用。当然递归一定不要忘记设置递归终止,否则就可能出现死循环了。
#include<iostream>using namespace std;int fact(int n);int main(){int a;cin>>a;cout<<fact(a);return 0;}int fact(int n){if(n==0 || n==1) return 1; //设定递归终止else return n*fact(n-1); //递归调用}
最后说一下内置函数,在 C++ 中,除了可以创建各种函数,还包含了各种有用的函数供您使用,这些函数写在标准 C 和 C++ 库中,叫做内置函数。
如数学函数,头文件cmath或math.h中包含的常用数学函数。math.h是C语言的头文件,因为C++兼容C所以在C++中用math.h也是可以的。不过推荐的是使用#include <cmath> ,总归你学C++不是,其中的函数和使用方法几乎完全相同。






