成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C++拷貝構(gòu)造

在C++存在拷貝構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)與不同構(gòu)造函數(shù)形成重載(這一點很重要),這就意味著(要么class入口為普通構(gòu)造函數(shù),要么為拷貝構(gòu)造函數(shù),不可能2個都會執(zhí)行的)。好了 , 下面可是今天的StudyingC++ 拷貝構(gòu)造

公司主營業(yè)務(wù):網(wǎng)站設(shè)計制作、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出象州免費做網(wǎng)站回饋大家。

一 , 實際上C++類中有一個默認(rèn)的拷貝構(gòu)造,它的作用是將此類中非static成員逐一copy?,F(xiàn)在先不管默認(rèn)的Copy構(gòu)造,我先先重載一下Copy構(gòu)造:

#include <iostream>
using namespace std;
class copyC
{
public:
    int a;
    copyC()
    {
        this->a = 2;
    }
    //拷貝構(gòu)造函數(shù)
    copyC( const copyC &b )
    {
        //執(zhí)行拷貝構(gòu)造函數(shù)
        this->a = b.a;
    }
};
int main()
{
    return 0;
}

拷貝函數(shù) : copyC( const copyC &b ) ,  里面的語句:this->a = b.a;實現(xiàn)的效果其實是和默認(rèn)拷貝構(gòu)造是一樣的。

話鋒先轉(zhuǎn)一下,談下拷貝函數(shù)的觸發(fā)機制(在什么條件下會調(diào)用)

①:用一個對象為另一個對象初始化

1->

#include <iostream>
using namespace std;
class copyC
{
public:
    int a;
    copyC()
    {
        this->a = 2;
    }
    //拷貝構(gòu)造函數(shù)
    copyC( const copyC &b )
    {
        //執(zhí)行拷貝構(gòu)造函數(shù)
        cout << "執(zhí)行了構(gòu)造函數(shù)" << endl;
        this->a = b.a;
    }
};
int main()
{
    copyC str;
    copyC new1(str);
    cout << new1.a << endl;
    return 0;
}

結(jié)果:

C++ 拷貝構(gòu)造

關(guān)鍵:

    copyC str;
    copyC new1(str);

2->

    copyC str;
    copyC new1 = str;

3->

    copyC str;
    copyC new1 = copyC(str);

4->

#include <iostream>
using namespace std;
class copyC
{
public:
    int a;
    copyC()
    {
        this->a = 2;
    }
    //拷貝構(gòu)造函數(shù)
    copyC( const copyC &b )
    {
        //執(zhí)行拷貝構(gòu)造函數(shù)
        cout << "執(zhí)行了構(gòu)造函數(shù)" << endl;
        this->a = b.a;
    }
};
int main()
{
    copyC str;
    copyC *new1 = new copyC(str);
    cout << new1->a << endl;
    delete new1;
    return 0;
}

結(jié)果一樣:

C++ 拷貝構(gòu)造

小結(jié) :

上面的1,2,3,4中情況都會調(diào)用拷貝構(gòu)造。

②:當(dāng)對象生成對象副本時

1->傳遞對象

#include <iostream>
using namespace std;
class copyC
{
public:
    int a;
    copyC()
    {
        this->a = 2;
    }
    //拷貝構(gòu)造函數(shù)
    copyC( const copyC &b )
    {
        //執(zhí)行拷貝構(gòu)造函數(shù)
        cout << "執(zhí)行了構(gòu)造函數(shù)" << endl;
        this->a = b.a;
    }
    static void copyFun( copyC b )
    {
    }
};
int main()
{
    copyC str;
    copyC::copyFun(str);
    return 0;
}

結(jié)果:

C++ 拷貝構(gòu)造

2->返回對象

#include <iostream>
using namespace std;
class copyC
{
public:
    int a;
    copyC()
    {
        this->a = 2;
    }
    //拷貝構(gòu)造函數(shù)
    copyC( const copyC &b )
    {
        //執(zhí)行拷貝構(gòu)造函數(shù)
        cout << "執(zhí)行了構(gòu)造函數(shù)" << endl;
        this->a = b.a;
    }
    static void copyFun( copyC b )
    {
    }
    copyC copyFun()
    {
        copyC a;
        return a;
    }
};
int main()
{
    copyC str;
    copyC new1 = str.copyFun();
    new1.a = 4;
    cout << str.a << endl;
    cout << new1.a << endl;
    return 0;
}

結(jié)果有點詭異 , 但是理論是正確的:

C++ 拷貝構(gòu)造

