国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++之對(duì)象數(shù)組+對(duì)象成員+拷貝構(gòu)造函數(shù)(深/淺)

2019-11-06 08:11:20
字體:
供稿:網(wǎng)友

對(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;}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 阿勒泰市| 色达县| 大丰市| 永泰县| 宜阳县| 汤原县| 宁波市| 江川县| 漾濞| 绩溪县| 万载县| 于都县| 石家庄市| 富民县| 柯坪县| 长武县| 启东市| 邳州市| 五华县| 木兰县| 奉化市| 嵩明县| 鲜城| 新宁县| 怀远县| 麻栗坡县| 毕节市| 平谷区| 光泽县| 麟游县| 北宁市| 太和县| 崇仁县| 芜湖县| 新源县| 都兰县| 临颍县| 论坛| 清徐县| 报价| 阿拉善右旗|