今天在看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...