這周課程主要講解了Big Three的用途寫法和注意事項(xiàng)以及內(nèi)存管理。
當(dāng)沒有手動(dòng)編寫三大函數(shù)時(shí),編譯器會(huì)使用默認(rèn)的一套,operator=的默認(rèn)會(huì)依次復(fù)制。如果是基本數(shù)據(jù)類型自然沒什么問題羊苟,但當(dāng)數(shù)據(jù)成員含有指針的時(shí)候,operator的只會(huì)進(jìn)行淺復(fù)制感憾,即只是指針本身被復(fù)制蜡励,而不是指針?biāo)赶虻膬?nèi)容被復(fù)制。為了進(jìn)行深復(fù)制阻桅,需要我們單獨(dú)編寫凉倚。
即 class with point members 必須有 copy ctor 和 copy op= 和析構(gòu)函數(shù)。
1.析構(gòu)函數(shù)
~String();
inline String::~String() ?{ delete[ ] m_data; }
當(dāng)一個(gè)對(duì)象超出作用域 或執(zhí)行delete的時(shí)候嫂沉,析構(gòu)函數(shù)就被調(diào)用稽寒。
2.復(fù)制構(gòu)造函數(shù)
inline String::String(const String& str)
{
m_data = new char[ strlen(str.m_data) + 1 ]; //分配空間
strcpy(m_data, str.m_data); ?//復(fù)制內(nèi)容
}?
3.operate=
inline String& String::operator=(const String& str)
{
if (this == &str) // 檢測(cè)自我復(fù)制?
return *this;
delete[] m_data; //刪除左側(cè)空間
m_data = new char[ strlen(str.m_data) + 1 ]; //創(chuàng)建和右側(cè)相同大小的空間
strcpy(m_data, str.m_data); //復(fù)制右側(cè)內(nèi)容到左側(cè)
return *this;
}
關(guān)于內(nèi)存管理:
棧一般優(yōu)于堆。
array new一定要搭配 array delete趟章。
由于算是半個(gè)初學(xué)者杏糙,并不能提出什么自己的理解慎王,會(huì)努力學(xué)習(xí)研讀前輩們的著作和代碼。