25考虑写出一个不抛出异常的swap函数——effective c++学习笔记

本文介绍了std::swap模板的功能及其实现原理,并提供了提高特定对象swap效率的方法,包括如何实现不抛出异常的swap成员函数及如何在命名空间内提供非成员swap函数。

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

std::swap是一个模板,他提供的是置换操作,即将同一类型对象a,b互换内部值。swap操作要求对象支持copying构造函数和copying赋值函数,在内部操作上,他使用了三个赋值对象。

这里有一个问题,就是对于特定的对象,它的效率会非常的低。所以我们要针对特定的对象进行特殊的swap

总结:

<!--[if !supportLists]-->1、 <!--[endif]-->如果swap的缺省实现码对你的class或者class template提供可以接受的效率,你不需要额外做任何事情,。

<!--[if !supportLists]-->2、 <!--[endif]-->如果swap缺省实现版的效率不足,试着做下面的事情

<!--[if !supportLists]-->(1) <!--[endif]-->提供一个public swap函数,让他高效的置换你的类型的两个对象,这个函数不可以抛出异常。这一限制仅限于成员版swap

<!--[if !supportLists]-->(2) <!--[endif]-->在你的classtemplate所在的命名空间内,提供一个non-member swap,并令他调用swap成员函数。

<!--[if !supportLists]-->(3) <!--[endif]-->如果你正在编写一个classtemplate,为你的class特化std::swap,并令他们调用你的swap函数。

<!--[if !supportLists]-->3、 <!--[endif]-->如果你调用swap,请确保包含一个using声明式,以便让std::swap在你的函数内曝光可见,然后不叫任何namespace修饰符,赤裸裸的调用swap

注意:

<!--[if !supportLists]-->1、 <!--[endif]-->当std::swap效率不高时,提供一个swap成员函数,并确保这个函数不抛出异常。

<!--[if !supportLists]-->2、 <!--[endif]-->如果你提供一个members swap,也应该声明一个non-member swap来调用前者,对于classes而非template,也请特化std::swap

<!--[if !supportLists]-->3、 <!--[endif]-->如果你调用swap,请确保包含一个using声明式,以便让std::swap在你的函数内曝光可见,然后不叫任何namespace修饰符,赤裸裸的调用swap

<!--[if !supportLists]-->4、 <!--[endif]-->为用户定义类型进行std template全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值