}
(四)、写出下列每个函数的功能(每小题8分)
1、#include
intSA(inta,intb){
if(a>b)return1;
elseif(a==b)return0;
elsereturn-1;
}
2、structStrNode{
charname[15];//字符串域
StrNode*next;//指针域
};
voidQB(StrNode*&f,intn){
if(n==0){f=NULL;return;}
f=newStrNode;
cin>>f->name;
StrNode*p=f;
while(--n){
p=p->next=newStrNode;
cin>>p->name;
}
p->next=NULL;
}
(五)、编写程序
把从键盘上输入的一批整数(以-1作为终止输入的标志)保存到文本文件“a:
xxk1.dat”中。
------------------------------------------
练习题2:
一、选择题(每题2分)
(1)一个函数功能不太复杂但要求被频繁调用,应选用
A)内联函数 B)重载函数 C)递归函数 D)嵌套函数
(2)为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为
A)public B)protected C)private D)static
(3)在C++语言程序中,对象之间的相互通信通过
A)继承实现 B)调用成员函数实现
C)封装实现 D)函数重载实现
(4)类的析构函数是在什么时候调用的?
A)类创建时 B)创建对象时 C)删除对象时 D)不自动调用
(5)通常拷贝构造函数的参数是
A)某个对象名 B)某个对象的成员名
C)某个对象的引用名 D)某个对象的指针名
(6)下列不是描述类的成员函数的是
A)构造函数 B)析构函数 C)友元函数 D)拷贝构造函数
(7)继承机制的作用是
A)信息隐藏 B)数据封装 C)定义新类 D)数据抽象
(8)在C++语言类体系中,不能被派生类继承的有
A)转换函数 B)构造函数 C)虚函数 D)静态成员函数
(9)对于类定义
classA{
public:
virtualvoidfuncl(){}
voidfunc2(){}
};
classB:
publicA
{
public:
voidfuncl(){cout<<"classBfunc1”;
virtualvoidfunc2(){cout<<"classBfunc2";
};
下面正确的叙述是
A)A:
:
func2()和B:
:
funcl()都是虚函数
B)A:
:
func2()和B:
:
funcl()都不是虚函数
C)B:
:
funcl()是虚函数,而A:
:
func2()不是虚函数
D)B:
:
funcl()不是虚函数,而A:
:
func2()是虚函数
(10)下面关于运算符重载的描述错误的是A)运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算符的语法结构
B)不是所有的运算符都可以进行重载
C)运算符函数的调用必须使用关键字operator
D)在C++语言中不可通过运算符重载创造出新的运算符
(11)作用域运算符的功能是()A)给定作用域的大小B)表示作用域的级别C)某个成员是属于哪个类的D)指出作用域的范围
(12)()不是构造函数的特征
A)构造函数可以重载B)构造函数可以设置缺省参数
C)构造函数的函数名和类名相同D)构造函数必须指定类名
(13)关于new运算符的下列描述中,()是错的
A)使用它创建对象时要调用构造函数
B)使用它创建对象数组时必须指定初始值
C)使用它创建对象数组时不能指定初始值
D)使用它创建的对象或对象数组可以使用运算符delete删除
(14)派生类的描述中,()是错的
A)一个派生类可以作为另一个派生类的基类
B)派生类至少有一个基类
C)派生类中继承的基类成员的访问权限在派生类中保持不变
D)派生类的成员除了它自己的成员外,还包含了它的基类的成员
(15)设置虚基类的目的是()。
A)减少目标代码B)提高运行效率C)消除二义性D)简化程序
(16)以下关于虚函数和纯虚函数的说法中,()是不正确的
A)在派生类中虚函数可以不用关键字virtual说明
B)虚函数在派生类中都不需要重定义
C)不能为虚函数定义缺省操作
D)纯虚函数在派生类中可以不重定义
(17)以下关于抽象类的说法中,()是不正确的
A)不可创建抽象类的实例
B)可以声明抽象类的引用
C)抽象类的派生类也是抽象类
D)抽象类的派生类也可以是抽象类
(18)以下关于多态性的说法中,()是不正确的A)每个多态类的基类有一个虚函数表B)多态类的每一个派生类有一个虚函数表C)每个多态类的对象有一个虚表指针D)虚函数调用与this指针无关
(19)C++语言对C语言做了很多改进,C++语言相对于C语言的最根本的变化是
A)增加了一些新的运算符
B)允许函数重载,并允许设置缺省参数
C)规定函数说明符必须用原型
D)引进了类和对象的概念
(20)在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是
A)派生类的对象可以赋给基类的对象
B)派生类的对象可以初始化基类的引用
C)派生类的对象可以直接访问基类中的成员
D)派生类的对象的地址可以赋给指向基类的指针
二、填空题(每空3分)
(1)一个类可以从直接或间接的基类中继承所有属性和方法。
采用这个方法提高了软件的 。
(2)在C++中封装性、继承性和 是面向对象思想的主要特征。
(3)下列for语句的循环次数为 。
for(inta=0,b=1;b&&a<5;a++);
(4)下面程序的输出结果是 。
#include
voidmain()
{
inta[6]={1,2,3,4,5,6};
for(inti=0;i<5;i++)
cout<
cout< }
(5)C++程序是从 函数开始执行的。
(6)假定A为一个类,则语句A(A&A);为该类 。
(7)派生类构造函数的执行顺序是先执行 的构造函数.然后执行成员对象的构造函数,最后执行 的构造函数。
(8)C++语言提供的基本控制结构可以分为3种类型:
顺序结构、 和循环结构。
(9)继承的方式有公有继承、私有继承和 3种。
三、名词解释(每题2.5分)
1.类2.对象
3.封装性4.继承性
四、阅读程序并写出结果(每题2分)
1.
#include
classA
{
staticintn;
public:
A(){n=1;}
A(intnum){n=num;}
voidprint(){cout< };
intA:
:
n=2:
voidmain()
{
Aa,b(3);
a.print();
b.pint();
cout< }
2.
#include
classbase
{
public:
base(){cout<<”0”;}
};
classbasel:
virtualbase
}
public:
base1(){cout<<”1”;}
};
classbase2:
virtualbase
{
public:
base2(){cout<<”2”;}
};
classderived:
publicbase1,publicbase2
{
public:
derived(){cout<<”3”;}
};
voidmain()
{
derivedobj;
cout< }
3.
#include
intfun(inta[],intn)
{
intresult=1:
for(inti=1;i result=result*a[i];
returnresult;
}
voidmain()
{
inta[3]={3,4,5};
cout<}
4.
#include
voidmain()
{
inti=1;
while(i<=8)
if(++i%3!
=2)continue;
elsecout<
}
5.
#include
classM{
intm1,m2;
public:
M(intx,inty)
{m1=x;m2=y;}
voidprint(){cut<voidprint()const;
};
voidM:
:
print()const
{
cut<}
voidmain()
{
Ma(5,4);
a.print();
constMb(8,7);
b.print();
}
五、程序设计
写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形),Square(正方形),Triangle(三角形)。
用虚函数分别计算几种图形面积,并求它们的和。
要求用基类指针数组,使它的每一个元素指向一个派生类对象,其中圆半径radius为15.2,正方形边长length为6.5,三角形底边长bottom为5.4,高height为6.8。