习题七--类和对象
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题七--类和对象
类和对象
一、选择题
1.下列有关类的说法不正确的是()。
A.对象是类的一个实例
B.任何一个对象只能属于一个具体的类
C.一个类只能有一个对象
D.类与对象的关系和数据类型与变量的关系相似
2.下列表达方式正确的是()。
A.class P{ B. class P{
public: public:
int x=15; int x;
void show(){cout<<<="" };="">
C. class P{ D. class P{
int f; public:
}; int a;
f=25; void Seta (int x) {a=x;}
}
3.下列有关类的说法不正确的是()。
A.类是一种用户自定义的数据类型
B.只有类中的成员函数或类的友元函数才能存取类中的私有数据
C.在类中(用class定义),如果不作特别说明,所有的数据均为私有数据
D.在类中(用class定义),如果不作特别说明,所有的成员函数均为公有数据4.以下有关类与结构体的叙述不正确的是( )
A. 结构体中只包含数据;类中封装了数据和操作
B. 结构体的成员对外界通常是开放的;类的成员可以被隐藏
C. 用struct不能声明一个类型名;而class可以声明一个类名
D. 结构体成员默认为public;类成员默认为private
5.以下有关类和对象的叙述不正确的是( )
A. 任何一个对象都归属于一个具体的类
B. 类与对象的关系和数据类型与变量的关系相似
C. 类的数据成员不允许是另一个类的对象
D. 一个类可以被实例化成多个对象
6.设有定义:
class person
{
int num;
char name[10];
public:
void init(int n, char *m);
...
};
person std[30];
则以下叙述不正确的是( )
A. std是一个含有30个元素的对象数组
B. std数组中的每一个元素都是person类的对象
C. std数组中的每一个元素都有自己的私有变量num和name
D. std数组中的每一个元素都有各自的成员函数init
7.设有以下类的定义:
class Ex
{
int x;
public:
void setx(int t=0);
};
若在类外定义成员函数setx(),以下定义形式中正确的是( )
A. void setx(int t) { ... }
B. void Ex::setx(int t) { ... }
C. Ex::void setx(int t) { ... }
D. void Ex::setx(){ ... }
8.对于类中定义的成员,其默认的访问权限为()。
A.public
B. protected
C.private
D. static
9.为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为()。
A.public
B. protected
C.private
D. static
9.通过指向对象的指针访问对象成员的一般形式是()。
A 指针名.成员名
B 指针名->成员名
10.访问权限只限于类成员访问是()。
A 私有成员
B 公有成员
11. 在C++中,函数原型不能标识( )
A.函数的返回类型
B.函数参数的个数
C.函数参数类型
D.函数的功能
12. 在C++程序中,对象之间的相互通信通过( )
A.继承实现
B.调用成员函数实现
C.封装实现
D.函数重载实现
13. 对于任意一个类,析构函数的个数最多为( )
A.0
B.1
C.2
D.3
14.下面说法正确的是( )
A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方
B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方
C.类的内联函数必须在类体内定义
D.类的内联函数必须在类体外通过加关键字inline定义
二、填空题
1.类的成员函数可以在定义,也可以在定义。
2.类是用户定义的类型,具有类类型的变量称作__________。
3.用于定义C++的类型的关键字有____________、_______和。
4.利用“对象名.成员变量”形式访问的对象成员仅限于被声明为的成员;若要访问其他成员变量,需要通过函数或函数。
5.OOP技术由、、方法、消息和继承五个基本的概念所组成6.引入类定义的关键字是。
类的成员函数通常指定为,类的数据成员通常指定为。
指定为的类成员可以在类对象所在域中的任何位置访问它们。
通常用类的成员表示类的属性,用类的成员表示类的操作。
7.类的访问限定符包括、和。
私有数据通常由函数来访问(读和写)。
这些函数统称为。
8.通常在逻辑上,同一类的每个对象都有代码区,用以存储成员函数。
而在物理上通常只有代码区。
只有在定义,并的函数和加了关键字的函数例外。
9.无论是什么继承方式,派生类的成员不能访问基类_________属性的成员。
10.表达式cout<<end1还可表示为_cout<<=""> 11.C++中语句const char * const p=〃hello〃;所定义的指针p和它所指的内容都不能被_______。
12.假定AB为一个类,则语句AB(AB&x);为该类_________函数的原型说明。
13.说明常成员函数时,关键字const写在成员函数的_________和_________之间。
14.在C++中,访问一个对象的成员所用的运算符是_________,访问一个指针所指向的对象的成员所用的运算符是_________。
三、写出以下程序的结果
1.
#include
class Sample
{ int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;} ~Sample()
{ if(x==y) cout<<"x=y"<<endl;< p="">
else cout<<"x!=y"<<endl;< p="">
}
void disp()
{ cout<<"x="<<x<<",y="<<y<<="">
void main()
{ Sample s1(2,3);
s1.disp(); }
2.
#include class Sample
{ int x;
public:
Sample(int a)
{ x=a;
cout<<"constructing
object:x="<<x<<="">
void func(int n)
{ static Sample obj(n); } void main()
{ func(1);
func(10); }
3.
#include class Sample
{ int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;} void disp()
{cout<<"x="<<x<<",y="<<y<<="">
void main()
{ Sample s(2,3), *p=&s
p->disp();}
4.
#include
class Sample
{ public:
int x;
int y;
void disp()
{cout<<"x="<<x<<",y="<<y<<="" p="" void="" };=""> { int Sample::*pc; Sample s;
pc=&Sample::x; s.*pc=10;
pc=&Sample::y; s.*pc=20;
s.disp();}
5.
#include
class Sample
{ int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;} void disp()
{cout<<"x="<<x<<",y="<<y<<="">
void main()
{ Sample s1,s2(2,3);
s1.disp();
s2.disp(); }
6.
#include
class Sample
{ int A;
static int B;
public:
Sample(int a){A=a,B+=a;}
static void func(Sample s); }; void Sample::func(Sample s) {cout<<"A="<<s.a<<",b="<<b<
void main()
{ Sample s1(2),s2(5);
Sample::func(s1);
Sample::func(s2);}
7.
#include
class Sample
{ char c1,c2;
public:
Sample(char a){c2=(c1=a)-32;} void disp()
{ cout<<c1<<"转换为"<<c2<<="">
void main()
{ Sample a('a'),b('b');
a.disp();
b.disp();}
8.
#include class Sample
{ int x,y;
public:
Sample(){x=y=0;} Sample(int a,int b){x=a,y=b;} void disp() {cout<<"x="<<x<<",y="<<y<<="">
void main()
{ Sample s1,s2(1,2),s3(10,20);
Sample *Pa[3];
Pa[0]=&s1
Pa[1]=&s2 Pa[2]=&s3
for(int i=0;i<3;i++) Pa[i]->disp();}
9.
#include class Sample
{ int x; int y;
public:
Sample(int a,int b)
{ x=a;y=b;}
int getx(){return x;}
int gety(){return y;} }; void main()
{ int (Sample::*fp)();
fp=&Sample::getx;
Sample s(2,7);
int v=(s.*fp)();
fp=&Sample::gety;
int t=(s.*fp)();
cout<<"v="<<v<<",t="<<t<<="">
10.
#include class Sample
{ int x; int y;
public:
Sample(int a,int b)
{ x=a;y=b; }
int getx(){return x;}
int gety(){return y;} }; void main() { int (Sample::*fp)();
fp=&Sample::getx;
Sample s(2,7),*p=&s
int v=(p->*fp)();
fp=&Sample::gety;
int t=(p->*fp)();
cout<<"v="<<v<<",t="<<t<<=""> 11.
#include
void main( )
{
int *a;
int *&p=a;
int b=10;
p=&b
cout<<*a;
}
输出为:
12.
#include
template
Tf(T*a,T*b,int n){
Ts=(T)0;
for(int i=0;i<="">
}
void main()
{
double c 〔5〕={1.1,2.2,3.3,4.4,5.5},d〔5〕={10.0,100.0,1000.0}; cout<<f(c,d,5)<<endl;< p=""> }
输出为:2531
13. 运行下面的程序,写出当输入25,60时的输出结果。
#include
class goods{
private:
static int totalWeight;
int weight;
public:
goods(int w)
{
weigh=w;
totalWeight+=w;
}
goods(goods& gd)
{
weight=gd.weight;
totalWeight+=weight;
}
~goods()
{
totalWeight-=weight;
}
int getwg()
{
return weight;
}
static int getT otal()
{
return totalWeight;
}
};
int goods::totalWeight=0;
void main()
{
int w;
cout<<〃The initial weight of goods:〃<<goods::gettotal()<>w; //输入25</goods::gettotal()< goods g1(w);
cin>>w; //输入60
goods g2(w);
cout<<〃The total weight of goods:〃<<goods::gettotal()<<="">
输出为:
14.
#include
class My Class {
public:
int number;
void set(int i);
};
int number=3;
void MyClass::set (int i)
{
number=i;
}
void main()
{
MyClass my1;
int number=10;
my1.set(5);
cout<<my1.number<<end1;< p="">
my1.set(number);
cout<<my1.number<<endl;< p="">
my1.set(::number);
cout<<my1.number;< p="">
}
输出为:
四、改错题
1. 指出下面程序段中的错误,并说明出错原因。
class A{
int a,b;
public:
A(int aa,int bb) {a=aa;b=bb;}
};
A x(2,3),y(4);
2. 指出下面程序段中的错误,并说明出错原因。
class Location {
int X,Y=20;
protected:
int zeroX,zeroY;
int SetZero(int ZeroX,int ZeroY); private:
int length,height;
public:
float radius;
void init(int initX,int initY);
int GetX( );
int GetY( );
};
五、完成程序题,根据题目要求,完成程序填空。
1.下面是一个用户口令检查程序,在横线处填上适当语句完成程序功能。
#include
#include
_ _ _ //定义由PASS指针所指向的口令wolleh。
void main()
{
char user〔10〕;//用于存放输入的口令
cout<<〃please input your password:〃<<endl;< p="">
_ _ _ //输入口令
if((strcmp(user,PASS))==0)
cout<<〃your password is correct〃<<endl;< p="">
else
cout<<〃your password is error〃<<endl;< p="">
}
2.下面是类fraction(分数)的定义,其中重载的运算符<<以分数形式输出结果,例如将三分之二输出为2/3。
在横线处填上适当字句。
class fraction{
int den; //分子
int num; //分母
friend ostream& operator<<(ostream&,fraction);
…
};
ostream& operator <<(ostream& os,fraction fr){
_cout<<den<< p="" ”="" ”<<num<<endl__;<="">
return _________;
}
30.在下面程序横线处填上适当的字句,使其输出结果为0,56,56。
#include
class base{
public:
____ _ {return 0;}
};
class derived:public base{
public:
int a,b,c;
___ _ _ setValue(int x,int y,int z){a=x;b=y;c=z;}
int func( ){return(a+b)*c;}
};
void main()
{
base b;
derived d;
cout<<<′,′;<="" p="">
d.setValue(3,5,7);
cout<<<′,′;<="" p="">
base& pb=d;
cout<<<end1;<="" p="">
}
六、编程题
1. 定义一个学生类,其中有3个数据成员:学号、姓名、年龄,以及若干成员函数。
同时编写main函数使用这个类,实现对学生数据的赋值和输出。
2. 编写一个程序计算两个给定的长方形的周长和面积。
3. 编写一个程序,采用一个类求n!,并输出10!的值。
4. 编写一个程序,设计一个Cdate类,它应该满足下面的条件:
1)用这样的格式输出日期:日-月-年;
2)输出在当前日期上加两天后的日期;
3)设置日期。
5. 有若干教师,每个教师只有姓名,一个教师可以指导多名研究生;每名研究生有姓名、研究方向和班号数据,编写一个程序,要求输出每个教师指导的所有研究生的姓名、研究方向和班号数据。
6. 下面是一个类的测试程序,设计出能使用如下测试程序的类。
void main()
{ Test a;
a.init(68,55);
a.print(); }
其执行结果为:
测试结果:68-55=13
7. 设计一个Bank类,实现银行某账号的资金往来账目管理,包括建账号、存入、取出等。
分析:Bank类包括私有数据成员top(当前账指针),date(日期),money(金额),rest(余额)和sum(累计余额)。
另有一个构造函数和三个成员函数bankin()(处理存入账),bankout()处理取出账)和disp() (输出明细账)。
</den<<>
</endl;<>
</endl;<>
</endl;<>
</my1.number;<>
</my1.number<<endl;<>
</my1.number<<end1;<>
</goods::gettotal()<
</f(c,d,5)<<endl;<>
</v<<",t="<<t<
</v<<",t="<<t<
</x<<",y="<<y<
</c1<<"转换为"<<c2< </s.a<<",b="<<b<
</x<<",y="<<y<
</x<<",y="<<y<
</x<<",y="<<y<
</x<
</x<<",y="<<y<
</endl;<>
</endl;<>
</end1还可表示为_cout<。