面向对象程序设计复习试题(答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语法扩充
1.1选择题
在C++中用( D )能够实现将参数值带回。
a)数组b)指针c)引用d)上述ABC都可
考虑函数原型void test(int a,int b=7,char *ch="*"),下面的函数调用中,属于不合法调用的是:( C )
A)test(5) B)test(5,8) C)test(6,"#") D)test(0,0,"*");
已知: int m=10;下列表示引用的方法中,正确的是:( C )
A)int &Z;B)int &t=10;C)int &X=m;D)float &f=&m;
下列不是函数重载所要求的条件是:( D )
A)函数名相同B)参数个数不同
C)参数类型不同D)函数返回值类型不同
在C++中执行以下4条语句后输出rad值为:( C )
static int hot=200;
int &rad=hot;
hot=hot+100;
cout<<rad<<endl;
A) 0 B) 100 C) 300 D) 200
系统在调用重载函数时,不能作为确定哪个重载函数被调用的依据是:( D )
A)参数个数B)参数类型C)函数名称D)函数的返回值类型
对C++语言和C语言的兼容性,描述正确的是:( A )
A)C++兼容C B)C++部分兼容C C)C++不兼容C D)C兼容C++
在C++中使用流进行输入输出,其中用于屏幕输出的对象是:(C )
A)cerr B)cin C)cout D)cfile
对使用关键字new所开辟的动态存储空间,释放时必须使用( C )
A)free B)create C)delete D)realse
在函数调用时,如某一默认参数要指明一个特定值,则有( A )
A)其之前所有参数都必须赋值B)其之后所有参数都必须赋值
C)其前、后所有参数都必须赋值D)其前、后所有参数都不必赋值
下列哪个类型函数不适合声明为内联函数( A )
A)函数体语句较多B)函数体语句较少
C)函数执行时间较短D)函数执行时间过长
int Func(int,int);不可与下列哪个函数构成重载( B )
A)int Func(int,int,int);B)double Func(int,int);
C)double Func(double,double);D)double Func(int,double);
下面的哪个保留字不能作为函数的返回类型( C )
A)void B)int C)new D)long
一个函数功能不太复杂,但要求被频繁调用,选用( A )。
A. 内联函数
B. 重载函数
C. 递归函数
D. 嵌套函数
已知函数f的原型为:void f (int&a,char*b);变量s,t的定义是:int s;char t[ ]="ABCD";
把s和t分别作为第一参数和第二参数来调用函数f,正确的调用语句是( C )
A f(&s,&t);
B f(&s,t);
C f(s,t);
D f(s,&t);
若定义cin>>str;
当输入
Microsoft Visual Studio 6.0!
所得结果是str=(B)。
A、Microsoft Visual Studio 6.0!
B、Microsoft
C、Microsoft Visual
D、Microsoft Visual Studio 6.0
.函数模板(C)。
A、代表某一具体函数
B、与模板函数是同一个函数
C、与某一个具体的数据类型连用
D、是模板函数实例化的结果
在C++中,关于下列设置参数默认值的描述中,正确的是(C)
A、不允许设置参数的默认值
B、设置参数默认值只能在定义函数时设置
C、设置参数默认值时,应该是先设置右边的再设置左边的
D、设置参数默认值时,应该全部参数都设置
下列表示引用的方法中,(A)是正确的。
已知: k=1000;
A、int &x=k;
B、char &y;
C、int &z=1000;
D、float &t=&k;
有如下模板定义:
template <class T>T fun(T x,T y){return x*x+y*y;}
在下列对fun的调用中,错误的是:( C )
A)fun(2,8) B)fun(2.0,8.2) C)fun(2.3,8) D)fun (‘2’,’8’)
通常情况下,函数模板中的类型参数个数不能是( A )
A)0个B)1个C)2个D)3个
1.2填空题
1、假定有如下定义:int x;,若要将整型变量y定义为变量x的引用,则应使用的定义语句是_int &y=x;________。
具有相同函数名但具有不同参数表的函数称为重载函数。
'
2、在进行函数调用时,将把参数的值传递给值参数,把参数的_地址_传递给引用参数。
3、执行完下列三条语句后,指针变量c指向__b___。
Int a,b,*c=&a;
int *&p=c;
p=&b;
4、假设有如下函数定义:void Fun(int x,int y=100);则语旬Fun(5)语句__ Fun(5,100)_等价。
5、在一个C++程序中,每个变量都必须遵循__先定义后使用__的原则。
6、下面是一个求数组元素之和的程序。
主程序中定义并初始化了一个数组,然后计算该数
组各元素之和,并输出结果。
函数TotalSum 计算数组元素之和。
请完成下列程序。
#include <iostream.h>
__int Totalsum(int array[],int len)__ ;
void main()
{
int a[5]={2,3,6,8,10};
__int Total ___;
Total =Totalsum(a,5);
cout<<"Sum of array:"<<Total<<endl;
}
int Totalsum(int array[],int len)
{
____int sum =0____ ;
for(int I=0;____I<len____ ;I++)
____ sum += array[I]_____ ;
return sum;
}
7、下面的函数Fun未使用中间变量实现了对两个数的交换,请完成下列函数的定义。
V oid Fun (int &x,int &y)
{
x+ = y;
y =___x-y____ ;
__x = x - y_____ ;
}
8、定义一个函数时,若只允许函数体访问形参的值而不允许修改它的值,则应把该形参声明为__常量__,即在该形参声明的前面加上__const__关键字进行修饰。
9、在一个函数的定义或声明前加上关键字__inline__时,该函数就声明为内联函数。
1.3简答题
A、.内联函数的含义
在函数前加上关键字inline说明了一个内联函数,这使一个函数在程序行里进行代码扩展而不被调用。
这样的好处是减少了函数调用的开销,产生较快的执行速度。
但是由于重复编码会产生较长代码,所以内联函数通常都非常小。
如果一个函数在类说明中定义,则将自动转换成内联函数而无需用inline说明。
B、.函数重载的含义
在同一作用域范围内,相同的函数名通过不同的参数类型或参数个数可以定义几个函数,编译时编译器能够识别实参的个数和类型来决定该调用哪个具体函数。
需要注意的是,如果两个函数仅仅返回类型不同,则编译时将会出错,因为返回类型不足以提供足够的信息以使编译程序判断该使用哪个函数。
所以函数重载时必须是参数类型或者数量不同。
C、引用与指针的区别
D、内联函数使用上的限制
E、定义带默认参数值函数的规则
F、指针与常量的关系
1.4程序阅读题
1)写出下列程序的运行结果。
#include <iostream.h>
void main()
{
int x;
int &p=x;
x=10;
p=x+10;
cout<<x<<","<<p<<endl;
}
结果:20,20
2)写出下列程序的运行结果。
#include <iostream.h>
int f(int a)
{
return ++a;
}
int g(int &a)
{
return ++a;
}
void main()
{
int m=0,n=0;
m+=f(g(m));
n+=f(f(n));
cout<<"m="<<m<<endl;
cout<<"n="<<n<<endl;
}
结果:
m=3
n=2
3) 写出下列程序的运行结果。
#include <iostream.h>
void Fun()
{
int num=20;
cout<<"The Fun's num is"<<num<<endl; }
void main()
{
int num=10;
cout<<"The main's num is "<<num<<endl;
Fun();
{
int num=30;
cout<<"The Field's num is "<<num<<endl;
}
cout<<"The main's num is "<<num<<endl;
}
结果:
The main's num is 10
The Fun's num is20
The Field's num is 30
The main's num is 10
类和对象
2.1选择题
下列的各类函数中,不是类的成员函数。
( C )
A)构造函数B)析构函数C)友元函数D)拷贝初始化构造函数
作用域运算符“::”的功能是:( B )
A)标识作用域的级别的B)指出作用域的范围的
C)给定作用域的大小的D)标识成员是属于哪个类的
已知:print()函数是一个类的常成员函数,它无返回值,下列表示中,是正确的。
( A )A)void print()const;B)const void print();
C)void const print():D)void print(const);
在类定义的外部,可以被访问的成员有( C )
A)所有类成员B)private的类成员
C)public的类成员D)public或private的类成员
关于类和对象不正确的说法是:( C )
A)类是一种类型,它封装了数据和操作B)对象是类的实例
C)一个类的对象只有一个D)一个对象必属于某个类
在C++中实现封装是借助于( B )
A)枚举B) 类C) 数组D)函数
定义析构函数时,应该注意:( C )
A)其名与类名完全相同B)返回类型是void类型
C)无形参,也不可重载D)函数体中必须有delete语句
类clase CC1的说明如下,错误的语句是:( A )
clase CC1{
int a=2;//(A)
CC1();//(B)
public:
CC1(int val);//(C)
~CC1();//(D)
};
类的指针成员的初始化是通过函数完成的,这个函数通常是:( B )
A)析构函数B) 构造函数C)其它成员函数D)友元函数
关于构造函数的说法,不正确的是:( A )
A)没有定义构造函数时,系统将不会调用它B)其名与类名完全相同
C)它在对象被创建时由系统自动调用D)没有返回值
通常拷贝构造函数的参数是:( C )
A)对象名B)对象的成员名C)对象的引用名D)对象的指针名
关于成员函数特征的描述中,错误的是:( A )
A)成员函数一定是内联函数B)成员函数可以重载
C)成员函数可以设置参数的默认值D)成员函数可以是静态的
下列关于构造函数的描述中,错误的是:( D )
A)构造函数可以设置默认参数;B)构造函数在定义类对象时自动执行
C)构造函数可以是内联函数;D)构造函数不可以重载
有如下类声明“class A{int x;……};”,则A类的成员x是:( B )
A)公有数据成员B)私有数据成员C)公有成员函数D)私有成员函数
类TM和类TN是两个独立的类,那么类TM中哪种形式的数据成员一定是不允许的:( C ) A)TM * a B)TN & a C)TM a D)TN a;
以下关于this指针的叙述中正确的是:( D )
A)任何与类相关的函数都有this指针;B)类的成员函数都有this指针;
C)类的友员函数都有this指针;D)类的非静态成员函数才有this指针;
.关于类模板的说法正确的是:( B )
A)类模板的主要作用是生成抽象类
B)类模板实例化时,编译器将根据给出的模板实参生成一个类
C)在类模板中的数据成员具有同样类型
D)类模板中的成员函数没有返回值
.以下关键字不能用来声明类的访问权限的是:( C )
A)public B)private C)static D)protected
.类的私有成员可在何处访问( D )
A)通过子类的对象访问 B)本类及子类的成员函数中
C)通过该类对象访问 D)本类的成员函数中
.如果没有为一个类定义任何构造函数的情况下,下列描述正确的是:( A )A)编译器总是自动创建一个不带参数的构造函数 B)这个类没有构造函数
C)这个类不需要构造函数 D)该类不能通过编译
.一个类可包含析构函数的个数是:( B )
A)0个 B)1个 C)0个或1个 D)0个或多个
.一个类可包含构造函数的个数是:( D )
A)0个 B)0个或1个 C)0个或多个 D)1个或多个
.this指针存在的目的是:( B )
A)保证基类公有成员在子类中可以被访问
B)保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码
C)保证基类保护成员在子类中可以被访问
D)保证基类私有成员在子类中可以被访问
.下列关于类的权限的描述错误的是:( A )
A)类本身的成员函数只能访问自身的私有成员
B)类的对象只能访问该类的公有成员
C)普通函数不能直接访问类的公有成员,必须通过对象访问
D)一个类可以将另一个类的对象作为成员
.设类A将其它类对象作为成员,则建立A类对象时,下列描述正确的是:( B )A)A类构造函数先执行 B)成员构造函数先执行
C)两者并行执行 D)不能确定
.假定有类AB,有相应的构造函数定义,能正确执行“AB a(4),b(5), c[3] , *p[2]={&a,&b};”语句,请问执行完此语句后共调用该类构造函数的次数为( C )
A)3 B)4 C)5 D)6
拷贝构造函数的作用是(C )。
A. 进行数据类型的转换
B. 用对象调用成员函数
C. 用对象初始化对象
D. 用一般类型的数据初始化对象
下列静态数据成员的特性中,错误的是(D )。
A.静态数据成员的声明以关键字static开头
B. 静态数据成员必须在文件作用域内初始化
C. 引导数据成员时,要在静态数据成员前加(类名)和作用域运算符
D. 静态数据成员不是类所有对象共享的
通过指针访问类对象成员的方法是(D )。
A. ::
B. ;
C. .
D. ->
静态成员函数没有(B )。
A.返回值 B. this指针 C. 指针参数 D. 返回类型
在下列关键字中,用于说明类中公有成员的是(A )。
A.public;B.private;C.protected;D.friend
不是构造函数的特征(D )。
A.构造函数的函数名与类名相同; B. 构造函数可以重载;
C. 构造函数可以设置缺省参数;
D. 构造函数必须指定类型说明。
是析构函数的特征(A )。
A.一个类中只能定义一个析构函数; B. 析构函数名与类名不同;
C. 析构函数的定义只能在类体内;
D. 析构函数可以有一个或多个参数。
关于成员函数特征的下述描述中,(A )是错误的。
A.成员函数一定是内联函数; B. 成员函数可以重载;
C. 成员函数可以设置参数的缺省值;
D. 成员函数可以是静态的。
下述静态数据成员的特性中,(D )是错误的。
A.说明静态数据成员时前边要加修饰符static;
B.静态数据成员要在类体外进行初始化;
C.引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符;
D.静态数据成员不是所有对象所共用的。
2.2填空题
1、在撤销类的对象时,C++程序将自动调用该对象的__析构___函数。
2、类中的构造函数是一个特殊的成员函数,它由类的对象__自动_调用,它的作用是___为对象分配内存,数据成员初始化___。
3、对类中的成员函数和属性的访问是通过__public__、__protected__和___private__这3个关键字来控制的。
4、__delete__运算符删除new运算符所动态分配的内存空间。
5、假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构函数形式为__MyClass()__。
6、类中构造函数有__一个或多__个,析构函数有___一___个。
7、类是对具有共同属性和行为的一类事物的抽象描述,共同属性被描述为类中的___数据成员___ ,共同行为被描述为类中的__成员函数__。
8、若要把类FriendClass定义为类MyClass的友元类,则应在类MyClass的定义中加入语句_friend class FriendClass;___。
9、在结构定义中,数据和成员函数默认权限是__public__。
在类定义中,数据和成员函数默认权限是__private___。
10、在下面程序的横线处填上适当的语句,使类型该程序执行结果为10。
#include <iostream.h>
class MyClass
{
pub1ic:
___ MyClass ( int a ) {_x = a; }____//为x置值
__int GetNum(){ return x; }______ //取x值
private:
int x;
};
void main()
{
Myclass my(10);
Cout<<my.GetNum()<<end;
}
11、完成下面的类定义。
Class MyClass
{
public:
MyClass(){x=0;}
____friend______int GetNum(___MyClass ______my);
private:
int x;
};
int GetNum(____MyClass ______my)
{
___return my.x;
}
12、__new__运算符对指定类型对象动态分配内存并返回该类型的__指针__。
13、若要把函数void FriendFunction()定义为类MyClass的友元函数,则应在类MyClass的定义中加入语句__friend void FriendFunction();_______。
14、类的具体表现是通过定义_对象__来操作的。
15、在定义类的对象时,C++程序将自动调用该对象的__构造___函数初始化对象自身。
16、一般情况下,按照面向对象的要求,把类中的数据成员(属性)定义为__private__权限,而把成员函数(方法)定义为__public__权限。
17、在类中定义和实现的函数称为_内联函数__。
18、非成员函数应声明为类的__友元函数__才能访问这个类的private成员。
2.3简答题
A、类的含义
B、构造函数的特点
C、拷贝构造函数的调用
D、析构函数的定义及其特点
E、静态成员的分类及各自的特点
2.4程序阅读题
1) 写出下列程序的运行结果。
#include <iostream.h>
class MyClass
{
char ch;
public:
MyClass();
MyClass(char character);
void Print();
~MyClass();
};
MyClass::MyClass()
{
cout<<"This is a constructor!"<<endl;
ch='a';
}
MyClass::MyClass(char character)
{
cout<<"This is a constructor!"<<endl;
ch=character;
}
void MyClass::Print()
{
cout<<"The value of ch is "<<ch<<endl; }
MyClass::~MyClass()
{
cout<<"This is a destructor!"<<endl;
}
void main()
{
MyClass first,second('b');
first.Print();
second.Print();
}
运行结果:
This is a constructor!
This is a constructor!
The value of ch is a
The value of ch is b
This is a destructor!
This is a destructor!
2)写出下列程序的运行结果
#include <iostream.h>
class MyClass
{
public:
MyClass();
void Print();
~MyClass();
private:
int I;
static int j;
};
int MyClass::j=0;
MyClass::MyClass()
{
cout<<"This is constructor!"<<endl;
j+=10;
}
void MyClass::Print()
{
cout<<"The value of j is" <<J<<endl;
}
MyClass::~MyClass()
{
cout<<"This is a destructor!"<<endl;
}
void main()
{
MyClass first,second;
first.Print();
second.Print();
}
This is constructor!
This is constructor!
The value of j is20
The value of j is20
This is a destructor!
This is a destructor!
继承与派生
3.1选择题
.在C++中,类与类之间的继承关系具有( C )
A)自反性 B)对称性 C)传递性 D)反对称性
.在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B )A)受限制B)保持不变C)受保护D)不受保护
.按解释中的要求在下列程序划线处填入的正确语句是:( C )
#include <iostream.h>
class Base{
public:
void fun(){cout<<"Base::fun"<<endl;}
};
class Derived:public Base{
public:
void fun()
{ //在此空格处调用基类的函数fun()
cout<<"Derived::fun"<<endl;}
};
A)fun();B)Base.fun();C)Base::fun();D)Base->fun();
.在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( C )A)受限制B)保持不变C)受保护D)不受保护
.下面描述中,表达错误的是:( B )
A)公有继承时,基类中的public成员在派生类中仍是public的
B)公有继承时,基类中的private成员在派生类中仍是private的
C)公有继承时,基类中的protected成员在派生类中仍是protected的
D)私有继承时,基类中的public成员在派生类中是private的
.下列虚基类的声明中,正确的是:( B )
A)class virtual B: public A B)class B: virtual public A
C)class B: public A virtual D)virtual class B: public A
.C++设置虚基类的目的是( A )
A)消除二义性B)简化程序C)提高运行效率D)减少目标代码
class X{
int a;
public:
X(int x=0){a=x;}
};
class Y:public X{
int b;
public :
Y(int x=0,int y=0):X(y)){ b=x;}
};
下列语句组中出现语法错误的是(D)
A. X *pa=new Y(1,2);
B.X a1=Y(1,3);
C.Y b1(2,3); X &a3=b1;
D.X a4(10);Y b2=a4;
class Base
{ public: int i;
Base(int t) : i ( t ) { }
};
class Derived: protected Base
{ Base b;
int j;
public:
Derived (int t);
};
在构造函数Derived的下列定义中,正确的是(B )
A. Derived : : Derived (int t) : b(t), j(t) { }
B. Derived : : Derived (int t) : b(t), Base(t), j(t) { }
C. Derived : : Derived (int t) : Base(t), j(t) { }
D. Derived : : Derived (int t) : i(t), b(t), j(t) { }
.在哪种派生方式中,派生类可以访问基类中的protected成员(B )
A)public和private B)public、protected和private
C)protected和private D)仅protected
在C++中,类与类之间的继承关系具有(C )
A) 自反性B) 对称性C) 传递性D) 反对称性下列关于类的继承描述中,(A )是错误的
A) 派生类可以访问基类的所有数据成员,也能调用基类的所有成员函数
B) 派生类也是基类,但基类不一定具有派生类的全部属性和方法
C) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法
D) 一个基类可以有多个派生类,一个派生类可以有多个基类
.当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)A) public成员B) private成员C) protected成员D) 友元
当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( B )
A) public成员B) private成员C) protected成员D) 友元
不论派生类以何种方法继承基类,都不能使用基类的(B )
A) public成员B) private成员C) protected成员D) public成员和protected成员
在创建派生类对象时,构造函数的执行顺序是(D)
A) 对象成员构造函数、基类构造函数、派生类本身的构造函数
B) 派生类本身的构造函数、基类构造函数、对象成员构造函数
C) 基类构造函数、派生类本身的构造函数、对象成员构造函数
D) 基类构造函数、对象成员构造函数、派生类本身的构造函数
下列虚基类的声明中,正确的是( D )。
A)class virtual B:public A
B)virtual class B:public A
C)class B:public A virtual
D)class B:virtual public A
下面叙述错误的是(A )。
A)基类的protected成员在派生类中仍然是protected的
B)基类的protected成员在public派生类中仍然是protected的
C)基类的protected成员在private派生类中是private的
D)基类的protected成员不能被派生类的对象访问
下列说法中错误的是(A )。
A) 保护继承时基类中的public成员在派生类中仍是public的
B)公有继承时基类中的private成员在派生类中仍是private的
C)私有继承时基类中的public成员在派生类中是private的
D)保护继承时基类中的public成员在派生类中是protected的
关于多继承二义性的描述中,错误的是(B )。
A)一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性
B)解决二义性的最常用的方法是对成员名的限定法
C)基类和派生类中同时出现的同名函数,也存在二义性问题
D)一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,可能出现二义性
下面叙述错误的是(C )。
A)派生类可以使用private派生
B)对基类成员的访问必须是无二义性的
C)基类成员的访问能力在派生类中维持不变
D)赋值兼容规则也适用于多继承的组合
派生类的构造函数的成员初始化列表中,不能包含(C )。
A)基类的构造函数
B)派生类中子对象的初始化
C)基类中子对象的初始化
D)派生类中一般数据成员的初始化
下面(B )的叙述不符合赋值兼容规则。
A)派生类的对象可以赋值给基类的对象
B)基类的对象可以赋值给派生类的对象
C)派生类的对象可以初始化基类的引用
D)派生类的对象的地址可以赋值给指向基类的指针
.下列虚基类的声明中,正确的是:( B )
A)class virtual B: public A B)class B: virtual public A
C)class B: public A virtual D)virtual class B: public A
.C++设置虚基类的目的是( A )
A)消除二义性B)简化程序C)提高运行效率D)减少目标代码
3.2填空题
1、垂直访问时,保护成员的访问控制权限与_公有__成员相同。
2、利用继承能够实现_代码复用__。
这种实现缩短了程序的开发时间,促使开发人员复用已经测试和调试好的高质量软件。
3、派生类对基类的继承有三种方式:__public__、___protected__ 和___private__。
4、多继承情况下,派生类的构造函数的执行顺序取决于__定义__派生类时所指定的各基类的顺序。
5、C++提供的_多继承__机制允许一个派生类继承多个基类,即使这些基类是相互无关的。
6、派生类可以调用其_定义___中不具备的数据和操作。
7、对基类数据成员的初始化必须在派生类构造函数中的__初始化列表___处执行。
8、如果类Alpha继承了类Beta,则类Alpha称为__派生__类,类Beta称为__基__类。
9、己知下面的程序框架,按注释中的提示补充细节。
#include <iostream.h>
class planet
{
protected:
double distance;___//行星距太阳的距离
int revolve;___//行星的公转周期
public:
planet(double d,int r)
{
distance=d;
revolve=r;
}
};
class earth:public planet
{
double circumference; //地球绕太阳公转的轨道周长
public:
//定义构造函数earth(double d,int r),并计算地球绕太阳公转的轨道周长。
//假定:circumnference=2*d*3.1416
___ earth(double d,int r): planet (d, r){__ circumnference=2*d*3.1416;}___
//定义show()函数显示所有信息
___void show() { cout<<”distance is ”<< distance<<”miles, revolve is”<< revolve<<”days”<<endl; cou<<” circumference is “<< circumference<<endl; }___
};
void main()
{
earth ob(9300000,365);
ob.show();
}
10、设置虚基类的目的是__为了消除二义性__,可通过____virtual_____标识虚基类。
11、若多继承时,多个基类中拥有一个同名的成员,则__不能__用调整访问权限确定对该成员的访问。
12、根据基类的定义和测试程序,完成下面派生类的定义。
Class Point
{
public:
Point(int I=0,int j=0){X=I;Y=j;}
void Move(int xOff,int yOff){X+=xOff;Y+=yOff;}
int GetX(){return X;}
int GetY(){return Y;}
private:
int X,Y;
};
class Rectangle :private Point
{
public:
Rectangle(int x,int y,int w,int h)__:Point(x,y)___{_W = w ; H = h ;_ }
void Move(int xOff,int yOff){_ Point:Move(xOff, yOff);__ }
int GetX(){__return Point:GetX();__ }
int GetY(){___return Point:GetY();__ }
int GetW(){__return W;__ }
int GetH(){__return H;__ }
private:
int W,H;
}
#include <iostream.h>
#include <math.h>
void main()
{
Rectangle rect(1,2,3,4);
rect.Move(5,6);
cout<<“The data of rect(X,Y,W,H):(“
<<rect.GetX()<<“,”<<rect.GetY()<<“,”
<<rect.GetW()<<“,”<<rect.GetH()<<“)”<<endl;
13、多继承可以视为是__单继承__的扩展。
14、在划线处填上适当的语句,完成下列程序。
#include <math.h>
class Point
{
public:
point(double a,double b,double c){_X =a; Y=b; Z =c;__}
double Getx(){return X;}
double Gety(){return Y;}
double Getz(){return Z;}
private:
__double X, Y;_____
protected:
__double Z;_____
};
class Line :_____public____Point
{
public:
Line(double a ,double b,double c,double d)_:Point(a,b,c)_____{____K = d;___ }
void show()
{
cout<<Getx()<<endl;
cout<<Gety()<<““<<.<<<endl;
cout<<Getz()<<““<<Z<<endl;
cout<<K<<endl;
}
private:
double k;
};
void main()
{
Line obj(1.2,3.4,5.6,7.8);
obj.show();
}
15、类继承中,缺省的继承方式是__private___。
16、当用protected继承从基类派生→个类时,基类的public成员成为派生类的__protected__
成员,protected成员成为派生类的_____protected____成员。
18、__公有派生__类的对象可作为____基___类的对象处理。
19、指向基类的对象的指针变量也可以指向__公有派生类_的对象。
20、类之间的”有”关系代表__组合___,”是”关系代表__继承__。
3.3简答题
A、派生类的定义及其特点
B、单继承和多继承的概念及其关系
C、继承方式的种类及其各自的特点
D、在继承中构造函数和析构函数的调用规则
F、赋值兼容原则
G、类模板和模板类的含义及其关系
3.4读程序题
1、写出下列程序的运行结果。
#include <iostream.h>
class Base
{
public:
void Who(){cout<<"class Base"<<endl;}
};
class Derived1:public Base
{
public:
void Who(){cout<<"class Derived1"<<endl;}
};
class Derived2:public Base
{
public:
void Who(){cout<<"class Derived2"<<endl;}
};
void main()
{
Base obj1,*p;
Derived1 obj2;
Derived2 obj3;
p=&obj1;
p->Who();
p=&obj2;
p->Who();
p=&obj3;
p->Who();
obj2.Who();
obj3.Who();
}
答案:
class Base
class Base
class Base
class Derived1
class Derived2
2、写出下列程序的运行结果。
#include <iostream.h>
class instrument
{
public:
void display() const{cout<<"instument::display."<<endl;} };
class piano:public instrument
{
public:
void display() const{cout<<"piano::display."<<endl;} };
class guitar:public instrument
{
public:
void display() const{cout<<"guitar::display."<<endl;} };
void tone(instrument & I)
{
I.display();
};
void main()
{
guitar guitar1;
tone(guitar1);
piano piano1;
tone(piano1);
}
答案
instument::display.
instument::display.
3、写出下列程序的运行结果。
#include <iostream.h>
class A
{
public:
A(char i){cout<<"A's cons."<<i<<endl;}
~A(){cout<<"A's des."<<endl;}
};
class B:virtual public A
{
public:
B(char i,char j):A(i){b = j; cout<<"B's cons."<<j<<endl;} ~B(){cout<<"B's des."<<b<<endl;}
private:
char b;
};
class C:virtual public A
{
public:
C(char i,char j):A(i)
{
cout<<"C's cons."<<j<<endl;
}
~C(){cout<<"C's des."<<endl;}
};
class D:public B,public C
{
public:
D(char i,char j,char k,char s,char m,char n)
:C(k,s),B(i,j),A(i),aa(m){cout<<"D's cons."<<endl;} ~D(){cout<<"D's des."<<endl;}
private:
A aa;
};
void main()
{
D obj('a','b','c','d','e','f');
}
答案:
A's cons.a
B's cons.b
C's cons.d
A's cons.e
D's cons.
D's des.
A's des.
C's des.
B's des.
A's des.
类的多态性
4.1选择题
.实现运行时的多态性采用( D )
A)重载函数B)构造函数C)析构函数D)虚函数
.在派生类中重新定义虚函数时,必须在下列哪方面与基类保持一致。
(A ) A)参数类型B)参数名字C)操作内容D)赋值
.当一个类的某个函数被说明为virtual时,在该类的所有派生类中的同原型函数(A )
A)都是虚函数 B)只有被重新说明时才是虚函数
C)都不是虚函数 D)只有被重新说明为virtual时才是虚函数
.通过下述哪一项调用虚函数时,采用动态联编。
(A)
A)对象指针B)对象名C)成员名限定D)派生类名
下面描述中,正确的是(B D )(两个答案)
A) 虚函数是没有实现的函数B) 纯虚函数的实现在派生类中
C) 抽象类是没有纯虚函数的类D) 抽象类指针可以指向不同的派生类对象
若一个类中含有纯虚函数,则该类称为(D )
A) 基类B) 纯基类C) 派生类D) 抽象类
假设A为抽象类,下列声明(B )是正确的
A) A fun(int); B) A *p; C) int fun(A); D) A Obj;
在C++中,要实现动态联编,必须使用(D )调用虚函数
A) 类名B) 派生类指针C) 对象名D) 基类指针
下列函数中,可以作为虚函数的是(C D)(两个答案)
A) 普通函数B) 构造函数C)成员函数D) 析构函数
在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(B )
A) 不同B) 相同C) 相容D) 部分相同。