實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第1頁(yè)
實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第2頁(yè)
實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第3頁(yè)
實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第4頁(yè)
實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第5頁(yè)
已閱讀5頁(yè),還剩106頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++語(yǔ)言程序設(shè)計(jì)第四章 類(lèi)與對(duì)象2主要內(nèi)容面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)類(lèi)和對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)類(lèi)的組合UML圖形標(biāo)識(shí)綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序深度探索教學(xué)重點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)類(lèi)和對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)類(lèi)的組合UML圖形標(biāo)識(shí)綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序深度探索教學(xué)難點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)類(lèi)和對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)類(lèi)的組合UML圖形標(biāo)識(shí)綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序深度探索面向過(guò)程的設(shè)計(jì)方法重點(diǎn):如何實(shí)現(xiàn)的細(xì)節(jié)和過(guò)程,將數(shù)據(jù)與函數(shù)分開(kāi)。形式:主模塊+若干個(gè)子模塊(main()+子函數(shù))。特點(diǎn):自頂向下,逐步求精——功能分解。缺點(diǎn):效率低,程序的可重用性差。5面向?qū)ο蟮姆椒康模簩?shí)現(xiàn)軟件設(shè)計(jì)的產(chǎn)業(yè)化。觀(guān)點(diǎn):自然界是由實(shí)體(對(duì)象)所組成。程序設(shè)計(jì)方法:使用面向?qū)ο蟮挠^(guān)點(diǎn)來(lái)描述模仿并處理現(xiàn)實(shí)問(wèn)題。要求:高度概括、分類(lèi)、和抽象。64.1

面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)面向過(guò)程的程序設(shè)計(jì)面向?qū)ο蟮某绦蛟O(shè)計(jì)抽象繼承封裝多態(tài)抽象抽象是對(duì)具體對(duì)象(問(wèn)題)進(jìn)行概括,抽出這一類(lèi)對(duì)象的公共性質(zhì)并加以描述的過(guò)程。數(shù)據(jù)抽象:描述某類(lèi)對(duì)象的屬性或狀態(tài)(對(duì)象相互區(qū)別的物理量)。代碼抽象:描述某類(lèi)對(duì)象的共有的行為特征或具有的功能。84.1

面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)抽象實(shí)例——鐘表數(shù)據(jù)抽象:inthour,intminute,intsecond代碼抽象:

setTime(),showTime()9抽象實(shí)例——人數(shù)據(jù)抽象:string

name,string

gender,int

age,int

id代碼抽象:生物屬性角度:eat(),

step(),…社會(huì)屬性角度:work(),

study()

,…104.1

面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)封裝將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個(gè)有機(jī)的整體,也就是將數(shù)據(jù)與操作數(shù)據(jù)的函數(shù)代碼進(jìn)行有機(jī)的結(jié)合,形成類(lèi),其中的數(shù)據(jù)和函數(shù)都是類(lèi)的成員。11封裝12class Clock

{public:void

setTime(int

newH,int

newM,int

newS);void

showTime();private:int

hour,

minute,

second;};繼承繼承是C++中支持類(lèi)的繼承機(jī)制,允許程序員在保持原有類(lèi)特性的基礎(chǔ)上,進(jìn)行更具體,更詳細(xì)的說(shuō)明。13繼承Point

類(lèi)void

InitP()void

Move()float

GetX()float

GetY()float

X,YRectanle

類(lèi)float

W,Hvoid

InitR()float

GetW()float

GetH()多態(tài)多態(tài)性多態(tài)性是指一段程序能夠處理多種類(lèi)型對(duì)象的能力。同一名稱(chēng),不同的功能實(shí)現(xiàn)方式在C++語(yǔ)言中,這種多態(tài)性可以通過(guò)強(qiáng)制多態(tài),重載多態(tài),類(lèi)型參數(shù)化多態(tài)和包含多態(tài)4種形式來(lái)實(shí)現(xiàn)。15主要內(nèi)容面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)類(lèi)和對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)類(lèi)的組合UML圖形標(biāo)識(shí)綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序深度探索164.2

類(lèi)和對(duì)象類(lèi)對(duì)象類(lèi)的實(shí)例化17類(lèi)的定義18class類(lèi)名稱(chēng){public:外部接口private:私有成員protected:保護(hù)型成員}類(lèi)成員訪(fǎng)問(wèn)控制public:類(lèi)的外部接口公有類(lèi)型接口,任何外部函數(shù)都可以訪(fǎng)問(wèn)公有類(lèi)型數(shù)據(jù)和函數(shù)。示例:19Clock

xx.SetTime(12,30,56);x.ShowTime();類(lèi)成員訪(fǎng)問(wèn)控制private:私有類(lèi)型成員只允許本類(lèi)中的函數(shù)訪(fǎng)問(wèn),而類(lèi)外部的任何函數(shù)都不能訪(fǎng)問(wèn)。示例Clock

xx.Hour=12;x.Minute=30;x.Second=56x.SetTime(12,30,56);20×√類(lèi)成員訪(fǎng)問(wèn)控制如果緊跟在類(lèi)名稱(chēng)的后面聲明私有成員,則關(guān)鍵字private可以省略。class

clock

{private:int

hour,

hinute,

second;public:void

setTime(int

newH,

int

newM,int

newS);void

showTime();};類(lèi)成員訪(fǎng)問(wèn)控制protected:保護(hù)類(lèi)型成員與private類(lèi)似,其差別表現(xiàn)在繼承與

派生時(shí)對(duì)派生類(lèi)的影響不同,第七章講。22類(lèi)的聲明——示例class

clock

{public:void

setTime(int

newH,

int

newM,int

newS);void

showTime();private:int

hour,

hinute,

second;};成員數(shù)據(jù)成員函數(shù)23類(lèi)的成員函數(shù)在類(lèi)中說(shuō)明原型,可以在類(lèi)外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類(lèi)名加以限定。也可以直接在類(lèi)中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)24類(lèi)的成員函數(shù)成員函數(shù)的聲明class

類(lèi)名稱(chēng){public(protected,private)返回值類(lèi)型函數(shù)成員名(參數(shù)表)}類(lèi)的成員函數(shù)成員函數(shù)的實(shí)現(xiàn)返回值類(lèi)型類(lèi)名::函數(shù)成員名(參數(shù)表){函數(shù)體}類(lèi)的成員函數(shù)——示例示例void

Clock::setTime(int

newH,

int

newM,int

newS)

{hour

=

newH;minute

=

newM;second

=

newS;}void

Clock::ShowTime(int

newH,

int

newM,int

newS)

{cout<<hout<<":"<<minute<<":"<<second<<endl;}調(diào)用示例Clock

Obj;Obj.SetTime(10,30,0);Obj.ShowTime();帶默認(rèn)形參值的成員函數(shù)示例class

clock

{public:void

setTime(int

newH=0,

int

newM=0,int

newS=0);void

showTime();private:int

hour,

hinute,

second;};……調(diào)用示例ClockObj;Obj.SetTime();Obj.ShowTime();Obj.SetTime(10,30,0);Obj.ShowTime();注意:類(lèi)成員函數(shù)的默認(rèn)值,一定要寫(xiě)在類(lèi)定義中,而不能寫(xiě)在類(lèi)定義之外的函數(shù)實(shí)現(xiàn)中內(nèi)聯(lián)成員函數(shù)在類(lèi)中聲明內(nèi)聯(lián)成員函數(shù)的方式:隱式聲明:將函數(shù)體放在類(lèi)的聲明中現(xiàn)式聲明:在類(lèi)外使用inline關(guān)鍵字注意函數(shù)較簡(jiǎn)單內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語(yǔ)句和switch語(yǔ)句)29內(nèi)聯(lián)成員函數(shù)舉例(一)30示例:class

Point

{public:void

init(int

initX,

int

initY)

{x

=

initX;y

=

initY;}int

getX()

{

return

x;

}int

getY()

{

return

y;

}private:int

x,

y;};內(nèi)聯(lián)成員函數(shù)舉例(二)31class

Point

{public:void

init(int

initX,

int

initY);int

getX();int

getY();private:int

x,

y;};inline

void

Point::init(int

initX,int

initY)

{x

=

initX;y

=

initY;}32inline

intreturn}Point::getX()x;{inline

intreturn}Point::GetY()y;{對(duì)象對(duì)象類(lèi)的對(duì)象是該類(lèi)的某一特定實(shí)體,即類(lèi)類(lèi)型的變量。聲明形式:類(lèi)名 對(duì)象名;例:Clock33myClock;類(lèi)中成員的訪(fǎng)問(wèn)方式類(lèi)中成員互訪(fǎng)直接使用成員名類(lèi)外訪(fǎng)問(wèn)使用“對(duì)象名.成員名”方式訪(fǎng)問(wèn)public屬性的成員類(lèi)與對(duì)象示例34#include

<iostream>using

namespace

std;class

Clock

{public:void

setTime(int

newH

=

0,

int

newM

=

0,

int

newS

=

0);void

showTime();private:int

hour,

minute,

second;};void

Clock::setTime(int

newH,

int

newM,

int

newS)

{hour

=

newH;minute

=

newM;second

=

newS;}inline

void

Clock::showTime()

{cout

<<

hour

<<

":"

<<

minute

<<

":"

<<

second

<<

endl;}int

main()

{Clock

myClock;cout

<<

"First

time

set

and

output:"

<<

endl;myClock.setTime();myClock.showTime();cout

<<

"Second

time

set

and

output:"

<<

endl;myClock.setTime(8,

30,

30);myClock.showTime();return

0;}37主要內(nèi)容面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)類(lèi)和對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)類(lèi)的組合UML圖形標(biāo)識(shí)綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序深度探索4.3

構(gòu)造函數(shù)和析構(gòu)函數(shù)基本的數(shù)據(jù)類(lèi)型變量的聲明

變量的初始化編譯器自動(dòng)產(chǎn)生代碼來(lái)進(jìn)行類(lèi)類(lèi)型對(duì)象的聲明

對(duì)象的初始化通過(guò)構(gòu)造函數(shù)來(lái)進(jìn)行4.3

構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說(shuō)將對(duì)象初始化為一個(gè)特定的狀態(tài)。特征類(lèi)的一個(gè)成員函數(shù),通常被聲明為公有函數(shù)函數(shù)名與類(lèi)名相同,沒(méi)有返回值對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用39構(gòu)造函數(shù)舉例40class

Clock

{public:Clock(int

newH,int

newM,int

newS);//構(gòu)造函數(shù)void

setTime(int

newH,

int

newM,

int

newS);void

showTime();private:int

hour,

minute,

second;};構(gòu)造函數(shù)的實(shí)現(xiàn):Clock::Clock(int

newH,

int

newM,

int

newS)

{hour

=

newH;41minute

=

newM;second

=

newS;}建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:int

main()

{//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。Clock

c(0,0,0);c.showTime();return

0;}4.3

構(gòu)造函數(shù)和析構(gòu)函數(shù)問(wèn)題:前面示例中,沒(méi)有定義構(gòu)造函數(shù),為什么程序能夠正常工作呢?編譯器自動(dòng)生成一個(gè)隱含的默認(rèn)構(gòu)造函數(shù),該構(gòu)造函數(shù)的參數(shù)列表和函數(shù)體皆為空class

Clock{public:Clock(){

}……}4.3

構(gòu)造函數(shù)和析構(gòu)函數(shù)默認(rèn)構(gòu)造函數(shù):不帶任何形參用戶(hù)可自行定義如果用戶(hù)沒(méi)有定義任何構(gòu)造函數(shù),則系統(tǒng)自動(dòng)生成一個(gè)“什么都不做”的構(gòu)造函數(shù)4.3

構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)小結(jié)在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)隱含的參數(shù)列表為空的默認(rèn)構(gòu)造函數(shù)允許為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶默認(rèn)形參值的函數(shù)示例(p109)復(fù)制構(gòu)造函數(shù)class

point{public:Point(int

xx=0;intyy=0){……};int

getX(){……};int

getY(){……};private:int

x,y;}int

main(){Point

a(1,2);Point

b(a);Point

c=a;cout<<b.getX();cout<<endl;return

0;}復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù):是一種特殊的構(gòu)造函數(shù),其形參為本類(lèi)的對(duì)象引用,其作用是使用一個(gè)已經(jīng)存在的對(duì)象(由復(fù)制構(gòu)造函數(shù)的參數(shù)指定),去初始化一個(gè)同類(lèi)的新對(duì)象class

類(lèi)名

{public

:類(lèi)名(形參);//構(gòu)造函數(shù)類(lèi)名(類(lèi)名

&對(duì)象名);//拷貝構(gòu)造函數(shù)...};類(lèi)名::類(lèi)(類(lèi)名

&對(duì)象名)//拷貝構(gòu)造函數(shù)的實(shí)現(xiàn){

函數(shù)體

}46復(fù)制構(gòu)造函數(shù)(例4-2)47class

Point

{public:Point(int

xx=0,

int

yy=0)

{

x

=

xx;

y

=

yy;

}Point(Point&

p);int

getX()

{

return

x;}int

getY()

{

return

y;}private:int

x,

y;};Point::Point

(Point&

p)

{x

=

p.x;y

=

p.y;cout

<<

"Calling

the

copy

constructor

"<<

endl;}4849復(fù)制構(gòu)造函數(shù)(例4-2)1.當(dāng)用類(lèi)的一個(gè)對(duì)象去初始化該類(lèi)的另一個(gè)對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)實(shí)現(xiàn)拷貝賦值。int

main()

