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

