郑州大学现代远程教育《面向对象程序设计》课程答
案
一、简答题:(每题 5 分,共30 分)
1.什么是抽象类?它有什么特点?
答:用abstract 修饰的类是抽象类。
在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。
抽象类是
不完整的,并且它只能用作基类。
其特点如下:
1、抽象类不能直接实例化,并且对抽象类使用new运算符是编译时错误。
虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和
值必须或者为Null,或者含有对非抽象类的实例的引用(此非抽象类
是从抽象类派生的)。
2、允许(但不要求)抽象类包含抽象成员。
3、抽象类不能被密封。
2.C++中使用多态的前提条件是什么?
答:C++重载、重写均是多态:
1)从语法上说:重载必须函数名和返回值一致,且参数顺序、个数和类型(有一个不一样),而重写必须函数名和返回值一致,且参数顺序、个数和类型(必须全一样)。
2)重载可以用一个类自身内部,也可以用于继承类型;重写只能用于继承类关系中。
3)重载一般用于需要在某些参数允许被缺省的情况下完成(可省略参数的函数)。
重写用于“工厂模式”以及其衍生产品中发挥作用。
3. 什么是类?类与结构有和不同?
答:类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装一起的集合体。
在C++中类和结构除了关键字不同之外只有两
点区别:
(1)class中默认的成员访问权限是private的,而struct中则是public的。
(2)从class继承默认是private继承,而从struct继承默认public继承。
除此这外无任何区别。
4. 面向对象的特征有哪些?
答:面向对象的四个基本特征是:封装、继承、抽象、多态。
5. 简述this指针的含义是什么?
答:this指针是的个隐含于每一个类的成员函数中的特殊指针(包括析构函数和构造函数),它用于指向正在被成员函数操作的对象。
不过,在一般的程序设计中不直接用它的,this是一个指针变量,因此在成员函数中,可以使用*this来表示正在调用该函数的对象。
6.友元关系具有什么特点?
答:第一、友元关系可以直接通过对象名访问类的私有和保护成员,可以像普通函数一样在任何地方调用。
不是该类的成员函数,可以是一个普通的函数,也可以是其他类的成员函数。
(朋友虽然不是家庭的成员,但容许到我们家里访问一样)
第二、友元关系不属于任何类,因此可以放在类说明的任何位置,既可以在public 区,也可以在private区。
第三、友元关系不需要通过对象或对象指针来调用,可以直接调用即可。
二)、分析下面的代码,回答问题(每题 10 分,共 40 分)
1.分析下面的代码,指出其中的错误,说明理由并改正class C {
public:
int fn1( int x ) {
dm = x ;
}
private:
int dm;
};
void main ( )
C c;
c.fn1(16 );
cout << c.dm << ‘\n’;
}
答://dm为私有变量,是不能通过对象直接直接访问的,正确的做法是添加一个public类型的方法,如public void Show() {cout<<dm<<endl;}然后利用对象c 调用 Show(), c.Show();
2.下面代码的执行结果是什么?为什么?
class A{
int n;
public:
A() {};
A(int i){n=i;}
~A() { cout<<"n="<<n<<endl;}
};
class B
{
A a;
int m;
public:
B(int i,int j):a(i){m=j;}
~B(){cout<<"m="<<m<<endl;}
};
void main()
{
B b(1,2);
}
答:执行结果:
n=1
m=2
原因: b对象是包含一个A类的对象, b对象在析构时先调用A的析构函数,再调用B自身的析构函数。
3.下面代码的执行结果是什么?为什么?
class Sample{
int n;
public:
Sample(){};
Sample(int i){n=i;};
Sample& operator=(Sample);
void disp(){cout<<"n="<<n<<endl;}
};
Sample & Sample::operator=(Sample s)
{
Sample::n=s.n;
return *this;
}
void main()
{Sample s1(10),s2;
s2=s1;
s2.disp();
}
答:结果为:
n=10
Sample 重载了赋值操作符,可以用Sample的一个对象去初使化另一个对象,s2对象被已经初使化的s1所初使化。
4. 下面代码的执行结果是什么?为什么?
class A{
public:
A(char *s) {cout<<s<<endl;}
~A(){};
};
class B:virtual public A
{
public:
B(char *s1,char*s2):A(s1)
{
cout<<s2<<endl;
}
};
class C:virtual public A
{
public:
C(char* s1,char* s2) : A(s1)
{
cout<<s2<<endl;
}
};
class D: public B, public C
{
public:
D(char *s1,char *s2,char *s3,char *s4):B(s1,s2),C(s1,s2),A(s1)
{
cout<<s4<<endl;
};
创建对象的语句: D d(“class A”,”class B”,”class C”,”class D”);执行结果是什么?为什么?
答:执行结果:
class A
class B
class C
class D
三)、根据要求编写完整程序:(每题15分,共 30 分)
1.设计复数类的加法运算操作,使之能够执行下列运算:( 15 分)Complex x(3,6), y(4,5), z(0,0);
z = x + y;
z=2.4 + x;
z=y + 3.5
Complex operator+(Complex s1)
Complex Complex::operator+(const Complex &s1)
{
Complex tmp;
tmp.real=this->real+s1.real;
tmp.imag=this->imag+s1.imag;
return tmp;
}
Complex Complex:: operator+(double d)
{
Complex tmp;
tmp.real+=d;
tmp.imag=this->imag;
return tmp;
}
2. 设计High类,其数据成员为高h,定义虚函数disp()。
由High 派生出长方体类Cuboid与圆柱体类Cylinder。
在主函数中用基类指针变量p调用虚函数disp()显示长方体与圆柱体的体积。
(15分)class High{
public:
unsigned int h;
virtual void disp(){};
};
Class Cuboid:public High{
Public:
unsigned int length;
unsighed int width;
virtual viod disp(){cout<<length*width*h<<endl;};
};
Class Cylinder:public High{
Public:
usigned int r;
virtual void disp(){cout<<3.14159*r*r*h<<endl;}; };
void main()
{
High *p;
Cuboid objA;
Cylinder objB;
objA.h=20;
objA.length=3;
objA.width=4;
p=&objA;
p->disp();
objB.r=5;
objB.h=10;
p=&objB; p->disp(); }。