先上代码:
#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 交換指針)我对这个的理解还不是太深,以后还需要多多理解。