1、二级 C+-167 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:42,分数:100.00)1.下面是重载为非成员函数的运算符的函数原型,其中错误的是_。(分数:2.00)A.Fraction operator+(Fraction,Fraction);B.Fraction operator-(Fraction);C.FractionD.Fraction2.若需要为 XV 类重载乘法运算符,运算结果为 XV 类型,在将其声明为类的成员函数时,下列原型声明正确的是_。(分数:2.00)A.XV operator *(XV,XV)B.XV *(XV)C.operator
2、*(XV)D.XV operator *(XV);3.已知将运算符“+”和“*”作为类 Complex 的成员函数重载,设 c1 和 c2 是类 Complex 的对象,则表达式 c1+c2*c1 等价于_。(分数:2.00)A.c1.operator*(c2.operator+(c1)B.c1.operator+(c2.operator*(c1)C.c1.operator*(c1.operator+(c2)D.c2.operator+(c1.operator*(c1)4.若在表达式“y/x”中,“/”是作为成员函数重载的运算符,则该表达式还可以表示为_。(分数:2.00)A.Operator
3、/(y)B.operator/(x,y)C.operator/(x)D.operator/(y,x)5.已知类 MyClock 中未显式定义构造函数,并重载了加法运算符,使得下面的语句序列能够正确执行: MyClock c1,c2; / c2=c1+10; 由此可知,为类 MyClock 重载的“+”运算符函数的声明是_。(分数:2.00)A.friend MyClock operator+(MyClock,int);B.friend MyClock operator+(MyClock,MyClock);C.friend MyClock operator+(int,MyClock);D.MyC
4、lock operator+(MyClock);6.有类定义如下: class Type public: Type(int i=0); Type operator-(int); friend Type operator+(Type,Type); private: int val: 若有对象定义“Type c1;”,则下列语句序列中,错误的是_。(分数:2.00)A.Type(3)+c1;B.c1+Type(3);C.3-c1;D.c1-3;7.若为 Fraction 类重载前增 1 运算符“+”,应在类体中将其声明为_(分数:2.00)A.FractionB.FractionC.friend
5、FractionD.friend Fraction8.若要对类 BigNumber 中重载的类型转换运算符 long 进行声明,下列选项中正确的是_。(分数:2.00)A.operator long()const;B.operator long(BigNumber);C.long operator long()const;D.long operator long(BigNumber);9.有如下程序: #includeiostream #includecstring using namespace std; class MyString public: char str80; MyString
6、(const char*s) strcpy(str,s); MyString return*this; ; ostream int main() MyString x(“abc“),y(“cde“); cout(x+=y)endl; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.abcB.cdeC.abcdeD.abccde10.在类中重载赋值运算符时,应将其声明为类的_。(分数:2.00)A.静态函数B.友元函数C.成员函数D.构造函数11.下列关于赋值运算符“=”重载的叙述中,正确的是_。(分数:2.50)A.赋值运算符只能作为类的成员函数重载B.默认的赋值运算符实
7、现了“深层复制”功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果己经定义了复制(拷贝)构造函数,就不能重载赋值运算符12.为类 Matrix 重载下列运算符时,只能作为 Matrix 类成员函数重载的运算符是_。(分数:2.50)A.+B.=C.D.+13.有如下类定义: class MyClass public: _ private; int data; ; 若要为 MyClass 类重载流输入运算符“”,使得程序中可以“cinobj;”形式输入 MyClass 类的对象 obj,则横线处的声明语句应为_。(分数:2.50)A.friend istreamB.friend istr
8、eamC.istreamD.istream14.若要重载+、=、=和运算符,则必须作为类成员重载的运算符是_。(分数:2.50)A.+和=B.=和C.=和D.=和15.下列运算符中,可以重载为类的友元函数的运算符是_。(分数:2.50)A.=B.()CD.16.关于运算符重载,下列表述中正确的是_。(分数:2.50)A.C+已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型C.在类型转换符函数的定义中不需耍声明返回类型D.可以通过运算符重载来创建 C+中原来没有的运算符17.下列关于运算符重载的叙述中,正确的是_。(分数:2.50)A.可以通过重载创造出新的运算符B.可以
9、为重载运算符函数的参数设置默认值C.可以将部分运算符函数重载为非成员函数D.可以将任意运算符函数重载为静态成员函数18.下列关于运算符重载的叙述中,正确的是_。(分数:2.50)A.不能改变重载运算符的优先级B.运算符只能重载为类的成员函数C.C+中已有的任何运算符都可以重载D.可以为重载运算符函数的参数设置默认值19.关于关键字 class 和 typename,下列表述中正确的是_。(分数:2.50)A.程序中的 typename 都可以替换为 classB.程序中的 class 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只
10、能用 class 或 typename 来声明参数的类型20.关于在调用模板函数时模板实参的使用,下列表述中正确的是_。(分数:2.50)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略21.下列函数模板声明中,合法的是_。(分数:2.50)A.templatetypename TT abs(T x);B.template classTT abs(T x)
11、;C.template Tclass Tabs(T x);D.templateT abs(T x);22.下列模板声明中,有语法错误的是_。(分数:2.50)A.templatetypename TT fun(T x)return x*x;B.templatetypename TT fun(T x,int n)return x+n;C.templateclass TT fun(T*p)return*p;D.templateclass TT fun()return T;23.若有函数模板 mySwap 和一些变量定义如下: templateclass T void mySwap(T X,T Y)
12、; double d1,d2;int i1,i2; 下列对 mySwap 的调用中,错误的是_。(分数:2.50)A.mvSwap(i1,i2)B.mySwap(d1,d2)C.mySwap(i1,d1)D.mySwapint(i2,d2)24.有函数模板声明和一些变量定义如下: templateclass T1,class T2,class T3T1 sum(T2,T3); double d1,d2; 则下列调用中,错误的是_。(分数:2.50)A.sumdouble,double,double(d1,d2);B.sumdouble;double(d1,d2);C.sumdouble(d1,
13、d2);D.sum(d1,d2);25.已知主函数中通过如下语句序列实现对函数模板 swap 的调用: int a10,b10; swap(a,b,10); 下列对函数模板 swap 的声明中,会导致上述语句序列发生编译错误的是_。(分数:2.50)A.templatetypename Tvoid swap(T a,T b,int size);B.templatetypename Tvoid swap(int size,T a,T b);C.templatetypename T1,typename T2void swap(T1 a,T2 b,int size);D.templateclass
14、T1,class T2void swap(T1 a,T2 b,int size);26.有如下函数模板定义: tempiatetypename T1,typename T2 T1 FUN(T2 n)return n*5.0; 若要求以 int 型数据 9 作为函数实参调用该模板,并返回一个 double 型数据,则该调用应表示为_。(分数:2.50)A.FUN(9)B.FUN9C.FUNdouble(9)D.FUN9(double)27.下列类模板的定义中语法格式错误的是_。(分数:2.50)A.templateclass Tclass Buffer/*.*/;B.templatetypena
15、me Tclass Buffer/*.*/;C.templateclass T1,class r12class Buffer/*.*/;D.templateTclass Buffer/*.*/;28.下列关于模板的叙述中错误的是_。(分数:2.50)A.调用模板函数时,有时可以省略模板实参B.函数模板的每个实例就是一个函数定义C.类模板的每个实例就是一个类定义D.类模板的实例是一个类对象29.下列关于模板的描述中,错误的是_。(分数:2.50)A.类模板的成员函数都是模板函数B.函数模板是一种参数化类型的函数C.满足一定条件时可以省略模板实参D.模板形参只能由关键字 typename 声明30
16、.下列关于 C+流的表述中,正确的是_。(分数:2.50)A.与每个输入或输出设备的信息交换都可以通过流类来实现B.从流中获取数据的操作称为插入操作C.cin 是一个预定义的输入流类D.向流中添加数据的操作称为提取操作31.下列关于 C+流的描述中,错误的是_。(分数:2.50)A.cout“A“表达式可输出字符 AB.eof()函数可以检测是否到达文件尾C.对磁盘文件进行流操作时,必须包含头文件 fstreamD.以 ios_base:out 模式打开的文件不存在时,将自动建立一个新文件32.在 C+流的输入输出格式控制中,使用操作符 setw,可以控制_。(分数:2.50)A.输出精度B.
17、输出宽度C.对齐方式D.填充字符33.有如下程序: #includeiostream #includeiomanip using namespace std;_ int main() coutsetw(10)serfill(“x“)setprecision(8)left; cout12.3456793_98765; return 0; 若程序的输出是 12.345679x98765xxxxx,则划线处缺失的部分是_。(分数:2.50)A.setw(10)B.setfill(“x“)C.setprecision(8)D.right34.有如下程序: #includeiostream #inclu
18、deiomanip using namespace std; int main() coutsetfill(“#“)setw(4)“OK“123endl; return 0; 运行这个程序的输出结果是_。(分数:2.50)A.#OK123B.#OK#123C.OK#123D.OK#123#35.有如下程序: #includeiomanip #includeiostream using namespace std; int main() coutsetfill(“*“)setw(6)123456; return 0; 运行时的输出结果是_。(分数:2.50)A.*123*456B.*123456
19、*C.*123456D.12345636.下列控制对齐方式的操作符中,错误的是_。(分数:2.50)A.internalB.centerC.leftD.right37.在 C+中既可以用于文件输入又可以用于文件输出的流类是_。(分数:2.50)A.fstreamB.ifstreamC.ofstreamD.iostream38.在 C+中,打开一个文件时与该文件建立联系的是_。(分数:2.50)A.流对象B.模板C.函数D类39.下列关于输入输出流的叙述中,正确的是_。(分数:2.50)A.一个文件流可以与一个数据文件相联系B.cin 是专门从键盘输入数据的输入流类C.流运算符用来从输入流中读取
20、数据D.宽度设置的效果永久有效40.下列关于文件流的描述中,正确的是_。(分数:2.50)A.文件流只能完成针对磁盘文件的输入输出B.建立一个文件流对象时,必须同时打开一个文件C.若输入流要打开的文件不存在,将建立一个新文件D.若输出流要打开的文件不存在,将建立一个新文件41.有如下语句序列: ifstream infile(“DATA.DAT“); if(infile.good()cout“A“; else cout“B“; ofstream outfile(“DATA.DAT“); if(outfile.fail()cout“C“; else cout“D“; 执行这个语句序列显示的是 B
21、D,则说明文件 DATA.DAT_。(分数:2.50)A.以读方式打开成功B.以读方式打开失败,但以写方式打开成功C.以读方式打开失败,以写方式打开也失败D.以读方式打开成功,以写方式打开也成功42.若目前 D 盘根目录下并不存在 test.txt 文件,则下列打开文件方式不会自动创建 test.txt 文件的是_。(分数:2.50)A.ifstream fin; fin.open(“d:/test.txt“,los_base:in);B.fstream fio; fio.open(“d:/test.txt“,los_base:out);C.ofstream four; fout.open(“
22、d:/test.txt“,ios_base:out);D.ofstream fout; four.open(“d:/test.txt“,los_base:app);二级 C+-167 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:42,分数:100.00)1.下面是重载为非成员函数的运算符的函数原型,其中错误的是_。(分数:2.00)A.Fraction operator+(Fraction,Fraction);B.Fraction operator-(Fraction);C.Fraction D.Fraction解析:2.若需要为 XV 类重载乘法运算符,运算结果为
23、 XV 类型,在将其声明为类的成员函数时,下列原型声明正确的是_。(分数:2.00)A.XV operator *(XV,XV)B.XV *(XV)C.operator *(XV)D.XV operator *(XV); 解析:3.已知将运算符“+”和“*”作为类 Complex 的成员函数重载,设 c1 和 c2 是类 Complex 的对象,则表达式 c1+c2*c1 等价于_。(分数:2.00)A.c1.operator*(c2.operator+(c1)B.c1.operator+(c2.operator*(c1) C.c1.operator*(c1.operator+(c2)D.c2
24、.operator+(c1.operator*(c1)解析:4.若在表达式“y/x”中,“/”是作为成员函数重载的运算符,则该表达式还可以表示为_。(分数:2.00)A.Operator/(y)B.operator/(x,y)C.operator/(x) D.operator/(y,x)解析:5.已知类 MyClock 中未显式定义构造函数,并重载了加法运算符,使得下面的语句序列能够正确执行: MyClock c1,c2; / c2=c1+10; 由此可知,为类 MyClock 重载的“+”运算符函数的声明是_。(分数:2.00)A.friend MyClock operator+(MyClo
25、ck,int); B.friend MyClock operator+(MyClock,MyClock);C.friend MyClock operator+(int,MyClock);D.MyClock operator+(MyClock);解析:6.有类定义如下: class Type public: Type(int i=0); Type operator-(int); friend Type operator+(Type,Type); private: int val: 若有对象定义“Type c1;”,则下列语句序列中,错误的是_。(分数:2.00)A.Type(3)+c1;B.c1
26、+Type(3);C.3-c1; D.c1-3;解析:7.若为 Fraction 类重载前增 1 运算符“+”,应在类体中将其声明为_(分数:2.00)A.Fraction B.FractionC.friend FractionD.friend Fraction解析:8.若要对类 BigNumber 中重载的类型转换运算符 long 进行声明,下列选项中正确的是_。(分数:2.00)A.operator long()const; B.operator long(BigNumber);C.long operator long()const;D.long operator long(BigNumb
27、er);解析:9.有如下程序: #includeiostream #includecstring using namespace std; class MyString public: char str80; MyString(const char*s) strcpy(str,s); MyString return*this; ; ostream int main() MyString x(“abc“),y(“cde“); cout(x+=y)endl; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.abcB.cdeC.abcdeD.abccde 解析:10.在类中重载
28、赋值运算符时,应将其声明为类的_。(分数:2.00)A.静态函数B.友元函数C.成员函数 D.构造函数解析:11.下列关于赋值运算符“=”重载的叙述中,正确的是_。(分数:2.50)A.赋值运算符只能作为类的成员函数重载 B.默认的赋值运算符实现了“深层复制”功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果己经定义了复制(拷贝)构造函数,就不能重载赋值运算符解析:12.为类 Matrix 重载下列运算符时,只能作为 Matrix 类成员函数重载的运算符是_。(分数:2.50)A.+B.= C.D.+解析:13.有如下类定义: class MyClass public: _ priva
29、te; int data; ; 若要为 MyClass 类重载流输入运算符“”,使得程序中可以“cinobj;”形式输入 MyClass 类的对象 obj,则横线处的声明语句应为_。(分数:2.50)A.friend istream B.friend istreamC.istreamD.istream解析:14.若要重载+、=、=和运算符,则必须作为类成员重载的运算符是_。(分数:2.50)A.+和=B.=和C.=和D.=和 解析:15.下列运算符中,可以重载为类的友元函数的运算符是_。(分数:2.50)A.=B.()CD. 解析:16.关于运算符重载,下列表述中正确的是_。(分数:2.50)
30、A.C+已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型C.在类型转换符函数的定义中不需耍声明返回类型 D.可以通过运算符重载来创建 C+中原来没有的运算符解析:17.下列关于运算符重载的叙述中,正确的是_。(分数:2.50)A.可以通过重载创造出新的运算符B.可以为重载运算符函数的参数设置默认值C.可以将部分运算符函数重载为非成员函数 D.可以将任意运算符函数重载为静态成员函数解析:18.下列关于运算符重载的叙述中,正确的是_。(分数:2.50)A.不能改变重载运算符的优先级 B.运算符只能重载为类的成员函数C.C+中已有的任何运算符都可以重载D.可以为重载运算符函数
31、的参数设置默认值解析:19.关于关键字 class 和 typename,下列表述中正确的是_。(分数:2.50)A.程序中的 typename 都可以替换为 class B.程序中的 class 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型解析:20.关于在调用模板函数时模板实参的使用,下列表述中正确的是_。(分数:2.50)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的
32、最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略 解析:21.下列函数模板声明中,合法的是_。(分数:2.50)A.templatetypename TT abs(T x); B.template classTT abs(T x);C.template Tclass Tabs(T x);D.templateT abs(T x);解析:22.下列模板声明中,有语法错误的是_。(分数:2.50)A.templatetypename TT fun(T x)return x*x;B.templatetypen
33、ame TT fun(T x,int n)return x+n;C.templateclass TT fun(T*p)return*p;D.templateclass TT fun()return T; 解析:23.若有函数模板 mySwap 和一些变量定义如下: templateclass T void mySwap(T X,T Y); double d1,d2;int i1,i2; 下列对 mySwap 的调用中,错误的是_。(分数:2.50)A.mvSwap(i1,i2)B.mySwap(d1,d2)C.mySwap(i1,d1) D.mySwapint(i2,d2)解析:24.有函数模
34、板声明和一些变量定义如下: templateclass T1,class T2,class T3T1 sum(T2,T3); double d1,d2; 则下列调用中,错误的是_。(分数:2.50)A.sumdouble,double,double(d1,d2);B.sumdouble;double(d1,d2);C.sumdouble(d1,d2);D.sum(d1,d2); 解析:25.已知主函数中通过如下语句序列实现对函数模板 swap 的调用: int a10,b10; swap(a,b,10); 下列对函数模板 swap 的声明中,会导致上述语句序列发生编译错误的是_。(分数:2.5
35、0)A.templatetypename Tvoid swap(T a,T b,int size);B.templatetypename Tvoid swap(int size,T a,T b); C.templatetypename T1,typename T2void swap(T1 a,T2 b,int size);D.templateclass T1,class T2void swap(T1 a,T2 b,int size);解析:26.有如下函数模板定义: tempiatetypename T1,typename T2 T1 FUN(T2 n)return n*5.0; 若要求以 i
36、nt 型数据 9 作为函数实参调用该模板,并返回一个 double 型数据,则该调用应表示为_。(分数:2.50)A.FUN(9)B.FUN9C.FUNdouble(9) D.FUN9(double)解析:27.下列类模板的定义中语法格式错误的是_。(分数:2.50)A.templateclass Tclass Buffer/*.*/;B.templatetypename Tclass Buffer/*.*/;C.templateclass T1,class r12class Buffer/*.*/;D.templateTclass Buffer/*.*/; 解析:28.下列关于模板的叙述中错
37、误的是_。(分数:2.50)A.调用模板函数时,有时可以省略模板实参B.函数模板的每个实例就是一个函数定义C.类模板的每个实例就是一个类定义 D.类模板的实例是一个类对象解析:29.下列关于模板的描述中,错误的是_。(分数:2.50)A.类模板的成员函数都是模板函数B.函数模板是一种参数化类型的函数C.满足一定条件时可以省略模板实参D.模板形参只能由关键字 typename 声明 解析:30.下列关于 C+流的表述中,正确的是_。(分数:2.50)A.与每个输入或输出设备的信息交换都可以通过流类来实现 B.从流中获取数据的操作称为插入操作C.cin 是一个预定义的输入流类D.向流中添加数据的操
38、作称为提取操作解析:31.下列关于 C+流的描述中,错误的是_。(分数:2.50)A.cout“A“表达式可输出字符 A B.eof()函数可以检测是否到达文件尾C.对磁盘文件进行流操作时,必须包含头文件 fstreamD.以 ios_base:out 模式打开的文件不存在时,将自动建立一个新文件解析:32.在 C+流的输入输出格式控制中,使用操作符 setw,可以控制_。(分数:2.50)A.输出精度B.输出宽度 C.对齐方式D.填充字符解析:33.有如下程序: #includeiostream #includeiomanip using namespace std;_ int main()
39、 coutsetw(10)serfill(“x“)setprecision(8)left; cout12.3456793_98765; return 0; 若程序的输出是 12.345679x98765xxxxx,则划线处缺失的部分是_。(分数:2.50)A.setw(10) B.setfill(“x“)C.setprecision(8)D.right解析:34.有如下程序: #includeiostream #includeiomanip using namespace std; int main() coutsetfill(“#“)setw(4)“OK“123endl; return 0;
40、 运行这个程序的输出结果是_。(分数:2.50)A.#OK123 B.#OK#123C.OK#123D.OK#123#解析:35.有如下程序: #includeiomanip #includeiostream using namespace std; int main() coutsetfill(“*“)setw(6)123456; return 0; 运行时的输出结果是_。(分数:2.50)A.*123*456B.*123456*C.*123456 D.123456解析:36.下列控制对齐方式的操作符中,错误的是_。(分数:2.50)A.internalB.center C.leftD.ri
41、ght解析:37.在 C+中既可以用于文件输入又可以用于文件输出的流类是_。(分数:2.50)A.fstream B.ifstreamC.ofstreamD.iostream解析:38.在 C+中,打开一个文件时与该文件建立联系的是_。(分数:2.50)A.流对象 B.模板C.函数D类解析:39.下列关于输入输出流的叙述中,正确的是_。(分数:2.50)A.一个文件流可以与一个数据文件相联系 B.cin 是专门从键盘输入数据的输入流类C.流运算符用来从输入流中读取数据D.宽度设置的效果永久有效解析:40.下列关于文件流的描述中,正确的是_。(分数:2.50)A.文件流只能完成针对磁盘文件的输入
42、输出B.建立一个文件流对象时,必须同时打开一个文件 C.若输入流要打开的文件不存在,将建立一个新文件D.若输出流要打开的文件不存在,将建立一个新文件解析:41.有如下语句序列: ifstream infile(“DATA.DAT“); if(infile.good()cout“A“; else cout“B“; ofstream outfile(“DATA.DAT“); if(outfile.fail()cout“C“; else cout“D“; 执行这个语句序列显示的是 BD,则说明文件 DATA.DAT_。(分数:2.50)A.以读方式打开成功B.以读方式打开失败,但以写方式打开成功 C
43、.以读方式打开失败,以写方式打开也失败D.以读方式打开成功,以写方式打开也成功解析:42.若目前 D 盘根目录下并不存在 test.txt 文件,则下列打开文件方式不会自动创建 test.txt 文件的是_。(分数:2.50)A.ifstream fin; fin.open(“d:/test.txt“,los_base:in); B.fstream fio; fio.open(“d:/test.txt“,los_base:out);C.ofstream four; fout.open(“d:/test.txt“,ios_base:out);D.ofstream fout; four.open(“d:/test.txt“,los_base:app);解析: