sum+=s[i]->area();
returnsum;
}
9.声明一个Shape类(形状)基类,它有两个派生类:
Circle(圆)和Square(正方形),要求如下。
⑴根据给出的圆心坐标计算圆的面积。
⑵根据给出的正方形中心坐标和一个顶点坐标计算该正方形的面积。
提示:
Shape类的数据成员包括中心的坐标,Circle类和Square类由Shape类派生,Circle类新增一个数据成员,即圆的半径,Square类新增两个数据成员,即顶点坐标。
1.解答要点:
类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。
类是对某一类对象的抽象,而对象是某一种类的实例。
2.解答要点:
将类所有未编写函数体的成员函数在类体外全部编写出来。
3.解答要点:
类中所有的成员函数(静态成员函数除外)都隐含了第一个参数,这个隐含的第一个参数就是this指针,在成员函数的实现代码中,所有涉及对类的数据成员的操作都隐含为对this指针所指对象的操作。
4.解答要点:
构造函数的作用是为类对象的数据成员赋初值,构造函数在定义类对象时由系统自动调用;在一个对象死亡或者说退出生存期时,系统会自动调用析构函数,因此可以在析构函数定义中,设置语句释放该对象所占用的一些资源。
5.解答要点:
当有用一个已经存在对象创建一个同类型的新对象的需求时。
当对象含有指针数据成员,并用它初始化同类型的另一个对象时,默认的拷贝构造函数只能将该对象的数据成员复制给另一个对象,而不能将该对象中指针所指向的内存单元也复制过去。
这样,就可能出现同一内存单元释放两次,导致程序运行出错。
6.解答要点:
堆区用来存放在程序运行期间,根据需要随时建立的变量(对象),建立在堆区的对象称为堆对象,当堆对象不再使用时,应予以删除,回收所占用的动态内存。
创建和回收堆对象的方法是使用new和delete运算符。
7.解答要点:
定义静态数据成员是为了同一个类的不同对象之间共享公共数据成员;用关键字static可以把数据成员定义成静态数据成员;在定义的类被使用前,要对其中的静态数据成员进行初始化,初始化时不必添加关键字static。
8.解答要点:
用关键字static可以把这成员函数定义成静态成员函数。
⑴静态成员函数只能访问类的静态数据成员,不能访问类的非静态数据成员。
因为静态成员函数是类的成员,不涉及具体的对象,访问静态成员函数常用类名引导。
⑵非静态成员函数可以访问类的静态数据成员,也可以访问非静态数据成员。
因为类的静态成员总是存在的。
⑶静态成员函数和非静态成员函数,最主要的差别是非静态成员函数隐含了第一个参数this指针,静态成员函数不含this指针。
9.解答要点:
struct和class都可以定义类,但是缺省访问权限说明时,struct的成员是公有的,而class的成员是私有的。
在C++中,struct可被class代替。
10.解答要点如下。
⑴采用public公有派生,基类成员的访问权限在派生类中保持不变,即基类所有的公有或保护成员在派生类中仍为公有或保护成员。
public派生最常用,可以在派生类的成员函数中访问基类的非私有成员,可通过派生类的对象直接访问基类的公有成员。
⑵采用private私有派生,基类所有的公有和保护成员在派生类中都成为私有成员,只允许在派生类的成员函数中访问基类的非私有成员。
private派生很少使用。
⑶采用protected保护派生,基类所有的公有和保护成员在派生类中都成为保护成员,只允许在派生类的成员函数和该派生类的派生类的成员函数中访问基类的非私有成员。
11.解答要点如下。
派生类构造函数的执行次序:
首先,调用基类构造函数,调用顺序按照它们被继承时声明的基类名顺序执行;其次,调用内嵌对象构造函数,调用次序为各个对象在派生类内声明的顺序;最后,执行派生类构造函数体中的内容。
派生类析构函数执行过程与构造函数执行过程相反。
即当派生类对象的生存期结束时,首先调用派生类的析构函数,然后调用内嵌对象的析构函数,再调用基类的析构函数。
12.解答要点如下。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
引进虚基类的目的是为了解决二义性问题,使得公共基类在它的派生类对象中只产生一个基类子对象。
13.解答要点如下。
多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。
C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中主要的方式。
14.解答要点如下。
含有纯虚函数的类称为抽象类。
抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。
抽象类声明了一组派生类共同操作接口的通用语义,而接口的完整实现,即纯虚函数的函数体,要由派生类自己给出,抽象类只能作为基类被继承使用。
抽象类的派生类不一定要给出纯虚函数的实现,没有给出纯虚函数的实现的派生类仍然还是抽象类。
15.解答要点如下。
在C++中不能声明虚构造函数。
多态是不同的对象对同一消息有不同的行为特性,虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有童义的。
在C++中可以声明虚析构函数。
析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,如果一个类的析构函数是虚函数,那么,由它派生而来的所有子类的析构函数也是虚函数。
析构函数设置为虚函数之后,在使用指针引用时可以动态联编,实现运行时的多态,保证使用基类的指针就能够调用适当的析构函数对不同的对象进行清理工作。
16.解答要点:
⑴控制台应用程序。
⑵基于框架窗口的应用程序。
⑶基于文档/视图结构的应用程序。
⑷基于对话框的应用程序。
17.解答要点:
在Windows操作系统中,无论是系统产生的动作,还是用户运行应用程序产生的动作都称为事件(events)产生的消息。
如果程序需要消息做出反应,必然要调用相应的处理函数,如果没有定义处理函数,则该消息被忽略。
编制消息处理函数被称作消息映射。
18.解答要点:
文档类CDocument的派生类对象规定了应用程序的数据。
视图类的几个重要成员函数:
GetDocument()、OnDraw()、OnInitialUpdate()等。
20.解答要点:
⑴非模式对话框的模板资源在设计时必须选中Visible属性(在属性对话框的MoreStyles页中设置),若没有选中,则必须调用对话框类的成员函数ShowWindow;否则对话框不可见,而模式对话框无需设置此属性。
⑵非模式对话框通过调用CDialog:
:
Create函数来启动,而模式对话框使用CDialog:
:
DoModal函数来启动。
由于Create函数不会启动新的消息循环,非模式对话框与应用程序共用同一个消息循环,这样非模式对话框就不会垄断用户的输入。
Create函数在显示了非模式对话框后就立即返回,而DoModal函数是在模式对话框被关闭后才返回的。
⑶非模式对话框对象是用new操作符动态创建的,而模式对话框以对象变量的形式出现的。
⑷非模式对话框的关闭是由用户单击OK或Cancel按钮完成的,与模式对话框不同,程序员必须分别重载这两个函数,并且在其中调用CWnd:
:
DestroyWindow函数来关闭对话框。
该函数是用于关闭窗口。
⑸必须有一个标志表明非模式对话框是否打开。
应用程序根据该标志决定是打开一个新对话框,还是仅激活原来已经打开的对话框。
通常可以用拥有者窗口中指向非模式对话框对象的指针(因为非模式对话框对象是用new操作符动态创建)作为这个标志,当对话框关闭时给该指针赋NULL值,表明该对话框对象已不存在了。
二、填空题
1.引用
2.构造函数析构函数
3.A(),B()
4.this,A*
5.静态数据成员静态成员函数
6.friend
7.派生类基类
8.public、protected、private
9.virtual
10.基类派生类自身
11.成员函数
12.运行时
13.静态联编,动态联编
14.publicvehicle,publicvehicle
15.基类A中的成员函数.
派生类B中的成员函数.
16.C类B类
17.抽象函数
18.优先级2.12
19.Aoperator++(int)friendAoperator++(A&,int)
20.TimeTime:
:
operator+(int)
21.输入消息、控制消息、系统消息、用户消息
22.WM_LBOTTONDOWNOnLButtonDown
23.CDC
24.设备环境
25.模态对话框非模态对话框
26.构造函数OnInitDialog()函数
27.CColorDialog、CFileDialog、CFindReplaceDialog、CFontDialog、CPrintDialog
28.CeditView
29.OnNewDocument()
30.Invalidate()或InvalidateRect()
31.下一行
32.3和3.2
33.5
34.代码
35.4×i
36.单继承
37.不能够
38.AB()
39.a
40.2
41.静态
42.友元
43.virtual
44.=0
45.抽象类
46.抽象类
47.AB
48.1514305591140204
49.输入2个整数相加的结果,结果正确返回1,否则返回0
50.将字符串中的小写字母转换为大写
51.非多态调用
52.第一操作数
53.operatrodouble()
54.operator+=(x,y)
55.(istream&,CSAI&)
56.不能
57.多态
58.returnmidlow=mid+1
59.newchar[strlen(aa)+1]~A(){delete[]a;}
三、编程题
1.
#include
#include
classEmployee
{
protected:
charname[20];
charaddress[100];
charcity[20];
charprovince[20];
charzipcode[10];
public:
Employee(char*nm,char*addr,char*city,char*prov,char*zip);
voidChangeName(char*newName);
char*Display(char*buffer);
};
Employee:
:
Employee(char*nm,char*adr,char*cit,char*prov,char*zip)
{
strcpy(name,nm);
strcpy(add