VC期末考试题及标准答案

  • 格式:docx
  • 大小:30.69 KB
  • 文档页数:8

武汉大学2021—2021学年上学期

面向对象程序设计试卷〔B〕

学号: 姓名: 院系: 专业: 得分:

一、名词解释〔每题5分,共计25分〕

〔1〕构造函数:是一种特殊成员函数,它提供了对成员变量进展初始化方法,使得在声明对象时能自动初始化对象〔+2〕;构造函数名称与类名一样〔+1〕;构造函数不能指定任何返回值类型〔+1〕;构造函数可以重载〔+1〕。

〔2〕多态:多态性是面向对象编程一个重要特征〔+1〕,主要表现在函数调用时实现“一种接口,多种方法〞〔+2〕。多态又分为编译时多态和运行时多态两种〔+2〕。

〔3〕抽象类:抽象类是指这样类,它一些行为〔成员函数〕不给出具体定义〔+2〕,抽象类至少带有一个纯虚函数〔+1〕,抽象类不能用来申明对象,只能作为基类使用,因此它又称为抽象基类〔+2〕。

〔4〕文档模板:在文档/视图构造应用程序中,数据以文档类对象形式存在〔+1〕。文档对象通过视图对象显示出来,而视图大对象又是框架窗口一个子窗口,并且涉及文档操作菜单和工具栏等资源也是建立在框架窗口上〔+2〕。这样文档、视图、框架和所涉及资源形成了一种固定关系,这种固定关系就成为文档模板〔+1〕。也就是说,文档模板描述了对应于每一种类型文档视图和窗口类型〔+1〕。

〔5〕序列化:对象保存和恢复过程称为序列化〔+2〕。即对象具有保存和加载其状态能力〔+1〕,对象能够在程序运行完毕前将对象当前状态写入永久存储体中,以后在程序运行时通过数据读取而恢复对象状态〔+2〕。

二、简答题〔每题10分,共计40分〕

1. 简述文档、视图和应用程序框架之间如何相互作用? 答:文档、视图和应用程序包含了一系列复杂相互作用过程〔+1〕,稳当和视图交互式通过类共有数据成员和成员函数实现〔+1〕。一个视图对象只与一个文档对象关联,一个文档可以与多个视图关联,但一个文档对象只反映当前视图变化〔+2〕。视图中用GetDocument()获取文档对象进展操作〔+1〕;在文档中利用Invalidate(),

UpdateAllViews() 或SendMessage(WM_PAINT,a,b)调用视图中OnDraw()对文档数据进展绘图〔+3〕;在程序任何地方可以调用AfxGetApp()得到程序框架对象指针,利用框架对象指针可进一步利用GetActiveView()获取程序视图对象,并对其进展操作〔+2〕。

2. Windows消息发送有哪两种方式?主要区别是什么?Windows API提供了哪几个函数用于消息发送?

答:发送消息方式有:传送和寄送两种方式〔+3〕,这两种方式之间主要区别是消息被接收对象收到后是否立即被处理〔+3〕。根据两种方式,Windows提供了多个API函数用于消息发送,其中常用函数是SendMessage()、PostMessage()和SendDlgItemMessage()〔+4〕。

3. 何谓DDX和DDV?编程时如何使用MFC提供DDX功能?

答:对话框实现用户数据输入和输出一般方法是通过类向导将对话框控件与成员变量相关联,利用对话框数据交换〔DDX〕和对话框数据校验〔DDV〕机制实现数据输入和输出〔+3〕;MFC提供了CDataExchange类实现了对话框类〔成员变量〕与控件之间数据交换与数据验证;对话框DDX和DDV功能是由成员函数DoDataExchange()完成。DDX实现数据交换,DDV实现数据验证〔+3〕;用户不能直接调用函数DoDataExchange(),而是调用CWnd::UpdateData(BOOL),当调用UpdateData(FALSE)时,MFC通过调用对话框派生类函数DoDataExchange()将数据从成员变量传递到关联控件;调用UpdateData(TRUE)时,MFC通过调用对话框派生类函数DoDataExchange()将数据从控件传递到关联成员变量〔+4〕。

4. MFC提供了哪几种设备环境类?它们各自有什么用途?

