一起來學(xué)習(xí)C++的構(gòu)造和析構(gòu)_第1頁
一起來學(xué)習(xí)C++的構(gòu)造和析構(gòu)_第2頁
一起來學(xué)習(xí)C++的構(gòu)造和析構(gòu)_第3頁
一起來學(xué)習(xí)C++的構(gòu)造和析構(gòu)_第4頁
一起來學(xué)習(xí)C++的構(gòu)造和析構(gòu)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論