今天在看MFC结构时,顺便看了看《深入浅出MFC》,发现有这么一行代码:
m_pMainWnd = new CMyFrameWnd;
乍一看,很正常啊,再仔细一看,貌似 new CMyFrameWnd 的时候少了一对括号。奇怪!之后又翻了翻书,发现好多处都是这样的。
难道我弄错了,不可能啊,一般情况下在new一个新类的时候都会加上括号,里面放一些初始值。
测试一下:
win32中POINT结构体定义如下:
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
调用方式:
(1)POINT* p = new POINT;
(2)POINT* p = new POINT();
对于(1),debug下可以看到: p 0x003ca130 {x=0xcdcdcdcd y=0xcdcdcdcd} tagPOINT *,
说明书POINT内部成员没有被初始化。
对于(2),debug下可以看到: p 0x003ca130 {x=0x00000000 y=0x00000000} tagPOINT *
说明书POINT内部成员被初始化了。
于是,我便有了一个简单的结论:当使用(1)时,编译器认为该代码是纯C的代码,所以不为调用该代码的默认构造函数,这样也就不会初始化,因为C没有构造函数这一说,所以也没有见到有人在C里面写成第二种代码样式。当使用(2)时,编译器认为该代码是纯C++的代码,因为C++有类的概念,所以会自动调用结构体的默认构造函数,将成员初始化。貌似正确!
再进行测试:
在MFC中定义一个TEST结构体
typedef struct _Test
{
int m_a;
CString m_str;
} TEST, *PTEST;
(1)TEST* p = new TEST;
(2)TEST* p = new TEST();
结果令我大失所望,(1)和(2)的结果:
p 0x003adce0 {m_a=0xcdcdcdcd m_str="" } _Test *
居然都没有将m_a初始化。
这与我前面所说的自相矛盾啊。
为什么加入类之后不将内置类型进行初始化呢???
无解了...
请高人解答一下。