您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“C++ 中類(lèi)的拷貝、賦值、銷(xiāo)毀如何實(shí)現(xiàn)”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C++ 中類(lèi)的拷貝、賦值、銷(xiāo)毀如何實(shí)現(xiàn)”這篇文章吧。
C++ 中類(lèi)的拷貝、賦值、銷(xiāo)毀的實(shí)例詳解
如果我們沒(méi)有定義類(lèi)的拷貝構(gòu)造函數(shù)的話(huà),那么編譯器會(huì)為我們合成默認(rèn)拷貝構(gòu)造函數(shù)----合成拷貝構(gòu)造函數(shù)。
和成拷貝構(gòu)造函數(shù)的操作是將其參數(shù)的各個(gè)成員拷貝到正在創(chuàng)建的對(duì)象中去,每個(gè)成員的類(lèi)型決定了他是如何被拷貝的:對(duì)類(lèi)類(lèi)型的成員,會(huì)使用其拷貝構(gòu)造函數(shù),內(nèi)置類(lèi)型的成員則是直接拷貝,雖然我們不能直接拷貝一個(gè)數(shù)組,但是合成拷貝構(gòu)造函數(shù)會(huì)逐個(gè)的拷貝一個(gè)數(shù)組類(lèi)型的成員。
下面我們用代碼演示一下合成拷貝構(gòu)造函數(shù)的功能:
#include <iostream> using namespace std; /* 代碼模仿合成拷貝構(gòu)造函數(shù)的功能 */ class Sales_data { public: Sales_data(); //我們只是為了讀者更好的理解還原了一下合成拷貝構(gòu)造函數(shù)所實(shí)現(xiàn)的功能,實(shí)際上我們是看不見(jià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ù)表里面是一個(gè)靜態(tài)的引用:
1)我們不想改變?cè)撘玫闹?,只是用?lái)進(jìn)行拷貝。
2)我們必須聲明為引用,如果寫(xiě)成類(lèi)的話(huà),則又會(huì)調(diào)用該類(lèi)的拷貝構(gòu)造函數(shù),在那個(gè)拷貝構(gòu)造函數(shù)中又會(huì)調(diào)用拷貝構(gòu)造函數(shù),這樣陷入死循環(huán)。
我們?cè)趤?lái)學(xué)習(xí)一下拷貝賦值運(yùn)算符:
和拷貝構(gòu)造函數(shù)一樣,如果我們不定義拷貝賦值運(yùn)算符的話(huà),編譯器將會(huì)為我們合成一個(gè),我們下面用代碼來(lái)模仿一下吧:
#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) { //為什么我們的返回值一定是引用類(lèi)型呢?這是因?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)算符也是如此,我們就不一一贅述了。
我來(lái)在來(lái)談一談;類(lèi)的構(gòu)造函數(shù)初始化和類(lèi)的析構(gòu)函數(shù)銷(xiāo)毀過(guò)程的一些細(xì)節(jié)性問(wèn)題。
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)行初始化是就有問(wèn)題了,因?yàn)閏onst對(duì)象只能初始化。
2比如我們定義了一個(gè)析構(gòu)函數(shù),注意了,我們?cè)冢ǎ?{之間的部分才是做了真正的類(lèi)成員變量的析構(gòu)操作,{}里面使我們進(jìn)行的自定義操作,不一定是什么析構(gòu),應(yīng)為析構(gòu)基本已經(jīng)完成了。
以上是“C++ 中類(lèi)的拷貝、賦值、銷(xiāo)毀如何實(shí)現(xiàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。