国家二级C++机试(运算符重载、模板和C++流)模拟试卷6
(总分:58.00,做题时间:90分钟)
一、 选择题(总题数:29,分数:58.00)
1.若在表达式y/x中,''/''是作为成员函数重载的运算符,则该表达式还可以表示为( )。
(分数:2.00)
(分数:2.00)
A.x.operator/(y)
B.operator/(x,y)
C.y.operator/(x) √
D.operator/(y,x)
解析:解析:运算符函数的函数名是由运算符前加关键字operator构成的。所以当“/”作为运算符重载后,其格式为operator/。所以其作为成员函数调用时的格式为y.operator/(x)。
2.有类定义如下: class Type{ public: Type(int i=0); Type operator-(int); friend Type operator+(Type,Type); private: int val; }; 若有对象定义Type c1;则下列语句序列中,错误的是( )。
(分数:2.00)
(分数:2.00)
A.Type(3)+c1;
B.e1+Type(3);
C.3-c1: √
D.c1-3;
解析:解析:由于在类Type中对“-”进行了重载,所以根据“-”重载的形式定义,c1-3是正确的,而3-c1是错误的表达式。
3.若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是( )。
(分数:2.00)
(分数:2.00)
A.Data+(Data);
B.Data operator+{Data}; √
C.Data+operator{Data};
D.operator+(Data,Data);
解析:解析:“+”是一个二元运算符,因此作为成员函数重载时参数表中只有一个参数,对应于第二个操作数,而第一个操作数是对象本身。运算符函数的函数名是由运算符前加关键字operator构成的。
4.若要对类BigNumber中重载的类型转换运算符long进行声明,下列选项中正确的是( )。
(分数:2.00)
(分数:2.00)
A.operator long()const; √
B.operator long(bigNumber);
C.long operator long()const;
D.long operator long(BjgNumber);
解析:解析:在重载类型转换符时,由于运算符本身已经表示出返回值类型,因此不需要返回值类型的声明。
5.有如下类模板定义: template<typename T> class BigNumber{ long n: public: BigNumber(T i):n(i){} BigNumber operator+(BigNumber b){ return BigNtmaber(n+b.n); } } 已知b1、b2是,BigNumber的两个对象,则下列表达式中错误的是( )。
(分数:2.00)
(分数:2.00)
A.b1+b2
B.b1+3
C.3+b1 √
D.3+3
解析:解析:C++运算符的重载有两个方式,一种是做为成员函数,另一种是做为友元函数。
前种C++默认省略第一个参数(事实上是对象本身),而后一种是所有的参数都要写全。比如对加法的重载:成员方式为Coperator operator+(Coperator&op);,在调用的过程中我们可以理解为result=operator+(op);友元方式为friend Coperator operator.(Coperator&op1,Coperator&op2);,在调用的过程中我们可以理解为result=operator-(op1,op2);。 对于本题题来说,整数3与b1相加时,3是诚型,b1是BigNumber<T>型,int型不能和别的型做运算。
6.为类Matrix重载下列运算符时,只能作为Matrix类成员函数重载的运算符是( )。
(分数:2.00)
(分数:2.00)
A.+
B.= √
C.<<
D.++
解析:解析:在C++中,=、[]、()、->以及所有的类型转换运算符只能作为成员函数重载。
7.有如下类定义 class MyClass public: _________ Private: int data; }; 若要为MyClass类重载流输入运算符>>,使得程序中可以“cin>>obj;”形式输入MyClass类的对象obj,则横线处的声明语句应为( )。
(分数:2.00)
(分数:2.00)
A.friend istream&operator>>(istream&is,MyClass&a); √
B.friend istream&operator>>(istream&is,MyClass a);
C.istream&operator>>(istream&is,MyClass&a);
D.istream&operator>>(istream&is,MyClass a);
解析:解析:C++的输入运算符>>作为非类成员函数重载。在一个类中,可将输入运算符>>声明为友元函数,在类MyClass重载输入运算符>>的形式如选项A所示。
8.若为Fraction类重载前增1运算符++,应在类体中将其声明为( )。
(分数:2.00)
(分数:2.00)
构造函数可以被重载 A.Fraction&operator++(); √
B.Fraction&operator++(int);
C.friend Fraction&operator++();
D.friend Fraction&operator++(int);
解析:解析:在类Fraction中重载前增1运算符++时,其声明形式为Fraction&operator++();在类Fraction中重载后增1运算符十+时,其声明形式为Fraction&operatorH(int);。
9.若需要为XV类重载乘法运算符,运算结果为XV类型,在将其声明为类的成员函数时,下列原型声明正确的是( )。
(分数:2.00)
(分数:2.00)
A.XV operator*(XV,XV);
B.XV*(XV);
C.operator*(XV);
D.XV operator*(XV); √
解析:解析:“*”是一个二元运算符,在作为成员函数重载时参数表中只有一个参数,对应于第二个操作数,而第一个操作数就是对象本身,仅以this指针的形式隐藏在参数表中。
10.已知类MyClock中未显式定义构造函数,并重载了加法运算符,使得下面的语句序列能够正确执行: MyClock c1,c2; //…… c2=c1+10; 由此可知:为类MyClock重载的“+”运算符函数的声明是( )。
(分数:2.00)
(分数:2.00)
A.friend MyClock operator+(MyClock,int); √
B.friend MyClock operator+(MyClock,MyClock);
C.friend MyClock operator+(int,MyClock);
D.MyClock operator+(MyClock);
解析:解析:由表达式c2=c1+10可知,在对“+”进行重载时,第一操作数是MyClock类的对
象,而第二操作数是一个整型数据。
11.已知将运算符''+''和''*''作为类Complex的成员函数重载,设c1和c2是类Complex的对象,则表达式c1+c2*c1等价于( )。
(分数:2.00)
(分数: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))
解析:解析:表达式c1+c2*c1的含义是c1加上c2与c1的积。
12.下列运算符不能重载为友元函数的是( )。
(分数:2.00)
(分数:2.00)
A.=() [] -> √
B.+ - ++ --
C.> < >= <=
D.+= -= *= /=
解析:解析:此题考查的是运算符重载的概念。c1++语言规定,=、[]、()、->以及所有的类型转换运算符只能作为成员函数重载,如果要重载为友元函数就必须重载为非成员函数。
13.若要重载+、=、<<、==和[]运算符,则必须作为类成员重载的运算符是( )。
(分数:2.00)
(分数:2.00)
A.+和=
B.=和<<
C.==和<<
D.=和[] √
解析:解析:=、[]、()、->以及所有的类型转换运算符只能作为成员函数重载,而且不能是针对枚举类型操作数的重载。
14.在类中重载赋值运算符时,应将其声明为类的( )。
(分数:2.00)
(分数:2.00)
A.静态函数
B.友元函数
C.成员函数 √
D.构造函数
解析:解析:赋值运算符只能作为类的成员函数重载。
15.下列关于模板的叙述中,错误的是( )。
(分数:2.00)
(分数:2.00)
A.模板声明中的第一个符号总是关键字template
B.在模板声明中用<和>括起来的部分是模板的形参表
C.类模板不能有数据成员 √
D.在一定条件下函数模板的实参可以省略
解析:解析:此题考查模板的概念。模板的一般说明形式如下:template类型形参表函数返回值类型函数名(形参表){函数体},所以选项A、B正确。函数模板的实参在一定条件下是可以省略的,所以选项C错误。
16.有如下函数模板定义: template<class T> T func(T x,T y){return x*x+y*y;} 在下列对func的调用中,错误的是( )。
(分数:2.00)
(分数:2.00)
A.func(3,5);
B.func(3.0,5.5);
C.func(3,5.5); √
D.func<int>(3,5.5);
解析:解析:此题考查的是函数模板的使用。引用模板函数和引用一般函数在语法形式上基本相同。需要注意的是说明一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中的对应形参。本题C选项中,编译系统从第一个参数“3”获得信息“int”和从第二个参数获得信息“double”两者矛盾,错误;A、B选项正确:D选项中,函数名后的<int>是模板实参表,编译系统会将double型的形参“5.5”自动转化成int类型。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论