<kbd id="daqct"></kbd>

  • <nav id="daqct"></nav>
    <wbr id="daqct"><pre id="daqct"></pre></wbr>
    <wbr id="daqct"></wbr>
    <form id="daqct"><th id="daqct"></th></form>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    C++培訓課程筆記--拷貝構造函數中的陷阱

    • 發布:C++培訓
    • 來源:網絡
    • 時間:2019-01-15 13:11

    C++培訓筆記,這篇文章給大家講述的是C++培訓課程中拷貝構造函數中的陷阱

    拷貝構造函數大家都比較熟悉,通俗講就是傳入一個對象,拷貝一份副本。

    不過看似簡單的東西,實際不注意的話就會產生問題!

    #include<iostream>

    using namespace std;

    class CExample

    {

    public:

    int a,b,c;

    char *str;

    public:

    //構造函數

    CExample(int tb)

    {

    a = tb;

    b = tb+1;

    c = tb+2;

    str=(char *)malloc(sizeof(char)*10);

    strcpy(str,"123456789");

    cout<<"creat: "<<endl;

    }

    //析構函數

    ~CExample()

    {

    cout<< "delete: "<<endl;

    }

    void Show ()

    {

    cout<<a<<endl;

    }

    //拷貝構造

    //CExample(const CExample& C)

    //{

    // str=(char *)malloc(sizeof(char)*10);

    // strcpy(str,C.str);

    // cout<<"copy"<<endl;

    //}

    };

    //全局函數,傳入的是對象

    void g_Fun(CExample C)

    {

    C.a=0;C.b=0;C.b=0;

    strcpy(C.str,"aaabbbccc");

    cout<<"test"<<endl;

    }

    int main()

    {

    CExample test(1);

    cout<<"str:"<<test.str<<" a="<<test.a<<" b="<<test.b<<" c="<<test.c<<endl;

    g_Fun(test);//傳入對象

    cout<<"str:"<<test.str<<" a="<<test.a<<" b="<<test.b<<" c="<<test.c<<endl;

    getchar();

    return 0;

    }


    這個結果似乎出乎了我們的預料,作為形式參數 test對象被修改了,同時是test.str的部分被修改了,test的整數成員變量沒有被修改!

    咱們先了解一下系統默認的拷貝構造函數,因為類中沒有寫自己的拷貝構造函數,所以調用的是默認的拷貝構造函數。

    Thinking in c++:對于簡單結構,編譯器會自動生成一個缺省的,就是位拷貝(bitcopy)。

    對于比較復雜的類型,編譯器就會自動生成一個缺省的拷貝構造函數。

    class CExample

    {

    int a,b,c;

    };

    這就是一個簡單結構的類,位拷貝,就是按對象在內存中的二進制進行拷貝,對于不涉及指針等類型的時候,位拷貝是比較不錯的拷貝方法。

    但是,要是一個類中有指針類型的時候,如

    class CExample

    {

    int a,b,c;

    char *str;

    };

    位拷貝就會把指針地址拷貝了一下,話句話說,這里只進行了“淺拷貝”,一旦副本里涉及到指針的操作,必然就會影響到原始對象的成員變量,這就是導致,上面代碼中對象的整數變量沒被修改(對整數變量的位拷貝其實就是一種“深拷貝”),而str所指的對象被修改的原因。·

    那么該如何防止對副本的修改影響原始對象呢?

    答案是用戶自定義拷貝構造函數!

    免責聲明:內容和圖片源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容


    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:C++培訓課程--菱形繼承產生的問題及解決
    下一篇:C++開發-條件變量整理
    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美三级片,白洁外传,第四色播日韩AV第一页,啪啪免费观看大全av 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>