【参考答案】
【4】246
(5)下列程序在构造函数和析构函数中申请和释放类的数据成员int*a,申请时使用形参b初始化a,请填空。
classA
{public:
A(intb);
~A();
private:
int*a;};
A:
:
A(intb)
{【5】;}
A:
:
~A()
{【6】;}
【参考答案】
【5】a=newint(b);【6】deletea
6.多态性与【7】和【8】共同构成面向对象程序设计的三大机制。
【参考答案】
【7】数据封装【8】继承
(7)将x+y*z中的"+"用成员函数重载,"*"用友元函数重载应写为【9】。
【参考答案】
【9】x.operator+(operator*(y,z))
(8)派生类的成员一般分为两部分,一部分是【10】,另一部分是自己定义的新成员。
【参考答案】
【10】从基类继承的成员
(9)以下程序输出的结果是【11】。
#include"iostream.h"
voidmain()
{inta=5,b=4,c=3,d;
d=(a>b>c);
cout< 【参考答案】
【11】0
(10)如果要把返回值为void的函数A声明为类B的友元函数,则应在类B的定义中加入的语句是【12】。
【参考答案】
【12】friendvoidA();
(11)如果类B继承了类A,则称类A为类B的基类,类B称为类A的【13】。
【参考答案】
【13】派生类
(12)将x+y中的+运算符用友元函数重载应写为【14】。
【参考答案】
【14】operator+(x,y)
(13)已知程序的结果为123,请填空。
#include template classA
{public:
Tx,y,z;
voiddisplay(){cout< voidmain()
{Aa1;
【15】
【16】
【17】
a1.display();}
【参考答案】
【15】a1.x=1【16】a1.y=2【17】a1.z=3
(14)下列程序段的输出结果是【18】。
cout< 【参考答案】
【18】509.123457
四、综合应用题
1.使用VC6打开考生文件夹下的工程kt15_3。
此工程包含一个kt15_3.cpp,其中定义了类A、A1和A2,其中A1类由A类公有派生,A2类由A1类公有派生。
上述三个类的定义并不完整,请按要求完成下列操作,将程序补充完整。
(1)定义类A的构造函数,该构造函数有一个整型的参数x,在构造函数中请将x赋值给数据成员a。
请在注释“//**1**”之后添加适当的语句。
(2)定义类A1的构造函数,该构造函数有两个整型参数x和y,在构造函数中请将x赋值给数据成员b,将y作为基类A构造函数的参数值传入。
请在注释“//**2**”后添加适当的语句。
(3)定义类A2的构造函数,该构造函数有三个整型的参数x,y和z,在构造函数中请将x赋值给数据成员c,将y和z分别赋值给基类A1构造函数的参数x和y。
请在注释“//**3**”之后添加适当的语句。
(4)完成类A2的成员函数show的定义,该函数调用基类成员函数,输出基类数据成员a和b及类A2自身的数据成员c的值,上述三个值在输出时以空格隔开。
请在注释“//**4**”之后添加适当的语句。
注意:
除在指定位置添加语句之外,请不要改动程序中的其他内容。
程序输出结果如下:
9
6
962
源程序文件kt15_3.cpp清单如下:
#include
classA
{inta;
public:
//**1**
intgeta(){returna;}};
classA1:
publicA
{intb;
public:
//**2**
intgetb(){returnb;}};
classA2:
publicA1
{intc;
public:
//**3**
voidshow()
{//**4**}};
voidmain()
{A2a(2,6,9);
cout< cout< a.show();}
【参考答案】
(1)A(intx){a=x;}
(2)A1(intx,inty):
A(y){b=x;}
(3)A2(intx,inty,intz):
A1(y,z){c=x;}
(4)cout< cout<五、阅读程序题(写出程序运行结果)
1.#include
#include
classStudent
{public:
Student(char*pName="Noname")
{cout<<"构造新同学:
"<strncpy(name,pName,sizeof(name));
name[sizeof(name)-1]='\0';
}
Student(Student&s)
{cout<<"构造copyof"<strcpy(name,"copyof");
strcat(name,s.name);
}
~Student()
{cout<<"析构"<protected:
charname[40];};
classTutor
{public:
Tutor(Student&s):
student(s)
{cout<<"构造指导教师\n";}
protected:
Studentstudent;
};
voidmain()
{Studentst1;
Studentst2("zhang");
Tutortutor(st2);
}
2.#include"iostream.h"
classB1
{protected:
intb1;
public:
B1(intval1)
{b1=val1;
cout<<"base1iscalled"<};
classB2
{protected:
intb2;
public:
B2(intval2)
{b2=val2;
cout<<"base2iscalled"<};
classD:
publicB1,publicB2
{protected:
intd;
public:
D(intval1,intval2,intval3);
};
D:
:
D(intval1,intval2,intval3):
B1(val1),B2(val2)
{d=val3;
cout<<"derivedclassiscalled";}
voidmain()
{Ddobj(1,2,3);}
3.#include
#include
classmarried
{private:
intnumber;
char*name;
public:
staticintglob;
voidset_mes(char*a);
};
voidmarried:
:
set_mes(char*a)
{name=newchar[strlen(a)+1];
strcpy(name,a);
number=++glob;
cout<<"编号:
"<}
intmarried:
:
glob=0;
voidmain()
{marriedperson[100];
inti;
charstr[8];
cout<for(i=0;i<3;i++)
{cout<<"输入姓名:
";cin>>str;
person[i].set_mes(str);}
cout<}
假定输入
zhang↙
wang↙
li↙
请写出程序的结果。
4.
#include
templateclassABC
{private:
Tarray[I];
public:
voidset(intx)
{inti;
for(i=0;i
array[i]=x+i;
}
voidget()
{cout<<"\n数组元素总数为:
"<
cout<<"array["<};
voidmain()
{ABCabc1;
abc1.set(0);
abc1.get();
ABCabc2;
abc2.set(10);
abc2.get();}
程序运行结果:
5.#include
classStudent
{public:
Student()
{cout<<”constructstudent.\n”;
semeshours=100;
gpa=3.5;}
protected:
intsemeshours;
floatgpa;
};
classTeacher
{public:
Teacher(){cout<<”constructTeacher.\n”;}
};
classTourpair
{public:
Tourpair()
{cout<<”constructtourpair.\n”;
nomeeting=0;}
protected:
Studentstudent;
Teacherteacher;
intnomeeting;
};
voidmain()
{Tourpairtp;
cout<<”backinmain.\n”;}
6.#include
classMyclass
{private:
intx;
inty;
public:
Myclass(inta,intb){x=a;y=b;}
voidprint();
voidmyfunc();
};
voidMyclass:
:
print()
{cout<<"x="<voidMyclass:
:
myfunc()
{intx=9,y=10;
cout<<"Inmyfunc:
x="<cout<<"Myclass:
:
x="<:
x<<","<<"<:
y="<:
y<}
voidmain()
{Myclasstest(100,200);
test.print();//通过对象名访问公有成员
test.myfunc();}
7.#include
classA
{private:
inta;
public:
A(inti=0){a=i;}
voidprint();
};
voidA:
:
print()
{cout<<"InclassA,print()iscalled."<classB:
publicA
{
private:
intb;
public:
B(intj=-1){b=j;}
};
voidcommfun(A&aref)
{aref.print();}
voidmain()
{Aa;
commfun(a);
Bb;
commfun(b);
}
8.#include“iostream.h”
classX1()
{private:
intx;
public:
X1(inti){x=i;}
intgetx();
friendvoidsum(X1&a,X1&b);
};
intX1:
:
getx(){returnx;}
voidsum(X1&a,X1&b)
{cout<<"用友元函数求各和:
"<voidsum1(X1&a,X1&b)
{cout<<"用普通函数调用类公共接口函数求和:
"
<voidmain()
{X1m
(1);
X1n
(2);
sum(m,n);
sum1(m,n);}
答案:
1.执行结果如下:
构造新同学:
Noname
构造新同学:
zhang
构造copyofzhang
构造指导教师
析构copyofzhang
析购zhang
析构Noname
2.该程序的执行结果是:
base1iscalled
base2iscalled
derivedclassiscalled
3.程序的结果:
Zhang
编号1
Wang
编号2
Li
编号3
4.程序的结果:
数组元素总数为:
50
array[49]=49
数组元素总数为:
100
array[99]=109
5.其执行结果是:
constructstudent.
constructteacher.
constructtourpair.
backinmain.
6.程序的运行结果为:
x=100,y=200
Inmyfunc:
x=9,y=10
Myclass:
:
x=100,Myclass:
:
y=200
7.程序的运行结果为:
InclassA,print()iscalled.
InclassA,print()iscalled.
8.程序的运行结果为:
用友元函数求各和:
3
用普通函数调用类公共接口函数求和:
3
六、编程题
1.定义类模板ABC,内含成员函数set和get。
用ABC生成对象abc1和abc2。
它们的数组元素数不同,显示的结果也不同。
#include
//定义类模板ABC
templateclassABC
{private:
Tarray[I];//定义数组array
public:
voidset(intx)//定义成员函数set
{inti;
for(i=0;i
array[i]=x+i;//数组元素赋值
}
voidget()//定义成员函数get
{cout<<"\n数组元素总数为:
"<
cout<<"array["<};
voidmain()
{//由模板ABC生成对象abc1
ABCabc1;
abc1.set(0);//调用对象abc1.set
abc1.get();//调用对象abc1.get
//由模板ABC生成对象abc2
ABCabc2;
abc2.set(10);//调用对象abc2.set
abc2.get();//调用对象abc2.get
}
2.类Build_1是一个关于楼房数据的类。
它的数据成员有posi_x、posi_y和area,分别是楼房位置的经、纬度和建筑面积。
它的函数成员只有set1,用于设置数据成员posi_x、posi_y和area的值。
让Build_1作为基类,再增加数据成员high、函数成员set2和disp来定义派生类Build_2。
#include
classBuild_1//定义基类
{protected:
intposi_x;//有三个保护型的数据成员
intposi_y;
intarea;
public:
voidset1(intx,inty,inta)
{posi_x=x;posi_y=y;area=a;}
};
//定义派生类Build_2
classBuild_2:
publicBuild_1
{intheight;
public:
voidset2(inth)
{height=h;}
voiddisp()
{cout<<"\n经度:
"<cout<<"纬度:
"<cout<<"高度:
"<cout<<"面积:
"<
};
voidmain()
{//用Build_2生成对象obj
Build_2obj;
obj.set1(100,200,300);
obj.set2(400);
obj.disp();
}