{Point

a(1,2);Point

b

=

a;

//拷貝構(gòu)造函數(shù)被調(diào)用Point

c=a;

//拷貝構(gòu)造函數(shù)被調(diào)用cout

<<

b.getX()

<<

endl;}拷貝構(gòu)造函數(shù)(例4-2)502.若函數(shù)的形參為類(lèi)對(duì)象,調(diào)用函數(shù)時(shí),實(shí)參賦值給形參,系統(tǒng)自動(dòng)調(diào)用拷貝

構(gòu)造函數(shù)。例如:void

fun1(Point

p)

{cout

<<

p.getX()

<<

endl;}int

main()

{Point

a(1,

2);fun1(a);//調(diào)用拷貝構(gòu)造函數(shù)return

0;}拷貝構(gòu)造函數(shù)(例4-2)513.當(dāng)函數(shù)的返回值是類(lèi)對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。例如:Point

fun2()

{Point

a(1,

2);return

a;//調(diào)用拷貝構(gòu)造函數(shù)}int

main()

{Point

b;b

=

fun2();return

0;}隱含的復(fù)制構(gòu)造函數(shù)52如果程序員沒(méi)有為類(lèi)聲明復(fù)制構(gòu)造函數(shù),則編譯器自己生成一個(gè)隱含的復(fù)制構(gòu)造函數(shù)。這個(gè)構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對(duì)象的每個(gè)數(shù)據(jù)成員的值,初始化將要建立的對(duì)象的對(duì)應(yīng)數(shù)據(jù)成員。默認(rèn)的復(fù)制構(gòu)造函數(shù)只能實(shí)現(xiàn)淺復(fù)制析構(gòu)函數(shù)完成對(duì)象被刪除前的一些清理工作。在對(duì)象的生存期結(jié)束的時(shí)刻系統(tǒng)自動(dòng)調(diào)用它,然后再釋放此對(duì)象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動(dòng)產(chǎn)生一個(gè)隱含的析構(gòu)函數(shù)。53析構(gòu)函數(shù)特征是類(lèi)的一個(gè)公有成員函數(shù)名稱(chēng)由類(lèi)名前加一個(gè)“~”構(gòu)成,沒(méi)有返回值,不接受任何參數(shù),可以是虛函數(shù)如果不顯示聲明,系統(tǒng)也會(huì)生成一個(gè)函數(shù)體為空的隱含析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例55#include

<iostream>using

namespace

std;class

Point

{public:Point(int

xx,int

yy);~Point();//...其他函數(shù)原型private:int

x,

y;};Point::Point(int

xx,int

yy)

{x

=

xx;y

=

yy;}Point::~Point()

{}//...其他函數(shù)的實(shí)現(xiàn)略56類(lèi)的應(yīng)用舉例(例4-3)一圓形游泳池如圖所示,現(xiàn)在需在其周?chē)ㄒ粓A形過(guò)道,并在其四周?chē)蠔艡?。柵欄價(jià)格為35元/米,過(guò)道造價(jià)為20元/平

方米。過(guò)道寬度為3米,游泳池半徑由鍵盤(pán)輸入。要求編程計(jì)算并輸出過(guò)道和柵欄的造價(jià)。過(guò)道游泳池57#include

<iostream>using

namespace

std;const

float

PI

=

3.141593; //給出p的值const

float

FENCE_PRICE

=

35; //柵欄的單價(jià)const

float

CONCRETE_PRICE

=

20;//過(guò)道水泥單價(jià)class

Circle{//聲明定義類(lèi)Circle

及其數(shù)據(jù)和方法public: //外部接口58Circle(float

r);float

circumference();float

area();//構(gòu)造函數(shù)//計(jì)算圓的周長(zhǎng)//計(jì)算圓的面積private: //私有數(shù)據(jù)成員float

radius;//圓半徑};//類(lèi)的實(shí)現(xiàn)//構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle::Circle(float

r){radius

=

r;}//計(jì)算圓的周長(zhǎng)float

Circle::circumference()

{return

2

*

PI

*

radius;}//計(jì)算圓的面積float

Circle::area()

{return

PI

*

radius

*

radius;}59int

main

()

{float

radius;cout

<<

"Enter

the

radius

of

the

pool:

";//提示用戶(hù)輸入半徑cin

>>

radius;60Circlepool(radius);//游泳池邊界CirclepoolRim(radius+3);//柵欄//計(jì)算柵欄造價(jià)并輸出float

fenceCost

=

poolRim.circumference()

*FENCE_PRICE;cout

<<

"Fencing

Cost

is

$"

<<

fenceCost

<<endl;//計(jì)算過(guò)道造價(jià)并輸出float

concreteCost

=

(poolRim.area()

-

pool.area())

*CONCRETE_PRICE;cout

<<

"Concrete

Cost

is

$"

<<

concreteCost

<<

endl;return

0;}運(yùn)行結(jié)果Enter

the

radius

of

the

pool:

10Fencing

Cost

is

$2858.85Concrete

Cost

is

$4335.4614.4

組合的概念類(lèi)中的成員數(shù)據(jù)是另一個(gè)類(lèi)的對(duì)象??梢栽谝延谐橄蟮幕A(chǔ)上實(shí)現(xiàn)更復(fù)雜的抽象。62舉例63class

Point

{private:float

x,

y;//點(diǎn)的坐標(biāo)public:Point(float

h,

float

v);//構(gòu)造函數(shù)float

getX();//取X坐標(biāo)

float

getY();//取Y坐標(biāo)void

draw();//在(x,y)處畫(huà)點(diǎn)};//...函數(shù)的實(shí)現(xiàn)略class

Line

{private:Point

p1,

p2;//線(xiàn)段的兩個(gè)端點(diǎn)

public:Line(Point

a,

Point

b);//構(gòu)造函數(shù)

void

draw(void);//畫(huà)出線(xiàn)段};//...函數(shù)的實(shí)現(xiàn)略64類(lèi)組合的構(gòu)造函數(shù)設(shè)計(jì)原則:不僅要負(fù)責(zé)對(duì)本類(lèi)中的基本類(lèi)型成員數(shù)據(jù)賦初值,也要對(duì)對(duì)象成員初始化。聲明形式:類(lèi)名::類(lèi)名(對(duì)象成員所需的形參,本類(lèi)成員形參):對(duì)象1(參數(shù)),對(duì)象2(參數(shù)),......{

本類(lèi)初始化

}65類(lèi)組合的構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對(duì)象的構(gòu)造函數(shù)(按內(nèi)嵌時(shí)的聲明順序,先聲明者先構(gòu)造)。然后調(diào)用本類(lèi)的構(gòu)造函數(shù)。(析構(gòu)函數(shù)的調(diào)用順序相反)初始化列表中未出現(xiàn)的內(nèi)嵌對(duì)象,用默認(rèn)構(gòu)造函數(shù)(即無(wú)形參的)初始化系統(tǒng)自動(dòng)生成的隱含的默認(rèn)構(gòu)造函數(shù)中,內(nèi)嵌對(duì)象全部用默認(rèn)構(gòu)造函數(shù)初始化66類(lèi)的組合舉例(二)67class

Part{//部件類(lèi)

public:Part();Part(int

i);~Part();void

Print();private:int

val;};class

Whole

{public:Whole();Whole(int

i,

int

j,

int

k);~Whole();void

Print();private:Part

one;Part

two;int

date;};68Whole::Whole()

{date=0;}Whole::Whole(int

i,

int

j,

int

k):

two(i),

one(j),date(k){}//...其他函數(shù)的實(shí)現(xiàn)略69前向引用聲明類(lèi)應(yīng)該先聲明,后使用如果需要在某個(gè)類(lèi)的聲明之前,引用該類(lèi),則應(yīng)進(jìn)行前向引用聲明。前向引用聲明只為程序引入一個(gè)標(biāo)識(shí)符,但具體聲明在其他地方。70前向引用聲明舉例71//前向引用聲明class

B;class

A

{public:void

f(B

b);};class

B

{public:void

g(A

a);};前向引用聲明注意事項(xiàng)使用前向引用聲明雖然可以解決一些問(wèn)題,但它并不是萬(wàn)能的。需要注意的是,盡管使用了前向引用聲明,但是在提供一個(gè)完整的類(lèi)聲明之前,不能聲明該類(lèi)的對(duì)象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類(lèi)的對(duì)象。請(qǐng)看下面的程序段:class

Fred;//前向引用聲明class

Barney

{Fred

x;//錯(cuò)誤:類(lèi)Fred的聲明尚不完善};class

Fred

{Barney

y;};72前向引用聲明注意事項(xiàng)73class

Fred; //前向引用聲明//錯(cuò)誤:Fred類(lèi)的對(duì)象在定義之前被使用class

Barney

{public:……void

method()

{x.yabbaDabbaDo();}private:Fred

&x;//正確,經(jīng)過(guò)前向引用聲明,可以聲明Fred類(lèi)的對(duì)象引用};class

Fred

{public:void

yabbaDabbaDo();private:Barney

&y;};類(lèi)的組合前向引用聲明注意事項(xiàng)應(yīng)該記?。寒?dāng)你使用前向引用聲明時(shí),你只能使用被聲明的符號(hào),而不能涉

及類(lèi)的任何細(xì)節(jié)。744.5

UML簡(jiǎn)介UML語(yǔ)言是一種可視化的的面向?qū)ο蠼UZ(yǔ)言。UML有三個(gè)基本的部分事物(Things)UML中重要的組成部分,在模型中屬于最靜態(tài)的部分,代表概念上的或物理上的元素關(guān)系(Relationships)關(guān)系把事物緊密聯(lián)系在一起圖(Diagrams)圖是很多有相互相關(guān)的事物的組75UML圖形標(biāo)識(shí)UML中有4種類(lèi)型的事物結(jié)構(gòu)事物(Structural

things)動(dòng)作事物(Behavioral

things)分組事物(Grouping

things)注釋事物(Annotational

things)76UML圖形標(biāo)識(shí)UML中的關(guān)系依賴(lài)(Dependencies)關(guān)聯(lián)(Association)泛化(Generalization)實(shí)現(xiàn)(Realization)77UML圖形標(biāo)識(shí)UML中的9種圖類(lèi)圖(Class

diagram)對(duì)象圖(Object

diagram)用例圖(Usecasediagram)順序圖(Sequence

diagram)協(xié)作圖(Collaborationdiagram)狀態(tài)圖(Statechart

diagram)活動(dòng)圖(Activity

diagram)組件圖(Componentdiagram)實(shí)施圖(Deployment

diagram)78UML圖形標(biāo)識(shí)類(lèi)圖舉例:Clock類(lèi)的完整表示Clock類(lèi)的簡(jiǎn)潔表示79Clockhour

:

intminute

:

intsecond

:

int+

showTime()

:

void+

setTime(newH:int=0,newM:int=0,newS:int=0):voidClockUML圖形標(biāo)識(shí)對(duì)象圖myClock

:

Clockhour

:

intminute

:

intsecond

:

intmyClock

:

ClockUML80圖形標(biāo)識(shí)類(lèi)與對(duì)象關(guān)系的圖形標(biāo)識(shí)依賴(lài)關(guān)系圖中的“類(lèi)A”是源,“類(lèi)B”是目標(biāo),表示

“類(lèi)A”使用了“類(lèi)B”,或稱(chēng)“類(lèi)A”依賴(lài)

“類(lèi)B”類(lèi)A類(lèi)B81UML圖形標(biāo)識(shí)類(lèi)與對(duì)象關(guān)系的圖形標(biāo)識(shí)類(lèi)A類(lèi)B82作用關(guān)系——關(guān)聯(lián)重?cái)?shù)A 重?cái)?shù)B圖中的“重?cái)?shù)A”決定了類(lèi)B的每個(gè)對(duì)象與類(lèi)A的多少個(gè)對(duì)象發(fā)生作用,同樣“重?cái)?shù)B”決定了類(lèi)A的每個(gè)對(duì)象與類(lèi)B的多少個(gè)對(duì)象發(fā)生作用。UML圖形標(biāo)識(shí)類(lèi)與對(duì)象關(guān)系的圖形標(biāo)識(shí)包含關(guān)系——聚集和組合類(lèi)A類(lèi)B重?cái)?shù)A重?cái)?shù)B類(lèi)A類(lèi)B重?cái)?shù)A83重?cái)?shù)B聚集表示類(lèi)之間的關(guān)系是整體與部分的關(guān)系,

“包含”、“組成”、“分為……部分”等都是聚集關(guān)系。UML圖形標(biāo)識(shí)類(lèi)與對(duì)象關(guān)系的圖形標(biāo)識(shí)繼承關(guān)系——泛化父類(lèi)A父類(lèi)B子類(lèi)1子類(lèi)2UML84圖形標(biāo)識(shí)注釋在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛線(xiàn)連接到UML的其他元素上,它是一種用于在圖中附加文字注釋的機(jī)制。注釋文字UML85圖形標(biāo)識(shí)結(jié)構(gòu)體結(jié)構(gòu)體是一種特殊形態(tài)的類(lèi)與類(lèi)的唯一區(qū)別:類(lèi)的缺省訪(fǎng)問(wèn)權(quán)限是

private,結(jié)構(gòu)體的缺省訪(fǎng)問(wèn)權(quán)限是public

結(jié)構(gòu)體存在的主要原因:與C語(yǔ)言保持兼容什么時(shí)候用結(jié)構(gòu)體而不用類(lèi)定義主要用來(lái)保存數(shù)據(jù)、而沒(méi)有什么操作的類(lèi)型人們習(xí)慣將結(jié)構(gòu)體的數(shù)據(jù)成員設(shè)為公有,因此這時(shí)用結(jié)構(gòu)體更方便86結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體的定義和初始化結(jié)構(gòu)體定義struct

