1穿剖、 當(dāng)一個(gè)類中不寫出拷貝構(gòu)造函數(shù)蚤蔓、拷貝賦值函數(shù)、析構(gòu)函數(shù)糊余,這三個(gè)函數(shù)時(shí)秀又,編譯器提供默認(rèn)的構(gòu)造函數(shù)、拷貝賦值函數(shù)啄刹、析構(gòu)函數(shù)函數(shù)涮坐。
2凄贩、 當(dāng)一個(gè)類中有指針成員時(shí)誓军,進(jìn)行對(duì)象的拷貝或者賦值時(shí),就必須自己寫出拷貝構(gòu)造函數(shù)疲扎、拷貝賦值函數(shù)和析構(gòu)函數(shù)函數(shù)昵时。否則編譯提供的默認(rèn)拷貝構(gòu)造函數(shù)捷雕、拷貝賦值函數(shù),那么對(duì)象與對(duì)象之間在進(jìn)行拷貝或者賦值時(shí)壹甥,對(duì)象的指針成員就會(huì)進(jìn)行淺拷貝操作救巷。也就是把指針成員的值拷貝給另外一個(gè)對(duì)象的指針成員,那么這兩個(gè)指針都指向了同一個(gè)內(nèi)存塊句柠,這樣后面的操作就很危險(xiǎn)浦译,例如析構(gòu)時(shí)同一塊內(nèi)存第二次釋放時(shí)會(huì)報(bào)錯(cuò),所以應(yīng)避免這種淺拷貝溯职,拷貝賦值函數(shù)也同理精盅。
例如:
char *p1 = new char[100];
char *p2 = p1;//指針賦值
delete [ ] p1;//釋放內(nèi)存
delete [ ] p2; //內(nèi)存已釋放,此句執(zhí)行時(shí)報(bào)錯(cuò)
3谜酒、 自己定義拷貝構(gòu)造函數(shù)時(shí)叹俏,函數(shù)的參數(shù)要以引用的方式傳入。自己定義拷貝賦值函數(shù)僻族,函數(shù)的參數(shù)也一樣的要以引用的方式傳入粘驰。在拷貝賦值函數(shù)實(shí)現(xiàn)時(shí),一定要注意述么,必須檢測(cè)自己賦值給自己的情況蝌数,否則把自己所指向的內(nèi)存刪除后,再拷貝給自己將會(huì)影響結(jié)果或者出錯(cuò)度秘。
inline CMyString&
CMyString::operator = (const CMyString& str)
{
if (this == &str)
{
return *this;
}
delete [] m_pdata;
m_pdata = new char[strlen(str.m_pdata)+1];
strcpy(m_pdata, str.m_pdata);
return *this;
}