Posted on 2008-10-07 15:09
沒畫完的畫 閱讀(1488)
評論(5) 編輯 收藏 引用 所屬分類:
C++
摘自網上BLOG
原文URL:
http://www.cnblogs.com/chio/archive/2007/10/20/931043.html
http://blog.csdn.net/leatinfy/archive/2008/03/17/2192409.aspx
http://www.shnenglu.com/Leon916/archive/2008/10/06/63320.aspx
代碼:
我以為輸出會是 0 No, 在 winxp + vc 和 RedHat + G++ 環境下
輸出的值都為一個
未初始化的值
修改代碼如下
在 winxp + vc6 環境輸出如下:
this - 1245052
this - 1244960
-858993460
在 RedHat + G++ 環境下輸出如下:
this - 1073756940
this - 1073756972
134514604
this 指針的值居然不同,這樣意味著
CLS(0);
產生的是一個臨時對象,并非調用了 CLS() 函數?。。?!
CLS(0);
這一句其實有歧義(兩種意思)
1. 調用 CLS(int i) 函數
2. 產生一個臨時對象
編譯器選擇了后者
如果想調用回 CLS(int i) ,莫非沒辦法?
聰明的網友們居然想到用 new ~~~~
new (this)CLS(0);
new 會做兩件事
1. 分配內存
2. 調用構造函數
加上了 this
inline void *__cdecl operator new(size_t, void *_P)
{
return (_P);
}
告訴 new “您在指定的內存(this)上分配對象吧”
我總覺得這種為取巧方法
以上的問題,寫成一個帶有默認值的構造函數就行了, Simple~ Make it Simple~
CLS::CLS(int i = 0)
{
}
在應用中應當避免 構造函數里 調用 另一個構造函數 的情況