什么是copy and swap

闲话少说,下面代码的前提是什么就不铺开讲了,只说明String是自定义的string类

operator=的传统做法是:

class String
{
    String&operator=(const String& s)
    {
        String temp(s);
        temp.swap(*this);
        return *this;
    }

    void swap(String& s) throw()
    {
        std::swap(this->str,s.str);
    }
};

或者它的变体也是可行的:

String& operator=(const String& s)
{
    if(this!=&s)
    {
        String(s).swap(*this);
    }
    return *this;
}
​
void Swap(String& s) throw()
{
    std::swap(this->str,s.str);
}

严格来说,在重载的operator函数体内显示构造一个临时量是没有必要的,等号右边的参数可以值传递给函数,这个形参本身就提供了临时量的作用
所以代码可以写成:

String& operator=(String rhs) // pass by value
{
    swap(rhs);
    return *this;
}
​
void swap(String& rhs) noexcept
{
    std::swap(data_, rhs.data_);
}

这不仅是为了写起来方便,这实际上是一种优化,如果形参(们)绑定到左值上,在传参的时候就自动生成了一个临时量,这和传统做法的效果是一样的,只不过传统做法是显式生成临时量,而这个版本是在传参时隐式地把数据拷贝给形参,由形参充当临时量,
但如果形参是右值(temporary object,literal),那么在传参时这个编译器一般会忽略这次不必要的拷贝,即不会真的调用拷贝构造函数拷贝一份数据给形参,也不会因为这次额外的拷贝构造而在析构时额外调用一次destructor.

在C++11中,上面这种分配运算符被称为 unifying assignment operator,因为它避免了写两种不同分配运算符:copy-assignment 和 move-assignment , 只要类有移动构造器,C++11从别的临时量(another temorary: rvalue)拷贝时总是使用这种优化过的方式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值