第三章關(guān)于類和對(duì)象_第1頁(yè)
第三章關(guān)于類和對(duì)象_第2頁(yè)
第三章關(guān)于類和對(duì)象_第3頁(yè)
第三章關(guān)于類和對(duì)象_第4頁(yè)
第三章關(guān)于類和對(duì)象_第5頁(yè)
已閱讀5頁(yè),還剩140頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第3章關(guān)于類和對(duì)象的進(jìn)一步討論

3.1構(gòu)造函數(shù)

3.2析構(gòu)函數(shù)

3.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序

3.4對(duì)象數(shù)組

3.5對(duì)象指針

3.6共用數(shù)據(jù)的保護(hù)

3.7對(duì)象的動(dòng)態(tài)建立和釋放

3.8對(duì)象的賦值和復(fù)制

3.9靜態(tài)成員

3.10友元

3.H類模板

1/145

3.1構(gòu)造函數(shù)(constructor:ctor)

如果定義一個(gè)變量,而程序未對(duì)其進(jìn)行初始化的話,這個(gè)

變量的值是不確定的,因?yàn)閏和C++不會(huì)自覺(jué)地去為它賦

值。與此相似,如果定義一個(gè)對(duì)象,而程序未對(duì)其數(shù)據(jù)成

員進(jìn)行初始化的話,這個(gè)對(duì)象的值也是不確定的。

3.1.1對(duì)象的初始化

3.1.2構(gòu)造函數(shù)的作用

3.1.3帶參數(shù)的構(gòu)造函數(shù)

3.1.4用參數(shù)初始化表初始化數(shù)據(jù)成員

3.1.5構(gòu)造函數(shù)的重載

3.1.6使用默認(rèn)參數(shù)的構(gòu)造函數(shù)左0

#S

8Er小

2/145r?

:

311對(duì)象的初始化

?因?yàn)轭愂且环N類型,是創(chuàng)建對(duì)象的藍(lán)圖,系統(tǒng)不會(huì)為它分

配內(nèi)存空間。

?所以在定義類時(shí),不能給數(shù)據(jù)成員賦初值,要在建立對(duì)象

時(shí),給數(shù)據(jù)成員賦初值。否則對(duì)象的狀態(tài)是不確定的。

如果類單輸音纏成員是公有的,可以在定義對(duì)象時(shí)對(duì)

其數(shù)據(jù)嫡初始化。

例如:inthour;

intminute;在一個(gè)大括號(hào)內(nèi)順序列出各個(gè)公有

數(shù)據(jù)成員的值,在兩個(gè)值之間用逗

intsec;號(hào)分隔。注意這只能用于數(shù)據(jù)成員

都是公有的情況。

);

Timetl{15,36,26);

3/145

z\在前面的例子里,是用成員函數(shù)對(duì)對(duì)象的數(shù)據(jù)成員賦初值,

V如果一個(gè)類定義了多個(gè)對(duì)象,對(duì)每個(gè)對(duì)象都要調(diào)用成員函

數(shù)對(duì)數(shù)據(jù)成員賦初值,那么程序就會(huì)變得煩瑣,所以用成

員函數(shù)為數(shù)據(jù)成員賦初值絕不是一人好方法。按理說(shuō)對(duì)象

的創(chuàng)建跟上帝造萬(wàn)物一樣,萬(wàn)物誕生的時(shí)候都是有各自的

特征的。對(duì)象的初始屬性應(yīng)該是與生俱來(lái)的才是最自然的。

4/145

312構(gòu)造函數(shù)的作用

C++提供了構(gòu)造函數(shù)機(jī)制,用來(lái)為對(duì)象的數(shù)據(jù)成員進(jìn)

行初始化。在前面一直未提及這個(gè)概念,其實(shí)如果你未

設(shè)計(jì)構(gòu)造函數(shù),系統(tǒng)在創(chuàng)建對(duì)象時(shí),會(huì)自動(dòng)提供一個(gè)默

認(rèn)的構(gòu)造函數(shù),什么也不做。

構(gòu)造函數(shù)用于為對(duì)象初始化,它屬于某一個(gè)類,可以由系

統(tǒng)自動(dòng)生成。也可以由程序員編寫,程序員根據(jù)初始化的

要求設(shè)計(jì)構(gòu)造函數(shù)及函數(shù)參數(shù)。

構(gòu)造函數(shù)是一種特殊的成員函數(shù),在程序中不需要寫調(diào)用

語(yǔ)句,在系統(tǒng)建立對(duì)象時(shí)由系統(tǒng)自覺(jué)調(diào)用執(zhí)行。

5/145

構(gòu)造函數(shù)的特點(diǎn):

(1)構(gòu)造函數(shù)的名字與它的類名必須相同。

(2)它沒(méi)有類型,也不返回值

(3)它可以帶參數(shù),也可以不帶參數(shù)。

6/145

例3.1在例2.3的基礎(chǔ)上定義構(gòu)造成員函數(shù)

ttinclude<iostream>voidTime::set_time()

usingnamespacestd;

{cin>>hour;

classTime

cin>>minute;

(public:

Time()cin>>sec;

{hour=0;)

minute=0;

sec=0;

voidTime::show_time()

}

{

voidset_time();

voidshow_time();cout<<hour<<zz:〃:〃

private:<<sec<<endl;

inthour;

intminute;

intsec;

);

7/145

intmain()

在類Time中定義了構(gòu)造函數(shù)

Time,它與所在的類同名。

Timetl;在建立對(duì)象時(shí)自動(dòng)執(zhí)行構(gòu)造

tl.set_time();函數(shù),該函數(shù)的作用是為對(duì)

象中的各個(gè)數(shù)據(jù)成員賦初值

tl.show_time();

0o注意只有執(zhí)行構(gòu)造函數(shù)

Timet2;時(shí)才為數(shù)據(jù)成員賦初值。

t2.show_time();

return0;

8/145

程序運(yùn)行的情況為:

102554

10:25:54〃輸出tl的值

0:0:0//輸出t2的值

也可以在類內(nèi)聲明構(gòu)造函數(shù)然后在類外定義構(gòu)造函數(shù)。將

程序修改為:

Time();〃類內(nèi)聲明

然后在類外定義構(gòu)造函數(shù):

Time::Time()〃類外定義

{hour=0;

minute=0;

sec=0;

}9/145

1)關(guān)于構(gòu)造函數(shù)的使用

7

