【C++11新特性】移动构造函数

移动构造

所谓移动语义,指的就是以移动而非深拷贝的方式初始化含有指针成员的类对象。简单的理解,移动语义指的就是将其他对象(通常是临时对象)拥有的内存资源“移为已用”。

  • 就是在设计类的时候,除了定义拷贝构造函数,再定义一个移动构造函数,这个移动构造函数因为形参使用右值引用的方式,所以只能接受右值(主要是匿名对象、临时变量这种将亡值)对其使用浅拷贝,因此大大减小性能的开销。

举例实现

  • 事实上,对于程序执行过程中产生的临时对象,往往只用于传递数据(没有其它的用处),并且会很快会被销毁。因此在使用临时对象初始化新对象时,我们可以将其包含的指针成员指向的内存资源直接移给新对象所有,无需再新拷贝一份,这大大提高了初始化的执行效率。
using namespace std;
class demo{
public:
    demo():num(new int(0)){
        cout<<"construct!"<

可以看到,在之前 demo 类的基础上,我们又手动为其添加了一个构造函数。和其它构造函数不同,此构造函数使用右值引用形式的参数,又称为移动构造函数。并且在此构造函数中,num 指针变量采用的是浅拷贝的复制方式,同时在函数内部重置了 d.num,有效避免了“同一块对空间被释放多次”情况的发生。

右值

  • 程序执行结果中产生的临时对象(例如函数返回值、lambda 表达式等)既无名称也无法获取其存储地址,所以属于右值。当类中同时包含拷贝构造函数和移动构造函数时,如果使用临时对象初始化当前类的对象,编译器会优先调用移动构造函数来完成此操作。只有当类中没有合适的移动构造函数时,编译器才会退而求其次,调用拷贝构造函数。

在实际开发中,通常在类中定义移动构造函数的同时,也会定义一个拷贝构造函数,
用右值初始化类对象时,会调用移动构造函数;
用左值初始化类对象时,会调用拷贝构造函数。

另外:默认情况下,左值初始化同类对象只能通过拷贝构造函数完成,如果想调用移动构造函数,则必须使用右值进行初始化。C++11 标准中为了满足用户使用左值初始化同类对象时也通过移动构造函数完成的需求,新引入了 std::move() 函数,它可以将左值强制转换成对应的右值,由此便可以使用移动构造函数

参考:C++11移动构造函数详解 (biancheng.net)

你可能感兴趣的:(【C++11新特性】移动构造函数)