《面向对象程序设计》复习.docx
《《面向对象程序设计》复习.docx》由会员分享,可在线阅读,更多相关《《面向对象程序设计》复习.docx(16页珍藏版)》请在冰豆网上搜索。
《面向对象程序设计》复习
《面向对象程序设计》课程复习
〇、成绩构成
1、平时成绩:
15分(考勤+作业)
2、实验成绩:
25分(实验+课程设计)
3、考试成绩:
60分
一、考试题型
选择题30分
填空题20分
判断题15分
简答5分
程序分析20分
程序编写10分
二、选择题
1.C++代码源文件的扩展名应为(B)
A.cB.cppC.objD.exe
2.函数声明为:
charfun(inta);floatfun(char*p);intfun(int&b);则以下函数调用语句正确的是(C)
A.fun(5)B.intb;fun(&b);C.char*p;fun(p);D.inta;fun(a)
3.标准输入流对象cin无法读取(C)
A.数值B.字符串C.空白字符D.字符
4.不是C++关键字的是(C)
A.mutableB.classC.FriendD.virtual
5.通过(A)方法可以在现有类基础上定义新类。
A.继承B.引用C.包含D.封装
6.成员函数亦可声明为静态的,但是它不能直接访问类的(D)数据成员
A.私有B.静态C.常量D.非静态
7.若类B的定义中私有数据成员i为常数据成员,则(B)
A.数据成员i不能被一般的成员函数所访问
B.数据成员i的初始化可以在构造函数的函数体中实现
C.数据成员i可以被常成员函数访问和赋值
D.以上均不对
8.在编译时,将所调用的函数代码嵌入到主调函数中,这种嵌入到主调函数中的函数不能称为(D)
A.内置函数B.内联函数C.内嵌函数D.嵌套函数
9.存储以下数据,占用存储字节最多的是(D)
A.NULLB.'0'C."0"D.0.0
10.面向对象的程序是(D)两者的组合
A.算法和数据结构B.对象和函数
C.函数和算法D.对象和消息
11.如果调用带有默认参数的函数时缺少一个参数,则( C )参数就作为这一参数
A.第1个B.中间1个C.最后一个D.系统随机选择
12.假定A为一个类,则执行Aa,b[2],*p=&a,c(*p);语句后,程序将要结束时,共调用该类析构函数的次数应为(C)
A.2B.3C.4D.5
13.已有定义:
char*p="ABC";则下面语句正确的是(D)
A.*p="ABC";B.p[0]="A";C.p[2]='C';D.charc=p[1];
14.已知f1和f2是同一类的两个成员函数,但f1不能直接调用f2,这说明(B)
A.f1和f2都是静态函数B.f1是静态函数,f2不是静态函数
C.f1不是静态函数,f2是静态函数D.f1和f2都不是静态函数
15.下列关于函数模板与类模板的描述中,不正确的是(D)
A.函数模板的实例化是由编译程序在处理函数调用时自动完成
B.类模板的实例化必须由程序员在程序中显式的指定
C.函数模板与类模板均可以显式调用
D.定义函数模板时可以使用多个类型参数,而类模板不可以
16.对于语句cout>>a;,下列描述中不正确的是(C)
A.“cout”是一个输出流对象B.该语句错误使用了运算符
C.“>>”称作插入运算符D.该语句需要头文件iostream
17.下面运算符中,不能被重载的运算符是(C)
A.<=B.-C.?
:
D.[]
18.以下不属于面向对象的程序设计语言的是(D)
A.C#B.C++C.JavaD.C
19.下列关于C++中运算符重载的描述中,错误的是(C)
A.运算符重载是对已有的运算符赋予多重含义
B.重载的运算符,其运算对象可以是自定义的数据类型
C.编译系统对重载运算符的选择,遵循函数模板的选择原则
D.运算符的重载实质上是函数的重载
20.假定p所指对象的值为5,p+1所指对象的值为8,则执行“(*p)++;”语句后,p所指对象的值为( A )
A.6B.9C.5D.8
21.运算符重载时不需要保持的性质是( B )
A.操作数个数B.操作数类型C.优先级D.结合性
22.已有定义:
char*str="abcd";则下面语句正确的是(C)
A.str[0]="a";B.str[1]='b';C.charc=str[0];D.*str="xyzw";
23.已知:
intk=6;则下列语句中能正确表示引用的是(B)
A.intx=k;B.int&x=k;C.int&x=6;D.int&x=&k;
24.下列虚基类的声明中,正确的是(A)
A.classB:
virtualpublicAB.classvirtualB:
publicA
C.virtualclassB:
publicAD.classB:
publicAvirtual
25.已有定义virtualintarea()=0;下面关于该函数的解释中正确的是(A)
A.该函数是纯虚函数B.该函数返回值为0
C.该函数通常在派生函数中声明D.该函数的入口地址为0
26.作为类的成员函数重载一个运算符时,如果参数表为空,通常情况下,说明该运算符有(B)个操作数
A.0B.1C.2D.3
二、填空题
27.重载函数在参数类型或参数个数上不同,但函数名称相同。
28.若要把变量s定义为短整型变量k的引用,则所使用的定义语为int&s=k。
29.已有定义constinta=5;则要定义一个常指针指向该变量a的语句是:
constint*p=&a
30.常对象中的数据成员必须通过___构造__函数才可以访问。
31.对象将其大部分实现细节隐藏起来,这种机制称为封装。
32.C++中,专门用于定义重载运算符的关键字是operator。
33.用于存贮当前被调用的成员函数所在对象的起始地址的指针是___this_____。
34.如果希望类的成员为该类所有对象所共享,可以使用关键字__static___来修饰。
35.在C++中,由继承而产生的新类,它的对象对同一个消息会作出不同的响应,这种特性被称为多态。
36.已有类A的定义,其中有成员函数intget_a(){returna;}则定义一个指针指向该函数的写法为int*p=geta;。
37.classw{staticchara;
chary[2];intx;
doublefun(inta){x=a;return0;}
};
则sizeof(w)的值为8。
38.从系统实现角度看,C++中的动态多态性是通过虚函数基类指针来实现的。
39.语句cout<40.在C++中,用户管理文件的I/O操作需要头文件。
41.在C++中,用于动态分配内存的运算符是new。
42.在类的定义中,通常用构造函数为对象分配内存空间,并可对类的数据成员进行初始化。
43.在C++中,继承间接共同基类时只保留一份成员的方法是使用虚基类。
44.现有如下定义:
intx='B'+2;chary=x>='9'?
'C':
'S';则y是'C'。
45.假设类X的对象x是类Y的成员对象,则“YObj;”语句执行时,先调用类_____X____的构造函数,再调用类_____Y___的构造函数;而在程序结束析构时,先调用类____Y______的析构函数,再调用类_____X____的析构函数。
46.对象的概念中,有静态和动态两种特征,其中静态特征称为属性,可由数据表示,而动态特征称为行为,可由方法表示。
47.继承关系可以是public、protected和private。
三、判断题
48.常数据成员只能通过构造函数的初始化表初始化。
1
49.类所占空间为数据成员和成员函数所占空间之和。
0
50.char*str="abcd";执行str[0]='s';语句后,字符串变为"sbcd"。
0
51.类的析构函数在删除对象时调用,并可以重载。
0
52.构造函数不能声明为虚函数,而析构函数可以声明为虚函数。
1
53.用来存放对象地址的指针变量,可称为指向对象的指针。
1
54.字符串"CDU"的长度是3,因此占用了3个字节的内存空间。
0
55.多重继承出现的二义性可以用作用域限定的方法消除。
1
56.<<运算符可以被重载,且可以提升优先级。
0
57.无论何种继承形式,派生类均不能直接访问基类的私有成员。
1
58.C++中,定义类的关键字是public。
0
59.抽象类定义的目的是用它作为基类去建立派生类。
0
60.常对象中的数据成员就是常数据成员。
0
61.对象基本特点有耦合性、多态性、继承性和封装性。
0
62.构造函数有返回值,而析构函数没有返回值。
0
63.类定义的公用数据成员x,在类外可以直接赋值,如x=5;0
64.若想输出时,数据靠右,并指定字段宽度为6,可用控制符setw(6)。
1
65.不出现类名,也可以直接定义对象。
1
四、简答题
66.C++语言中,构造一个派生类需要做哪些工作?
先声明一个基类,然后再声明一个类并且继承至我们的基类。
这时我们的这个类就是基类的派生类。
67.什么是纯虚函数,什么情况下用到纯虚函数?
纯虚函数是没有实现,只有声明的函数。
纯虚函数一般用到抽象基类中,让每一个抽象基类的派生类都有一个公共的接口。
即该纯虚函数。
68.什么叫虚基类,它的主要作用是什么?
基类的派生类通过virtual方式继承,那么这个基类就是虚基类。
虚基类是为了保证在继承间接共同基类时只保留一份成员。
69.如果重载运算符要满足交换律,有哪些方法实现?
以友元函数的方式重载运算符。
70.类模板有什么作用?
如何声明一个类模板。
建立一个抽象的通用类。
类型暂时不定,当调用的时候才指定。
这样减少了代码量,增加了类的灵活性。
声明一个类模板需要在一个类的声明前加上template
71.已知有类Test,公用成员函数display();简要解释语句Teststu1;stu1.display();并指出语句中的“对象”、“方法”和“消息”。
stu1是一个对象,display()是一个方法stu1.display()就是一个消息
72.用C++语言实现如下功能:
用new分配一个字符串,名称为s。
并将"C++"存放到该字符串s中,最后释放该内存。
string*s=newstring(“C++”);delete(s);
73.假定有一个类,名称为A,有1个整形数据成员x。
请写出该类析构函数和2个构造函数。
~A(){}A(){}A(intx):
x(x){}
74.假定有一个类,名称为B,是由类A保护继承而来,根据基类成员在派生类中的访问属性,填写下表。
在基类的访问属性
在派生类的访问属性
私有
不可访问
公有
保护
保护
保护
五、程序分析题
75.下面程序中有一处错误,请用下划横线标出错误所在行并说明出错原因。
floata(intx,inty)
{floatz;z=x+y;returnz;}
inta(floatx,floaty)
{intz;z=x-y;returnz;}
intmain()
{
inti=3;floatj=3.5;
cout<cout<return0;
}
出错原因:
有多个重载函数a实例与之匹配
76.阅读程序,在横线处填上适当字句。
#include
#include
usingnamespacestd;
template//声明一个类模板,虚拟类型名为type
classA{
typex,y;
public:
A(typea,typeb){x=a;y=b;}
typecmp(){return(x+y);}
};
intmain(){
Acp1(6.6,3.6);
Acp2("12","34");
cout<return0;
}
输出结果为:
91234
77.请在下划横线处填写程序的输出结果。
classPoint{intx,y;
public:
Point(intx1=5,inty1=6){x=x1;y=y1;}
~Point(){cout<voidmain()
{
Pointa;
Pointb(8,8);
}
输出结果为:
88isdeleted.56isdeleted.
78.阅读程序,在下划横线处填写适当字句。
classA{
chara;
shortb;
public:
voidout(){a=20;b=40;
char*p;p=&a;
cout<<"a="<<(short)(*p++)<<'\t'<<"b="<
}
};
intmain()
{
Atest;
test.out();
cout<<"thesizeoftestis:
"<return0;
}
输出结果为:
a=20b=40
thesizeoftestis:
4
79.请在下划横线处填写程序的输出结果。
voidmain()
{
inty=9;
for(;y>0;y--;)if(y%3==0)cout<}
输出结果为:
963
80.阅读程序,在下划横线处填写适当字句。
classA{
constinta;
staticintb;
public:
A(intx):
a(x){}//构造函数,用变量x初始化数据成员a
intget_a()const{returna;}
intget_a(){returna+b;}
};
//用常数333初始化数据成员b
int main() {
constAtest1(111);Atest2(222);
cout<return0;
}
输出结果为:
81.阅读程序,在下划横线处填写适当字句。
classA{
protected:
inta;
public:
A(){a=1;}
};
classB1:
publicA{
public:
B1(){}
};
classB2:
publicA{
public:
B2(){}
};
classC:
publicB1,publicB2//C类由直接基类B1和B2公有派生
{
public:
Derived(){}
voidInit(intb){
B1:
:
a=b;;//b赋给基类B1的a成员
}
};
82.下面程序中有一处错误,请用下横线标出错误所在行并说明出错原因。
classbase{
public:
intx;
};
classOne:
publicbase{};
classTwo:
publicbase{};
classOT:
publicOne,publicTwo{
public:
intfunc();
};
voidmain(){
OTp;
p.base:
:
x;p.base:
:
x不明确
}
六、编程题
83.假定有一个类,名称为A,有1个字符型的数据成员c和1个整形数据成员x。
请写出该类的至少2个不同的构造函数形式。
classA
{
public:
charc;
intx;
A(){}只写这几行就可以了
A(charc):
c(c){}
A(intx):
x(x){}
A(charc,intx):
c(c),x(x){}
}
84.分别用new和malloc()分配一个有5个元素的整形数组,名称为a。
int*a;
a=newint[5];
a=(int*)malloc(5*sizeof(int));
85.完成一个求圆面积的小程序,要求如下:
1定义一个基类:
点类(Dot),包括x坐标和y坐标(公有或保护),从它派生一个圆类(Circle),增加私有数据成员r(半径);
classDot
{
public:
intx;
inty;
}
classCircle:
publicDot
{
private:
intr;
Circle(intr,intx=0,inty=0):
r(r),x(x),y(y){}
voidinput()
{
cout<<”输入圆的圆心横纵坐标和半径:
”<cin<}
floatarea()
{
return3.1415*r*r;
}
}
2圆类的函数成员包括构造函数、输入圆心坐标及圆半径的函数(input)、计算并返回面积的函数(area);
3主函数中生成一个圆类对象crc,通过构造函数或input函数为数据成员赋值,圆心坐标为(6,6),半径为5。
使用对象crc的函数成员area计算面积,主函数输出结果。
voidmain()
{
Circle*crc;
crc=newCircle(5,6,6);
cout<<”圆的面积为:
”crc->area<}
86.编写类的定义,完成如下要求:
①定义一个People类,它的数据成员有年龄、姓名和性别;(字符串使用字符数组形式)
②以People类为基类,从中派生出学生类Student;
③在Student类中,新增一个数据成员为高数成绩;
④所有数据成员的输入由Student类构造函数实现;
⑤Student类有一成员函数为输出函数,用于输出所有数据成员;
⑥主函数用自己的信息定义一个学生对象,并输出该信息。
classPeople
{
public:
intage;
charname[20];
charsex;
People(intage,char*&name,char*&sex)
{
age=age;
strcpy(name,name);
strcpy(sex,sex);
}
}
classStudent:
publicPeople
{
public:
intscore;
Student(intage,char*&name,char*&sex,intscore):
People(age,name,sex),score(score){}
voiddisplay()
{
cout<<”姓名:
”<}
}
voidmain()
{
Student*s;
s=newStudent(17,”张三”,“m”,100);
s->display();
}