- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
面向对象程序设计-朱勇
《 面向对象程序设计》
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. 友元关系具有什么特点?
二、分析下面的代码,回答问题(每题 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(){coutdmendl;}然后利用对象c调用Show(), c.Show();
2.下面代码的执行结果是什么?为什么?
class A{
int n;
public:
A() {};
A(int i){n=i;}
~A() { coutn=nendl;}
};
class B
{
A a;
int m;
public:
B(int i,int j):a(i){m=j;}
~B(){coutm=mendl;}
};
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(){coutn=nendl;}
};
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) {coutsendl;}
~A(){};
};
class B:virtual public A
{
public:
B(char *s1,char*s2):A(s1)
{
couts2endl;
}
};
class C:virtual public A
{
public:
C(char* s1,char* s2) : A(s1)
{
couts2
原创力文档


文档评论(0)