c++特殊構(gòu)造函數(shù)詳解
前言
眾所周知,構(gòu)造函數(shù)的作用是類(lèi)在創(chuàng)建對(duì)象時(shí)的初始化,而拷貝構(gòu)造函數(shù)則是構(gòu)造函數(shù)里的一種特殊構(gòu)造。
拷貝構(gòu)造函數(shù)
拷貝構(gòu)造:是C++特有的,他是一種特殊的構(gòu)造函數(shù)
用于基于一個(gè)同一個(gè)類(lèi)的的第一個(gè)對(duì)象去創(chuàng)造和初始化的一個(gè)對(duì)象
第一的參數(shù)是本類(lèi)的對(duì)象的引用(const)
一、什么是拷貝構(gòu)造函數(shù)
一種特殊的構(gòu)造函數(shù),同一個(gè)類(lèi)的一個(gè)對(duì)象去創(chuàng)造或初始化一個(gè)對(duì)象
在沒(méi)寫(xiě)的時(shí)候,是默認(rèn)存在的,自己寫(xiě)了之后,系統(tǒng)默認(rèn)的就會(huì)消失(這一點(diǎn),就是構(gòu)造函數(shù))
拷貝構(gòu)造函數(shù)可以實(shí)現(xiàn):對(duì)象的復(fù)制
class Monster
{
public:
Monster(Monster& m) //拷貝構(gòu)造函數(shù)(默認(rèn)形態(tài))
{
//默認(rèn)的拷貝構(gòu)造函數(shù)(默認(rèn)形態(tài)),將對(duì)象一一對(duì)應(yīng)給值
cout << "默認(rèn)的拷貝構(gòu)造函數(shù)(默認(rèn)形態(tài)) " << endl;
this->hp = m.hp;
}
Monster(int hp); //構(gòu)造函數(shù)
~Monster(); //析構(gòu)函數(shù)
void show();
private:
int hp;
};
int main()
{
Monster monster1(100);
monster1.show();
Monster monster3 = monster1;//使用monster1給monster3初始化
monster3.show();
Monster monster4(monster1);//使用monster1去構(gòu)造monster4
monster4.show();
return 0;
}
Monster::Monster(int hp)
{
cout << "調(diào)用了帶參構(gòu)造函數(shù)" << endl;
this->hp = hp;
}
Monster::~Monster()
{
cout << "調(diào)用了析構(gòu)函數(shù)" << endl;
}
void Monster::show()
{
cout << "調(diào)用了顯示函數(shù)" << endl;
cout<<this->hp << "" << endl;
}二、調(diào)用時(shí)機(jī)
一、函數(shù)的參數(shù)是:“類(lèi)的對(duì)象”
二、函數(shù)的返回值是類(lèi)的對(duì)象
三、使用一的對(duì)象給另一個(gè)對(duì)象初始化
四、使用一個(gè)對(duì)象構(gòu)造另一個(gè)對(duì)象
注意
賦值不屬于拷貝構(gòu)造,所以不調(diào)用拷貝構(gòu)造函數(shù)
淺拷貝和深拷貝
淺拷貝就是默認(rèn)的拷貝構(gòu)造函數(shù),這個(gè)拷貝構(gòu)造的操作,我們可以理解為,是用‘=’號(hào)一個(gè)一個(gè)的賦值的,我們將之稱(chēng)為,淺拷貝,因?yàn)樵谟弥羔樀臅r(shí)候就可以能會(huì)出現(xiàn)問(wèn),因?yàn)槲覀冎纼蓚€(gè)同等類(lèi)型的指針之間用‘=’號(hào)賦值,是兩個(gè)指針的地址指向同一個(gè)內(nèi)存,那么就可能會(huì)存在一個(gè)問(wèn)題,就是兩個(gè)對(duì)象的指針都指向同一個(gè)內(nèi)存,那么如果其中一個(gè)對(duì)象把該內(nèi)存釋放了,就會(huì)導(dǎo)致另外一個(gè)對(duì)象的指針變成野指針。
為此,我們就需要進(jìn)行到深拷貝。
public:
int *p;
Rect();
~Rect();
int width;//寬
int height;//高
//重載拷貝構(gòu)造,實(shí)現(xiàn)淺拷貝拷貝
Rect(Rect&rect)
{
this->height = rect.height;
this->width = rect.width;
this->p=rect.p;
}public:
int *p;
Rect();
~Rect();
int width;//寬
int height;//高
//重載拷貝構(gòu)造,實(shí)現(xiàn)深拷貝
Rect(Rect&rect)
{
this->height = rect.height;
this->width = rect.width;
this->p = new int;//重新申請(qǐng)內(nèi)存
*p = *rect.p;//拷貝之前的值
}可見(jiàn),淺拷貝與深拷貝的差距就是前者是直接拷貝指針,讓兩個(gè)指針同時(shí)指向一個(gè)地址,這樣一方進(jìn)行析構(gòu)的時(shí)候,另一方就會(huì)成為野指針,而深拷貝就是避免了這一點(diǎn),申請(qǐng)一塊新內(nèi)存,并復(fù)制這塊內(nèi)存的數(shù)據(jù)。
總結(jié)
到此這篇關(guān)于c++特殊構(gòu)造函數(shù)詳解的文章就介紹到這了,更多相關(guān)c++特殊構(gòu)造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言驅(qū)動(dòng)開(kāi)發(fā)之內(nèi)核解鎖與強(qiáng)刪文件
在某些時(shí)候我們的系統(tǒng)中會(huì)出現(xiàn)一些無(wú)法被正常刪除的文件,如果想要強(qiáng)制刪除則需要在驅(qū)動(dòng)層面對(duì)其進(jìn)行解鎖后才可刪掉,本文為大家介紹了內(nèi)核解鎖與強(qiáng)刪文件的方法,希望對(duì)大家有所幫助2023-06-06
C語(yǔ)言入門(mén)篇--四大常量(字面,const修飾,宏,枚舉)及標(biāo)識(shí)符
本篇文章是c語(yǔ)言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說(shuō)明)請(qǐng)大家持續(xù)關(guān)注腳本之家2021-08-08
C語(yǔ)言項(xiàng)目小學(xué)生數(shù)學(xué)考試系統(tǒng)參考
今天小編就為大家分享一篇關(guān)于C語(yǔ)言項(xiàng)目小學(xué)生數(shù)學(xué)考試系統(tǒng)參考,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
C語(yǔ)言中循環(huán)語(yǔ)句練習(xí)實(shí)例
大家好,本篇文章主要講的是C語(yǔ)言中循環(huán)語(yǔ)句練習(xí)實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
探討:將兩個(gè)鏈表非降序合并為一個(gè)鏈表并依然有序的實(shí)現(xiàn)方法
本篇文章是對(duì)將兩個(gè)鏈表非降序合并為一個(gè)鏈表并依然有序的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語(yǔ)言實(shí)現(xiàn)修改文本文件中特定行的實(shí)現(xiàn)代碼
最近由于項(xiàng)目需要實(shí)現(xiàn)修改文件的功能,所以,博主認(rèn)真查閱了一些資料,但是,很遺憾,并沒(méi)有太多的收獲2013-06-06

