交换操作 swap

本文探讨了在C++中如何有效地使用swap函数进行对象交换,并介绍了copy-and-swap技术,这是一种能提高代码安全性及异常安全性的实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个类定义一个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表达式,如果发生会在交换之前。

 

转载于:https://www.cnblogs.com/kiplove/p/6965112.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值