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

首頁 > 編程 > C++ > 正文

C++ 中類的拷貝、賦值、銷毀的實例詳解

2020-01-26 13:54:09
字體:
供稿:網(wǎng)友

C++ 中類的拷貝、賦值、銷毀的實例詳解

本篇文章我們一共講解一下幾個知識點:

類的拷貝構(gòu)造函數(shù)。

類的拷貝賦值運算符。

類的析構(gòu)。

好了one by one

如果我們沒有定義類的拷貝構(gòu)造函數(shù)的話,那么編譯器會為我們合成默認(rèn)拷貝構(gòu)造函數(shù)----合成拷貝構(gòu)造函數(shù)。

和成拷貝構(gòu)造函數(shù)的操作是將其參數(shù)的各個成員拷貝到正在創(chuàng)建的對象中去,每個成員的類型決定了他是如何被拷貝的:對類類型的成員,會使用其拷貝構(gòu)造函數(shù),內(nèi)置類型的成員則是直接拷貝,雖然我們不能直接拷貝一個數(shù)組,但是合成拷貝構(gòu)造函數(shù)會逐個的拷貝一個數(shù)組類型的成員。

下面我們用代碼演示一下合成拷貝構(gòu)造函數(shù)的功能:

#include <iostream> using namespace std; /*   代碼模仿合成拷貝構(gòu)造函數(shù)的功能 */ class Sales_data { public:   Sales_data();   //我們只是為了讀者更好的理解還原了一下合成拷貝構(gòu)造函數(shù)所實現(xiàn)的功能,實際上我們是看不見的   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ù)表里面是一個靜態(tài)的引用:

1)我們不想改變該引用的值,只是用來進(jìn)行拷貝。

2)我們必須聲明為引用,如果寫成類的話,則又會調(diào)用該類的拷貝構(gòu)造函數(shù),在那個拷貝構(gòu)造函數(shù)中又會調(diào)用拷貝構(gòu)造函數(shù),這樣陷入死循環(huán)。

我們在來學(xué)習(xí)一下拷貝賦值運算符:

和拷貝構(gòu)造函數(shù)一樣,如果我們不定義拷貝賦值運算符的話,編譯器將會為我們合成一個,我們下面用代碼來模仿一下吧:

#include <iostream> using namespace std; /* 代碼模仿拷貝賦值運算符 */ class Sales_data { public:   Sales_data();   //拷貝賦值運算符的默認(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) { //為什么我們的返回值一定是引用類型呢?這是因為我們可以進(jìn)行鏈?zhǔn)骄幊潭龅模簊1 = s2 =s3;   bookNo = s.bookNo;   units_sold = s.units_sold;   revenue = s.revenue;   return *this; }  Sales_data::~Sales_data() { } 

好了,我們定義拷貝賦值運算符也是如此,我們就不一一贅述了。

我來在來談一談;類的構(gòu)造函數(shù)初始化和類的析構(gòu)函數(shù)銷毀過程的一些細(xì)節(jié)性問題。

1比如我們定義了一個構(gòu)造函數(shù),實際上在參數(shù)化賦值列表處及大括號之前,才是我們真正進(jìn)行初始化的地方,在大括號之中做的操作只是進(jìn)行了拷貝賦值操作。

這一點我們要清楚的認(rèn)識到,要不然在對const對象進(jìn)行初始化是就有問題了,因為const對象只能初始化。

2比如我們定義了一個析構(gòu)函數(shù),注意了,我們在() {之間的部分才是做了真正的類成員變量的析構(gòu)操作,{}里面使我們進(jìn)行的自定義操作,不一定是什么析構(gòu),應(yīng)為析構(gòu)基本已經(jīng)完成了。

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 石台县| 万盛区| 罗江县| 彝良县| 高雄县| 缙云县| 南康市| 阿拉善盟| 于都县| 年辖:市辖区| 鹰潭市| 宜州市| 万宁市| 赞皇县| 武清区| 贵定县| 陆丰市| 进贤县| 陵川县| 元谋县| 沛县| 宁陕县| 明水县| 佛山市| 墨竹工卡县| 溧水县| 龙游县| 咸阳市| 钟山县| 长阳| 老河口市| 绍兴县| 淮安市| 大宁县| 陆河县| 道真| 凤台县| 团风县| 高尔夫| 抚顺县| 嵊泗县|