C++程序设计案例教程(学习笔记)——Cha4函数

4.1函数的定义与声明
4.1.1 函数的定义
格式:
<函数类型> <函数名> (<参数表>) //函数头
{
<若干条语句> //函数体
}
4.1.2函数的声明
在函数调用之前要对函数进行定义或声明
格式:<函数类型> <函数名> (<参数表>);
注:函数声明是一条语句,因此在函数后加“;”,为了简化函数之间的调用关系,采用除main()外,在main()函数之前对所有的函数进行声明,在main()函数之后进行定义。
4.1.3函数的类型
1)函数的类型与函数体中的return语句返回的数据类型相一致,无返回值,函数的类型定义为void
2)函数类型与函数体中的return语句类型不符时,在返回时先做隐含类型转换(向着函数类型转换),然后再返回,这种转换可能会降低计算的精度
注:执行return语句时,返回return后面的数值,同时退出函数体,return之后的语句将不再执行。
4.2 函数的参数与调用
4.2.1 函数的参数
有时为了反复调用同一个函数,为了避免反复传递相同实参的信息,允许给函数定义默认的参数。
注意:1)默认参数只允许在函数声明中给出,而定义中不允许设置默认参数,但是当程序中没有函数的声明时,则默认参数必须在函数定义中出现。
2)如果一个函数有多个参数,则设置参数默认值时,要求从右向左逐个设置。当调用函数时,只能将实参从左至右为形参赋值,当实参量少于形参量时,形参从左至右与实参匹配,剩余形参取默认值。因此要求设置默认参数时,从右至左进行逐个设置设置。
4.2.2函数的调用
1)有返回值得函数调用语句格式:
<变量名>=<函数名><实参表>;
2)没有返回值得函数调用语句格式:
<函数名><实参表>;
函数参数的传递方式:函数值调用、函数传址调用和函数引用调用。
1.函数的传值调用:形参和实参具有单独的存储空间,传值传递多用在不需要被调用函数改变实参的场合。
2.函数的传址调用: 函数在传址调用时实参传递的是地址值,用地址常量或指针变量表示,而形参用指针变量,地址调用的实现机制就是可以通过形参所指向的变量来影响实参。
3.函数的引用调用: 引用数据类型不同于指针,它既不是某个变量的地址,也不是某个变量的备份,引用通常被认为是变量的别名。
注:不需要实参跟着改变,则选用值传递;需要实参跟着改变则选用地址传递或引用,建议使用引用调用,引用调用更加方便,简单,易懂且容易维护。
4.3内联函数
程序执行过程中,遇到函数调用,则发生程序执行权的交接,程序的执行权将由调用函数交给被调用函数。就像程序执行main()时调用strcmp(),程序转向strcmp()的地址,将执行权给strcmp(),当strcmp()执行完后,返回到执行该函数之前的位置,再将执行权交给main()。当程序频繁出现函数调用时,会降低程序的执行效率,内联函数则可解决此类问题,通过被调用函数嵌入到被调用的地方,避免执行权的转移。
4.3.1 内联函数的定义格式:
inline <函数类型> <函数名> <参数表>
{
<若干条语句> ;
}
4.3.2内联函数的使用
内联函数是以牺牲目标代码的量增加代价来换取程序执行时间的节省。
注: 1)内联函数不能有复杂的流程控制语句,如循环语句、switch和goto语句。
2)内联函数不能是递归函数。
3)内联函数要求比较简单,可在几行写完。
4.4函数的重载
使一个函数名可以具有多种功能,具有多种形态,即多态性。
例:void print (int i);
void print (double i, double j );
系统通过判断形参和实参的类型是否匹配来判断具体执行哪一个print()函数,也可以通过参数个数的不同来实现重载。
4.5标识符的作用域
作用域又称作用范围,标识符的作用域一般开始于标识符的说明处,而作用域的结束位置取决于标识符说明在程序中的位置。
4.5.1作用域种类
程序作用域:包含组成该程序的所有文件,作用范围最大,外部函数和外部变量属于程序作用域。
文件作用域:范围仅次于程序作用域,范围声明在整个文件中,除了外部静态变量、用宏定义的符号以及在函数之外定义的所有变量属于文件作用域,所有函数均可以直接访问这些标识符。
函数作用域:函数作用域指的是整个函数的范围,函数作用域的标识符有函数的形参、实参、在函数内的定义的变量、内部静态变量以及语句标号。
块作用域:在函数内if,switch、以及循环控制语句等的程序块内。一对花括号标识块的作用域。“{”块作用域开始,“}”块作用域开始。
注:程序作用域和文件作用域称为全局变量,函数作用域和块作用域称为局部变量。
4.5.2 标识符含义和作用域的规则
标识符:包括常量、变量、函数名、类名、对象名以及语句标号。
标识符三种状态:
1)不存在:标识符在其作用域之外,即计算机内存中没有它的存储空间。
2)存在:标识在其作用域之内,即计算机内存中有它的存储空间。不一定可见。
3)可见:不仅存在,而且标识符能够被存取和访问,即能输出该标识符的数值。
作用域规则:内层的同名标识符总是覆盖外层的同名标识符,也就是原先定义的标识符在子范围内虽然是不可见的,但还是存在的,它被新定义的同名标识符覆盖了,过了子范围之后新定义的标识符就会消失,从而原先定义的标识符就可以现显出来。

