Chap6_類與對(duì)象2.ppt_第1頁
Chap6_類與對(duì)象2.ppt_第2頁
Chap6_類與對(duì)象2.ppt_第3頁
Chap6_類與對(duì)象2.ppt_第4頁
Chap6_類與對(duì)象2.ppt_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第6講類與對(duì)象的進(jìn)一步討論 對(duì)象指針 數(shù)組 參數(shù)變量作用域this指針類對(duì)象作為成員靜態(tài)成員友元類模板 1 1對(duì)象指針 創(chuàng)建對(duì)象時(shí) 系統(tǒng)會(huì)為該對(duì)象分配相應(yīng)的存儲(chǔ)空間存放其數(shù)據(jù)成員 并調(diào)用構(gòu)造函數(shù) 其起始地址就是對(duì)象的地址即指針 對(duì)象指針 指向?qū)ο蟮闹羔?創(chuàng)建對(duì)象指針 類名 對(duì)象指針名 Circlecir p 在堆中創(chuàng)建動(dòng)態(tài)對(duì)象 用new為對(duì)象申請(qǐng)空間時(shí)需調(diào)用構(gòu)造函數(shù) 此時(shí)創(chuàng)建了一個(gè)對(duì)象 如 Circle p1 newCircle 調(diào)用無參的構(gòu)造函數(shù)Circle p2 newCircle 2 5 調(diào)用有參的構(gòu)造函數(shù)Circle p3 newCircle 3 此時(shí)必須使用無參的構(gòu)造函數(shù) 否則不能動(dòng)態(tài)創(chuàng)建 用delete命令為對(duì)象刪除空間deletep1 delete p3 不可省略 否則出現(xiàn)運(yùn)行錯(cuò)誤此時(shí)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù) 1 2對(duì)象數(shù)組及其創(chuàng)建 對(duì)象數(shù)組 數(shù)組中的每個(gè)數(shù)組元素都為同一類的對(duì)象 對(duì)象數(shù)組的聲明根據(jù)構(gòu)造函數(shù)的不同而不同 若有不需參數(shù)的構(gòu)造函數(shù) 用戶沒定義構(gòu)造函數(shù) 使用默認(rèn)構(gòu)造函數(shù) 有用戶定義的不帶參數(shù)或帶默認(rèn)參數(shù)的構(gòu)造函數(shù) 則定義數(shù)組時(shí)可不提供實(shí)參 初始化數(shù)據(jù) 其形式為 類名數(shù)組名 常量表達(dá)式 若只有用戶自定義的有參構(gòu)造函數(shù) 則必須在創(chuàng)建對(duì)象數(shù)組時(shí)為構(gòu)造函數(shù)提供實(shí)參 初始化數(shù)據(jù) 其形式為 類名數(shù)組名 常量表達(dá)式 類名 參數(shù)表 類名 參數(shù)表 當(dāng)構(gòu)造函數(shù)只需提供一個(gè)參數(shù)時(shí)也可寫為 類名數(shù)組名 常量表達(dá)式 常量1 常量2 常量n 常量表達(dá)式表示數(shù)組的大小 創(chuàng)建對(duì)象數(shù)組時(shí) 系統(tǒng)為整個(gè)數(shù)組分配存儲(chǔ)空間 存儲(chǔ)每個(gè)對(duì)象元素的數(shù)據(jù)成員 并為每個(gè)對(duì)象元素調(diào)用相應(yīng)的構(gòu)造函數(shù) 創(chuàng)建對(duì)象數(shù)組例 創(chuàng)建對(duì)象數(shù)組 使用無參構(gòu)造函數(shù)初始化數(shù)組中的元素 此時(shí)各個(gè)元素中的radius成員值均為1 Circlec 3 使用有參構(gòu)造函數(shù)初始化對(duì)象元素Circlec 3 Circle 1 Circle 2 Circle 3 當(dāng)構(gòu)造函數(shù)只需提供一個(gè)參數(shù)時(shí)也可寫為Circlec 3 1 2 3 訪問數(shù)組元素對(duì)象的各公有成員 doublet1 c 1 getRadius include circle h includedoublesum Circlec intsize addcircleareas doublesum 0 for inti 0 i size i sum c i getArea returnsum printanarrayofcirclesandtheirtotalareavoidprintCircleArray Circlec intsize for inti 0 i size i cout c i getRadius t c i getArea endl cout thetotalareasofcirclesis sum c size voidmain Circleca 5 Circle 2 Circle 3 5 Circle 5 Circle 3 2 Circle 6 printCircleArray ca SIZE TotalArea cpp 對(duì)象數(shù)組范例 計(jì)算數(shù)組中所有圓的面積之和 Circleca 5 2 3 5 5 3 2 6 voidmain Clockclocks 3 Clock 11 25 10 Clock 10 25 30 Clock 8 17 20 對(duì)象數(shù)組初始化for inti 0 i 3 i clocks i showTime 若采用 Clockclocks 3 則出錯(cuò) 因?yàn)榇藭r(shí)要調(diào)用無參的構(gòu)造函數(shù) 修改 1 增加無參構(gòu)造函數(shù) 2 改為帶默認(rèn)參數(shù)的構(gòu)造函數(shù) 此時(shí)可寫為 Clockclocks 3 includeclassClock private inthour minute second public Clock inth intm ints Clock int 0 int 0 int 0 voidshowTime Clock Clock inth intt ints hour h minute m second s voidClock showTime cout hour minute second endl Clockclocks 3 1 2 3 表示給數(shù)組的三個(gè)元素中的hour賦初值 Clockclocks 3 Clock 1 2 3 表示給數(shù)組的第一個(gè)元素賦初值 其余兩個(gè)元素使用無參構(gòu)造函數(shù) 不可省略 1 3對(duì)象作為函數(shù)參數(shù) 對(duì)象可作為函數(shù)的參數(shù) 分為傳值方式和引用方式傳值方式 對(duì)象值 為形參對(duì)象分配空間 調(diào)用復(fù)制構(gòu)造函數(shù) 需要額外的時(shí)間和內(nèi)存空間 對(duì)象指針 為形參對(duì)象指針分配空間 減少時(shí)間和內(nèi)存空間的消耗 引用方式 一般使用較多不需要額外的時(shí)間和內(nèi)存空間 而且使用對(duì)象引用參數(shù)比使用指針參數(shù)更為簡(jiǎn)單 例 對(duì)象作為參數(shù) classdeclaration circle h classCircle private doubleradius public Circle Circle double doublegetArea doublegetRadius voidsetRadius double circle cpp classdefinition include circle h Circle Circle radius 1 Circle Circle doublenewRadius radius newRadius doubleCircle getArea returnradius radius 3 14159 doubleCircle getRadius returnradius voidCircle setRadius doubler radius r includevoidChangeCircle Circlec c setRadius c getRadius 2 cout c getRadius t c getArea endl voidmain Circlec1 1 5 ChangeCircle c1 傳值 調(diào)用復(fù)制構(gòu)造函數(shù)cout c1 getRadius t c1 getArea endl 對(duì)象值作為參數(shù) 為形參對(duì)象分配空間 調(diào)用復(fù)制構(gòu)造函數(shù) 形參值的修改不影響實(shí)參 328 27431 57 06858 includevoidChangeCircle Circle c c setRadius c getRadius 2 coutgetRadius getArea endl voidmain Circlec1 1 5 ChangeCircle 對(duì)象指針作為參數(shù) 在被調(diào)函數(shù)中通過指針對(duì)主調(diào)函數(shù)中對(duì)象進(jìn)行修改 形參值的修改不影響實(shí)參 328 2743328 2743 includevoidChangeCircle Circle 對(duì)象引用作為參數(shù) 不為形參分配空間 形參使用實(shí)參的空間 對(duì)形參值的修改就是對(duì)實(shí)參的修改 328 2743328 2743 includevoidChangeCircle Circlec c setRadius c getRadius 2 cout c getRadius t c getArea endl voidmain Circlec1 1 5 ChangeCircle c1 傳值 調(diào)用復(fù)制構(gòu)造函數(shù)cout c1 getRadius t c1 getArea endl includevoidChangeCircle Circle includevoidChangeCircle Circle c c setRadius c getRadius 2 coutgetRadius getArea endl voidmain Circlec1 1 5 ChangeCircle 參數(shù) 區(qū)分三種形式 2變量作用域 變量的作用域 是指程序中變量有效的區(qū)域 變量的作用域分為 全局域 局部域和類作用域 局部變量 在函數(shù)內(nèi) 或塊內(nèi) 聲明 只能在函數(shù)內(nèi)部使用 全局變量 在所有函數(shù)和類外聲明 如果局部變量與全局變量同名 則在局部變量作用域同名全局變量被屏蔽 使用的是局部變量 類作用域 即類聲明和類的實(shí)現(xiàn)范圍 類的所有成員在類作用域中相互間具有無限制的訪問權(quán) 類的所有成員都可以訪問該類的所有數(shù)據(jù)成員和成員函數(shù) 而類內(nèi)成員對(duì)類作用域以外的數(shù)據(jù)或函數(shù)進(jìn)行的訪問是受限制的 同樣 類作用域以外的數(shù)據(jù)或函數(shù)對(duì)類內(nèi)成員的訪問也是受限制的 依據(jù)成員的訪問權(quán)限 如果成員函數(shù)內(nèi)一個(gè)局部變量與一個(gè)數(shù)據(jù)成員同名 在該函數(shù)內(nèi)同名數(shù)據(jù)成員將被屏蔽 使用的是局部變量 利用作用域操作符區(qū)分全局變量和類的數(shù)據(jù)成員 includeintpp 0 全局變量classCtest public intpp voidrp private intnumber floatsocre voidCtest rp rp 函數(shù)為test類的成員函數(shù) pp 11 該變量為全局變量pppp 100 該變量為test類的數(shù)據(jù)成員 voidmain Ctesta a rp cout pp endl 該變量為全局變量ppcout a pp endl 11100 類成員函數(shù)的局部變量隱藏了類的同名數(shù)據(jù)成員 includeclassCTest public voidf1 voidf2 voidshow cout m m endl private intm voidCTest f1 m 5 voidCTest f2 intm m為函數(shù)f2的局部變量 m 10 為局部變量m賦值 voidmain CTesta a f1 訪問類的公有成員a show a f2 a show m 5m 5 3this指針 對(duì)象成員的存儲(chǔ) 創(chuàng)建對(duì)象時(shí)存儲(chǔ)空間的分配 只為對(duì)象的數(shù)據(jù)成員分配相應(yīng)的存儲(chǔ)空間 成員函數(shù)存儲(chǔ)在代碼區(qū) 創(chuàng)建n個(gè)對(duì)象 每個(gè)對(duì)象都有各自的數(shù)據(jù)成員存儲(chǔ)空間 而n個(gè)對(duì)象都調(diào)用相同的函數(shù)代碼段 成員函數(shù)如何區(qū)分是哪個(gè)對(duì)象在對(duì)其進(jìn)行調(diào)用呢 include include Circle h voidmain Circlecircle1 circle2 circle1 getArea circle2 getArea circle1 setRadius 3 circle2 setRadius 2 5 circle1 getArea circle2 getArea 代碼區(qū) 棧 getArea setRadius radius radius getRadius circle1 circle2 this指針是什么 this是一個(gè)指向調(diào)用該函數(shù)的對(duì)象的指針常量 隱含在類的成員函數(shù)中的一個(gè)對(duì)象指針參數(shù) 系統(tǒng)自動(dòng)產(chǎn)生 每當(dāng)成員函數(shù)被調(diào)用時(shí) this指針自動(dòng)指向調(diào)用該成員函數(shù)的對(duì)象 即this指針為當(dāng)前對(duì)象的地址 this指針的系統(tǒng)定義格式為 類名 constthis 該指針是系統(tǒng)自動(dòng)產(chǎn)生的 不需要人為定義 并且它是指針常量 不能被賦值 只能使用它 利用this指針能保證對(duì)象的每一個(gè)成員函數(shù)能夠訪問其對(duì)應(yīng)的數(shù)據(jù)成員 從而使C 中的各個(gè)對(duì)象既具有自己的數(shù)據(jù)成員空間 同時(shí)又可共用同一個(gè)成員函數(shù)代碼 this指針是每個(gè) 非靜態(tài) 成員函數(shù)都有的參數(shù) 因此可在函數(shù)體中使用this指針 this指針是隱式使用的 是系統(tǒng)為成員函數(shù)自動(dòng)生成的參數(shù) doubleCircle getArea returnradius radius 3 14159 doubleCircle getArea Circle constthis 即在形參表表中增加一個(gè)形參為this指針 returnthis radius this radius 3 14159 在調(diào)用成員函數(shù)時(shí) cout circle1 getArea 實(shí)際調(diào)用方式為 cout circle1 getArea 這些都是編譯系統(tǒng)自動(dòng)實(shí)現(xiàn)的 不必人為地在形參中增加this指針 理解this的含義 includeclassCClock public CClock inth intm ints 構(gòu)造函數(shù) CClock 析構(gòu)函數(shù) cout this this endl voidsetTime inth intm ints voidshowTime private inthour minute second 數(shù)據(jù)成員 CClock CClock inth intm ints 構(gòu)造函數(shù)的定義 cout thisofconstruction this endl hour h minute m second s voidCClock setTime inth intm ints cout thisofSettime this endl hour h minute m second s voidCClock showTime cout thisofShowtime this endl cout It s hour minute second now endl include include Clock h voidmain CClockClk1 1 2 3 Clk2 4 5 6 cout 調(diào)用對(duì)象a的成員函數(shù)f 的含義 在調(diào)用成員函數(shù)f時(shí)使this指針指向?qū)ο骯 從而訪問對(duì)象a的成員 需要時(shí) 在成員函數(shù)中也可以顯式地使用this指針 當(dāng)成員函數(shù)的形參 局部變量與類中數(shù)據(jù)成員同名時(shí) 數(shù)據(jù)成員被屏蔽 因此若需要在成員函數(shù)中訪問被屏蔽的數(shù)據(jù)成員 可使用this指針進(jìn)行訪問 形式為 this 數(shù)據(jù)成員 this 數(shù)據(jù)成員注意不能寫成 this 數(shù)據(jù)成員因?yàn)槌蓡T運(yùn)算符 的優(yōu)先級(jí)別高于指針運(yùn)算符 this指針可使用 例 Circle類定義 this classdeclaration circle h classCircle private doubleradius public doublegetArea doublegetRadius voidsetRadius double circle cpp classdefinition doubleCircle getArea returnradius radius 3 14159 doubleCircle getRadius returnradius voidCircle setRadius doubleradius this radius radius 4對(duì)象成員 對(duì)象作為類的數(shù)據(jù)成員 C 中 類的數(shù)據(jù)成員可以是其它類的對(duì)象 稱為對(duì)象成員 classCDate public CDate int int int voidDisp voidSetDate inty intm intd voidGetDate int classCTime public CTime int int int int int int voidsetTime inth intm ints voiddisp 成員函數(shù)private inthour minute second 數(shù)據(jù)成員CDatedd 有對(duì)象成員的類的構(gòu)造函數(shù) 為具有對(duì)象成員的類創(chuàng)建對(duì)象時(shí) 必然要?jiǎng)?chuàng)建對(duì)象成員 因此在創(chuàng)建對(duì)象時(shí) 系統(tǒng)首先調(diào)用對(duì)象成員的構(gòu)造函數(shù) 然后再執(zhí)行本類構(gòu)造函數(shù)的函數(shù)體 因此必須在構(gòu)造函數(shù)體前調(diào)用對(duì)象成員的構(gòu)造函數(shù) 利用構(gòu)造函數(shù)的初始化列表調(diào)用對(duì)象成員的構(gòu)造函數(shù) 構(gòu)造函數(shù)初始化列表一般形式為 類名 類名 形參表 對(duì)象成員1 實(shí)參表 對(duì)象成員2 實(shí)參表 類的非對(duì)象成員的初始化 只有一個(gè)對(duì)象成員的類的構(gòu)造函數(shù)初始化列表的例子 類名 類名 形參表 對(duì)象成員 實(shí)參列表 類的非對(duì)象成員的初始化 classCTime public CTime int int int int int int voidsetTime inth intm ints voiddisp 成員函數(shù)private inthour minute second 數(shù)據(jù)成員CDatedd CTime CTime inty intm intd inth intmt ints dd y m d hour h minute mt second s cout InConstructorofCTime n CTime CTime inty intm intd inth intmt ints dd y m d hour h minute mt second s cout InConstructorofCTime n 或 includeclassCDate public CDate int int int CDate voidDisp voidSetDate inty intm intd voidGetDate int classCTime public CTime int int int int int int voidsetTime inth intm ints voiddisp 成員函數(shù)private inthour minute second 數(shù)據(jù)成員CDatedd CTime CTime inty intm intd inth intmt ints dd y m d hour h minute mt second s cout InConstructorofCTime n CTime CTime cout InDestructorofCTime n voidCTime setTime inth intm ints hour h minute m second s voidCTime disp dd Disp cout hour minute second endl voidmain CTimett 2010 11 11 11 11 11 tt disp 完整程序 有對(duì)象成員的類的構(gòu)造函數(shù)的說明 如果有對(duì)象成員的類的構(gòu)造函數(shù)沒有調(diào)用對(duì)象成員的構(gòu)造函數(shù) 此時(shí)編譯后出現(xiàn)語法錯(cuò)誤 Date noappropriatedefaultconstructoravailable因?yàn)榇藭r(shí)要調(diào)用對(duì)象成員dd的無參構(gòu)造函數(shù) 而CDate類中只定義了一個(gè)有參的構(gòu)造函數(shù) 為此必須使用構(gòu)造函數(shù)初始化列表形式來調(diào)用CDate類的構(gòu)造函數(shù) CTime CTime inty intm intd inth intmt ints hour h minute mt second s dd CDate y m d classCDate public CDate int int int 有參voidDisp voidSetDate int int int voidGetDate int classCDate public 無參構(gòu)造函數(shù)CDate int 2010 int 11 int 11 voidDisp voidSetDate int int int voidGetDate int CTime CTime inty intm intd inth intmt ints hour h minute mt second s cout InConstructorofCTime n 會(huì)自動(dòng)調(diào)用對(duì)象成員的無參構(gòu)造函數(shù) 如果對(duì)象成員沒有無參構(gòu)造函數(shù) 則會(huì)出現(xiàn)編譯錯(cuò)誤 如果有多個(gè)對(duì)象成員 則按照類內(nèi)聲明的順序依次調(diào)用它們的構(gòu)造函數(shù) 析構(gòu)函數(shù)的調(diào)用順序相反 多個(gè)對(duì)象成員 classCDateTime public CDateTime int int int int int int voiddisp 成員函數(shù)private CDatedd CTimett classCDate public CDate int int int voidDisp 顯示年月日voidSetDate inty intm intd voidGetDate int classCTime public CTime int int int voidsetTime inth intm ints voiddisp private inthour minute second includeclassCDate public CDate int int int CDate voidDisp 顯示年月日voidSetDate inty intm intd voidGetDate int 日期類 classCTime public CTime int int int CTime voidsetTime inth intm ints voiddisp 成員函數(shù)private inthour minute second 數(shù)據(jù)成員 CTime CTime inth intmt ints hour h minute mt second s cout InConstructorofCTime n CTime CTime cout InDestructorofCTime n voidCTime setTime inth intm ints hour h minute m second s voidCTime disp cout hour minute second endl 時(shí)間類 classCDateTime public CDateTime int int int int int int CDateTime voiddisp 成員函數(shù)private CDatedd CTimett CDateTime CDateTime inty intm intd inth intmt ints dd y m d tt h mt s cout InConstructorofCDateTime n CDateTime CDateTime cout InDestructorofCDateTime n voidCDateTime disp dd Disp tt disp voidmain CDateTimett 2010 11 11 11 11 11 tt disp 日期時(shí)間類 include includeclassPoint public Point intxx 0 intyy 0 X xx Y yy Point Point classDistance private Pointp1 p2 數(shù)據(jù)成員 對(duì)象 doubledist public Distance Pointxp1 Pointxp2 構(gòu)造函數(shù)doublegetDis returndist Distance Distance Pointxp1 Pointxp2 p1 xp1 p2 xp2 cout Distance構(gòu)造函數(shù)被調(diào)用 endl doublex double p1 getX p2 getX doubley double p1 getY p2 getY dist sqrt x x y y voidmain Pointmyp1 1 1 myp2 4 5 Distancemyd myp1 myp2 cout Thedistanceis cout myd getDis endl 例 對(duì)象作為類的數(shù)據(jù)成員 復(fù)制構(gòu)造函數(shù) 5靜態(tài)成員static 靜態(tài)成員staticmembers 定義類時(shí) 用關(guān)鍵字static聲明的數(shù)據(jù)成員或成員函數(shù)稱為靜態(tài)成員 staticdatafield靜態(tài)數(shù)據(jù)成員存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū) 只有一個(gè) 因此該類所有對(duì)象的靜態(tài)數(shù)據(jù)成員都共用同一個(gè)存儲(chǔ)空間 即靜態(tài)數(shù)據(jù)成員被類的所有對(duì)象共享 staticfunction靜態(tài)成員函數(shù) 沒有this指針作為參數(shù) 不能確定調(diào)用它的那個(gè)特定對(duì)象 無法訪問對(duì)象的非靜態(tài)成員 因此 一般只訪問靜態(tài)數(shù)據(jù)成員或全局變量 只能調(diào)用類的其它靜態(tài)成員函數(shù) 實(shí)例成員instancemembers 非靜態(tài) 是與類的特定對(duì)象聯(lián)系在一起的 對(duì)于同一個(gè)類的不同對(duì)象 實(shí)例成員是不同的 通常 一個(gè)類的兩個(gè)對(duì)象會(huì)擁有不同的內(nèi)存空間來存放它們的實(shí)例數(shù)據(jù)成員 每個(gè)對(duì)象的數(shù)據(jù)成員互不干擾 靜態(tài)成員的應(yīng)用1 Circle類 classCircle private doubleradius staticintnumOfObjects 表示已創(chuàng)建圓類對(duì)象的個(gè)數(shù)public Circle Circle double Circle doublegetArea doublegetRadius voidsetRadius double returnthenumberofcircleobjectsstaticintgetNumberOfObjects 返回已創(chuàng)建對(duì)象個(gè)數(shù) circle h 靜態(tài)數(shù)據(jù)成員的初始化 靜態(tài)數(shù)據(jù)成員必須在類外進(jìn)行初始化 不能在類定義體內(nèi)初始化 類是一種描述并非具體實(shí)現(xiàn) 初始化時(shí)必須加類名限定 且不加static 未初始化時(shí)系統(tǒng)自動(dòng)賦初值為0 數(shù)據(jù)類型類名 靜態(tài)數(shù)據(jù)成員 初值 數(shù)據(jù)類型類名 靜態(tài)數(shù)據(jù)成員 intCircle numberOfObjects 0 無論建立多少個(gè)該類的對(duì)象 編譯器只為靜態(tài)數(shù)據(jù)成員分配一份內(nèi)存空間 供該類的各個(gè)對(duì)象公用 靜態(tài)數(shù)據(jù)成員可以為public或者private 此時(shí)必須定義靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)的調(diào)用形式類名 靜態(tài)函數(shù)名 實(shí)參列表 較好 提高可讀性對(duì)象名 靜態(tài)函數(shù)名 實(shí)參列表 在類聲明中將某個(gè)成員函數(shù)聲明為靜態(tài)后 在類實(shí)現(xiàn)中不能再使用static關(guān)鍵字 否則出現(xiàn)編譯錯(cuò)誤 靜態(tài)成員函數(shù)沒有this指針 因此它不能直接訪問對(duì)象中的非靜態(tài)數(shù)據(jù)成員 一般只用于訪問靜態(tài)數(shù)據(jù)成員或全局變量 只能調(diào)用類的其它靜態(tài)成員函數(shù) 如果靜態(tài)成員函數(shù)要對(duì)對(duì)象的非靜態(tài)數(shù)據(jù)成員進(jìn)行操作 則對(duì)象必須以參數(shù)的形式傳遞給靜態(tài)成員函數(shù) 指出它作用在哪個(gè)對(duì)象上 此時(shí)需要使用 對(duì)象名 成員名 無this 非靜態(tài)成員函數(shù)可以直接訪問類的任意成員 靜態(tài)和非靜態(tài)成員 include circle h intCircle numberOfObjects 0 Circle Circle radius 1 numberOfObjects Circle Circle doublenewRadius radius newRadius numberOfObjects doubleCircle getArea returnradius radius 3 14159 doubleCircle getRadius returnradius voidCircle setRadius doubler radius r intCircle getNumberOfObjects returnnumberOfObjects Circle Circle numberOfObjects Circle類的實(shí)現(xiàn)circle cpp 靜態(tài)數(shù)據(jù)成員的初始化 靜態(tài)成員函數(shù) 靜態(tài)數(shù)據(jù)成員 include circle h includevoidmain Circlecir1 cout Circle getNumberOfObjects endl Circlecir2 2 cout Circle getNumberOfObjects endl cout cir1 getRadius endl cout cir1 getArea endl cout cir1 getNumberOfObjects endl cout cir2 getRadius endl cout cir2 getArea endl cout cir2 getNumberOfObjects endl testCircle cpp 類名 靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)的訪問 include circle h intCircle numberOfObjects 0 Circle Circle radius 1 numberOfObjects Circle Circle doublenewRadius radius newRadius numberOfObjects doubleCircle getArea returnradius radius 3 14159 doubleCircle getRadius returnradius voidCircle setRadius doubler radius r intCircle getNumberOfObjects returnnumberOfObjects Circle Circle numberOfObjects 完整程序 include circle h includevoidmain Circlecir1 cout Circle getNumberOfObjects endl Circlecir2 2 cout Circle getNumberOfObjects endl cout cir1 getRadius endl cout cir1 getArea endl cout cir1 getNumberOfObjects endl cout cir2 getRadius endl cout cir2 getArea endl cout cir2 getNumberOfObjects endl Circle p1 p2 p1 newCircle cout cir1 getNumberOfObjects endl p2 newCircle cout cir2 getNumberOfObjects endl deletep2 cout cir1 getNumberOfObjects endl deletep1 cout cir2 getNumberOfObjects endl classCircle doubleradius staticintnumOfObjects public Circle Circle double Circle doublegetArea doublegetRadius voidsetRadius double staticintgetNumberOfObjects 靜態(tài)成員的應(yīng)用 為什么需要靜態(tài)成員 以往要在一個(gè)范圍內(nèi)共享某個(gè)數(shù)據(jù)可設(shè)為全局對(duì)象 但如果希望在類范圍內(nèi)共享數(shù)據(jù) 則需要使用靜態(tài)變量 staticvariable 也稱為類變量 classvariable 在定義類時(shí)如何確定一個(gè)變量或函數(shù)應(yīng)該是實(shí)例的還是靜態(tài)的 如果變量或函數(shù)是依賴具體類實(shí)例的 那么就應(yīng)該聲明為實(shí)例的 例如 每個(gè)圓都有自己的半徑值 半徑依賴于具體的圓 因此將radius聲明為Circle類的一個(gè)實(shí)例變量 而numberOfObjects不依賴于任何具體的實(shí)例 應(yīng)該聲明為靜態(tài)的 如果變量或函數(shù)不依賴于任何類實(shí)例 那么就應(yīng)該聲明為靜態(tài)的 例如 因?yàn)槿w中國(guó)人都是 黃皮膚 中國(guó)人的膚色這個(gè)屬性SkinColor 應(yīng)該設(shè)為static類別 但姓名Name應(yīng)為實(shí)例變量 不能為static型 否則全體中國(guó)人都是同一姓名 違背邏輯 定義枚舉類型colorenumcolor YELLOW WHITE BLACK BROWN classChinese public staticcolorgetSkinColor Chinese 靜態(tài)成員的應(yīng)用2 Chinese類 include chinese h include includecolorChinese SkinColor YELLOW colorChinese getSkinColor Chinese Chinese類的實(shí)現(xiàn)chinese pp 在靜態(tài)成員函數(shù)中用 對(duì)象名 成員名 訪問實(shí)例數(shù)據(jù)成員 include include chinese h voidmain ChineseLi Liming Chinese getSkinColor Li Li ShowMessage ChineseWa Wangke Chinese getSkinColor Wa Wa ShowMessage testChinese cpp 6友元friend 一個(gè)類的私有成員不能在類作用域外被訪問 但有時(shí)允許一些可依賴的函數(shù)和類訪問 從而方便編程 在類的聲明中可使用關(guān)鍵字friend聲明友元函數(shù)和友元類 這些函數(shù)和類就能訪問類的所有成員 包括私有成員 稱為類的友員函數(shù)和友員類 如果友元函數(shù) 一般函數(shù)或其它類的成員函數(shù) 稱為友元函數(shù) 如果友元是一個(gè)類 稱為友元類 友元類中的所有成員函數(shù)都成為友元函數(shù) 友元函數(shù)是在類定義體內(nèi)用friend聲明的非本類成員函數(shù) 聲明的形式為 在其函數(shù)聲明前加friend friend返回值類型函數(shù)名 形參表 友元函數(shù)可以是一個(gè)普通的函數(shù) 也可以是其他類的成員函數(shù) 類的友元函數(shù)必須在類的定義體內(nèi)聲明函數(shù)原形 1 普通函數(shù)作友元函數(shù) 例 使用友元函數(shù)確定兩圓的關(guān)系 用兩個(gè)圓心距與兩圓半徑和的差值判斷 若 0 相交 0 相切 0 相離Circle類表示圓類 友元函數(shù)fErr計(jì)算差值 6 1 友元函數(shù) classCircle public Circle double double double doublegetRadius doublegetX doublegetY frienddoublefErr Circle 友元函數(shù)為普通函數(shù)例 Circle類的聲明 circle h include circle h Circle Circle doublerr doublexx doubleyy radius rr x xx y yy doubleCircle getRadius returnradius doubleCircle getX returnx doubleCircle getY returny Circle類的實(shí)現(xiàn) circle cpp testFriendCircle cpp include include include circle h doublefErr Circle include include time h include date h Date Date inty intm intd year y month m day d voidDate setDate inty intm intd year y month m day d voidDate print Time 2 其它類的成員函數(shù)作友元函數(shù)例 Date類中的成員函數(shù)print作為Time類的友元函數(shù) ifndefDATE H defineDATE HclassTime classDate public Date inty 2000 intm 1 intd 1 voidsetDate inty intm intd voidprint Time endif 類的提前引用聲明 date h date類的實(shí)現(xiàn) date cpp ifndefTIME H defineTIME H include date h classTime public Time inth intm ints voidsetTime inth intm ints voidshowTime friendvoidDate print Time endif include include time h Time Time inth intm ints hour h minute m second s voidTime showTime cout hour minute second endl time類的實(shí)現(xiàn) time cpp time類的聲明time h testFriend cpp include include time h include date h voidmain Timeclk 8 10 10 Datedt 2006 10 23 dt print clk 6 2 友元類 classB friendclassA 注意 1 友元關(guān)系是不能傳遞的 2 友元關(guān)系是是單向的 若A是B的友元 A的成員函數(shù)可以訪問B的數(shù)據(jù)成員 但B類的成員函數(shù)不可以訪問A的數(shù)據(jù)成員 同函數(shù)一樣 類也可以聲明為另一個(gè)類的友元 稱為友元類 若A為B的友元類 則A類的所有成員函數(shù)都是B類的友元函數(shù) 都可以訪問B類的私有和保護(hù)成員 聲明的形式為 includeclassCDate classCClock public CClock inth intm ints hour h minute m second s voidsetTime inth intm ints voidshowTime friendclassCDate private inthour minute second voidCClock setTime inth intm ints hour h minute m second s voidCClock showTime cout hour minute second endl classCDate public CDate inty 2000 intm 1 intd 1 voidsetDate inty intm intd voidprint CClock CDate CDate inty intm intd year y month m day d voidCDate setDate inty intm intd year y month m day d voidCDate print CClock 友元類例 一個(gè)文件實(shí)現(xiàn) 友元說明 友元提供了不同類或?qū)ο蟮某蓡T函數(shù)之間 類的成員函數(shù)與一般函數(shù)之間進(jìn)行數(shù)據(jù)共享的機(jī)制 通過友元 一個(gè)普通函數(shù)或者其他類的成員函數(shù)可以訪問到封裝于某一個(gè)類中的私有數(shù)據(jù) 友元函數(shù)不是本類的成員函數(shù) 卻可以訪問類中的任何成員 包括private protected public等 面向?qū)ο缶褪菫榱舜_保數(shù)據(jù)封裝和隱藏 而友元破壞了這一原則 建議盡量不使用或少使用友元 7類模板template 為了實(shí)現(xiàn)代碼重用 代碼應(yīng)該是通用的 即不受使用的數(shù)據(jù)類型和操作的影響 即無論使用什么數(shù)據(jù)類型 通用代碼是不變的 C 提供了函數(shù)和類機(jī)制 可用來設(shè)計(jì)可重用軟件 而模板 template 則提供了在函數(shù)和類中將類型作為參數(shù)的能力 從而可設(shè)計(jì)具有通用類型的函數(shù)或類 而編譯器會(huì)在編譯時(shí)將通用類型確定為一種具體的類型 函數(shù)模板類模板 用戶可以為類聲明一種模式 使得類中的某些數(shù)據(jù)成員 某些成員函數(shù)的參數(shù) 某些成員函數(shù)的返回值能取任意類型 創(chuàng)建對(duì)象時(shí)指定類型 intmaxValue intx inty returnx y x y doublemaxValue doublex doubley returnx y x y charmaxValue charx chary returnx y x y 這三個(gè)函數(shù)幾乎一樣 差別僅僅在于使用的類型不同 若能定義一個(gè)具有通用類型的函數(shù) 則可以節(jié)省大量輸入代碼的時(shí)間 節(jié)省存儲(chǔ)空間 并使程序更易于維護(hù) GenericTypemaxValue GenericTypex GenericTypey returnx y x y GenericType表示可適用于所有類型 如int double char 函數(shù)模板 函數(shù)模板 C 允許定義具有通用類型的函數(shù)模板 函數(shù)模板的定義以關(guān)鍵字template開始 后面跟著一個(gè)參數(shù)列表 毎個(gè)參數(shù)前面都必須有關(guān)鍵字typename或class 即 template templateprefix 模板前綴template typename都是關(guān)鍵字 typename可用class代替 T typeparameter 習(xí)慣上用T表示類型參數(shù) 可象普通類型一樣使用 可以用來指定函數(shù)返回類型 聲明函數(shù)參數(shù)以及聲明函數(shù)中的變量 提示 可以使用或指定類型參數(shù) 使用更好些 因?yàn)樗x更明確 而有可能與類聲明混淆 函數(shù)模板 includetemplateTmaxValue Tx Ty returnx y x y voidmain intn 5 m 3 doubled 5 5 c 2 8 cout maxValue n m endl cout maxValue d c endl 注 函數(shù)模板不是一個(gè)真正意義上的函數(shù) 它僅僅是一個(gè)函數(shù)模型 當(dāng)編譯器遇到函數(shù)調(diào)用時(shí) 將依據(jù)模板給出的代碼通過檢驗(yàn)參數(shù)的數(shù)據(jù)類型 產(chǎn)生重載函數(shù) 類模板的定義 類是對(duì)象的抽象與描述 而類模板是類的抽象 類模板的聲明形式 templateclass類名 數(shù)據(jù)成員的聲明及成員函數(shù)的原型說明 成員函數(shù)的定義形式 template函數(shù)類型類名 函數(shù)名 參數(shù)列表 類模板例 數(shù)組類模板CArray 前面已介紹過的CArray類表示的是一個(gè)整型數(shù)組類 類似的還可以定義長(zhǎng)整型數(shù)組 實(shí)型數(shù)組 字符數(shù)組類等 可分別定義多個(gè)類 另一個(gè)方法是模仿函數(shù)模板 設(shè)計(jì)能處理任意類型的數(shù)組類 這時(shí)可抽象出數(shù)組類模板 templateclassCArray public CArray intsize 創(chuàng)建長(zhǎng)度為size的數(shù)組CArray CArray templateCArray CArray intsize 構(gòu)造函數(shù)定義 data newT size 申請(qǐng)內(nèi)存空間size size 設(shè)置數(shù)組元素個(gè)數(shù) templateCArray CArray CArray templateclassCArray public CArray intsize CArray CArray 聲明了類模板后 就可以用類模板定義對(duì)象了 定義類模板對(duì)象與定義一般的對(duì)象類似 區(qū)別是在定義時(shí)必須指明傳遞給類模板的數(shù)據(jù)類型 并將類型放在尖括號(hào)中 如CArraya 10 數(shù)據(jù)類型int將替換參數(shù)T出現(xiàn)的任何地方CArrayb 5 數(shù)據(jù)類型double將替換參數(shù)T出現(xiàn)的任何地方當(dāng)使用無參的構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí) 定義形式為 類名對(duì)象 若使用有參的構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí) 定義形式為 類名對(duì)象 構(gòu)造函數(shù)實(shí)參列表 用類模板定義對(duì)象 CArray類模板的應(yīng)用testArray cpp includevoidmain CArraya 10 CArrayb 10 for inti 0 i 10 i a setAt i i b setAt i i 2 for i 0 i 10 i cout a i a getAt i t cout endl for i 0 i 10 i cout b i b getAt i t cout endl 提示 通常將類的聲明和實(shí)現(xiàn)分隔在兩個(gè)文件中 但是對(duì)于類模板 將聲明和實(shí)現(xiàn)放在一起更

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論