C简答题和编程题汇总题库Word下载.docx
《C简答题和编程题汇总题库Word下载.docx》由会员分享,可在线阅读,更多相关《C简答题和编程题汇总题库Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
(1)派生类CB中的成员函数能否引用基类CA中的数据成员i,j,k?
(2)派生类CC中的成员函数能否调用基类CA中的成员函数fun1和fun2?
(3)能否在main函数中用c.fun1(),c.fun2(),c.fun3()和c.fun4()调用fun1,fun2,fun3,fun4成员函数?
答:
(1)可以用b1.i引用对象b中的基类A的成员i,因为它是公用数据成员。
不能用b1.j引用对象b中的基类A的成员j,因为它是保护数据成员,在类外不能访问。
不能用b1.k引用对象b中的基类A的成员k,因为它是私有数据成员,在类外不能访问。
(2)可以引用基类A中的数据成员i,j,因为它们在派生类中是公用成员和保护成员,可以被派生类的成员函数访问。
不可以引用基类A中的数据成员k,它在
1
派生类中是不可访问的成员。
(3)可以调用成员函数f1,f3,f4,它们是公用成员函数。
不能调用成员函数f2,因为它是保护成员函数。
2.为什么要使用虚基类?
怎样定义虚基类?
用一个实例来解释虚基类在其派生类中的存储方式。
如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。
如图所示:
(a)派生关系(b)存储图
存储关系如(b),在职研究生类有两个Person拷贝。
为避免这种情况,可使用虚基类。
虚基类(virtualbaseclass)定义方式如下:
class派生类名:
virtual继承方式基类类名{...};
virtual关键字只对紧随其后的基类名起作用。
采用虚基类后存储关系如下:
采用虚基类后在职研究生类储存图
3.请比较函数重载和虚函数在概念和使用方式方面有什么区别?
(1)函数重载可以用于普通函数(非成员函数)和成员函数,而虚函数只能用于类的成员函数;
(2)函数重载可以用于构造函数,而虚函数不能用于构造函数;
(3)如果对成员函数进行重载,则重载的函数与被重载的函数应当都是同一个类的成员函数,不能分属于两个不同继承层次的类。
虚函数是对同一类族中基类和派生类的同名函数的处理,即允许在派生类中对基类的成员函数重新定义。
(4)重载的函数必须具有相同的函数名,但函数参数个数和参数类型二者中至少有一样不同。
而虚函数则要求在同一族中的所有虚函数不仅函数名相同,而且要求函数类型、函数参数个数和参数类型都全部相同。
(5)重载的函数是在程序编译阶段确定操作对象的,属静态关联。
虚函数是在程序运行阶段确定操作的对象的,属动态关联。
4.派生类的析构函数中需完成什么任务?
是否要编写对基数和成员对象的析构函数的调用?
为什么?
析构函数的功能是在对象被系统释放之前做必要的“清理现场”的工作,析构函数无返回类型也没有参数,情况比较简单。
派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。
5.简单叙述派生类与基类的赋值兼容规则。
凡是基类所能解决的问题,公有派生类都可以解决。
在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。
它包括以下情况:
(1)派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。
反过来不行,因为派生类的新成员无值可赋。
(2)可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。
同样也不能反过来做。
(3)派生类对象可以初始化基类的引用。
引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员。
6.为什么析构函数总是要求说明为虚函数?
在基类中及其派生类中都动态分配内存空间时,必须把析构函数定义为虚函数,实现撤消对象时的多态性。
根据赋值兼容规则可以用基类的指针指向派生类对象,如果由该指针撤销派生类对象,则必须将析构函数说明为虚函数,实现多态性,自动调用派生类析构函数。
我们总是要求将类设计成通用的,无论其他程序员怎样调用都必须保证不出错,所以必须把析构函数定义为虚函数。
二、编程题
1.(类的声明和运算符重载)设计一个日期类Date,要求:
(1)可以建立具有指定日期(年、月、日)的Date对象,默认日期是2007.1.1。
(2)可以从输出流输出一个格式为“年-月-日”的日期,其中年是四位数据,月、日可以是一位也可以是两位数据。
(3)可以动态地设置年、月、日。
(4)可以用运算符==对两个日期进行是否相等的比较。
(5)在主函数中进行该类的测试。
2.编写一个程序,涉及一个类score用于统计一个班的学生成绩,其中使用一个静态数据成员sumfenshu存储总分和一个静态成员函数Getsumfenshu()返回该总分。
3.用类模板方式设计一个栈类Stack<
T>
其中有两个私有数据成员s[](存放栈元素)和top(栈顶元素下标),以及三个公有成员函数push(元素入栈)、pop(元素出栈)和stackempty(判断栈是否为空),并建立一个整数栈和一个字符栈。
4.(类的声明和友元函数)设计一个程序,其中有三个类CBank、BBank、GBank,分别为中国银行类、工商银行类和农业银行类。
每个类都包含一个私有数据balance用于存放储户在该行的存款数,另有一个友元函数max用于显示三
编程题2的类结构
5.(类的继承和类的组合)实现两个类person类和scores类,其中person类中
包含了公有的个人基本信息,如姓名、性别和年龄等。
scores类包含了公有的考试科目成员如语文、数学、英语等的成绩。
现要求实现一个student类,它继承自person类,并加入了私有的一个表示学号的新成员number和一个scores成员对象。
要求:
(1)student类中的个人基本信息和成绩单的访问属性为私有;
(2)重载的student构造函数能接受person对象和score对象作为参数,也能接受直接给出的个人基本信息和成绩信息作为参数。
(3)student类提供设置和访问个人信息和成绩的接口函数。
6.(虚函数)已知一个抽象基类person,其结构如下:
classperson
{public:
virtualvoidinfo()=0;
要求在person类的基础上派生一个student类和一个teacher类,并实现虚函数info(),它打印出学生和教师的个人信息。
其中,学生的个人信息包括学号、姓名、年龄、性别和系别;
教师的个人信息包括工号、姓名、年龄、性别和职称。
另外,实现全局函数print(person*),它接受一个person类型的指针作为参数,调用person的info()函数,打印出person的个人信息。
实例化student和teacher对象,对象的个人信息在定义对象时给定,用print()函数打印出他们的个人信息。
7.下列shape类是一个表示形状的抽象类,area()为求图形面积的函数,total()则是一个通用的用以求不同形状的图形面积总和的函数。
请从shape类派生三角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数。
#include<
iostream>
usingnamespacestd;
classshape{
public:
virtualdoublearea()const=0;
doubletotal(shape*s[],intn)
{
doublesum=0.0;
for(inti=0;
i<
n;
i++)
sum+=s[i]->
area();
returnsum;
classTriangle:
publicshape
Triangle(doubleh,doublew){H=h;
W=w;
doublearea()const{returnH*W*0.5;
doubleH,W;
classRectangle:
Rectangle(doubleh,doublew){H=h;
doublearea()const{returnH*W;
intmain()
Triangletriangle1(4.0,3.3);
Rectanglerectangle1(5.0,4.0);
shape*arr[2]={&
triangle1,&
rectangle1};
doublesum_area=total(arr,2);
cout<
<
"
totalarea="
sum_area<
endl;
}
8.编写程序,需要求3个长方柱的体积,请编写一个基于对象的程序。
数据成员包括length(长)、width(宽)、height(高)。
要求用成员函数实现以下功能:
(1)定义构造函数完成长方柱的初始化;
(2)计算长方柱的体积;
(3)输出长方柱的体积。
classBox
Box(floatl,floatw,floath):
length(l),width(w),height(h){}
floatvolume();
voiddisplay();
floatlength;
floatwidth;
floatheight;
floatBox:
:
volume()
{return(length*width*height);
voidBox:
display()
{cout<
volume()<
{Boxbox1(3,2,1),box2(4,3,2),box3(5,4,3);
volmueofbox1is"
;
box1.display();
volmueofbox2is"
box2.display();
volmueofbox3is"
box3.display();
9.设计一个函数模板求一个数组中最大的元素,并以整数数组和字符数组进行调试。
template<
classT>
Tmax(Ta[],intlength)
{Ttemp;
temp=a[0];
for(inti=1;
length;
if(temp<
a[i])temp=a[i];
returntemp;
{inta[5],m;
PleaseInput5numbers"
for(inti=0;
5;
cin>
>
a[i];
m=max(a,5);
Max="
m<
charb[5],n;
PleaseInput5char"
for(i=0;
b[i];
n=max(b,5);
n<
10.编写一个学生和教师数据输入和显示程序,学生数据要求有编号、姓名、班级和成绩,教师数据有编号、姓名、部门和职称。
要求将编号、姓名的输入和显示设计成一个类person,并作为学生数据操作类student和教师数据操作类teacher的基类,学生数据中的班级和成绩的输入和显示在student类中实现,教师数据中的部门和职称的输入和显示在teacher类中实现。
最后在主函数中进行该类的测试。
(14分)
下面给出了基类person的主要成员:
(1)私有成员:
●intno;
编号
●stringname;
姓名
(2)公有成员:
●voidinput();
编号和姓名的输入
●voiddisplay();
编号和姓名的显示
string>
//定义公共基类Person
classPerson
virtualvoidinput()
{cin>
no>
name;
virtualvoiddisplay()
no="
no<
"
name="
name<
intno;
stringname;
//定义类Teacher
classTeacher:
publicPerson//声明Teacher为Person为公用派生类
voidinput()
title>
depart_no;
voiddisplay()
title="
title<
department="
depart_no<
}private:
stringtitle;
intdepart_no;
//定义类Student
classStudent:
virtualpublicPerson//声明Student为Person为公用派生类{public:
class_no>
score;
class_no="
class_no<
score="
score<
intclass_no;
floatscore;
{Personperson;
Person*p;
Teacherteacher;
Studentstudent;
Pleaseinputteacher'
sno,name,titleanddepartment:
p=&
person;
p->
input();
teacher;
Displayteacher'
display();
Pleaseinputstudent'
student;
Displaystudent'
11.(文件操作)已知数据文件IN.DAT中存有20个整数,每个整数间用空格分隔。
有一类Array的结构如下:
classArray
intA[20];
Array(){
20;
i++)A[i]=0;
intgetNumberA(Array&
a,intk){returna.A[k];
voidgetdata();
//读数据函数
voidmax_min(int&
int&
);
//排序函数
voidputdata(int&
//写结果数据函数
其中:
成员函数getdata()的功能为:
从数据文件IN.DAT中把20个数据读出来存入数据成员A[]中。
成员函数max_min(int&
)的功能为:
求数据成员A[]中20个整数的最大值和最小值。
成员函数putdata(int&
把求得的数据成员A[]中20个整数的最大值和最小值输出到数据文件OUT.DAT。
在类外写出上述三个成员函数的实现代码,并在main函数中对该类进行测试。
11