深拷貝與淺拷貝

2021-09-06 15:19:45 字數 2131 閱讀 8751

深拷貝的實現:

方式一:

#define  _crt_secure_no_warnings 1

#includeusing namespace std;

#include#include//深拷貝

class string

else

}*///正確寫法二:比一簡單點

//好處:不用擔心傳入空指標問題

//當傳入空指標和無參物件時,也開闢空間,乙個位元組(存放『\0')

//當傳入有參物件時,也要多開闢乙個位元組的空間,存放『\0'

string(const char*str="")//注意這裡是"",不是" ",它倆的長度不一樣,第乙個長度為0(因為裡面存的是'\0'),第二個長度為1

_str = new char[strlen(str) + 1];//當傳入空指標時,開闢了1個char型別的空間,放\0

strcpy(_str, str);

} //這種寫法對string s1(nullptr)不適用,strlen(str)會出錯,不能對空指標求字串長度

//string(char*str="")

// :_str(new char[strlen(str)+1])

// //拷貝構造

string(string&s)

:_str(new char[strlen(s._str) + 1])

//賦值運算子過載 以為例a=b("hello")

//思路:a物件可能無參,無參物件構造時只開闢了乙個char空間,儲存'\0',那麼b中內容直接strcpy拷貝給a時就會出問題

//所以,正確步驟為:

//(1)先開闢新空間char*ptr=new char[strlen(b的字串長度)+1];

//(2)將b中的字串拷貝到ptr指向的空間中

//(3)釋放a物件指標指向的舊空間

//(4)將a物件中指標所指的字串空間指向為ptr(a._str=ptr)

//改進點:如果是自己給自己賦值,則不用那麼麻煩,直接返回原物件

/*string&operator=(string&s)

return *this;

}*/string&operator=(string&s)

return *this;

} //析構函式

~string()

*/ //這種方式存在的問題:對於(2)傳入空指標 ,strlen(空指標)程式崩潰

/*string(char*str="")

:_str(new char[strlen(str) + 1])

*/ //建構函式

//正確書寫方式

//要考慮的點:傳參方式->(1)無參(2)傳入空指標(3)有參

string(const char*str="")

_str = new char[strlen(str) + 1];

strcpy(_str, str);

} //拷貝構造

//思路:構造乙個臨時物件tmp,引數為s._str。這裡是呼叫的建構函式

//注意要點:_str要初始化為空。因為當前物件的指標如果不初始化為空,則是個隨機值,最後交換後,tmp中儲存的就是這個隨機值

string(const string&s)

:_str(nullptr)

//賦值運算子過載(簡潔版)

//思路:同樣利用構造臨時物件的方法,注意這裡引數是s,呼叫的是拷貝建構函式

//注意要點:(1)因為傳的是引用,所以臨時物件需要手動構建

//(2)防止自己給自己賦值

/*string&operator=(const string&s)

return *this;

}*///賦值運算子過載(最簡潔版)

//相比於上面(簡潔版),這個(最簡潔版)的優點是:

//(1)將構建臨時物件的時機交給了編譯器來做

//(2)不用手動判斷自己給自己賦值的問題,因為採用的是值拷貝,永遠出現自己給自己賦值的情況

string&operator=(string s)

~string()

private:

char*_str;

};int main()

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...