什么是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)拷贝时总是使用这种优化过的方式
上一篇: mongoose的简单使用
下一篇: java反射机制学习(五):工厂模式
推荐阅读
-
什么是反向代理??负载均衡我懂
-
什么样的路由器是最好的?
-
在console中看到AJAX请求要用1.5S左右,如何去测试PHP代码中是哪一段比较费时间,用什么工具可以看到整个运行过程吗?
-
为什么单例模式是邪恶的(译)_PHP教程
-
为什么苹果新语言 Swift 的 RC4 运算效能是 Python 的 220 倍?
-
求上面这段代码是通过什么加密的
-
为什么我用imagecopy显示的图案是灰度的?
-
求教,QQ和YY那个弹窗结构是用什么语言结构?html?xml?结合的是c c++ 还是?_html/css_WEB-ITnose
-
javascript - php 有什么函数是可以根据文件名称,来获取这个文件的全路径的吗?或者js 怎么获取文件的全路径?
-
360_safe3.php 请问下这个文件是做什么的