现在的位置: 首页 > 综合 > 正文

C++结构体初始化

2012年07月24日 ⁄ 综合 ⁄ 共 913字 ⁄ 字号 评论关闭

 今天在看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初始化。

这与我前面所说的自相矛盾啊。

为什么加入类之后不将内置类型进行初始化呢???

无解了...

 

请高人解答一下。

 

 

 

抱歉!评论已关闭.