new1確實拷貝成功 , 但是“執(zhí)行了構(gòu)造函數(shù)”好像沒打印出來,這和IDE有關(guān)嗎 ? 各位讀者

好了 , 現(xiàn)在正式講講拷貝構(gòu)造的作用:

默認(rèn)拷貝為淺拷貝,淺拷貝在有*(指針)成員的時候會報錯:

#include <iostream>
using namespace std;
class copyC
{
public:
    int *a;
    copyC()
    {
        this->a = new int[2];
        *(a) = 1;
        *(a+1) = 2;
    }
    //拷貝構(gòu)造函數(shù)
    copyC( const copyC &b )
    {
        //執(zhí)行拷貝構(gòu)造函數(shù)
        cout << "執(zhí)行了構(gòu)造函數(shù)" << endl;
        this->a = b.a;
    }
    ~copyC()
    {
        delete[] a;
    }
};
int main()
{
    {
        copyC str;
        cout << str.a[0] << "  " << str.a[1] << endl;
        copyC new1 = str;
        cout << new1.a[0] << "  " << new1.a[1] << endl;
    }
    return 0;
}

出現(xiàn)結(jié)果:

C++ 拷貝構(gòu)造

正確的結(jié)果出來了 , 但是bug也出來了 。

對于bug的解釋:

無論是str還是new1對象,他們的成員指針a都是1個對象(不是2個相同的對象),在內(nèi)存中的一個對象,那么一個指針是不能釋放2次的。

一,如下:

#include <iostream>
using namespace std;
class copyC
{
public:
    int *a;
    copyC()
    {
        this->a = new int[2];
        *(a) = 1;
        *(a+1) = 2;
    }
    //拷貝構(gòu)造函數(shù)
    copyC( const copyC &b )
    {
        //執(zhí)行拷貝構(gòu)造函數(shù)
        cout << "執(zhí)行了構(gòu)造函數(shù)" << endl;
        this->a = b.a;
    }
    ~copyC()
    {
        if( a != NULL )
            delete[] a;
    }
};
int main()
{
    {
        copyC str;
        cout << str.a[0] << "  " << str.a[1] << endl;
        copyC new1 = str;
        cout << new1.a[0] << "  " << new1.a[1] << endl;
    }
    return 0;
}

使用這種方案的時候一定要注意 : a(指針)雖然在2個對象里面(一個是copy的對象)但是a確實是1個對象。

二,重載拷貝構(gòu)造(這個可以將a(指針)在確實的拷貝一份,這就是深拷貝了)

#include <iostream>
using namespace std;
class copyC
{
public:
    int *a;
    copyC()
    {
        this->a = new int[2];
        *(a) = 1;
        *(a+1) = 2;
    }
    //拷貝構(gòu)造函數(shù)
    copyC( const copyC &b )
    {
        //執(zhí)行拷貝構(gòu)造函數(shù)
        cout << "執(zhí)行了構(gòu)造函數(shù)" << endl;
        //this->a = b.a;//這是淺拷貝方案
        this->a = new int[2];
        memcpy(this->a , b.a , 2*sizeof(int));
    }
    ~copyC()
    {
        delete[] a;
    }
};
int main()
{
    system("color 2B");
    {
        copyC str;
        copyC new1 = str;
        cout << new1.a[0] << "  " << new1.a[1] << endl;
        new1.a[0] = 3;
        new1.a[1] = 4;
        cout << "--------------------------------------------" << endl;
        cout << new1.a[0] << "  " << new1.a[1] << endl;
        cout << str.a[0] << "  " << str.a[1] << endl;
    }
    return 0;
}

運行結(jié)果:

C++ 拷貝構(gòu)造

str 中的成員a 和 new1中的成員a ,確實是2個對象哈。。。。。。

好了 , 本篇結(jié)束。。。。

名稱欄目:C++拷貝構(gòu)造
URL網(wǎng)址:http://jinyejixie.com/article14/gpecde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號品牌網(wǎng)站建設(shè)、服務(wù)器托管、小程序開發(fā)營銷型網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
兴安盟| 长寿区| 南部县| 新泰市| 祁东县| 长海县| 西和县| 利津县| 迁安市| 安阳县| 屯留县| 马公市| 瑞安市| 洛南县| 五寨县| 南充市| 任丘市| 莱阳市| 蓝田县| 额敏县| 东兰县| 宣威市| 车致| 临江市| 德保县| 灵台县| 张家川| 长乐市| 万载县| 九江市| 句容市| 新闻| 镇江市| 乳源| 华阴市| 丰都县| 会泽县| 五莲县| 清水河县| 乌拉特后旗| 邳州市|