1.函数的概念
把较大的任务分解成若干个较小的任务,并提炼出公用任务。设计得当的函数可把具体操作细节对外界隐藏起来,从而使整个程序结构清楚。一个c++程序由一个或多个源程序文件组成,一个源程序文件由一个或多个函数组成。main函数开始,调用其他函数回流到main函数,main函数结束。
库函数(标准库函数、第三方定义库函数)、自定义函数(包装后可成为库函数)
2.函数的定义
函数名称,函数返回值类型,函数实现的功能,参数的个数与类型
函数名是一个标识符,函数名要有意义,一般是一个动词短语,表示函数的行为。
//类型 函数名(类型 参数1,类型 参数2,…)
{
声明语句序列
可执行语句序列
return (表达式);//小括号可省略
}
定义无参函数:参数部分为空或void
定义空函数
3.函数的使用
函数调用
形参是函数定义中的参数,必须是变量,用于接收实参传递过来的值,使用方法和变量相同。实参是函数调用时的参数,可以是常量、变量、表达式、函数调用等。无论实参时何种类型的量,进行函数调用时必须有确定的值。实参和形参在数量、顺序、类型上必须严格一致(类型不一致发生自动类型转换)
函数的参数传递
在定义函数中指定的形参,在未出现函数调用时,并不占内存中的储存单元。发生函数调用时,形参被临时分配内存单元。函数调用时,主调函数把实参的值传送给被调函数的形参。数据传送是单向的,如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数中实参的值,调用结束,形参单元被释放,实参仍保留并维持原值
函数的返回值
通过函数调用是主调函数能得到一个确定的值。在定义函数返回值类型一般应和return语句中表达式保持一致,否则将发生自动类型转换。
函数的嵌套调用
在调用一个函数的过程中,又调用另一个函数。c++语言规定不能嵌套定义,但可以嵌套调用,函数是相互平行的。
函数原型(函数声明)
使用自定义函数且该函数位置在主调函数之后,应在主调函数前声明函数原型
4.变量的作用域:在源程序中定义变量的位置及其能被读写访问的范围
①局部变量:在函数内部和复合语句内部定义的变量(只在函数和复合语句内部有效)
②全局变量(外部变量、全程变量):定义时会自动初始化,定义的数组大小可以很大(局部变量有限)
若局部变量与外部变量同名,在局部变量作用范围内全局变量被屏蔽
5.变量的储存类型
标准变量定义:存储类型 数据类型 变量名;
①自动变量 auto:函数内或块内定义的变量缺省储存类型 ②寄存器变量 register:储存在寄存器中,代替自动变量或形参,可以提高变量的访问速度 ③外部变量 extern :声明一个不在本模块作用范围内的全局变量。在某函数引用了一个声明在本函数之后的全局变量时,在函数内用extern声明此全局变量;当一个程序有多个源文件组成时,用extern可引用另一文件中的全局变量 ④静态变量 static:静态外部变量说明全局变量其他源文件不能用extern引用它,静态的局部变量不建议使用。
6.数组作为参数
①数组值作为函数参数
②数组名作为函数参数:传递整个数组给另一个函数,将数组的首地址作为参数传递过去(形参和实参是同一数组)
7.带默认值形参值的函数:若有实参则按实参。若有多个形参则缺省形参值必须从左到右连续定义,且在一个缺省形参值的右边不能有未指定缺省值的参数。再调用一个函数时,如果省去了某个实参则直至最右边的实参都要省去。缺省函数说明必须出现在函数调用之前,若存在函数原型则在函数原型中指定,否则在函数定义中指定,不得重复指定。(不同作用域中可提供不同的缺省形参值)。对于初始形参值的指定可以是初始化表达式,也可以包含函数调用。在函数原型给出了形参的缺省值时,形参名可以省略。
8.内联函数:编译时将函数体代码插入函数调用处,将函数调用的方式改为顺序执行方式来节省程序执行的时间开销,即空间换时间。
inline 函数类型 函数名 (形参表)
{
函数体;
}
与处理register变量相似,是否对一个内联函数进行扩展完全由编译器自行决定。如果仅在声明函数原型时加上关键字inline,并不能达到内联效果 。内联函数的定义必须出现在对该函数的调用之前,不符合以上要求编译不会出错,只是系统会将该函数当作普通函数。
9.重载函数:可以使参数个数不同、参数类型不同或两者兼而有之的两个以上的函数取相同的函数名。如果仅仅是返回值不同,不能重载。由编译器确定某一次函数调用到底是调用了哪一个具体的函数(联编、捆绑、绑定)/若不能严格匹配,对实参类型由高类型转换后的匹配、实参类型向低类型以及相容类型转换后的匹配(绑定/匹配的二义性),可添加重载函数定义获得精确匹配或将实参进行强制类型转换/重载函数带默认形参的函数一起使用时可能引起二义性,可增加或减少实参个数。
10.函数模板:一组重载函数仅仅参数类型不同(参数化/泛型化)
template <class 类型名1,class 类型名2,…>
返回类型 函数名 (形参表)
{
函数体;
}
template关键字表明声明的是模板,class是类型关键字,也可用typename作为关键字,函数返回值可以是普通类型,也可以是模板参数表中指定的类型。使用隐式实例化无法初始化模板参数表中普通类型的形参,此时必须使用显式初始化。