1、国家二级( C+)机试模拟试卷 110及答案与解析 一、选择题 1 有如下程序: int x=3; do x-=2; cout using namespace std; class TV public: TV(int s=41):size(s) TV(const TV ; TV fun(TV return t; int main() TV x,y; x=fun(y); return 0; 则 TV 类的复制构造函数被调用的次数是 ( A) 1次 ( B) 2次 ( C) 3次 ( D) 4次 9 对长度为 n的线性表作快速排序,在最坏情况下,比较次数为 ( A) n ( B) n-1 ( C)
2、 n(n-1) ( D) n(n-1)/2 10 关于赋值运算符 =的重载,下列表述中错误的是 ( A) =的重载函数必须且只能有一个参数 ( B)一个类即使没有重载 =,也可以用 =为该类的对象赋值 ( C)为了实现像 “x=y=z;“这样的连续赋值, =的重载函数的返回值必须声明为引用 ( D) =可以重载为一个类的友元函数 11 有如下程序: #include using namespace std; class Shape /图形类 public: /图形绘制函数(用显示字母模拟) virtual void draw()const coutdraw(); t.draw(); plot(
3、t); delete ps; return 0; 运行这个程序的输出是 ( A) SCC ( B) SCS ( C) CSS ( D) CCC 12 计算机软件包括 ( A)算法和数据 ( B)程序和数据 ( C)程序和文档 ( D)程序、数据及相关文档 13 有如下类定义: class MyClass public: MyClass(double d=0.0):val(d) _ /后缀自增运算符 +的声明 private: double val; ; 若要使语句序列 MyClass x(2.1),y; y=x+; 能够正常运行,横线处的语句应为 ( A) MyClass ( B) MyCla
4、ss ( C) MyClassoperator+(int); ( D) MyClassoperator+(); 14 有如下类定义: class Pet char name30; public: Pet(char * n) strcpy(name, n); void bark() coutbark() ( D) ( class AA public: virtual void disp() cout) 或 格式 2: if() else 关于上面的语法格式,下列表述中错误的是 ( )。 ( A) 部分可以是一个 if语句,例如 if(if(a=0) ( B) 部分可以是一个 if语句,例如 if
5、()if() ( C)如果在 前加上逻辑非运算符 !并交换 和 的位置,语句功能不变 ( D) 部分可以是一个循环语句,例如 if()while() 21 派生类的成员函数不能访问基类的 ( )。 ( A)公有成员和保护成员 ( B)公有成员 ( C)私有成员 ( D)保护成员 22 软件测试的目的是 ( )。 ( A)评估软件可靠性 ( B)发现并改正程序中的错误 ( C)改正程序中的错误 ( D)发现程序 中的错误 23 下列运算符函数中,肯定不属于类 Number的成员函数的是 ( A) Numberoperator+(Number); ( B) Numberoperator-(Numb
6、er); ( C) Numberoperator*(int); ( D) Numberoperator/(Number,Number); 24 有如下程序: #include #include using namespace std; class Instrument public: Instrument(string t=“乐器 “,string n=“无名 “):type(t),name(n) string GetType() const return “乐器 “; virtual string GetName() const return “无名 “; protected: string
7、 type,name; ; class Piano:public Instrument public: Piano(string n,string t=“钢琴 “):Instrument(t,n) string GetType() const return “钢琴 “; string GetName() const return name; ; int main() Instrument *pi=new Piano(“星空 “); coutGetType()GetName(); delete pi; return 0; 运行时的输出结果是 ( A)乐器 -星空 ( B)乐器 -无名 ( C)钢
8、琴 -星空 ( D)钢琴 -无名 25 下列叙述中,错误的是 ( A) false是一个逻辑型常量 ( B) 0是一个字符型常量 ( C) 1481是一个 int常量 ( D) 1.732是一个 double常量 26 有如下两个类定义: class XX private: double x1; protected: double x2; public: double x3; ; class YY: protected XX private: double y1; protected: double y2; public: double y3; ; 在类 YY中保护成员变量的个数是 ( A)
9、1 ( B) 2 ( C) 3 ( D) 4 27 某二叉树共有 12个结点,其中叶子结点只有 1个。则该二叉树的深度为(根结点在第 1层) ( A) 3 ( B) 6 ( C) 8 ( D) 12 28 下面是重载为非成员函数的运算符函数原型,其中错误的是 ( A) MyClassoperator*(MyClass); ( B) MyClassoperator+(MyClass,int); ( C) MyClass ( D) MyClass 29 有如下程序: #include using namespace std; class CC int k; public: CC(int n):k(
10、n) int get()const return k; ; int main() CC c3=CC(1),CC(2); return 0; 此程序编译时未能通过,原因是 ( A)数组只能定义为基本数据类型 ( B)类 CC缺少复制构造函数 ( C)对象数组只能作为类的数据成员 ( D)类 CC缺少默认的构造函数 30 有如下程序: #include using namespace std; void fun(char c) cout #include using namespace std; class Appliance public: Appliance(string t=“A“):typ
11、e(t) cout usingnamespacestd; enumPetstypedog, cat, bird, fish; classPets private: char*name; Pets_typetype; public: Pets(constchar*name=“sonny“, Pets_typetype=dog); Pets&operator=(constPets&s); Pets(); voidshow()const; ; Pets: Pets(constchar*name, Pets typetype) 构造函数 this-name=newcharstrlen (name)+1
12、; strcpy(this-name, name); ERROR*found* type=type; Pets: Pets()析构函数,释放 name 所指向的字符串 ERROR*found* name= 0; Pets&Pets: operator=(constPets&s) if(&s=this)确保不要向自身赋值 return*this; deletename, name=newcharstrlen(s name)+1; ERROR*found* strcpy(this-name, name); type=s type; return*this; voidPets: show()cons
13、t cout usingnamespacestd; classVectorBase向量基类,一个抽象类 intlen; public: VectorBase(intlen): fen(len) intlength()constreturnlen; 向量长度,即向量中元素的个数 virtualdoublegetElement(inti) const=0;取第 i个元素的值 virtualdoublesum()const=0; 求所有元素的和 voidshow()const显示向量中所有元素 coutshow(); deletev; v=newZeroVector(6); v-show(); de
14、leteV; return0, 四、综合应用题 43 请使用 VC6或使用【答题】菜单打开考生文件夹 proj3下的工程 prog3,其中声明了 MyString类。 MyString是一个用于表示字符串的类。成员函数 startsWith的功能是判断此字符串是否以指定的前缀开始,其参数 8用于指定前缀字符串。如果参数 s表示的字符串是 MyString对象表示的字符串的前缀,则返回 true;否则返回false。注意,如果参数 S是空字符串或等于 MyString对象表示的字符串,则结果为 true。 例如,字符串 “abc”是字符串 “abcde”的前缀,而字符串 “abd”不是字符串 “
15、abcde”的前缀。请编写成员函数 startsWith。在 main函数中给出了一组测试数据,此种情况下程序的输出应为: s1=abcde s2=abc s3=abd s4= s5=abcde s6=abcdef s1startsWiths2: true s1startsWiths3: false s1startsWiths4: true s1startsWiths5: true s1startsWiths6: false 要求: 补充编制的内容写在 “ *333*”与 “*666*”之间,不得修改程序的其他部分。 注意:程序最后将结果输出到文件 out dat中。输出函数 writeToF
16、ile已经编译为obj文件,并且在本程序中调用。 MyStving h #include #include usingnamespacestd; classMyString public: MyString(constchar*s) size=strlen(s); str=newcharsize+1; strcpy(str, s); MyString()deletestr; ) boolstartsWith(constchar*s) const; private: char*str; intSize; ; voidwriteToFile(constchar*); main cpp #inclu
17、de“MyString h“ boolMyString: startsWith(const char*s)const *333* *666* intmain() chars1=“abcde“; chars2=“abc“; chars3=“abd“; chars4=“; chars5=“abcde“; chars6=“abcdef“; MyStringstr(s1); coutbark()用法是错误的,至于选项 D, &p 是 p 的地址,通过地址使用箭头访问运算符访问bark(),正确;答案为 C。 15 【正 确答案】 C 【试题解析】 学号是学生表 S 的主键,课号是课程表 C的主键,所以
18、选课表 SC的关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号,所以选择 C)。 16 【正确答案】 D 【试题解析】 内联函数的函数定义必须出现在内联函数第一次被调用之前;内联函数可以避免函数频繁调用时的开销,提高程序运行效率;在类定义体内部定义的成员函数,编译器都将其视为内联函数; A、 B、 C正确;内联函数也可以有参数, D错误,答案为 D。 17 【正确答案】 A 【试题解析】 程序定义了类 AA,成 员函数 disp 是虚函数;类 BB公有继承AA,重新定义了函数 disp,由虚函数的性质可知,即使 BB中未使用 virtual 修饰disp,函数 disp仍然是虚函数
19、;类 CC公有继承了 BB,同样重新定义了虚函数disp; main 函数中定义了 BB类对象 bb, CC类对象 cc, BB类引用 rb, rb 被初始化指向 cc;然后调用 plot函数,由于 plot函数的形参是 AA类对象 a,不满足多态性中调用者必须要是引用或者指针类型的条件,所以无论实参是 bb或 cc,a.disp()调用的都是 AA类中的函数 disp,输出 “A“; cc.disp()显然调用的是类 CC中的函数,输出 “C“; rb.disp(),由于 rb 是引用,指向的是类 CC对象 cc,所以这里由多态性可知调用的是 CC类中的 disp 函数,输出 “CC“;程序
20、输出结果为:“ACC“;答案为 A。 18 【正确答案】 B 【试题解析】 重载赋值运算符是为了操作类的对象,静态函数不满足,选项 A错误;如果类中没有重载赋值运算符,编译器将根据需求合成一个赋值运算符,所以重载赋值运算符必须是类的成员函数,以便编译器可以知道是否需要合成,选项 C错误;赋值运算符不是虚函数,因为虚函数必须在基类和 派生类中具有同样的形参,基类的赋值运算符有一个形参是自身类类型的引用,如果该运算符是虚函数,则每个派生类都将有一个虚函数成员函数,该成员函数定义了其中一个参数为基类对象的 operator=,可能会令人混淆,选项 D错误;答案为 B。 19 【正确答案】 A 【试题
21、解析】 保护继承中,基类的 public和 protected 成员在派生类中都是protected 成员,所以类 Derived中, public成员为: k, protected 成员为: n、p,没有 private成员, m对 Derived 不可见; Derived 对象 d 可访问的只有 public成员,即 k;答案为 A。 20 【正确答案】 A 【试题解析】 本题考查 if语句, if语句的条件部分不能嵌套 if 语句,所以 A选项错误; B选项就是 if语句嵌套; C选项其实就是将判断条件颠倒,然后执行语句也颠倒,所以效果一样; D选项也正确。 21 【正确答案】 C 【试
22、题解析】 本题考查 3种继承方式,其中,基类的私有成员始终为基类私有。所以派生类无法访问基类的私有成员。本题答案为 C。 22 【正确答案】 D 【试题解析】 软件测试是为了发现错误而执行 程序的过程,测试要以查找错误为中心,而不是为了演示软件的正确功能。不是为了评估软件或改正错误。 23 【正确答案】 D 【试题解析】 答案 D的形式是重载为友元函数,而友元函数不属于类的成员函数。所以重载为友元函数需要两个参数,通过参数传递的方式得到参加运算的两个对象。其他的是重载为类的成员函数,由于对象本身代表了一个操作数,所以其参数只需要一个,其为参加运算的另一个操作数。 24 【正确答案】 A 【试题
23、解析】 本题考查虚函数的运用,本题中基类 Instrument,派生类 Piano,其中 虚函数为 GetName,当定义 Instrument*pi=newPiano(“星空 “)时,调用派生类的 GetType函数,得到 type为乐器, name 为星空,所以输出乐器 -星空。选项A正确。 25 【正确答案】 B 【试题解析】 本题主要考查了常量的类型,其中 B选项中 “0“中由于是双引号,所以是字符串,单引号表示字符常量,所以 B选项错误。 26 【正确答案】 C 【试题解析】 本题考查派生类对基类成员的访问属性,派生类保护继承基类,那么基类的公用成员和保护成员在派生类中成为保护成员,
24、所以 派生类 YY总共有 3个保护成员, C选项正确。 27 【正确答案】 D 【试题解析】 二叉树中,度为 0的节点数等于度为 2的节点数加 1,即 n2=n0-1,叶子节点即度为 0, n0=1,则 n2=0,总节点数为 12=n0+n1+n2=1+n1+0,则度为 1的节点数 n1=11,故深度为 12,选 D。 28 【正确答案】 D 【试题解析】 本题考查赋值运算符重载,赋值运算符只能作为类的成员函数重载,所以 D选项错误。 29 【正确答案】 D 【试题解析】 对象数组无论在哪里定义,都需要自动调用该对 象元素的类的默认构造函数进行初始化,如果该类没有默认构造函数,必须为数组的元素
25、提供显式初始化;程序中定义了对象数组 c,它包含了三个元素,前两个元素使用构造函数CC(intn)显式初始化,最后一个元素需要使用默认构造函数初始化,由于类 CC中已经定义了构造函数,所以编译器不会自动生成默认的构造函数,缺少默认构造函数导致对象数组 c的第三个元素无法完成初始化,编译错误;答案为 D。 30 【正确答案】 A 【试题解析】 程序中有三个重载 fun函数,形参类型分别为: char类型, double类型和 char*类 型, main 函数中,调用 fun 函数,实参为 0,编译器需要确定重载函数中的最佳匹配,由于 0可以隐式转换为 char类型、 double类型、 char*类型,均不能精确匹配,所以该函数调用具有二义性,编译出错;答案为 A。 31 【正确答案】 B 【试题解析】 程序中类 How没有定义任何构造函数,所以编译器需要自动生成一个默认构造函数和复制构造函数,答案为 B。 32 【正确答案】 C