答:MFC提供设备环境类有CDC、CPaintDC、CClientDC、CWindowDC和CMetaFileDC,其中CDC为基类,其它都是MFC派生类〔+5〕;CDC是其它设备环境类基类,同时也可以作为一般设备环境类使用。CDC对所有GDI函数都进展了封装〔+1〕;CPaintDC是OnPaint()函数使用设备环境类,代表一个窗口绘图画面。OnPaint是WM_PAINT消息处理函数,当窗口尺寸改变、或者当窗口恢复了先前被遮盖局部,应用程序窗口都会收到WM_PAINT消息〔+1〕。CClientDC类代表了客户区设备环境。当在客户区实时绘图时,需要利用CClientDC类定义一个客户区设备环境〔+1〕;CWindowDC类代表整个程序窗口设备环境。使用窗口设备环境可以在整个窗口区域绘图〔+1〕;CMetaFileDC是用于创立一个Windows图元文件设备环境。Windows图元文件包含了一系列GDI绘图命令〔+1〕。

三、请简述下面两个for循环优缺点〔5分〕。

if (condition){

for (int i=0; i

DoSomething();

}

else{

for (int i=0; i

DoOtherthing();

}

优点:循环的效率高〔+2〕

缺点:程序不简洁〔+1〕 for (int i=0; i

if (condition)

DoSomething();

else

DoOtherthing();

}

优点:程序简洁〔+1〕

缺点:多执行了N-1 次逻辑判断,并且打断了循环“流水线〞作业,使得

四、改错题:下面两段程序目是在屏幕上输出“Hello!〞,但是两段程序中都不能得到正确运行结果,请简述其错误并改正。〔5分〕

左边: 在函数GetMemory中,char* p为临时变量〔虚参〕,无法传出地址。

修改方法:

void GetMemory(char** p){

*p = new char[100];

} (+1)

void test(void){

char *str = null;

GetMemory(&str); (+1)

strcpy(str, "hello!");

printf("%s", str); (+0.5)

delete[] str; (+0.5)

}

右边:因为GetMemory 返回是指向“栈内存〞,指针,该指针地址不是 NULL,但其原现内容已经被去除,新内容不可知。修改方法:

char* GetMemory(void){

char* p = new char[100];

strcpy(p, "Hello!"); (+1) char* GetMemory(void){

char p[] = "Hello!";

return p;

}

void Test(void){

char *str = NULL;

str = GetMemory();

printf(str);

} void GetMemory(char *p){

p = new char[100];

}

void Test(void){

char *str = NULL;

GetMemory(str);

strcpy(str, "Hello!");

printf(str);

} return p;

}

void Test(void){

char *str = NULL;

str = GetMemory();

printf("%s", str); (+0.5)

delete[] str; (+0.5)

}

五、编程题〔15分〕:以下为基于对话框应用程序CTestDlgDlg,主要功能是,根据输入坐标、线宽和颜色,在对话框自画按钮上绘制矩形,其中颜色信息是通过通用颜色对话框来获取。

必要信息及相关变量见下表:

ID Caption ID 变量 ID

Caption

IDC_STATIC x1= IDC_EDIT_X1 int m_x1 IDC_BUTN_GETCOLOR 设置颜色

IDC_STATIC y1= IDC_EDIT_Y1 int m_y1 IDC_BUTNDRAW 自画按钮

IDC_STATIC x2= IDC_EDIT_X2 int m_x2 IDC_APPLY 绘制

IDC_STATIC y2= IDC_EDIT_Y2 int m_y2 IDCANCEL 取消

IDC_STATIC 线宽 IDC_EDIT_WIDTH int m_width

另外在CCTestDlgDlg类头文件中已定义了一个全局变量COLORREF m_color用来保存颜色,颜色获取通过点击“设置颜色〞按钮来完成。该按钮消息响应函数如下,请在// TODO:

add draw code for native data here后面添加你代码。〔5分〕

void CCTestDlgDlg::OnButnGetcolor(){

// TODO: Add your control notification handler code here

CColorDialog dialog;

if (dialog.DoModal() == IDOK){

m_color = dialog.GetColor();

return;

}

}