(1)什么時(shí)候調(diào)用構(gòu)造函數(shù)呢?當(dāng)函數(shù)執(zhí)行到對(duì)象401

句時(shí)建立對(duì)象,此時(shí)就要調(diào)用構(gòu)造函數(shù),對(duì)象就有了自己

的作用域,對(duì)象的生命周期開始了。

(2)構(gòu)造函數(shù)沒(méi)有返回值,因此不需要在定義中聲明類型。

(3)構(gòu)造函數(shù)不需要顯式地調(diào)用,構(gòu)造函數(shù)是在建立對(duì)象

日寸由系統(tǒng)自動(dòng)執(zhí)行的,且只執(zhí)行一次。構(gòu)造函數(shù)一般定義

為public。

(4)在構(gòu)造函數(shù)中除了可以對(duì)數(shù)據(jù)成員賦初值,還可以使

用其他語(yǔ)句。

(5)如果用戶沒(méi)有定義構(gòu)造函數(shù),C++系統(tǒng)會(huì)自動(dòng)生成一

個(gè)構(gòu)造函數(shù),而這個(gè)函數(shù)體是空的,不執(zhí)行初始化操作。

10/145

313帶形參數(shù)的構(gòu)造函數(shù)

可以采用帶參數(shù)的構(gòu)造函數(shù),使得對(duì)象取得初始確定值。

構(gòu)造函數(shù)格式:

構(gòu)造函數(shù)名(類型形參1,類型形參2,…)

Time(inth,intm,ints)

{hour=h;

minute二m;

sec二s;

}

在定義對(duì)象時(shí)指定實(shí)參,定義對(duì)象的格式為:

類名對(duì)象名(實(shí)參1,實(shí)參2,…);

Timetl(12,30,3禽45

例3.2有兩個(gè)長(zhǎng)方柱,其長(zhǎng)、寬、高分別為:

(1)12z25z30

(2)15z30z21

編寫程序,在類中用帶參數(shù)的構(gòu)造函數(shù),計(jì)算它們的體積。

分析:可以在類中定義一個(gè)計(jì)算長(zhǎng)方體體積的成員函數(shù)計(jì)

算對(duì)象的體積。

H

12/145

ttinclude<iostream>〃長(zhǎng)方體構(gòu)造函數(shù)

usingnamespacestd;Box::Box(inth,intw,intlen)

classBox{height=h;

{public:width=w;

Box(int,int,int);length=len;

intvolume();

//計(jì)算長(zhǎng)方體的體積

private:

intBox::volume()

intheight;

intwidth;return(height^width*length);

intlength;

);

13/145

intmain()

Boxboxl(12,25,30);//定義對(duì)象boxl

cout〈〈〃boxl體積=〃〈〈boxl.volume()<<endl;

Boxbox2(15,30,21);//定義對(duì)象box2

cout<<〃box2體積=〃〈〈box2.volume()<<endl;

return0;

}____________________________________________

O提醒:

(1)帶形參的構(gòu)造函數(shù)在定義對(duì)象時(shí)必須指定實(shí)參

(2)用這種方法可以實(shí)現(xiàn)不同對(duì)象的不同的初始化。

14/145

Note

314用參數(shù)初始化表對(duì)數(shù)據(jù)成員初始化

C++提供了參數(shù)初始化表的方法對(duì)數(shù)據(jù)成員初始化。這種方法不必在構(gòu)

造函數(shù)內(nèi)對(duì)數(shù)據(jù)成員初始化,在函數(shù)的首部就能實(shí)現(xiàn)數(shù)據(jù)成員初始化。

函數(shù)名(類型1形參1,類型2形參2):成員名1(形參1),成員名2(形參2)

{}〃函數(shù)體可以為空。

Time(inth,intm,ints):hour(h),minute(m),sec(s)

功能:執(zhí)行構(gòu)造函數(shù)時(shí),將形參1的值賦予成員1,將形參2的值賦予成

員2,形參的值由定義對(duì)象時(shí)的提供的實(shí)參值決定。

此時(shí)定義對(duì)象的格式依然是帶實(shí)參的形式:

類名對(duì)象名(實(shí)參1,實(shí)參2);

Timetl(8,7,6);

15/145

:

例:定義帶形參初始化表的構(gòu)造函數(shù)

Box::Box(inth,intw,intlen):height(h),

width(w),length(len){}||

冒號(hào)作為分隔符

定義對(duì)象:

Boxboxl(12,25,30);|

...逗號(hào)分隔的初始化列表

Boxbox2(15,30,21);

16/145

315構(gòu)造函數(shù)的重載

構(gòu)造函數(shù)也可以重載。一個(gè)類可以有多個(gè)同名構(gòu)造函數(shù),

函數(shù)參數(shù)的個(gè)數(shù)、參數(shù)的類型各不相同。

例3.3:在例3.2的基礎(chǔ)上定義兩個(gè)構(gòu)造函數(shù)其中一個(gè)無(wú)參

數(shù),另一個(gè)有參數(shù)。

17/145

ttinclude<iostream>

usingnamespacestd;

classBox

{public:

Box();x.

Box(inth,,intlen)height(h),

width(w),length(leSl{}

intvolume();

private:\

intheight;\Box::Box()

intwidth;\{height=10;

}intBox::volume()

intlength;\wliedntght=h1=01;0;

{return(height*width*length);

);

I18)145

intmain()

Boxboxl;

cout<<z/boxl體積二〃<<boxl.volume()<<endl;

Boxbox2(15,30,25);

cout<<zzbox2體積二〃<<box2.volume()<<endl;

return0;

例子中定義了兩個(gè)構(gòu)造函數(shù),一個(gè)無(wú)參數(shù)另一個(gè)帶三個(gè)參

數(shù)。系統(tǒng)根據(jù)對(duì)象定義的形式?jīng)Q定調(diào)用哪個(gè)構(gòu)造函數(shù)。

對(duì)象boxl沒(méi)有實(shí)參,系統(tǒng)調(diào)用無(wú)參數(shù)的構(gòu)造函數(shù);對(duì)象box2

帶三個(gè)實(shí)參,系統(tǒng)調(diào)用帶形參的構(gòu)造函數(shù)。

說(shuō)明:

_(1)不帶形參的構(gòu)造函數(shù)為默認(rèn)構(gòu)造函數(shù),每個(gè)類只有一

一個(gè)默認(rèn)構(gòu)造函數(shù),如果只定義無(wú)參對(duì)象,則系統(tǒng)自動(dòng)提供

空白構(gòu)造函數(shù)。如果既有無(wú)參對(duì)象也有帶參對(duì)象,必須人

為定義一個(gè)無(wú)參構(gòu)造函數(shù)。

(2)雖然每個(gè)類可以包含多個(gè)構(gòu)造函數(shù),但是創(chuàng)建對(duì)象時(shí),

系統(tǒng)僅執(zhí)行其中一個(gè)。

20/145

316使用默認(rèn)參數(shù)值的構(gòu)造函數(shù)

?C++允許在構(gòu)造函數(shù)里為形參指定默認(rèn)值,如果創(chuàng)建對(duì)象時(shí),

未給出相應(yīng)的實(shí)參時(shí),系統(tǒng)將用形參的默認(rèn)值為形參賦值。

格式:

函數(shù)名(類型形參上常數(shù),類型形參2二常數(shù),…);

例3.4:將例3.3中的構(gòu)造函數(shù)改用帶默認(rèn)值的參數(shù),長(zhǎng)、寬、

高的默認(rèn)值都是10。

21/145

ttinclude<iostream>

usingnamespacestd;

classBox

(public:

Box(intw=10,inth=10,intlen=10);

intvolume();

private:

intheight;

intwidth;

intlength;

);

22/145

Box::Box(intw,inth,intlen)

{height=h;

width=w;

length=len;

}

intBox::volume()

{return(height*width*length)

23/145

intmain()

(

Boxboxl;

cout<<z/boxl體積=z,<<boxl.volume()<<endl;

Boxbox2(15);

cout<<z/box2體積zz<<box2.volume()<<endl;

Boxbox3(15,30);

cout<<z/box3體積zz<<box3.volume()<<endl;

Boxbox4(15,30,20);

cout<<z/box4體積〃〈〈box4.volume()<<endl;

return0;

24/145

程序運(yùn)行結(jié)果為:

boxl體積=1000

box2體積=1500

box3體積=4500

box4體積二9000

構(gòu)造函數(shù)也可以改寫成帶參數(shù)初始化表的形式:

Box::Box(inth,intw,intlen):height(h),

width(w),length(len){}

整個(gè)函數(shù)只需一行,簡(jiǎn)單方便。

25/145

在構(gòu)造函數(shù)中使用默認(rèn)參數(shù)提供了建立對(duì)象的多種選擇,

它的作用相當(dāng)于多個(gè)重載構(gòu)造函數(shù)。

說(shuō)明:

(1)如果在類外定義構(gòu)造函數(shù),應(yīng)該在聲明構(gòu)造函數(shù)時(shí)指

足默認(rèn)參數(shù)值,在定義函數(shù)時(shí)可以不再指定默認(rèn)參數(shù)值。

在相反情況下,如果定義了無(wú)參對(duì)象,則編譯器報(bào)錯(cuò):沒(méi)

有合適的構(gòu)造函數(shù)。

(2)在聲明構(gòu)造函數(shù)時(shí),形參名可以省略例如:

Box(int=10,int=10,int=10);

等號(hào)不可省略。、

26/145

(3)如果構(gòu)造函數(shù)的所有形參都指定了默認(rèn)值,在定義對(duì)

象時(shí),可以指定實(shí)參也可不指定實(shí)參。由于不指定實(shí)參也

可以調(diào)用構(gòu)造函數(shù),因此全部形參都指定了默認(rèn)值的構(gòu)造

函數(shù)也屬于默認(rèn)構(gòu)造函數(shù)。為了避免歧義,不允許同時(shí)定

義不帶形參的構(gòu)造函數(shù)和全部形參都指定默認(rèn)值的構(gòu)造函

數(shù)。

(4)同樣為了避免歧義性,如定義了全部形參帶默認(rèn)值的

構(gòu)造函數(shù)后,不能再定義重載構(gòu)造函數(shù)。反之亦然。

27/145

Box(int=10,int=10,int=10);

Box();

Box(int,int);

若定義對(duì)象:

Boxboxl;

Boxbox2(15,30);

這時(shí)應(yīng)該調(diào)用哪個(gè)構(gòu)造函數(shù)呢?J

如果構(gòu)造函數(shù)中參數(shù)并非都帶默認(rèn)值時(shí),要具體分析情況。

如有以下三個(gè)原型聲明:

28/145

Box();

Box(int,int=10,int=10);

Box(int,int);

若定義對(duì)象:

Boxboxl;〃正確,調(diào)用第一個(gè)

Boxbox2(15);//調(diào)用第二個(gè)

Boxbox3(15,30);//不知調(diào)用哪一個(gè)

因此不要同時(shí)使用重載構(gòu)造函數(shù)和帶默認(rèn)值的構(gòu)造函數(shù)。

n

29/145W

3.1構(gòu)造函數(shù)

3.2析構(gòu)函數(shù)

3.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序

3.4對(duì)象數(shù)組

3.5對(duì)象指針

3.6共用數(shù)據(jù)的保護(hù)

3.7對(duì)象的動(dòng)態(tài)建立和釋放

3.8對(duì)象的賦值和復(fù)制

3.9靜態(tài)成員

3.10友元U

3.11類模板.

30/145S

3.2析構(gòu)函數(shù)(destructor:dtor)

析構(gòu)函數(shù)也是個(gè)特殊的成員函數(shù),它的作用與構(gòu)造函數(shù)相

反,當(dāng)對(duì)象的生命周期結(jié)束時(shí),系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù),

收回對(duì)象占用的內(nèi)存空間。

執(zhí)行析構(gòu)函數(shù)的時(shí)機(jī):

①在一個(gè)函數(shù)內(nèi)定義的對(duì)象,當(dāng)這個(gè)函數(shù)結(jié)束時(shí),自動(dòng)執(zhí)行

析構(gòu)函數(shù)釋放對(duì)象。

②static局部對(duì)象要到main函數(shù)結(jié)束或執(zhí)行exit命令時(shí)才

自動(dòng)執(zhí)行析構(gòu)函數(shù)釋放對(duì)象。

③全局對(duì)象(在函數(shù)外定義的對(duì)象)當(dāng)main函數(shù)結(jié)束或執(zhí)

行exit命令時(shí)自動(dòng)執(zhí)行析構(gòu)函數(shù)釋放對(duì)象。

④如果用new建立動(dòng)態(tài)對(duì)象,用delete時(shí)自動(dòng)執(zhí)行析構(gòu)函數(shù)

釋放對(duì)象。

31/145

析構(gòu)函數(shù)的特征

①析構(gòu)函數(shù)名以符號(hào)開始后跟類名

②析構(gòu)函數(shù)沒(méi)有數(shù)據(jù)類型、返回值、形參。由于沒(méi)有形參

所以析構(gòu)函數(shù)不能重載。一個(gè)類只有一個(gè)析構(gòu)函數(shù)。

③如果程序員沒(méi)有定義析構(gòu)函數(shù),C++編譯系統(tǒng)會(huì)自動(dòng)生成

一個(gè)析構(gòu)函數(shù)。

析構(gòu)函數(shù)除了釋放對(duì)象(資源)外,還可以執(zhí)行程序員在

最后一次使用對(duì)象后希望執(zhí)行的任何操作。例如輸出有關(guān)

的信息。

32/145

例3.5包含構(gòu)造函數(shù)和析構(gòu)函數(shù)的C++程序

ttinclude<iostream>

ttinclude<string>

usingnamespacestd;

classStudent

{public:

Student(intn,stringnam,chars)

{num=n;

name=nam;

sex二s;

cout<<z/Construetorcalled.z/<<endl;

33/145

Student()

{cout<<z,Destruetorcalled.z/<<endl;}

voiddisplay()

{cout<<z/num:z/<<num<<endl;

cout<<z/name:zz<<name<<endl;

cout<<z/sex:z/<<sex<<endl<<endl;

}

private:

intnum;

stringname;

charsex;

);

34/145

intmain()

{Studentstudl(10010,z,Wang_liz,,,f?);

studl.display();

Studentstud2(10011,〃Zhang_fun〃,';

stud2.display();

return0;

n

35/145

main函數(shù)前聲明的類其作用域是全局的。

程序運(yùn)行結(jié)果如下:

Constructorcalled.

num:10010

name:Wang_li

sex:f

Constructorcalled.

num:10011

name:Zhangfun

sex:m

Destructorcalled.

Destructorcalled.

36/145

3.1構(gòu)造函數(shù)

3.2析構(gòu)函數(shù)

3.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序

3.4對(duì)象數(shù)組

3.5對(duì)象指針

3.6共用數(shù)據(jù)的保護(hù)

3.7對(duì)象的動(dòng)態(tài)建立和釋放

3.8對(duì)象的賦值和復(fù)制

3.9靜態(tài)成員

3.10友元■

類模板Cm

3.HC

Mi

37/145.蠢

3.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序

?在使用構(gòu)造函數(shù)和析構(gòu)函數(shù)時(shí)需要特別注意對(duì)它們的調(diào)用

時(shí)間和調(diào)用順序。

?在一般情況下,調(diào)用析構(gòu)函數(shù)的次序與調(diào)用構(gòu)造函數(shù)的次

序恰好相反:最先調(diào)用構(gòu)造函數(shù)的對(duì)象,最后調(diào)用析構(gòu)函

數(shù)。而最后調(diào)用構(gòu)造函數(shù)的對(duì)象,最先調(diào)用析構(gòu)函數(shù)???/p>

簡(jiǎn)記為:先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu),它相當(dāng)于一

個(gè)棧,后進(jìn)先出。

38/145

對(duì)象1的對(duì)象1的

構(gòu)造函數(shù)析構(gòu)函數(shù)

對(duì)象2的對(duì)象2的

構(gòu)造函數(shù)析構(gòu)函數(shù)

對(duì)象3的[對(duì)象3的

構(gòu)造函數(shù)"I析構(gòu)函數(shù)

39/145

構(gòu)造析構(gòu)順序總結(jié):

在一般情況下,調(diào)用析構(gòu)函數(shù)的次序與調(diào)用構(gòu)造函數(shù)

的次序相反,這是對(duì)同一類存儲(chǔ)類別的對(duì)象而言的。

⑴在全局范圍中定義的對(duì)象(在所有函數(shù)之外定義的對(duì)

象),在主函數(shù)執(zhí)行前調(diào)用構(gòu)造函數(shù)。當(dāng)主函數(shù)結(jié)束時(shí),

調(diào)用析構(gòu)函數(shù)。

⑵在函數(shù)中定義靜態(tài)局部對(duì)象,則在第一次調(diào)用該函

數(shù)建立對(duì)象時(shí)調(diào)用構(gòu)造函數(shù),在主函數(shù)結(jié)束或調(diào)用

exit函數(shù)時(shí)才調(diào)用析構(gòu)函數(shù)。

⑶局部自動(dòng)對(duì)象,在創(chuàng)建對(duì)象時(shí)調(diào)用構(gòu)造函數(shù)。如多次調(diào)

用對(duì)象所在的函數(shù),則每次創(chuàng)建對(duì)象時(shí)都調(diào)用構(gòu)造函數(shù)。

在函數(shù)調(diào)用結(jié)束時(shí)調(diào)用析構(gòu)函數(shù)。

40/145

例如:

Voidfn()

{studentstl;〃定義局部自動(dòng)對(duì)象

staticstudentst2;〃定義靜態(tài)局部對(duì)象

???

)

對(duì)象stl是每次調(diào)用函數(shù)fn時(shí)調(diào)用構(gòu)造函數(shù),在函數(shù)fn結(jié)

束時(shí)調(diào)用析構(gòu)函數(shù)。

對(duì)象st2是第一次調(diào)用函數(shù)fn時(shí)調(diào)用構(gòu)造函數(shù),在函數(shù)fn

結(jié)束時(shí)并不調(diào)用析構(gòu)函數(shù),在到主函數(shù)結(jié)束時(shí)才調(diào)用析構(gòu)

函數(shù)。

41/145

3.1構(gòu)造函數(shù)

3.2析構(gòu)函數(shù)

3.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序

3.4對(duì)象數(shù)組

3.5對(duì)象指針

3.6共用數(shù)據(jù)的保護(hù)

3.7對(duì)象的動(dòng)態(tài)建立和釋放

3.8對(duì)象的賦值和復(fù)制

3.9靜態(tài)成員

3.10友元

3.H類模板

42/145

3.4對(duì)象數(shù)組(較少使用)

類是一種特殊的數(shù)據(jù)類型,它當(dāng)然是C++的合法類型,

自然就可以定義對(duì)象數(shù)組。在一個(gè)對(duì)象數(shù)組中各個(gè)元素

都是同類對(duì)象例如一個(gè)班級(jí)有50個(gè)學(xué)生,每個(gè)學(xué)生具有

學(xué)號(hào)、年齡、成績(jī)等屬性,可以為這個(gè)班級(jí)建立一個(gè)對(duì)

象數(shù)組,數(shù)組包括了50個(gè)元素:

studentstd[50];

給數(shù)組初始化時(shí),不可以用如下形式:

Studentstu[3]={1,7,6};

43/145

錯(cuò)誤提示:分別在DevC++和VC++6.0下

23};

24intmain()

{Studentstu[3]={l,7,6};

5.5八..,犍QfnrnldiQnln\fCy?

intmain()

〈Studentstu[3]=<1,7,6};

stu[0].displayO;

stu[1].displayO;

stu[2].displayO;

return0;

}

I

■ration:defaultparal-Win32Debug

|MyProjects\defaultpara1\dest?cpp(26)::errorC244G:'initializing':cannotconuertfrom'constint'to'classStudent

tudioVMyProiecl.conversionfrom'inftonon-scalartype'Student1requested

tudio\MyProject..conversionfrom'inftonon-scalartype'Student1requested

44/145

數(shù)組的正確初始化

如果構(gòu)造函數(shù)有多個(gè)參數(shù),在花括號(hào)中為每個(gè)對(duì)象分別寫

上構(gòu)造函數(shù)并指定實(shí)參。格式為:

studentst[n]={student(實(shí)參1,實(shí)參2,實(shí)參3);

??????

student(實(shí)參1',實(shí)參2',實(shí)參3');

);

45/145

初始化數(shù)組樣例

假定對(duì)象有三個(gè)數(shù)據(jù)成員:學(xué)號(hào)、年齡、成績(jī)。下面定義

有三個(gè)學(xué)生的對(duì)象數(shù)組:

studentstd[3]={student(1001,18,87),

student(1002,19,76),

student(1003,18,80)

);〃構(gòu)造函數(shù)帶實(shí)參

在建立對(duì)象數(shù)組時(shí),分別調(diào)用構(gòu)造函數(shù),對(duì)每個(gè)對(duì)象初始

化。每個(gè)元素的實(shí)參用括號(hào)括起來(lái),實(shí)參的位置與構(gòu)造函

數(shù)形參的位置一一對(duì)應(yīng)。

46/145

例3.6對(duì)象數(shù)組的使用方法。(長(zhǎng)方體數(shù)組)

#include<iostream>

usingnamespacestd;

classBox

{public:

Box(inth=10zintw=12,intlen=15):height(h)/width(w)/length(len)

{}〃帶默認(rèn)參數(shù)值和參數(shù)表

intvolume();

private:

intheight;

intwidth;

intlength;

);

47/145

intBox::volume()

{return(height*width*length);}

intmain()

Boxa[3]={Box(10,12,15),〃每個(gè)數(shù)組元素是一個(gè)對(duì)象

Box(15,18,20),

Box(16,20,26)};

cout<<”a[0]的體積是"<<a[0].volume()<<endl;

cout<<”a[l]的體積是"<<a[l].volume()<<endl;

cout<<”a[2]的體積是"<<a[2].volume()<<endl;

return0;

)

48/145

3.1構(gòu)造函數(shù)

3.2析構(gòu)函數(shù)

3.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序

3.4對(duì)象數(shù)組

3.5對(duì)象指針

3.6共用數(shù)據(jù)的保護(hù)

3.7對(duì)象的動(dòng)態(tài)建立和釋放

3.8對(duì)象的賦值和復(fù)制

3.9靜態(tài)成員

3.10友元

3.H類模板

49/145

3.5對(duì)象指針

指針的含義是內(nèi)存單元的地址,可以指向一般的變量,也

可以指向?qū)ο蟆?/p>

50/145

3.5.1指向?qū)ο蟮闹羔?/p>

3.5.2指向?qū)ο蟪蓡T的指針

3.5.3this指針

51/145

351指向?qū)ο蟮闹羔?/p>

■對(duì)象在內(nèi)存占據(jù)一片連續(xù)的內(nèi)存空間,CPU都按地址訪問(wèn)內(nèi)

存,對(duì)象在內(nèi)存的起始地址稱為對(duì)象指針。

定義對(duì)象的指針變量以保存對(duì)象的地址,方便引用對(duì)象成員,

格式如下:

類名*變量名;

Student*pstu;

定義好指針變量后,必須先給賦予合法的地址后才能使用。

一般是通過(guò)取地址運(yùn)算取得另外一對(duì)象的地址,然后賦給

指針變量。

八Studentstul;

'?\pstu=&stul;

要用與對(duì)象類型相同的指針變量保存運(yùn)算的結(jié)果。

rfB㈤F

52/145

classTimevoidTime::set_time()

(public:{cin>>hour;

Time()cin>>minute;

{hour=0;cin>>sec;

minute=0;}

sec=0;voidTime::show_time()

){cout<<hour<</z:〃:〃〈〈sec〈

voidset_time();<endl;

voidshow_time();

private:

inthour;

intminute;

intsec;

);

53/145

在此基礎(chǔ)上,有以下語(yǔ)句:

intmain()

(Time*pt;//定義pt是指向Time類對(duì)象的指針

Timetl;//定義Time類對(duì)象tl

pt=&tl;//將對(duì)象tl的地址賦予pt

(*pt).show_time()〃用指針變量訪問(wèn)對(duì)象的成員。

pt->show_time()

54/145

3.5.2指向?qū)ο蟪蓡T的指針

對(duì)象由成員組成。對(duì)象占據(jù)的內(nèi)存區(qū)是各個(gè)數(shù)據(jù)成員占據(jù)

的內(nèi)存區(qū)的總和。對(duì)象成員也有地址,即指針。

「指向數(shù)據(jù)成員的指針

指針

I指向成員函數(shù)的指針。

H

55/145

1.指向?qū)ο蠊袛?shù)據(jù)成員的指針

①定義數(shù)據(jù)成員的指針變量

數(shù)據(jù)類型*指針變量名

②取得公有數(shù)據(jù)成員的地址

&對(duì)象名.成員名

這里的數(shù)據(jù)類型是數(shù)據(jù)成員的數(shù)據(jù)類型。

例:

Timetl;

int*pl;//定義一個(gè)指向整型數(shù)據(jù)的指針變量

pl=&tl.hour;〃假定hour是公有成員

cout<<*pl<<endl;

,二

?實(shí)際上類的數(shù)據(jù)成員是不公開的。所以這個(gè)方法不常用。

56/145

2.指向?qū)ο蟪蓡T函數(shù)的指針

①定義指向成員函數(shù)的指針變量

數(shù)據(jù)類型(類名::*變量名)(形參表);

void(Student::*pf)();

數(shù)據(jù)類型:成員函數(shù)的類型。

類名:對(duì)象所屬的類

變量名:按標(biāo)識(shí)符規(guī)則取名

形參表:指定成員函數(shù)的形參表(形參個(gè)數(shù)、類型)

②取成員函數(shù)的地址

&類名::成員函數(shù)名

&Student::display

在VC++系統(tǒng)中,也可以不寫&。為了與C語(yǔ)言一致,建議不要省略

57/145

③給指針變量賦初值

指針變量名二&類名::成員函數(shù)名;

④用指針變量調(diào)用成員函數(shù)

(對(duì)象名.*指針變量名)([實(shí)參表]);

對(duì)象名:是指定調(diào)用成員函數(shù)的對(duì)象。

*:明確其后的是一個(gè)指針變量。

實(shí)參表:與成員函數(shù)的形參表對(duì)應(yīng),如無(wú)形參,可以省略

實(shí)參表。

3

58/145

例3.7有關(guān)對(duì)象指針的使用方法

ttinclude<iostream>Time::Time(inth,intm,ints)

usingnamespacestd;{hour=h;

classTimeminute=m;

{public:sec=s;

Time(int,int,int)

voidTime::get_time()

inthour;

intminute;{cout<<hour<<z/://<<minute<</,:/z<<sec<

intsec;<endl;}

voidgettime();

為了比較指向數(shù)據(jù)成員和函數(shù)成員的指針。

把數(shù)據(jù)成員也聲明為公有的。一般不要這

么做。

59/145

intmain()

{Timetl(10,13,56);

int*pl=&tl.hour;//定義指向成員的指針pl

cout<<*pl<<endl;

tl.get_time();//調(diào)用成員函數(shù)

Time*p2=&tl;//定義指向?qū)ο髏l的指針p2

p2->get_time();〃用對(duì)象指針調(diào)用成員函數(shù)

void(Time::*p3)();71定義指向成員函數(shù)的指針

p3=&Time::gettime;/給成員函數(shù)的指針賦值

(tl.*p3)();//用指向成員函數(shù)的指針調(diào)用成員函數(shù)

retur

,/;1-V,

函數(shù)成員指針的聲明賦值和引用。

60/145

程序運(yùn)行結(jié)果為:

10〃*pl的值

10:13:56//tl.get_time();的執(zhí)行結(jié)果

10:13:56//p2->get_time();的執(zhí)行結(jié)果

10:13:56//(tl.*p3)();的執(zhí)行結(jié)果

程序采用了三種方法輸出tl的hour,minute,sec的值

說(shuō)明:

(1)成員函數(shù)的起始地址的正確表示是:

&類名::成員函數(shù)名。

不要寫成:p3=&tl.get_time;

但是寫成:P3=tl.get_time;倒是可以,請(qǐng)思考為什么?

(2)主函數(shù)的第8和9行可以合并寫成:

void(Time::*p3)()=&Time::gettime;

61/145

3.5.3this指針

一個(gè)類的成員函數(shù)只有一個(gè)內(nèi)存拷貝。類中不論哪個(gè)對(duì)象調(diào)用

某個(gè)成員函數(shù),調(diào)用的都是內(nèi)存中同一個(gè)成員函數(shù)代碼。例如

Time類一個(gè)成員函數(shù):

voidTime::get_time()

{cout<<hour<<z/:〃:'z<<sec<<endl;}

tl.get_time();

t2.get_time();

當(dāng)不同對(duì)象的成員函數(shù)訪問(wèn)數(shù)據(jù)成員時(shí),怎么保證訪問(wèn)的就是

指定對(duì)象的數(shù)據(jù)成員?

S其實(shí)每個(gè)成員函數(shù)中都包含一個(gè)特殊的指針,它的名字

是thiso它是指向本類對(duì)象的指針,

62/145

當(dāng)對(duì)象調(diào)用成員函數(shù)時(shí),它的值就是該對(duì)象的起始地址。

所以為了區(qū)分不同對(duì)象訪問(wèn)成員函數(shù),語(yǔ)法要求調(diào)用成員

函數(shù)格式是:

intB熨鐮?鷹函數(shù)名(實(shí)參表)

從語(yǔ)法搬鮑浦搞錦標(biāo)豳廨用成員函數(shù)。

程悌霆甄印編譯器把對(duì)象的地址即this指針?lè)旁贓CX寄

贛霰麻瞑懿硼口成員函數(shù)定義如下:

{return(this->height*this->width*this->length);}

63/145

對(duì)于計(jì)算長(zhǎng)方體體積的成員函數(shù)volume,當(dāng)對(duì)象a調(diào)用它時(shí),

就把對(duì)象a地址給this指針,編譯程序?qū)的地址作為實(shí)參傳

給成員函數(shù):

a.volume(&a);

函數(shù)體變成:

(this->height)*(this->width)*(this->length)

等價(jià)于:(a.height)*(a.width)*(a.length)

C++通過(guò)編譯程序,在對(duì)象調(diào)用成員函數(shù)時(shí),把對(duì)象的地

址賦予this指針,用this指針指向?qū)ο?,?shí)現(xiàn)了用同一

個(gè)成員函數(shù)訪問(wèn)不同對(duì)象的數(shù)據(jù)成員。

64/145

可以用(*this)表示調(diào)用成員函數(shù)的對(duì)象。

(*this)就是this所指的對(duì)象。如前面的計(jì)算長(zhǎng)方體體積

的函數(shù)中return語(yǔ)句可以寫成:

return((*this).height*(*this).width*(*this).

length);

注意this兩側(cè)的括號(hào)不能省略,不能寫成:

return(*this.height**this.width**this.length);

根據(jù)運(yùn)算符優(yōu)先級(jí)語(yǔ)句被翻譯成:*(this,height),而

this.height是非法的,編譯將報(bào)錯(cuò)。

65/145

:

3.1構(gòu)造函數(shù)

3.2析構(gòu)函數(shù)

3.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序

3.4對(duì)象數(shù)組

