面对象设计复习题.docx
《面对象设计复习题.docx》由会员分享,可在线阅读,更多相关《面对象设计复习题.docx(14页珍藏版)》请在冰豆网上搜索。
面对象设计复习题
面对象设计复习题
一、选择题:
1.下列哪项不是面向对象程序设计的主要特征d
a.封装b.继承c.多态d.结构
2.若给出声明:
constcharcc=‘a’;
char*pc;
constchar*pcc;
charc=‘b’;
char*constcpc=&c;
下面的赋值表达式哪个是合法的
a.pc=&cc;b.pcc=&cc;c.cpc=pc;d.cc=’f’;
3.C++程序的执行总是从哪里开始的
a.main函数b.头文件c.第一行d.函数注释
4.下面对类和对象的描述不正确的是:
a.对象是类的一个实例b.任何一个对象都归属于一个具体的类
c.一个类只能有一个对象d.类与对象的关系和数据类型与变量的关系相似
5.以下哪个不是循环语句
a.while语句b.do-while语句c.for语句d.if-else语句
6.按照标识符的要求,下列符号哪个不能组成标识符
a.下划线b.连接符c.大小写字母d.数字字符
7.已知:
intm=10;在下列表示引用的方法中,哪个是正确的
a.int&x=m;b.int&y=10;c.int&z;d.float&t=&m;
8.以下有关类与结构体的叙述不正确的是:
a.结构体中只包括数据;类中封装了数据和操作
b.结构体的成员对外界通常是开放的;类的成员可以被隐蔽
c.用struct可以声明一个类型名;而class可以声明一个类名
d.结构体成员默认为private;类成员默认为public
9.下列哪个不是构造函数的特征
a.构造函数的函数名与类名相同b.构造函数可以重载
c.构造函数可以设置缺省参数d.构造函数必须指定返回值类型
10.已知:
类A中一个成员函数说明如下:
voidSet(A&a);其中,A&的含义是什么
a.指向类A的指针为ab.将a的地址值赋给变量Set
c.a是类A对象的引用,用来作函数Set()的参数
d.变量A与a按位与作为函数Set()的参数
11.在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用下列哪个函数
a.内联函数b.重载函数c.递归调用d.嵌套调用
12.已知:
print()函数是一个类的常成员函数,它无返回值,下列表示中,哪个是正确的
a.voidprint()const;b.constvoidprint();
c.voidconstprint();d.voidprint(const);
13.以下能对对象进行初始化的是:
a.构造函数b.析构函数c.友元函数d.静态成员函数
14.关于虚函数的描述中,哪个是正确的
a.虚函数是一个static类型的成员函数b.虚函数是一个非成员函数
c.基类中说明了虚函数后,派生类中其对应的函数可不必说明为虚函数
d.派生类的虚函数与基类的虚函数具有不同的参数个数和类型
15.设有以下类的定义:
classTemp{
intx;
public:
voidsetx(intt=0);
};
若在类外定义成员函数setx(),以下定义形式中正确的是哪个
setx(intt){…}Temp:
:
setx(intt){…}
void:
:
setx(intt){…}Temp:
:
setx(intt=0){…}
16.以下关于函数重载的要求,哪个叙述不正确
a.函数名相同b.函数参数个数不同c.函数返回值类型不同
d.函数参数个数相同但参数类型至少有一个不同
17.已知:
classA{
private:
inta,b;
floatc;
public:
voidfunc1(int,int);
friendintgetData();
};
则类A分别有几个数据成员和成员函数
a.2,2b.3,2c.2,1d.3,1
18.已知:
inta,*pa;
char*p=”Ilikecomputer!
”;
关于运算符new和delete的使用,下列表达式哪个是正确的
a.a=newint;b.deletep[12];c.pa=newint(10);d.p=newint[12];
19.对于类A而言,已知函数A:
:
A(constA&a);则该函数是类A的什么函数
a.内联函数b.友元函数c.拷贝构造函数d.类型转换函数
20.下面类的定义中哪个地方是不正确的
classexample{
floatx;
public:
example();(a)
example(int,float);(b)
operatorint();(c)
~example();
constinty=23;(d)
};
二、填空题:
1.在C++中,函数的参数有两种传递方式,它们是值传递和(引用传递)。
2.当一个成员函数被调用时,该成员函数的(this指针)指向调用它的对象。
3.在C++类中,const关键字可以修饰对象和成员函数,const对象不能(调用非const的普通成员
函数),const成员函数不能(修改)。
4.在C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为(抽象类),定义该
类至少具有一个(纯虚函数)。
5.描述命题"A小于B或小于C"的表达式为(a
6.在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。
对两个有相同名字的数据成员进行访问时,如果没有(类名和作用域分辨符),对此数据成员的访问将出现歧义。
7.静态数据成员在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象(共用)。
8.面向对象的程序设计有四大特征,它们是抽象、封装、(继承)、(重载)。
9.在C++中,构造派生类对象时,总是先从(基类)的初始化开始的。
10.类是用户定义的类型,具有类类型的变量称作(对象)。
11.静态的成员函数没有隐含的(this指针),所以,它们只能访问静态的数据成员。
12.构造函数与析构函数除功能不同外,在定义形式上,它们的区别还包括构造函数名与类名相同,
而析构函数名是在类名前加一个~、(无参数)、(不能重载)。
13.在公有派生的情况下,基类数据成员在派生类中的访问权限(不变)。
三、看程序写结果:
1.#include<>
classExample{
inta,b;
public:
Example()
{a=b=0;
cout<<"Thisisanexample!
"<}
Example(intx,inty){a=x;b=y;}
~Example()
{
if(a>b)cout<<"a>b"<elsecout<<"a<=b"<}
voiddisp()
{cout<<"a="<};
voidmain()
{
Examplee1,e2(6,3);
();
();
}
结果
Thisisaexample!
a=0,b=0
a=6,b=3
a>b
a<=b
2.#include<>
classSample{
intx;
public:
Sample(){};
Sample(inta){x=a;}
Sample(constSample&a){x=+++10;}
voidprint(){cout<<"x="<};
voidmain(){
Samples1
(2),s2(s1);
();
();
}
结果
X=3
X=12
3.#include<>
classA{
private:
intx1;
public:
A(intp1){x1=p1;cout<<"InA:
";cout<<"x1="<"<};
classB{
intx2;
public:
B(intp2)
{x2=p2;cout<<"InB:
";cout<<"x2="<~B(){cout<<"destructingclassB!
"<};
classC{
intx3;
public:
C(intp3):
x3(p3)
{cout<<"InC:
";cout<<"x3="<~C(){cout<<"destructingclassC!
"<};
voidmain()
{Aa
(1);
Bb
(2);
Cc(4);
}
结果:
InA:
x1=1
InB:
x2=2
InC:
x3=4
destructingclassC!
destructingclassB!
destructingclassA!
4.#include<>
classp_example{
intnum;
public:
voidset_num(intval){num=val;}
voidshow_num(){cout<voidmain()
{p_exampleob,obj[2];p_example*p;
(1);
obj[0].set_num(10);obj[1].set_num(20);p=&ob;
p->show_num();
p=obj;
p->show_num();
p++;
p->show_num();
p--;
p->show_num();}
结果:
1
10
20
10
5.#include<>
int&f(int&i)
{i+=10;returni;}voidmain()
{intk=0;
int&m=f(k);
cout<m=20;
cout<}
结果
10
20
6.#include<>
classA{
inta;
public:
intc;
A(inti){a=i;c=0;}intfun(intb){returna*c+b;}};
voidmain()
{intA:
:
*pc=&A:
:
c;
int(A:
:
*pfun)(int)=&A:
:
fun;Aob
(1);
ob.*pc=3;
cout<<<cout<<(ob.*pfun)(7)<A*p=&ob;
p->*pc=4;
cout<c<cout<<(p->*pfun)(7)<}
结果
3
10
4
11
7.#include<>
classb
{
public:
b(){cout<<"b:
:
b()constructed"<virtual~b(){cout<<"b:
:
b()destructed"<};
classd:
publicb
{
private:
char*buf;
public:
d(inti){cout<<"d:
:
d()constructed"<virtual~d(){delete[]buf;cout<<"d:
:
d()destructed"<};
voidfun(b*a)
{
deletea;
}
voidmain()
{
b*a=newd(25);
fun(a);
}
结果
b:
:
b<>constructed
d:
:
d<>constructed
d:
:
d<>destructed
b:
:
b<>destructed
四、编写程序:
1.定义一个复数类,使其至少具有实部(re)和虚部(im)两个数据成员,并具有显示复数、求两个复数相加、两个复数相减的功能。
还要求定义类的构造函数初始化复数。
#include<>
classfushu
{
private:
floatre;
floatim;
public:
fushu(){}
fushu(floatx,floaty){re=x,im=y;}
voiddisp()
{
cout<}
fushuplus(fushua,fushub)
{
fushu:
:
re=+;
fushu:
:
im=+;
}
fushuminus(fushua,fushub)
{
fushu:
:
re=main()
{
fushua1(10,5),a2(5,3),a3;
(a1,a2);
();
(a1,a2);
();
}
2.编写一个程序计算正方体、球体、圆柱体的表面积和体积。
要求:
创建一个Shape抽象类,正方体、球体、圆柱体是其派生类;编写main()函数显示所求正方体、球体、圆柱体的表面积和体积(使用一个抽象类的指针完成)。
#include<>
classshape
{
protected:
floatx;
public:
shape(floatx){shape:
:
x=x;}
virtualvoiddisp()=0;
};
classcube:
publicshape
{
public:
cube(floatx):
shape(x){}
voiddisp()
{
cout<<"正方体表面积:
"<cout<<"正方体体积:
"<}
};
classsphere:
publicshape
{
public:
sphere(floatx):
shape(x){}
voiddisp()
{
cout<<"球形表面积:
"<<4**x*x<cout<<"球形体体积:
"<<4/3**x*x*x<}
};
classyuanzhu:
publicshape
{
floatheight;
public:
yuanzhu(floatx,floaty):
shape(x)
{
height=y;
}
voiddisp()
{
cout<<"圆柱体表面积:
"<<2**x*x+2**x*height<cout<<"圆柱体体积:
"<}
};
voidmain()
{
shape*s;
cubec(10);
spheres1(10);
yuanzhuy(10,20);
s=&c;
s->disp();
s=&s1;
s->disp();
s=&y;
s->disp();
}
3.定义长方形类Rectangle,其属性是长(length)和宽(width),要求能够计算长方形的面积和周长。
#include<>
classrectangle
{
private:
intlength,width;
public:
rectangle(){}
rectangle(intx,inty){length=x,width=y;}
intperimeter()
{
return2*(width+length);
}
intsquare()
{
returnwidth*length;
}
};
voidmain()
{
rectangler1(30,20);
cout<<"周长:
"<<()<cout<<"面积:
"<<()<}
4.定义一个字符栈类Stack(包括类的实现)。
数据成员包括一个存放字符的数组stck[]和一个栈指针top。
栈数组的尺寸由常量SIZE确定。
栈的基本操作为Push()和Pop()。
#include<>
#include<>
#defineSIZE100
classstack
{
private:
charstck[100];inttop;
public:
stack(){stck[0]=NULL;top=-1;}
/*(chara[100],intb)
{
stck=a;
b=strlen(a);
top=b-1;
}*/
intpush(stack&st,charx)
{
if==SIZE-1)return0;
++;
[top]=x;
return1;
}
intpop(stack&st)
{if==-1)return0;charx;x=[top];;return1;}
};
voidmain()
{
stacks;
cout<<(s,'r')<cout<<(s)<}