VC++常见问题(2)

来源:互联网 发布:mysql行转列 编辑:程序博客网 时间:2024/06/07 06:06

1afx_msg 

afx_msg

 

例:在CDrawView类响应鼠标左键按下消息--->

在头文件(DrawView.h)中声明消息响应函数原型。

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

说明:

afx_msg宏表示声明的是一个消息响应函数。

 

先按照以上所示声明消息映射函数, 

然后在DrawView.h对应的DrawView.cpp中的BEGIN_MESSAGE_MAP()里面用WINDOWS消息把控件和它对应的相应函数联系起来 ,如下:

 

// ID_APP_EXIT 是控件的ID

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

 ON_COMMAND(ID_APP_EXIT, &OnLButtonDown)

END_MESSAGE_MAP()

 

ON_COMMAND:

mfc中的消息映射中,有这样几种:ON_COMMAND(id号,函数)on_wm_lbuttondonw().....

 

含义:

ON_COMMAND(id号,函数)

是将菜单,或工具栏命令映射到指定的函数上

ON_WM_LBUTTONDOWN

是映射WM_LBUTTONDOWN (鼠标左键按下) 到成员函数

OnLButtonDown(

UINT nFlags,

CPoint point

);

 

2只有静态常量整型数据成员才可以在类中初始化

class test
{
int a; //
普通变量,不能在类中初始化

static int b; //
静态变量,不能在类中初始化
static const int c=2; //
静态常量,可以在类中初始化
} ;

b
可以在类外进行初始化,且所有对象共享一个b的值:
int test::b = 2;

static
int型要写在外面。double的可以写在里面,effective C++里面有讲到的,不过可能旧的编译器不支持也有可能。

 

3、类初始化

类的初始化大致上有这么几个方面。

 

a.静态变量的初始化 b.一般实例变量的初始化 c.构造函数的初始化

 

  初始化的难点在于继承体系中。当有继承体系时,初始化始终要遵循的原则就是,无论如何必先初始化基类

 

   0.当载入当前类时,若当前类有继承体系,则依次无条件载入基类

 

   0.先从最顶的基类开始顺序初始化其静态static变量,接着初始化当前类的静态static变量(也就是说,static变量的初始化是伴随着类被装载时而初始化的,它的初始化在任何构造函数执行前)

 

   1.先从最顶端基类,构造基类对象。

 

     (假如构造函数中有thissuper调用,则先执行此调用)

 

     1.1.首先按出现次序初始化其实例变量

 

       1.2.再执行其构造函数体

 

   2.依次递归上述步骤

 

  <此外,实例变量可以不显式初始化(系统会赋默认值),但是局部变量必须显式初始化

 

4、C++友元C++友元C++友元

通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。   友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但矛盾的是,即使是最大限度的保护,同样也破坏了类的封装特性,

 

原创粉丝点击