C++复习资料.docx
- 文档编号:30645140
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:26
- 大小:46.22KB
C++复习资料.docx
《C++复习资料.docx》由会员分享,可在线阅读,更多相关《C++复习资料.docx(26页珍藏版)》请在冰豆网上搜索。
C++复习资料
一、问答题(每小题分,共分)
1.C++的类库主要有哪2种?
答:
主要有Borland的OWL(ObjectWindowsLibrary)和Microsoft的MFC。
1.简单叙述类的确定与划分的基本方法
答:
将目标任务中具有共性的成分确定为一个类;可以按照以下步骤进行分析:
第一,要判断该事物是否有一个以上的实例;第二,要判断类的实例中有没有绝对的不同点,如果没有,则它同样可能被确定为一个类。
2.什么是抽象类?
抽象类能否用来创建对象?
抽象类的作用是什么?
答:
含有纯虚函数的类是抽象类。
抽象类不能声明对象实例。
只能声明指针或作为基类派生子类。
答案见课本226页
3.什么是虚函数?
什么是纯虚函数?
什么是多态类?
虚函数是保留字virtual定义的成员函数,基类的虚函数在派生类仍是虚函数。
纯虚函数是在类中声明但没有定义的虚函数
4.试论述类的静态数据成员与类的一般数据成员的不同点。
如何初始化类的静态数据成员?
如何初始化类的常数据成员?
答:
类的静态数据成员在生成对象以前已经存在,类的一般数据成员只有在利用类生成对象时才生成。
类的静态数据成员一般在定义类的界面之外(后)采用赋值法初始化(如课本121页例4-16中的intPerson:
:
total=0;)。
类的常数据成员在构造函数的圆括号()之后采用初始化列表法初始化(课本136页2.常数据成员例4-25)。
5.类的非静态数据成员与静态成员、成员函数在存储分配上有什么不同?
类的非静态数据成员各个对象的存储各自分配,而所有同类对象的静态成员、成员函数代码共用,在存储分配上是一个存储。
静态成员在生成对象之前已经存在。
6.什么是静态类型与动态类型?
答:
声明指针或引用时所指定的基类型称为该指针或引用的静态类型。
程序运行时指针或引用实际指向或引用的对象所属的类型称为该指针或引用的动态类型。
静态类型用于编译程序检查类型的合法性,动态类型是静态类型的子类型,被运行系统用于动态绑定。
7.什么是静态绑定?
什么是动态绑定?
如何实现运行时的多态?
将函数调用与其相应的函数体实现代码相关联的过程称为绑定。
静态绑定又称为早期绑定,意味着调用哪个版本的函数在程序编译时已确定。
静态绑定具有执行效率高、占用内存少等优点,但缺乏灵活性。
动态绑定又称为晚期绑定,意味着调用哪个版本的函数在程序运行时才确定。
C++语言的动态绑定通过继承与虚函数实现,具体可以声明一个含有纯虚函数的抽象基类(课本227页例7-5)或含有虚函数的基类和由此(抽象)基类公有派生的几个子类,纯虚函数(或虚函数课本221页例7-2)在不同子类中有不同的具体实现(一般都被定义为公有函数)。
一般是先声明一个祖先类指针、然后将祖先类或其派生类对象的地址赋值给这个祖先类指针,再通过指针来调用虚函数实现动态绑定:
即指针指向哪个对象就执行该对象所属类型的虚函数;当然也可以定义函数的参数为祖先类的引用、当调用函数时通过将祖先类对象或其派生类对象作为实际参数传递给函数的引用参数来实现成员函数调用的动态绑定;动态绑定具有允许程序有更大灵活性,提高程序可重用性、可扩充性等优点,但降低了程序执行效率和程序的可理解性。
.
8.在什么时候执行构造函数?
什么时候执行析构函数?
答:
类在生成对象的时候执行构造函数;当对象生命期结束的时候执行析构函数。
9.请叙述构造子类对象时构造函数的执行顺序
答:
在生成子类对象时构造函数的执行顺序是:
先父后子,先虚后实,先左后右,多路虚只长一次;父类的构造函数执行完毕后,内嵌对象的构造函数按照声明顺序执行,最后执行子类的构造函数。
10.实现动态联编方式的三个前提是什么?
答:
第一,声明一个含有纯虚函数的抽象基类(课本227页例7-5)或含有虚函数的基类和由此(抽象)基类公有派生的几个子类,纯虚函数(或虚函数课本221页例7-2)在不同子类中有不同的具体实现(一般都被定义为公有函数);第二,类之间应当满足赋值兼容性规则(课本206页);第三,通过成员函数调用或通过指针引用来调用虚函数。
(课本221页)
11.程序员在什么情况下必须设计构造函数?
在什么情况下必须设计析构函数?
答:
当类含有指针成员(一般构造函数中有动态内存分配语句new,或当数据成员较多、含有数组成员)时必须设计构造函数和析构函数(析构函数中含有delete语句去释放new分配的内存)。
12.序员在什么情况下必须设计(复制)COPY构造函数?
当对象需要占用堆资源时(具体就是对象含有指针成员时),需要在类中显式定义复制构造函数,对资源进行深复制。
见课本第118页1—3行
13.友元函数是类的成员函数吗?
友元函数能否直接访问声明该函数为友元的类的私有成员?
答:
友元函数不是类的成员函数;友元函数可以通过对象直接访问声明该函数为友元的类的私有成员。
14.面向对象的三大特性是什么?
答:
三大特性是:
封装性,继承性,多态性.
15.请说明概括(泛化)和特化的含义:
概括(泛化):
从某些具有共性的对象或类中提取抽象出高一层的类;在分类的基础上进行。
特化:
继承高层次的类,并添加一些属性和方法,在构造子类时使用。
16.请说明是么是深拷贝?
什么是浅拷贝?
如何实现深拷贝?
当对象占有资源时(对象之外的内存),在用一个已知的对象去初始化另一个对象时,只是复制对象本身,而两个对象共用对象之外的资源,这种情况叫浅拷贝;如果对对象之外的资源也进行拷贝(即两个对象分别占有不同的资源)就叫深拷贝。
实现深拷贝需要定义拷贝构造函数,并在拷贝构造函数中使用NEW运算分配资源等。
17.类摸版与抽象类的相同点与主要区别是什么?
答:
类属类分为:
类摸版与抽象类。
它们的相同点是都不能拿来直接生成对象,主要区别是类摸版是用来对类属参数用类型参数实例化后生成具体的类,然后可以生成对象;而抽象类主要是用来继承的,用于实现动态绑定。
包容数据结构用类摸版(参数化类)机制实现,类摸版实现的类属类是无约束类属类。
C++语言的受约束类必须采用抽象类、继承与动态绑定实现,如多态数据结构就是受约束类属类。
18.什么是包容数据结构?
如果一个数据结构(如:
堆栈,链表等)中可以存放多种(无关的)类型的对象,这个数据结构被称为包容数据结构。
包容数据结构可以存放完全无关的类的对象。
包容数据结构用类摸版(参数化类)机制实现。
19.什么是无约束类属类?
类摸版的实际参数类型不要求有共同祖先,类模版中的操作与类属参数之间基本上没有关联。
类摸版实现的类属类是无约束类属类。
C++的模版机制无法支持受约束类。
20.什么是多态数据结构(受约束类属类,异质数据结构)?
如果一个数据结构(如:
堆栈,链表等)中可以存放多种类型的对象,但这些类型必须是从共同的基类派生出来的类。
多态数据结构用虚函数、抽象类与继承机制实现。
21.类摸版的界面和它的类属成员函数一定要放在一个文件吗?
是,必须放在一个文件,因为编译程序并不为类属类的定义生成任何代码,仅当类属类实例化时才产生真正代码。
未实例化的类属类(类模版)定义没有加入目标文件(.OBJ)中,当建立的可重用类库(.LIB)中包含类属类时会出现程序连接错误。
22.假如已经定义了一个堆栈类摸版:
template
classSTACK{
public:
……
private:
structNODE{
ELEMENT_TYPEelement;
NODE*link;
};
NODE*top;
};
……
在主程序中有下列语句,
…
STACK
…
当执行该语句时生成对象int_stack要分为几个步骤?
答:
首先实例化摸版STACK生成一个具体的类,类名为STACK
(理解看课本251—259页)
23.写出(课本251页例8-2)下面程序的运行结果。
#include
template
TMax(Tx,Ty)
{
return(x>y)?
x:
y;
}
voidmain()
{
intx1,y1;
floatx2,y2;
doublex3,y3;
cout<<”请输入2个整形数据,用空格分隔:
”< cin>>x1>>y1; cout<<”Themaxofx1,y1is: ”< cout<<”请输入2个实型数据,用空格分隔: ”< cin>>x2>>y2; cout<<”Themaxofx2,y2is: ”< cout<<”请输入2个双精度型数据,用空格分隔: ”< cin>>x3>>y3; cout<<”Themaxofx3,y3is: ”< } 答: 程序运行结果见课本251页。 24.全局对象,全局静态对象,局部静态对象的构造函数分别在在什么时候被调用? 答: 全局对象,全局静态对象的构造函数在main()函数执行之前被调用;局部静态对象的构造函数在程序第一次执行到相应的生命语句时才被调用。 静态对象只被初始化一次。 25.使用常成员函数时要注意几点? 答: 注意以下几点: (1)const是函数类型的一个组成部分,因此在函数的实现部分也要使用关键字const。 (2)常成员函数不能修改对象的数据成员,也不能调用该类中没有用关键字const修饰的成员函数。 (3)关键字const参与区分函数重载。 (4)通过常对象只能调用它的常成员函数,而不能调用其他成员函数。 二、请指出下列程序中的错误语句,并在语句旁边写出错误原因。 (分) 1. #include voidmain() { intf=6; int*a=&f; constint*p=a; *p=11;//p为指向常量的指针,试图用*p去修改p所指向空间的值不行。 f=7; *a=8; //以上两句对,这里只是固定*p,并不固定p、f和*a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 复习资料
![提示](https://static.bdocx.com/images/bang_tan.gif)