MFC中很多类中大多数都包含构造函数与Creat()函数,但是它们都会创建C++类对象,
比如MSDN中:You construct a CIPAddressCtrl object in two steps. 1 Call the constructor, which creates the CIPAddressCtrl object. 
2 Call Create, which creates the IP Address Control.想问一下  
构造函数与Creat()函数的区别?
还有一个windows资源,比如一个窗口(CWnd对象),
在内存中所有相关此资源的分布(包括C++类对象,句柄,等)?

解决方案 »

  1.   

    C++类对象在调用非静态create函数之前已经创建了
      

  2.   

    构造函数与Creat()函数没有联系
      

  3.   

    跟踪MFC的源码可以发现,二者并没有必然的联系,其中CREATE相当于我们在SDK程序设计中的注册窗口类,和封装指定窗口的特点给封装起来了,构造函数举个例而言如CButton,我们在一个对话框工程中指定一个CButton myButton,在该处设置断点,跟踪一下,可以发现如下代码:
    1:_AFXWIN_INLINE CButton::CButton()
    { }这说明调用的是无参的构造函数,继续跟踪可发现
    2:CWnd::CWnd()
    {
    AFX_ZERO_INIT_OBJECT(CCmdTarget);
    }因为CButton是从CWnd派生而来,因此首先调用其构造函数很正常,断进其中的AFX_ZERO_INIT_OBJECT(CCmdTarget);继续跟踪,可以发现因为参数里用到了CCmdTarget,所以会首先调用其构造函数,在CCmdTarget的构造函数中可以发现调用如下代码:
    3:
    CCmdTarget::CCmdTarget()
    {
    // capture module state where object was constructed
    #ifdef _AFXDLL
    m_pModuleState = AfxGetModuleState();
    ASSERT(m_pModuleState != NULL);
    #endif // initialize state
    #ifndef _AFX_NO_OLE_SUPPORT
    m_dwRef = 1;
    m_pOuterUnknown = NULL;
    m_xInnerUnknown = 0;
    m_xDispatch.m_vtbl = 0;
    m_bResultExpected = TRUE;
    m_xConnPtContainer.m_vtbl = 0;
    #endif
    }
    到此没有必要往下跟踪了,我们可以发现只是做了一些值的初始化而己,并没用产生窗口的特征,因此必须调用Create函数,以产生窗口的属性特征。
      

  4.   

    在C++里面,每一个Class都会有一个或者多个构造函数,Create只是一个成员函数,需要的时候才调
      

  5.   

    一般调用Create时, MFC是调用的CreateWindow(Ex) API, 从而m_hwnd得到相应返回的句柄,
      

  6.   

    谢谢大家的回复,能否就Creat()函数的调用过程说明一下,还有它会不会产生C++类对象?
    调用它之后,内存中相关的分布是怎样的?
      

  7.   

    You construct a CIPAddressCtrl object in two steps. 1 Call the constructor, which creates the CIPAddressCtrl object. 
    2 Call Create, which creates the IP Address Control.如果Create()函数不创造对象,那以上MSDN中对IP地址控件的说明又如何解释?
      

  8.   

    不好意思,单词看错了,把“steps”看成“ways”了,谢谢大家的参与阿!
      

  9.   

    You construct a CIPAddressCtrl object in two steps. 
    1 Call the constructor, which creates the CIPAddressCtrl object. 
    2 Call Create, which creates the IP Address Control.
    --------一般来说,将对象的创建分为两个阶段,是基于如下的考虑:
    构造时如果出现失败,无法将错误返回给调用者,因为构造函数不能有返回值。所以,在构造时只是简单的申请内存,以及简单的初始化处理,完整的对象构造要通过第二步(通常是create方法)来完成。如果create()方法发生失败,可以通过返回值的方式告诉调用者。我记得这个说法是msdn里有个地方说过的。呵呵,具体在哪里我忘了。
      

  10.   

    你也可以自己跟踪一下MFC源码,自己试着看一下,授人以鱼,不如授人以渔。