看板 C_and_CPP 關於我們 聯絡資訊
我上一篇推文搞錯了 真是抱歉 弄清楚來回答原PO orz ※ 引述《jay060191 (小J)》之銘言: : #include <iostream> : using std::cerr; : using std::endl; : class X { : public: : X() { cerr << "X()" << endl; } : ~X() { cerr << "~X()" << endl; } : }; : class Y { : public: : Y() { cerr << "Y()" << endl; } : ~Y() { cerr << "~Y()" << endl; } : }; : int main(){ : X a; : Y b(); 我搞混的地方是這裡 函數分成宣告跟定義 Y b(); //這是函數宣告 Y b(){ ... } //有寫實作內容的叫做定義 main裡頭不能有函數定義,但是可以有函數宣告式。 所以這兒compiler把這行 Y b(); 當成一個名字叫做b() 回傳值是Y的function宣告 所以呼叫沒有參數的建構函數 要這樣寫 Y b; //不能加括號 這樣寫就出問題了 Y b(); 吊詭的是如果建構子有參數 Y b(5); Y b("par"); 這樣就會觸發正確的建構函數 因為compiler可以正確判斷這不是函數宣告,不會混淆。 我這樣理解應該沒錯吧orz : } : 以main內的程式來講 : 我知道宣告class時會呼叫建構子,刪除後會呼叫解構子 : 但是實際上跑以上程式的結果 : X會呼叫建構子與解構子沒錯 : 但是Y卻不會 : 這是為什麼? : 然後Y b();是什麼意思? : 謝謝 -- Mat's Blog - UVa Problems I Soved http://chchwy.blogspot.com/p/my-solved-acm-problems-list.html -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.45.103.203 ※ 編輯: chchwy 來自: 114.45.103.203 (01/10 23:20)
jay060191:謝謝c大..我懂了XD 01/11 00:43
awashharp:哦哦XD 所以建立區域變數時就直接呼叫了Default建構式囉 01/11 02:29