1、国家二级 C+机试(运算符重载、 C+流)模拟试卷 1及答案与解析 一、选择题 1 运算符重载是对已有的运算符赋予多重含义,因此 ( )。 ( A)可以对基本类型 (如 int类型 )的数据,重新定义 “+”运算符的含义 ( B)可以改变一个已有运算符的优先级和操作数个数 ( C)只能重载 C+中已经有的运算符,不能定义新运算符 ( D) C+中已经有的所有运算符都可以重载 2 下列运算符中,不能被重载的是 ( )。 ( A) & ( B) != ( C) ( D) + 3 下列关于运算符重载的 叙述中,错误的是 ( )。 ( A)有的运算符可以作为非成员函数重载 ( B)所有的运算符都可以通
2、过重载而被赋予新的含义 ( C)不得为重载的运算符函数的参数设置默认值 ( D)有的运算符只能作为成员函数重载 4 下列关于运算符重载的描述中,错误的是 ( )。 ( A):运算符不能重载 ( B)类型转换运算符只能作为成员函数重载 ( C)将运算符作为非成员函数重载时必须定义为友元 ( D)重载 运算符应完成 “下标访问 ”操作 5 下列关于运算符重载的叙述中,正确的是 ( )。 ( A) 通过运算符重载,可以定义新的运算符 ( B)有的运算符只能作为成员函数重载 ( C)若重载运算符 +,则相应的运算符函数名是 + ( D)重载一个二元运算符时,必须声明两个形参 6 有如下程序: #inc
3、lude iostream using namespace std; class Complex double re, im; public: Complex(double r, double i): re(r), im(i) double real()constreturn re; double image()constreturn im; Complex& operator+=、 (Complex a) re+=a re; im+=a im; return *this; ; ostream& operator (ostream& s, const Complex& z) return s
4、( z real() , z image() ); int main() Complex x(1, -2), y(2, 3); cout (x+=y) endl; return 0; 执行这个程序的输出结果是 ( )。 ( A) (1, -2) ( B) (2, 3) ( C) (3, 5) ( D) (3, 1) 7 下列运算符函数中肯定不属于类 FunNumber的成员函数的是 ( )。 ( A) int operator-(FunNumber); ( B) FunNumber operator-(); ( C) FunNumber operator-(int); ( D) int ope
5、rator-(FunNumber, FunNumber); 8 有如下程序: #include iostream Using namespace std; ClassAmount int amount; public; Amount(int n=0): amount(n) Int getAmount()constreturn amount; Amount &operator+=(Amount a) amount+=a amount; return; ; int main() Amount x(3), y(7); x+=y; cout x getAmount() endl; return 0;
6、已知程序的运行结果是 10,则下划线处缺失的表达式是 ( )。 ( A) *this ( B) this ( C) &amount ( D) amount 9 有如下程序: include iostream using namespace std; 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 (p1 p2) (p2 p1) (p2
7、p3) (p3 p2); return 0; 运算符函数。 perator的功能是比较两个 Pair对象的大小,当左边对象大时,返回true,否则返回 false。比较规则是首先比较两对象的 m成员, m大者为大:当 m相等时比较 n, n大者为大。程序输出 0101,下列对运算符重载函数的正确定义是( )。 ( A) bool Pair: operator (Pair p)const if(m!=p m)return m p m; return n p-n; ( B) bool Pair: operator (Pair p) if(m!=p m)return m p m; return n
8、p n; ( C) bool Pair: operator (Pair p)const if(m p m)return true; return n p n; ( D) bool Pair: operator (Pair p) if(m p m)return true; return n p n; 10 将运算符 “+”重载为非成员函数,下列原型声明中,错误的是 ( )。 ( A) MycloCk operator+(MyClock, long); ( B) MycloCk operator+(MyClock, MyClock); ( C) MycloCk operator+(long, lo
9、ng); ( D) MycloCk operator+(long, MyClock); 11 有类定义如下: class Type public: Type(int i=0); Type operator-(int); friend Type operator+(Type, Type); private: int val; ; 若有对象定义 Type c1;则下列语句序列中,错误的是 ( )。 ( A) Type(3)+c1; ( B) c1+Type(3); ( C) 3-c1; ( D) c1-3; 12 有如下类模板定义: template typename T class BigNum
10、ber long n; public: BigNumber(T i): n(i) BigNumber operator+(BigNumber b) return BigNumber(n+b n); 已知 b1、 b2是 BigNumber的两个对象,则下列表达式中错误的是 ( )。 ( A) b1+b2 ( B) b1+3 ( C) 3+b1 ( D) 3+3 13 若为 Fraction类重载前增 1运算符 +,应在类体中将其声明为 ( )。 ( A) Fraction& operator+(); ( B) Fraction& operator+(int); ( C) friend Frac
11、tion& operator+(); ( D) friend Fraction& operator+(int); 14 已知将运算符 “+”和 “*”作为类 Complex的成员函数重载,设 c1和 c2是类Complex的对象,则表达式 c1+c2*c1等价于 ( )。 ( A) c1 operator*(c2 operator+(c1) ( B) c1 operator+(c2 operator*(c1) ( C) c1 operator*(c1 operator+(c2) ( D) c2 operator+(c1 operator*(c1) 15 在类中重载赋值运算符时,应将其声明为类的
12、 ( )。 ( A)静态函数 ( B)友元函数 ( C)成员函数 ( D)构造函数 16 如果利用 C+流进行输入输出,下面的叙述中正确的是 ( )。 ( A)只能借助于流对象进行输入输出 ( B)只能进行格式化输入输出 ( C)只能借助于 cin和 cout进行输入输出 ( D)只能使用运算符和进行输入输出 17 下列关于 C+流的描述中,错误的是 ( )。 ( A) cout A表达式可输出字符 A ( B) eof()函数可以检测 是否到达文件尾 ( C)对磁盘文件进行流操作时,必须包含头文件 fstream ( D)以 ios_base: out模式打开的文件不存在时,将自动建立一个新
13、文件 18 C+系统预定了 4个用于标准数据流的对象,下列选项中不属于此类对象的是( )。 ( A) cout ( B) cin ( C) cerr ( D) cset 19 下列关于输入输出流的叙述中,正确的是 ( )。 ( A)一个文件流可以与一个数据文件相联系 ( B) cin是专门从键盘输入数据的输入流类 ( C)流运算符用来从输入流中 读取数据 ( D)宽度设置的效果永久有效 20 有如下程序: #include iostream using namespace std; int main() cout fill(*); cout width(6); cout fill( ); co
14、ut 123 endl; return 0; 执行后的输出结果是 ( )。 ( A) 123 ( B) 123 ( C) *123 ( D) 123* 21 下列关于输入流类成员函数 getline()的描述中,错误 的是 ( )。 ( A)该函数是用来读取键盘输入的字符串的 ( B)该函数读取的字符串长度是受限制的 ( C)该函数读取字符串时,遇到终止符便停止 ( D)该函数读取字符串时,可以包含空格 22 已知一程序运行后执行的第一个输出操作是 cout setw(10) setfill(*) 1234; 则此操作的输出结果是 ( )。 ( A) 1234 ( B) *1234 ( C)
15、*1234 ( D) 1234* 23 假定下列语句都是程序运行后首次执行 的输出语句,其中输出结果与另外三条语句不同的语句是 ( )。 ( A) cout setfill(*) 123 setw(9) 321; ( B) cout setfill(*) setw(6) left 123 setw(6) right 321; ( C) cout 123 setfill(*) setw(6) 321; ( D) cout setfill(*) setw(9) left 123 321; 24 有如下程序: #include iostream #include iomanip using name
16、space std; int main() cout setw(10) setfill(x) setprecision(8) left; cout 12 3456793 _ 98765; return 0; 若程序的输出是 12 345679x98765xxxxx,则划线处缺失的部分是 ( )。 ( A) setw(10) ( B) setfill(x) ( C) setprecision(8) ( D) right 25 下列控制对齐方式的操作符中,错误的是 ( )。 ( A) internal ( B) center ( C) left ( D) right 26 语句 ofstream
17、f(“SALARY DAT“, ios_base: app);功能是建立流对象 f,并试图打开文件 SALARY DAT与 f关联,而且 ( )。 ( A)若文件存在,将其置为空文件;若文件不存在,打开失败 ( B)若文件存在,将文件指针定位于文件尾;若文件不存在,建立一个新文件 ( C)若文件存在,将文件指针定位于文件首;若文件不存在,打开失败 ( D)若文件存在,打开失败;若文件不存在,建立一个新文件 27 当使用 ofstream流类定义 个流对象并打开一个磁盘文件时,文件的默认打开方式为 ( )。 ( A) ios_base: in ( B) ios_base: binary ( C)
18、 ios_base: in iosbase: out ( D) ios_base: out 28 在下列枚举符号中,用来表示 “相对于当前位置 ”文件定位方式的是 ( )。 ( A) ios_base: cur ( B) ios_base: beg ( C) ios_base: out ( D) ios_base: end 29 若目前 D盘根目录下并不存在 test txt文件,则下列打开文件方式不会自动创建 test txt件的是 ( )。 ( A) ifstream fin; fin open(“d: test txt“, ios_base: in); ( B) fstream fio;
19、 fio open(“d: test txt“, ios_base: out); ( C) ofstream fout; fout open(“d: test txt“, ios_base: out); ( D) ofstream fout; fout open(“d: test txt“, ios_base: app); 国家二级 C+机试(运算符重载、 C+流)模拟试卷 1答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 此题考查的是运算符重载。运算符重载是针对 C+语言原有的运算符进行的,并不能创造新的运算符。 【知识模块】 运算符重载 2 【正确答案】 C 【试题解析】 此题
20、考查的是运 算符重载。在 C+中,只有、 *、 -*、:、 ?:这五个运算符不能重载。 【知识模块】 运算符重载 3 【正确答案】 B 【试题解析】 “运算符重载 ”是针对 C+中原有运算符进行的,不可能通过重载创造新的运算符。除了, *, - *,:, ?:这五个运算符以外,其他运算符都可以重载。 【知识模块】 运算符重载 4 【正确答案】 C 【试题解析】 C+把重载的运算符视为特殊的函数,称为运算符函数。 “运算符重载 ”是针对 CH中原有运算符进行的,不可能通过重载创造出新的运算符。 【知识模块】 运算符重载 5 【正确答案】 B 【试题解析】 此题考查的是运算符重载。 C+中, “=
21、”、 “”、 “()”、 “- ”以及所有的类型转换符只能作为成员函数重载,故 B选项正确:运算符重载只是赋予已有的运算符多重含义,并不是定义新的运算符:运算符函数的函数名就是在运算符前加上关键字 operator。 【知识模块】 运算符重载 6 【正确答案】 D 【试题解析】 此题考查了运算符重载应用。因为 x和 y都是 Complex类的对象, Complex类中已经重载了 +:运算符, 表达式 x+=y就等价与x operator+=(y),执行后得到 (3, 1):接着计算 cout (x+=y),其等价于调用operator (cout, (x+=y),最后输出结果是 (3, 1)。
22、 【知识模块】 运算符重载 7 【正确答案】 D 【试题解析】 此题考查的是运算符 “-”的重载。 “-”运算符有一元和二元两种,且均可以重载为成员函数和非成员函数。运算符重载为成员函数时,形参个数一般为运算符元数减 1;重载为非成员函数时,形参个数一般和运算符元数相等。所以, “-”运算符重载为成员函数时 ,参数可以是 0个或 1个;而重载为非成员函数时,参数个数可以是 1个或 2个。所以 D选项,肯定是重载为非成员函数。 【知识模块】 运算符重载 8 【正确答案】 A 【试题解析】 此题考查的是 “+”运算符重载和 this指针。语句amount+=a amount;实现 3和 7的求和得
23、到 amount=10,要使程序的输出结果为 10,又因为函数的返回值类型为 Amount&,所以横线处填入 *this。 【知识模块】 运算符重载 9 【正确答案】 A 【试题解析】 按照比较规则:首先比较两对象的 m成员, m大者为大:当 m相等时比较 n, n大者为大。这条规则的用 C+写出来就是选项 A。 【知识模块】 运算符重载 10 【正确答案】 C 【试题解析】 运算符重载不能有二义性,故选项 C)不能区分运算符的准确含义。 【知识模块】 运算符重载 11 【正确答案】 C 【试题解析】 由于在类聊 e中对 “-”进行了重载,所以根据 “-”重载的形式定义,c1-3是正确的,而
24、3-c1是错误的表达式。 【知识模块】 运算符重载 12 【正确答案】 C 【试题解析】 C+运算符 的重载有两个方式,一种是做为成员函数,另一种是做为友元函数。前种 C+默认省略第一个参数 (事实上是对象本身 ),而后一种是所有的参数都要写全。比如对加法的重载:成员方式为 COperator operator+(COperator op);在调用的过程中我们可以理解为result=operator+(op);友元方式为 friend COperatoropexator-(COperator &op1,COperator &op2);,在调用的过程中我们可以理解为 result=operato
25、r-(op1,op2); 。 对于本题来说,整数 3与 b1相加时, 3是 int型, b1是 BigNumber T型, int型不能和别的型做运算。 【知识模块】 运算符重载 13 【正确答案】 A 【试题解析】 在类 Fraction中重载前增 1运算符 +时,其声明形式为 Fraction &operator+();在类 Fraction中重载后增 1运算符 +时,其声明形式为Fraction&operator+(int);。 【知识模块】 运算符重载 14 【正确答案】 B 【试题解析】 表达式 c1+c2*c1的含义是 c1加上 c2与 c1的积。 【知识模块】 运算符重载 15
26、【正确答案】 C 【试题解析】 赋值运算符只能作为类的成员函数重载。 【知识模块】 运算符重载 16 【正确答案】 A 【试题解析】 此题考查的知识点是 C+流。利用 C+流既可以进行有格式输入输出,也可以进行无格式输入输出,所以选项 B错误; C+的 4个预定义的流对象为: cin标准输入, cout标准输出, cerr标准出错信息输出, clog-一带缓冲的标准出错信息输出,选项 C错误; C+流除了可以使用提取 “ ”插入 “ ”进行输入输出外,还可以通过流对象的一些成员函数进行输入输出,故选项 D错误。 【知识模块】 C+流 17 【正确答案】 A 【试题解析】 cout是一个标准输出
27、流对象。称之为提取运算符,它的功能是从输入流中提取数据赋值给一个变量。为插入运算符,其功能是把表达式的值插入到输出流中。当系统执行 cout x操作时,首先根据 x值的类型调用相应的插入运算符重载器函数,把 x的值传送给对应的形参,接着执行函数体,把 x的值输出到显示器屏幕上,在当前屏幕光标位置处显示出来,然后返 回 ostream流,以便继续使用插入运算符输出下一个表达式的值。对于本题来说,要输出字符 A的值应该写成 cout A。因而选项 A)是错误的。 【知识模块】 C+流 18 【正确答案】 D 【试题解析】 c+流有 4个预定义的流对象,它们分别是: cin标准输入; cout标准输
28、出; cerr标准出错信息输出: clog带缓冲的标准出错信息输出。 【知识模块】 C+流 19 【正确答案】 A 【试题解析】 当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的流对象 ,另一个是文件对象。程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。 【知识模块】 C+流 20 【正确答案】 A 【试题解析】 此题考查的是 I O格式化输出。函数 width(intn)设置输入输出宽度,当实际数据宽度小于制定的宽度时,多余的位置用填充字符填满;当实际数据宽度大于设置的宽度时,仍按实际宽度输出;函数 fi
29、ll(char c)用来设置填充字符。 【知识模块】 C+流 21 【正确答案】 A 【试题解析】 此题考查的是 getline()函数。 getline()函数的原型为:istream_type&getline(char_type*s,streamsize, char_type delim);。其功能是从当前输入位置开始提取字符存入 s所指向的具有 n个字节的字符空间中。遇到以下情况时停止:已提取并存储了 n-1个字符;到流尾,无字符可取;下一个要提取的字符等于结束标志字符 delim。故选项 B、 C、 D都是正确的。 getline()函数不仅可以用来读取键盘输入的字符串,还可以用来读取
30、文件等数据流,故 选项 A错误。 【知识模块】 C+流 22 【正确答案】 B 【试题解析】 此题考查的是输入输出的格式控制。 setw()控制的是输入输出的宽度; setfill()控制的是输出的填充字符。所以本题的输出结果是 *1234。 【知识模块】 C+流 23 【正确答案】 B 【试题解析】 按照选项 B的输出格式控制符输出的结果为 “123*321”,而按照选项 A)、 C)、 D)的输出格式控制符输出的结果为 “123*321”。 【知识模块】 C+流 24 【正确答案】 A 【试题解析】 根据程序输出的结果最后 5个位置用 x进行填充,又因为 setw(10)设置输出的宽度效果
31、只对一次输出有效。所以划线处应该填写 setw(10)。 【知识模块】 C+流 25 【正确答案】 B 【试题解析】 对齐方式的控制操作符 left的含义是在设定的宽度内左对齐输出,右端填已设定的填充字符: fight(此为默认设置 )在设定的宽度内右对齐输出;intemal在设定的宽度内右对齐输出,但若有符号 (一或 +),符号置于最左端。 【知识模块】 C+流 26 【正确答案】 B 【试题解析】 此题考查的是文件打开模式。文件打开模式 iso_base: app是为添加数据而打开 (总是在尾部写 ),故只有选项 B说法正确。 【知识模块】 C+流 27 【正确答案】 D 【试题解析】 对
32、于 ofstream,默认的打开方式是 ios_base: out, ofstream只能用于输出,它没有提供任何用于输入的操作。 【知识模块】 C+流 28 【正确答案】 A 【试题解析】 C+流的定位方式 (也就是指针移动方式 )有三种,被定义为ios_base: seekdir中的一组枚举符号: ios_base: beg相当于文件首; ios_base: cur相当予当前位置 (负数表示当前位置之前 ); ios_base: end相对于文件尾。 【知识模块】 C+流 29 【正确答案】 A 【试题解析】 如果以 iso_base: in模式打开文件但文件又不存在时,可以通过fail()测出文件打开失败,不会自动创建文件。 【知识模块】 C+流