1、二级 C+-113 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:46,分数:100.00)1.下列运算符函数中肯定不属于类 FunNumber 的成员函数的是_。(分数:2.00)A.int operator-(FunNumber);B.FunNumber operator-();C.FunNumber operator-(int);D.int operator-(FunNumber,FunNumber);2.下列是重载乘法运算符的函数原型声明,其中错误的是_。(分数:2.00)A.MyClass operator*(double,double);B.MyClas
2、s operator*(double,MyClass);C.MyClass operator*(MyClass,double);D.MyClass operator*(MyClass,MyClass);3.已知 Value 是一个类,Value 是 Value 的一个对象。下列以非成员函数形式重载的运算符函数原形中,正确的是_。(分数:2.00)A.Value operator+(Value v,int i);B.Value operator+(Value v=value,int i);C.Value operator+(Value vint i=0);D.Value operator+(Va
3、lue v=value,int i=0);4.有如下程序: #includeiostream Using namespace std; Class Amount int amount; public; Amount(int n=0):amount(n) Int getAmount()constreturn amount; Amount return ; ; int main() Amount x(3),y(7); x+=y; coutx.getAmount()endl; return 0; 已知程序的运行结果是 10,则下划线处缺失的表达式是_。(分数:2.00)A.*thisB.thisC.
4、 class Pair int m; int n; public: Pair(int i,int j):m(i),n(j) bool operator(Pair P)const; /须在类体外给出定义 ; int main() Pair p1(3,4),p2(4,3),p3(4,5); cout(p1p2)(p2p1)(p2p3)(p3p2); return 0; 运算符函数。perator的功能是比较两个 Pair 对象的大小,当左边对象大时,返回 true,否则返回false。比较规则是首先比较两对象的 m 成员,m 大者为大:当 m 相等时比较 n,n 大者为大。程序输出0101,下列对
5、运算符重载函数的正确定义是_。(分数:2.00)A.bool Pair:operator(Pair p)constif(m!=p.m)return mp.m;return np.n;B.bool Pair:operator(Pair P)if(m!=p.m)return mp.m;return np.n;C.bool Pair:operator(Pair p)constif(mp.m)return true;return np.n;D.bool Pair:operator(Pair P)if(mp.m)return true;return np.n;8.将运算符重载为类成员函数时,其参数表中没
6、有参数,说明该运算符是_。(分数:2.00)A.不合法的运算符B.一元运算符C.无操作数的运算符D.二元运算符9.将前缀运算符“-”重载为非成员函数,下列原型中,能正确用于类中说明的是_。(分数:2.00)A.DecrB.Decr operator-(DecrC.friend DecrD.friend Decr operator-(Decr10.将运算符“+”重载为非成员函数,下列原型声明中,错误的是_。(分数:2.00)A.MycloCk operator+(MyClock,long);B.MycloCk operator+(MyClock,MyClock);C.MycloCk operat
7、or+(long,long);D.MycloCk operator+(long,MyClock);11.下列关于赋值运算符“=”重载的叙述中,正确的是_。(分数:2.00)A.赋值运算符只能作为类的成员函数重载B.默认的赋值运算符实现了“深层复制”功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果已经定义了复制(拷贝)构造函数,就不能重载赋值运算符12.若在表达式 y/x 中,“/“是作为成员函数重载的运算符,则该表达式还可以表示为_。(分数:2.00)A.operator/(y)B.operator/(x,y)C.operator/(x)D.operator/(y,x)13.有类定义
8、如下: 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;14.若要对 Data 类中重载的加法运算符成员函数进行声明,下列选项中正确的是_。(分数:2.00)A.Data+(Data);B.Data operator+Data;C.Data+operatorData;D.
9、operator+(Data,Data);15.若要对类 BigNumber 中重载的类型转换运算符 long 进行声明,下列选项中正确的是_。(分数:2.00)A.operator long()const;B.operator long(bigNumber);C.long operator long()const;D.long operator long(BigNumber);16.有如下类模板定义: templatetypename T class BigNumber longn ; public: BigNumber(T i):n(i) BigNumber operator+(BigNu
10、mber b) return BigNumber(n+b.n); 已知 b1、b2 是 BigNumber 的两个对象,则下列表达式中错误的是_。(分数:2.00)A.b1+b2B.b1+3C.3+b1D.3+317.为类 Matrix 重载下列运算符时,只能作为 Matrix 类成员函数重载的运算符是_。(分数:2.00)A.+B.=C.D.+18.有如下类定义 class MyClass public: _ Private: int data; ; 若要为 MyClass 类重载流输入运算符,使得程序中可以“cinobj;”形式输入 MyClass 类的对象 obj,则横线处的声明语句应为
11、_。(分数:2.00)A.friend istreamB.friend istreamC.istreamD.istream19.若为 Fraction 类重载前增 1 运算符+,应在类体中将其声明为_。(分数:2.00)A.FractionB.FractionC.friend FractionD.friend Fraction20.若需要为 XV 类重载乘法运算符,运算结果为 XV 类型,在将其声明为类的成员函数时,下列原型声明正确的是_。(分数:2.00)A.XV operator*(XV,XV);B.XV*(XV);C.operator*(XV);D.XV operator*(XV);21
12、.己知类 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.MyClock operator+(MyClock);22.已知将运算符“+”和“*”作为类 Complex
13、 的成员函数重载,设 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)23.下列运算符不能重载为友元函数的是_。(分数:2.00)A.= () -B.+ - + -C. = =D.+= -= *= /=24.若要重载+、=、=和运算符,则必须作为类成员重载的运算符是_。(分数:2.00)A.+和=
14、B.=和C.=和D.=和25.在类中重载赋值运算符时,应将其声明为类的_。(分数:2.00)A.静态函数B.友元函数C.成员函数D.构造函数26.下列关于模板的叙述中,错误的是_。(分数:2.00)A.模板声明中的第一个符号总是关键字 templateB.在模板声明中用和括起来的部分是模板的形参表C.类模板不能有数据成员D.在一定条件下函数模板的实参可以省略27.有如下函数模板定义: templateclass T T func(T x,T y)return x*x+y*y; 在下列对 func 的调用中,错误的是_。(分数:2.00)A.func(3,5);B.func(3.0,5.5);C
15、.func(3,5.5);D.funcint(3,5.5);28.有如下函数模板: templatetypename T,typename U T cast(U u)return u; 其功能是将 U 类型数据转换为 T 类型数据。已知 i 为 int 型变量,下列对模板函数 cast 的调用中正确的是_。(分数:2.00)A.cast(i);B.cast(i);C.castchar*,int(i);D.castdouble,int(i);29.关于在调用模板函数时模板实参的使用,下列表述正确的是_。(分数:2.00)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息
16、,则都可以省略B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略30.有如下函数模板: templateclass TT square(T x)return x*x; 其中 T 是_。(分数:2.00)A.函数形参B.函数实参C.模板形参D.模板实参31.下列函数模版中的定义中,合法的是_。(分数:2.00)A.templatetypename TT abs(T x)return x0?-x:x;B.template classTT abs(T
17、x)return x0?-x:x;C.template Tclass Tabs(T x)return x0?-x:x;D.template T abs(T x)return x0?-x:x;32.C+中的模板包括_。(分数:2.00)A.对象模板和函数模板B.对象模板和类模板C.函数模板和类模板D.变量模板和对象模板33.下列有关模板的叙述中,正确的是_。(分数:2.00)A.函数模板不能含有常规形参B.函数模板的一个实例就是一个函数定义C.类模板的成员函数不能是模板函数D.用类模板定义对象时,绝对不能省略模板实参34.下面是一个模板声明的开始部分: templutetypename Tdou
18、ble_ 由此可知_。(分数:2.00)A.这可能是一个函数模板的声明B.这可能是一个类模板的声明C.这既可能是一个函数模板的声明,也可能是一个类模板的声明D.这肯定是一个错误的模板声明35.下列关于模板的叙述中,错误的是_。(分数:2.00)A.调用模版函数时,在一定条件下可以省略模板实参B.可以用 int、double 这样的类型修饰符来声明模版参数C.模板声明中的关键字 class 都可以用关键字 typename 替代D.模板的形参表中可以有多个参数36.下列关于函数模板的描述中,错误的是_。(分数:2.00)A.从模板实参表和从模板函数实参表获得信息矛盾时,以模板实参的信息为准B.对
19、于常规参数所对应的模板实参,任何情况下都不能省略C.虚拟类型参数没有出现在模板函数的形参表中时,不能省略模板实参D.模板参数表不能为空37.下列关于模板形参的描述中,错误的是_。(分数:2.00)A.模板形参表必须在关键字 template 之后B.模板形参表必须用括弧()括起来C.可以用 class 修饰模板形参D.可以用 typename 修饰模板形参38.下列关于类模板的描述中,错误的是_。(分数:2.00)A.类模板的成员函数都是模板函数B.可以为类模板参数设置默认值C.类模板描述了一组类D.类模板中只允许有一个类型参数39.下列关于模板的叙述中,正确的是_。(分数:3.00)A.如果
20、一个类中存在纯虚函数,这个类就是类模板B.函数模板不能有形式参数表C.类模板是一种参数化类型的类,是类的生成器D.类模板中不能包含构造函数40.有函数模板声明和一些变量定义如下: templateclass T1,class T2,class T3T1 sum(T2,T3); double d1,d2; 则下列调用中,错误的是_。(分数:3.00)A.sumdouble,double,double(d1,d2);B.sumdouble,double(d1,d2);C.sumdouble(d1,d2);D.sum(d1,d2);41.下列关于函数模板的描述中,正确的是_。(分数:3.00)A.函
21、数模板是一个实例函数B.使用函数模板定义的函数没有返回类型C.函数模板的类型参数与函数的参数相同D.通过使用不同的类型参数,可以从函数模板得到不同的实例函数42.有如下函数模板定义: templatetypename T1,Typename T2 T1 Fun(T2 n)return n*5.0; 若要求以 int 型数据 9 作为函数实参调用该模板,并返回一个 double 型数据,则该调用应表示为_。(分数:3.00)A.FUN(9)B.FUN9C.FUNdouble9D.FUN9(double)43.下列关于模板的描述中,错误的是_。(分数:3.00)A.类模板的成员函数都是模板函数B.
22、函数模板是一种参数化类型的函数C.满足一定条件时可以省略模板实参D.模板形参只能由关键字 typename 声明44.已知主函数中通过如下语句序列实现对函数模板 swap 的调用: int a10,b10; swap(a,b,10); 下列对函数模板 swap 的声明中,会导致上述语句序列发生编译错误的是_。(分数:3.00)A.templatetypename Tvoid swap(Ta,Tb,int size);B.templatetypename Tvoid swap(int size,Ta,Tb);C.templatetypename T1,typename T2void swap(T
23、1 a,T2 b,int size;D.templateclass T1,class T2void swap(T1 a,T2 b,int size);45.在定义函数模板或类模板时,开头的保留字是_。(分数:3.00)A.typenameB.templateC.classD.typedef46.若有函数模板 mySwap 和一些变量定义如下:_。 templateclass Tvoid mySwap(T x,T y); double d1,d2;int i1,i2; 下列对 mySwap 的调用中,错误的是(分数:3.00)A.mySwap(i1,i2)B.mySwap(d1,d2)C.myS
24、wap(i1,d1)D.mySwapint(i2,d2)二级 C+-113 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:46,分数:100.00)1.下列运算符函数中肯定不属于类 FunNumber 的成员函数的是_。(分数:2.00)A.int operator-(FunNumber);B.FunNumber operator-();C.FunNumber operator-(int);D.int operator-(FunNumber,FunNumber); 解析:解析 此题考查的是运算符“-”的重载。“-”运算符有一元和二元两种,且均可以重载为成员函数和非成员
25、函数。运算符重载为成员函数时,形参个数一般为运算符元数减 l;重载为非成员函数时,形参个数一般和运算符元数相等。所以,“-”运算符重载为成员函数时,参数可以是 0 个或 1 个;而重载为非成员函数时,参数个数可以是 1 个或 2 个。所以 D 选项,肯定是重载为非成员函数。2.下列是重载乘法运算符的函数原型声明,其中错误的是_。(分数:2.00)A.MyClass operator*(double,double); B.MyClass operator*(double,MyClass);C.MyClass operator*(MyClass,double);D.MyClass operator
26、*(MyClass,MyClass);解析:解析 此题考查的是运算符重载。本题中,选项 A 重载运算符“*”使用的形参是两个 double,而系统中的“*”运算原本就能计算两个 double,所以这样违反了重载函数的原则,当执行 a*b 这样的表达式时,系统不能识别是否执行运算符重载函数。故答案是 A 选项。3.已知 Value 是一个类,Value 是 Value 的一个对象。下列以非成员函数形式重载的运算符函数原形中,正确的是_。(分数:2.00)A.Value operator+(Value v,int i);B.Value operator+(Value v=value,int i);
27、 C.Value operator+(Value vint i=0);D.Value operator+(Value v=value,int i=0);解析:解析 此题考查的是重载加法运算符“+”。“+”是二元运算符,其第一操作数是对象本身,i为第二操作数,由此可知选项 B 正确。4.有如下程序: #includeiostream Using namespace std; Class Amount int amount; public; Amount(int n=0):amount(n) Int getAmount()constreturn amount; Amount return ; ;
28、int main() Amount x(3),y(7); x+=y; coutx.getAmount()endl; return 0; 已知程序的运行结果是 10,则下划线处缺失的表达式是_。(分数:2.00)A.*this B.thisC. class Pair int m; int n; public: Pair(int i,int j):m(i),n(j) bool operator(Pair P)const; /须在类体外给出定义 ; int main() Pair p1(3,4),p2(4,3),p3(4,5); cout(p1p2)(p2p1)(p2p3)(p3p2); retur
29、n 0; 运算符函数。perator的功能是比较两个 Pair 对象的大小,当左边对象大时,返回 true,否则返回false。比较规则是首先比较两对象的 m 成员,m 大者为大:当 m 相等时比较 n,n 大者为大。程序输出0101,下列对运算符重载函数的正确定义是_。(分数:2.00)A.bool Pair:operator(Pair p)constif(m!=p.m)return mp.m;return np.n; B.bool Pair:operator(Pair P)if(m!=p.m)return mp.m;return np.n;C.bool Pair:operator(Pair
30、 p)constif(mp.m)return true;return np.n;D.bool Pair:operator(Pair P)if(mp.m)return true;return np.n;解析:解析 按照比较规则:首先比较两对象的 m 成员,m 大者为大:当 m 相等时比较 n,n 大者为大。这条规则的用 C+写出来就是选项 A。8.将运算符重载为类成员函数时,其参数表中没有参数,说明该运算符是_。(分数:2.00)A.不合法的运算符B.一元运算符 C.无操作数的运算符D.二元运算符解析:解析 对于一元或二元运算符函数作为成员函数重载时,第一操作数就是对象本身,并不显式地出现在参数
31、表中。即第一操作数仅以 this 指针的形式隐含存在于参数表中。因此,对于一元运算符参数表是空的;对于二元运算符参数表中只有一个参数,它代表第二操作数。9.将前缀运算符“-”重载为非成员函数,下列原型中,能正确用于类中说明的是_。(分数:2.00)A.DecrB.Decr operator-(DecrC.friend Decr D.friend Decr operator-(Decr解析:解析 因为要作为非成员函数重载,所以加 friend,作为前缀操作,其返回的操作结果是对该变量的引用,所以类型为 DeerB.MycloCk operator+(MyClock,MyClock);C.Mycl
32、oCk operator+(long,long); D.MycloCk operator+(long,MyClock);解析:解析 运算符重载不能有二义性,故选项 C 不能区分运算符的准确含义。11.下列关于赋值运算符“=”重载的叙述中,正确的是_。(分数:2.00)A.赋值运算符只能作为类的成员函数重载 B.默认的赋值运算符实现了“深层复制”功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果已经定义了复制(拷贝)构造函数,就不能重载赋值运算符解析:解析 赋值运算符“=”只能作为成员函数重载。12.若在表达式 y/x 中,“/“是作为成员函数重载的运算符,则该表达式还可以表示为_。(分
33、数:2.00)A.operator/(y)B.operator/(x,y)C.operator/(x) D.operator/(y,x)解析:解析 运算符函数的函数名是由运算符前加关键字 operator 构成的。所以当“/”作为运算符重载后,其格式为 operator/。所以其作为成员函数调用时的格式为 y.operator/(x)。13.有类定义如下: class Type public: Type(int i=0); Type operator-(int); friend Type operator+(Type,Type); private: int val; ; 若有对象定义 Type
34、 c1;则下列语句序列中,错误的是_。(分数:2.00)A.Type(3)+c1;B.c1+Type(3);C.3-c1; D.c1-3;解析:解析 由于在类 Type 中对“-”进行了重载,所以根据“-”重载的形式定义,c1-3 是正确的,而 3-c1 是错误的表达式。14.若要对 Data 类中重载的加法运算符成员函数进行声明,下列选项中正确的是_。(分数:2.00)A.Data+(Data);B.Data operator+Data; C.Data+operatorData;D.operator+(Data,Data);解析:解析 “+”是一个二元运算符,因此作为成员函数重载时参数表中只
35、有一个参数,对应于第二个操作数,而第一个操作数是对象本身。运算符函数的函数名是由运算符前加关键字 operator 构成的。15.若要对类 BigNumber 中重载的类型转换运算符 long 进行声明,下列选项中正确的是_。(分数:2.00)A.operator long()const; B.operator long(bigNumber);C.long operator long()const;D.long operator long(BigNumber);解析:解析 在重载类型转换符时,由于运算符本身已经表示出返回值类型,因此不需要返回值类型的声明。16.有如下类模板定义: templa
36、tetypename T class BigNumber longn ; public: BigNumber(T i):n(i) BigNumber operator+(BigNumber b) return BigNumber(n+b.n); 已知 b1、b2 是 BigNumber 的两个对象,则下列表达式中错误的是_。(分数:2.00)A.b1+b2B.b1+3C.3+b1 D.3+3解析:解析 C+运算符的重载有两个方式,一种是做为成员函数,另一种是做为友元函数。前种 C+默认省略第一个参数(事实上是对象本身),而后一种是所有的参数都要写全。比如对加法的重载:成员方式为 COperat
37、or operator+(COperator ,在调用的过程中我们可以理解为 result=operator+(op);友元方式为 friend COperator operator-(COperator ,在调用的过程中我们可以理解为 result=operator-(op1,op2);。 对于本题来说,整数 3 与 b1 相加时,3 是 int 型,b1 是 BigNumberT型,int 型不能和别的型做运算。17.为类 Matrix 重载下列运算符时,只能作为 Matrix 类成员函数重载的运算符是_。(分数:2.00)A.+B.= C.D.+解析:解析 在 C+中,=、()、-以及所
38、有的类型转换运算符只能作为成员函数重载。18.有如下类定义 class MyClass public: _ Private: int data; ; 若要为 MyClass 类重载流输入运算符,使得程序中可以“cinobj;”形式输入 MyClass 类的对象 obj,则横线处的声明语句应为_。(分数:2.00)A.friend istream B.friend istreamC.istreamD.istream解析:解析 C+的输入运算符作为非类成员函数重载。在一个类中,可将输入运算符声明为友元函数,在类 MyClass 重载输入运算符的形式如选项 A 所示。19.若为 Fraction 类
39、重载前增 1 运算符+,应在类体中将其声明为_。(分数:2.00)A.Fraction B.FractionC.friend FractionD.friend Fraction解析:解析 在类 Fraction 中重载前增 1 运算符+时,其声明形式为 Fraction 。20.若需要为 XV 类重载乘法运算符,运算结果为 XV 类型,在将其声明为类的成员函数时,下列原型声明正确的是_。(分数:2.00)A.XV operator*(XV,XV);B.XV*(XV);C.operator*(XV);D.XV operator*(XV); 解析:解析 “*”是一个二元运算符,在作为成员函数重载时
40、参数表中只有一个参数,对应于第二个操作数,而第一个操作数就是对象本身,仅以 this 指针的形式隐藏在参数表中。21.己知类 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,MyCloc
41、k);D.MyClock operator+(MyClock);解析:解析 由表达式 c2=c1+10 可知,在对“+”进行重载时,第一操作数是 MyClock 类的对象,而第二操作数是一个整型数据。22.已知将运算符“+”和“*”作为类 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
42、.operator*(c1)解析:解析 表达式 c1+c2*c1 的含义是 c1 加上 c2 与 c1 的积。23.下列运算符不能重载为友元函数的是_。(分数:2.00)A.= () - B.+ - + -C. = =D.+= -= *= /=解析:解析 此题考查的是运算符重载的概念。C+语言规定,=、()、-以及所有的类型转换运算符只能作为成员函数重载,如果要重载为友元函数就必须重载为非成员函数。24.若要重载+、=、=和运算符,则必须作为类成员重载的运算符是_。(分数:2.00)A.+和=B.=和C.=和D.=和 解析:解析 =、()、-以及所有的类型转换运算符只能作为成员函数重载,而且不
43、能是针对枚举类型操作数的重载。25.在类中重载赋值运算符时,应将其声明为类的_。(分数:2.00)A.静态函数B.友元函数C.成员函数 D.构造函数解析:解析 赋值运算符只能作为类的成员函数重载。26.下列关于模板的叙述中,错误的是_。(分数:2.00)A.模板声明中的第一个符号总是关键字 templateB.在模板声明中用和括起来的部分是模板的形参表C.类模板不能有数据成员 D.在一定条件下函数模板的实参可以省略解析:解析 此题考查模板的概念。模板的一般说明形式如下:template 类型形参表函数返回值类型函数名(形参表)函数体,所以选项 A、B 正确。函数模板的实参在一定条件下是可以省略
44、的,所以选项 C错误。27.有如下函数模板定义: templateclass T T func(T x,T y)return x*x+y*y; 在下列对 func 的调用中,错误的是_。(分数:2.00)A.func(3,5);B.func(3.0,5.5);C.func(3,5.5); D.funcint(3,5.5);解析:解析 此题考查的是函数模板的使用。引用模板函数和引用一般函数在语法形式上基本相同。需要注意的是说明一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中的对应形参。本题 C 选项中,编译系统从第一个参数“3”获得信息“int”和
45、从第二个参数获得信息“double”两者矛盾,错误;A、B 选项正确;D 选项中,函数名后的int是模板实参表,编译系统会将 double 型的形参“5.5”自动转化成 int 类型。28.有如下函数模板: templatetypename T,typename U T cast(U u)return u; 其功能是将 U 类型数据转换为 T 类型数据。已知 i 为 int 型变量,下列对模板函数 cast 的调用中正确的是_。(分数:2.00)A.cast(i);B.cast(i);C.castchar*,int(i);D.castdouble,int(i); 解析:解析 此题考查的是模板函
46、数的调用。本题中 cast()函数的实参 i 只能确定模板参数 U 的类型为int。而不能确定另外一个模板参数 T,故选项 A、B 错误;C+语言不允许隐式地将 int 转化为 char*,故选项 C 错误。29.关于在调用模板函数时模板实参的使用,下列表述正确的是_。(分数:2.00)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略 解析:解析 此题考查
47、的是模板实参的省略。模板实参在以下集中情况中不能省略:从模板函数实参表获得的信息有矛盾;需要获得特定类型的返回值,而不管参数的类型如何;虚拟类型参数没有出现在模板函数的形参表中;函数模板含有常规形参。30.有如下函数模板: templateclass TT square(T x)return x*x; 其中 T 是_。(分数:2.00)A.函数形参B.函数实参C.模板形参 D.模板实参解析:解析 此题考查的是函数模板。声明一个函数模板的格式是:template模板形参表声明函数声明,函数体其中的模板形参表声明是由一个或多个“模板形参”组成的,每个“模板形参”可具有以下几种形式:typename 参数名:class 参数名;类型修饰参数名。31.下列函数模版中的定义中,合法的是_。(分数: