面向对象习题Word文件下载.docx
《面向对象习题Word文件下载.docx》由会员分享,可在线阅读,更多相关《面向对象习题Word文件下载.docx(68页珍藏版)》请在冰豆网上搜索。
![面向对象习题Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/7/6bd851b4-9b01-44a0-97c8-b3c8101ed9c5/6bd851b4-9b01-44a0-97c8-b3c8101ed9c51.gif)
:
X(),
~X()
X:
X(参数),
~X(参数)
D.
X(参数),voidX:
~X(参数)
B
分析构造函数无返回类型、可带参数、可重载;
析构函数无返回类型、不可带参数、不可重载。
例题3:
()的功能是对象进行初始化
例题4:
下列表达方式正确的是(
)。
A.classP{B
.classP{
public:
public
intx=15;
intx
;
voidshow(){cout<
<
x
}
};
}
C.classP{D.
classP{
intf;
public
inta
f=25;
voidSeta(intx){a=x;
D
当一个对象定义时,个对象的生命周期结束时,
C++编译系统自动调用构造函数建立该对象并进行初始化;
当一
C++编译系统自动调用析构函数注销该对象并进行善后工作;
在类体内不可对数据成员进行初始化(从类对象区别于其数据成员解释);
类定义结束时需用分号;
只有类中的成员函数才能存取类中的私有数据。
例题5:
拷贝构造函数具有的下列特点中,(
)是错误的。
如果一个类中没有定义拷贝构造函数时,
系统将自动生成一个默认的
拷贝构造函数只有一个参数,并且是该类对象的引用
拷贝构造函数是一种成员函数
拷贝构造函数的名字不能用类名
如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的;
拷贝构造函数只有一个参数,并且是该类对象的引用;
拷贝构造函数的名字与类同名,并且不被指定返回类型;
拷贝构造函数是一种成员函数。
例题6:
关于静态成员的描述中,()是错误的。
A.A.静态成员可分为静态数据成员和静态成员函数
B.B.静态数据成员定义后必须在类体内进行初始化
C.C.静态数据成员初始化不使用其构造函数
D.D.静态数据成员函数中不能直接引用非静态成员
静态成员可分为静态数据成员和静态成员函数;
静态数据成员被定义后,必须对它
进行初始化,初始化在类体外进行,一般放在该类的实现部分最合适,也可以放在其他位置,例如,放在主函数前面等;
静态数据成员初始化与该类的构造函数和析构函数无关;
在静态成员函数的实现中,可以直接引用静态成员,但不能直接引用非静态成员。
例题7:
关于友元的描述中,()是错误的。
A.
A.
友元函数是成员函数,它被说明在类体内
B.
友元函数可直接访问类中的私有成员
C.
友元函数破坏封装性,使用时尽量少用
D.
友元类中的所有成员函数都是友元函数
友元函数是非成员函数,在类体内说明了,在类体外定义,定义和调用等同于一般的普通函数;
由于它可以直接访问类的私有成员,因此破坏了类的封装性和隐藏性,尽量少用。
例题8设有如下程序结构:
classBox
{…};
voidmain()
{BoxA,B,C;
}
该程序运行时调用⑴次构造函数;
调用⑵次析构函数。
(1)3
(2)3
每创建一个对象自动调用一次构造函数,在这里创建了A、B、C三个对象,所以共
调用了三次构造函数;
每释放一个对象,系统自动调用一次析构函数,A、B、C对象释放
时,分别调用析构函数,所以析构函数共调用了三次。
例题9:
设A为test类的对象且赋有初值,则语句testB(A);
表示。
将对象A复制给对象B。
执行testB(A);
语句相当于调用了默认复制构造函数,将A对象的属性复制给B对象。
例题10:
利用“对象名•成员变量”形式访问的对象成员仅限于被声明为⑴的成员;
若要访问其他成员变量,需要通过⑵函数或⑶函数。
("
public
(2)成员函数(3)友元函数
类体内的数据成员可声明为公有的、私有的和保护的,公有的数据成员可利用“对象
名.成员变量”形式来进行访问;
私有的数据成员能被类中的其他成员函数或友元函数所调用;
保护的数据成员可以在类体中使用,也可以在派生类中使用,但不能在其他类外通过对
象使用。
例题11:
分析找出以下程序中的错误,说明错误原因,给出修改方案使之能正确运行。
#include<
iostream.h>
classone
private:
inta1,a2;
public:
one(intx1=0,x2=0);
};
voidmain()
{onedata(2,3);
cout<
data.a1<
endl;
cout<
data.a2<
}分析:
出错原因:
构造函数参数表语法错;
构造函数没有函数体;
的私有成员变量。
改正后的程序如下:
#include<
classone
{inta1,a2;
one(intx1=0,intx2=0){a1=x1;
a2=x2;
intgeta1(){returna1;
intgeta2(){returna2;
voidmain(){onedata(2,3);
data.geta1()<
data.geta2()<
例题12:
分析以下程序的错误原因,给出修改方案使之能正确运行。
#include<
classAmplifier{floatinvol,outvol;
Amplifier(floatvin,floatvout){invol=vin;
outvol=vout;
}floatgain();
Amplifier:
floatgain(){returnoutvol/invol;
{Amplifieramp(5.0,10.0);
"
\n\nThegainis=>
gain()<
成员函数在类体外定义格式是:
函数返回类型类名:
函数调用格式是:
对象名.成员函数名(参数表)。
改正后的程序如下:
classAmplifier
{floatinvol,outvol;
floatAmplifier:
gain(){returnoutvol/invol;
}voidmain()
amp.gain()<
类的对象不能直接访问类
成员函数名(参数表);
成员
例题13:
下列程序的运行结果是。
#include<
classpoint
{intx,y;
point(inta,intb)
{x=a;
y=b;
callingtheconstructorfunction."
endl;
point(point&
p);
friendpointmove(pointq);
~point(){cout<
callingthedestructorfunction.\n"
;
}intgetx(){returnx;
intgety(){returny;
point:
point(point&
p)
{x=p.x;
y=p.y;
callingthecopy_initializationconstructorfunction.'
n"
}-
pointmove(pointq){cout<
OK!
\n"
inti,j;
i=q.x+10;
j=q.y+20;
pointr(i,j);
returnr;
{pointm(15,40),p(0,0);
pointn(m);
p=move(n);
p="
p.getx()<
"
p.gety()<
根据构造函数、拷贝构造函数和友元函数的特点,执行该程序后,输出结果是:
callingtheconstructorfunction.
callingthecopy_initializationconstructorfunction.
OK
callingthedestructorfunction.
P=25,60
callingthedestructorfunction.callingthedestructorfunction.
说明:
(1)构造函数执行三次,分别初始化主函数中的对象m,p和move函数中的对象r。
(2)拷贝构造函数共执行了三次。
第一次,初始化对象n;
第二次在调用函数move()时,实参n给形参q进行初始化;
第三次是执行函数move的returnr;
语句时,系统用r初始化一个匿名对象时使用了拷贝构造函数。
(3)析构函数执行了六次。
在退出函数move时释放对象r和q共调用二次;
返回主函数后,匿名对象赋值给对象p后,释放匿名对象又调用一次析构函数;
最后退出整个程序时释放对象m,n和p调用三次。
例题14:
定义一个学生类,其中有3个数据成员:
学号、姓名、年龄,以及若干成员函数。
同时编写main函数使用这个类,实现对学生数据的赋值和输出。