C 結構體初始化

2021-05-07 13:54:47 字數 1173 閱讀 9128

今天在看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 tagpoint *,

說明書point內部成員沒有被初始化。

對於(2),debug下可以看到:  p 0x003ca130 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 _test *

居然都沒有將m_a初始化。

這與我前面所說的自相矛盾啊。

為什麼加入類之後不將內建型別進行初始化呢???

無解了...

請高人解答一下。

c 結構體初始化

在 系統程式設計師成長計畫 看到的,好像有點道理。宣告 struct s 習慣的初始化 struct s h 這種初始化是按結構體成員宣告的順序進行初始化的,即利用了struct記憶體布局的方法。若struct成員順序被修改了,初始化將引入隱患。幸運的話會收到編譯器的warning或error,否則...

C 結構體初始化

結構體初始化的三種方式 方式1using namespace std struct student int main void printf kyrie的名字 s 手機號 s 年齡 d n kyrie.name,kyrie.phone.c str kyrie.age return0 方式2 有的編譯...

結構體初始化 指定初始化

參考 c99支援結構的指定初始化專案,其語法與陣列的指定初始化專案近似。只是,結構的指定初始化專案使用點運算子和成員名 而不是方括號和索引值 來標識具體的元素。例如,只初始化book結構的成員value,可以這樣做 struct book surprise 可以按照任意的順序使用指定初始化專案 st...