C++ 構(gòu)造函數(shù)中使用new時(shí)注意事項(xiàng)
使用new初始化對象中的指針成員時(shí)遇到的問題
在構(gòu)造函數(shù)中使用new初始化指針成員,那么析構(gòu)函數(shù)中就必須使delete,并且new對應(yīng)delete, new[]則對應(yīng)于delete[]。
在有多個(gè)構(gòu)造函數(shù)的情況下,必須以相同的方式使用new,要不用new,要不用new[],因?yàn)橹淮嬖谝粋€(gè)析構(gòu)函數(shù),所有的構(gòu)造函數(shù)都必須與虛構(gòu)函數(shù)相兼容。
PS. 當(dāng)然在構(gòu)造函數(shù)中使用new初始化指針的時(shí)候,可以把指針初始化為空(0/NULL 或者是C++11中的nullptr),因?yàn)閐elete不管有沒帶[]都與空指針兼容。
需要自行定義一個(gè)復(fù)制構(gòu)造函數(shù)和賦值構(gòu)造函數(shù),用深復(fù)制的方式把一個(gè)對象初始化給另一個(gè)對象,一個(gè)對象復(fù)制給另一個(gè)對象,如下:
復(fù)制構(gòu)造函數(shù):
- 分配足夠空間存儲復(fù)制的數(shù)據(jù)
- 復(fù)制數(shù)據(jù),不僅僅地址
- 更新受到影響的靜態(tài)類成員
String:String(const String & st) { num_Strings++; len = st.len; str = new char[len+1]; std::strcpy(str,st.str); }
賦值構(gòu)造函數(shù):
- 檢查自我復(fù)制情況
- 釋放成員指針之前指向內(nèi)存
- 復(fù)制數(shù)據(jù)不僅僅地址
- 返回一個(gè)指向調(diào)用對象的引用
String & String:operator=(const String & st) { if(this == &st) return *this; else delete [] str; len = st.len; str = new char[len+1]; std::strcpy(str,st.str); return *this; }
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)打印虛函數(shù)表的地址
對于存在虛函數(shù)的類,如何打印虛函數(shù)表的地址,并利用這個(gè)虛函數(shù)表的地址來執(zhí)行該類中的虛函數(shù)呢,下面小編就來和大家一起簡單聊聊吧2023-07-07Qt重寫QTreeView自繪實(shí)現(xiàn)酷炫樣式
QTreeView,顧名思義,就是一種樹形的控件,在我們需要做類似于文件列表的視圖時(shí),是一個(gè)不錯(cuò)的選擇,下面我們就來看看qt如何重寫QTreeView實(shí)現(xiàn)酷炫樣式,感興趣的可以了解一下2023-08-08C++超詳細(xì)分析講解內(nèi)聯(lián)函數(shù)
為了消除函數(shù)調(diào)用的時(shí)空開銷,C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)2022-06-06基于C語言實(shí)現(xiàn)點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11c語言實(shí)現(xiàn)冒泡排序、希爾排序等多種算法示例
c語言實(shí)現(xiàn)插入排序、冒泡排序、選擇排序、快速排序、堆排序、歸并排序、希爾排序示例,需要的朋友可以參考下2014-04-04