函数的定义:
一个函数就是一个功能
函数的基本分类:
用户使用角度:
1.系统函数,即库函数,编译系统提供不需要用户定义,可以直接使用在调用时子需要#include<>指令包含其中头文件
2,用户自己定义的函数,在使用时只要根据位置提供函数声明即可
函数形式角度:
1.无参函数 2.有参函数
一般定义形式:
无参函数:
类型名 函数名([viid])//无参函数直接()省略void即可
{声明部分
执行语句
}
例如:
void aj()//void无返回值及,没有return
{
cout<<"hello";
}
有参函数:
类型名 函数名(形参列表)
执行语句
}
例如:
int aj(int a)//int所以返回值为return int类型的一个值
{
cout<<"a";
return 0;
}
参数:
分类:
参数分为形式参数(形参)和实际参数(实参)
在定义函数时”()“括号内定义形式参数,在主调函数调用时候传入的值为实际参数
例如:
int aj(int a)//int所以返回值return返回的会是int,如果是char也会转换为int并返回
{
cout<<"a";
return 0;
}
int main(){
int a=40;
aj(a);//调用函数ai,,main中调用函数aj并传入实际参数a*****注意,传入实际参数应该和定义的形式参数数据类型保持一致,或者可以相互转换,例如char和int
return 0;
}
相关注意事项:
1.形式参数在函数定义时不占用内存,是一种虚拟的参数,只有在调用函数时传入实际参数才会分配内存单元,调用结束后释放该分配空间
2.实参可以是表达式。,变量,常量注意只要传入实际参数应该和定义的形式参数数据类型保持一致即可 或者可以相互转换,例如char和int
3.实参和形参之间两中传递方式
值传递:将实参拷贝一份给形参,形参数据的改变不会影响实参
地址传递:实参地址给形参,公用一个数据地址,所以形参改变数据内容,实参也会改变
函数的声明:
当一个函数被调用时要满足以下条件:
1.被调用函数是已经存在的函数无论是用户定义的或是库函数
2.库函数应该用#include<>进行声明l
例如调用数学库函数cmath #include<cmath>
3.自己定义的函数就需要要求被调函数在调用函数之前;如果在调用函数之后则要在调用函数中进行声明该函数的存在(因为程序运行编译时是自上而下进行的,要告诉程序该函数的存在才不会报错)
函数的声明
就是在函数尚未定义时,事先将该函数的有关信息提前通知编译系统,以便正常进行编译
一般形式
函数类型 函数名(参数类型1,参数类型2......)
函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2 ......)
函数声明位置:
1.被调函数在主调函数之前就不必再声明可以省略
2.声明可以写在主调函数中
3.声明也可以写在函数外部,称之为外部声明,此时调用函数时就不必再在函数中进行声明
函数的调用
一般形式:
函数名(实参列表);
注意事项
*****当调用函数为无参函数时,实参列表可以没有,但是()不能省略
*****实参列表要和形参顺序一一对应,不可混乱传入
调用方式3种
1.函数语句
函数语句没有待会返回值,所以不用变量承接,只是要求函数进行一定操作
void printy(){cout<<"bbbbb";}
调用该函数只要
printy();
2.函数表达式
对于有返回值并且要对于返回值作为参数进行运算的表达式
a=c-max(a,b);
max(a,b)返回a和b之间较大的值
3.函数参数
将函数返回值作为函数实参在进行传递
m=max(m,max(a,b));
函数的嵌套
*****不能在函数中去定义另外一个函数,只能调用,前提调用前要先声明
函数的递归调用
在调用一个函数的过程中又出现直接或间接调用该函数的本身,称为函数的递归调用,这种函数又称为递归函数
内置函数inline
当频繁的调用该函数之外的函数时要频繁的跳出,消耗时间,降低效率。c++提供一种解决办法。将被调用函数直接嵌入该函数中,这种被嵌入到主调函数的叫做内置函数
一般形式
在原来函数声明和定义前加一个inline关键字
例如
inline int max(int a,int b);//声明内置函数左边有inline
inline int max(int a,int b)//定义内置函数求大值
{
return a>b?a:b;
}
函数重载
含义
函数的重载就是对于一个函数名重新赋予新的含义,使其利用率提高即”一物多用“
int max(int a,int b)
int max(int a,int b,int c)
运行原理:
当我们调用max函数时系统会根据我么传入的实参类型和个数找到相应的函数
注意:
重载函数的参数类型,参数个数,参数顺序三者至少有一种不同,函数返回值类型也可以不同
函数模板(重载的升级版)
一般格式|:
1.
template<typename t>
通用函数定义
2.
template<class t>
通用函数定义
例如
int max(int a,int b){
return a>b?a:b;
}
char max(char a,char b){
return a>b?a:b;
}
上面两个函数只要下面函数一个就可代替
template<class t> //声明模板,其中t为类型参数
t max(t a,t b)//定义一个通用函数模板
{
return a>b?a:b;
}
int main(){
cout<<max(10,20);
cout<<max('a','b');
return0;
}
***注意****
1.在建立函数模板时只要修改上面例题那样将int改声明的t即可
2.函数模板只适用于函数体相同,函数参数个数相同只有函数参数类型不同的情况
3.template<classt1,typename t2>类型参数可以声明多个
有默认参数的函数
注意部分
1.在函数定义的时候给其参数一个值,可以全部参数给初值也可以一部分给初值,
int max(int a,int b=10)
在调用时以下两种都对
max(10,5);5直接赋给b覆盖原来的10
2.在使用该函数时实参个数可以与形参不同,实参未给的形参按默认初值计算
max(15);求15和10之间大的值
3.必须在调用之前通知编译器函数有默认值 ****一般最好只在函数声明时指出默认值即可
4.一个函数不能既做重载函数有做为默认参数函数
如下例题
int max(int a,int b,int y=10);
int max(int a,int b);
max(10,15);//此时系统不知道调用那个函数
局部变量和全局变量
局部变量定义:
在一个函数内部定义的变量,只在本函数范围生效,这就是局部变量
局部变量注意:
1.局部变量只能在本函数内部使用不能跨函数使用
2.不同的函数的局部变量可以有相同的名字
3.复合语句中定义的变量,只在复合语句中有效
4.形式参数也是局部变量
全局变量定义
在一个函数外部定义的变量,从定义位置到源文件结束
全局变量注意
1.全局变量可以连接所有函数渠道
2.全局变量全部执行过程都占用内存
3.函数通用性降低,使得模块独立性降低,一般函数只要是参数-实参就好别的链接渠道减少
4.全局变量太多影响可读性 需要考虑变量是否为全局还是局部变量
作用域分为四块:
文件作用域(全局作用域),(函数作用域,块作用域,函数原型作用域)(局部作用域)
static关键字:
1.对于局部变量声明,使得该变量在函数使用完结束后不释放,整个程序执行期间始终存在,存储期为程序全过程(提高存活周期)
2.全局变量用static声明,变量作用域只限于本文件名模块(被声明的文件中)
3.使用static register auto 格式static int a;
内部函数和外部函数
内部函数:static
定义:
如果一个函数只能被本文件中的函数引用则称为内部函数(静态函数)
一般形式:
static 类型标识符 函数名(参数列表)
static int max(int s,int b);
外部函数extern
定义
如果一个函数左端有extern则表示该函数为外部函数可以被别的文件调用
一般形式:
extern 类型标识符 函数名(参数列表)
extern int max(int s,int b);
****注意****
一般extern可以省略,所以一般我们用的都是外部函数