1. 程式人生 > >交換操作 swap

交換操作 swap

自定義 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