C++ 中類的拷貝、賦值、銷毀的實(shí)例詳解
C++ 中類的拷貝、賦值、銷毀的實(shí)例詳解
本篇文章我們一共講解一下幾個(gè)知識(shí)點(diǎn):
類的拷貝構(gòu)造函數(shù)。
類的拷貝賦值運(yùn)算符。
類的析構(gòu)。
好了one by one
如果我們沒有定義類的拷貝構(gòu)造函數(shù)的話,那么編譯器會(huì)為我們合成默認(rèn)拷貝構(gòu)造函數(shù)----合成拷貝構(gòu)造函數(shù)。
和成拷貝構(gòu)造函數(shù)的操作是將其參數(shù)的各個(gè)成員拷貝到正在創(chuàng)建的對(duì)象中去,每個(gè)成員的類型決定了他是如何被拷貝的:對(duì)類類型的成員,會(huì)使用其拷貝構(gòu)造函數(shù),內(nèi)置類型的成員則是直接拷貝,雖然我們不能直接拷貝一個(gè)數(shù)組,但是合成拷貝構(gòu)造函數(shù)會(huì)逐個(gè)的拷貝一個(gè)數(shù)組類型的成員。
下面我們用代碼演示一下合成拷貝構(gòu)造函數(shù)的功能:
#include <iostream> using namespace std; /* 代碼模仿合成拷貝構(gòu)造函數(shù)的功能 */ class Sales_data { public: Sales_data(); //我們只是為了讀者更好的理解還原了一下合成拷貝構(gòu)造函數(shù)所實(shí)現(xiàn)的功能,實(shí)際上我們是看不見的 Sales_data(const Sales_data& s); ~Sales_data(); private: string bookNo; int units_sold = 0; double revenue = 0.0; }; Sales_data::Sales_data() { } Sales_data::Sales_data(const Sales_data& s) : bookNo(s.bookNo), units_sold(s.units_sold), revenue(s.revenue){ } Sales_data::~Sales_data() { }
好了,我們定義拷貝構(gòu)造函數(shù)也是如此定義的,我解釋一下為什么參數(shù)表里面是一個(gè)靜態(tài)的引用:
1)我們不想改變?cè)撘玫闹担皇怯脕磉M(jìn)行拷貝。
2)我們必須聲明為引用,如果寫成類的話,則又會(huì)調(diào)用該類的拷貝構(gòu)造函數(shù),在那個(gè)拷貝構(gòu)造函數(shù)中又會(huì)調(diào)用拷貝構(gòu)造函數(shù),這樣陷入死循環(huán)。
我們?cè)趤韺W(xué)習(xí)一下拷貝賦值運(yùn)算符:
和拷貝構(gòu)造函數(shù)一樣,如果我們不定義拷貝賦值運(yùn)算符的話,編譯器將會(huì)為我們合成一個(gè),我們下面用代碼來模仿一下吧:
#include <iostream> using namespace std; /* 代碼模仿拷貝賦值運(yùn)算符 */ class Sales_data { public: Sales_data(); //拷貝賦值運(yùn)算符的默認(rèn)合成 Sales_data& operator = (const Sales_data & s); ~Sales_data(); private: string bookNo; int units_sold = 0; double revenue = 0.0; }; Sales_data::Sales_data() { } Sales_data& Sales_data::operator = (const Sales_data & s) { //為什么我們的返回值一定是引用類型呢?這是因?yàn)槲覀兛梢赃M(jìn)行鏈?zhǔn)骄幊潭龅模簊1 = s2 =s3; bookNo = s.bookNo; units_sold = s.units_sold; revenue = s.revenue; return *this; } Sales_data::~Sales_data() { }
好了,我們定義拷貝賦值運(yùn)算符也是如此,我們就不一一贅述了。
我來在來談一談;類的構(gòu)造函數(shù)初始化和類的析構(gòu)函數(shù)銷毀過程的一些細(xì)節(jié)性問題。
1比如我們定義了一個(gè)構(gòu)造函數(shù),實(shí)際上在參數(shù)化賦值列表處及大括號(hào)之前,才是我們真正進(jìn)行初始化的地方,在大括號(hào)之中做的操作只是進(jìn)行了拷貝賦值操作。
這一點(diǎn)我們要清楚的認(rèn)識(shí)到,要不然在對(duì)const對(duì)象進(jìn)行初始化是就有問題了,因?yàn)閏onst對(duì)象只能初始化。
2比如我們定義了一個(gè)析構(gòu)函數(shù),注意了,我們?cè)冢ǎ?{之間的部分才是做了真正的類成員變量的析構(gòu)操作,{}里面使我們進(jìn)行的自定義操作,不一定是什么析構(gòu),應(yīng)為析構(gòu)基本已經(jīng)完成了。
如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
上一篇:C語言中判斷兩個(gè)IPv4地址是否屬于同一個(gè)子網(wǎng)的代碼
欄 目:C語言
本文標(biāo)題:C++ 中類的拷貝、賦值、銷毀的實(shí)例詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1153.html
您可能感興趣的文章
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10c語言求1+2+...+n的解決方法
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10c語言 跳臺(tái)階問題的解決方法


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子