拷贝构造函数和移动构造函数

先上代码:

#include<bits/stdc++.h>
using namespace std;
class node
{
public :
    node(int x):a(new int[x]),a_size(x)
    {
        for(int i=0; i<a_size; i++)
            a[i]=i+1;
        cout<<"construct"<<std::endl;
    }
    node(node &b)
    {
        a_size=b.a_size;
        a=new int[a_size];
        for(int i=0; i<a_size; i++)
            a[i]=b.a[i];
        cout<<"copy"<<std::endl;
    }
    node(node &&b):a(b.a),a_size(b.a_size)
    {
        b.a=nullptr;
        cout<<"move copy"<<std::endl;
    }
    ~node()
    {
        delete []a;
        cout<<"delete"<<std::endl;
    }
    int *a;
    int a_size;
private:
};
int main()
{
    node A(4);
    for(int i=0; i<A.a_size; i++)
        cout<<A.a[i]<<' ';
    cout<<endl;
    node B(std::move(A));
//    node B(A);
    for(int i=0; i<B.a_size; i++)
        cout<<B.a[i]<<' ';
    cout<<endl;
    node C(B);
    for(int i=0; i<C.a_size; i++)
        cout<<C.a[i]<<' ';
    cout<<endl;
    node D(std::move(C));
    for(int i=0; i<D.a_size; i++)
        cout<<D.a[i]<<' ';
    cout<<endl;
    node E(D);
    for(int i=0; i<E.a_size; i++)
        cout<<E.a[i]<<' ';
    cout<<endl;
}

其实上面我的代码写的并不完整,我没有重载=,具体来说只有使用move才可以使用移动拷贝构造函数,因为拷贝构造函数本身就是右值,然后内部会进行匹配,另外我看到知乎上有一篇文章,其实讲的也很详细,但是在类B套用类A的时候,里面想调用A的拷贝构造函数一定要使用move的,这个和外面是一样的,这里不难理解,其他我觉得那篇文章写得挺好的,很能帮助理解,下面我贴出来这篇文章的链接:https://zhuanlan.zhihu.com/p/44156491,还有一点就是使用move的变量,之后都不可以再使用了,这点原因根据大佬说的是,对于不同的类型move内部实现的方式不同,可能会销毁之前的指针(例如string?,清华大佬说:比如 string 的 move 其實是兩個 string 交換指針)我对这个的理解还不是太深,以后还需要多多理解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值