◆ 重载操作符的定义
◆ 返回值类型 operator op (参数表);
◆ 其中,op为重载操作符,它必须是VC++中所定义的运算符。然后象定义函数一样定义重载操作符函数。
例子:
Class person {
int age; void operator ++(); }
Void person::operator++() { age++; }
5. 虚拟函数与多态性
多态性是面向对象程序设计的精髓之所在,也是C++中最难理解和掌握的部分。在C++
中,多态性是建立在虚拟函数基础上的,虚拟函数的使用使类的成员函数表现出多态性。 5.1虚拟函数
1)函数的定义:在定义类时在其成员函数前加上关键字virtual;
2)如果基类中成员函数定义为虚函数,则派生类中与其定义完全相同的成员函数,编译器自动将其视为虚函数;
3)有类的成员函数才能定义为虚函数。
例:
class Insect { ??
virtual bool CanFly(); ?? }
bool Insect :: CanFly() {
return FALSE; }
class Butterfly:public insect { ??
Bool CanFly(); ??
}
bool Butterfly :: CanFly() {
return TRUE;
}
5.2 虚函数的调用
1)根据对象的不同而去调用不同类的虚拟函数 2)可以使用基类对象调用派生类对象,即将派生类对象或指针赋值该基类对象或指针。 3)反方向的赋值(将基类的对象或指针赋给派生类的对象或指针)是危险的。
例: bool
rtn;
Insect inc1,*pInc; Butterfly btfly; pInc = &inc1;
rtn = pInc->CanFly(); pInc = &btfly;
rtn = pInc->CanFly(); 5.3 虚拟函数与重载函数的区别
1)形式上,重载函数要求有相同的返回值类型和函数名,并有不同的参数序列;而虚拟函数要求三者完全相同。
2)重载函数可以是成员函数或非成员函数;而虚拟函数必须是成员函数。
3)调用方法上,重载函数根据所传递的参数序列的差别作为调用的依据;而虚拟函数则根据调用对象的不同而去调用不同类的函数。
4)虚拟函数在运行时表现出多态功能;而重载函数不具有这一功能。
5.4 虚拟函数的数据封装
虚拟成员函数的存取要看首次定义它的类中,该函数是public or private。 [纯虚函数]
定义:virtual type funcname(parameter)=0;
C++中有时设计基类就是为了被继承,而基类中的虚拟函数不做任何工作,这种情况下可以将基类中的虚拟函数定义为纯虚函数。包含纯需函数的类叫抽象类。抽象类不能定义对象,但可以定义一指向它的指针。 5.5虚拟基类
虚拟基类的定义,及解决的问题 例:
class B : virtual public A; class C : virtual public A;
class D : public B, public C; 5.6 虚拟基类的构造函数调用
在含虚拟基类的多层继承关系中,虚拟基类的构造函数调用由最远的派生类负责。
6. 内存管理
6.1 指针
1)采用安全的编程风格,对指针进行初始化。
2)NEW(调用构造函数)和 DELETE(会调用析构函数)
3)每次使用关键字NEW申请分配内存时,必须检查并确认返回的指针不为空。 [堆中] 4)当使用DELETE删除一个指针时,实际上是释放它所指向的内存空间。这相当于把此指针指向的内存空间交还给自由存储区。而这个指针本身还存在,可以再次对它赋值。
[注意]:当对一个指针使用DELETE时,它所指向的内存被释放。如果再次对它使用DELETE,有可能使程序崩溃。所以,当用DELETE删除一个指针后,应把它置为0(空指针)。而删除一个空指针是安全的。
6.2 内存泄露的原因
1)调用new操作符在堆上分配了一段内存,而没有调用delete操作符删除它;
2)改变了保存在一个变量中的指针的值,因而没能删除指针所指向的内存区;
3)带有指针类型成员变量的类,当new操作符分配了该指针,没有复制构造函数、赋 值运///////???
例: class A {
public: int *pi; } A::A() {
pi = new int(); *pi = 3; }
A first; A second; second = first;
6.3 栈和自由存储区(堆)
通常程序员要管理内存中以下五个区域 1)全局变量区
2)自由存储区 3)寄存器
4)代码区 5)栈
其中局部变量和函数形参位于栈中,代码位于代码区,全局变量在全局变量区,而寄存器被用于进行一些内部处理,如保存栈顶指针和指令指针等。所有剩余的内存空间都被作为自由存储区, 有时也被称为堆
算
符
或
析
构
函
数
。
第二讲 编程工具VC
1.熟悉VC开发环境
1.1 VC向导提供的帮助;
以前Windows编程需要程序员编写大量的框架代码,这对初学者来说简直就是一个噩梦;并且这些框架代码基本相同,因此Microsoft提供了向导AppWizard帮助生成框架代码,这极大的方便了我们编写程序
1.2 VC向导可以生成的工程类型
ATL COM AppWizard Custom AppWizard Database Project
ISAPI Extension Wizard Makefile
MFC ActiveX ControWizard MFC AppWizard (DLL) MFC Database Wizard Win32 Application Win32 Console Application Win32 DLL
Win32 Static Library
1.3 如何获取帮助?
1.4建立第一个应用程序;
使用向导AppWizard生成典型的应用程序——基于多文档的可执行程序 1.5理解AppWizard代码
2.消息与命令
2.1 消息
◆ 消息是Windows编程不同于其它编程方式的地方,如DOS环境下编程。消息就是操作系统通知应用程序某事已发生的一种方式,如:用户已输入、已单击或移动鼠标、打印机已空暇等。
2.2 消息传递
◆ 尽管操作系统用整数来引用消息,但所有消息都通过它们的名字来引用。一个巨大的#define语句将消息名同数值联系起来。不同消息由操作系统或应用程序的不同部分处理。如,当用户在窗口上移动鼠标时,窗口得到一个WM_MOUSEMOVE消息,它几乎全部传送给操作系统去处理。
◆ MFC允许程序员忽略底层消息,并使得在单独类级别上声明每个类处理哪些消息更容易
2.3 消息循环
◆ 任何windows 程序的核心是消息循环,这通常包含 在WinMain() 例程中。 ◆ MFC 通过消息映射来保持消息处理函数与消息处理信息的一致。 2.4 消息映射
◆ 消息映射是进行windows 编程的一部分MFC 方法,用来代替编写向用户的WinProc() 发送消息的WinMain() 函数,及编写检查消息类型的WinProc() 函数。用户只需编写处理消息的函数,并且在用户的类中增加一个消息映射即可,其它一切由MFC 处理。 2.5 消息映射宏
◆ 在类声明的结尾部分,使用宏 DECLARE_MESSAGE_MAP来声明在类定义部分需要消息映射。在*.CPP文件中使用宏 BEGIN_MESSAGE_MAP和END_MESSAGE_MAP来声明消息映射,在两个宏之间声明消息的映射函数。 2.6 常用消息映射宏
◆ ON_COMMAND 用于将特定命令的处理委派给类的一个成员函数。
◆ ON_MESSAGE 用于将用户自定义消息的处理委派给类的一个成员函数。
2.7 ClassWizard帮助用户捕获消息
2.8 添加windows消息处理函数对话框 2.9 命令
◆ 命令是一种特殊的消息类型。用户在任何时候选择一个菜单项,单击一个按钮或告诉系统做什么,windows 都将产生一个命令。 ClassWizard可帮助用户捕获命令。
3.基本控件
[对话框与基本控件] 例子SDI
Windows常用控件 按钮控件 编辑框控件 复选框控件 列表框控件 进度条控件(Progress bar) 滑块控件 上下控件 图象列表(image list) 列表视图控件(list view) 树形控件(tree view) Rich Edit控件 CButton Cedit CCheck CListBox CProgressCtrl CSliderCtrl CSpinButtonCtrl CImageList CListCtrl CTreeCtrl CrichEditCtrl MFC对应的类 4.菜单、工具条、状态条
[菜单]
◆ 编辑菜单(ResourceView)
◆ 捕获消息(ClassWizard)
[工具条]
◆ 工具条改善用户界面,方便用户操作。 ◆ 编辑工具条按钮 ◆ 删除工具栏按钮
◆ 添加工具栏按钮 [状态条]
◆ 例子(SDI)
5.文档、视结构
[简介]
MFC的文档/视图结构把应用程序的数据从用户实际浏览和操纵数据的方法中分离开来。简单的说,文档对象负责存储、加载和保存数据,而视图对象允许用户在屏幕上查看数据,并用适合与应用程序的方法编辑数据。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库二次开发初级培训班培训讲义(2)在线全文阅读。
相关推荐: