




已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6講類與對象的進一步討論 對象指針 數組 參數變量作用域this指針類對象作為成員靜態(tài)成員友元類模板 1 1對象指針 創(chuàng)建對象時 系統(tǒng)會為該對象分配相應的存儲空間存放其數據成員 并調用構造函數 其起始地址就是對象的地址即指針 對象指針 指向對象的指針 創(chuàng)建對象指針 類名 對象指針名 Circlecir p 在堆中創(chuàng)建動態(tài)對象 用new為對象申請空間時需調用構造函數 此時創(chuàng)建了一個對象 如 Circle p1 newCircle 調用無參的構造函數Circle p2 newCircle 2 5 調用有參的構造函數Circle p3 newCircle 3 此時必須使用無參的構造函數 否則不能動態(tài)創(chuàng)建 用delete命令為對象刪除空間deletep1 delete p3 不可省略 否則出現運行錯誤此時會自動調用析構函數 1 2對象數組及其創(chuàng)建 對象數組 數組中的每個數組元素都為同一類的對象 對象數組的聲明根據構造函數的不同而不同 若有不需參數的構造函數 用戶沒定義構造函數 使用默認構造函數 有用戶定義的不帶參數或帶默認參數的構造函數 則定義數組時可不提供實參 初始化數據 其形式為 類名數組名 常量表達式 若只有用戶自定義的有參構造函數 則必須在創(chuàng)建對象數組時為構造函數提供實參 初始化數據 其形式為 類名數組名 常量表達式 類名 參數表 類名 參數表 當構造函數只需提供一個參數時也可寫為 類名數組名 常量表達式 常量1 常量2 常量n 常量表達式表示數組的大小 創(chuàng)建對象數組時 系統(tǒng)為整個數組分配存儲空間 存儲每個對象元素的數據成員 并為每個對象元素調用相應的構造函數 創(chuàng)建對象數組例 創(chuàng)建對象數組 使用無參構造函數初始化數組中的元素 此時各個元素中的radius成員值均為1 Circlec 3 使用有參構造函數初始化對象元素Circlec 3 Circle 1 Circle 2 Circle 3 當構造函數只需提供一個參數時也可寫為Circlec 3 1 2 3 訪問數組元素對象的各公有成員 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 對象數組范例 計算數組中所有圓的面積之和 Circleca 5 2 3 5 5 3 2 6 voidmain Clockclocks 3 Clock 11 25 10 Clock 10 25 30 Clock 8 17 20 對象數組初始化for inti 0 i 3 i clocks i showTime 若采用 Clockclocks 3 則出錯 因為此時要調用無參的構造函數 修改 1 增加無參構造函數 2 改為帶默認參數的構造函數 此時可寫為 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 表示給數組的三個元素中的hour賦初值 Clockclocks 3 Clock 1 2 3 表示給數組的第一個元素賦初值 其余兩個元素使用無參構造函數 不可省略 1 3對象作為函數參數 對象可作為函數的參數 分為傳值方式和引用方式傳值方式 對象值 為形參對象分配空間 調用復制構造函數 需要額外的時間和內存空間 對象指針 為形參對象指針分配空間 減少時間和內存空間的消耗 引用方式 一般使用較多不需要額外的時間和內存空間 而且使用對象引用參數比使用指針參數更為簡單 例 對象作為參數 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 傳值 調用復制構造函數cout c1 getRadius t c1 getArea endl 對象值作為參數 為形參對象分配空間 調用復制構造函數 形參值的修改不影響實參 328 27431 57 06858 includevoidChangeCircle Circle c c setRadius c getRadius 2 coutgetRadius getArea endl voidmain Circlec1 1 5 ChangeCircle 對象指針作為參數 在被調函數中通過指針對主調函數中對象進行修改 形參值的修改不影響實參 328 2743328 2743 includevoidChangeCircle Circle 對象引用作為參數 不為形參分配空間 形參使用實參的空間 對形參值的修改就是對實參的修改 328 2743328 2743 includevoidChangeCircle Circlec c setRadius c getRadius 2 cout c getRadius t c getArea endl voidmain Circlec1 1 5 ChangeCircle c1 傳值 調用復制構造函數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 參數 區(qū)分三種形式 2變量作用域 變量的作用域 是指程序中變量有效的區(qū)域 變量的作用域分為 全局域 局部域和類作用域 局部變量 在函數內 或塊內 聲明 只能在函數內部使用 全局變量 在所有函數和類外聲明 如果局部變量與全局變量同名 則在局部變量作用域同名全局變量被屏蔽 使用的是局部變量 類作用域 即類聲明和類的實現范圍 類的所有成員在類作用域中相互間具有無限制的訪問權 類的所有成員都可以訪問該類的所有數據成員和成員函數 而類內成員對類作用域以外的數據或函數進行的訪問是受限制的 同樣 類作用域以外的數據或函數對類內成員的訪問也是受限制的 依據成員的訪問權限 如果成員函數內一個局部變量與一個數據成員同名 在該函數內同名數據成員將被屏蔽 使用的是局部變量 利用作用域操作符區(qū)分全局變量和類的數據成員 includeintpp 0 全局變量classCtest public intpp voidrp private intnumber floatsocre voidCtest rp rp 函數為test類的成員函數 pp 11 該變量為全局變量pppp 100 該變量為test類的數據成員 voidmain Ctesta a rp cout pp endl 該變量為全局變量ppcout a pp endl 11100 類成員函數的局部變量隱藏了類的同名數據成員 includeclassCTest public voidf1 voidf2 voidshow cout m m endl private intm voidCTest f1 m 5 voidCTest f2 intm m為函數f2的局部變量 m 10 為局部變量m賦值 voidmain CTesta a f1 訪問類的公有成員a show a f2 a show m 5m 5 3this指針 對象成員的存儲 創(chuàng)建對象時存儲空間的分配 只為對象的數據成員分配相應的存儲空間 成員函數存儲在代碼區(qū) 創(chuàng)建n個對象 每個對象都有各自的數據成員存儲空間 而n個對象都調用相同的函數代碼段 成員函數如何區(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是一個指向調用該函數的對象的指針常量 隱含在類的成員函數中的一個對象指針參數 系統(tǒng)自動產生 每當成員函數被調用時 this指針自動指向調用該成員函數的對象 即this指針為當前對象的地址 this指針的系統(tǒng)定義格式為 類名 constthis 該指針是系統(tǒng)自動產生的 不需要人為定義 并且它是指針常量 不能被賦值 只能使用它 利用this指針能保證對象的每一個成員函數能夠訪問其對應的數據成員 從而使C 中的各個對象既具有自己的數據成員空間 同時又可共用同一個成員函數代碼 this指針是每個 非靜態(tài) 成員函數都有的參數 因此可在函數體中使用this指針 this指針是隱式使用的 是系統(tǒng)為成員函數自動生成的參數 doubleCircle getArea returnradius radius 3 14159 doubleCircle getArea Circle constthis 即在形參表表中增加一個形參為this指針 returnthis radius this radius 3 14159 在調用成員函數時 cout circle1 getArea 實際調用方式為 cout circle1 getArea 這些都是編譯系統(tǒng)自動實現的 不必人為地在形參中增加this指針 理解this的含義 includeclassCClock public CClock inth intm ints 構造函數 CClock 析構函數 cout this this endl voidsetTime inth intm ints voidshowTime private inthour minute second 數據成員 CClock CClock inth intm ints 構造函數的定義 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的成員函數f 的含義 在調用成員函數f時使this指針指向對象a 從而訪問對象a的成員 需要時 在成員函數中也可以顯式地使用this指針 當成員函數的形參 局部變量與類中數據成員同名時 數據成員被屏蔽 因此若需要在成員函數中訪問被屏蔽的數據成員 可使用this指針進行訪問 形式為 this 數據成員 this 數據成員注意不能寫成 this 數據成員因為成員運算符 的優(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對象成員 對象作為類的數據成員 C 中 類的數據成員可以是其它類的對象 稱為對象成員 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 成員函數private inthour minute second 數據成員CDatedd 有對象成員的類的構造函數 為具有對象成員的類創(chuàng)建對象時 必然要創(chuàng)建對象成員 因此在創(chuàng)建對象時 系統(tǒng)首先調用對象成員的構造函數 然后再執(zhí)行本類構造函數的函數體 因此必須在構造函數體前調用對象成員的構造函數 利用構造函數的初始化列表調用對象成員的構造函數 構造函數初始化列表一般形式為 類名 類名 形參表 對象成員1 實參表 對象成員2 實參表 類的非對象成員的初始化 只有一個對象成員的類的構造函數初始化列表的例子 類名 類名 形參表 對象成員 實參列表 類的非對象成員的初始化 classCTime public CTime int int int int int int voidsetTime inth intm ints voiddisp 成員函數private inthour minute second 數據成員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 成員函數private inthour minute second 數據成員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 完整程序 有對象成員的類的構造函數的說明 如果有對象成員的類的構造函數沒有調用對象成員的構造函數 此時編譯后出現語法錯誤 Date noappropriatedefaultconstructoravailable因為此時要調用對象成員dd的無參構造函數 而CDate類中只定義了一個有參的構造函數 為此必須使用構造函數初始化列表形式來調用CDate類的構造函數 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 無參構造函數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 會自動調用對象成員的無參構造函數 如果對象成員沒有無參構造函數 則會出現編譯錯誤 如果有多個對象成員 則按照類內聲明的順序依次調用它們的構造函數 析構函數的調用順序相反 多個對象成員 classCDateTime public CDateTime int int int int int int voiddisp 成員函數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 成員函數private inthour minute second 數據成員 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 成員函數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 數據成員 對象 doubledist public Distance Pointxp1 Pointxp2 構造函數doublegetDis returndist Distance Distance Pointxp1 Pointxp2 p1 xp1 p2 xp2 cout Distance構造函數被調用 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 例 對象作為類的數據成員 復制構造函數 5靜態(tài)成員static 靜態(tài)成員staticmembers 定義類時 用關鍵字static聲明的數據成員或成員函數稱為靜態(tài)成員 staticdatafield靜態(tài)數據成員存儲在靜態(tài)存儲區(qū) 只有一個 因此該類所有對象的靜態(tài)數據成員都共用同一個存儲空間 即靜態(tài)數據成員被類的所有對象共享 staticfunction靜態(tài)成員函數 沒有this指針作為參數 不能確定調用它的那個特定對象 無法訪問對象的非靜態(tài)成員 因此 一般只訪問靜態(tài)數據成員或全局變量 只能調用類的其它靜態(tài)成員函數 實例成員instancemembers 非靜態(tài) 是與類的特定對象聯系在一起的 對于同一個類的不同對象 實例成員是不同的 通常 一個類的兩個對象會擁有不同的內存空間來存放它們的實例數據成員 每個對象的數據成員互不干擾 靜態(tài)成員的應用1 Circle類 classCircle private doubleradius staticintnumOfObjects 表示已創(chuàng)建圓類對象的個數public Circle Circle double Circle doublegetArea doublegetRadius voidsetRadius double returnthenumberofcircleobjectsstaticintgetNumberOfObjects 返回已創(chuàng)建對象個數 circle h 靜態(tài)數據成員的初始化 靜態(tài)數據成員必須在類外進行初始化 不能在類定義體內初始化 類是一種描述并非具體實現 初始化時必須加類名限定 且不加static 未初始化時系統(tǒng)自動賦初值為0 數據類型類名 靜態(tài)數據成員 初值 數據類型類名 靜態(tài)數據成員 intCircle numberOfObjects 0 無論建立多少個該類的對象 編譯器只為靜態(tài)數據成員分配一份內存空間 供該類的各個對象公用 靜態(tài)數據成員可以為public或者private 此時必須定義靜態(tài)成員函數 靜態(tài)成員函數 靜態(tài)成員函數的調用形式類名 靜態(tài)函數名 實參列表 較好 提高可讀性對象名 靜態(tài)函數名 實參列表 在類聲明中將某個成員函數聲明為靜態(tài)后 在類實現中不能再使用static關鍵字 否則出現編譯錯誤 靜態(tài)成員函數沒有this指針 因此它不能直接訪問對象中的非靜態(tài)數據成員 一般只用于訪問靜態(tài)數據成員或全局變量 只能調用類的其它靜態(tài)成員函數 如果靜態(tài)成員函數要對對象的非靜態(tài)數據成員進行操作 則對象必須以參數的形式傳遞給靜態(tài)成員函數 指出它作用在哪個對象上 此時需要使用 對象名 成員名 無this 非靜態(tài)成員函數可以直接訪問類的任意成員 靜態(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類的實現circle cpp 靜態(tài)數據成員的初始化 靜態(tài)成員函數 靜態(tài)數據成員 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)成員函數 靜態(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 完整程序 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)成員 以往要在一個范圍內共享某個數據可設為全局對象 但如果希望在類范圍內共享數據 則需要使用靜態(tài)變量 staticvariable 也稱為類變量 classvariable 在定義類時如何確定一個變量或函數應該是實例的還是靜態(tài)的 如果變量或函數是依賴具體類實例的 那么就應該聲明為實例的 例如 每個圓都有自己的半徑值 半徑依賴于具體的圓 因此將radius聲明為Circle類的一個實例變量 而numberOfObjects不依賴于任何具體的實例 應該聲明為靜態(tài)的 如果變量或函數不依賴于任何類實例 那么就應該聲明為靜態(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類的實現chinese pp 在靜態(tài)成員函數中用 對象名 成員名 訪問實例數據成員 include include chinese h voidmain ChineseLi Liming Chinese getSkinColor Li Li ShowMessage ChineseWa Wangke Chinese getSkinColor Wa Wa ShowMessage testChinese cpp 6友元friend 一個類的私有成員不能在類作用域外被訪問 但有時允許一些可依賴的函數和類訪問 從而方便編程 在類的聲明中可使用關鍵字friend聲明友元函數和友元類 這些函數和類就能訪問類的所有成員 包括私有成員 稱為類的友員函數和友員類 如果友元函數 一般函數或其它類的成員函數 稱為友元函數 如果友元是一個類 稱為友元類 友元類中的所有成員函數都成為友元函數 友元函數是在類定義體內用friend聲明的非本類成員函數 聲明的形式為 在其函數聲明前加friend friend返回值類型函數名 形參表 友元函數可以是一個普通的函數 也可以是其他類的成員函數 類的友元函數必須在類的定義體內聲明函數原形 1 普通函數作友元函數 例 使用友元函數確定兩圓的關系 用兩個圓心距與兩圓半徑和的差值判斷 若 0 相交 0 相切 0 相離Circle類表示圓類 友元函數fErr計算差值 6 1 友元函數 classCircle public Circle double double double doublegetRadius doublegetX doublegetY frienddoublefErr Circle 友元函數為普通函數例 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類的實現 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 其它類的成員函數作友元函數例 Date類中的成員函數print作為Time類的友元函數 ifndefDATE H defineDATE HclassTime classDate public Date inty 2000 intm 1 intd 1 voidsetDate inty intm intd voidprint Time endif 類的提前引用聲明 date h date類的實現 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類的實現 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的成員函數可以訪問B的數據成員 但B類的成員函數不可以訪問A的數據成員 同函數一樣 類也可以聲明為另一個類的友元 稱為友元類 若A為B的友元類 則A類的所有成員函數都是B類的友元函數 都可以訪問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 友元類例 一個文件實現 友元說明 友元提供了不同類或對象的成員函數之間 類的成員函數與一般函數之間進行數據共享的機制 通過友元 一個普通函數或者其他類的成員函數可以訪問到封裝于某一個類中的私有數據 友元函數不是本類的成員函數 卻可以訪問類中的任何成員 包括private protected public等 面向對象就是為了確保數據封裝和隱藏 而友元破壞了這一原則 建議盡量不使用或少使用友元 7類模板template 為了實現代碼重用 代碼應該是通用的 即不受使用的數據類型和操作的影響 即無論使用什么數據類型 通用代碼是不變的 C 提供了函數和類機制 可用來設計可重用軟件 而模板 template 則提供了在函數和類中將類型作為參數的能力 從而可設計具有通用類型的函數或類 而編譯器會在編譯時將通用類型確定為一種具體的類型 函數模板類模板 用戶可以為類聲明一種模式 使得類中的某些數據成員 某些成員函數的參數 某些成員函數的返回值能取任意類型 創(chuàng)建對象時指定類型 intmaxValue intx inty returnx y x y doublemaxValue doublex doubley returnx y x y charmaxValue charx chary returnx y x y 這三個函數幾乎一樣 差別僅僅在于使用的類型不同 若能定義一個具有通用類型的函數 則可以節(jié)省大量輸入代碼的時間 節(jié)省存儲空間 并使程序更易于維護 GenericTypemaxValue GenericTypex GenericTypey returnx y x y GenericType表示可適用于所有類型 如int double char 函數模板 函數模板 C 允許定義具有通用類型的函數模板 函數模板的定義以關鍵字template開始 后面跟著一個參數列表 毎個參數前面都必須有關鍵字typename或class 即 template templateprefix 模板前綴template typename都是關鍵字 typename可用class代替 T typeparameter 習慣上用T表示類型參數 可象普通類型一樣使用 可以用來指定函數返回類型 聲明函數參數以及聲明函數中的變量 提示 可以使用或指定類型參數 使用更好些 因為它含義更明確 而有可能與類聲明混淆 函數模板 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 注 函數模板不是一個真正意義上的函數 它僅僅是一個函數模型 當編譯器遇到函數調用時 將依據模板給出的代碼通過檢驗參數的數據類型 產生重載函數 類模板的定義 類是對象的抽象與描述 而類模板是類的抽象 類模板的聲明形式 templateclass類名 數據成員的聲明及成員函數的原型說明 成員函數的定義形式 template函數類型類名 函數名 參數列表 類模板例 數組類模板CArray 前面已介紹過的CArray類表示的是一個整型數組類 類似的還可以定義長整型數組 實型數組 字符數組類等 可分別定義多個類 另一個方法是模仿函數模板 設計能處理任意類型的數組類 這時可抽象出數組類模板 templateclassCArray public CArray intsize 創(chuàng)建長度為size的數組CArray CArray templateCArray CArray intsize 構造函數定義 data newT size 申請內存空間size size 設置數組元素個數 templateCArray CArray CArray templateclassCArray public CArray intsize CArray CArray 聲明了類模板后 就可以用類模板定義對象了 定義類模板對象與定義一般的對象類似 區(qū)別是在定義時必須指明傳遞給類模板的數據類型 并將類型放在尖括號中 如CArraya 10 數據類型int將替換參數T出現的任何地方CArrayb 5 數據類型double將替換參數T出現的任何地方當使用無參的構造函數創(chuàng)建對象時 定義形式為 類名對象 若使用有參的構造函數創(chuàng)建對象時 定義形式為 類名對象 構造函數實參列表 用類模板定義對象 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 提示 通常將類的聲明和實現分隔在兩個文件中 但是對于類模板 將聲明和實現放在一起更
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車間內部承包經營與設備維護一體化合同范本
- 采石場安全生產責任承包管理協(xié)議
- 高標準廠房木結構建造與施工一體化服務合同
- 老人照料及護理課件
- 石場安全生產三年行動方案
- 安全管理三違指的是什么
- 突發(fā)事件應急處置機制和預案
- 贛州市安全生產電視電話會議
- 美術信息化技術課件
- 生產制造安全事故案例
- 2025年數字內容創(chuàng)作師資格考試試卷及答案
- 胖東來投訴管理制度
- 2024-2025新入職員工安全培訓考試試題及完整答案【一套】
- 2025年內蒙古鄂爾多斯機場管理集團鄂爾多斯市空港實業(yè)有限公司招聘筆試參考題庫含答案解析
- 瀝青路面施工質量控制要點課件
- 2025年鄭州市公安機關招聘警務輔助人員題庫帶答案分析
- CJ/T 340-2016綠化種植土壤
- 廬山市國有投資控股集團有限公司招聘筆試題庫2025
- T/CADBM 63-2022建筑室內窗飾產品百葉簾
- 2025年貴州省公務員錄用考試《行測》真題及答案解析
- 第一單元:三視圖的判斷、確認與繪制專項練習-2023-2024學年五年級數學下冊典型例題系列(原卷版)人教版
評論
0/150
提交評論