C++ 11新特性:移动构造函数和移动赋值操作符

节选自http://blog.csdn.net/jofranks/article/details/17438955


移动构造函数

在C++11中新加入的特性!

在上一篇blog中我加入了一张图,可以具体看到移动构造函数的运行原理。

C++ 11新特性:移动构造函数和移动赋值操作符_第1张图片

此时,我们偷走了临时变量的内存空间,据为己用。节省了开辟空间的时间。

[cpp]  view plain copy
  1. A(A && h) : a(h.a)  
  2. {  
  3.     h.a = nullptr; //还记得nullptr?  
  4. }  

可以看到,这个构造函数的参数不同,有两个&操作符,   移动构造函数接收的是“右值引用”的参数。

还要来说一下,这里h.a置为空,如果不这样做,h.a在移动构造函数结束时候执行析构函数会将我们偷来的内存析构掉。h.a会变成悬垂指针。

移动构造函数何时触发?  那就是临时对象(右值)。用到临时对象的时候就会执行移动语义。

这里要注意的是,异常发生的情况,要尽量保证移动构造函数 不发生异常,可以通过noexcept关键字,这里可以保证移动构造函数中抛出来的异常会直接调用terminate终止程序。

右值引用:

在上一篇blog中,我们提到过将亡值,他是c++11新增的跟右值引用相关的表达式。

在c++11中,右值引用就是对一个右值进行引用的类型,右值通常不具有名字,我们就只能通过引用的方式找到它的存在了。

比较一下下面两条语句:

[cpp]  view plain copy
  1. T &&a = returna();  
  2. T b = returnb();  
此时a是右值引用,他比b少了一次对象析构和对象构造的过程。a直接绑定了returna返回的临时变量。b只是由临时变量值构造而成的。

应该可以看清楚了吧。右值引用就是让返回的右值(临时对象)重获新生,延长生命周期。临时对象析构了,但是右值引用存活。

不过要注意的是,右值引用不能绑定左值:int a; int &&c = a;   这样是不行的。


这里有一个函数就是 move函数,它能够将左值强制转换成右值引用。


移动赋值操作符

他的原理跟移动构造函数相同,这里不再多说。

给出实现代码:

[cpp]  view plain copy
  1. A & operator = (A&& h)  
  2. {  
  3.     assert(this != &h);  
  4.   
  5.     a = nullptr;  
  6.     a = move(h.a);  
  7.     h.a = nullptr;  
  8.     return *this;  
  9. }  

你可能感兴趣的:(C++ 11新特性:移动构造函数和移动赋值操作符)