→ 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