函数简介:
-
定义:function,翻译过来就是功能的意思,所以函数也就是功能。
-
分类:系统函数,用户自定义函数
- 系统函数是编译器提供好的C/C++的标准库函数,例如:printf、malloc、free、sqrt 等等;
- 用户自定义函数是指在实际的软件开发过程中,用户根据自己的情况,将部分功能封装成一个函数,供其他地方调用;
-
结构与调用:
#include <iostream> using namespace std; /*返回类型 函数名(形式参数表列) { 声明部分; 执行语句; }*/ int add(int x, int y) //x,y为形式参数(形参),因为函数调用之前他们并没有申请任何内存; { return x + y; } int main() { int sum = add(2,5); //2,5为实际参数(实参) cout << "sum = " << sum << endl; return 0; }
-
注意:
- 调用函数时实参应尽量与形参的类型一致,或可进行相应的转化,如果转化不了则编译器就会报错!
- 实参对形参的数据传递是以“值传递”的方式进行传递的。单向的,只能由实参传递给形参,不能由形参传递给形参。
-
返回值:
- 返回值可有可无,void则为无返回值类型
- 返回值由return获得,return之后的语句不被执行
- 返回值类型要求与定义时一致
- 原则上一个函数只能有一个返回值,若要返回多个值则可以通过参数返回或者返回结构类型等等
-
声明与定义:
- 函数的声明:就是告诉系统,或者告诉编译器,某个函数的“样子”
- 函数的定义:就是函数真正的实现,也就是函数实现的真正代码
-
调用方式:
①、普通语句调用:
②、表达式调用:
③、函数参数调用:
④、嵌套调用:
函数的嵌套调用意思就是:函数a调用了函数b,函数b又调用了函数c…就这样一层一层的调用下去!注意:函数可以嵌套调用,但是不可以嵌套定义!
这样是不行的,编译器直接报错了,在其他类似 js 的脚本语言中可以这样,但是在 C/C++ 中不允许函数的嵌套定义,只允许嵌套调用。
备注:新版本C++已经允许了,老版本的C++语法标准还不支持哦!⑤、递归调用:
在调用一个函数的过程中又出现或者有需要直接或间接的调用该函数本身,即自己调用自己,这样的情况称作函数的递归调用,在C/C++语言中是允许的。但要注意不能无限递归,那样的话就类似死循环了,应该竭力避免,必须要有最终能跳出递归的条件
局部变量和全局变量:
-
区分办法:
括号内的变量都是局部变量,反之则为全局变量。
-
注意事项:
- 局部定义的变量只能在该局部使用,其他函数无法调用
- 不同局部(函数或者作用域)可定义相同变量名,它们是独立个体
- 局部变量作用域一般在定义该变量的括号内
- 全局变量尽量靠上,保证所有地方都能调用
-
多文件共同访问一个全局变量:
①在其中一个C/Cpp文件中定义并初始化全局变量,例如:
int sum = 0;
②在C/Cpp文件都能访问到的一个h头文件中声明该全局变量为支持多文件访问的:
extern int sum; //此时只是声明,所以不需要初始化
③在其他C/Cpp文件中 #include 这个头文件之后,就可以直接使用这个全局变量 sum 了。 -
staic静态类型变量:
static 静态类型局部变量只初始化一次,之后的调用都不进行初始化!
#include <iostream> using namespace std; int sum = 0; int add(int a, int b) { static int num = 1; int ret = a+b; ret += num; ++num; return ret; } int main() { int x = 2, y = 5; sum = add(x, y); cout << "sum = " << sum << endl; sum = add(x, y); cout << "sum = " << sum << endl; sum = add(x, y); cout << "sum = " << sum << endl; return 0; }