4.5.3全局变量和局部变量

  1. 全局变量
    全局变量包含外部变量和静态类变量
    1)外部存储类型
    C++的一个文件中定义的变量的时候,如果这个变量处于任何函数的外部,则该变量是一个具有文件作用域的全局变量,该文件中的任何函数都可以访问它,因此它也是用来在函数之间传递共享信息的一个工具。对于多个文件组成的程序来说,只能在某一个文件内存共享信息有时是不够的,这时就用到了extern,通过声明变量为外部变量或将函数声明为外部函数在多个文件之间进行沟通。
    外部变量是定义在任何函数体之外,并且定义时不加任何存储类型声明的一种变量,外部变量在该变量定义之外的其他文件中引用时需要提前进行声明,声明外部变量的方法就是在变量的声明前加上extern,一个程序中外部变量只能定义一次,却可以用extern声明多次。
    外部函数与外部变量的作用域是相同的,也就是作用在整个程序的所有文件中,定义的方法也是在函数头的前面加上关键字extern,一般情况下定义函数时可以说省略。
    2)静态存储类型
    某些变量和函数有时只需要在定义它的源文件中使用即可,这是需要关键字static来将外部变量声明为外部静态变量,将外部函数声明为静态函数,这样使得外部静态变量和外部静态函数被定义它们的源文件所独享。
    注:文件作用域下,内联函数默认为静态函数,在文件作用域下定义的const的常量默认为外部静态变量,如果它们用extern声明之后,则可以成为外部存储类型。
  2. 局部变量
    局部变量是指作用域为函数作用域和块作用域的变量,包含在函数内或程序块内定义的普通变量和内部静态类变量。
    1)普通的局部变量,当系统运行到它所处的作用域(函数或程序块)时,系统会为其分配存储空间,并赋上初值,系统执行完它所在的作用域语句时,即执行完函数或程序块后,便会回收为它分配的存储空间,从而该局部变量生命周期结束。系统再次调用或执行该程序快时,系统再次分配空间并赋初值。
    2)内部静态变量的生命周期与程序的运行周期相同,只要这种变量一定义,这种变量的生命周期就开始,直到程序结束,无论系统是否运行在它的作用域内,该变量都存在。当系统运行在它所处的作用域时,系统可以访问该变量;当系统运行在它所处的作用域之外时,则该变量存在,但不可以访问,即不可见的。

猜你喜欢

转载自blog.csdn.net/qq_40719550/article/details/83242466
今日推荐