看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《QQ29 (我愛阿蓉)》之銘言:
tinlans:做 exception safe 的時候才會用到。先用 copy ctor 造一 02/03 09:43
tinlans:個 temp,再 swap 進去。 02/03 09:43
QQ29:是 opt = ( A &rhs){A temp(rhs)? 再來怎麼swap呢@@} 02/03 12:57
class Foo { public: Foo(const Foo&); Foo& operator= (const Foo& rhs); void swap(Foo& f) throw (); private: Bar* my_data1; Baz* my_data2; }; Foo& Foo::operator=(const Foo& rhs) { Foo tmp(rhs); swap(tmp); } void Foo::swap(Foo& f) throw () { swap(my_data1, f.my_data1); swap(my_data2, f.my_data2); } 要用 swap 的手法達成 exception safety 有一項條件是 swap 操作絕對不會丟出 exception 因此你的 member 通常只能使用 primitive type 或 pointer type 這樣在 swap 時才不會有 exception 產生 而複制過程中可能會產生 exception 的時間點 都集中在 tmp 這個暫時物件的 ctor 中 在呼叫 constructor 的過程中即使發生 exception compiler 也會保證它的資源會被釋放 (當然你的 constructor 要寫對) 而且會在 swap 執行前離開 operator=() 保證這個失敗的 copy-assignment 不會去修改到等號左邊那個物件的內容 要詳細解釋真的會長篇大論 建議你自己去看 exceptional c++ 裡面講得很清楚 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.29.108 ※ 編輯: littleshan 來自: 140.112.29.108 (02/03 13:17)
akasan:要會用C++真的要讀好多書XD... 02/03 14:07
QQ29:真的學不完...不熟還被迫要學別的語言 搞得都不熟.... 02/03 14:54
QQ29:l大 請教一下 這招是都可以適用嗎還是什麼時候才可以用? 02/04 00:40
littleshan:你需要 strong exception safety 的時候使用 02/04 00:43
littleshan:去看 exceptional c++ 它講得比我好 (無誤) 02/04 00:45
QQ29:雖然目前我看不懂exception不過 如果把這個當成習慣會不好嗎 02/04 01:05