版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第一起來學(xué)習(xí)C++的構(gòu)造和析構(gòu)目錄1.構(gòu)造函數(shù)1.1構(gòu)造函數(shù)長什么樣子1.2構(gòu)造函數(shù)干嘛的1.3思考2.析構(gòu)函數(shù)2.1析構(gòu)函數(shù)長什么樣子2.2析構(gòu)函數(shù)用來干嘛(什么時(shí)候需要自己手動寫析構(gòu)函數(shù))3.拷貝構(gòu)造函數(shù)問題4.深淺拷貝(1)淺拷貝:默認(rèn)的拷貝構(gòu)造叫做淺拷貝(2)深拷貝:拷貝構(gòu)造函數(shù)中做了new內(nèi)存操作,并且做拷貝賦值的操作5.構(gòu)造和析構(gòu)順序問題6.C++結(jié)構(gòu)體答疑:總結(jié)
1.構(gòu)造函數(shù)
1.1構(gòu)造函數(shù)長什么樣子
(1)函數(shù)名和類名相同
(2)沒有返回值
(3)如果不寫構(gòu)造函數(shù),任何類中都存在一個(gè)默認(rèn)的構(gòu)造函數(shù)
I默認(rèn)的構(gòu)造函數(shù)是無參的
II當(dāng)我們自己寫了構(gòu)造函數(shù),默認(rèn)的構(gòu)造函數(shù)就不存在
(4)構(gòu)造函數(shù)在構(gòu)造對象的時(shí)候調(diào)用
(5)delete可以用來刪掉默認(rèn)的函數(shù)
(6)指定使用默認(rèn)的無參構(gòu)造函數(shù),用default說明
(7)允許構(gòu)造函數(shù)調(diào)用另一個(gè)構(gòu)造函數(shù),只是要用初始化參數(shù)列表的寫法
(8)初始化參數(shù)列表:只有構(gòu)造函數(shù)有
I構(gòu)造函數(shù)名(參數(shù)1,參數(shù)2,):成員1(參數(shù)1),成員2(參數(shù)2),{}
II避免形參名和數(shù)據(jù)成員名相同的導(dǎo)致問題
1.2構(gòu)造函數(shù)干嘛的
(1)構(gòu)造函數(shù)用來構(gòu)造對象
(2)構(gòu)造函數(shù)更多是用來初始化數(shù)據(jù)成員
1.3思考
(1)為什么不寫構(gòu)造函數(shù)可以構(gòu)造對象是因?yàn)榇嬖谝粋€(gè)默認(rèn)的無參構(gòu)造函數(shù),所以可以構(gòu)造無參對象
(2)構(gòu)造函數(shù)重載為了什么為了構(gòu)造不同長相的對象。
#includeiostream
usingnamespacestd;
classMM
public:
//MM()=delete;刪掉默認(rèn)的構(gòu)造函數(shù)
MM(stringmmName,intmmAge)
name=mmName;
age=mmAge;
cout"帶參構(gòu)造函數(shù)"endl;
//MM()
//cout"無參構(gòu)造函數(shù)"endl;
MM()=default;//使用的是默認(rèn)無參構(gòu)造函數(shù)
voidprint()
coutname""ageendl;
protected:
stringname="Lisa";
intage=18;
//為了能夠構(gòu)造不同長相的對象,我們會給構(gòu)造函數(shù)缺省處理
classBoy
public:
//Boy(stringmname="",intmage=19)
//name=mname;
//age=mage;
//上面函數(shù)等效可以實(shí)現(xiàn)下面三個(gè)函數(shù)的功能
Boy(){}
Boy(stringmName){name=mName;}
//出錯(cuò):沒有與之匹配的構(gòu)造函數(shù)
Boy(stringmName,intmage){name=mName;age=mage;}
protected:
stringname;
intage;
//初始化參數(shù)列表的寫法
stringgirlName="Baby";
classStudent
public:
Student(stringmname="",intmage=18):name(mname),age(mage)
cout"初始化參數(shù)列表"endl;
//繼承和類的組合必須采用初始化參數(shù)列表寫法
Student(intmage):name(girlName),age(mage){}
protected:
stringname;
intage;
//構(gòu)造函數(shù)可以調(diào)用另一個(gè)構(gòu)造函數(shù)初始化數(shù)據(jù)
classTT
public:
TT(stringname,intage):name(name),age(age){}
//委托構(gòu)造:允許構(gòu)造函數(shù)調(diào)用另一個(gè)構(gòu)造函數(shù)
TT():TT("默認(rèn)",18){}//沒有給數(shù)據(jù)初始化
voidprint()
coutname"\t"ageendl;
protected:
stringname;
intage;
intmain()
//MMmm;構(gòu)造無參的對象,需要無參構(gòu)造函數(shù)
MMmm("mm",28);
mm.print();
MMgirl;
girl.print();
Boyboy1;
Boyboy2("流浪之子");
Boyboy3("王子",18);
TTtt;
tt.print();
return0;
2.析構(gòu)函數(shù)
2.1析構(gòu)函數(shù)長什么樣子
(1)無返回值
(2)無參數(shù)
(3)函數(shù)名:~類名
(4)不寫的話會存在默認(rèn)的析構(gòu)函數(shù)
(5)析構(gòu)函數(shù)不需要自己調(diào)用,對象死亡的之前會調(diào)用析構(gòu)函數(shù)
2.2析構(gòu)函數(shù)用來干嘛(什么時(shí)候需要自己手動寫析構(gòu)函數(shù))
(1)當(dāng)類中的數(shù)據(jù)成員是指針,并且動態(tài)申請內(nèi)存就需要手寫析構(gòu)
(2)析構(gòu)函數(shù)用來釋放數(shù)據(jù)成員申請動態(tài)內(nèi)存
3.拷貝構(gòu)造函數(shù)
-拷貝構(gòu)造函數(shù)也是構(gòu)造函數(shù),長相和構(gòu)造函數(shù)一樣的,只是參數(shù)是固定.拷貝構(gòu)造函數(shù)唯一的參數(shù)是對對象引用
-不寫拷貝構(gòu)造函數(shù),也存在一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)
-拷貝構(gòu)造函數(shù)作用:通過一個(gè)對象去初始化另一個(gè)對象
問題
I什么時(shí)候調(diào)用拷貝構(gòu)造
答:當(dāng)通過一個(gè)對象去創(chuàng)建出來另一個(gè)新的對象時(shí)候需要調(diào)用拷貝
II拷貝構(gòu)造什么時(shí)候需要加const修飾參數(shù)?
答:當(dāng)存在匿名對象賦值操作的時(shí)候,必須要const修飾
#includeiostream
#includestring
usingnamespacestd;
classMM
public:
MM()=default;
MM(stringname,intage):name(name),age(age){}
voidprint()
coutname"\t"ageendl;
//拷貝構(gòu)造
MM(constMMmm)//MMgirl(mm);
name=;//=
age=mm.age;//girl.age=mm.age
cout"拷貝構(gòu)造"endl;
protected:
stringname;
intage;
voidprintData(MMmm)//MMmm=實(shí)參;
mm.print();
voidprintData2(MMmm)//不存在拷貝本
mm.print();
intmain()
MMmm("mm",18);
mm.print();
//顯示調(diào)用調(diào)用
cout"顯示調(diào)用調(diào)用"endl;
MMgirl(mm);//通過一個(gè)對象創(chuàng)建另一個(gè)對象
girl.print();
//隱式調(diào)用
cout"隱式調(diào)用"endl;
MMgirl2=mm;//拷貝構(gòu)造
girl2.print();
MMgirl3;
girl3=mm;//運(yùn)算符重載
girl3.print();
//函數(shù)傳參
cout"第一種調(diào)用形態(tài)"endl;
printData(mm);
cout"第二種調(diào)用形態(tài)"endl;
printData2(mm);
//無名對象匿名對象
MMtemp;
temp=MM("匿名",18);
temp.print();
//匿名對象創(chuàng)建對象時(shí)候,拷貝構(gòu)造一定要用const修飾
MMtemp2=MM("匿名",199);
return0;
4.深淺拷貝
(1)淺拷貝:默認(rèn)的拷貝構(gòu)造叫做淺拷貝
(2)深拷貝:拷貝構(gòu)造函數(shù)中做了new內(nèi)存操作,并且做拷貝賦值的操作
#includeiostream
#includecstring
#includestring
usingnamespacestd;
classMM
public:
MM(constchar*mname,intage):age(age)
name=newchar[strlen(mname)+1];
strcpy_s(name,strlen(mname)+1,mname);
voidprint()
coutname"\t"ageendl;
MM(constMMobject)
//name=;
name=newchar[strlen()+1];
strcpy_s(name,strlen()+1,);
//name=;
age=object.age;
~MM()
delete[]name;
protected:
char*name;
intage;
intmain()
MMmm("baby",19);
MMgirl(mm);
MMgm=mm;
mm.print();
girl.print();
gm.print();
return0;
5.構(gòu)造和析構(gòu)順序問題
(1)普通對象,構(gòu)造順序和析構(gòu)順序是相反
(2)new出來的對象,delete會直接調(diào)用析構(gòu)函數(shù)
(3)static對象,當(dāng)程序關(guān)閉的時(shí)候,生命周期才結(jié)束,所以是最后釋放
#includeiostream
#includestring
usingnamespacestd;
classMM
public:
MM(stringname="x"):name(name){
coutname;
~MM(){
coutname;
protected:
stringname;
intmain()
MMmm1("A");//A
staticMMmm2("B");//B程序關(guān)閉時(shí)候才死亡,最后析構(gòu)
MM*p3=newMM("C");//C
MMmm4[4];//xxxx
deletep3;//Cdelete直接調(diào)用析構(gòu)
p3=nullptr;
//xxxxAB
//ABCxxxxCxxxxAB
return0;
6.C++結(jié)構(gòu)體
#includeiostream
#includestring
usingnamespacestd;
structMM
//默認(rèn)為公有屬性
//類中默認(rèn)屬性是私有屬性
//protected:
stringname;
intage;
public:
MM(stringname):name(name)
cout"構(gòu)造函數(shù)"endl;
MM(constMMobject)
name=;
age=object.age;
cout"拷貝構(gòu)造"endl;
~MM()
intmain()
//采用創(chuàng)建時(shí)候賦值的方式,也是調(diào)用構(gòu)造函數(shù)
//MMobject={"lisa",19};錯(cuò)誤,因?yàn)闆]有兩個(gè)參數(shù)的構(gòu)造函數(shù)
MMobject={"lisa"};
cout"\t"object.ageendl;
//C++結(jié)構(gòu)體一旦寫了構(gòu)造函數(shù),就必須按照C++類的方式的去用
MMmm(object);
cout"\t"mm.ageendl;
return0;
答疑:
為什么要手動寫析構(gòu)函數(shù)因?yàn)槟J(rèn)的不會釋放數(shù)據(jù)成員動態(tài)申請的內(nèi)存函數(shù)名和類型相同函數(shù)叫做
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全標(biāo)準(zhǔn)化生產(chǎn)責(zé)任制度
- 生產(chǎn)安全考核與獎勵(lì)制度
- 生產(chǎn)車輛全過程管理制度
- 生產(chǎn)場所巡檢制度范本
- 企業(yè)生產(chǎn)檔案管理制度
- 生產(chǎn)副班長生產(chǎn)管理制度
- 2026重慶市涪陵區(qū)武陵山鎮(zhèn)人民政府招聘公益性崗位1人參考考試題庫附答案解析
- 生產(chǎn)車間防蠅蟲制度
- 生產(chǎn)函數(shù)與科學(xué)制度
- 先進(jìn)生產(chǎn)班組管理制度
- 腎囊腫護(hù)理查房要點(diǎn)
- 2025年掛面制造行業(yè)研究報(bào)告及未來發(fā)展趨勢預(yù)測
- 7.1《集體生活成就我》課件 2025-2026道德與法治七年級上冊 統(tǒng)編版
- 艾媒咨詢2025年中國新式茶飲大數(shù)據(jù)研究及消費(fèi)行為調(diào)查數(shù)據(jù)
- 遼寧省錦州市2024-2025學(xué)年八年級下學(xué)期期末物理試題(含答案)
- 頂管施工臨時(shí)用電方案
- 廣東省惠州市高三上學(xué)期第一次調(diào)研考英語試題-1
- 瀘州老窖釀酒有限責(zé)任公司釀酒廢棄物熱化學(xué)能源化與資源化耦合利用技術(shù)環(huán)評報(bào)告
- 單位微信群規(guī)定管理制度
- 公司人員服從管理制度
- 床上護(hù)理洗頭課件
評論
0/150
提交評論