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++类对象,句柄,等)?
比如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++类对象,句柄,等)?
解决方案 »
- 关于vs2010程序打包的问题
- 请问在用GDI+输出字符串的时候让中英文使用不同的字体
- 在这里能注册的DLL,换一个环境不能注册的情况。
- 请问如何给我的主对话框OnInitDialog()里面create和destroy一个新的对话框呢??
- 讨论:非技术区该放置哪类精华贴?
- 链接时候的三个错误,怎么办
- 【新手】关于c++主函数传递值到自定义函数中
- 16位图像是怎样组成的
- vc中取硬盘序列号的源码,硬件API的使用。如何生成dll,如何在VC中把生成值存盘。
- 一个关于图形编辑的问题,望高手指点.
- 再Header Files文件夹下建立了一个文件夹drivers
- 请问按钮(Button)的响应函数应该放在哪里?
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函数,以产生窗口的属性特征。
调用它之后,内存中相关的分布是怎样的?
2 Call Create, which creates the IP Address Control.如果Create()函数不创造对象,那以上MSDN中对IP地址控件的说明又如何解释?
1 Call the constructor, which creates the CIPAddressCtrl object.
2 Call Create, which creates the IP Address Control.
--------一般来说,将对象的创建分为两个阶段,是基于如下的考虑:
构造时如果出现失败,无法将错误返回给调用者,因为构造函数不能有返回值。所以,在构造时只是简单的申请内存,以及简单的初始化处理,完整的对象构造要通过第二步(通常是create方法)来完成。如果create()方法发生失败,可以通过返回值的方式告诉调用者。我记得这个说法是msdn里有个地方说过的。呵呵,具体在哪里我忘了。