對(duì)象數(shù)組
實(shí)例(棧中實(shí)例化和堆中實(shí)例化):
class Coordinate{public: int m_iX; int m_iY;};int main(){ Coordinate coord[3];//棧中實(shí)例化 coord[1].m_iX = 10; Coordinate *p = new Coordinate[3];//堆中實(shí)例化 p[0].m_iY = 20; //p->m_iY = 20 delete[]p; p = NULL; return 0;}上述代碼在內(nèi)存中的工作:
在這里有一個(gè)小問題需要注意一下,在使用new申請(qǐng)數(shù)組空間后,要用delete[]p來釋放掉內(nèi)存,注意一定不要忘掉[],那么是為什么呢? 其實(shí)我們?cè)谏暾?qǐng)一個(gè)對(duì)象數(shù)組時(shí),分別調(diào)用了n次構(gòu)造函數(shù),那么我們?cè)卺尫艜r(shí)同樣要調(diào)用n次析構(gòu)函數(shù),如果忘掉[],那么只銷毀指向指針的第一個(gè)元素。
對(duì)象成員 在實(shí)際的應(yīng)用中,對(duì)象包含對(duì)象是一種很常見的狀態(tài),比如一間屋子里有家具,以點(diǎn)和線為例:
class Coordinate//坐標(biāo)系上的點(diǎn){public: Coordinate();PRivate: int m_iX; int m_iY;};class Line//坐標(biāo)系上的線{public: line();private: Coordinate m_coorA; Coordinate m_coorB;};int main(){ Line *p = new Line(); delete p; p = NULL; return 0;}這里有個(gè)實(shí)例化順序的問題,在上述代碼中,先實(shí)例化點(diǎn)還是先實(shí)例化線呢? 答案是在實(shí)例化線的時(shí)候先去示例化A點(diǎn),其次B點(diǎn),最后實(shí)例化線,在銷毀時(shí)正好與創(chuàng)建的過程相反,就好比組裝一輛車,得先把零件做好才能組裝,同樣拆毀一輛車,是把整輛的車拆成一個(gè)個(gè)的小部件。
拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)分為深拷貝和淺拷貝,下面來看兩段代碼。 代碼1:
class Array{public: Array(){m_iCount=5;} Array(const Array& arr) { m_iCount=arr.m_iCount; }private: int m_iCount;};int main(){ Array arr1; Array arr2=arr1; return 0;}代碼2:
class Array{public: Array() { m_iCount = 5; //構(gòu)造函數(shù),指向堆申請(qǐng)的內(nèi)存 m_pArr = new int[m_iCount]; } Array(const Array& arr)//拷貝構(gòu)造函數(shù) { m_iCounta = arr.m_iCount; m_pArr = arr.m_pArr; }private: int m_iCount; int *m_pArr;//指針};int main(){ Array arr1; Array arr2 = arr1;//這種情況下,淺拷貝 return 0;}這兩個(gè)代碼的共同點(diǎn)都是只是將數(shù)據(jù)成員的值進(jìn)行了簡(jiǎn)單的拷貝,我們把這種拷貝模式稱之為淺拷貝,對(duì)于第一個(gè)代碼來說是沒有問題的,但是對(duì)于第二個(gè)代碼存在著很大的問題。
如上圖所示,代碼2中arr1的指針和arr2的指針指向同一塊內(nèi)存,當(dāng)改變arr1的內(nèi)存數(shù)值,arr2的內(nèi)容也勢(shì)必改變,最嚴(yán)重的是當(dāng)arr1和arr2都釋放時(shí),勢(shì)必會(huì)對(duì)同一內(nèi)存釋放兩遍,面對(duì)這種問題,會(huì)引起計(jì)算機(jī)的崩潰。而我們希望拷貝構(gòu)造函數(shù)所完成的工作是如下圖所示的:
拷貝的內(nèi)容不是將指針的地址簡(jiǎn)單的拷貝過來,而是將指針指向內(nèi)存中的每一個(gè)元素都拷貝過來,為了實(shí)現(xiàn)這種方法,代碼2應(yīng)該寫成如下模樣,即深拷貝。 代碼2+:
class Array{public: Array(){ m_iCount = 5; m_pArr = new int[m_iCount]; }//構(gòu)造函數(shù),指向堆申請(qǐng)的內(nèi)存 Array(const Array& arr)//拷貝構(gòu)造函數(shù),深拷貝 { m_iCounta = arr.m_iCount; m_pArr = new int[m_iCount]; for (int i = 0; i < m_iCount; i++) { m_pArr[i] = arr.m_pArr[i]; } }private: int m_iCount; int *m_pArr;//指針};int main(){ Array arr1; Array arr2 = arr1;//這種情況下,淺拷貝 return 0;}新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注