谈static在MFC中的运用

旧梦重温7ak

旧梦重温7ak

2016-02-19 17:41

下面图老师小编要跟大家分享谈static在MFC中的运用,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

  学习《深入浅出MFC》有一段时间了,有一些想法就记了下来,希望与大家共勉

  我们知道,C++中的static数据成员表示基于该类创建的所有对象共享该static数据成员的一份拷贝。基于这个原则,可以实现多种技术,比如说为某类创建一个计数器,用来记录任意时刻共创建了多少个此类的对象。

  

class test{
public:
 test(){count++;}
 static int count;
};
test::count=0;
void main(){
couttest::count;
test t1;
couttest::count;
test t2,t3;
couttest::count;
}

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  虽然用全局变量也可达到目的,但是会带来名字污染及其他一些问题,其中一些会牵涉到面向对象的观念。

  在MFC中,static更是得到了广泛的运用。侯捷在著作《深入浅出MFC》中剖析MFC的原理和和各种技术如动态创建、运行时类型识别、消息映射、命令传递等,均和static密不可分。下面以其中之一的消息映射为例来讨论static的运用

  关于static,一个重要的观念就是:static成员变量并不是因为对象的实现才得以实现,它本来就存在,你可以想象它是一个全局变量。(见《深入浅出MFC》P71页)。所以,我们来看DECLARE_MESSAGE_MAP这个宏定义:

  

#define DECLARE_MESSAGE_MAP()
static AFX_MSGMAP_ENTRY _messageEntries[];
static AFX_MSGMAP messageMap;
virtual AFX_MSGMAP *GetMessageMap() const;

  如果我们定义一个派生自类CFrameWnd的类CMyWnd并在其中用上了DECLARE_MESSAGE_MAP宏

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  

//在MyApp.h头文件中
class CMyWnd:public CFrameWnd{
public:

DECLARE_MESSAGE_MAP();

};

  实则为该类声明了两个static数据成员(以及一个虚拟函数),接着下来的BEGIN_MESSAGE_MAP宏

  

//在MyApp.cpp文件中
BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()

  实则是定义了CMyWnd::messageMap和CMyWnd::_messageEntries这两个变量并给予它们适当的初值。此时,尽管还没有产生出一个CMyWnd对象,这两个变量也得以存在。实际上,在进入AfxWinMain函数(由MFC提供)之前,不光是这两个变量存在,其它的与MFC的一些重要的类所相关的一些变量,如CWinApp::messageMap和

  CWinApp::messageEntries、CWnd::messageMap和CWnd::messageEntries等均已存在,它们构成了一张消息传递网,为以后的消息在类之间流动提供了一个重要的基础。当然,这会占用一部分内存。

展开更多 50%)
分享

猜你喜欢

谈static在MFC中的运用

编程语言 网络编程
谈static在MFC中的运用

在MFC中应用CTreeCtrl控件的技巧

C语言教程 C语言函数
在MFC中应用CTreeCtrl控件的技巧

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在非MFC程序中引用CString

C语言教程 C语言函数
在非MFC程序中引用CString

色彩在摄影中的运用

摄影
色彩在摄影中的运用

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

在MFC程序中添加全屏显示功能

C语言教程 C语言函数
在MFC程序中添加全屏显示功能

各种元件在PPT中的运用

电脑入门
各种元件在PPT中的运用

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

一件千回百转事 - QQ图案分组

一件千回百转事 - QQ图案分组

C++的底层机制

C++的底层机制
下拉加载更多内容 ↓