c++ 移动构造相关总结

 更新时间:2021年02月25日 16:04:42   作者:流星斩月  
这篇文章主要介绍了c++ 移动构造的相关资料,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下

 下面随笔给出c++移动构造。

  在现实中有很多这样的例子,我们将钱从一个账号转移到另一个账号,将手机SIM卡转移到另一台手机,将文件从一个位置剪切到另一个位置……移动构造可以减少不必要的复制,带来性能上的提升。

  • C++11标准中提供了一种新的构造方法——移动构造。
  • C++11之前,如果要将源对象的状态转移到目标对象只能通过复制。在某些情况下,我们没有必要复制对象——只需要移动它们。
  • C++11引入移动语义:

                 源对象资源的控制权全部交给目标对象

  • 移动构造函数

问题与解决

当临时对象在被复制后,就不再被利用了。我们完全可以把临时对象的资源直接移动,这样就避免了多余的复制操作。

移动构造

  • 什么时候该触发移动构造?

                有可被利用的临时对象

  • 移动构造函数:

     class_name ( class_name && )

//例:函数返回含有指针成员的对象(版本1)

//使用深层复制构造函数

//返回时构造临时对象,动态分配将临时对象返回到主调函数,然后删除临时对象。

#include<iostream>

using namespace std;

class IntNum {

public:

  IntNum(int x = 0) : xptr(new int(x)){ //构造函数

    cout << "Calling constructor..." << endl;

   }

  IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//复制构造函数

    cout << "Calling copy constructor..." << endl;

  };

  ~IntNum(){ //析构函数

    delete xptr;

    cout << "Destructing..." << endl;

  }

  int getInt() { return *xptr; }

private:

  int *xptr;

};

//返回值为IntNum类对象

  IntNum getNum() {

    IntNum a;

    return a;

  }

int main() {

  cout<<getNum().getInt()<<endl;

  return 0;

}

//运行结果:

Calling constructor...

Calling copy constructor...

Destructing...

0

Destructing...
//例:函数返回含有指针成员的对象(版本2)

//使用移动构造函数

//将要返回的局部对象转移到主调函数,省去了构造和删除临时对象的过程。

#include<iostream>

using namespace std;

class IntNum {

public:

  IntNum(int x = 0) : xptr(new int(x)){ //构造函数

    cout << "Calling constructor..." << endl;

  }

  IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//复制构造函数

    cout << "Calling copy constructor..." << endl;

   //注:

  //•&&是右值引用

  //•函数返回的临时变量是右值

  }

  IntNum(IntNum && n): xptr( n.xptr){ //移动构造函数

    n.xptr = nullptr;

    cout << "Calling move constructor..." << endl;

  }

  ~IntNum(){ //析构函数

    delete xptr;

    cout << "Destructing..." << endl;

  }

private:

  int *xptr;

};

//返回值为IntNum类对象

  IntNum getNum() {

  IntNum a;

  return a;

}

int main() {

  cout << getNum().getInt() << endl; return 0;

}

//运行结果:

Calling constructor...

Calling move constructor...

Destructing...

0

Destructing...

以上就是c++ 移动构造相关总结的详细内容,更多关于c++ 移动构造的资料请关注脚本之家其它相关文章!

相关文章

  • C++实现简单BP神经网络

    C++实现简单BP神经网络

    这篇文章主要为大家详细介绍了C++实现简单BP神经网络,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C++中的对象数组详细解析

    C++中的对象数组详细解析

    在建立数组时,同样要调用构造函数。如果有50个元素,就需要调用50次构造函数。在需要的时候,可以在定义数组时提供实参以实现初始化
    2013-10-10
  • C/C++ 多线程的学习心得总结

    C/C++ 多线程的学习心得总结

    本篇文章是对C/C++中多线程的学习心得总结进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++制作简单的计算器功能

    C++制作简单的计算器功能

    这篇文章主要为大家详细介绍了C++制作简单的计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • FFmpeg实现将编码后数据保存成mp4

    FFmpeg实现将编码后数据保存成mp4

    这篇文章主要为大家详细介绍了FFmpeg如何实现将编码后数据保存成mp4,即从内存块中获取原始数据,然后依次进行解码、编码、最后保存成mp4视频文件,感兴趣的可以了解一下
    2023-08-08
  • 详解C++引用变量时那些你不知道的东西

    详解C++引用变量时那些你不知道的东西

    这篇文章主要为大家详细介绍了C++引用变量时那些你不知道的东西——引用变量延迟绑定,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-11-11
  • 浅析栈区和堆区内存分配的区别

    浅析栈区和堆区内存分配的区别

    以下是对栈区和堆区内存分配的区别进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • C语言数据结构中树与森林专项详解

    C语言数据结构中树与森林专项详解

    这篇文章主要介绍了C语言数据结构中树与森林,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • OpenCV中的cv::Mat函数将数据写入txt文件

    OpenCV中的cv::Mat函数将数据写入txt文件

    这篇文章主要介绍了OpenCVcv::Mat中的数据按行列写入txt文件中,需要的朋友可以参考下
    2018-05-05
  • C++模板的特化超详细精讲

    C++模板的特化超详细精讲

    最近我学习了C++中的模板相关知识,模板是泛型编程的基础,十分重要。所以特意整理出来一篇文章供我们一起复习和学习
    2022-08-08

最新评论