logo资料库

Visual_C++_实用教程_第4版_郑阿奇__习题参考答案.doc

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
第 2 章 C++面向对象程序设计 2.1 类和对象 1.什么是类?类的定义格式?类的成员一般分为哪两部分?它们的区别如何? ⑴“类”是对具有共同的属性特征和行为特征的对象的概括和抽象。 ⑵类的定义格式: class 类名{ [ private:] 私有数据成员和成员函数 public: 公有数据成员和成员函数 }; ⑶类的成员一般分为数据成员和成员函数两部分。 ⑷数据成员一般用来表示对象属性特征,而成员函数一般表示了对象的可以进行的操作,即 行为特征。 2.类与结构体有什么区别? 类中可以包含两类成员――数据成员和成员函数;而标准 C 语言中的结构体只能包含数据成 员;但是 C++中的结构体对 C 语言中的结构体有扩展,C++中的结构体也可以两类成员―― 数据成员和成员函数;因此 C++中的类和 C++中的结构体出来在定义方式上不一样之外 (class,struct ),还有就是它们的缺省封装字是不一样的,一个是 private,一个是 public。 3.什么是对象?如何定义一个对象?对象的成员如何表示? ⑴对象是类的实例,是类的变量。 ⑵对象的定义: 类名 对象名称; 或:类名 * 对象指针; ⑶对象成员的表示:对象名称.成员名字; 或: 对象指针→成员名字; 4.什么是构造函数?构造函数有哪些特点? 构造函数是类的成员函数,它有以下特点:  构造函数的名字必须与类名相同。  构造函数可以有任意的形参,但不能具有返回值。  定义对象时,编译系统会自动地调用构造函数。  构造函数可以重载 5.什么是析构函数?析构函数有哪些特点? 析构函数也是类的成员函数,它有以下特点:  析构函数名也应与类名相同,只是在函数名前面加一个波浪符~。  析构函数不能带任何参数,也没有返回值。  每个类有而且只能有一个析构函数。析构函数不能重载。
6.什么是默认构造函数和默认析构函数? 假如用户没有自己编写构造函数或析构函数,编译系统也会自动生成一个构造函数和析 构函数,这就是默认的构造函数和析构函数,但是这两个函数没有任何参数,也不进行任何 操作。 7.什么是复制构造函数?它的功能和特点是什么? 复制构造函数是一种特殊的构造函数,它用来在已存在的对象基础上建立一个新对象。 复制构造函数的名称也和类名是一样的,但是它的形式参数,都是指向一个已经存在 的对象,因此它的形式参数都是这种形式:“const 类名 &ob”,即是一个对象的引用。 8.什么是静态成员?静态成员的作用是什么? 9.如何对对象进行初始化? 对象的初始化都是通过构造函数进行的,只要在声明对象时,逐个添好构造函数的实参。 10.什么是友元?它的作用有哪些?什么是友元函数和友元类? 11.什么是 this 指针?它有何作用? 一个类可以同时有很多对象存在,许多不同的对象可以调用相同的成员函数,编译系统 为了知道当前是那个对象在调用成员函数,因此定义了 this 指针,this 指针其实就是指向 当前对象的指针。 12.什么是类的作用域?对象的生存期有何不同? 类的作用域简称类域,它是指在类的定义中由一对花括号所括起来的部分,每一个类都 具有相应的类域。类域中定义的变量不能使用 auto,register 和 extern 等修饰符,只能用 static 修饰符,函数也不能用 extern 修饰符。 所谓对象的生存期是指对象从被创建开始到被释放为止的时间,按生存期的不同对象可 分为如下三种: 1、局部对象:当对象被定义时调用构造函数,该对象被创建,当程序退出定义该对象 所在的函数体或程序块时,调用析构函数,释放该对象。 2、静态对象:当程序第一次执行所定义的静态对象时,该对象被创建,当程序结束时, 该对象被释放。 3、全局对象:当程序开始时,调用构造函数创建该对象,当程序结束时调用析构函数 释放该对象。 2.2 继承和派生类 20.派生类是如何定义的?它有哪些特点? ⑴定义派生类的一般形式为: class 派生类名:[引用权限] 基类名 { 派生类新增的数据成员 派生类新增的成员函数 }; ⑵派生类继承了基类的所有数据成员和成员函数,并增加新的成员。 21.派生类的继承方式有哪些?它们各有哪些特点? 这是继承技术中比较关键的问题。
从基类继承来的成员的引用,不是简单地把基类的私有成员和公用成员直接作为派生类 的私有成员和公用成员来使用,而要根据基类成员的“封装权限”和派生类声明的“引用权 限”共同决定。 ①当引用权限为 public 时,称为“公用派生类”。在公用派生类中,基类的 public 成员和 protected 成员仍然成为派生类中的 public 成员和 protected 成员;然而基类中的私有成 员却成为了派生类中的“不可访问的成员”,不能被派生类使用。 ②当引用权限为 private 时,称为“私有派生类”。在私有派生类中,基类的公用成员和保 护成员成为了派生类中的私有成员,基类的私有成员成为派生类“不可访问的成员”。 ③从以上两点可以看出,基类中的私有成员在派生类中都成为了“不可访问的成员” 。因 此在继承中经常使用另外一种封装字 protected,被 protected 封装的成员称为“保护成员”, 保护成员和私有成员相似,不能被外界引用,但它却可以被派生类的成员函数引用。 22.在定义派生类的过程中,如何对基类的数据成员进行初始化? 基类的数据成员初始化往往是通过基类的构造函数进行的,但是在么在建立派生类的对象 时,是不会自动执行基类的构造函数,因而就会使基类中成员变量未初始化。所以在设计派 生类的构造函数时,不仅要考虑派生类所增加的成员变量初始化,还应当考虑基类的成员变 量初始化。在执行派生类的构造函数时,应当调用基类的构造函数。 因此考虑到基类成员变量初始化后,派生类的构造函数一般形式为: 派生类构造函数名(参数表):基类构造函数名(参数表) 例如: student(int n,char nam[],char s,int a,char ad[] ):stud(n,nam,s) 其中,student 类是 stud 的派生类。 23.在派生类中能否直接访问基类中的私有成员?在派生类中如何实现访问基类中的私有成 员? 在派生类中是不能直接访问基类中的私有成员的,要在派生类中访问基类中的私有成 员,只能通过基类所提供的 public 或 protected 封装的成员函数进行。 24.什么是虚基类?它的作用如何? 在声明派生类时,在基类的引用权限前面加上 virtual,就将基类声明成了虚基类,即: class 派生类名:virtual [引用权限] 基类名 虚基类的引入主要是针对多重派生的,是为了消除派生类的二义性使用的。通过虚基类 派生出来的新类,同一个成员变量在不同的派生类中都只有一个复制,当通过普通基类派生 的新类,同一个成员变量,在不同的派生类中的副本是不一样的。 2.3 多态和虚函数 29.什么是多态性? 所谓“多态性”就是不同对象收到相同的消息时,产生了不同的动作。这里的消息主要是指 对类的成员函数的调用,因此的函数重载就是多态性的表现。 30.什么是虚函数?为什么要定义虚函数? 在函数的声明时,在函数名前面加上 vitual 就实现了虚函数的声明。通过虚函数和继
承,可以实现运行时的多态性。即在程序执行前,根据函数和参数还无法确定应该调用哪一 个函数,必须在程序的执行过程中,根据执行情况动态地确定。 31.什么是纯虚函数?什么是抽象类? 声明纯虚函数的一般格式为: virtual 函数类型 函数名(形参表)=0; 它与一般虚函数不同的是:在纯虚函数的形参表后面多了个“=0”。把函数名赋于 0, 本质上是将指向函数的指针的初值赋为 0,纯虚函数不能有具体的实现代码。 抽象类是指至少包含一个纯虚函数的特殊的类。它本身不能被实例化,也就是说不能 声明一个抽象类的对象。必须通过继承得到派生类后,在派生类中定义了纯虚函数的具体的 实现代码,才能获得一个派生类的对象。 2.4 运算符重载 34.运算符重载的含义是什么?是否所有的运算符都可以重载? 运算符重载也是实现静态多态性的一种方法,可以使操作的含义更加清晰。在 C++中, 大多数系统预定义的运算符都能被重载,但是并不是所有的运算符都可以重载的,比如: ? : :: . 就不能重载。 第 3 章 MFC 基本应用程序的建立 1. Windows 的应用程序特点有哪些? 参考书(p143~145) 2. MFC 的 AppWizard(exe)提供了哪几种类型的应用程序? 使用MFC的AppWizard可以创建下面三种类型的应用程序: (1)单文档界面的应用程序(SDI,single document interface); (2)多文档界面的应用程序(MDI,multiple documents interface); (3)基于对话框的应用程序(dialog based)。 3.MFC 有哪些机制?这些机制有什么用? 4.用 AppWizard 创建一个多文档应用程序项目(MDI)Ex_MDIHello,比较 MDI 与 SDI 有哪些 区别? SDI应用程序由应用程序类(CWinApp)、框架窗口类(CFrameWnd)、文档类(CDocument)、 视图类(CView)和文档模板类(CSinSleDocTemplate)共同作用。MDI应用程序与SDI应用程序 的主要差别在于:MDI有CMDIFrameWnd和CMDIChildWnd两个框架窗口类,前一个派生 CMainFrame类,负责菜单等界面元素的主框架窗口管理;后一个派生CChildFrame类,负责 相应的文档及其视图的子框架窗口维护。而SDI由框架窗口类CFrameWnd派生CMainFrame类。 5.消息的类别有哪些?用 ClassWizard 如何映射消息? ⑴窗口消息:窗口消息一般与创建窗口、绘制窗口、移动窗口和销毁窗口等操作相关。窗口 消息的形式为 WM_***,其中*的内容与每个窗口消息的内容有关。窗口消息只能被窗口或窗 口对象处理,在 MFC 应用程序中,CView 和 CFrame 及它们的派生类,以及自定义窗口类型
都能处理窗口消息。 ⑵命令消息:命令消息一般与处理用户的某个请求或执行用户的某个命令相关。在 MFC 应用 中,凡是从基类 CCmdTarget 派生的类都能处理命令消息,不仅窗口类 CView、CFrame,而 且文档类、应用程序类都可处理命令消息。一般通过选择菜单项、单击工具栏按钮、按加速 键可产生命令消息。 ⑶控件消息:控件消息与控件窗口中某个事件的发生相关。如改变文本框控件窗口的内容时, 有一个通知窗口内容发生变化的控件事件产生。当选择列表框控件的某个选项时,也有一个 通知选项发生改变的控件事件发生。 6.如何通过 ClassWizard 添加一个类? 第 4 章 对话框及常用控件 1.什么是对话框?它分为哪两类?这两类对话框有哪些不同? 对话框是 CDialog 类的派生类,它的主要功能是输出信息和接收用户的输入。对话框是 一个特殊类型的窗口,任何对窗口的操作都可以在对话框中进行。对话框与控件是密不可分 的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。 对话框可以分为两种类型:一是模式对话框;二是无模式对话框。 ⑴模式对话框:所谓的模式对话框是指对话框弹出时,用户必须向对话框进行相应的操 作,在退出对话框之前,其所在的应用程序是不能往下执行的。 ⑵无模式对话框:无模式对话框是指对话框弹出后,一直保留在屏幕上,用户可以在对 话框所在的应用程序中进行其他的操作。 两种对话框在编辑器设计和使用 ClassWizard 进行编程时方法基本一致,但在创建和退 出对话框窗口时的方式不同。 在创建时,模式对话框是由系统自动分配内存空间,因此在对话框退出时,对话框对象 自动删除。而无模式对话框则需要用户来指定内存,退出时还要自己删除对话框对象。 在 退 出 时 , 两 种 对 话 框 所 用 的 终 止 函 数 不 一 样 。 模 式 对 话 框 通 过 调 用 CDialog::EndDialog 来终止,而无模式对话框则是通过调用 CWnd::DestroyWindow 来终止。 需要说明的是: 由于函数 CDialog::OnOK()和 CDialog::OnCancel()是调用 EndDialog 的,因此无模式对话 框必须用 DestroyWindow 来重载 OnOK()和 OnCancel()两个函数。另外,需要正确删除表示 对话框的 C++对象。 2.什么是对话框模板、对话框资源和对话框类? ⑴对话框模板:MFC Develop Studio 提供的对话框模板是用来创建用户对话框资源,用对 话框模板创建的基本界面上,包括一个 OK(确定)按钮和一个 Cancel(取消)按钮等。可以移 动、修改、删除这些控件,或者是增加新的控件到对话框模板,构成应用程序所需的对话框 资源。 ⑵对话框资源:对话框资源是一个用户输入或取得数据的图形界面。这个图形界面是使用 对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对 话框资源。当应用程序运行时,就可以得到一个对话框。
⑶对话框对象 MFC 使用 CDialog 类来描述对话框,它是 CWnd 类的派生类。在 CWnd 类的基础上增加了 数据交换的功能。当创建一个新的对话框资源后,使用 ClassWizard 可以创建一个对话框类 的派生类。对话框对象实现了对话框和应用程序之间的通信。在应用程序中定义一个对话框 对象后,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。 3.对一个对话框编程一般经过几个步骤? ⑴创建对话框资源;⑵增加控件并设置控件属性;⑶设计对话框类;⑷模式或非模式方式显 示对话框 4.什么是控件?根据控件的性质可以将控件分为几类? 控件是系统内部定义的能完成特定功能的一些组件,控件能够放置在一个对话框中, 提供应用程序与用户交互的某种功能的类,根据控件的特性和功能,一般可以将其分为 3 类:Windows 通用控件、ActiveX 控件以及 MFC 新增控件,Windows 通用控件一般都是从 CWnd 派生而来的。 5.向对话框添加一个常用控件的方法有哪些?这些方法是否适用于 ActiveX 控件? 6.什么是 DDV/DDX 技术?如何使用这种技术? 为了能方便地操作一个控件,MFC 采用了独特的 DDX(Dynamic Data Exchange,动态数 据交换)和 DDV(Dynamic Data verify,动态数据交换)技术。DDX 将数据成员变量与对话类 模板内的控件相连接,这样使得数据在控件之间很容易传输。DDV 用于数据的校验,它能自 动校验数据成员变量数值的范围,并给出警告。 7.什么是控件的通知消息?它在编程中起哪些作用? 当控件状态发生改变时,控件就会向其父窗口发送消息,这就是控件的通知消息。控 件的通知消息可以是一条 WM_COMMAND 消息,也可以是一条 WM_NOTIFY 消息。 8.什么是按钮控件?它有几种类型? 按钮控件是 CButton 类的控件。按钮控件分为: ⑴推压式按钮 BS_PUSHBUTTON;⑵单选按钮 BS_RADIOBUTTON;⑶复选按钮 BS_CHECKBOX 9.什么是编辑框控件?它有哪些功能? 编辑框是一个允许用户从键盘输入数据和编辑文本的矩形窗口。编辑框属于 CEdit 类的“窗口控件”,可以获得输入焦点。 10.编辑框控件中的 EN_CHANGE 和 EN_UPDATE 通知消息有何异同?  EN_CHANGE:在文本发生改变后产生。  EN_UPDATE:在文本发生改变,还未显示之前产生。 11.向某一个应用程序添加一个对话框,并在对话框中添加一个按钮和一个编辑框,当单击 按钮后,在编辑框中显示“你好!”字样。 12.什么是列表框和组合框?它们的通知消息有何异同? 列表 框控件 提供了 文本 项目的 列表供 用户选 择,可 以单 选也可 以多选 。列表 框是
CListBox 类的;组合框可以看成是编辑框和列表框的组合,它提供了列表框,允许用户从 中选择项目;也提供了编辑框,允许用户直接输入,它是 CCombobox 类的。 这两个控件发送的都是通知消息(WM_NOTIFY)。当列表框中发生了某个动作,比如双击 了列表框中某项时,列表框就会向其父窗口发送一条通知消息;而在组合框的通知消息中, 有的是列表框发出的,有的是编辑框发出的。 13.在例[Ex_CommCtrls]的 CListBoxDlg 对话框中,如果使登记的成绩是 4 门课程,则对 话框中的控件应如何添加?代码应如何修改? 14.什么是滚动条、进展条、滑动条和旋转按钮控件? ⑴滚动条:是 CSrollBar 类的控件,它有一个独立的窗口,两端有两个箭头按钮,中间有一 个可移动的滚动块 ,具有直接的输入焦点,分为垂直滚动条和水平滚动条两种类型。 ⑵进展条:用于说明一个操作的进度,在操作过程中不断地从左到右填充进展条,可以让用 户看到还有多少任务要完成。 ⑶滑动条:由滑动块和可选的刻度线组成的,它是 CSliderCtrl 类的。 ⑷旋转按钮控件:是 CSpinButtonCtrl 类的,由一对箭头按钮组成,它通常与一个相伴的控 件一起使用。 15.什么是旋转按钮的“伙伴”控件?如何设置? 与旋转按钮控件一起使用的控件称为“伙伴(buddy)控件”,单击旋转按钮控件的箭头 按钮,可以增大或减小其伙伴控件中某个值。 伙伴(buddy)控件的设置有两种方法: ①SetBuddy:设置旋转控件的伙伴窗口。 ②在对话框中用 Ctrl+D 进行设置 16.在 MFC 中,通用对话框有哪些?如何在程序中使用它们? Windows 提供了一组标准用户界面对话框,它们都有相应的 MFC 库中的类来支持,所有 这些通用对话框类都是从一个公共的基类 CCommonDialog 派生而来的。 MFC 的涌用对话框 17.如果消息对话框只有“是”和“否”两个按钮,则如何设置 MessageBox 函数的参数? 答:可以将 MessageBox 函数中的参数 nType设置为 MB_YESNO。 第 5 章 菜单、工具栏和状态栏
1.菜单有哪些常见的规则? P221 为了使 Windows 程序更容易操作,菜单的显示都遵循下列一些规则: ⑴若单击某菜单项后,将弹出一个对话框,那么在该菜单项文本后有“…”。 ⑵若某项菜单有子菜单,那么在该菜单项文本后有 ⑶若菜单项需要助记符,则用括号将带下画线的字母括起来。助记符与 Alt 构成一个组合键, 当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中。 ⑷若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。 。 2.什么是助记符?它是如何在菜单中定义的? 菜单项的助记符是用括号和带下画线的字母括起来的符号,助记符与 Alt 构成一个组合键。 P221 3.菜单项的消息有哪些? 菜单项产生的消息有:COMMAND 消息和 UPDATE_COMMAND_UI 消息。 4.若对同一个菜单用 Class Wizard 分别在视图类和主框架窗口类 CMainFrame 都处理其 COMMAND 消息,并在它们的函数中添加相同的代码,则当用户选择该菜单后,会有什么 样的结果?为什么? 命令消息处理的优先级别为:命令→视图类→文档类→文档模板类→框架窗口类→应 用程序类。因此,视图类的消息处理函数会执行,而 5.什么是键盘快捷键?它是如何定义的? 键盘快捷键也称为加速键,加速键一般是几个按键的组合,用于激活特定的命令。 用 Ctrl+R 进入资源编辑器,选择 Accelerator 的资源项,双击 IDR_MAINFRAME,进 行加速键资源的添加。 6.什么是快捷菜单?用程序实现一般需要哪些步骤? 快捷菜单也称为浮动式弹出菜单,即按下鼠标右键时,就会相应地弹出一个菜单。 用 CMenu::TrackPopupMenu 和资源编辑器可以创建这样的菜单。具体操作步骤如下: ①用 Ctrl+R 进入资源编辑器,新建一个菜单资源; ②在视图类或其他接收鼠标右键单击的窗口类中添加 WM_CONTEXTMENU 消息控制函 数;编辑代码如下: //菜单项目是属于 CMenu 类的 //加载菜单资源 CMenu menu; menu.LoadMenu(IDR_MENU1); menu.GetSubMenu(0)->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); 7.如何使一个工具按钮和某菜单项命令相结合? 将工具栏上按钮的 ID 设置成和菜单项 ID 一样即可。 8.状态栏的作用是什么?状态栏的窗格分为几类?如何添加和减少相应的窗格? ⑴状态栏是一条位于应用程序的主窗口底部的水平条,可以分割成几个窗格,用来显示应用 程序的当前状态信息或提示信息。 ⑵状态栏窗格分为“信息行窗格”和“指示器窗口”。
分享到:
收藏