溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C++ 中類(lèi)的拷貝、賦值、銷(xiāo)毀如何實(shí)現(xiàn)

發(fā)布時(shí)間:2021-07-15 13:47:53 來(lái)源:億速云 閱讀:136 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“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è)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

c++
AI