C ++入門書第5ノート(第13章コピーコントロール)交換操作

1.クラスオブジェクトの交換割り当​​て

Hasptr.h

class Hasptr
{
    
    
public: 
	Hasptr(const std::string &s = std::string()):
	ps(new std::string(s),
	i(0),
	use(new std::size_t(1)))	{
    
    } 
	Hasptr(const Hasptr &p):ps(p.ps),i(p.i),use(p.use){
    
    ++*use}; 
	Hasptr& operator=(const Hasptr&);
	~Hasptr();
private:
	std::string *ps;
	int i;
	std::size_t *use; 
}

交換コードは次のとおりです。

Hasptr temp = v1;	//创建v1的一个临时副本
v1 = v2;		 //将v2赋值给v1
v2 =temp;		//将保存v1的值赋予v2

2.最適化

上記の交換プロセスでは、1つのコピーと2つの割り当てが必要です。文字列のメモリ割り当てはオーバーヘッドをもたらします。文字列の新しいコピーを割り当てるのではなく、ポインタを交換するよりもスワップを好みます。

string &temp = v1.ps;
v1.ps = v2.ps;
v2.ps = temp.ps;

2. 1クラスのスワップのバージョンをカスタマイズできます。2つのHasPtrオブジェクトを交換する場合は、それらの内部ポインターを交換するだけで済みます。

class HasPtr{
    
    
	friend void swap(HasPtr &lhs,HasPtr &rhs);
}

inline swap(HasPtr&,HasPtr&)
{
    
    
	using std::swap;
	swap(lhs.ps,rhs.ps);	//交换指针,而不是string的数据
	swap(lhs.i;rhs.i);	        //交换int成员
}

2.2代入演算子でスワップを使用する

このテクノロジーは、コピーアンドエクスチェンジテクノロジを使用して、左側のオペランドのコピーを右側のオペランドのコピーと交換します。
rhsは値で渡されます:

HasPtr& HasPtr::operator=(HasPtr rhs)
{
    
    
	//交换左侧运算对象和局部变量rhs的内容
	swap(*this,rhs);
	return *this;	//rhs 被销毁,从而delete了rhs中的指针
}
  • 注:代入演算子は非常に安全で、自己代入を正しく処理できます。

[リファレンス]
[1]コードreferenceCountSwap.h

おすすめ

転載: blog.csdn.net/thefist11cc/article/details/113875932