交換操作 swap
阿新 • • 發佈:2017-06-09
自定義 swap 拋出異常 opera 引用 傳值 錯誤 賦值 new
一個類定義一個swap函數通常需要一次拷貝和兩次賦值
例如 A類的兩個對象v1與v2交換
A temp=v1; //copy構造一個臨時對象
v1=v2; //賦值運算
v2=temp; //賦值運算
如果采用指針交換則可以減少一次拷貝構造
A* temp=v1;
v1=v2; //賦值運算
v2=temp; //賦值運算
分清swap與std::swap的使用
std::swap是標準庫定義的,一般內置類型直接用即可,如果涉及自定義的類則使用自定義的swap。
void swap(A& lhs,A& rhs) //A自定義了swap函數 { std::swap(lhs.h,rhs.h);//這是錯誤的 …… } void swap(A& lhs,A& rhs) //A自定義了swap函數 { using std::swap; swap(lhs.h,rhs.h); //使用了A定義的swap函數 …… }
賦值運算符中使用swap實現copy and swap技術
A& A::operator=(A rhs) { swap(*this,rhs); return *this; }
參數rhs不是一個引用,通過傳值方式傳遞,是右側運算對象的一個副本。
交換對象後,這個副本會調用析構函數自動刪除,delete了交換前的資源。
這個技術的優勢是一方面保證了自賦值安全,另一方面就是天然的異常安全。
異常安全體現在代碼唯一的拋出異常是構造函數的new表達式,如果發生會在交換之前。
交換操作 swap