MFC程序执行流程小结 [大三TJB_708]
寒假来了,要开始涉及MFC程序了(2013-01-12),没有看过一天关于C++的书籍。我比较有勇气(当然是在有老师指导的情形下,老师常给予关键性的启发),直接打开VS2010寻找创建VS MFC程序项目的步骤,在知道用VS 创建MFC程序步骤后(其实这个非常简单,很多都是默认选项),赤裸裸的开始研究MFC的代码结构。对于一个对MFC毫无概念的初学者来说,首先我给自己规定的是先学会怎么在MFC框架中成功的写入自己的代码。第一眼瞧见MFC程序的时候,对于每个类都独占一个头文件和源文件的现象倒是不奇怪:至少学过几天C语言,也用C语言在黑莓平台上面开发过一个小小小小的游戏;但扔令我奇怪的是:
- MFC程序运行时的入口在哪里?
- MFC中每个函数(后来才知道那是函数)怎么都那么奇怪,前面还有两个冒号?
- MFC程序是怎么响应用户的各种消息的呢?
- 那如何在MFC中添置代码?
2.1new
new和malloc函数都可以为变量申请一段某种类型的动态存储空间,new在申请动态空间外还会引发申请空间对象构造函数的运行。当然,有new就需要在需要的地方有delete,这是一种必备的习惯。2.2虚拟函数的调用
使用派生类对象访问类的成员函数时,若此函数为非虚拟函数时,访问的函数都是基类成员函数的地址;若访问的成员函数为虚拟函数(前面加了virtual关键字)时,若在派生类中没有申明(修改)则调用的是基类(或者某派生类(当此派生类改变了此虚拟函数时))中的函数地址,若在派生类修改了虚拟函数,则调用的就是派生类的成员函数。2.3构造函数和析构函数的调用次序
构造函数和析构函数的调用次序从一定程度上反应出MFC程序执行流程。建构式(运行应用程序类的对象的构造函数)是早于程序运行入口点的,即应用程序类对象的构造函数的运行要比AfxWinMain函数的运行要早。当然,析构函数是在相应情况下(delete发生、局部运行完毕、程序运行结束时)发生。而且构造函数的运行遵循一定的方式(构造函数析构函数调用次序),析构函数的运行与构造函数的运行相反。2.4类指標相关结论
如果以一个基础类别之指标指向衍生类别之物件,那么该指标只能呼叫基础类所定义的函式。如果一个衍生类指标指向一个基础类别物件,必须先做明确的转型动作(对基础类之物件取地址&对派生类指标赋值)。这种做法很危险。如果基础类别和衍生类别都定义了相同名之成员函式,那么透过物件指标呼叫成员函式时,到底呼叫到哪一个函式,必须视该指标原始性别而定,而不是视指标实际所指之物件的性别而定。
3 简析MFC程序执行流程
撇开所有的头文件中对类声明、派生的代码,我们到应用程序类源代码文件(CMy*.cpp)定义应用程序类对象的地方,见图1
图1.《深入浅出 MFC》一书中的MFC程序执行流程分析图 MFC程序执行流程跟标号增大的方向一致:
- 当定义应用程序类对象时,在程序进入AfxWinMain()函数前,应用程序类对象的构造函数先运行,构造应用程序类对象。
- 进入程序运行的入口点AfxWinMain()函数中,AfxGetApp()函数返回指向当前应用程序的单一的CWinApp对象的指针。根据类指標相关结论可知,除了被修改的虚拟函式外,用指针pApp访问的函数都是访问的CWinApp中的成员函式。所以用pApp->InitApplication() [及Run] 调用的函式为CWindApp::InitApplication() [及CWindApp::Run()] ;因为InitIntance()函数被改变,因此而pApp->InitIntance()调用的却是派生类中(假设为CMyWindApp)的函式(CMyWindApp::InitIntance()),而且InitIntance()函数内的内容会被自动执行,一般这里的代码为跟生成窗口有关。
- 这里是关于初始化的函数,作为初学者,这里可以先跳过。容日后究。
- 这就是在调用派生类CMyWindApp的成员函数,虽然这个调用的语句我们看不到。这里涉及虚拟函数妙用的内容哦,派生类中被修改的虚拟函数将会被调用。
- (5-8语句)这是在对虚拟函数InitIntance()进行改写,在改写的过程中很可能依据函数的调用方式(虚拟函数,非虚拟函数的调用方式)再调用其它的函数。其实函数的调用占MFC应用程序执行流程的很大一部分,对于函数的调用,这里添加了一些规则,如此就构成了整个的运行。
- (9语句)pApp->Run()就是检测是否有消息发生的主消息循环事件函数,当有任何规定的事件发生它都会检测到,并通过一定方式调用到相应的函数,具体内容可以后深究。
- 基础。包括与新学知识相关的基础(如学C++前C语言还学得不错)和学习素养(首先是能静下心来看书,其次是能获取书中所描述的重点)的基础。
- 毅力。吃苦耐劳,坚持不懈怠。但也要讲究一定的方法,如常说的一个问题要是20分钟后都还没有丝毫解决那就去散散步吧,但散步这个小插曲丝毫不要影响对继续探究问题 的不离不弃的精神。
- 心态。不要太着急。不要太功利,脚踏实地(这不与快速冲突)掌握好每一个关键。
此次笔记记录完毕。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇: [MFC] HWND(获取控件或窗体句柄) [大三TJB_708]