2017-06-18 171 views
-3

我看到这一点:question移动赋值运算符VS拷贝赋值运算符

但答案有非常复杂对于C++新手跟我一样。如果有人能帮助我,我希望它。

CLASSA & operator=(CLASSA && other); //move assignment operator 

CLASSA & operator=(CLASSA other); //copy assignment operator 

我仍然不明白为什么我们需要这两个?他们基本上做同样的事情?那么有什么区别,你会在哪里使用一个呢?

+0

不是答案,但副本分配应该将'const CLASSA&other'作为参数来代替。 – HolyBlackCat

+1

当实现移动赋值操作符时,您可以利用'other'变量被认为是临时的并且即将被销毁(从呼叫返回时)。所以如果你想要,你可以利用这个和“偷”它的内容,而不是复制它们。只要你将'other'留在有效状态(所以它可以被彻底销毁),没有代码会知道你做了什么。 –

+1

只有当他们*不*做同样的事情时,您才需要两者。 –

回答

0

首先,复制赋值运算符通常使用“const CLASSA &”作为参数,而不是简单的“CLASSA”。

通常情况下,有2个使用移动的情况:

  1. 优化:其中副本是昂贵的,但此举是便宜。例如,对于std :: string的典型实现,它可以被低价移动。复制更为昂贵(内存分配+复制)。例如,当需要增加std::vector<std::string>时,可以使用移动。在过去的日子里(当没有rval ref的时候),std::vector<std::string>的增长是这样实现的:分配一个新的更大的区域,然后(缓慢)的字符串复制到新的位置,然后在旧的地方销毁字符串。现在,在rval refs可用的情况下,会发生这种情况:分配一个新的更大区域,然后(快速)字符串移动到新位置。
  2. 凡通过设计禁止复制,但可以采取行动。例如,std :: unique_ptr