




已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6講類與對象的進一步討論 對象指針 數(shù)組 參數(shù)變量作用域this指針類對象作為成員靜態(tài)成員友元類模板 1 1對象指針 創(chuàng)建對象時 系統(tǒng)會為該對象分配相應的存儲空間存放其數(shù)據成員 并調用構造函數(shù) 其起始地址就是對象的地址即指針 對象指針 指向對象的指針 創(chuàng)建對象指針 類名 對象指針名 Circlecir p 在堆中創(chuàng)建動態(tài)對象 用new為對象申請空間時需調用構造函數(shù) 此時創(chuàng)建了一個對象 如 Circle p1 newCircle 調用無參的構造函數(shù)Circle p2 newCircle 2 5 調用有參的構造函數(shù)Circle p3 newCircle 3 此時必須使用無參的構造函數(shù) 否則不能動態(tài)創(chuàng)建 用delete命令為對象刪除空間deletep1 delete p3 不可省略 否則出現(xiàn)運行錯誤此時會自動調用析構函數(shù) 1 2對象數(shù)組及其創(chuàng)建 對象數(shù)組 數(shù)組中的每個數(shù)組元素都為同一類的對象 對象數(shù)組的聲明根據構造函數(shù)的不同而不同 若有不需參數(shù)的構造函數(shù) 用戶沒定義構造函數(shù) 使用默認構造函數(shù) 有用戶定義的不帶參數(shù)或帶默認參數(shù)的構造函數(shù) 則定義數(shù)組時可不提供實參 初始化數(shù)據 其形式為 類名數(shù)組名 常量表達式 若只有用戶自定義的有參構造函數(shù) 則必須在創(chuàng)建對象數(shù)組時為構造函數(shù)提供實參 初始化數(shù)據 其形式為 類名數(shù)組名 常量表達式 類名 參數(shù)表 類名 參數(shù)表 當構造函數(shù)只需提供一個參數(shù)時也可寫為 類名數(shù)組名 常量表達式 常量1 常量2 常量n 常量表達式表示數(shù)組的大小 創(chuàng)建對象數(shù)組時 系統(tǒng)為整個數(shù)組分配存儲空間 存儲每個對象元素的數(shù)據成員 并為每個對象元素調用相應的構造函數(shù) 創(chuàng)建對象數(shù)組例 創(chuàng)建對象數(shù)組 使用無參構造函數(shù)初始化數(shù)組中的元素 此時各個元素中的radius成員值均為1 Circlec 3 使用有參構造函數(shù)初始化對象元素Circlec 3 Circle 1 Circle 2 Circle 3 當構造函數(shù)只需提供一個參數(shù)時也可寫為Circlec 3 1 2 3 訪問數(shù)組元素對象的各公有成員 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 對象數(shù)組范例 計算數(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 對象數(shù)組初始化for inti 0 i 3 i clocks i showTime 若采用 Clockclocks 3 則出錯 因為此時要調用無參的構造函數(shù) 修改 1 增加無參構造函數(shù) 2 改為帶默認參數(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ù)組的三個元素中的hour賦初值 Clockclocks 3 Clock 1 2 3 表示給數(shù)組的第一個元素賦初值 其余兩個元素使用無參構造函數(shù) 不可省略 1 3對象作為函數(shù)參數(shù) 對象可作為函數(shù)的參數(shù) 分為傳值方式和引用方式傳值方式 對象值 為形參對象分配空間 調用復制構造函數(shù) 需要額外的時間和內存空間 對象指針 為形參對象指針分配空間 減少時間和內存空間的消耗 引用方式 一般使用較多不需要額外的時間和內存空間 而且使用對象引用參數(shù)比使用指針參數(shù)更為簡單 例 對象作為參數(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 傳值 調用復制構造函數(shù)cout c1 getRadius t c1 getArea endl 對象值作為參數(shù) 為形參對象分配空間 調用復制構造函數(shù) 形參值的修改不影響實參 328 27431 57 06858 includevoidChangeCircle Circle c c setRadius c getRadius 2 coutgetRadius getArea endl voidmain Circlec1 1 5 ChangeCircle 對象指針作為參數(shù) 在被調函數(shù)中通過指針對主調函數(shù)中對象進行修改 形參值的修改不影響實參 328 2743328 2743 includevoidChangeCircle Circle 對象引用作為參數(shù) 不為形參分配空間 形參使用實參的空間 對形參值的修改就是對實參的修改 328 2743328 2743 includevoidChangeCircle Circlec c setRadius c getRadius 2 cout c getRadius t c getArea endl voidmain Circlec1 1 5 ChangeCircle c1 傳值 調用復制構造函數(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ù)內 或塊內 聲明 只能在函數(shù)內部使用 全局變量 在所有函數(shù)和類外聲明 如果局部變量與全局變量同名 則在局部變量作用域同名全局變量被屏蔽 使用的是局部變量 類作用域 即類聲明和類的實現(xiàn)范圍 類的所有成員在類作用域中相互間具有無限制的訪問權 類的所有成員都可以訪問該類的所有數(shù)據成員和成員函數(shù) 而類內成員對類作用域以外的數(shù)據或函數(shù)進行的訪問是受限制的 同樣 類作用域以外的數(shù)據或函數(shù)對類內成員的訪問也是受限制的 依據成員的訪問權限 如果成員函數(shù)內一個局部變量與一個數(shù)據成員同名 在該函數(shù)內同名數(shù)據成員將被屏蔽 使用的是局部變量 利用作用域操作符區(qū)分全局變量和類的數(shù)據成員 includeintpp 0 全局變量classCtest public intpp voidrp private intnumber floatsocre voidCtest rp rp 函數(shù)為test類的成員函數(shù) pp 11 該變量為全局變量pppp 100 該變量為test類的數(shù)據成員 voidmain Ctesta a rp cout pp endl 該變量為全局變量ppcout a pp endl 11100 類成員函數(shù)的局部變量隱藏了類的同名數(shù)據成員 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指針 對象成員的存儲 創(chuàng)建對象時存儲空間的分配 只為對象的數(shù)據成員分配相應的存儲空間 成員函數(shù)存儲在代碼區(qū) 創(chuàng)建n個對象 每個對象都有各自的數(shù)據成員存儲空間 而n個對象都調用相同的函數(shù)代碼段 成員函數(shù)如何區(qū)分是哪個對象在對其進行調用呢 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是一個指向調用該函數(shù)的對象的指針常量 隱含在類的成員函數(shù)中的一個對象指針參數(shù) 系統(tǒng)自動產生 每當成員函數(shù)被調用時 this指針自動指向調用該成員函數(shù)的對象 即this指針為當前對象的地址 this指針的系統(tǒng)定義格式為 類名 constthis 該指針是系統(tǒng)自動產生的 不需要人為定義 并且它是指針常量 不能被賦值 只能使用它 利用this指針能保證對象的每一個成員函數(shù)能夠訪問其對應的數(shù)據成員 從而使C 中的各個對象既具有自己的數(shù)據成員空間 同時又可共用同一個成員函數(shù)代碼 this指針是每個 非靜態(tài) 成員函數(shù)都有的參數(shù) 因此可在函數(shù)體中使用this指針 this指針是隱式使用的 是系統(tǒng)為成員函數(shù)自動生成的參數(shù) doubleCircle getArea returnradius radius 3 14159 doubleCircle getArea Circle constthis 即在形參表表中增加一個形參為this指針 returnthis radius this radius 3 14159 在調用成員函數(shù)時 cout circle1 getArea 實際調用方式為 cout circle1 getArea 這些都是編譯系統(tǒng)自動實現(xiàn)的 不必人為地在形參中增加this指針 理解this的含義 includeclassCClock public CClock inth intm ints 構造函數(shù) CClock 析構函數(shù) cout this this endl voidsetTime inth intm ints voidshowTime private inthour minute second 數(shù)據成員 CClock CClock inth intm ints 構造函數(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 調用對象a的成員函數(shù)f 的含義 在調用成員函數(shù)f時使this指針指向對象a 從而訪問對象a的成員 需要時 在成員函數(shù)中也可以顯式地使用this指針 當成員函數(shù)的形參 局部變量與類中數(shù)據成員同名時 數(shù)據成員被屏蔽 因此若需要在成員函數(shù)中訪問被屏蔽的數(shù)據成員 可使用this指針進行訪問 形式為 this 數(shù)據成員 this 數(shù)據成員注意不能寫成 this 數(shù)據成員因為成員運算符 的優(yōu)先級別高于指針運算符 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對象成員 對象作為類的數(shù)據成員 C 中 類的數(shù)據成員可以是其它類的對象 稱為對象成員 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ù)據成員CDatedd 有對象成員的類的構造函數(shù) 為具有對象成員的類創(chuàng)建對象時 必然要創(chuàng)建對象成員 因此在創(chuàng)建對象時 系統(tǒng)首先調用對象成員的構造函數(shù) 然后再執(zhí)行本類構造函數(shù)的函數(shù)體 因此必須在構造函數(shù)體前調用對象成員的構造函數(shù) 利用構造函數(shù)的初始化列表調用對象成員的構造函數(shù) 構造函數(shù)初始化列表一般形式為 類名 類名 形參表 對象成員1 實參表 對象成員2 實參表 類的非對象成員的初始化 只有一個對象成員的類的構造函數(shù)初始化列表的例子 類名 類名 形參表 對象成員 實參列表 類的非對象成員的初始化 classCTime public CTime int int int int int int voidsetTime inth intm ints voiddisp 成員函數(shù)private inthour minute second 數(shù)據成員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ù)據成員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 完整程序 有對象成員的類的構造函數(shù)的說明 如果有對象成員的類的構造函數(shù)沒有調用對象成員的構造函數(shù) 此時編譯后出現(xiàn)語法錯誤 Date noappropriatedefaultconstructoravailable因為此時要調用對象成員dd的無參構造函數(shù) 而CDate類中只定義了一個有參的構造函數(shù) 為此必須使用構造函數(shù)初始化列表形式來調用CDate類的構造函數(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 無參構造函數(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 會自動調用對象成員的無參構造函數(shù) 如果對象成員沒有無參構造函數(shù) 則會出現(xiàn)編譯錯誤 如果有多個對象成員 則按照類內聲明的順序依次調用它們的構造函數(shù) 析構函數(shù)的調用順序相反 多個對象成員 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ù)據成員 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 時間類 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 日期時間類 include includeclassPoint public Point intxx 0 intyy 0 X xx Y yy Point Point classDistance private Pointp1 p2 數(shù)據成員 對象 doubledist public Distance Pointxp1 Pointxp2 構造函數(shù)doublegetDis returndist Distance Distance Pointxp1 Pointxp2 p1 xp1 p2 xp2 cout Distance構造函數(shù)被調用 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 例 對象作為類的數(shù)據成員 復制構造函數(shù) 5靜態(tài)成員static 靜態(tài)成員staticmembers 定義類時 用關鍵字static聲明的數(shù)據成員或成員函數(shù)稱為靜態(tài)成員 staticdatafield靜態(tài)數(shù)據成員存儲在靜態(tài)存儲區(qū) 只有一個 因此該類所有對象的靜態(tài)數(shù)據成員都共用同一個存儲空間 即靜態(tài)數(shù)據成員被類的所有對象共享 staticfunction靜態(tài)成員函數(shù) 沒有this指針作為參數(shù) 不能確定調用它的那個特定對象 無法訪問對象的非靜態(tài)成員 因此 一般只訪問靜態(tài)數(shù)據成員或全局變量 只能調用類的其它靜態(tài)成員函數(shù) 實例成員instancemembers 非靜態(tài) 是與類的特定對象聯(lián)系在一起的 對于同一個類的不同對象 實例成員是不同的 通常 一個類的兩個對象會擁有不同的內存空間來存放它們的實例數(shù)據成員 每個對象的數(shù)據成員互不干擾 靜態(tài)成員的應用1 Circle類 classCircle private doubleradius staticintnumOfObjects 表示已創(chuàng)建圓類對象的個數(shù)public Circle Circle double Circle doublegetArea doublegetRadius voidsetRadius double returnthenumberofcircleobjectsstaticintgetNumberOfObjects 返回已創(chuàng)建對象個數(shù) circle h 靜態(tài)數(shù)據成員的初始化 靜態(tài)數(shù)據成員必須在類外進行初始化 不能在類定義體內初始化 類是一種描述并非具體實現(xiàn) 初始化時必須加類名限定 且不加static 未初始化時系統(tǒng)自動賦初值為0 數(shù)據類型類名 靜態(tài)數(shù)據成員 初值 數(shù)據類型類名 靜態(tài)數(shù)據成員 intCircle numberOfObjects 0 無論建立多少個該類的對象 編譯器只為靜態(tài)數(shù)據成員分配一份內存空間 供該類的各個對象公用 靜態(tài)數(shù)據成員可以為public或者private 此時必須定義靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)的調用形式類名 靜態(tài)函數(shù)名 實參列表 較好 提高可讀性對象名 靜態(tài)函數(shù)名 實參列表 在類聲明中將某個成員函數(shù)聲明為靜態(tài)后 在類實現(xiàn)中不能再使用static關鍵字 否則出現(xiàn)編譯錯誤 靜態(tài)成員函數(shù)沒有this指針 因此它不能直接訪問對象中的非靜態(tài)數(shù)據成員 一般只用于訪問靜態(tài)數(shù)據成員或全局變量 只能調用類的其它靜態(tài)成員函數(shù) 如果靜態(tài)成員函數(shù)要對對象的非靜態(tài)數(shù)據成員進行操作 則對象必須以參數(shù)的形式傳遞給靜態(tài)成員函數(shù) 指出它作用在哪個對象上 此時需要使用 對象名 成員名 無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類的實現(xiàn)circle cpp 靜態(tài)數(shù)據成員的初始化 靜態(tài)成員函數(shù) 靜態(tài)數(shù)據成員 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)成員的應用 為什么需要靜態(tài)成員 以往要在一個范圍內共享某個數(shù)據可設為全局對象 但如果希望在類范圍內共享數(shù)據 則需要使用靜態(tài)變量 staticvariable 也稱為類變量 classvariable 在定義類時如何確定一個變量或函數(shù)應該是實例的還是靜態(tài)的 如果變量或函數(shù)是依賴具體類實例的 那么就應該聲明為實例的 例如 每個圓都有自己的半徑值 半徑依賴于具體的圓 因此將radius聲明為Circle類的一個實例變量 而numberOfObjects不依賴于任何具體的實例 應該聲明為靜態(tài)的 如果變量或函數(shù)不依賴于任何類實例 那么就應該聲明為靜態(tài)的 例如 因為全體中國人都是 黃皮膚 中國人的膚色這個屬性SkinColor 應該設為static類別 但姓名Name應為實例變量 不能為static型 否則全體中國人都是同一姓名 違背邏輯 定義枚舉類型colorenumcolor YELLOW WHITE BLACK BROWN classChinese public staticcolorgetSkinColor Chinese 靜態(tài)成員的應用2 Chinese類 include chinese h include includecolorChinese SkinColor YELLOW colorChinese getSkinColor Chinese Chinese類的實現(xiàn)chinese pp 在靜態(tài)成員函數(shù)中用 對象名 成員名 訪問實例數(shù)據成員 include include chinese h voidmain ChineseLi Liming Chinese getSkinColor Li Li ShowMessage ChineseWa Wangke Chinese getSkinColor Wa Wa ShowMessage testChinese cpp 6友元friend 一個類的私有成員不能在類作用域外被訪問 但有時允許一些可依賴的函數(shù)和類訪問 從而方便編程 在類的聲明中可使用關鍵字friend聲明友元函數(shù)和友元類 這些函數(shù)和類就能訪問類的所有成員 包括私有成員 稱為類的友員函數(shù)和友員類 如果友元函數(shù) 一般函數(shù)或其它類的成員函數(shù) 稱為友元函數(shù) 如果友元是一個類 稱為友元類 友元類中的所有成員函數(shù)都成為友元函數(shù) 友元函數(shù)是在類定義體內用friend聲明的非本類成員函數(shù) 聲明的形式為 在其函數(shù)聲明前加friend friend返回值類型函數(shù)名 形參表 友元函數(shù)可以是一個普通的函數(shù) 也可以是其他類的成員函數(shù) 類的友元函數(shù)必須在類的定義體內聲明函數(shù)原形 1 普通函數(shù)作友元函數(shù) 例 使用友元函數(shù)確定兩圓的關系 用兩個圓心距與兩圓半徑和的差值判斷 若 0 相交 0 相切 0 相離Circle類表示圓類 友元函數(shù)fErr計算差值 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類的實現(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類的實現(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類的實現(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 友元關系是不能傳遞的 2 友元關系是是單向的 若A是B的友元 A的成員函數(shù)可以訪問B的數(shù)據成員 但B類的成員函數(shù)不可以訪問A的數(shù)據成員 同函數(shù)一樣 類也可以聲明為另一個類的友元 稱為友元類 若A為B的友元類 則A類的所有成員函數(shù)都是B類的友元函數(shù) 都可以訪問B類的私有和保護成員 聲明的形式為 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 友元類例 一個文件實現(xiàn) 友元說明 友元提供了不同類或對象的成員函數(shù)之間 類的成員函數(shù)與一般函數(shù)之間進行數(shù)據共享的機制 通過友元 一個普通函數(shù)或者其他類的成員函數(shù)可以訪問到封裝于某一個類中的私有數(shù)據 友元函數(shù)不是本類的成員函數(shù) 卻可以訪問類中的任何成員 包括private protected public等 面向對象就是為了確保數(shù)據封裝和隱藏 而友元破壞了這一原則 建議盡量不使用或少使用友元 7類模板template 為了實現(xiàn)代碼重用 代碼應該是通用的 即不受使用的數(shù)據類型和操作的影響 即無論使用什么數(shù)據類型 通用代碼是不變的 C 提供了函數(shù)和類機制 可用來設計可重用軟件 而模板 template 則提供了在函數(shù)和類中將類型作為參數(shù)的能力 從而可設計具有通用類型的函數(shù)或類 而編譯器會在編譯時將通用類型確定為一種具體的類型 函數(shù)模板類模板 用戶可以為類聲明一種模式 使得類中的某些數(shù)據成員 某些成員函數(shù)的參數(shù) 某些成員函數(shù)的返回值能取任意類型 創(chuàng)建對象時指定類型 intmaxValue intx inty returnx y x y doublemaxValue doublex doubley returnx y x y charmaxValue charx chary returnx y x y 這三個函數(shù)幾乎一樣 差別僅僅在于使用的類型不同 若能定義一個具有通用類型的函數(shù) 則可以節(jié)省大量輸入代碼的時間 節(jié)省存儲空間 并使程序更易于維護 GenericTypemaxValue GenericTypex GenericTypey returnx y x y GenericType表示可適用于所有類型 如int double char 函數(shù)模板 函數(shù)模板 C 允許定義具有通用類型的函數(shù)模板 函數(shù)模板的定義以關鍵字template開始 后面跟著一個參數(shù)列表 毎個參數(shù)前面都必須有關鍵字typename或class 即 template templateprefix 模板前綴template typename都是關鍵字 typename可用class代替 T typeparameter 習慣上用T表示類型參數(shù) 可象普通類型一樣使用 可以用來指定函數(shù)返回類型 聲明函數(shù)參數(shù)以及聲明函數(shù)中的變量 提示 可以使用或指定類型參數(shù) 使用更好些 因為它含義更明確 而有可能與類聲明混淆 函數(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ù)模板不是一個真正意義上的函數(shù) 它僅僅是一個函數(shù)模型 當編譯器遇到函數(shù)調用時 將依據模板給出的代碼通過檢驗參數(shù)的數(shù)據類型 產生重載函數(shù) 類模板的定義 類是對象的抽象與描述 而類模板是類的抽象 類模板的聲明形式 templateclass類名 數(shù)據成員的聲明及成員函數(shù)的原型說明 成員函數(shù)的定義形式 template函數(shù)類型類名 函數(shù)名 參數(shù)列表 類模板例 數(shù)組類模板CArray 前面已介紹過的CArray類表示的是一個整型數(shù)組類 類似的還可以定義長整型數(shù)組 實型數(shù)組 字符數(shù)組類等 可分別定義多個類 另一個方法是模仿函數(shù)模板 設計能處理任意類型的數(shù)組類 這時可抽象出數(shù)組類模板 templateclassCArray public CArray intsize 創(chuàng)建長度為size的數(shù)組CArray CArray templateCArray CArray intsize 構造函數(shù)定義 data newT size 申請內存空間size size 設置數(shù)組元素個數(shù) templateCArray CArray CArray templateclassCArray public CArray intsize CArray CArray 聲明了類模板后 就可以用類模板定義對象了 定義類模板對象與定義一般的對象類似 區(qū)別是在定義時必須指明傳遞給類模板的數(shù)據類型 并將類型放在尖括號中 如CArraya 10 數(shù)據類型int將替換參數(shù)T出現(xiàn)的任何地方CArrayb 5 數(shù)據類型double將替換參數(shù)T出現(xiàn)的任何地方當使用無參的構造函數(shù)創(chuàng)建對象時 定義形式為 類名對象 若使用有參的構造函數(shù)創(chuàng)建對象時 定義形式為 類名對象 構造函數(shù)實參列表 用類模板定義對象 CArray類模板的應用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 提示 通常將類的聲明和實現(xiàn)分隔在兩個文件中 但是對于類模板 將聲明和實現(xiàn)放在一起更
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 紡織工藝優(yōu)化實踐試題及答案
- 《高效課堂管理》課件
- 采購試題庫及答案
- 酒館轉讓合同協(xié)議書
- 企業(yè)衛(wèi)生承包合同協(xié)議書
- 轉讓飯店合同協(xié)議書
- 餐飲外賣合同協(xié)議書
- 合同協(xié)議書副本怎么寫
- 民房合同協(xié)議書
- 合同協(xié)議書的間隔
- 靜脈輸血法并發(fā)癥的預防和處置
- 塔吊交叉作業(yè)安全技術交底
- 八大特種作業(yè)試題及答案
- 龍門吊安裝、拆卸工程安全監(jiān)理實施細則
- 機關事業(yè)單位工作人員考勤管理辦法
- 2025年湖北省中考歷史模擬試卷附答案
- 抑郁癥考試試題及答案
- GB/T 25020.1-2025電氣化鐵路接觸網支柱第1部分:鋼支柱
- 新能源汽車維修技術論文
- 2025年國家統(tǒng)一法律職業(yè)資格考試真題(帶答案)
- 生物安全管理體系文件
評論
0/150
提交評論