温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在c++项目中移动构造

发布时间:2021-02-26 16:47:21 来源:亿速云 阅读:172 作者:Leah 栏目:开发技术

如何在c++项目中移动构造?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

移动构造

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

                有可被利用的临时对象

  • 移动构造函数:

     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...

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI