![實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第1頁(yè)](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152951.gif)
![實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第2頁(yè)](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152952.gif)
![實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第3頁(yè)](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152953.gif)
![實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第4頁(yè)](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152954.gif)
![實(shí)驗(yàn)報(bào)告網(wǎng)工大大二上_第5頁(yè)](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152955.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度敬老院消防安全檢查及整改服務(wù)合同
- 2025年度建筑砂漿行業(yè)發(fā)展趨勢(shì)預(yù)測(cè)采購(gòu)合同
- 2025年度商業(yè)空間工裝設(shè)計(jì)施工一體化合同
- 電力工程項(xiàng)目中的合同風(fēng)險(xiǎn)管理
- 2025年度養(yǎng)老機(jī)構(gòu)入住服務(wù)與管理合同
- 2025年度建筑工程結(jié)算協(xié)議書(shū)及節(jié)能評(píng)估合同范本
- 2025年度智能穿戴合伙創(chuàng)業(yè)合同協(xié)議書(shū)
- 2025年工作餐配送及維護(hù)服務(wù)合同范本
- 2025年度離婚協(xié)議書(shū)專(zhuān)業(yè)翻譯與審核合同
- 2025年度人力資源居間招聘服務(wù)合同范本
- 2023年菏澤醫(yī)學(xué)專(zhuān)科學(xué)校單招綜合素質(zhì)模擬試題及答案解析
- 鋁合金門(mén)窗設(shè)計(jì)說(shuō)明
- 常見(jiàn)食物的嘌呤含量表匯總
- 小學(xué)數(shù)學(xué)-三角形面積計(jì)算公式的推導(dǎo)教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 人教版數(shù)學(xué)八年級(jí)下冊(cè)同步練習(xí)(含答案)
- SB/T 10752-2012馬鈴薯雪花全粉
- 2023年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ))試題庫(kù)含答案解析
- 秦暉社會(huì)主義思想史課件
- 積累運(yùn)用表示動(dòng)作的詞語(yǔ)課件
- 機(jī)動(dòng)車(chē)登記證書(shū)英文證書(shū)模板
- 質(zhì)量管理體系基礎(chǔ)知識(shí)培訓(xùn)-2016
評(píng)論
0/150
提交評(píng)論