先上代碼:
#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 交換指針)我對這個的理解還不是太深,以後還需要多多理解。