拷貝構造函數和移動構造函數

先上代碼:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章