1、二级 C+笔试 316 及答案解析(总分:98.00,做题时间:90 分钟)一、B选择题/B(总题数:35,分数:70.00)1.有如下程序: #includeiostream.h using namespace std; class Demo public: Demo() cont“default constructor/n“; Demo(const Demo int main() C obj; return 0; 执行后的输出结果是(分数:2.00)A.CBAB.BACC.ACBD.ABC19.有以下类定义 class MyClass private: int id; char gende
2、r; char*phone; public: MyClass():id(0),gender(#),phone(NULL) MyClass(int no,char ge=#,char*ph=NULL) id=no;gender=ge;phone=ph; ; 下列类对象定义语句中错误的是(分数:2.00)A.MyClassmyObj;B.MyClassmyObj(11,“13301111155“);C.MyClassmyObj(12,m);D.MyClassmyObj(12);20.在 C+语言中函数返回值的类型是由( )决定的。(分数:2.00)A.调用该函数时系统临时B.return 语句中的
3、表达式类型C.定义该函数时所指定的函数类型D.调用该函数时的主调函数类型21.关于类和对象描述错误的是(分数:2.00)A.对象(Objec 是现实世界中的客观事物,对象具有确定的属性B.类是具有相同属性和行为的一组对象的集合C.对象是类的抽象,类是对象的实例D.类是对象的抽象,对象是类的实例22.C+流中重载了运算符,它是一个(分数:2.00)A.用于输出操作的成员函数B.用于输入操作的成员函数C.用于输入操作的非成员函数D.用于输出操作的非成员函数23.若有如下程序: #includeiostream using namespaces std; int s=0; class sample
4、static int n; public: sample(int i) n=i; static void add() s+=n; ); int sample:s=0; int main() sample a(2),b(5); sample:add(); coutsendl; return 0; 程序运行后的输出结果是(分数:2.00)A.2B.5C.7D.324.有如下程序: #includeiostream using namespace std; class AA int n; public: AA(int k):n(k) int get()return n;) int get()cons
5、treturn n+1; ; int main() AA a(5); const AA b(6); coutaget()bget(); return 0; 执行后的输出结果是(分数:2.00)A.55B.57C.75D.7725.已知下列语句中的 x 和 y 都是 int 型变量,其中错误的语句是(分数:2.00)A.x=y+;B.x=+y;C.(x+D.+x=y;26.下列关于栈的描述正确的是(分数:2.00)A.在栈中只能插入元素而不能删除元素B.在栈中只能删除元素而不能插入元素C.栈是特殊的线性表,只能在一端插入或删除元素D.栈是特殊的线性表,只能在一端插入元素,而在另一端删除元素27.
6、在下面的 4 个关键字中用来说明虚函数的是(分数:2.00)A.virtualB.publicC.protectedD.private28.下列描述中正确的是(分数:2.00)A.软件工程只是解决软件项目的管理问题B.软件工程主要解决软件产品的生产率问题C.软件工程的主要思想是强调在软件开发过程中需要应用工程化原则D.软件工程只是解决软件开发中的技术问题29.已知 n 是一个 int 型变量,下列语句中错误的是(分数:2.00)A.long*p=new long;B.long p;C.long*p=new long(;D.long p10;30.执行语句序列 ofstream outfile(
7、“DATADAT“); if()cout“OK“;else cout“FAIL“; 后,如果文件打开成功显示“OK“,否则就显示“FAIL“。由此可知,上面 if 语句的处的表达式应是(分数:2.00)A.outfilfail()或 outfileB.outfilgood()或!outfileC.outfilgood()或 outfileD.outfilfail()或!outfile31.有如下程序: #includeiostream using namespace std; int s=0; class sample static int n; public: sample(int i) n
8、=i; static void add() s+=n; ; int sample:s=0; int main() sample a(2),b(5); sample:add(); coutsendl; return 0; 程序运行后的输出结果是(分数:2.00)A.2B.5C.7D.332.下面有关重载函数的说法中正确的是(分数:2.00)A.重载函数必须具有不同的返回值类型B.重载函数形参个数必须不同C.重载函数必须有不同的形参列表D.重载函数名可以不同33.下列对变量的引用中,错误的是(分数:2.00)A.int a; int else return 1+GetLen(str+1); (分数
9、:2.00)填空项 1:_42.下面程序的输出结果是_。 #includeiostream using namespace std; int x; void funA(int return m; (分数:2.00)填空项 1:_49.下列程序的输出结果是_。 #includeiostream using namespace std; class base public: int n; base(int x) n=x; virtual void set(int m) n=m;cout n ; ;class deriveA:public base public: deriveA(int x):ba
10、se(x) void set(int m) n += m;cout n ; ; class deriveB:public base public: deriveB(int x):base(x) void set(int m) n +m; cout n ; ; int main() deriveA d1(1); deriveBd2(3); base *pbase; pbase=。在 C+中,允许在函数的说明或定义时给一个或多个参数指定默认值。但一旦为某个给定参数定义了缺省值,必须为后继的所有参数也定义缺省值。由此可知,选项 D 是错误的。3.关于友元,下列说法错误的是(分数:2.00)A.如果类
11、 A 是类 B 的友元,那么类 B 也是类 A 的友元 B.如果函数 fun()被说明为类 A 的友元,那么在 fun()中可以访问类 A 的私有成员C.友元关系不能被继承D.如果类 A 是类 B 的友元,那么类 A 的所有成员函数都是类 B 的友元函数解析:解析 本题考核友元类和友元函数。友元关系是单向的,并且只在两个类之间有效。即使类 X 是类 Y 的友元,类 Y 是否是类 X 的友元也要看类 X 中是否有相应的声明。即友元关系不具有交换性,所以 A选项的说法是错误的。类的友元函数可以直接访问该类的所有成员;类 A 是类 B 的友元类,那么类 A 的所有成员函数都是类 B 的友元函数。4.
12、下列运算符中不能在 C+中重载的是(分数:2.00)A.?: B.+C.-D.=解析:解析 本题考核运算符的重载。C+中,“:、*、?:”这 4 个运算符不能重载。5.下列关于 E-R 图的描述中正确的是(分数:2.00)A.E-R 图只能表示实体之间的联系B.E-R 图只能表示实体和实体之间的联系C.E-R 图只能表示实体和属性D.E-R 图能表示实体、属性和实体之间的联系 解析:解析 E-R 图中,用 3 种图框分别表示实体、属性和实体之间的联系:矩形框表示实体,框内标明实体名;椭圆状框表示实体的属性,框内标明属性名;菱形框表示实体间的联系,框内标明联系名;实体与其属性之间以无向边连接,菱
13、形框与相关实体之间也用无向边连接,并在无向边旁标明联系的类型。 综上所述,用 E-R 图不仅可以简单明了地描述实体及其相互之间的联系,还可以方便地描述多个实体集之间的联系和一个实体集内部实体之间的联系。选项 A、B、C 的说法都错误,本题的正确答案是 D。6.在软件设计中,不属于过程设计工具的是(分数:2.00)A.PDL(过程设计语言)B.PAD 图C.N-S 图D.DFD 图 解析:解析 数据流图 DFD,是结构化分析方法最主要的一种图形工具,不属于过程设计工具。7.用树形结构来表示实体之间联系的模型称为(分数:2.00)A.关系模型B.层次模型 C.网状模型D.数据模型解析:解析 在数据
14、库系统中,由于采用的数据模型不同,相应的数据库管理系统 (DBMS)也不同。目前常用的数据模型有 3 种:层次模型、网状模型和关系模型。 在层次模型中,实体之间的联系是用树结构来表示的,其中实体集(记录型)是树中的结点,而树中各结点之间的连线表示它们之间的关系。所以,本题的正确答案是 B。8.重载输入流运算符必须使用的原型为(分数:2.00)A.istream int main() C obj; return 0; 执行后的输出结果是(分数:2.00)A.CBAB.BACC.ACBD.ABC 解析:解析 本题考核类的继承与派生。派生类构造函数执行的一般次序如下:首先调用基类构造函数,调用顺序按
15、照它们被继承时说明的顺序。然后调用子对象的构造函数,调用顺序按照它们在类中的说明顺序。最后是派生类构造函数中的内容。题中,类 A 是基类,类 C 是基类 A 的派生类,类 B 的对象 b 是类 C的私有成员。所以最后的输出为 ABC。19.有以下类定义 class MyClass private: int id; char gender; char*phone; public: MyClass():id(0),gender(#),phone(NULL) MyClass(int no,char ge=#,char*ph=NULL) id=no;gender=ge;phone=ph; ; 下列类对
16、象定义语句中错误的是(分数:2.00)A.MyClassmyObj;B.MyClassmyObj(11,“13301111155“); C.MyClassmyObj(12,m);D.MyClassmyObj(12);解析:解析 本题考核构造函数的应用。对象建立用初始化列表对数据成员进行时,列表中的参数类型要与构造函数中形参类型一致。B 选项中第二个参数为“13301111155”是字符串,而构造函数中第二个形参为 char 型,两者不一致造成错误。20.在 C+语言中函数返回值的类型是由( )决定的。(分数:2.00)A.调用该函数时系统临时B.return 语句中的表达式类型C.定义该函数时
17、所指定的函数类型 D.调用该函数时的主调函数类型解析:解析 本题考查对函数定义的掌握程度。函数类型决定了函数返回值的,类型。函数值返回类型可以由编译器自动完成类型转换。在函数有返回值的调用中,编译器将 return 后面的表达式的类型强制转换为该函数定义时指定的返回值类型。21.关于类和对象描述错误的是(分数:2.00)A.对象(Objec 是现实世界中的客观事物,对象具有确定的属性B.类是具有相同属性和行为的一组对象的集合C.对象是类的抽象,类是对象的实例 D.类是对象的抽象,对象是类的实例解析:解析 C+中,类是用户自定义的一种数据类型,对象是类的实例,类定义了属于该类的所有对象的共同特性
18、。一个类作为一种数据类型,它可以定义多个对象。22.C+流中重载了运算符,它是一个(分数:2.00)A.用于输出操作的成员函数B.用于输入操作的成员函数C.用于输入操作的非成员函数D.用于输出操作的非成员函数 解析:解析 本题考核运算符的重载。C+流中重载了和,其中用于有格式输入,用于有格式输出,且都重载为非成员函数。23.若有如下程序: #includeiostream using namespaces std; int s=0; class sample static int n; public: sample(int i) n=i; static void add() s+=n; );
19、int sample:s=0; int main() sample a(2),b(5); sample:add(); coutsendl; return 0; 程序运行后的输出结果是(分数:2.00)A.2B.5 C.7D.3解析:解析 本题考核静态数据成员和静态成员函数的应用;程序中定义一个类 sample,它包括一个静态数据成员 n 和一个静态成员函数 add,并在类的构造函数中给类私有静态数据成员 n 赋值。 在主函数main 中,定义对象 a(2)时,通过构造函数使静态数据成员 n 的值变为 2,在定义对象 b(5)时,通过构造函数使静态数据成员 n=5(覆盖了前面的 n=2),再执行
20、 sample:add()使全局变量 s=5。24.有如下程序: #includeiostream using namespace std; class AA int n; public: AA(int k):n(k) int get()return n;) int get()constreturn n+1; ; int main() AA a(5); const AA b(6); coutaget()bget(); return 0; 执行后的输出结果是(分数:2.00)A.55B.57 C.75D.77解析:解析 本题考核常成员函数和函数的重载。所谓函数重载,是指同一个函数名可以对应着多个
21、函数的实现,类 AA 中定义了两个 get()函数,一个为普通成员函数,另一个为常成员函数。一般对象 a 既可以调用普通成员函数 get,也可以调用常成员函数 get,但是由于常成员函数不能更新对象的数据成员,所以题中通过对象 a 调用的函数为普通成员函数 get(),返回值为 5。常对象 b 只能调用常成员函数,所以题中通过对象 b 调用的函数为常成员函数 get(),返回值为 7。25.已知下列语句中的 x 和 y 都是 int 型变量,其中错误的语句是(分数:2.00)A.x=y+;B.x=+y;C.(x+ D.+x=y;解析:解析 本题考核 C+表达式类型及求值规则。 自加运算符+是单
22、目运算符,运算对象必须为变量,不能是常量和表达式,C 选项中+的对象是表达式,故错误。26.下列关于栈的描述正确的是(分数:2.00)A.在栈中只能插入元素而不能删除元素B.在栈中只能删除元素而不能插入元素C.栈是特殊的线性表,只能在一端插入或删除元素 D.栈是特殊的线性表,只能在一端插入元素,而在另一端删除元素解析:解析 栈是一种特殊的线性表,其插入与删除运算都只在线性表的一端进行。 由此可见,选项A、选项 B 和选项 D 错误,正确答案是选项 C。27.在下面的 4 个关键字中用来说明虚函数的是(分数:2.00)A.virtual B.publicC.protectedD.private解
23、析:解析 C+中说明虚函数的方法为:virtual类型说明符函数名(参数表);。其中,被关键词 virtual 说明的函数称为虚函数。28.下列描述中正确的是(分数:2.00)A.软件工程只是解决软件项目的管理问题B.软件工程主要解决软件产品的生产率问题C.软件工程的主要思想是强调在软件开发过程中需要应用工程化原则 D.软件工程只是解决软件开发中的技术问题解析:解析 软件工程学是研究软件开发和维护的普遍原理与技术的一门工程学科。所谓软件工程是指,采用工程的概念、原理、技术和方法指导软件的开发与维护。软件工程学的主要研究对象包括软件开发与维护的技术、方法、工具和管理等方面。由此可见,选项 A、B
24、 和 D 的说法均不正确,选项 C 正确。29.已知 n 是一个 int 型变量,下列语句中错误的是(分数:2.00)A.long*p=new long;B.long p; C.long*p=new long(;D.long p10;解析:解析 本题考核指针、数组和关键字 new。说明一维数组的一般形式为:数据类型数组名数组长度;在此数组长度必须常量表达式,它是一个整常数。B) 选项中 n 是一个 int 型变量不是常数,所以是错误的。选项 A、C 使用 new 获得动态内存空间,它的操作数可以带有初始值表达式或元素个数,A 选项的形式表示数组元素的个数,C 选项的形式表示为变量*p 赋初值
25、n。30.执行语句序列 ofstream outfile(“DATADAT“); if()cout“OK“;else cout“FAIL“; 后,如果文件打开成功显示“OK“,否则就显示“FAIL“。由此可知,上面 if 语句的处的表达式应是(分数:2.00)A.outfilfail()或 outfileB.outfilgood()或!outfileC.outfilgood()或 outfile D.outfilfail()或!outfile解析:解析 本题考核 C+的文件 I/O 操作。函数 good()表示刚进行的操作成功时返回 true,否则返回false,所以可以通过类 ofstrea
26、m 的对象 outfile 调用 good()函数来检测刚才文件打开是否成功。题中在建立文件流对象的同时打开文件,若打开失败则返回 fail。所以“outfile”也可以用作判断打开文件成功与否的条件。31.有如下程序: #includeiostream using namespace std; int s=0; class sample static int n; public: sample(int i) n=i; static void add() s+=n; ; int sample:s=0; int main() sample a(2),b(5); sample:add(); cou
27、tsendl; return 0; 程序运行后的输出结果是(分数:2.00)A.2B.5 C.7D.3解析:解析 本题考核静态数据成员和静态成员函数的应用。程序中定义一个类 sample,它包括一个静态数据成员 n 和一个静态成员函数 add,并在类的构造函数中给类私有静态数据成员 n 赋值。在主函数main 中,定义对象 a(2)时,通过构造函数使静态数据成员 n 的值变为 2,在定义对象 b(5)时,通过构造函数使静态数据成员 n=5(覆盖了前面的 n=2),再执行 sample:add()使全局变量 s=5。32.下面有关重载函数的说法中正确的是(分数:2.00)A.重载函数必须具有不同
28、的返回值类型B.重载函数形参个数必须不同C.重载函数必须有不同的形参列表 D.重载函数名可以不同解析:解析 函数重载允许用同一个函数名定义多个函数。被重载的函数必须要有不同的形参列表。不可以根据函数返回值类型来重载函数。33.下列对变量的引用中,错误的是(分数:2.00)A.int a; int else return 1+GetLen(str+1); (分数:2.00)填空项 1:_ (正确答案:*str=NULL 或!*str 或*str=0 或*sir=0或 str0=/0或 str0=或 str0 =ULL0)解析:解析 本题考核递归函数的定义。递归函数 GetLen 的定义中给出了递
29、归方式,但缺少递归终止的条件,所以横线处应填入的递归终止的条件。显然此函数递归终止的条件是读到了字符串的终止符/0,此时返回的值为 042.下面程序的输出结果是_。 #includeiostream using namespace std; int x; void funA(int return m; (分数:2.00)填空项 1:_ (正确答案:m=ai)解析:解析 本题考核函数模板、if 语句、for 循环。函数模板 max()的功能是返回数组 a 中最大元素的值。所以当 ai的值比当前所保存的最大值大时,应该将 ai的值赋值给 m。49.下列程序的输出结果是_。 #includeiost
30、ream using namespace std; class base public: int n; base(int x) n=x; virtual void set(int m) n=m;cout n ; ;class deriveA:public base public: deriveA(int x):base(x) void set(int m) n += m;cout n ; ; class deriveB:public base public: deriveB(int x):base(x) void set(int m) n +m; cout n ; ; int main() d
31、eriveA d1(1); deriveBd2(3); base *pbase; pbase=&d1; pbase-set(1); pbase= &d2; pbase-set(2); return 0; (分数:2.00)填空项 1:_ (正确答案:25)解析:解析 本题考核虚函数的定义和调用。在 C+中,一个基类指针(或引用)可以用来指向它的派生类对象,而且通过这样的指针 (或引用)调用虚函数时,被调用的是该指针(或引用)实际所指向的对象类的那个重定义版本。题中基类成员函数 set()被定义成虚函数,而且其派生类 deriveA 和 deriveB 都有函数 set()的重定义版本,所以通过指针 pbase 的两次调用分别调用的是派生类 deriveA 和 deriveB 中定义的版本,即输出 25。