實驗報告網(wǎng)工大大二上_第1頁
實驗報告網(wǎng)工大大二上_第2頁
實驗報告網(wǎng)工大大二上_第3頁
實驗報告網(wǎng)工大大二上_第4頁
實驗報告網(wǎng)工大大二上_第5頁
已閱讀5頁,還剩106頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

評論

0/150

提交評論