[問題] 複製建構子避免 assign 給自己

看板C_and_CPP (C/C++)作者 (夜夜叉)時間11年前 (2014/06/21 09:04), 11年前編輯推噓4(4014)
留言18則, 6人參與, 最新討論串1/1
最近看到了一段程式碼片段,如下: CForeign::CForeign(const CForeign& Foreign) { if (this != &Foreign) // 請問這裡是否恆成立呢? { ... } } 我自己是覺得那個if沒必要,因為一定會成立。 不過,其他三個人都認為那個if是會有不成立的可能性存在的。 我請他們提示我有什麼情況下是不成立的呢? 他們只說了 new 的情況下或許有可能。 但是他們暫時還想不出不成立情形的程式碼就是了。 所以,想請教大家的看法。謝謝唷! 註: 無特別的 operator overloading ※ 編輯: yayax (220.129.233.62), 06/21/2014 09:07:59

06/21 09:55, , 1F
自己assign自己就不成立了呀
06/21 09:55, 1F

06/21 10:02, , 2F
placement new
06/21 10:02, 2F

06/21 10:02, , 3F
to 1樓: 這是建構子
06/21 10:02, 3F

06/21 10:20, , 4F
sorry沒看清楚
06/21 10:20, 4F
感謝兩位回覆,我平常還真的完全沒用到 placement new,實際測試也真的不成立了。 學習了,謝謝。 想再請問一下~ 既然這樣,那平常複製建構子是否都應該加上 if (this != &Foreign) 呢? ※ 編輯: yayax (220.129.233.62), 06/21/2014 12:58:21

06/21 13:20, , 5F
建構歸建構, 跟assign一點關係也沒有, 根本不需要check
06/21 13:20, 5F

06/21 13:25, , 6F
物件正在建構表示物件還不存在, 所以Foreign不可能是self
06/21 13:25, 6F

06/21 13:45, , 7F
至少我知道 copy assignment 裡可以先拿參數去建構 lo
06/21 13:45, 7F

06/21 13:45, , 8F
cal 物件,再用 this->swap(local) 得到資源來免去檢
06/21 13:45, 8F

06/21 13:45, , 9F
查,建構子的部分就看你 doc 怎麼寫囉,只要讓使用者
06/21 13:45, 9F

06/21 13:45, , 10F
不亂用就好。
06/21 13:45, 10F

06/21 18:24, , 11F
感謝~ 我更確定自己的理解了
06/21 18:24, 11F

06/21 21:22, , 12F
學到新東西了
06/21 21:22, 12F

06/22 00:48, , 13F
若placement new這if 又不成立,邏輯上會錯吧?兩instance sa
06/22 00:48, 13F

06/22 00:48, , 14F
same this ptr?
06/22 00:48, 14F

06/22 01:58, , 15F
邏輯上?參數是 reference 而不是另一個物件,所以參
06/22 01:58, 15F

06/22 01:58, , 16F
考回 this 我覺得蠻合理的。你可以當它存在,而且狀態
06/22 01:58, 16F

06/22 01:58, , 17F
不變,即使它其實未初始化過。只是這種情況下就看原po
06/22 01:58, 17F

06/22 01:58, , 18F
怎麼定義 copy ctor 完成之後 this 的狀態了。
06/22 01:58, 18F
回QQ29: placement new 是可以刻意寫得讓他不成立,而不是一定會不成立唷! 基本上寫程式的人不會故意這樣寫啦! 附上 sample code class CForeign { public: CForeign(); CForeign(const CForeign& Foreign); }; CForeign::CForeign() {} CForeign::CForeign(const CForeign& Foreign) { if (this != &Foreign) { int i = 0; } } int main() { CForeign* Foreign_A = new CForeign; CForeign* Foreign_B = new (Foreign_A)CForeign(*Foreign_A); return 0; } ※ 編輯: yayax (220.129.233.62), 06/22/2014 12:06:11
文章代碼(AID): #1JfDeS3E (C_and_CPP)
文章代碼(AID): #1JfDeS3E (C_and_CPP)