C++ 中類的拷貝、賦值、銷毀的實(shí)例詳解
C++ 中類的拷貝、賦值、銷毀的實(shí)例詳解
本篇文章我們一共講解一下幾個(gè)知識(shí)點(diǎn):
類的拷貝構(gòu)造函數(shù)。
類的拷貝賦值運(yùn)算符。
類的析構(gòu)。
好了one by one
如果我們沒(méi)有定義類的拷貝構(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í)際上我們是看不見(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ě)成類的話,則又會(huì)調(diào)用該類的拷貝構(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ì)為我們合成一個(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) { //為什么我們的返回值一定是引用類型呢?這是因?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)談一談;類的構(gòu)造函數(shù)初始化和類的析構(gòu)函數(shù)銷毀過(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è)冢ǎ?{之間的部分才是做了真正的類成員變量的析構(gòu)操作,{}里面使我們進(jìn)行的自定義操作,不一定是什么析構(gòu),應(yīng)為析構(gòu)基本已經(jīng)完成了。
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- c++中深淺拷貝以及寫(xiě)時(shí)拷貝的實(shí)現(xiàn)示例代碼
- 深入理解C/C++中的寫(xiě)時(shí)拷貝
- 詳解C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn)
- 詳解C++中String類模擬實(shí)現(xiàn)以及深拷貝淺拷貝
- 詳解C++ 編寫(xiě)String 的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)
- C/C++ 淺拷貝和深拷貝的實(shí)例詳解
- C++基礎(chǔ)教程之指針拷貝詳解
- C++寫(xiě)時(shí)拷貝實(shí)現(xiàn)原理及實(shí)例解析
相關(guān)文章
C++實(shí)現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)為其它進(jìn)制數(shù)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)為其它進(jìn)制數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C語(yǔ)言數(shù)組實(shí)現(xiàn)掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
嵌入式C語(yǔ)言查表法在項(xiàng)目中的應(yīng)用
今天小編就為大家分享一篇關(guān)于嵌入式C語(yǔ)言查表法在項(xiàng)目中的應(yīng)用,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法
MAC地址(Media Access Control address),又稱為物理地址或硬件地址,是網(wǎng)絡(luò)適配器(網(wǎng)卡)在制造時(shí)被分配的全球唯一的48位地址,通過(guò)獲取MAC地址可以判斷當(dāng)前主機(jī)的唯一性可以與IP地址綁定并實(shí)現(xiàn)網(wǎng)絡(luò)準(zhǔn)入控制,本文給大家介紹了使用C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法2023-11-11
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單學(xué)生學(xué)籍管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

