溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中的默認(rèn)函數(shù) 深拷貝與淺拷貝 深賦值與淺賦值

發(fā)布時(shí)間:2020-08-04 13:23:23 來源:網(wǎng)絡(luò) 閱讀:596 作者:匯天下豪杰 欄目:編程語言

1、C++中什么都不寫,就有6個(gè)默認(rèn)函數(shù),由系統(tǒng)自動(dòng)提供:

  構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),賦值語句,析構(gòu)函數(shù),對一般對象的取地址符,對常對象的取地址重載;

對&運(yùn)算符的重載:

  Test t3;

  Test *pt = &t3;

Test* operator&(){
    return this;
}

對常對象的取地址重載;

const Test t4;

const Test *pt1 = &t4;

const Test* operator&()const{
    return this;
}

2、深拷貝與淺拷貝

#include<iostream>
#include<string.h>
#include<malloc.h>
using namespace std;

class String{
public:
    String(const char *str = ""){
        if(str == NULL){
            data = new char;
            data[0] = 0;
        }else{
            data = new char[strlen(str) + 1];
            strcpy(data, str);
        }
    }
    ~String(){
        delete []data;
    }
private:
    char *data;
};

int main(void){
    String t1("abcdef");
    String t2 = t1;
    String t3("hello");
    t3 = t1;

    return 0;
}

運(yùn)行結(jié)構(gòu)如下:

C++中的默認(rèn)函數(shù) 深拷貝與淺拷貝 深賦值與淺賦值

可以知道,程序崩了,我們用的是系統(tǒng)默認(rèn)的拷貝構(gòu)造函數(shù)和賦值語句,此時(shí)只是各成員之間的賦值,

C++中的默認(rèn)函數(shù) 深拷貝與淺拷貝 深賦值與淺賦值

  兩個(gè)對象通過默認(rèn)的拷貝構(gòu)造,成員data之間相互賦值,使得data不同,data的值相同,指向了同一空間;

  此時(shí)在最后調(diào)用析構(gòu)函數(shù)時(shí),形成了對同一空間的多次釋放,是錯(cuò)誤操作?。?!,這就是淺拷貝。

  兩個(gè)對象通過默認(rèn)的賦值語句,成員data之間相互賦值,使得data不同,data的值相同,指向了同一空間,淺賦值。

解決方案,此時(shí)應(yīng)給自己寫拷貝構(gòu)造和賦值語句,達(dá)成深拷貝:

String(const String &s){
    data = new char[strlen(s.data) + 1];
    strcpy(data, s.data);
}
String& operator=(const String &s){
    if(this != &s){
        delete []data;
        data = new char[strlen(s.data) + 1];
        strcpy(data, s.data);
    }

    return *this;
}

  深拷貝和深賦值的意思:就是重新申請空間,各自保存自己的,最后在自己釋放自己的,保證了對內(nèi)存訪問的安全性;

  深賦值應(yīng)當(dāng)注意以下四步:

  (1)、判斷自己是否給自己賦值

  (2)釋放原有空間      //有可能在構(gòu)造對象時(shí),已經(jīng)指向了某一空間,此時(shí)就得先釋放,不然就內(nèi)存泄漏

  (3)、申請空間進(jìn)行賦值

  (4)、返回引用空間



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI