![]() ![]() |
|
全国计算机等级考试二级C++考点分析之函数 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:40:34 文章录入:杜斌 责任编辑:杜斌 | |
|
|
考点1 函数的定义和说明 1.函数的定义 在C++中,定义函数的一般形式为: <返回类型><函数名>(<形式参数表>) {<函数体>} 其中,<返回类型>是该函数返回值的数据类型,若该函数无返回值,只是一个过程调用,则该函数的类型为void。<函数名>是一种标识符,通过它来调用函数<形式参数表>由逗号分隔,分别说明函数的各个形式参数,若无形式参数,圆括号也不可省略。形式参数的使用将使被调用函数可以从调用函数那里获取数据。<函数体>可以包含若干个变量和函数的定义,以及各种语句序列。若函数体是0条语句,称该函数为空函数。无论函数体内有多少条语句,花括号是不可省的。 注意:C++不允许函数定义的嵌套。 另外,关于函数return语句的形式有以下两种。 (1)return<表达式>; 此种形式用于带返回值的函数。 (2)return; 此种形式用于无返回值的函数,即返回类型为void的函数。 2.函数的说明 函数的说明又称为函数的声明。在C++中,函数的说明原则有以下两点。 (1)若一个函数先定义,后调用,则调用前可以不必说明; (2)若一个函数先调用,后定义,则调用前必须说明。 说明调用的函数的方法为: <数据类型><函数名>(<参数表>); 考点2 函数的调用 在C++中,函数调用的格式为: <函数名>(<实参表>); 实参表应该与形参表一一对应。根据对函数返回值的使用方式,函数的调用方法大致可分为:语句调用、表达式调用和参数调用3种。函数在调用之前,一定要定义或说明。函数调用过程就是将实参传给形参,执行函数体后将结果返回的过程。 5.2 函数原型和函数返回类型 考点3 函数原型 在C++中,在调用任何函数之前,必须确保该函数已有函数原型。C++函数的声明(说明)就是原型的声明,这种声明也叫函数原型。函数原型的语法格式与函数的说明格式相同。格式如下: <数据类型><函数名>(<形参列表>); 函数原型说明的两种形式为: (l)直接使用函数定义的头部,并且必须在后面加上一个分号; (2)在函数原型说明中省略参数列表中的形参变量名,只给出函数名、函数类型、参数个数及次序,注意函数原型后面的分号不可省略。 考点4 函数返回类型 根据函数是否带有参数以及函数是否有返回值,可将函数分为4种,如表5-1所示。 表5-1关于返回类型的四种函数 5.3 函数参数 考点5 参数的传递方式 在C++中,实参传给形参的方式有以下3种。 (l)传值调用。它的特点是形参值的改变不影响实参。在使用此方式时,调用函数的实参使用常量、变量值和表达式值,被调用函数的形参使用变量值。它的实现机制是系统将实参备份一个副本传给形参。 (2)传址调用。它的特点是传址调用时,在被调函数中可以通过改变形参指针所指向的实参变量值来间接改变实参值。在使用此方式时,调用函数的实参使用地址值,被调用函数的形参使用指针。它的实现机制是系统将实参的地址赋给对应的形参指针,使形参指针指向实参变量值。 (3)引用调用。在C++中常常使用引用作为函数形参来实现在被调用函数中改变调用函数的实参值。其实引用调用也是一种隐式的传址过程,所以通过引用传递函数参数属于隐式传递地址。引用调用是C++中的一种函数调用方式,而在C语言中没有这种函数调用方式。 考点6 设置函数参数的默认值 在C++中,允许在函数的说明或定义时给一个或多个参数指定默认值。但在一个指定了默认值的参数的右边不可以出现没有指定默认值的参数。在函数调用时,编译器按从左到右的顺序将实参与形参结合,当实参数目不足时,编译器将按同样的顺序用说明或定义中的默认值来补足听缺少的实参。在给某个参数指定默认值时,不仅可以是一个数值,也可以是任意复杂的表达式。 5.4 函数重载及带有默认参数的函数 考点7 函数重载 函数重载是指同一个函数名可以对应着多个函数的实现。函数重载要求编译器能够惟一地确定调用函数时应执行哪个函数代码,即采用哪个函数实现确定函数实现时,要从函数参数的个数和类型上来区分。也就是说进行函数重载时,要求同名函数的参数个数不同,或者参数的类型不同。否则无法实现函数重载。例如,可以给函数add()定义两个函数实现,该函数的功能是求两个操作数的和。其中,一个是实现两个int型数之和,另一个是实现两个float型数之和。 小提示: 在C语言中,编写函数时必须保持函数名惟一。而C++中的函数可以不惟一。 考点8 带有默认参数的函数 函数也可以带有默认参数。例如下面的函数是带有默认参数的函数:
void init(int i=0,int j=0); 带有默认参数的函数的说明和定义与普通函数类似。 5.5 内联函数 考点9 内联函数 C++引入了内联函数,代替了C语言中的预处理宏,节省了调用开销,大大地提高了函数的执行效率。内联函数与一般函数的区别之处仅在于函数调用的处理,一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换。将一个函数定义为内联函数,只要定义时,在函数名前加上关键字intine即可。例如: inline float Myabs(float x) {return x<0?(-x):x;} 小提示: 内联函数体内不可以有循环语句和开关语句;内联函数的定义公须出现在内联函数第一次被调用之前。 5.6 递归函数 考点10 递归函数 在C++编程中,允许使用函数的递归调用,因为递归是一种非常有用的程序设计技术。递归就是某一种事物直接或间接地调用自己。一个函数直接或间接地调用自身,便构成了函数的递归调用,前者称为直接递归调用,后者称为间接递归调用。在一个函数中调用自身函数的函数称为递归函数。递归函数在执行时,引起一系列的调用和回代的过程递归过程不应无限制地进行下去,应当在调用有限次后就达到递归调用的终点,得到一个确定的值,然后进行回代一回代的过程是从一个已知值推出下一个值。任何有意义的递归总是由递归形式和递归终止条件两部分组成的。 小提示: 递归函数不能用来做内联函数。 5.7 变量的作用域与生存周期 考点11 变量的作用域 在C++中变量分为auto(自动),register(寄存器),static(静态),extern(外部)4种存储类型。变量的作用域与其存储类型有关。 1自动变量 自动变量的特点如下: (1)自动变量被声明在“内部”(即函数、块、声明语句)中。 (2)自动变量是在程序运行中用栈分配方式创建的。 (3)自动变量的作用域是局部的。 (4)自动变量的初值不确定。 (5)定义自动变量的关键字auto可省略。 2外部变量 外部变量的特点如厂 (1)外部变量声明形式有两种:定义性声明和引用性声明。 (2)外部变量是用编译预分配方式创建的。 (3)外部变量的作用域是整个程序 (4)外部变量的关键字为extern (5)外部变量能被局部变量屏蔽不可见。 3静态变量 静态变量特点如下 (1)在局部变量前加上static关键字就是内部静态变量。 (2)内部静态变量的作用域是定义它的函数的内部。 (3)在外部变量前加上static关键字就是外部静态变量。‘ (4)外部静态变量的作用域是定义它的文件。 (5)内部静态变量和外部静态变量都采用静态存储分配,隐含初值是0} 4寄存器变量 寄存器变量特点如下。 (1)寄存器变量作用域与自动变量相同。 (2)寄存器变量关键字是register。 (3)寄存器变量有可能被存放到CPU通用寄存器中,这样可以提高数据的存取速度,没被存放到寄存器中的变量按自动变量处理。 (4)寄存器变量的数据长度与通用寄存器的长度相等。一般是int型和char型。 (5)不可以对寄存器变量进行取地址操作。 考点12 变量的生存周期 讨论变量的存储类型之后,得知:在C++中,变量的生存周期可分为两种。一种是由编译程序在编译时给其分配存储空间(静态存储分配),并在程序执行过程中始终存在,这类变量包括全局变量、外部静态变量和内部静态变量。另一种是由程序在运行时自动分配存储空间(自动存储分配),这类变量为函数(或程序块)中定义的自动变量。 5.8 函数模板 考点13 函数模板的定义和使用方式 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化了重载函数的函数体设计。函数模板的声明形式为: template<<class(或typename)Type>><函数声明> 其中,在声明模板参数时typename与class可以互换,用它们声明的参数为虚拟型参数。 在函数模板中也允许使用多个类型参数,例如: template<<class(或typename)Typel,class(或typename)Type2>><函数声明> 用模板实参实例化的函数也称为模板函数一个模板函数既可以显式的声明也可以隐式的声明。函数模板中的类型参数只有到该函数真正被调用时才能决定。模板形参的类型第一次被确定以后,便不可以再更改。用函数模板也可以定义static,extern,inline函数。另外,函数模板也可以重载,但函数模板容易出错。 小提示: template定义部分的每个类型参数前必须有关键字class(或typename)。 |
|
![]() ![]() |