资源描述
面向对象程序设计模拟试卷一
一. 单选题(15)。
1. 关于构造的叙述_____正确:
A. 最先构造虚基类 B. 最先构造基类
C. 最先构造派生类的对象成员 D. 都不对
2. 关于静态数据成员的叙述_____正确:
A. 公有的可在类体外初始化 B. 私有的不能在类体外初始化
C. 私有和保护的不能在类体外初始化 D. 都能够且必须在体外初始化
3. 若派生类函数不是基类的友元, 关于该函数访问基类成员_____正确:
A. 公有的可被派生类函数访问 B. 都能够被派生类函数访问
C. 公有和保护的可被派生类函数访问 D. 都不对
4. 关于函数的所有缺省参数的叙述_____正确:
A. 只能出现在参数表的最左边 B. 只能出现在参数表的最右边
C. 必须用非缺省的参数隔开 D. 都不对
5. 使用friend、 virtual、 static说明函数的叙述_____正确:
A. 必须同时使用三个 B. 只能同时用其中两个
C.只能独立单个地使用 D. 都不对
二. 指出各类的成员及其存取属性(20) 。
三. 指出main中每行的输出结果(20) 。
#include <iostream.h>
struct A{A( ){ cout<<'A';}};
struct B{B( ){ cout<<'B';}};
struct C: A{C( ){ cout<<'C';}};
struct D: virtual B, C{D( ){ cout<<'D';}};
struct E: A{
C c;
E( ): c( ){ cout<<'E';}
};
struct F: virtual B, C, D, E{
F( ){ cout<<'F';}
};
void main( ){
A a; cout<<'\n';
B b; cout<<'\n';
C c; cout<<'\n';
D d; cout<<'\n';
E e; cout<<'\n';
F f; cout<<'\n';
}
四. 指出以下程序的语法错误及其原因(15) 。
class A{
static int a=0;
protected:
int b;
public:
int c;
A(int);
operator int( );
} a(1, 2);
class B: A{
B(int);
virtual int d;
int e;
public:
A::b;
friend int operator =(B);
static B(int, int);
} b=5;
class C: B{
public:
int operator++(double);
};
int main( ){
int *A::*p, i;
i=a.a;
i=A(4);
i=b.c;
p=&A::c;
i=b;
return ;
}
五. 指出main变量i在每条赋值语句执行后的值(15) 。
int x=2, y=x+30;
struct A{
static int x;
int y;
public:
operator int( ){ return x-y; }
A operator ++(int){ return A(x++, y++); }
A(int x=::x+2, int y=::y+3){ A::x=x; A::y=y; }
int &h(int &x);
};
int &A::h(int &x)
{
for(int y=1; y!=1|| x<201; x+=11, y++) if(x>200) { x-=21; y-=2;}
return x-=10;
}
int A::x=23;
void main( ){
A a(54, 3), b(65), c;
int i, &z=i, A::*p=&A::y;
z=b.x;
i=a.x;
i=c.*p;
i=a++;
i=::x+c.y;
i=a+b;
b.h(i)=7;
}
六. 为了没有误差地表示分数, 定义类FRACTION来表示分数, 请编程实现分数类中的除cmd外的所有函数(15)。
class FRACTION{ //对于, numerator存分子6, denominator存分母7
int numerator, denominator;
static int cmd(int x, int y); //求整数x,y的最大公约数
public:
int operator>(const FRACTION&)const; //大于比较, 例>
FRACTION(int num, int den=1); //num、 den各为分子和分母
FRACTION operator*( )const; //分数约简, *=
FRACTION operator+(const FRACTION&)const; //加法, +=
FRACTION operator*(const FRACTION&)const; //乘法, *==
};
int FRACTION::cmd(int x, int y){
int r;
if(x<y){ r=x; x=y; y=r; }
while(y!=0){ y=x%(r=y); x=r; }
return x;
}
面向对象程序设计模拟试卷二
一.单项选择题 ( 从下列各题四个备选答案选出一个正确答案, 并将其代号填在题干前的括号内。答案选错或未作选择者, 该题不得分。每小题1分, 共10分)
( ) 1.以下有关析构函数的叙述, 选择正确的填入括号内。
A. 能够进行重载能够定义为虚函数
B. 不能进行重载能够定义为虚函数
C. 能够进行重载不能定义为虚函数
D. 不能进行重载不能定义为虚函数
( ) 2.以下有关函数缺省参数的出现位置, 选择正确的叙述填入括号内。
A. 必须全部出现在函数参数表的左部
B. 必须全部出现在函数参数表的右部
C. 必须全部出现在函数参数表的中间
D. 都不对
( ) 3.关于两个同名函数重载的叙述, 选择最为正确的填入括号内。
A. 两个函数的参数个数不同
B. 两个函数对应的参数类型不同
C. 两个函数的参数个数不同或对应的参数类型不同
D. 都不对
( ) 4.关于inline保留字的用途, 选择正确的叙述填入括号内。
A. 只能用于定义成员函数
B. 只能用于定义非成员函数
C. 能够定义成员函数及非成员函数
D. 都不对
( ) 5.关于类的构造函数的定义位置, 将最为正确的叙述填入括号内。
A. 只能在private下定义
B. 只能在protected下定义
C. 只能在public下定义
D. 定义位置没有限制
( ) 6.如下修饰类体中函数的返回类型, 将正确的用法填入括号内。
A. 同时使用static和friend
B. 同时使用static和virtual
C. 同时使用friend和virtual
D. 不同时使用上述三个保留字中的任意两个
( ) 7.在如下关于继承的叙述中, 选择正确的填入括号内。
A. 私有继承用于实现类之间的ISA关系
B. 保护继承用于实现类之间的ISA关系
C. 公有继承用于实现类之间的ISA关系
D. 都不对
( ) 8.对于用union定义的类A, 选择正确的叙述填入括号内。
A. 类A能够作为某个类的基类
B. 类A能够作为某个类的派生类
C. 类A既不能作基类又不能作派生类
D. 类A既能够作基类又能够作派生类
( ) 9.有关在类中声明友元函数的叙述, 将正确的答案填入括号内。
A. 只能在private下声明
B. 只能在protected下声明
C. 只能在public下声明
D. 声明位置没有限制
( ) 10.在构造派生类A的对象时, 选择正确的叙述填入括号内。
A. 最先构造派生类A的基类
B. 最先构造派生类A的虚基类
C. 最先构造派生类A的数据成员对象
D. 都不对
二.多项选择题( 从下列各题四个备选答案选出二至四个正确答案, 并将其代号填在题干前的括号内。答案选错或未选全者, 该题不得分。每小题2分, 共10分)
( ) 11.将符号为分隔符的编号填入括号内。
A. m B. + C. { D. =
( ) 12.将用于定义类的保留字的编号填入括号内。
A. class B. struct C. int D. union
( ) 13.将用于释放p=new int[8]的内存的编号填入括号内。
A. free (p) B. delete p C. delete []p D. sizeof p
( ) 14.将派生类成员函数可访问的基类成员编号填入括号内。
A. private B. protected C. public D. 所有成员
( ) 15.将不能重载的运算符函数的编号填入括号内。
A. ? : B. :: C. % D. <<
三.填空题( 阅读以下程序并填空。每题1分, 共10分)
class A{ class C: A{
int a; int g;
protected: protected:
int b; int h;
public: public:
int c; int c;
}a; }c;
class B: protected A{ struct D: B, C{
int d; int j;
protected: protected:
int e; B::b;
public: }d;
A::c; void main(void){
int f; int x;
}b; }
16.对于main, 对象a的私有成员为___________________________。
17.对于main, 对象a的保护成员为___________________________。
18.对于main, 对象a的公有成员为___________________________。
19.对于main, 对象b的私有成员为___________________________。
20.对于main, 对象b的保护成员为___________________________。
21.对于main, 对象c的保护成员为___________________________。
22.对于main, 对象c的公有成员为___________________________。
23.对于main, 对象d的保护成员为___________________________。
24.对于main, 对象d的公有成员为___________________________。
25.main应使用语句x=__________取对象d的基类C的成员c的值。
四.名词解释( 每小题3分, 共15分)
26.标识符:
27.重载:
28.异常:
29.类型强制:
30.抽象类:
五.判断改错题( 阅读以下程序并判断各题是否正确, 对正确的就在其题号前打√; 错误的在其题号前打χ, 并在题干后的括号内更正。每小题3分, 共15分)
#include <iostream.h>
struct A{A( ){ cout<<'A';}};
struct B{B( ){ cout<<'B';}};
struct C: A{C( ){ cout<<'C';}};
struct D: virtual B, C{D( ){ cout<<'D';}};
struct E: A {
C c;
E( ): c( ){ cout<<'E';}
};
struct F: virtual B, C, D, E{
F( ){ cout<<'F';}
};
void main( ){ /*……*/ }
( ) 31.如main定义A a, 则输出为A。 ( )
( ) 32.如main定义C c, 则输出为BAC。 ( )
( ) 33.如main定义D d, 则输出为BACD。 ( )
( ) 34.如main定义E e, 则输出为AACE。 ( )
( ) 35.如main定义F f, 则输出为BCDEF。 ( )
六.计算题( 阅读如下程序并计算执行结果。共20分)
int x=2, y=x+30;
struct A{
static int x;
int y;
public:
operator int( ){ return x+y; }
A operator ++(int){ return A(x++, y++); }
A(int x=::x+2, int y=::y+3){ A::x=x; A::y=y; }
int &h(int &x);
};
int &A::h(int &x)
{
for(int y=1; y!=1 || x<201; x+=11, y++)
if(x>200) { x-=21; y-=2;}
return x-=10;
}
int A::x=23;
void main( ){
A a(54, 3), b(65), c;
int i, &z=i, A::*p=&A::y;
i=b.x; //……………………………①
z=a.x; //……………………………②
i=c.*p; //……………………………③
i=a++; //……………………………④
i=::x+c.y; //……………………………⑤
i=a+b; //……………………………⑥
b.h(i)=7; //……………………………⑦
}
36.语句①执行结束后i= 。( 2分)
37.语句②执行结束后i= 。( 3分)
38.语句③执行结束后i= 。( 3分)
39.语句④执行结束后i= 。( 3分)
40.语句⑤执行结束后i= 。( 3分)
41.语句⑥执行结束后i= 。( 3分)
42.语句⑦执行结束后i= 。( 3分)
七.设计题( 20分)
43.如下复数类说明了五个成员函数, 请详细定义这五个函数的函数体。( 每个定义4分)
class COMPLEX{ //real, imag分别为复数的实部和虚部,
double real, imag; //若x=3+5i, 则x.real=3, x.imag=5
public:
COMPLEX(double r=0, double i=0);
COMPLEX& operator += (const COMPLEX &c);
COMPLEX& operator ++ ( ); //复数的实部和虚部加1
COMPLEX operator – ( ) const; //将实部和虚部的符号求反
COMPLEX operator + (const COMPLEX &c) const;
};
面向对象程序设计模拟试卷一答案
一解: 1. A 2. D 3. C 4. B 5. C
二解: 各类的成员及其存取属性如下。
三解: main中每行的输出结果见如下注释。
A a; cout<<'\n'; //输出A
B b; cout<<'\n'; //输出B
C c; cout<<'\n'; //输出AC
D d; cout<<'\n'; //输出BACD
E e; cout<<'\n'; //输出AACE
F f; cout<<'\n'; //输出BACACDAACEF
四解: 错误及其原因见注释。
class A{
static int a=0; //不能在类的体内初始化
protected:
int b;
public:
int c;
A(int);
operator int( );
} a(1, 2); //没有定义A(int, int)
class B: A{
B(int);
virtual int d; //virtual不能用于数据成员
int e;
public:
A::b; //修改而不是恢复访问权限
friend int operator =(B); //不存在普通赋值函数的重载, =必须重载为双目的
static B(int, int); //构造函数不能定义为不带this参数的静态函数成员
} b=5; //B(int)是不可访问的私有构造函数
class C: B{
public:
int operator++(double); //必须用int定义后置运算
}; //C必须定义构造函数, 因B定义有带参构造函数且没有无参构造函数
int main( ){
int *A::*p, i;
i=a.a; //a.a是私有的, 不能被不是A的友元的main访问
i=A(4);
i=b.c; //b.c是私有的, 不能被不是B的友元的main访问
p=&A::c; //A::c不是一个int *指针
i=b; //B不存在公有的B::operator int( )或B::operator A( )
return ; //返回void类型, 与main声明的返回类型不一致
}
五解: 变量i在每条赋值语句执行后的值见注解。
z=b.x; //i=4
i=a.x; //i=4
i=c.*p; //i=35
i=a++; //i=1
i=::x+c.y; //i=37
i=a+b; //i=-31
//A(4,3)++将A::x=a.x=b.x=c.x置为4, 普通成员a.y=4不变
b.h(i)=7; //i=7
六解: 本题所涉及的概念并不复杂, 值得注意的是分数的约分运算, 该运算实际上是一个单目运算。在重载约分运算时, 要选择只有一个操作数的运算符。另外, 在对分数进行加和乘以后, 最好对运算结果进行约分运算, 如果不约分不算错。函数成员如下。
FRACTION::FRACTION(int num, int den){
numerator=num;
denominator=den;
}
int FRACTION::operator>(const FRACTION&f)const{
double d= denominator *f.denominator;
return (numerator*f.denominator/d >denominator*f.numerator/d);
}
FRACTION FRACTION::operator*( )const{
int c=cmd(numerator, denominator);
return FRACTION(numerator/c, denominator/c);
}
FRACTION FRACTION::operator+(const FRACTION&f)const{
int n= numerator*f.denominator+denominator*f.numerator;
int d= denominator*f.denominator;
return *FRACTION(n, d); //对运算结果进行约分运算
}
FRACTION FRACTION::operator*(const FRACTION&f)const{
return *FRACTION(numerator*f.numerator, denominator*f.denominator); //约分
}
面向对象程序设计模拟试卷二答案
一解: 单项选择题答案
1. B 2. B 3. C 4. C 5. D
6. D 7. C 8. C 9. D 10.B
二解: 多项选择题答案
11.BCD 12.ABD 13.ABC 14.BC 15.AB
三解: 填空题答案
16. a.a
17. a.b
18. a.c
19. b.d
20. b.b, b.e
21. c.h
22. c.c
23. d.b, d.e, d.h
24. d.B::c, d.f, d.C::c, d.j
25. d.C::c
四解: 名词解释答案
26.标识符: 标识符是程序变量、 常量、 函数和类型的名字, 一般是由字母或下划线开始的字母、 数字或下划线等符号序列构成。( 要点: 仅回答名字或构成得2分, 全答得3分)
27.重载: 重载是指用一个标识符或操作符命名多个函数, 用于完成多个不同类型的操作。( 要点: 没有回答多个扣1分, 没有回答操作符可不扣分)
28.异常: 异常是指函数执行出现了不正常的现象、 或运行结果出现了无法定义的情况而必须中断程序执行的状态。( 要点: 未回答不正( 平) 常、 结果无法定义或中断执行, 可扣1分)
29.类型强制: 类型强制是指将一种类型映射或转换为另一种类型。( 要点: 没有映射或转换扣1分, 没有涉及两种类型扣1分)
30.抽象类: 抽象类是指定义了纯虚函数、 或继承了纯虚函数但没有定义函数体的类。或者抽象类是不能定义或产生实例对象的类。( 要点: 或者前后的两种回答都能够得分)
五解: 判断改错题答案
31.√
32.X 改正: AC
33. √
34. √
35. X 改正: BACACDAACEF
六解: 计算题答案
36. i=4 37. i=4 38. i=35 39. i=7 40. i=37 41. i=47 42. i=7
七解: 设计题答案要点如下, 达不到要求各扣1分。
①所有函数头必须包含COMPLEX::
②构造函数定义时不能再次定义缺省参数
③返回类型为COMPLEX&的&不能省略
④返回类型为COMPLEX&的必须用return *this
⑤返回类型为COMPLEX的必须定义局部对象或使用常量对象
⑥const不能漏掉, 凡尾部部带const的函数不能改变当前对象的值。
43. 五个成员函数如下。
COMPLEX::COMPLEX(double r, double i){ real=r; imag=i; }
COMPLEX& COMPLEX::operator += (const COMPLEX &c){
real+=c.real;
imag+=c.imag;
return *this;
}
COMPLEX& COMPLEX::operator ++ ( ){//前置运算, 先运算后取值
real++;
imag++;
return *this;
}
COMPLEX COMPLEX::operator - ( ) const{ return COMPLEX(-real, -imag); }
COMPLEX COMPLEX::operator + (const COMPLEX &c) const
{ return COMPLEX(real+c.real, imag+c.imag); }
展开阅读全文