![實驗報告網(wǎng)工大大二上_第1頁](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152951.gif)
![實驗報告網(wǎng)工大大二上_第2頁](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152952.gif)
![實驗報告網(wǎng)工大大二上_第3頁](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152953.gif)
![實驗報告網(wǎng)工大大二上_第4頁](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152954.gif)
![實驗報告網(wǎng)工大大二上_第5頁](http://file4.renrendoc.com/view/e3cbd15bfb5bbfc53bddccb3af315295/e3cbd15bfb5bbfc53bddccb3af3152955.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C++語言程序設(shè)計第四章 類與對象2主要內(nèi)容面向?qū)ο蟪绦蛟O(shè)計的基本特點類和對象構(gòu)造函數(shù)和析構(gòu)函數(shù)類的組合UML圖形標識綜合實例——個人銀行賬戶管理程序深度探索教學(xué)重點面向?qū)ο蟪绦蛟O(shè)計的基本特點類和對象構(gòu)造函數(shù)和析構(gòu)函數(shù)類的組合UML圖形標識綜合實例——個人銀行賬戶管理程序深度探索教學(xué)難點面向?qū)ο蟪绦蛟O(shè)計的基本特點類和對象構(gòu)造函數(shù)和析構(gòu)函數(shù)類的組合UML圖形標識綜合實例——個人銀行賬戶管理程序深度探索面向過程的設(shè)計方法重點:如何實現(xiàn)的細節(jié)和過程,將數(shù)據(jù)與函數(shù)分開。形式:主模塊+若干個子模塊(main()+子函數(shù))。特點:自頂向下,逐步求精——功能分解。缺點:效率低,程序的可重用性差。5面向?qū)ο蟮姆椒康模簩崿F(xiàn)軟件設(shè)計的產(chǎn)業(yè)化。觀點:自然界是由實體(對象)所組成。程序設(shè)計方法:使用面向?qū)ο蟮挠^點來描述模仿并處理現(xiàn)實問題。要求:高度概括、分類、和抽象。64.1
面向?qū)ο蟪绦蛟O(shè)計的基本特點面向過程的程序設(shè)計面向?qū)ο蟮某绦蛟O(shè)計抽象繼承封裝多態(tài)抽象抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。代碼抽象:描述某類對象的共有的行為特征或具有的功能。84.1
面向?qū)ο蟪绦蛟O(shè)計的基本特點抽象實例——鐘表數(shù)據(jù)抽象:inthour,intminute,intsecond代碼抽象:
setTime(),showTime()9抽象實例——人數(shù)據(jù)抽象:string
name,string
gender,int
age,int
id代碼抽象:生物屬性角度:eat(),
step(),…社會屬性角度:work(),
study()
,…104.1
面向?qū)ο蟪绦蛟O(shè)計的基本特點封裝將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個有機的整體,也就是將數(shù)據(jù)與操作數(shù)據(jù)的函數(shù)代碼進行有機的結(jié)合,形成類,其中的數(shù)據(jù)和函數(shù)都是類的成員。11封裝12class Clock
{public:void
setTime(int
newH,int
newM,int
newS);void
showTime();private:int
hour,
minute,
second;};繼承繼承是C++中支持類的繼承機制,允許程序員在保持原有類特性的基礎(chǔ)上,進行更具體,更詳細的說明。13繼承Point
類void
InitP()void
Move()float
GetX()float
GetY()float
X,YRectanle
類float
W,Hvoid
InitR()float
GetW()float
GetH()多態(tài)多態(tài)性多態(tài)性是指一段程序能夠處理多種類型對象的能力。同一名稱,不同的功能實現(xiàn)方式在C++語言中,這種多態(tài)性可以通過強制多態(tài),重載多態(tài),類型參數(shù)化多態(tài)和包含多態(tài)4種形式來實現(xiàn)。15主要內(nèi)容面向?qū)ο蟪绦蛟O(shè)計的基本特點類和對象構(gòu)造函數(shù)和析構(gòu)函數(shù)類的組合UML圖形標識綜合實例——個人銀行賬戶管理程序深度探索164.2
類和對象類對象類的實例化17類的定義18class類名稱{public:外部接口private:私有成員protected:保護型成員}類成員訪問控制public:類的外部接口公有類型接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。示例:19Clock
xx.SetTime(12,30,56);x.ShowTime();類成員訪問控制private:私有類型成員只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。示例Clock
xx.Hour=12;x.Minute=30;x.Second=56x.SetTime(12,30,56);20×√類成員訪問控制如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。class
clock
{private:int
hour,
hinute,
second;public:void
setTime(int
newH,
int
newM,int
newS);void
showTime();};類成員訪問控制protected:保護類型成員與private類似,其差別表現(xiàn)在繼承與
派生時對派生類的影響不同,第七章講。22類的聲明——示例class
clock
{public:void
setTime(int
newH,
int
newM,int
newS);void
showTime();private:int
hour,
hinute,
second;};成員數(shù)據(jù)成員函數(shù)23類的成員函數(shù)在類中說明原型,可以在類外給出函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。允許聲明重載函數(shù)和帶默認形參值的函數(shù)24類的成員函數(shù)成員函數(shù)的聲明class
類名稱{public(protected,private)返回值類型函數(shù)成員名(參數(shù)表)}類的成員函數(shù)成員函數(shù)的實現(xiàn)返回值類型類名::函數(shù)成員名(參數(shù)表){函數(shù)體}類的成員函數(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();帶默認形參值的成員函數(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();注意:類成員函數(shù)的默認值,一定要寫在類定義中,而不能寫在類定義之外的函數(shù)實現(xiàn)中內(nèi)聯(lián)成員函數(shù)在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:隱式聲明:將函數(shù)體放在類的聲明中現(xiàn)式聲明:在類外使用inline關(guān)鍵字注意函數(shù)較簡單內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語句和switch語句)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;{對象對象類的對象是該類的某一特定實體,即類類型的變量。聲明形式:類名 對象名;例:Clock33myClock;類中成員的訪問方式類中成員互訪直接使用成員名類外訪問使用“對象名.成員名”方式訪問public屬性的成員類與對象示例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è)計的基本特點類和對象構(gòu)造函數(shù)和析構(gòu)函數(shù)類的組合UML圖形標識綜合實例——個人銀行賬戶管理程序深度探索4.3
構(gòu)造函數(shù)和析構(gòu)函數(shù)基本的數(shù)據(jù)類型變量的聲明
變量的初始化編譯器自動產(chǎn)生代碼來進行類類型對象的聲明
對象的初始化通過構(gòu)造函數(shù)來進行4.3
構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者說將對象初始化為一個特定的狀態(tài)。特征類的一個成員函數(shù),通常被聲明為公有函數(shù)函數(shù)名與類名相同,沒有返回值對象創(chuàng)建時由系統(tǒ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ù)的實現(xiàn):Clock::Clock(int
newH,
int
newM,
int
newS)
{hour
=
newH;41minute
=
newM;second
=
newS;}建立對象時構(gòu)造函數(shù)的作用:int
main()
{//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。Clock
c(0,0,0);c.showTime();return
0;}4.3
構(gòu)造函數(shù)和析構(gòu)函數(shù)問題:前面示例中,沒有定義構(gòu)造函數(shù),為什么程序能夠正常工作呢?編譯器自動生成一個隱含的默認構(gòu)造函數(shù),該構(gòu)造函數(shù)的參數(shù)列表和函數(shù)體皆為空class
Clock{public:Clock(){
}……}4.3
構(gòu)造函數(shù)和析構(gòu)函數(shù)默認構(gòu)造函數(shù):不帶任何形參用戶可自行定義如果用戶沒有定義任何構(gòu)造函數(shù),則系統(tǒng)自動生成一個“什么都不做”的構(gòu)造函數(shù)4.3
構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)小結(jié)在對象創(chuàng)建時由系統(tǒng)自動調(diào)用如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個隱含的參數(shù)列表為空的默認構(gòu)造函數(shù)允許為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶默認形參值的函數(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ù),其形參為本類的對象引用,其作用是使用一個已經(jīng)存在的對象(由復(fù)制構(gòu)造函數(shù)的參數(shù)指定),去初始化一個同類的新對象class
類名
{public
:類名(形參);//構(gòu)造函數(shù)類名(類名
&對象名);//拷貝構(gòu)造函數(shù)...};類名::類(類名
&對象名)//拷貝構(gòu)造函數(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)用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(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ù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒ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ù)的返回值是類對象時,系統(tǒ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如果程序員沒有為類聲明復(fù)制構(gòu)造函數(shù),則編譯器自己生成一個隱含的復(fù)制構(gòu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員。默認的復(fù)制構(gòu)造函數(shù)只能實現(xiàn)淺復(fù)制析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個隱含的析構(gòu)函數(shù)。53析構(gòu)函數(shù)特征是類的一個公有成員函數(shù)名稱由類名前加一個“~”構(gòu)成,沒有返回值,不接受任何參數(shù),可以是虛函數(shù)如果不顯示聲明,系統(tǒng)也會生成一個函數(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ù)的實現(xiàn)略56類的應(yīng)用舉例(例4-3)一圓形游泳池如圖所示,現(xiàn)在需在其周圍建一圓形過道,并在其四周圍上柵欄。柵欄價格為35元/米,過道造價為20元/平
方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計算并輸出過道和柵欄的造價。過道游泳池57#include
<iostream>using
namespace
std;const
float
PI
=
3.141593; //給出p的值const
float
FENCE_PRICE
=
35; //柵欄的單價const
float
CONCRETE_PRICE
=
20;//過道水泥單價class
Circle{//聲明定義類Circle
及其數(shù)據(jù)和方法public: //外部接口58Circle(float
r);float
circumference();float
area();//構(gòu)造函數(shù)//計算圓的周長//計算圓的面積private: //私有數(shù)據(jù)成員float
radius;//圓半徑};//類的實現(xiàn)//構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle::Circle(float
r){radius
=
r;}//計算圓的周長float
Circle::circumference()
{return
2
*
PI
*
radius;}//計算圓的面積float
Circle::area()
{return
PI
*
radius
*
radius;}59int
main
()
{float
radius;cout
<<
"Enter
the
radius
of
the
pool:
";//提示用戶輸入半徑cin
>>
radius;60Circlepool(radius);//游泳池邊界CirclepoolRim(radius+3);//柵欄//計算柵欄造價并輸出float
fenceCost
=
poolRim.circumference()
*FENCE_PRICE;cout
<<
"Fencing
Cost
is
$"
<<
fenceCost
<<endl;//計算過道造價并輸出float
concreteCost
=
(poolRim.area()
-
pool.area())
*CONCRETE_PRICE;cout
<<
"Concrete
Cost
is
$"
<<
concreteCost
<<
endl;return
0;}運行結(jié)果Enter
the
radius
of
the
pool:
10Fencing
Cost
is
$2858.85Concrete
Cost
is
$4335.4614.4
組合的概念類中的成員數(shù)據(jù)是另一個類的對象。可以在已有抽象的基礎(chǔ)上實現(xiàn)更復(fù)雜的抽象。62舉例63class
Point
{private:float
x,
y;//點的坐標public:Point(float
h,
float
v);//構(gòu)造函數(shù)float
getX();//取X坐標
float
getY();//取Y坐標void
draw();//在(x,y)處畫點};//...函數(shù)的實現(xiàn)略class
Line
{private:Point
p1,
p2;//線段的兩個端點
public:Line(Point
a,
Point
b);//構(gòu)造函數(shù)
void
draw(void);//畫出線段};//...函數(shù)的實現(xiàn)略64類組合的構(gòu)造函數(shù)設(shè)計原則:不僅要負責(zé)對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。聲明形式:類名::類名(對象成員所需的形參,本類成員形參):對象1(參數(shù)),對象2(參數(shù)),......{
本類初始化
}65類組合的構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)(按內(nèi)嵌時的聲明順序,先聲明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函數(shù)。(析構(gòu)函數(shù)的調(diào)用順序相反)初始化列表中未出現(xiàn)的內(nèi)嵌對象,用默認構(gòu)造函數(shù)(即無形參的)初始化系統(tǒng)自動生成的隱含的默認構(gòu)造函數(shù)中,內(nèi)嵌對象全部用默認構(gòu)造函數(shù)初始化66類的組合舉例(二)67class
Part{//部件類
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ù)的實現(xiàn)略69前向引用聲明類應(yīng)該先聲明,后使用如果需要在某個類的聲明之前,引用該類,則應(yīng)進行前向引用聲明。前向引用聲明只為程序引入一個標識符,但具體聲明在其他地方。70前向引用聲明舉例71//前向引用聲明class
B;class
A
{public:void
f(B
b);};class
B
{public:void
g(A
a);};前向引用聲明注意事項使用前向引用聲明雖然可以解決一些問題,但它并不是萬能的。需要注意的是,盡管使用了前向引用聲明,但是在提供一個完整的類聲明之前,不能聲明該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類的對象。請看下面的程序段:class
Fred;//前向引用聲明class
Barney
{Fred
x;//錯誤:類Fred的聲明尚不完善};class
Fred
{Barney
y;};72前向引用聲明注意事項73class
Fred; //前向引用聲明//錯誤:Fred類的對象在定義之前被使用class
Barney
{public:……void
method()
{x.yabbaDabbaDo();}private:Fred
&x;//正確,經(jīng)過前向引用聲明,可以聲明Fred類的對象引用};class
Fred
{public:void
yabbaDabbaDo();private:Barney
&y;};類的組合前向引用聲明注意事項應(yīng)該記?。寒?dāng)你使用前向引用聲明時,你只能使用被聲明的符號,而不能涉
及類的任何細節(jié)。744.5
UML簡介UML語言是一種可視化的的面向?qū)ο蠼UZ言。UML有三個基本的部分事物(Things)UML中重要的組成部分,在模型中屬于最靜態(tài)的部分,代表概念上的或物理上的元素關(guān)系(Relationships)關(guān)系把事物緊密聯(lián)系在一起圖(Diagrams)圖是很多有相互相關(guān)的事物的組75UML圖形標識UML中有4種類型的事物結(jié)構(gòu)事物(Structural
things)動作事物(Behavioral
things)分組事物(Grouping
things)注釋事物(Annotational
things)76UML圖形標識UML中的關(guān)系依賴(Dependencies)關(guān)聯(lián)(Association)泛化(Generalization)實現(xiàn)(Realization)77UML圖形標識UML中的9種圖類圖(Class
diagram)對象圖(Object
diagram)用例圖(Usecasediagram)順序圖(Sequence
diagram)協(xié)作圖(Collaborationdiagram)狀態(tài)圖(Statechart
diagram)活動圖(Activity
diagram)組件圖(Componentdiagram)實施圖(Deployment
diagram)78UML圖形標識類圖舉例:Clock類的完整表示Clock類的簡潔表示79Clockhour
:
intminute
:
intsecond
:
int+
showTime()
:
void+
setTime(newH:int=0,newM:int=0,newS:int=0):voidClockUML圖形標識對象圖myClock
:
Clockhour
:
intminute
:
intsecond
:
intmyClock
:
ClockUML80圖形標識類與對象關(guān)系的圖形標識依賴關(guān)系圖中的“類A”是源,“類B”是目標,表示
“類A”使用了“類B”,或稱“類A”依賴
“類B”類A類B81UML圖形標識類與對象關(guān)系的圖形標識類A類B82作用關(guān)系——關(guān)聯(lián)重數(shù)A 重數(shù)B圖中的“重數(shù)A”決定了類B的每個對象與類A的多少個對象發(fā)生作用,同樣“重數(shù)B”決定了類A的每個對象與類B的多少個對象發(fā)生作用。UML圖形標識類與對象關(guān)系的圖形標識包含關(guān)系——聚集和組合類A類B重數(shù)A重數(shù)B類A類B重數(shù)A83重數(shù)B聚集表示類之間的關(guān)系是整體與部分的關(guān)系,
“包含”、“組成”、“分為……部分”等都是聚集關(guān)系。UML圖形標識類與對象關(guān)系的圖形標識繼承關(guān)系——泛化父類A父類B子類1子類2UML84圖形標識注釋在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛線連接到UML的其他元素上,它是一種用于在圖中附加文字注釋的機制。注釋文字UML85圖形標識結(jié)構(gòu)體結(jié)構(gòu)體是一種特殊形態(tài)的類與類的唯一區(qū)別:類的缺省訪問權(quán)限是
private,結(jié)構(gòu)體的缺省訪問權(quán)限是public
結(jié)構(gòu)體存在的主要原因:與C語言保持兼容什么時候用結(jié)構(gòu)體而不用類定義主要用來保存數(shù)據(jù)、而沒有什么操作的類型人們習(xí)慣將結(jié)構(gòu)體的數(shù)據(jù)成員設(shè)為公有,因此這時用結(jié)構(gòu)體更方便86結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體的定義和初始化結(jié)構(gòu)體定義struct
結(jié)構(gòu)體名稱{公有成員protected:保護型成員private:私有成員};一些結(jié)構(gòu)體變量的初始化可以用以下形式類型名變量名={成員數(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é)號//姓名,字符串對象,將在第6章//性別//年齡struct
Student
{intnum;string
name;詳細介紹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;}運行結(jié)果:Num:
97001Name:
Lin
LinSex:
FAge:
19結(jié)構(gòu)體與聯(lián)合體聯(lián)合體聲明形式union
聯(lián)合體名稱
{公有成員protected:保護型成員private:私有成員};特點:成員共用相同的內(nèi)存單元
任何兩個成員不會同時有效90結(jié)構(gòu)體與聯(lián)合體聯(lián)合體的內(nèi)存分配//表示成績的聯(lián)合體//等級制的成績//只記是否通過課程的成績//百分制的成績union
Mark
{char
grade;bool
pass;int
percent;};Mark
grade
pass
percent91結(jié)構(gòu)體與聯(lián)合體無名聯(lián)合無名聯(lián)合沒有標記名,只是聲明一個成員項的集合,這些成員項具有相同的內(nèi)存地址,可以由成員項的名字直接訪問。例: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; //課程名稱enum{GRADE,PASS,
PERCENTAGE}mode;//采用何種計分方式union
{char
grade;bool
pass;int
percent;//等級制的成績//只記是否通過課程的成績//百分制的成績};結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)94public://三種構(gòu)造函數(shù),分別用等級、是否通過和百分初始化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;}運行結(jié)果:English:
BCalculus:PASSC++
Programming:
85結(jié)構(gòu)體與聯(lián)合體位域位域的聲明形式數(shù)據(jù)類型說明符 成員名
:
位數(shù);位域的作用通過“打包”,使類的不同成員共享相同的字節(jié),從而節(jié)省存儲空間。注意事項具體的打包方式,因編譯器而異;只有bool、char、int和枚舉類型的成員,允許定義為位域;節(jié)省空間,但可能增加時間開銷。97深度探索例4-9設(shè)計一個結(jié)構(gòu)體存儲學(xué)生的成績信息,需要包括學(xué)號、年級和成績?nèi)梼?nèi)容,學(xué)號的范圍是0到99,999,999,年級分為freshman、sophomore、junior、senior四種,成績包括A、B、C、D四個等級。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;}運行結(jié)果:(運行結(jié)果第一行會因編譯環(huán)境的不同而有所差異)Size
of
Student:
4Number:Level:Grade:12345678sophomoreB深度探索臨時對象與類型轉(zhuǎn)換(例4-2中Point構(gòu)造函數(shù):Point(int
xx=0,int
yy=0))臨時對象的顯式創(chuàng)建可以直接調(diào)用類的構(gòu)造函數(shù)顯式創(chuàng)建臨時對象例:Line
x(Point(1,1),Point(4,5));臨時對象到表達式執(zhí)行完畢后即銷毀單參數(shù)構(gòu)造函數(shù)可以設(shè)立類型轉(zhuǎn)換Point(1)表示創(chuàng)建一個臨時對象,同時也表示顯式類型轉(zhuǎn)換與Point(1)等價的形式:(Point)
1static_cast<Point>(1)無論形式為何,執(zhí)行轉(zhuǎn)換時都會創(chuàng)建臨時對象102深度探索隱含轉(zhuǎn)換由構(gòu)造函數(shù)確立的類型轉(zhuǎn)換,可以隱含執(zhí)行例:Line
x(1,
4);效果:構(gòu)造以(1,0)和(4,0)兩坐標為端點的線段,這里Point的構(gòu)造函數(shù)被隱含調(diào)用避免隱含轉(zhuǎn)換的發(fā)生在構(gòu)造函數(shù)中使用explicit關(guān)鍵字,explicit要寫在類定義中的構(gòu)造函數(shù)前103深度探索例4-10104#include
<iostream>using
namespace
std;class
Complex{//復(fù)數(shù)類
private:float
real,
imag;//復(fù)數(shù)的實部和虛部public://構(gòu)造函數(shù),可以當(dāng)作隱式類型轉(zhuǎn)換使用Complex(float
real=0,floatimag
=0):real(real),
imag(imag)
{
}Complex
add(Complex
c){ //復(fù)數(shù)加法,生成臨時對象并返回return
Complex(real
+
c.real,
imag+c.imag);}Complex
sub(Complex
c){ //復(fù)數(shù)減法,生成臨時對象并返回return
Complex(real
-c.real,
imag
-c.imag);}Complex
mul(Complex
c){ //復(fù)數(shù)乘法,生成臨時對象并返回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)是臨時對象static_cast<Complex
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年院線經(jīng)營項目規(guī)劃申請報告模板
- 2025年防結(jié)皮劑項目提案報告模板
- 2025年會議場地租賃合同書模板
- 2025年勞務(wù)派遣人員安全生產(chǎn)責(zé)任協(xié)議
- 2025年產(chǎn)品銷售合同范本官方
- 2025年鐵軌建設(shè)項目立項申請報告模范
- 2025年節(jié)日禮品項目規(guī)劃申請報告模板
- 2025年規(guī)劃管理服務(wù)項目申請報告
- 2025年臨時聘用人員安全生產(chǎn)協(xié)議
- 2025年中信銀行信用卡還款合同
- 常見食物的嘌呤含量表匯總
- 人教版數(shù)學(xué)八年級下冊同步練習(xí)(含答案)
- SB/T 10752-2012馬鈴薯雪花全粉
- 2023年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(英語)試題庫含答案解析
- 濕型砂中煤粉作用及檢測全解析
- 積累運用表示動作的詞語課件
- 機動車登記證書英文證書模板
- 第8課《山山水水》教學(xué)設(shè)計(新人教版小學(xué)美術(shù)六年級上冊)
- T∕ZSQX 008-2020 建設(shè)工程全過程質(zhì)量行為導(dǎo)則
- 質(zhì)量管理體系基礎(chǔ)知識培訓(xùn)-2016
- 甲醇催化劑說明書
評論
0/150
提交評論