节选自http://blog.csdn.net/jofranks/article/details/17438955
移动构造函数
在C++11中新加入的特性!
在上一篇blog中我加入了一张图,可以具体看到移动构造函数的运行原理。
此时,我们偷走了临时变量的内存空间,据为己用。节省了开辟空间的时间。
- A(A && h) : a(h.a)
- {
- h.a = nullptr; //还记得nullptr?
- }
可以看到,这个构造函数的参数不同,有两个&操作符, 移动构造函数接收的是“右值引用”的参数。
还要来说一下,这里h.a置为空,如果不这样做,h.a在移动构造函数结束时候执行析构函数会将我们偷来的内存析构掉。h.a会变成悬垂指针。
移动构造函数何时触发? 那就是临时对象(右值)。用到临时对象的时候就会执行移动语义。
这里要注意的是,异常发生的情况,要尽量保证移动构造函数 不发生异常,可以通过noexcept关键字,这里可以保证移动构造函数中抛出来的异常会直接调用terminate终止程序。
右值引用:
在上一篇blog中,我们提到过将亡值,他是c++11新增的跟右值引用相关的表达式。
在c++11中,右值引用就是对一个右值进行引用的类型,右值通常不具有名字,我们就只能通过引用的方式找到它的存在了。
比较一下下面两条语句:
- T &&a = returna();
- T b = returnb();
应该可以看清楚了吧。右值引用就是让返回的右值(临时对象)重获新生,延长生命周期。临时对象析构了,但是右值引用存活。
不过要注意的是,右值引用不能绑定左值:int a; int &&c = a; 这样是不行的。
这里有一个函数就是 move函数,它能够将左值强制转换成右值引用。
移动赋值操作符
他的原理跟移动构造函数相同,这里不再多说。
给出实现代码:
- A & operator = (A&& h)
- {
- assert(this != &h);
- a = nullptr;
- a = move(h.a);
- h.a = nullptr;
- return *this;
- }