1、国家二级 C+机试(函数)模拟试卷 1及答案与解析 一、选择题 1 下列关于函数的描述中,错误的是 ( )。 ( A)函数可以没有返回值 ( B)函数可以没有参数 ( C)函数可以是一个类的成员 ( D)函数不能被定义为模板 2 下列关于 C+函数的说明中,正确的是 ( )。 ( A)内联函数就是定义在另一个函数体内部的函数 ( B)函数体的最后一条语句必须是 return语句 ( C)标准 C+要求在调用一个函数之前,必须先声明其原型 ( D)编译器会根据函数的返回值类型和参数表来区分函数的 不同重载形式 3 若有下面的函数调用: fun(a+b, 3, max(n-1, b) 则 fun的
2、实参个数是 ( )。 ( A) 3 ( B) 4 ( C) 5 ( D) 6 4 有如下程序: #include iostream using namespace std; void function2(int n); void functionl(int n) if(n =0)return; function2(n一 2); void function2(int n) if(n =0)return; functionl(n1); ) int main() fimctionl(5); return 0: ) 下列关于程序运行情况的描述中,正确的是 ( )。 ( A) functionl运行 1
3、次, function2运行 2次 ( B) functionl运行 2次, function2运行 1次 ( C) functionl运行 2次, function2运行 3次 ( D) functionl运行 2次, function2运行 2次 5 假设函数 fun已经定义,其原型为 “void fun(int a, int b=7, char*p=“*”); ”下列数调用中错误的是 ( )。 ( A) fun(5) ( B) fun(5, 8) ( C) fun(6, “#”) ( D) fun(0, 0, tt=tt) 6 已知函数 FA调用 FB,若要把这两个函数定义在同一个文件中
4、,则 ( )。 ( A) FA必须定义在 FB之前 ( B) FB必须定义在 FA之前 ( C)若 FA定义在 FB之后,则 FA的原型必须出现在 FB的定义之前 ( D)若 FB定义在 FA之后,则 FB的原型必须出现在 FA的定义之前 7 下列函数原型声明中,错误的是 ( )。 ( A) int function(int m, int n); ( B) int function(int, int); ( C) int function(int m=3, int n); ( D) int function(int m, int&n); 8 在对函数进行原型声明时,下列语法成分中,不需要的是
5、( )。 ( A)函数返回类型 ( B)函数参数 列表 ( C)函数名 ( D)函数体 9 关于函数中的 ,下列表述中错误的是 ( )。 ( A) 中有可能包含关键字 int ( B) 中有可能包含自定义标识符 ( C) 中有可能包含字符 * ( D) 中可能包含 10 若一个函数的原型为 “int木 *fiml(int x, int&Y, char z); ”,则该函数的返回值类型为 ( )。 ( A) int* ( B) int ( C) int& ( D) char 11 有如下程序: #include using namespace std; class A public: stati
6、c int a; void init()a=1; A(int a=2)int(); a+; ) ; int A: a=0; A obj; int main() cout obj a; return 0; j ) 运行时输出的结果是 ( )。 ( A) 0 ( B) 1 ( C) 2 ( D) 3 12 有如下程序: #include void fun(int&X, int y)int t=x; x=y; y=t; ) int main() int a2=23, 42); fun(a1, a0); std: cout a0 “, ” a1 std: endl; retum 0: 执行后的输出结果
7、是 ( )。 ( A) 42, 42 ( B) 23, 23 ( C) 23, 42 ( D) 42, 23 13 有如下程序: #include using namespace std; int main() void function(double val); double val; function(val); cout val; return 0; ) void function(double val) val=3; 编译运行这个程序将出现的情况是 ( )。 ( A)编译出错,无法运行 ( B)输出: 3 ( C)输出: 3 0 ( D)输出一个不确定的数 14 有如下函数定义: vo
8、id func(int a, int&b)a+; b+; ) 若执行代码段: int x=0, y=l; func(x, y); 则变量 X和 Y的值分别是 ( )。 ( A) 0和 1 ( B) 1和 1 ( C) 0和 2 ( D) 1和 2 15 已知函数 f的原型是 void f(int*a, long&b);,变量 v1、 v2的定义是: int V1: loong v2; 下列调用语句中正确的是 ( )。 ( A) f(vl, V2); ( B) f(vl, V2); ( C) f(&vl, &V2); ( D) fl&vl, V2); 16 在下列原型所示的 C+函数中,按 “传
9、值 ”方式传递参数的是 ( )。 ( A) void fl(int x); ( B) void f2(int*x); ( C) void f3(const int*x); ( D) void f4(int&x); 17 下列关于函数参数的叙述中,正确的是 ( )。 ( A)在函数原型中不必声明形参类型 ( B)函数的实参和形参共享内存空间 ( C)函数形参的生存期与整个程序的运行期相同 ( D)函数的形参在函数被调用时获得初始值 18 )有如下程序: #include using namespace std; void fl(int&x,int&y)int z=x; x=y; y=z; ) v
10、oid f2(int X, int y)int z=x; x=y; y=z; int main() int x=10, y=26; fl(x, y); f2(x, y); cout y endl; return 0: ) 运行时的输出结果是 ( )。 ( A) 10 ( B) 16 ( C) 26 ( D) 36 19 已知函数 f的原型是 “void flint*x, int y); ”,变量 Vl、 v2的定义是 “int vl,v2; ”,下列调用语句中,正确的是 ( )。 ( A) f(vl, v2); ( B) flvl, &v2); ( C) f(&vl, V2); ( D) f(
11、&vl, &V2); 20 有如下程序: #include using namespace std; void fl(int&x)x+; void f2(int x)+x; int main() int x=10, y=12; f1(x); f2(y); cout x+y endl; return 0; 运 行这个程序的输出结果是 ( )。 ( A) 22 ( B) 23 ( C) 24 ( D) 25 21 有如下程序: #include using namespace std; class AA int n; public: AA(int k): n(k)() int get0return
12、 n; ) int getoconstreturn n+l; ) ; int main() AA a(5); const AA b(6); cout a_getO b get(); return 0; 执行后的输出结果是 ( )。 ( A) 55 ( B) 57 ( C) 75 ( D) 77 22 下面是重载为非成员函数的运算符函数原型,其中错误的是 ( )。 ( A) Fraction operator+(Fraction, Fraction); ( B) Fraction operator-(Fraction); ( C) Fraction&operator=(Fraction&, Fr
13、action); ( D) Fraction&operator+=(Fraction&, Fraction); 23 关于函数重载,下列叙述中错误的是 ( )。 ( A)重载函数的函数名必须相同 ( B)重载函数必须在参数个数或类型上有所不同 ( C)重载函数的返回值类型必须相同 ( D)重载函数的函数体可以有所不同 24 有如下程序: #include using namespace std; class MyClass public: MyClass(int x): val(x)() void Print()constcout “const: val=“ Val t; void Print
14、()cout “val=” Val t; private: int val; ); int main() const MyClass objl(10); MyClass obj2(20); objl Print(); obj2 Print(); return 0; 程序的输出结果是 ( )。 ( A) val=10 const: val=20 ( B) const: val=10 const: val=20 ( C) const: val=10 val=20 ( D) val=10 val=20 25 下列有关函数重载的叙述中,错误的是 ( )。 ( A)函数重载就是用相同的函数名定义多个函数
15、 ( B)重载函数的参数列表必须不同 ( C)重载函数的返回值类型必须不同 ( D)重载函数的参数可以带有默认值 26 若已经声明了函数原型 “void fun(int a, double b=0 0); ”,则下列重载函数声明中正确的是 ( )。 ( A) void fun(int a=90, double b=0 0); ( B) int fun(int a, double ( C); ( D) void fun(double a, int 27 对 C+编译器区分重载函数无任何意义的信息是 ( )。 ( A)参数类型 ( B)参数个数 ( C)返回值类型 ( D)常成员函数关键字 con
16、st 28 已知函数 fun的原型为 int fun(int, int, int); 下列重载函数原型中错误的是 ( )。 ( A) char fun(int int); ( B) double fun(int, int, double); ( C) int fun(int char*); ( D) float fun(int, int, int); 29 下列关于函数重载的叙述中,错误的是 ( )。 ( A)重载函数的参数个数可以不同 ( B)重载函数的参数类型可以不 同 ( C)重载函数的返回值类型必须不同 ( D)重载函数的参数个数或参数类型必须有所不同 30 下列有关内联函数的叙述中,
17、正确的是 ( )。 ( A)内联函数在调用时发生控制转移 ( B)内联函数必须通过关键字 inline来定义 ( C)内联函数是通过编译器来实现的 ( D)内联函数函数体的最后一条语句必须是 return语句 31 为了取代 C中带参数的宏,在 C+中使用 ( )。 ( A)重载函数 ( B)内联函数 ( C)递归函数 ( D)友元函数 32 为了提高函数调用的实际运行速 度,可以将较简单的函数定义为 ( )。 ( A)内联函数 ( B)重载函数 ( C)递归函数 ( D)函数模板 33 计算斐波那契数列第 n项的函数定义如下: int fib(int n) if(n=0) return 1;
18、 else if(n-1) return 2; else retum fib(n-1)+fib(n一 2); ) 若执行函数调用表达式 fib(2),函数 fib被调用的次数是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 国家二级 C+机试(函数)模拟试卷 1答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 c+是一种强类型语言,它要求对于每一个实现都要有一个实例,这给程序员带来很多不便性。函数模板提供一种用来自动生成各种类型函数实例的算法,程序员只需要初始化其中部分参数和返同值,或者都不初始化,只需要申明通用的类型,而函数体则不需要改变。 2 【正确答案】 C
19、 【试题解析】 此题考查的足有关函数的概念。内联函数是在函数定义之前加关键字 inline来声明的函数,而不是 定义在另一个函数体内部的函数,故选项 A错误;无返回值的函数在执行完最后一条语句后,会自动返回而不必加入 retum语句,故选项 B错误;如果函数只是返回值类型不同,而其它完全相同,则不能作为函数重载来使用,故选项 D错误。 3 【正确答案】 A 【试题解析】 此题考查的是函数的调用。 C+中函数调用的一般形式为:函数名(实参表 ),其中实参表是用逗号分隔的一系列表达式。因此,本题中 fun()函数的实参表由 a+b、 3和 max(n-1, b)组成。 4 【正确答案】 D 【试题
20、解析】 在主函数中执行 functionl(5)时,会调用 function2(3), function2(3)又会调用 functionl(2), functionl(2)又会调用 function2(0),到此相互调用结束。所以 functionl()和 function2()各执行了 2次。 5 【正确答案】 C 【试题解析】 根据函数 fun()的定义,其前两个形参为整型变量,第三个形参为字符型变量。所以在调用时,必须符合形参的数据类型,而选项 c)的第二个实参的数据类型为字符串,不符合第二个形参的数据类型。 6 【正确答案】 D 【试题解析】 在 C+中,在调用任何函数之前,必须确保
21、它已有原型说明。函数原型说明通常放在程序文件的头部,以使得该文什中所有函数都能调用它们。在本题中,当函数 FA调用 FB时,函数 FB可以定义在 FA的后面,但是 FB的原型必须出现在 FA的定义之前,因而选项 D)为正确答案。 7 【正确答案】 C 【试题解析】 在 C+中,函数在使用之前要预先声明。这种声明在标准 C+中称为函数原型,函数原型给出了函数名、返回类型以及在调用函数时必须提供的参数个数和类型。其语法为: ();使用函数原型说明有两种形式: 直接使用函数定义的头部,并在后面加上一个分号: 在函数原型说明中省略参数列表中的形参变量名,仅给出函数名、函数类型、参数个数及次序。在选项
22、C)中,给出了形参变量 m的初值。 8 【正确答案】 D 【试题解析】 在 c十 +中函数在使用之前要预先声明,这种声明在标准 C+中称为函数原型。函数给出了函数名、返回类型以及在调用函数时必须指明参数个数和类型。 9 【正确答案】 D 【试题解析】 又称为函数类型,表示一个函数所计算 (或运行 )的结果值的类 型。它可以是 c+中已定义的数据类型,也可能是用户自定义的数据类型。但是不能包含 ,因为符号 不是一个数据类型。 10 【正确答案】 A 【试题解析】 由 “int*Xfun1(int x, int&y, char z); ”的定义可知,其返回值为指向 int指针的函数。 11 【正确
23、答案】 B 【试题解析】 此题实际考查的是变量作用域的屏蔽效应。在 C+中,当标识符的作用域发生重叠时,在一个函数中声明的标识符可以屏蔽函数外声明的标识符或全局标识符。声明类 A的全局对象时,构造函数首先调用 int函 数,但由于静态成员变量 a被构造函数内部的形参 a所屏蔽所以 a十 +改变的是形参 a的值,对静态成员变量 a没有影响。 12 【正确答案】 B 【试题解析】 此题考查是是函数的调用以及参数值的传递。函数 fun中的第一个参数是引用传值方式,是双向的;第二个参数是按值传递,是单向的。 13 【正确答案】 D 【试题解析】 此题考查的是函数参数的传递。 c+语言中,函数在传递参数
24、时,总是将实参的值传递给被调用函数的形参,即传值调用。因此,在函数中对形参所作的任何操作都不会改变实参的值。 14 【正确 答案】 C 【试题解析】 此题考查的是函数参数的传递方式。此题中形参 a是普通参数,即传值调用,函数中对 a增 1不会影响到实参 x的值;形参 b是传址调用,函数中对 b增 1同时会改变实参 y的值。故最终结果是 0和 2。 15 【正确答案】 D 【试题解析】 此题考查的是函数的调用。因为变量的定义是 intvl; longv2,而函数 f()的第一个参数是指针,第二个参数是引用,所以选项 D为正确引用。 16 【正确答案】 A 【试题解析】 传值方式是将实参复制到形参
25、中,因此实参和形参是两个不同的变量,有 各自的存储空问,可以把函数的形参看做是函数的局部变量。其中 BC选项为按低值传递 D选贤为按引用传递。 17 【正确答案】 D 【试题解析】 函数的实参与形参是两个不同的变量,有各自的存储空间。函数形参是函数的局部变量,在函数调用时获得初始值。 18 【正确答案】 A 【试题解析】 子函数 f1中的形参是引用变量,所以执行子函数实现了变量 x, y值的交换,变量 x的值等于 26,而变量 y的值等于 10。而子函数 f2中的形参是普通变量,因为 C+的函数之间的参数传递是传值,所以执行函数 f2不能实现变量x, y值的交换。 19 【正确答案】 C 【试
26、题解析】 在函数 f的形参表达式中第一个形参为整型指针变量,第二个为整型引用变量,所以用实参 vl的指针初始化第一个形参,用实参 v2初始化第二形参。 20 【正确答案】 B 【试题解析】 在函数 f1(int&x)x+; 中,是对变量 x的引用,所以当在 -main函数中执行 “fl(x); ”语句后,变量 x的值等于 11,而在函数 void f2(int x)+x; )中,对变量 x的传递调用,在 main函数中执行 “f2(y); ”语句后,变量 y的值仍然等于 12,所以输出 x+y的值等于 23。 21 【正确答案】 B 【试题解析】 此题考查的是常成员函数和函数的重载。所谓函数重
27、载,是指同一个函数名可以对应着多个函数实现。一般对象 a既可以调用普通成员函数 get,也可以调用常成员函数 get,由于常成员函数不能更新对象的数据成员,所以题日中通过对象 a调用的函数为常成员函数;常对象 b只能调用普通成员函数。 22 【正确答案】 C 【试题解析】 此题考查的是运算符重载。 c+语言规定, “=”运算符只能作为成员函数重载。 23 【正确答案】 C 【试题解析】 此题考查的是函数重载。在 C+语言中,允许定义一系列函数名相同,但形参的个数和类型不完全相同的函数,即函数的重载。重载函数对返回值类型不做要求,返回值类型也不参与区分函数的重载形式。 24 【正确答案】 C 【
28、试题解析】 此题考查的是常成员函数的重载。常成员函数是使用 const关键字说明的函数。 const关键字可用于区分重载函数。此时,常对象训用常成员函数,一般对象调用一般成员函数;题目中的 Print()就是通过 const重载的眄个成员函数,主函数中声明的 objl是常对象, obj2是一般对象。故输出结果是 const:val: 10 val=20。 25 【正确答案】 C 【试题解析】 此题考查的是函数重载的概念。在 c+语言巾,允许定义一系列函数名相同,但形参的个数和类型不完全相同的函数,即函数的重载。重载函数对返回值类型不做要求,返回值类型也不参与区分函数的重载彤式。故选项 C错误。
29、 26 【正确答案】 C 【试题解析】 函数重载的原则就是至少要在参数个数或参数类型上有所不同,且如果函数只是函数类型不同的,而其他完全相同,也不能作为重载函数来使用。 27 【正 确答案】 C 【试题解析】 如果重载函数只是函数类型不同,而参数个数和类型完全相同,C+编译器则无法区别它们。 28 【正确答案】 D 【试题解析】 重载函数至少要在参数个数或参数类型上不同。而选项 D中的函数与原函数只是函数类型不同,而其他完全相同 (参数个数及类型 ),则不能作为重载函数来使用。 29 【正确答案】 C 【试题解析】 两个或两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据
30、实参和形参的类型及个数进行最佳匹配,自动确定调用哪个函数,这就是函数的重 载。 30 【正确答案】 C 【试题解析】 此题考查的是内联函数的概念。在调用时,内联函数会像宏函数一样的展开,将调用表达式用内联函数体来替换所以它没有一般函数的参数压栈和和退栈操作,所以选项 A错误;即使没有使用。 inline说明,编译器也会将在类的说明部分定义的函数认定为内联函数,所以选项 B错误;内联函数只是比普通函数有更高的执行效率,所以选项 D错误。 31 【正确答案】 B 【试题解析】 此题考查的是内联函数。 C+语言引入内联函数的原因是用它来取代 c语言的预处理宏函数。故选项 B正确 。 32 【正确答案】 A 【试题解析】 c+引入内联函数的原因是用它来取代 c中的预处理宏函数。两者的区别在于,宏函数是由预处理器对宏进行替换,而内联函数是通过编译器来实现的。内联函数在调用时像宏函数一样展开,所以它没有一般函数的参数压栈和退栈操作,减少了调用开销,因此,内联函数比普通函数有更高的执行效率。 33 【正确答案】 B 【试题解析】 斐波那契数列是递归函数,所以 fib(2)=fib(1)+fib(0)=2+1=3。因而执行函数调用表达式 fib(2)时,函数 fib被调用的次是 2次。