3.5對(duì)象指針

3.6共用數(shù)據(jù)的保護(hù)

3.7對(duì)象的動(dòng)態(tài)建立和釋放

3.8對(duì)象的賦值和復(fù)制

3.9靜態(tài)成員

3.10友元

3.H類模板

66/145

3.6共用數(shù)據(jù)的保護(hù)

如果既希望數(shù)據(jù)在一定范圍內(nèi)共享,又不愿它被隨意修改,

從技術(shù)上可以把數(shù)據(jù)指定為只讀型的。C++提供const手段,

將數(shù)據(jù)、對(duì)象、成員函數(shù)指定為常量,從而實(shí)現(xiàn)了只讀要

求,達(dá)到保護(hù)數(shù)據(jù)的目的。

67/145

3.6.1常對(duì)象

3.6.2常對(duì)'象成員

3.6.3指向?qū)ο蟮某V羔?/p>

*3.6.4指向常對(duì)象的指針變量

3.6.5對(duì)象的常引用

3.6.6const型數(shù)據(jù)小結(jié)

68/145

3.6.1常對(duì)象

菽:const類名對(duì)象名(實(shí)參表);

或:類名const對(duì)象名(實(shí)參表);

把對(duì)象定義為常對(duì)象,對(duì)象中的數(shù)據(jù)成員就是常變量,在

定義時(shí)必須給數(shù)據(jù)成員的初值,因?yàn)樵诔绦蛑胁辉试S修改

常對(duì)象的數(shù)據(jù)成員值。

如果常對(duì)象的成員函數(shù)不是常成員函數(shù)(除構(gòu)造函數(shù)和析

構(gòu)函數(shù)外),則外界不能調(diào)用此對(duì)象的成員函數(shù)。

如:constTime11(10,15,36);

tl.get_time();//錯(cuò)誤,不能調(diào)用

為了訪問(wèn)常對(duì)象中的數(shù)據(jù)成員,要定義常成員函數(shù):1

voidget_time()const-

即使加上了const,該函觸不能修改對(duì)象數(shù)據(jù)成員。

如果在常對(duì)象中要修改某個(gè)數(shù)據(jù)成員,C++提供了指定可變

的數(shù)據(jù)成員方法。

格式:mutable類型數(shù)據(jù)成員;

在定義數(shù)據(jù)成員時(shí)加mutable后,將數(shù)據(jù)成員聲明為可變的

數(shù)據(jù)成員,就可以用聲明為cons珀勺成員函數(shù)修改它的值。

H

70/145

3.6.2常對(duì)象成員

可以在聲明普通對(duì)象時(shí)將數(shù)據(jù)成員或成員函數(shù)聲明為常數(shù)

據(jù)成員或常成員函數(shù)。

71/145

1.常數(shù)據(jù)成員

格式:const類型數(shù)據(jù)成員名

將類中的數(shù)據(jù)成員定義為具有只讀的性質(zhì)。

注意:只能通過(guò)帶參數(shù)初始表的構(gòu)造函數(shù)對(duì)常數(shù)據(jù)成員進(jìn)

行初始化。

例:constinthour;

Time::Time(inth)

{hour=h;…}〃錯(cuò)誤

應(yīng)該寫成:

Time::Time(inth):hour

72/145

在類中聲明了某個(gè)常數(shù)據(jù)成員后,該類中每個(gè)對(duì)象的這個(gè)

數(shù)據(jù)成員的值都是只讀的,而每個(gè)對(duì)象的這個(gè)數(shù)據(jù)成員的

值可以不同,由定義對(duì)象時(shí)給出。

73/145

2.常成員函數(shù)

定義格式:

類型函數(shù)名(形參表)const;

const是函數(shù)類型的一部分,在聲明函數(shù)原型和定義函數(shù)

時(shí)都要用const關(guān)鍵字。

74/145

使用常成員函數(shù)需注意:

“const是函數(shù)類型的一個(gè)組成部分,因此在函數(shù)的實(shí)現(xiàn)部分

也要使用關(guān)鍵字ccmsto

0常成員函數(shù)不能修改對(duì)象的數(shù)據(jù)成員,也不能調(diào)用該類中

沒(méi)有由關(guān)鍵字const修飾的成員函數(shù),從而保證了在常成員

函數(shù)中不會(huì)修改數(shù)據(jù)成員的值。

0如果一個(gè)對(duì)象被說(shuō)明為常對(duì)象,則只能調(diào)用它的常成員函

數(shù)。

般成員函數(shù)可以訪問(wèn)或修改本類中的非const數(shù)據(jù)成員。而常成員函

數(shù)只能讀本類中的數(shù)據(jù)成員,而不能寫它們。

75/145

成員函數(shù)與成員數(shù)據(jù)的關(guān)系

HIXJ吊數(shù)據(jù)成員.二常函數(shù)成員

:、、/

、、XZ

、t常對(duì)象數(shù)據(jù)成員

---------A讀操作實(shí)線表示可操作

V--------寫操作虛線表7F不用操作

76/145

常成員函數(shù)小結(jié):

⑴如果類中有部分?jǐn)?shù)據(jù)成員的值要求為只讀,可以將它們

聲明為const,這樣成員函數(shù)只能讀這些數(shù)據(jù)成員的值,但

不能修改它們的值。

⑵如果所有數(shù)據(jù)成員的值為只讀,可將對(duì)象聲明為const,

在類中必須聲明const成員函數(shù),常對(duì)象只能通過(guò)常成員

函數(shù)讀數(shù)據(jù)成員。

⑶常對(duì)象不能調(diào)用非const成員函數(shù)。

提醒:如果常對(duì)象的成員函數(shù)未加const,編譯系統(tǒng)將其當(dāng)

作非const成員函數(shù);常成員函數(shù)不能調(diào)用非const成員函

3

77/145

3.6.3指向?qū)ο蟮某V羔?/p>

如果在定義指向?qū)ο蟮闹羔槙r(shí),使用了關(guān)鍵字const,匕

就是一個(gè)常指針,必須在定義時(shí)對(duì)其初始化。并且在程序

運(yùn)行中不能再修改指針的值。

類名*const指針變量名二對(duì)象地址

例:

Timetl(10,12,15)zt2;

Time*constpl=&tl;

在此后,程序中不能修改Pl。

例:P>&t2;//錯(cuò)誤語(yǔ)句;

0L

#3

8

78/145一