結(jié)構(gòu)體名稱(chēng){公有成員protected:保護(hù)型成員private:私有成員};一些結(jié)構(gòu)體變量的初始化可以用以下形式類(lèi)型名變量名={成員數(shù)據(jù)1初值,成員數(shù)據(jù)2初值,……};87結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體舉例(例4-7)88#include

<iostream>#include

<iomanip>#include

<string>using

namespace

std;//學(xué)生信息結(jié)構(gòu)體//學(xué)號(hào)//姓名,字符串對(duì)象,將在第6章//性別//年齡struct

Student

{intnum;string

name;詳細(xì)介紹char

sex;int

age;};結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體舉例(例4-7)89int

main(){Studentstu

=

{

97001,

"Lin

Lin",

'F',19};cout<<"Num:"<<stu.num

<<

endl;cout<<"Name:"<<

<<

endl;cout<<"Sex:"<<stu.sex

<<

endl;cout<<"Age:"<<stu.age

<<

endl;return

0;}運(yùn)行結(jié)果:Num:

97001Name:

Lin

LinSex:

FAge:

19結(jié)構(gòu)體與聯(lián)合體聯(lián)合體聲明形式union

聯(lián)合體名稱(chēng)

{公有成員protected:保護(hù)型成員private:私有成員};特點(diǎn):成員共用相同的內(nèi)存單元

任何兩個(gè)成員不會(huì)同時(shí)有效90結(jié)構(gòu)體與聯(lián)合體聯(lián)合體的內(nèi)存分配//表示成績(jī)的聯(lián)合體//等級(jí)制的成績(jī)//只記是否通過(guò)課程的成績(jī)//百分制的成績(jī)union

Mark

{char

grade;bool

pass;int

percent;};Mark

grade

pass

percent91結(jié)構(gòu)體與聯(lián)合體無(wú)名聯(lián)合無(wú)名聯(lián)合沒(méi)有標(biāo)記名,只是聲明一個(gè)成員項(xiàng)的集合,這些成員項(xiàng)具有相同的內(nèi)存地址,可以由成員項(xiàng)的名字直接訪(fǎng)問(wèn)。例:union

{int

i;float

f;}在程序中可以這樣使用:i

=

10;f

=2.2;92結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)93#include

<string>#include

<iostream>using

namespace

std;class

ExamInfo

{private:string

name; //課程名稱(chēng)enum{GRADE,PASS,

PERCENTAGE}mode;//采用何種計(jì)分方式union

{char

grade;bool

pass;int

percent;//等級(jí)制的成績(jī)//只記是否通過(guò)課程的成績(jī)//百分制的成績(jī)};結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)94public://三種構(gòu)造函數(shù),分別用等級(jí)、是否通過(guò)和百分初始化ExamInfo(string

name,

char

grade):

name(name),

mode(GRADE),

grade(grade)

{

}ExamInfo(string

name,

bool

pass):

name(name),

mode(PASS),

pass(pass)

{

}ExamInfo(string

name,

int

percent):

name(name),

mode(PERCENTAGE),

percent(percent){

}void

show();}結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)95switch(mode){caseGRADE:cout<<grade;break;voidExamInfo::show()

{cout<<name<<":";case

PASS:

cout

<<

(pass

?

"PASS"

:"FAIL");

break;case

PERCENTAGE:

cout

<<

percent;

break;}cout<<endl;}結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)96int

main()

{ExamInfo

course1("English",

'B');ExamInfo

course2("Calculus",

true);ExamInfo

course3("C++

Programming",

85);course1.show();course2.show();course3.show();return

0;}運(yùn)行結(jié)果:English:

BCalculus:PASSC++

Programming:

85結(jié)構(gòu)體與聯(lián)合體位域位域的聲明形式數(shù)據(jù)類(lèi)型說(shuō)明符 成員名

:

位數(shù);位域的作用通過(guò)“打包”,使類(lèi)的不同成員共享相同的字節(jié),從而節(jié)省存儲(chǔ)空間。注意事項(xiàng)具體的打包方式,因編譯器而異;只有bool、char、int和枚舉類(lèi)型的成員,允許定義為位域;節(jié)省空間,但可能增加時(shí)間開(kāi)銷(xiāo)。97深度探索例4-9設(shè)計(jì)一個(gè)結(jié)構(gòu)體存儲(chǔ)學(xué)生的成績(jī)信息,需要包括學(xué)號(hào)、年級(jí)和成績(jī)?nèi)?xiàng)內(nèi)容,學(xué)號(hào)的范圍是0到99,999,999,年級(jí)分為freshman、sophomore、junior、senior四種,成績(jī)包括A、B、C、D四個(gè)等級(jí)。98深度探索例4-999#include

<iostream>using

namespace

std;enum

Level

{

FRESHMAN,

SOPHOMORE,

JUNIOR,

SENIOR

};enum

Grade{

A,B,

C,D};class

Student

{public:Student(unsigned

number,

Level

level,

Grade

grade):

number(number),

level(level),

grade(grade)

{

}voidshow();private:unsigned

number

:

27;Level

level

:

2;Grade

grade

:

2;};深度探索例4-9100"

<<

number

<<

endl;";void

Student::show()

{cout

<<

"Number:cout

<<

"Level:switch

(level)

{case

FRESHMAN: cout

<<

"freshman";

break;case

SOPHOMORE:

cout

<<

"sophomore";

break;case

JUNIOR:case

SENIOR:cout

<<

"junior";

break;cout

<<

"senior";

break;";}cout

<<

endl;cout

<<

"Grade:switch

(grade)

{case

A:

cout

<<

"A";

break;case

B:

cout

<<

"B";

break;case

C:

cout

<<

"C";

break;case

D:

cout

<<

"D";

break;}cout

<<

endl;}深度探索例4-9101int

main(){Students(12345678,

SOPHOMORE,B);cout

<<endl;"Size

of

Student:

"

<<sizeof(Student)

<<s.show();return

0;}運(yùn)行結(jié)果:(運(yùn)行結(jié)果第一行會(huì)因編譯環(huán)境的不同而有所差異)Size

of

Student:

4Number:Level:Grade:12345678sophomoreB深度探索臨時(shí)對(duì)象與類(lèi)型轉(zhuǎn)換(例4-2中Point構(gòu)造函數(shù):Point(int

xx=0,int

yy=0))臨時(shí)對(duì)象的顯式創(chuàng)建可以直接調(diào)用類(lèi)的構(gòu)造函數(shù)顯式創(chuàng)建臨時(shí)對(duì)象例:Line

x(Point(1,1),Point(4,5));臨時(shí)對(duì)象到表達(dá)式執(zhí)行完畢后即銷(xiāo)毀單參數(shù)構(gòu)造函數(shù)可以設(shè)立類(lèi)型轉(zhuǎn)換Point(1)表示創(chuàng)建一個(gè)臨時(shí)對(duì)象,同時(shí)也表示顯式類(lèi)型轉(zhuǎn)換與Point(1)等價(jià)的形式:(Point)

1static_cast<Point>(1)無(wú)論形式為何,執(zhí)行轉(zhuǎn)換時(shí)都會(huì)創(chuàng)建臨時(shí)對(duì)象102深度探索隱含轉(zhuǎn)換由構(gòu)造函數(shù)確立的類(lèi)型轉(zhuǎn)換,可以隱含執(zhí)行例:Line

x(1,

4);效果:構(gòu)造以(1,0)和(4,0)兩坐標(biāo)為端點(diǎn)的線(xiàn)段,這里Point的構(gòu)造函數(shù)被隱含調(diào)用避免隱含轉(zhuǎn)換的發(fā)生在構(gòu)造函數(shù)中使用explicit關(guān)鍵字,explicit要寫(xiě)在類(lèi)定義中的構(gòu)造函數(shù)前103深度探索例4-10104#include

<iostream>using

namespace

std;class

Complex{//復(fù)數(shù)類(lèi)

private:float

real,

imag;//復(fù)數(shù)的實(shí)部和虛部public://構(gòu)造函數(shù),可以當(dāng)作隱式類(lèi)型轉(zhuǎn)換使用Complex(float

real=0,floatimag

=0):real(real),

imag(imag)

{

}Complex

add(Complex

c){ //復(fù)數(shù)加法,生成臨時(shí)對(duì)象并返回return

Complex(real

+

c.real,

imag+c.imag);}Complex

sub(Complex

c){ //復(fù)數(shù)減法,生成臨時(shí)對(duì)象并返回return

Complex(real

-c.real,

imag

-c.imag);}Complex

mul(Complex

c){ //復(fù)數(shù)乘法,生成臨時(shí)對(duì)象并返回return

Complex(real

*

c.real

-

imag

*

c.imag,

real

*

c.imag

+

imag

*

c.real);}深度探索例4-10105voidshow(){ //顯示復(fù)數(shù)

if(imag>=0)cout<<real

<<"+

"<<imag<<'i'

<<endl;elsecout<<real

<<"-"<<

-imag

<<'i'<<endl;}};intmain()

{Complex

z(1,

2);z.add(Complex(3,

4)).show();//z=1+2i//Complex(3,

4)是臨時(shí)對(duì)象static_cast<Complex

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論