1、国家二级 C+机试(运算符重载、模板和 C+流)模拟试卷 7 及答案解析(总分:58.00,做题时间:90 分钟)一、选择题(总题数:29,分数:58.00)1.下列关于函数模板的描述中,正确的是( )。(分数:2.00)A.函数模板是一个实例函数B.使用函数模板定义的函数没有返回类型C.函数模板的类型参数与函数的参数相同D.通过使用不同的类型参数,可以从函数模板得到不同的实例函数2.有如下函数模板定义: templatetypename T1,Typename T2 T1 Fun(T2 n) return n*50; 若要求以 int 型数据 9 作为函数实参调用该模板,并返回一个 doub
2、le 型数据,则该调用应表示为( )。(分数:2.00)A.FUN(9)B.FUN9C.FUNdouble9D.FUN9(double)3.下列关于模板的描述中,错误的是( )。(分数:2.00)A.类模板的成员函数都是模板函数B.函数模板是一种参数化类型的函数C.满足一定条件时可以省略模板实参D.模板形参只能由关键字 typename 声明4.已知主函数中通过如下语句序列实现对函数模板 swap 的调用: int a10,b10; swap(a,b,10);下列对函数模板 swap 的声明中,会导致上述语句序列发生编译错误的是( )。(分数:2.00)A.templatetypename T
3、 void swap(T a,T b,int size);B.templatetypename T void swap(int size,T a,T b);C.templatetypename T1,typename T2 void swap(T1 a,T2 b,int size;D.templateclass T1,class T2 void swap(T1 a,T2 b,int size);5.在定义函数模板或类模板时,开头的保留字是( )。(分数:2.00)A.typenameB.templateC.classD.typedef6.若有函数模板 mySwap 和一些变量定义如下:( )。
4、 templateclass Tvoid mySwap(T x,T y); double d1,d2;int i1,i2; 下列对 mySwap 的调用中,错误的是(分数:2.00)A.mySwap(i1,i2)B.mySwap(d1,d2)C.mySwap(i1,d 1)D.mySwapint(i2,d2)7.模板对类型的参数化提供了很好的支持,因此( )。(分数:2.00)A.类模板的主要作用是生成抽象类B.类模板实例化时,编译器将根据给出的模板实参生成一个类C.在类模板中的数据成员都具有同样类型D.类模板中的成员函数都没有返回值8.关于关键字 class 和 typename,下列表述中
5、正确的是( )。(分数:2.00)A.程序中的 typename 都可以替换为 classB.程序中的 class 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型9.下列关于类模板的模板参数的叙述中,错误的是( )。(分数:2.00)A.模板参数可以作为数据成员的类型B.模板参数可以作为成员函数的返回类型C.模板参数可以作为成员函数的参数类型D.模板参数不能作为成员函数的局部变量的类型10.下列模板声明中,有语法错误的是( )。(分数:2.00)A.templatetypen
6、ame TT fun(T x)return x;B.templatetypename TT fun(T x,int n)return x*n;C.templateclass TT fun(T*p)return*p;D.templateclass TT classAT n;11.在定义一个类模板时,模板形参表是用一对括号括起来的,所采用的括号是( )。(分数:2.00)A.( )B. C. D. )12.有如下模板声明: templatetypename T 1,typename T2ClaSS A; 下列声明中,与上述声明不等价的是( )。(分数:2.00)A.templateclass T1
7、,class T2class A;B.templateclass T1,typename T2class A;C.templatetypename T1,class T2class A;D.templatetypename T1,T2class A;13.若 MyTemp 是一个只有一个虚拟类型参数的类模板,且有如下语句序列 MyTempdoublep2; MyTemplongp32; 编译系统在处理上面的语句序列时,所生成的模板 MyTemp 的实例的个数是( )。(分数:2.00)A.1B.2C.3D.014.下列关于模板的叙述中,错误的是( )。(分数:2.00)A.调用模板函数时,有时
8、可以省略模板实参B.函数模板的每个实例就是一个函数定义C.类模板的每个实例就是一个类定义D.类模板的实例是一个类对象15.下列类模板的定义中语法格式错误的是( )。(分数:2.00)A.templateclass Tclass Buffer*;B.templatetypename Tclass Buffer*;C.templateclass T1,class T2class Buffer*;D.templateTclass Buffer*;16.下列关于 C+流的说明中,正确的是( )。(分数:2.00)A.与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现B.从流中获取数据的操作称为插
9、入操作,向流中添加数据的操作称为提取操作C.cin 是一个预定义的输入流类D.输出流有一个名为 open 的成员函数,其作用是生成一个新的流对象17.在语句 cindata;中,cin 是( )。(分数:2.00)A.C+的关键字B.类名C.对象名D.函数名18.如果利用 C+流进行输入输出,下面的叙述中正确的是( )。(分数:2.00)A.只能借助于流对象进行输入输出B.只能进行格式化输入输出C.只能借助于 cin 和 tout 进行输入输出D.只能使用运算符和进行输入输出19.下列有关 C+流的叙述中,错误的是( )。(分数:2.00)A.C+操作符 setw 设置的输出宽度永久有效B.C
10、+操作符 endl 可以实现输出的回车换行C.处理文件 IO 时,要包含头文件 fstreamD.进行输入操作时,eof()函数用于检测是否到达文件尾20.在语句“coutA:”中,cout 是( )。(分数:2.00)A.类名B.对象名C.函数名D.C+的关键字21.下列关于 C+流的描述中,错误的是( )。(分数:2.00)A.coutA表达式可输出字符 AB.eof()函数可以检测是否到达文件尾C.对磁盘文件进行流操作时,必须包含头文件 fstreamD.以 ios base:out 模式打开的文件不存在时,将自动建立一个新文件22.在 C+中,cin 是一个( )。(分数:2.00)A
11、.类B.对象C.模板D.函数23.下列关于 C+预定义流对象的叙述中,正确的是( )。(分数:2.00)A.cin 是 C+预定义的标准输入流对象B.cin 是 C+预定义的标准输入流类C.cout 是 C+预定义的标准输入流对象D.cout 是 C+预定义的标准输入流类24.C+系统预定了 4 个用于标准数据流的对象,下列选项中不属于此类对象的是( )。(分数:2.00)A.coutB.cinC.cerrD.cset25.要利用 C+流实现输入输出的各种格式控制,必须在程序中包含的头文件是( )。(分数:2.00)A.fstreamB.istrearaC.ostreamD.iomanip26
12、.在 C+中,打开一个文件时与该文件建立联系的是( )。(分数:2.00)A.流对象B.模板C.函数D.类27.下列关于输入输出流的叙述中,正确的是( )。(分数:2.00)A.一个文件流可以与一个数据文件相联系B.cin 是专门从键盘输入数据的输入流类C.流运算符用来从输入流中读取数据D.宽度设置的效果永久有效28.在 C+中既可以用于文件输入又可以用于文件输出的流类是( )。(分数:2.00)A.fstrearnB.ifstreamC.ofstreamD.iostream29.对于语句 coutendlx 中的各个组成部分,下列叙述中错误的是( )。(分数:2.00)A.cout是一个输出
13、流对象B.endl“的作用是输出回车换行C.x是一个变量D.称作提取运算符国家二级 C+机试(运算符重载、模板和 C+流)模拟试卷 7 答案解析(总分:58.00,做题时间:90 分钟)一、选择题(总题数:29,分数:58.00)1.下列关于函数模板的描述中,正确的是( )。(分数:2.00)A.函数模板是一个实例函数B.使用函数模板定义的函数没有返回类型C.函数模板的类型参数与函数的参数相同D.通过使用不同的类型参数,可以从函数模板得到不同的实例函数 解析:解析:函数模板是一系列相关函数的模型或样板,这些函数的源代码相同,只是所针对的数据类型不同。数据类型成了函数模板的参数,所以函数模板是一
14、种参数化类型的函数。2.有如下函数模板定义: templatetypename T1,Typename T2 T1 Fun(T2 n) return n*50; 若要求以 int 型数据 9 作为函数实参调用该模板,并返回一个 double 型数据,则该调用应表示为( )。(分数:2.00)A.FUN(9)B.FUN9C.FUNdouble9 D.FUN9(double)解析:解析:根据函数模板的定义,在选项 C 的调用中,把 double 类型传递给 T1,int 型传递给 T2。3.下列关于模板的描述中,错误的是( )。(分数:2.00)A.类模板的成员函数都是模板函数B.函数模板是一种参
15、数化类型的函数C.满足一定条件时可以省略模板实参D.模板形参只能由关键字 typename 声明 解析:解析:同一模板的声明和定义中,模板形参的名字不必相同。每个模板类型形参前面必须带上关键字 typenameclass,每个非类型形参前面必须带上类型名字。4.已知主函数中通过如下语句序列实现对函数模板 swap 的调用: int a10,b10; swap(a,b,10);下列对函数模板 swap 的声明中,会导致上述语句序列发生编译错误的是( )。(分数:2.00)A.templatetypename T void swap(T a,T b,int size);B.templatetype
16、name T void swap(int size,T a,T b); C.templatetypename T1,typename T2 void swap(T1 a,T2 b,int size;D.templateclass T1,class T2 void swap(T1 a,T2 b,int size);解析:解析:由题目中函数 swap(a,b,10)调用语句可知,在对函数模板 swap 的声明语句中,应将第一、二个参数设为数组变量,第三个参数为整型变量。5.在定义函数模板或类模板时,开头的保留字是( )。(分数:2.00)A.typenameB.template C.classD.
17、typedef解析:解析:定义函数模板或类模板时,开头的保留字是 template。6.若有函数模板 mySwap 和一些变量定义如下:( )。 templateclass Tvoid mySwap(T x,T y); double d1,d2;int i1,i2; 下列对 mySwap 的调用中,错误的是(分数:2.00)A.mySwap(i1,i2)B.mySwap(d1,d2)C.mySwap(i1,d 1) D.mySwapint(i2,d2)解析:解析:按照函数模板 mySwap 的定义,变量 x 和 y 应该是同一类型,而在选项 C 的定义中变量 i1和 d1 属于不同的数据类型。
18、7.模板对类型的参数化提供了很好的支持,因此( )。(分数:2.00)A.类模板的主要作用是生成抽象类B.类模板实例化时,编译器将根据给出的模板实参生成一个类 C.在类模板中的数据成员都具有同样类型D.类模板中的成员函数都没有返回值解析:解析:此题考查了类模板的概念。在定义对象的过程中,系统会自动地根据需要生成相应的类定义,这种依据类模板生成具体类的过程称为类模板的实例化。8.关于关键字 class 和 typename,下列表述中正确的是( )。(分数:2.00)A.程序中的 typename 都可以替换为 class B.程序中的 class 都可以替换为 typenameC.在模板形参表
19、中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型解析:解析:此题考查的是 class 和 typename 两个关键字。关键字 class 除了能用来定义类以外还能用来声明模板的虚拟类型参数。在用作声明虚拟类型参数时 typename 与 class 可以互换,但不能使用typename 来定义类;在模板形参表中除了可以用 typename 和 Class 声明虚拟类型参数外,还可以使用普通类型声明常规函数,故选项 C 错误。9.下列关于类模板的模板参数的叙述中,错误的是( )。(分数:2.00)A.模板参数可以作为数据成
20、员的类型B.模板参数可以作为成员函数的返回类型C.模板参数可以作为成员函数的参数类型D.模板参数不能作为成员函数的局部变量的类型 解析:解析:此题考查的是模板参数。模板参数是一种参数化的数据模型,在模板类或模板函数中,只要使用数据类型的地方都能使用模板参数来代表一种未知的数据类型。所以,模板参数可以作为成员函数的局部变量类型。10.下列模板声明中,有语法错误的是( )。(分数:2.00)A.templatetypename TT fun(T x)return x;B.templatetypename TT fun(T x,int n)return x*n;C.templateclass TT
21、fun(T*p)return*p;D.templateclass TT classAT n; 解析:解析:第四个选项是定义类模板的,但是 class 前面的 T 是多余的。对于第二个选项,同一个类的对象相乘还是同一个类的对象,但是可能要考虑溢出的问题。11.在定义一个类模板时,模板形参表是用一对括号括起来的,所采用的括号是( )。(分数:2.00)A.( )B. C. D. )解析:解析:声明一个类模板的格式是:template模板形参声明类声明。12.有如下模板声明: templatetypename T 1,typename T2ClaSS A; 下列声明中,与上述声明不等价的是( )。(
22、分数:2.00)A.templateclass T1,class T2class A;B.templateclass T1,typename T2class A;C.templatetypename T1,class T2class A;D.templatetypename T1,T2class A; 解析:解析:在类模板中,数据类型本身成了它的参数,因而是一种参数化类型的类,是类的生成器。声明一个类模板的格式是:template模板形参表声明类声明,模板形参表声明是由一个或多个模板形参组成。对于本题来说,模板形参表中包括类型 T1 和 T2 两个类型参数,而在选项 D)中 T1 说明其类型,
23、而 T2 没有说明其类型,与题干中的模板说明不一致。13.若 MyTemp 是一个只有一个虚拟类型参数的类模板,且有如下语句序列 MyTempdoublep2; MyTemplongp32; 编译系统在处理上面的语句序列时,所生成的模板 MyTemp 的实例的个数是( )。(分数:2.00)A.1B.2C.3 D.0解析:解析:p2 是一个 double 型的 MyTemp,p32是一个 long型 MyTemp 数组,其中包括两个元素。所以共有 3 个 MyTemp 的实例。14.下列关于模板的叙述中,错误的是( )。(分数:2.00)A.调用模板函数时,有时可以省略模板实参B.函数模板的每
24、个实例就是一个函数定义C.类模板的每个实例就是一个类定义D.类模板的实例是一个类对象 解析:解析:在定义对象的过程中,编译系统会自动地根据需要生成相应的类定义,这种依据类模板生成类定义的过程称为类模板的实例化。类模板实例化所生成的每一个类定义就是相应类模板的一个实例。15.下列类模板的定义中语法格式错误的是( )。(分数:2.00)A.templateclass Tclass Buffer*;B.templatetypename Tclass Buffer*;C.templateclass T1,class T2class Buffer*;D.templateTclass Buffer*; 解
25、析:解析:定义类模板的一般形式是: template类型名参数名 1,类型名参数名 2, class 类名 类声明体; 模板的类型参数由关键字 class 或关键字 typename 及其后的标识符构成。在模板参数表中关键字 class 和 typename 的意义相同。16.下列关于 C+流的说明中,正确的是( )。(分数:2.00)A.与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现 B.从流中获取数据的操作称为插入操作,向流中添加数据的操作称为提取操作C.cin 是一个预定义的输入流类D.输出流有一个名为 open 的成员函数,其作用是生成一个新的流对象解析:解析:此题考查的是
26、C+流的概念。从输入流中提取数据称为提取操作,把表达式插入到输出流中的操作称为插入操作,故选项 B 错误;cin 是一个预定义的输入流对象而不是流类,故选项 C 错误;输入输出流中没有 open 成员函数,故选项 D 错误。17.在语句 cindata;中,cin 是( )。(分数:2.00)A.C+的关键字B.类名C.对象名 D.函数名解析:解析:此题考查的是预定义流对象。C+有 4 个预定义的流对象:cin 一标准输入;cout-一标准输出;cerr 一标准出错信息输出;clog 一带缓冲的标准出错信息输出。18.如果利用 C+流进行输入输出,下面的叙述中正确的是( )。(分数:2.00)
27、A.只能借助于流对象进行输入输出 B.只能进行格式化输入输出C.只能借助于 cin 和 tout 进行输入输出D.只能使用运算符和进行输入输出解析:解析:此题考查的知识点是 C+流。利用 C+流既可以进行有格式输入输出,也可以进行无格式输入输出,所以选项 B 错误;C+的 4 个预定义的流对象为:cin 一标准输入,cout 一标准输出,cerr-一标准出错信息输出,clog 一带缓冲的标准出错信息输出,选项 C 错误;C+流除了可以使用提取“”插入“”进行输入输出外,还可以通过流对象的一些成员函数进行输入输出,故选项 D 错误。19.下列有关 C+流的叙述中,错误的是( )。(分数:2.00
28、)A.C+操作符 setw 设置的输出宽度永久有效 B.C+操作符 endl 可以实现输出的回车换行C.处理文件 IO 时,要包含头文件 fstreamD.进行输入操作时,eof()函数用于检测是否到达文件尾解析:解析:此题考查的是 C+流。C+操作符 setw()的作用是设置输入输出宽度,且只对当前一次有效,并非永久有效,故选项 A 叙述错误。20.在语句“coutA:”中,cout 是( )。(分数:2.00)A.类名B.对象名 C.函数名D.C+的关键字解析:解析:C+有四个预定义的流对象:cin 标准输,cout 标准输出,cerr 标准出错信息输出,clog 带缓冲的标准出错信息输出
29、。21.下列关于 C+流的描述中,错误的是( )。(分数:2.00)A.coutA表达式可输出字符 A B.eof()函数可以检测是否到达文件尾C.对磁盘文件进行流操作时,必须包含头文件 fstreamD.以 ios base:out 模式打开的文件不存在时,将自动建立一个新文件解析:解析:cout 是一个标准输出流对象。称之为提取运算符,它的功能是从输入流中提取数据赋值给一个变量。为插入运算符,其功能是把表达式的值插入到输出流中。当系统执行 coutx 操作时,首先根据 x 值的类型调用相应的插入运算符重载器函数,把 x 的值传送给对应的形参,接着执行函数体,把 x 的值输出到显示器屏幕上,
30、在当前屏幕光标位置处显示出来,然后返回 ostream 流,以便继续使用插入运算符输出下一个表达式的值。对于本题来说,要输出字符A的值应该写成 coutA。因而选项 A 是错误的。22.在 C+中,cin 是一个( )。(分数:2.00)A.类B.对象 C.模板D.函数解析:解析:cin 为 istream 流类的对象。23.下列关于 C+预定义流对象的叙述中,正确的是( )。(分数:2.00)A.cin 是 C+预定义的标准输入流对象 B.cin 是 C+预定义的标准输入流类C.cout 是 C+预定义的标准输入流对象D.cout 是 C+预定义的标准输入流类解析:解析:cin 为 istr
31、eam 流类的标准输入对象,标准输入设备就是指键盘。24.C+系统预定了 4 个用于标准数据流的对象,下列选项中不属于此类对象的是( )。(分数:2.00)A.coutB.cinC.cerrD.cset 解析:解析:C+流有 4 个预定义的流对象,它们分别是:ein 标准输入:cout 标准输出;cerr 标准出错信息输出;clog 带缓冲的标准出错信息输出。25.要利用 C+流实现输入输出的各种格式控制,必须在程序中包含的头文件是( )。(分数:2.00)A.fstreamB.istrearaC.ostreamD.iomanip 解析:解析:要使用 setw、fixed 等操作符,须包含 i
32、omanip 这个文件。26.在 C+中,打开一个文件时与该文件建立联系的是( )。(分数:2.00)A.流对象 B.模板C.函数D.类解析:解析:在 C+中,打开一个文件时与该文件建立联系的是流对象。27.下列关于输入输出流的叙述中,正确的是( )。(分数:2.00)A.一个文件流可以与一个数据文件相联系 B.cin 是专门从键盘输入数据的输入流类C.流运算符用来从输入流中读取数据D.宽度设置的效果永久有效解析:解析:当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的流对象,另一个是文件对象。程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文
33、件系统对所连接的文件对象产生作用。28.在 C+中既可以用于文件输入又可以用于文件输出的流类是( )。(分数:2.00)A.fstrearn B.ifstreamC.ofstreamD.iostream解析:解析:文件流以磁盘文件以及其他可按文件方式进行管理的外部设备为输入输出对象。ifstream是文件输入流类,ofstream 是文件输出流类,fstream 是文件输入输出流类,当使用 cin、cout 的预定义流对象进行针对标准设备的 IO 操作,则需要使用 iostream 文件。29.对于语句 coutendlx 中的各个组成部分,下列叙述中错误的是( )。(分数:2.00)A.cout是一个输出流对象B.endl“的作用是输出回车换行C.x是一个变量D.称作提取运算符 解析:解析:此题考查的是 C+语言的输出流。符号“”是预定义插入符,提取运算符是“”。