O指向?qū)ο蟮某V羔槪诔绦蜻\(yùn)行中始終指的是同一個(gè)對(duì)象。

即指針變量的值始終不變,但它所指對(duì)象的數(shù)據(jù)成員值可

以修改。當(dāng)需要將一個(gè)指針變量固定地與一個(gè)對(duì)象相聯(lián)系

時(shí),就可將指針變量指定為const。往往用常指針作為函數(shù)

的形參,目的是不允許在函數(shù)中修改指針變量的值,讓它

始終指向原來(lái)的對(duì)象。

79/145

364指向常對(duì)象的指針變量

格式:

const類型名*指針變量名;

例:constStudent*p;〃指向const對(duì)象。

指向?qū)ο?/p>

const非const指針變量

的指針變量

對(duì)象

mEconst_^6句指向&可修改

因?yàn)閏onst指針變量約束不可指向

比較嚴(yán)格,所以可以指

向任意類型對(duì)象。80/145—?可指向&不可修改所

指對(duì)象成員

ftinclude<iostream>

ttinclude<string>

usingnamespacestd;

classStudent

{public:

Student(intn,stringnam,chars)

{num=n;

name=nam;

sex-s;

cout<<^Constructorcalled.z/<<num<<endl;}

?Student()

{cout<<z/Destruetorcalled./z<<num<<endl;}

voidsetdata()

{cin>>num;}

voiddisplay()const;

private:

intnum;

voidStudent::display()const

stringname;{cout<<,,num:,,<<num<<endl;

charsex;cout<<,,name:z,<<name<<endl;

);cout〈〈〃sex:,/<<sex<<endl<<endl;

intmain()

{constStudenttl(1,〃yang〃,'f');

Studentt2(2,〃chao〃,'f');

constStudent*p;

Student*q;

p二&tl;〃指向const對(duì)象tl的指針變量。

p->display();

p=&t2;〃指向const對(duì)象的指針變量可以指向非const對(duì)象t2。

p->display();

//q=&tl;〃出錯(cuò),指向普通對(duì)象的指針變量不可以指向const對(duì)象。

//q->display();

q=&t2;〃指向普通對(duì)象的指針變量只可以指向普通對(duì)象。

q->display();

//p->setdata();通過(guò)指向const型的指針變量調(diào)用對(duì)象成員函數(shù),無(wú)法修

改成員。

//t2.setdata();〃但是通過(guò)對(duì)象調(diào)用成員函數(shù),則可以修改成員變量。

q->setdata();〃這個(gè)也是同樣道理。因?yàn)閝不是指向常量對(duì)象的指針,

所以,可以調(diào)用能夠修改成員變量的函數(shù)。

return0;

82/145

3.6.5對(duì)象的常引用

前面學(xué)過(guò)引用是傳遞參數(shù)的有效辦法。用引用形參時(shí),形

參變量與實(shí)參變量是同一個(gè)變量,在函數(shù)內(nèi)修改引用形參

也就是修改實(shí)參變量。

如果用引用形參又不想讓函數(shù)修改實(shí)參,可以使用常引用

機(jī)制。

格式:const類名&形參對(duì)象名

如:constStudent&stu

83/145

例3.8對(duì)象的引用

ttinclude<iostream>voidTime::gettime()

usingnamespacestd;(

classTimecout<<hour;

{public:cout<<minute;

Time(int,int,int);cout<<sec;

voidsettime();

voidgettime();

voidTime::settime()

private:(

inthour;cin>>hour;

intminute;cin>>minute;

intsec;cin>>sec;

);

Time::Time(inth,intm,ints)

{hour=h;

minute=m;

SeC=S;}84/145

voidfun(Time&t)//引用型形參,如果參數(shù)前面加

const,則不能修改所引用對(duì)象的成員數(shù)據(jù)。

{t.settime();

)

intmain()

{Timetl(10,13,56);

tl.gettime();

fun(tl);〃傳遞對(duì)象的地址

tl.gettime();

return0;

85/145

3.6.6const型數(shù)據(jù)的小結(jié)企

表3.3

形式含義

Timeconsttl;

tl是常對(duì)象,其值在任何情況下都不能改變

或constTimetl;

voidTime::fun()constfun是Time類中的常成員函數(shù),可以引用,但不能修改本類中的數(shù)據(jù)成員

Time*constp;P是指向Time對(duì)象的常指針,p的值(即p的指向)不能改變

constTime*p;P是指向Time類常對(duì)象的指針,其指向的類對(duì)象的值不能通過(guò)指針來(lái)改變

Time&tl=t;tl是Time類對(duì)象t的引用,t和tl指向同一段內(nèi)存空間

訣竅:從變量開始往左推導(dǎo),即可得知一個(gè)變量是什么類型的。星號(hào)左邊是

要指向的東西,右邊都是修飾指針變量的。如:

Time*constp;p左邊是const的,表示p不能變,再往左是星號(hào),說(shuō)明p

是一個(gè)指針,再往左是類名,表示指向那樣一個(gè)類的對(duì)象,成員可以修改。

Timeconst*p;p左邊是星號(hào),表示p是一個(gè)指針,指向的東西是const的,

不能變的,再往左是類名,表示指向那樣一個(gè)類的對(duì)象,其成員不能修改。

O0/T40

3.1構(gòu)造函數(shù)

3.2析構(gòu)函數(shù)

3.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序

3.4對(duì)象數(shù)組

3.5對(duì)象指針

3.6共用數(shù)據(jù)的保護(hù)

3.7對(duì)象的動(dòng)態(tài)建立和釋放

3.8對(duì)象的賦值和復(fù)制

3.9靜態(tài)成員

3.10友元

2

3.n類模板/8?

8

f艮

87/145-一

3.7對(duì)象的動(dòng)態(tài)建立和釋放

0C++提供了new和delete運(yùn)算符,實(shí)現(xiàn)動(dòng)態(tài)分配、回收內(nèi)存。它們也可以

用來(lái)動(dòng)態(tài)建立對(duì)象和釋放對(duì)象。

1.動(dòng)態(tài)建立對(duì)象格式:new類名;

功能:在堆里分配內(nèi)存,建立指定類的一個(gè)無(wú)名對(duì)象。

如果分配成功,將返回動(dòng)態(tài)對(duì)象的起始地址(指針);

如不成功,返回0。為了保存這個(gè)指針,必須事先定義

類類型的指針變量。

格式:類名*指針變量名;

例:Box*pt;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論