Re: [問題] copy constructor的問題

看板C_and_CPP (C/C++)作者 (CA)時間16年前 (2009/03/16 22:59), 編輯推噓3(301)
留言4則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《tstanly ()》之銘言: : 有點搞不太懂copy construtor的用途 : 我知道的大概是 : 物件傳給函數時 會複製一個物件 : 而有可能因為改變此復製物件(ex:delete)時 而改變了原本物件 : 應該是降對吧...? 主要是為了防止非預期的 shallow copy 實現正確的copy語意 預知詳情請google : 以下是一個範例 : 上面程式碼沒有使用copy constructor : 而下面程式碼有 : 不懂的是為什麼第一個程式碼印出 : 1 2 : 0 4072544 : 而加了copy constructor可以解決此問題 因為你著了 shallow copy 的道 : int getval(myclass o) : { : return *o.p; : } 注意這裡是 call by value 會呼叫 copy ctor : int main(int argc, char *argv[]) : { : myclass a(1),b(2); : cout<<getval(a)<<" "<<getval(b); 這裡b傳進getval建立了一個複本,假設叫bb 預設複製行為是bb.p = b.p return之後bb被回收,發動dtor bb.p被delete,同時意味著b.p指向的空間被delete : cout<<"\n"; : cout<<getval(a)<<" "<<getval(b); 所以這裡的getval會拿到爛掉的指標 : system("pause"); : return 0; : } : output: : 1 2 : 0 4072544 : //copy construtor : myclass::myclass(const myclass &o) : { : p=new int; : if(!p){ : cout<<"allocation error\n"; : exit(1); : } : *p=*o.p; : } 注意這裡要做證同測試 另外operator =也要同時overload 否則還是有機會出錯 -- 自High筆記(半荒廢) http://legnaleurc.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.127.21.174 ※ 編輯: legnaleurc 來自: 59.127.21.174 (03/16 23:00)

03/16 23:05, , 1F
謝謝!
03/16 23:05, 1F

03/16 23:16, , 2F
sorry,只有operator =才要證同測試 =.= 我錯了
03/16 23:16, 2F

03/16 23:29, , 3F
四天王 預設建構子 拷貝建構子 拷貝運算子 解構子
03/16 23:29, 3F

03/16 23:31, , 4F
當 data members 裡有 pointer 時就是要很小心... 囧
03/16 23:31, 4F
文章代碼(AID): #19lcbBy- (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19lcbBy- (C_and_CPP)