作者chchwy (mat)
看板C_and_CPP
標題Re: [問題] 關於建構子/解構子的呼叫
時間Mon Jan 10 23:15:01 2011
我上一篇推文搞錯了 真是抱歉
弄清楚來回答原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