欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

什么是copy and swap

程序员文章站 2022-07-14 08:55:39
...

闲话少说,下面代码的前提是什么就不铺开讲了,只说明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)拷贝时总是使用这种优化过的方式

相关标签: c++