Professional Documents
Culture Documents
TRNG I HC K THUT
KHOA CNG NGH THNG TIN - IN T VIN THNG
GIO TRNH MN HC
NNG, 09/2002
Trang
MC LC
CHNG 1: GII THIU V LP TRNH HNG I TNG.......................... 5 I. LP TRNH HNG I TNG (OOP) L G ? .............................................. 5 I.1. Lp trnh tuyn tnh ............................................................................................ 5 I.2. Lp trnh cu trc................................................................................................ 5 I.3. S tru tng ha d liu................................................................................... 6 I.4. Lp trnh hng i tng ................................................................................. 6 II. MT S KHI NIM MI TRONG LP TRNH HNG I TNG........... 8 II.1. S ng gi (Encapsulation) .............................................................................. 8 II.2. Tnh k tha (Inheritance) .................................................................................. 9 II.3. Tnh a hnh (Polymorphism) .......................................................................... 10 III. CC NGN NG V VI NG DNG CA OOP............................................ 11 CHNG 2: CC M RNG CA C++ ...................................................................... 12 I. LCH S CA C++ ................................................................................................. 12 II. CC M RNG CA C++..................................................................................... 12 II.1. Cc t kha mi ca C++................................................................................. 12 II.2. Cch ghi ch thch ............................................................................................ 12 II.3. Dng nhp/xut chun...................................................................................... 13 II.4. Cch chuyn i kiu d liu ........................................................................... 14 II.5. V tr khai bo bin ........................................................................................... 14 II.6. Cc bin const................................................................................................... 15 II.7. V struct, union v enum.................................................................................. 16 II.8. Ton t nh phm vi ....................................................................................... 16 II.9. Ton t new v delete....................................................................................... 17 II.10. Hm inline ........................................................................................................ 23 II.11. Cc gi tr tham s mc nh ............................................................................ 24 II.12. Php tham chiu ............................................................................................... 25 II.13. Php a nng ha (Overloading) ...................................................................... 29 CHNG 3: LP V I TNG .............................................................................. 39 I. DN NHP.............................................................................................................. 39 II. CI T MT KIU DO NGI DNG NH NGHA VI MT STRUCT. 39 III. CI T MT KIU D LIU TRU TNG VI MT LP...................... 41 IV. PHM VI LP V TRUY CP CC THNH VIN LP .................................. 45 V. IU KHIN TRUY CP TI CC THNH VIN ............................................ 47 VI. CC HM TRUY CP V CC HM TIN CH............................................... 48 VII. KHI NG CC I TNG CA LP : CONSTRUCTOR......................... 49 VIII.S DNG DESTRUCTOR..................................................................................... 51 IX. KHI NO CC CONSTRUTOR V DESTRUCTOR C GI ? .................. 53 X. S DNG CC THNH VIN D LIU V CC HM THNH VIN ........ 54 XI. TR V MT THAM CHIU TI MT THNH VIN D LIU PRIVATE.. 57 XII. PHP GN BI TON T SAO CHP THNH VIN MC NH ................. 59 XIII.CC I TNG HNG V CC HMTHNH VIN CONST..................... 60 XIV.LP NH L CC THNH VIN CA CC LP KHC ............................... 64 XV. CC HM V CC LP FRIEND........................................................................ 67
Bin son: L Th M Hnh
3 XVI.CON TR THIS ...................................................................................................... 68 XVII.CC I TNG C CP PHT NG ................................................... 71 XVIII.CC THNH VIN TNH CA LP................................................................. 72
Trang
CHNG 4: A NNG HA TON T...................................................................... 76 I. DN NHP.............................................................................................................. 76 II. CC NGUYN TC C BN CA A NNG HA TON T ...................... 76 III. CC GII HN CA A NNG HA TON T.............................................. 76 IV. CC HM TON T C TH L CC THNH VIN CA LP HOC KHNG L CC THNH VIN........................................................................... 77 V. A NNG HO CC TON T HAI NGI ....................................................... 80 VI. A NNG HA CC TON T MT NGI ..................................................... 87 VII. A NNG HA MT S TON T C BIT ................................................ 90 VII.1.Ton t [] ............................................................................................................ 91 VII.2.Ton t () ............................................................................................................ 92 VIII.TON T CHUYN I KIU............................................................................ 94 IX. TON T NEW V DELETE................................................................................ 95 IX.1.a nng ha ton t new v delete ton cc........................................................ 96 IX.2.a nng ha ton t new v delete cho mt lp .................................................. 97 X. A NNG HA CC TON T CHN DNG << V TRCH DNG >> ...... 98 XI. MT S V D ....................................................................................................... 99 XI.1.Lp String............................................................................................................. 99 XI.2.Lp Date............................................................................................................. 103 CHNG 5: TNH K THA ...................................................................................... 107 I. DN NHP............................................................................................................ 107 II. K THA N ..................................................................................................... 107 II.1.Cc lp c s v cc lp dn xut ....................................................................... 107 II.2.Cc thnh vin protected...................................................................................... 109 II.3.p kiu cc con tr lp c s ti cc con tr lp dn xut.................................. 109 II.4.nh ngha li cc thnh vin lp c s trong mt lp dn xut:........................ 113 II.5.Cc lp c s public, protected v private........................................................... 113 II.6.Cc contructor v destructor lp dn xut ........................................................... 113 II.7.Chuyn i ngm nh i tng lp dn xut sang i tng lp c s........... 116 III. A K THA (MULTIPLE INHERITANCE)..................................................... 116 IV. CC LP C S O (VIRTUAL BASE CLASSES) ......................................... 119 CHNG 6: TNH A HNH ....................................................................................... 122 I. DN NHP............................................................................................................ 122 II. PHNG THC O (VIRTUAL FUNCTION) .................................................. 122 III. LP TRU TNG (ABSTRACT CLASS) ....................................................... 125 IV. CC THNH VIN O CA MT LP............................................................ 127 IV.1.Ton t o........................................................................................................... 127 IV.2.C constructor v destructor o hay khng? ...................................................... 129 CHNG 7: THIT K CHNG TRNH THEO HNG I TNG ......... 132 I. DN NHP............................................................................................................ 132 II. CC GIAI ON PHT TRIN H THNG..................................................... 132 III. CCH TM LP .................................................................................................... 133 IV. CC BC CN THIT THIT K CHNG TRNH............................. 133 V. CC V D ............................................................................................................ 134
Bin son: L Th M Hnh
4 CHNG 8: CC DNG NHP/XUT...................................................................... 143 I. DN NHP............................................................................................................ 143 II. CC DNG(STREAMS) ...................................................................................... 143 II.1.Cc file header ca th vin iostream.................................................................. 143 II.2.Cc lp v cc i tng ca dng nhp/xut ..................................................... 144 III. DNG XUT......................................................................................................... 145 III.1.Ton t chn dng .............................................................................................. 145 III.2.Ni cc ton t chn dng v trch dng............................................................ 146 III.3.Xut k t vi hm thnh vin put(); Ni vi nhau hm put() .......................... 147 IV. DNG NHP ......................................................................................................... 148 IV.1.Ton t trch dng:............................................................................................. 148 IV.2.Cc hm thnh vin get() v getline() ................................................................ 149 IV.3.Cc hm thnh vin khc ca istream ................................................................ 151 IV.4.Nhp/xut kiu an ton....................................................................................... 151 V. NHP/XUT KHNG NH DNG VI READ(),GCOUNT() V WRITE() 151 VI. DNG NHP/ XUT FILE .................................................................................. 152 VI.1.Nhp/xut file vn bn ....................................................................................... 154
Trang
Trang
I.1.
My tnh u tin c lp trnh bng m nh phn, s dng cc cng tt c kh np chng trnh. Cng vi s xut hin ca cc thit b lu tr ln v b nh my tnh c dung lng ln nn cc ngn ng lp trnh cp cao u tin c a vo s dng . Thay v phi suy ngh trn mt dy cc bit v byte, lp trnh vin c th vit mt lot lnh gn vi ting Anh v sau chng trnh dch thnh ngn ng my. Cc ngn ng lp trnh cp cao u tin c thit k lp cc chng trnh lm cc cng vic tng i n gin nh tnh ton. Cc chng trnh ban u ch yu lin quan n tnh ton v khng i hi g nhiu ngn ng lp trnh. Hn na phn ln cc chng trnh ny tng i ngn, thng t hn 100 dng. Khi kh nng ca my tnh tng ln th kh nng trin khai cc chng trnh phc tp hn cng tng ln. Cc ngn ng lp trnh ngy trc khng cn thch hp i vi vic lp trnh i hi cao hn. Cc phng tin cn thit s dng li cc phn m chng trnh vit hu nh khng c trong ngn ng lp trnh tuyn tnh. Tht ra, mt on lnh thng phi c chp lp li mi khi chng ta dng trong nhiu chng trnh do chng trnh di dng, logic ca chng trnh kh hiu. Chng trnh c iu khin nhy n nhiu ch m thng khng c s gii thch r rng, lm th no chng trnh n ch cn thit hoc ti sao nh vy. Ngn ng lp trnh tuyn tnh khng c kh nng kim sot phm vi nhn thy ca cc d liu. Mi d liu trong chng trnh u l d liu ton cc ngha l chng c th b sa i bt k phn no ca chng trnh. Vic d tm cc thay i khng mong mun ca cc phn t d liu trong mt dy m lnh di v vng vo tng lm cho cc lp trnh vin rt mt thi gian.
I.2.
Lp trnh cu trc
R rng l cc ngn ng mi vi cc tnh nng mi cn phi c pht trin c th to ra cc ng dng tinh vi hn. Vo cui cc nm trong 1960 v 1970, ngn ng lp trnh c cu trc ra i. Cc chng trnh c cu trc c t chc theo cc cng vic m chng thc hin. V bn cht, chng trnh chia nh thnh cc chng trnh con ring r (cn gi l hm hay th tc) thc hin cc cng vic ri rc trong qu trnh ln hn, phc tp hn. Cc hm ny c gi cng c lp vi nhau cng nhiu cng tt, mi hm c d liu v logic ring.Thng tin c chuyn giao gia cc hm thng qua cc tham s, cc hm c th c cc bin cc b m khng mt ai nm bn ngoi phm vi ca hm li c th truy xut c chng. Nh vy, cc hm c th c xem l cc chng trnh con c t chung vi nhau xy dng nn mt ng dng. Mc tiu l lm sao cho vic trin khai cc phn mm d dng hn i vi cc lp trnh vin m vn ci thin c tnh tin cy v d bo qun chng trnh. Mt chng trnh c cu trc c hnh thnh bng cch b gy cc chc nng c bn ca chng trnh thnh cc mnh nh m sau tr thnh cc hm. Bng cch c lp cc cng vic vo trong cc hm, chng trnh c cu trc c th lm gim kh nng ca mt hm ny nh hng n mt hm khc. Vic ny cng lm cho vic tch cc vn tr nn d dng hn. S gi gn ny cho php chng ta c th vit cc chng trnh sng sa hn v gi c iu khin trn tng hm. Cc bin ton cc khng cn na v c thay th bng cc tham s v bin cc b c phm vi nh hn v d kim sot hn. Cch t chc tt hn ny ni ln rng chng ta c kh nng qun l logic ca cu trc chng trnh, lm cho vic trin khai v bo dng chng trnh nhanh hn v hu hin hn v hiu qu hn.
Trang
Mt khi nim ln c a ra trong lp trnh c cu trc l s tru tng ha (Abstraction). S tru tng ha c th xem nh kh nng quan st mt s vic m khng cn xem xt n cc chi tit bn trong ca n. Trong mt chng trnh c cu trc, chng ta ch cn bit mt hm cho c th lm c mt cng vic c th g l . Cn lm th no m cng vic li thc hin c l khng quan trng, chng no hm cn tin cy c th cn c th dng n m khng cn phi bit n thc hin ng n chc nng ca mnh nh th no. iu ny gi l s tru tng ha theo chc nng (Functional abstraction) v l nn tng ca lp trnh c cu trc. Ngy nay, cc k thut thit k v lp trnh c cu trc c s rng ri. Gn nh mi ngn ng lp trnh u c cc phng tin cn thit cho php lp trnh c cu trc. Chng trnh c cu trc d vit, d bo dng hn cc chng trnh khng cu trc. S nng cp nh vy cho cc kiu d liu trong cc ng dng m cc lp trnh vin ang vit cng ang tip tc din ra. Khi phc tp ca mt chng trnh tng ln, s ph thuc ca n vo cc kiu d liu c bn m n x l cng tng theo. Vn tr r rng l cu trc d liu trong chng trnh quan trng chng km g cc php ton thc hin trn chng. iu ny cng tr r rng hn khi kch thc ca chng trnh cng tng. Cc kiu d liu c x l trong nhiu hm khc nhau bn trong mt chng trnh c cu trc. Khi c s thay i trong cc d liu ny th cng cn phi thc hin c cc thay i mi ni c cc thao tc tc ng trn chng. y c th l mt cng vic tn thi gian v km hiu qu i vi cc chng trnh c hng ngn dng lnh v hng trm hm tr ln. Mt yu im na ca vic lp trnh c cu trc l khi c nhiu lp trnh vin lm vic theo nhm cng mt ng dng no . Trong mt chng trnh c cu trc, cc lp trnh vin c phn cng vit mt tp hp cc hm v cc kiu d liu. V c nhiu lp trnh vin khc nhau qun l cc hm ring, c lin quan n cc kiu d liu dng chung nn cc thay i m lp trnh vin to ra trn mt phn t d liu s lm nh hng n cng vic ca tt c cc ngi cn li trong nhm. Mc d trong bi cnh lm vic theo nhm, vic vit cc chng trnh c cu trc th d dng hn nhng sai st trong vic trao i thng tin gia cc thnh vin trong nhm c th dn ti hu qu l mt rt nhiu thi gian sa cha chng trnh.
I.3.
S tru tng ha d liu (Data abstraction) tc ng trn cc d liu cng tng t nh s tru tng ha theo chc nng. Khi c tru tng ha d liu, cc cu trc d liu v cc phn t c th c s dng m khng cn bn tm n cc chi tit c th. Chng hn nh cc s du chm ng c tru tng ha trong tt c cc ngn ng lp trnh, Chng ta khng cn quan tm cch biu din nh phn chnh xc no cho s du chm ng khi gn mt gi tr, cng khng cn bit tnh bt thng ca php nhn nh phn khi nhn cc gi tr du chm ng. iu quan trng l cc s du chm ng hot ng ng n v hiu c. S tru tng ha d liu gip chng ta khng phi bn tm v cc chi tit khng cn thit. Nu lp trnh vin phi hiu bit v tt c cc kha cnh ca vn , mi lc v v tt c cc hm ca chng trnh th ch t hm mi c vit ra, may mn thay tru tng ha theo d liu tn ti sn trong mi ngn ng lp trnh i vi cc d liu phc tp nh s du chm ng. Tuy nhin ch mi gn y, ngi ta mi pht trin cc ngn ng cho php chng ta nh ngha cc kiu d liu tru tng ring.
I.4.
Khi nim hng i tng c xy dng trn nn tng ca khi nim lp trnh c cu trc v s tru tng ha d liu. S thay i cn bn ch, mt chng trnh hng i tng c thit k xoay quanh d liu m chng ta c th lm vic trn , hn l theo bn thn chc nng ca chng trnh. iu ny hon ton t nhin mt khi chng ta hiu rng mc tiu ca chng trnh l x l d liu. Suy cho cng, cng vic m my tnh thc hin vn thng c gi l x l d liu. D liu v thao tc lin kt vi nhau mt mc c bn (cn c th gi l mc thp), mi th u i hi th kia c mc tiu c th, cc chng trnh hng i tng lm tng minh mi quan h ny. Lp trnh hng i tng (Object Oriented Programming - gi tt l OOP) hay chi tit hn l Lp trnh nh hng i tng, chnh l phng php lp trnh ly i tng lm nn tng xy dng thut gii, xy
Trang
dng chng trnh. Thc cht y khng phi l mt phng php mi m l mt cch nhn mi trong vic lp trnh. phn bit, vi phng php lp trnh theo kiu cu trc m chng ta quen thuc trc y, hay cn gi l phng php lp trnh hng th tc (Procedure-Oriented Programming), ngi lp trnh phn tch mt nhim v ln thnh nhiu cng vic nh hn, sau dn dn chi tit, c th ho c cc vn n gin, tm ra cch gii quyt vn di dng nhng thut gii c th r rng qua d dng minh ho bng ngn ng gii thut (hay cn gi cc thut gii ny l cc chng trnh con). Cch thc phn tch v thit k nh vy chng ta gi l nguyn l lp trnh t trn xung (top-down), th hin qu trnh suy din t ci chung cho n ci c th. Cc chng trnh con l nhng chc nng c lp, s ghp ni chng li vi nhau cho chng ta mt h thng chng trnh gii quyt vn t ra. Chnh v vy, cch thc phn tch mt h thng ly chng trnh con lm nn tng, chng trnh con ng vai tr trung tm ca vic lp trnh, c hiu nh phng php lp trnh hg v th tc. Tuy nhin, khi phn tch thit k mt h thng khng nht thit phi lun lun suy ngh theo hng lm th no gii quyt cng vic, chng ta c th nh hng t duy theo phong cch vi mt s i tng c, phi lm g gii quyt c cng vic t ra hoc phong ph hn, lm ci g vi mt s i tng c , t cng c th gii quyt c nhng cng vic c th. Vi phng php phn tch trong i tng ng vai tr trng tm ca vic lp trnh nh vy, ngi ta gi l nguyn l lp trnh t di ln (Bttm-up). Lp trnh hng i tng lin kt cu trc d liu vi cc thao tc, theo cch m tt c thng ngh v th gii quanh mnh. Chng ta thng gn mt s cc hot ng c th vi mt loi hot ng no v t cc gi thit ca mnh trn cc quan h . V d1.1: d hnh dng hn, chng ta th nhn qua cc cng trnh xy dng hin i, nh sn vn ng c mi che hnh vng cung, nhng kin trc thm m vi ng nt hnh cong. Tt c nhng sn phm xut hin cng vi nhng vt liu xy dng. Ngy nay, khng ch chng ln nhau nhng vin gch, nhng tng to nn nhng qun th kin trc (nh Thp Chm Nha Trang, Kim T Thp,...), m c th vi btng, st thp v khng nhiu lm nhng vin gch, ngi xy dng cng c th thit k nhng cng trnh kin trc tuyt m, nhng to nh hin i. Chnh cc cht liu xy dng lm nh hng phng php xy dng, cht liu xy dng v nguyn l kt dnh ca cht liu li vi nhau cho chng ta mt i tng kho st, Cht liu xy dng v nguyn l kt dnh cc cht liu li vi nhau c hiu theo ngha d liu v chng trnh con tc ng trn d liu . V d1.2: Chng ta bit rng mt chic xe c cc bnh xe, di chuyn c v c th i hng ca n bng cch quo tay li. Tng t nh th, mt ci cy l mt loi thc vt c thn g v l. Mt chic xe khng phi l mt ci cy, m ci cy khng phi l mt chic xe, chng ta c th gi thit rng ci m chng ta c th lm c vi mt chic xe th khng th lm c vi mt ci cy. Chng hn, tht l v ngha khi mun li mt ci cy, cn chic xe th li chng ln thm c khi chng ta ti nc cho n. Lp trnh hng i tng cho php chng ta s dng cc qu trnh suy ngh nh vy vi cc khi nim tru tng c s dng trong cc chng trnh my tnh. Mt mu tin (record) nhn s c th c c ra, thay i v lu tr li; cn s phc th c th c dng trong cc tnh ton. Tuy vy khng th no li vit mt s phc vo tp tin lm mu tin nhn s v ngc li hai mu tin nhn s li khng th cng vi nhau c. Mt chng trnh hng i tng s xc nh c im v hnh vi c th ca cc kiu d liu, iu cho php chng ta bit mt cch chnh xc rng chng ta c th c c nhng g cc kiu d liu khc nhau. Chng ta cn c th to ra cc quan h gia cc kiu d liu tng t nhng khc nhau trong mt chng trnh hng i tng. Ngi ta thng t nhin phn loi ra mi th, thng t mi lin h gia cc khi nim mi vi cc khi nim c, v thng c th thc hin suy din gia chng trn cc quan h . Hy quan nim th gii theo kiu cu trc cy, vi cc mc xy dng chi tit hn k tip nhau cho cc th h sau so vi cc th h trc. y l phng php hiu qu t chc th gii quanh chng ta. Cc chng trnh hng i tng cng lm vic theo mt phng thc tng t, trong chng cho php xy dng cc cc c cu d liu v thao tc mi da trn cc c cu c sn, mang theo cc tnh nng ca cc c cu nn m chng da trn , trong khi vn thm vo cc tnh nng mi.
Trang
Lp trnh hng i tng cho php chng ta t chc d liu trong chng trnh theo mt cch tng t nh cc nh sinh hc t chc cc loi thc vt khc nhau. Theo cch ni lp trnh i tng, xe hi, cy ci, cc s phc, cc quyn sch u c gi l cc lp (Class). Mt lp l mt bn mu m t cc thng tin cu trc d liu, ln cc thao tc hp l ca cc phn t d liu. Khi mt phn t d liu c khai bo l phn t ca mt lp th n c gi l mt i tng (Object). Cc hm c nh ngha hp l trong mt lp c gi l cc phng thc (Method) v chng l cc hm duy nht c th x l d liu ca cc i tng ca lp . Mt thc th (Instance) l mt vt th c thc bn trong b nh, thc cht l mt i tng (ngha l mt i tng c cp pht vng nh). Mi mt i tng c ring cho mnh mt bn sao cc phn t d liu ca lp cn gi l cc bin thc th (Instance variable). Cc phng thc nh ngha trong mt lp c th c gi bi cc i tng ca lp . iu ny c gi l gi mt thng ip (Message) cho i tng. Cc thng ip ny ph thuc vo i tng, ch i tng no nhn thng ip mi phi lm vic theo thng ip . Cc i tng u c lp vi nhau v vy cc thay i trn cc bin th hin ca i tng ny khng nh hng g trn cc bin th hin ca cc i tng khc v vic gi thng ip cho mt i tng ny khng nh hng g n cc i tng khc.
Nh vy, i tng c hiu theo ngha l mt thc th m trong ca d liu v th tc tc ng ln d liu c ng gi li vi nhau. Hay i tng c c trng bi mt s thao tc (operation) v cc thng tin (information) ghi nh s tc ng ca ca thao tc ny. V d 1.3: Khi nghin c v ngn xp (stack), ngoi cc d liu vng cha ngn xp, nh ca ngn xp, chng ta phi ci t km theo cc thao tc nh khi to (creat) ngn xp, kim tra ngn xp rng (empty), y (push) mt phn t vo ngn xp, ly (pop) mt phn t ra khi ngn xp. Trn quan im ly i tng lm nn tng, r rng d liu v cc thao tc trn d liu lun gn b vi nhau, s kt dnh chng chnh l i tng chng ta cn kho st. Cc thao tc trong i tng c gi l cc phng thc hay hnh vi ca i tng . Phng thc v d liu ca i tng lun tc ng ln nhau v c vai tr ngang nhau trong i tng, Phng thc ca i tng c qui nh bi d liu v ngc li, d liu ca i tng c t trng bi cc phng thc ca i tng. Chnh nh s gn b , chng ta c th gi cng mt thng ip n nhng i tng khc nhau. iu ny gip ngi lp trnh khng phi x l trong chng trnh ca mnh mt dy cc cu trc iu khin tu theo thng ip nhn vo, m chng trnh c x l vo thi im thc hin. Tm li, so snh lp trnh cu trc vi chng trnh con lm nn tng: Chng trnh = Cu trc d liu + Thut gii Trong lp trnh hng i tng chng ta c: i tng = Phng thc + D liu y chnh l 2 quan im lp trnh ang tn ti v pht trin trong th gii ngy nay.
II.
Trong phn ny, chng ta tm hiu cc khi nim nh s ng gi, tnh k tha v tnh a hnh. y l cc khi nim cn bn, l nn tng t tng ca lp trnh hng i tng. Hiu c khi nim ny, chng ta bc u tip cn vi phong cch lp trnh mi, phong cch lp trnh da vo i tng lm nn tng m trong quan im che du thng tin thng qua s ng gi l quan im trung tm ca vn .
II.1. S ng gi (Encapsulation)
S ng gi l c ch rng buc d liu v thao tc trn d liu thnh mt th thng nht, trnh c cc tc ng bt ng t bn ngoi. Th thng nht ny gi l i tng.
Trang
Trong Objetc Oriented Software Engineering ca Ivar Jacibson, tt c cc thng tin ca mt h thng nh hng i tng c lu tr bn trong i tng ca n v ch c th hnh ng khi cc i tng c ra lnh thc hin cc thao tc. Nh vt, s ng gi khng ch n thun l s gom chung d liu v chng trnh vo trong mt khi, chng cn c hiu theo ngha l s ng nht gia d liu v cc thao tc tc ng ln d liu . Trong mt i tng, d liu hay thao tc hay c hai c th l ring (private) hoc chung (public) ca i tng . Thao tc hay d liu ring l thuc v i tng ch c truy cp bi cc thnh phn ca i tng, iu ny ngha l thao tc hay d liu ring khng th truy cp bi cc phn khc ca chng trnh tn ti ngoi i tng. Khi thao tc hay d liu l chung, cc phn khc ca chng trnh c th truy cp n mc d n c nh ngha trong mt i tng. Cc thnh phn chung ca mt i tng dng cung cp mt giao din c iu khin cho cc thnh thnh ring ca i tng. C ch ng gi l phng thc tt thc hin c ch che du thng tin so vi cc ngn ng lp trnh cu trc.
Trang 10
l kh nng cho mt thng ip c th thay i cch thc hin ca n theo lp c th ca i tng nhn thng ip. Khi mt lp dn xut c to ra, n c th thay i cch thc hin cc phng thc no m n tha hng t lp c s ca n. Mt thng ip khi c gi n mt i tng ca lp c s, s dng phng thc nh ngha cho n trong lp c s. Nu mt lp dn xut nh ngha li mt phng thc tha hng t lp c s ca n th mt thng ip c cng tn vi phng thc ny, khi c gi ti mt i tng ca lp dn xut s gi phng thc nh ngha cho lp dn xut. Nh vy a hnh l kh nng cho php gi cng mt thng ip n nhng i tng khc nhau c cng chung mt c im, ni cch khc thng ip c gi i khng cn bit thc th nhn thuc lp no, ch bit rng tp hp cc thc th nhn c chung mt tnh cht no . Chng hn, thng ip v hnh c gi n c hai i tng hnh hp v hnh trn. Trong hai i tng ny u c chung phng thc v hnh, tuy nhin tu theo thi im m i tng nhn thng ip, hnh tng ng s c v ln. Trong cc ngn ng lp trnh OOP, tnh a hnh th hin qua kh nng cho php m t nhng phng thc c tn ging nhau trong cc lp khc nhau. c im ny gip ngi lp trnh khng phi vit nhng cu trc iu khin rm r trong chng trnh, cc kh nng khc nhau ca thng ip ch thc s i hi khi chng trnh thc hin. V d 1.3: Xt li v d 1.2, chng ta thy rng c tp ch v v sch u phi c kh nng ly ra. Tuy nhin phng php ly ra cho tp ch c khc so vi phng php ly ra cho sch, mc d kt qu cui cng ging nhau. Khi phi ly ra tp ch, th phi s dng phng php ly ra ring cho tp ch (da trn mt bn tra cu) nhng khi ly ra sch th li phi s dng phng php ly ra ring cho sch (da trn h thng phiu lu tr). Tnh a hnh cho php chng ta xc nh mt phng thc ly ra mt tp ch hay mt cun sch. Khi ly ra mt tp ch n s dng phng thc ly ra dnh ring cho tp ch, cn khi ly ra mt cun sch th n s dng phng thc ly ra tng ng vi sch. Kt qu l ch cn mt tn phng thc duy nht c dng cho c hai cng vic tin hnh trn hai lp dn xut c lin quan, mc d vic thc hin ca phng thc thay i ty theo tng lp. Tnh a hnh da trn s ni kt (Binding), l qu trnh gn mt phng thc vi mt hm thc s. Khi cc phng thc kiu a hnh c s dng th trnh bin dch cha th xc nh hm no tng ng vi phng thc no s c gi. Hm c th c gi s tu thuc vo vic phn t nhn thng ip lc l thuc lp no, do hm c gi ch xc nh c vo lc chng trnh chy. iu ny gi l s kt ni mun (Late binding) hay kt ni lc chy (Runtime binding) v n xy ra khi chng trnh ang thc hin. Hnh 1.2: Minh ha tnh a hnh i vi lp n phm v cc lp dn xut ca n.
Trang 11
Trang 12
CC M RNG CA C++
I. LCH S CA C++
Vo nhng nm u thp nin 1980, ngi dng bit C++ vi tn gi "C with Classes" c m t trong hai bi bo ca Bjarne Stroustrup (thuc AT&T Bell Laboratories) vi nhan "Classes: An Abstract Data Type Facility for the C Language" v "Adding Classes to C : AnExercise in Language Evolution". Trong cng trnh ny, tc gi xut khi nim lp, b sung vic kim tra kiu tham s ca hm, cc chuyn i kiu v mt s m rng khc vo ngn ng C. Bjarne Stroustrup nghin cu m rng ngn ng C nhm t n mt ngn ng m phng (simulation language) vi nhng tnh nng hng i tng. Trong nm 1983, 1984, ngn ng "C with Classes" c thit k li, m rng hn ri mt trnh bin dch ra i. V chnh t , xut hin tn gi "C++". Bjarne Stroustrup m t ngn ng C++ ln u tin trong bi bo c nhan "Data Abstraction in C". Sau mt vi hiu chnh C++ c cng b rng ri trong quyn "The C++ Programming Language" ca Bjarne Stroustrup xut hin nh du s hin din thc s ca C++, ngi lp tnh chuyn nghip t y c mt ngn ng mnh cho cc d n thc tin ca mnh. V thc cht C++ ging nh C nhng b sung thm mt s m rng quan trng, c bit l tng v i tng, lp trnh nh hng i tng.Tht ra cc tng v cu trc trong C++ xut pht vo cc nm 1970 t Simula 70 v Algol 68. Cc ngn ng ny a ra cc khi nim v lp v n th. Ada l mt ngn ng pht trin t , nhng C++ khng nh vai tr thc s ca mnh.
II.
CC M RNG CA C++
II.1. Cc t kha mi ca C++
b sung cc tnh nng mi vo C, mt s t kha (keyword) mi c a vo C++ ngoi cc t kha c trong C. Cc chng trnh bng C no s dng cc tn trng vi cc t kha cn phi thay i trc khi chng trnh c dch li bng C++. Cc t kha mi ny l :
friend public
inline template
Trang 13
Mi th nm gia /**/ t dng 1 n dng 3 u c chng trnh b qua. Chng trnh ny cn minh ha cch ch thch th hai. l cch ch thch bt u bng // dng 8 v dng 9. Chng ta chy v d 2.1, kt qu hnh 2.1.
Hnh 2.1: Kt qu ca v d 2.1 Ni chung, kiu ch thch /**/ c dng cho cc khi ch thch ln gm nhiu dng, cn kiu // c dng cho cc ch thch mt dng.
thc hin dng xut chng ta s dng bin cout (console output) kt hp vi ton t chn (insertion operator) << nh cc dng 5, 7, 9 v 10. Cn dng nhp chng ta s dng bin cin (console input) kt hp vi ton t trch (extraction operator) >> nh cc dng 6 v 8. Khi s dng cout hay cin, chng ta phi ko file iostream.h nh dng 1. Chng ta s tm hiu k v dng nhp/xut chng 8. Chng ta chy v d 2.2 , kt qu hnh 2.2.
Trang 14
Trang 15
Trong chng trnh chng ta xen k khai bo bin vi lnh thc hin dng 4 n dng 12. Chng ta chy v d 2.4, kt qu hnh 2.5.
Hnh 2.5: Kt qu ca v d 2.4 Khi khai bo mt bin trong chng trnh, bin s c hiu lc trong phm vi ca chng trnh k t v tr n xut hin. V vy chng ta khng th s dng mt bin c khai bo bn di n.
Trang 16
Phm vi ca cc bin const gia ANSI C v C++ khc nhau. Trong ANSI C, cc bin const c khai bo bn ngoi mi hm th chng c phm vi ton cc, iu ny ngha l chng c th nhn thy c bn ngoi file m chng c nh ngha, tr khi chng c khai bo l static. Nhng trong C++, cc bin const c hiu mc nh l static.
Quy nh ny cng p dng cho c union v enum. Tuy nhin tng thch vi C, C++ vn chp nhn c php c. Mt kiu union c bit c thm vo C++ gi l union nc danh (anonymous union). N ch khai bo mt lot cc trng(field) dng chung mt vng a ch b nh. Mt union nc danh khng c tn tag, cc trng c th c truy xut trc tip bng tn ca chng. Chng hn nh on m sau: union { int Num; float Value; }; C hai Num v Value u dng chung mt v tr v khng gian b nh. Tuy nhin khng ging nh kiu union c tn, cc trng ca union nc danh th c truy xut trc tip, chng hn nh sau: Num = 12; Value = 30.56;
Trang 17
Ton t nh phm vi cn c dng trong cc nh ngha hm ca cc phng thc trong cc lp, khai bo lp ch ca cc phng thc ang c nh ngha . Ton t nh phm vi cn c th c dng phn bit cc thnh phn trng tn ca cc lp c s khc nhau.
Trang 18
Ch : i vi vic cp pht mng chng ta khng th va cp pht va khi ng gi tr cho chng, chng hn on chng trnh sau l sai : int *P; P = new (int[10])(3); //Sai !!! V d 2.6: Chng trnh to mt mng ng, khi ng mng ny vi cc gi tr ngu nhin v sp xp chng. 1: #include <iostream.h> 2: #include <time.h> 3: #include <stdlib.h> 4: int main() 5: { 6: int N; 7: cout<<"Nhap vao so phan tu cua mang:"; 8: cin>>N; 9: int *P=new int[N]; 10: if (P==NULL) 11: { 12: cout<<"Khong con bo nho de cap phat\n"; 13: return 1; 14: } 15: srand((unsigned)time(NULL)); 16: for(int I=0;I<N;++I) 17: P[I]=rand()%100; //To cc s ngu nhin t 0 n 99 18: cout<<"Mang truoc khi sap xep\n"; 19: for(I=0;I<N;++I) 20: cout<<P[I]<<" "; 21: for(I=0;I<N-1;++I) 22: for(int J=I+1;J<N;++J) 23: if (P[I]>P[J]) 24: { 25: int Temp=P[I]; 26: P[I]=P[J]; 27: P[J]=Temp; 28: } 29: cout<<"\nMang sau khi sap xep\n"; 30: for(I=0;I<N;++I) 31: cout<<P[I]<<" "; 32: delete []P; 33: return 0; 34: }
Gio trnh mn Lp trnh hng i tng Chng ta chy v d 2.6, kt qu hnh 2.7
Trang 19
Hnh 2.8: Mng hai chiu c th xem nh mng mt chiu. Gi X l mng hai chiu c kch thc m dng v n ct. A l mng mt chiu tng ng. Nu X[i][j] chnh l A[k] th k = i*n + j Chng ta c chng trnh nh sau : 1: #include <iostream.h> 2: #include <conio.h> 3: //prototype 4: void AddMatrix(int * A,int *B,int*C,int M,int N); 5: int AllocMatrix(int **A,int M,int N); 6: void FreeMatrix(int *A); 7: void InputMatrix(int *A,int M,int N,char Symbol); 8: void DisplayMatrix(int *A,int M,int N); 9: 10: int main() 11: { 12: int M,N; 13: int *A = NULL,*B = NULL,*C = NULL; 14: 15: clrscr(); 16: cout<<"Nhap so dong cua ma tran:"; 17: cin>>M; 18: cout<<"Nhap so cot cua ma tran:"; 19: cin>>N; 20: //Cp pht vng nh cho ma trn A 21: if (!AllocMatrix(&A,M,N)) 22: { //endl: Xut ra k t xung dng (\n) 23: cout<<"Khong con du bo nho!"<<endl; 24: return 1; 25: }
Trang 20
Trang 21
Hnh 2.9: Kt qu ca v d 2.7 Mt cch khc cp pht mng hai chiu A gm M dng v N ct nh sau:
int ** A = new int *[M]; int * Tmp = new int[M*N]; for(int I=0;I<M;++I) { A[I]=Tmp; Tmp+=N; } //Thao tc trn mng hai chiu A .. delete [] *A; delete [] A;
Ton t new cn c mt thun li khc, l tt c cc li cp pht ng u c th bt c bng mt hm x l li do ngi dng t nh ngha. C++ c nh ngha mt con tr (pointer) tr n hm c bit.
Trang 22
Khi ton t new c s dng cp pht ng v mt li xy ra do cp pht, C++ t gi n hm c ch bi con tr ny. nh ngha ca con tr ny nh sau:
Hnh 2.10: Kt qu ca v d 2.8 Th vin cng cn c mt hm c nh ngha trong new.h l hm c prototype sau :
Trang 23
II.10. Hm inline
Mt chng trnh c cu trc tt s dng cc hm chia chng trnh thnh cc n v c lp c logic ring. Tuy nhin, cc hm thng phi cha mt lot cc x l im vo (entry point): tham s phi c y vo stack, mt lnh gi phi c thc hin v sau vic quay tr v cng phi c thc hin bng cch gii phng cc tham s ra khi stack. Khi cc x l im vo chm chp thng cc lp trnh vin C phi s dng cch chp lp li cc on chng trnh nu mun tng hiu qu. trnh khi phi x l im vo, C++ trang b thm t kha inline loi vic gi hm. Khi trnh bin dch s khng bin dch hm ny nh mt on chng trnh ring bit m n s c chn thng vo cc ch m hm ny c gi. iu ny lm gim vic x l im vo m vn cho php mt chng trnh c t chc di dng c cu trc. C php ca hm inline nh sau : inline data_type function_name ( parameters ) { .. } Trong : data_type: Kiu tr v ca hm. Function_name:Tn ca hm. Parameters: Cc tham s ca hm. V d 2.10: Tnh th tch ca hnh lp phng 1: #include <iostream.h> 2: inline float Cube(float S) 3: { 4: return S*S*S; 5: } 6: 7: int main() 8: { 9: cout<<"Nhap vao chieu dai canh cua hinh lap phuong:"; 10: float Side; 11: cin>>Side; 12: cout<<"The tich cua hinh lap phuong = "<<Cube(Side); 13: return 0; 14: } Chng ta chy v d 2.10, kt qu hnh 2.12
Trang 24
S dng hm inline s lm cho chng trnh ln ln v trnh bin dch chn on chng trnh vo cc ch m hm ny c gi. Do thng cc hm inline thng l cc hm nh, t phc tp. Cc hm inline phi c nh ngha trc khi s dng. v d 2.10 chng ta sa li nh sau th chng trnh s b bo li: #include <iostream.h> float Cube(float S); int main() { cout<<"Nhap vao chieu dai canh cua hinh lap phuong:"; float Side; cin>>Side; cout<<"The tich cua hinh lap phuong = "<<Cube(Side); return 0; } inline float Cube(float S) { return S*S*S; } Cc hm quy khng c l hm inline.
II.11. Cc gi tr tham s mc nh
Mt trong cc c tnh ni bt nht ca C++ l kh nng nh ngha cc gi tr tham s mc nh cho cc hm. Bnh thng khi gi mt hm, chng ta cn gi mt gi tr cho mi tham s c nh ngha trong hm , chng hn chng ta c on chng trnh sau: void MyDelay(long Loops); //prototype .. void MyDelay(long Loops) { for(int I = 0; I < Loops; ++I) ; } Mi khi hm MyDelay() c gi chng ta phi gi cho n mt gi tr cho tham s Loops. Tuy nhin, trong nhiu trng hp chng ta c th nhn thy rng chng ta lun lun gi hm MyDelay() vi cng mt gi tr Loops no . Mun vy chng ta s dng gi tr mc nh cho tham s Loops, gi s chng ta mun gi tr mc nh cho tham s Loops l 1000. Khi on m trn c vit li nh sau : void MyDelay(long Loops = 1000); //prototype .. void MyDelay(long Loops) { for(int I = 0; I < Loops; ++I) ; } Mi khi gi hm MyDelay() m khng gi mt tham s tng ng th trnh bin dch s t ng gn cho tham s Loops gi tr 1000. MyDelay(); // Loops c gi tr l 1000 MyDelay(5000); // Loops c gi tr l 5000 Gi tr mc nh cho tham s c th l mt hng, mt hm, mt bin hay mt biu thc.
Trang 25
V d 2.11: Tnh th tch ca hnh hp 1: #include <iostream.h> 2: int BoxVolume(int Length = 1, int Width = 1, int Height = 1); 3: 4: int main() 5: { 6: cout << "The tich hinh hop mac dinh: " 7: << BoxVolume() << endl << endl 8: << "The tich hinh hop voi chieu dai=10,do rong=1,chieu cao=1:" 9: << BoxVolume(10) << endl << endl 10: << "The tich hinh hop voi chieu dai=10,do rong=5,chieu cao=1:" 11: << BoxVolume(10, 5) << endl << endl 12: << "The tich hinh hop voi chieu dai=10,do rong=5,chieu cao=2:" 13: << BoxVolume(10, 5, 2)<< endl; 14: return 0; 15: } 16: //Tnh th tch ca hnh hp 17: int BoxVolume(int Length, int Width, int Height) 18: { 19: return Length * Width * Height; 20: } Chng ta chy v d 2.11, kt qu hnh 2.13
Hnh 2.13: Kt qu ca v d 2.11 Ch : Cc tham s c gi tr mc nh ch c cho trong prototype ca hm v khng c lp li trong nh ngha hm (V trnh bin dch s dng cc thng tin trong prototype ch khng phi trong nh ngha hm to mt lnh gi). Mt hm c th c nhiu tham s c gi tr mc nh. Cc tham s c gi tr mc nh cn phi c nhm li vo cc tham s cui cng (hoc duy nht) ca mt hm. Khi gi hm c nhiu tham s c gi tr mc nh, chng ta ch c th b bt cc tham s theo th t t phi sang tri v phi b lin tip nhau, chng hn chng ta c on chng trnh nh sau: int MyFunc(int a= 1, int b , int c = 3, int d = 4); //prototype sai!!! int MyFunc(int a, int b = 2 , int c = 3, int d = 4); //prototype ng .. MyFunc(); // Li do tham s a khng c gi tr mc nh MyFunc(1);// OK, cc tham s b, c v d ly gi tr mc nh MyFunc(5, 7); // OK, cc tham s c v d ly gi tr mc nh MyFunc(5, 7, , 8); // Li do cc tham s b b phi lin tip nhau
Trang 26
R rng cch vit ny khng c thun tin lm. Trong trng hp ny, C++ a ra mt kiu bin rt c bit gi l bin tham chiu (reference variable). Mt bin tham chiu ging nh l mt b danh ca bin khc. Bin tham chiu s lm cho cc hm c thay i ni dung cc tham s ca n c vit mt cch thanh thot hn. Khi hm Swap() c vit nh sau: void Swap(int &X, int &Y); { int Temp = X; X = Y; Y = Temp ; } Chng ta gi hm nh sau : Swap(A, B); Vi cch gi hm ny, C++ t gi a ch ca A v B lm tham s cho hm Swap(). Cch dng bin tham chiu cho tham s ca C++ tng t nh cc tham s c khai bo l Var trong ngn ng Pascal. Tham s ny c gi l tham s kiu tham chiu (reference parameter). Nh vy bin tham chiu c c php nh sau : data_type & variable_name; Trong : data_type: Kiu d liu ca bin. variable_name: Tn ca bin Khi dng bin tham chiu cho tham s ch c a ch ca n c gi i ch khng phi l ton b cu trc hay i tng nh hnh 2.14, iu ny rt hu dng khi chng ta gi cu trc v i tng ln cho mt hm.
Hnh 2.14: Mt tham s kiu tham chiu nhn mt tham chiu ti mt bin c chuyn cho tham s ca hm.
Trang 27
Hnh 2.15: Kt qu ca v d 2.12 i khi chng ta mun gi mt tham s no bng bin tham chiu cho hiu qu, mc d chng ta khng mun gi tr ca n b thay i th chng ta dng thm t kha const nh sau : int MyFunc(const int & X); Hm MyFunc() s chp nhn mt tham s X gi bng tham chiu nhng const xc nh rng X khng th b thay i. Bin tham chiu c th s dng nh mt b danh ca bin khc (b danh n gin nh mt tn khc ca bin gc), chng hn nh on m sau : int Count = 1; int & Ref = Count; //To bin Ref nh l mt b danh ca bin Count ++Ref; //Tng bin Count ln 1 (s dng b danh ca bin Count) Cc bin tham chiu phi c khi ng trong phn khai bo ca chng v chng ta khng th gn li mt b danh ca bin khc cho chng. Chng hn on m sau l sai: int X = 1; int & Y; //Li: Y phi c khi ng. Khi mt tham chiu c khai bo nh mt b danh ca bin khc, mi thao tc thc hin trn b danh chnh l thc hin trn bin gc ca n. Chng ta c th ly a ch ca bin tham chiu v c th so snh cc bin tham chiu vi nhau (phi tng thch v kiu tham chiu). V d 2.13: Mi thao tc trn trn b danh chnh l thao tc trn bin gc ca n. #include <iostream.h> int main() { int X = 3; int &Y = X; //Y la b danh ca X int Z = 100; cout<<"X="<<X<<endl<<"Y="<<Y<<endl; Y *= 3;
Trang 28
Hnh 2.16: Kt qu ca v d 2.13 V d 2.14: Ly a ch ca bin tham chiu #include <iostream.h> int main() { int X = 3; int &Y = X; //Y la b danh ca X cout<<"Dia chi cua X = "<<&X<<endl; cout<<"Dia chi cua bi danh Y= "<<&Y<<endl; return 0; } Chng ta chy v d 2.14, kt qu hnh 2.17
Hnh 2.17: Kt qu ca v d 2.14 Chng ta c th to ra bin tham chiu vi vic khi ng l mt hng, chng hn nh on m sau : int & Ref = 45; Trong trng hp ny, trnh bin dch to ra mt bin tm thi cha tr hng v bin tham chiu chnh l b danh ca bin tm thi ny. iu ny gi l tham chiu c lp (independent reference). Cc hm c th tr v mt tham chiu, nhng iu ny rt nguy him. Khi hm tr v mt tham chiu ti mt bin cc b ca hm th bin ny phi c khai bo l static, ngc li tham chiu ti n th khi hm kt thc bin cc b ny s b b qua. Chng hn nh on chng trnh sau:
int & MyFunc() { static int X = 200; //Nu khng khai bo l static th iu ny rt nguy him. return X; }
Khi mt hm tr v mt tham chiu, chng ta c th gi hm pha bn tri ca mt php gn. V d 2.15: 1: #include <iostream.h> 2: 3: int X = 4; 4: //prototype
Trang 29
Hnh 2.18: Kt qu ca v d 2.15 Ch : Mc d bin tham chiu trng ging nh l bin con tr nhng chng khng th l bin con tr do chng khng th c dng cp pht ng. Chng ta khng th khai bo mt bin tham chiu ch n bin tham chiu hoc bin con tr ch n bin tham chiu. Tuy nhin chng ta c th khai bo mt bin tham chiu v bin con tr nh on m sau: int X; int *P = &X; int * & Ref = P;
Trang 30
V d 2.16: 1: #include <iostream.h> 2: #include <math.h> 3: 4: int MyAbs(int X); 5: long MyAbs(long X); 6: double MyAbs(double X); 7: 8: int main() 9: { 10: int X = -7; 11: long Y = 200000l; 12: double Z = -35.678; 13: cout<<"Tri tuyet doi cua so nguyen (int) "<<X<<" la " 14: <<MyAbs(X)<<endl; 15: cout<<"Tri tuyet doi cua so nguyen (long int) "<<Y<<" la " 16: <<MyAbs(Y)<<endl; 17: cout<<"Tri tuyet doi cua so thuc "<<Z<<" la " 18: <<MyAbs(Z)<<endl; 19: return 0; 20: } 21: 22: int MyAbs(int X) 23: { 24: return abs(X); 25: } 26: 27: long MyAbs(long X) 28: { 29: return labs(X); 30: } 31: 32: double MyAbs(double X) 33: { 34: return fabs(X); 35: } Chng ta chy v d 2.16 , kt qu hnh 2.19
Hnh 2.19: Kt qu ca v d 2.16 Trnh bin dch da vo s khc nhau v s cc tham s, kiu ca cc tham s c th xc nh chnh xc phin bn ci t no ca hm MyAbs() thch hp vi mt lnh gi hm c cho, chng hn nh: MyAbs(-7); //Gi hm int MyAbs(int) MyAbs(-7l); //Gi hm long MyAbs(long) MyAbs(-7.5); //Gi hm double MyAbs(double) Qu trnh tm c hm c a nng ha cng l qu trnh c dng gii quyt cc trng hp nhp nhng ca C++. Chng hn nh nu tm thy mt phin bn nh ngha no ca mt hm c a nng ha m c kiu d liu cc tham s ca n trng vi kiu cc tham s gi ti trong lnh gi hm th phin bn hm s c gi. Nu khng trnh bin dch C++ s gi n phin bn no cho php chuyn kiu d dng nht.
Trang 31
Cc php chuyn kiu c sn s c u tin hn cc php chuyn kiu m chng ta to ra (chng ta s xem xt cc php chuyn kiu t to chng 3). Chng ta cng c th ly a ch ca mt hm c a nng ha sao cho bng mt cch no chng ta c th lm cho trnh bin dch C++ bit c chng ta cn ly a ch ca phin bn hm no c trong nh ngha. Chng hn nh: int (*pf1)(int); long (*pf2)(long); int (*pf3)(double); pf1 = MyAbs; //Tr n hm int MyAbs(int) pf2 = MyAbs; //Tr n hm long MyAbs(long) pf3 = MyAbs; //Li!!! (khng c phin bn hm no i snh) Cc gii hn ca vic a nng ha cc hm: Bt k hai hm no trong tp cc hm a nng phi c cc tham s khc nhau. Cc hm a nng ha vi danh sch cc tham s cng kiu ch da trn kiu tr v ca hm th trnh bin dch bo li. Chng hn nh, cc khai bo sau l khng hp l: void Print(int X); int Print(int X); Khng c cch no trnh bin dch nhn bit phin bn no c gi nu gi tr tr v b b qua. Nh vy cc phin bn trong vic a nng ha phi c s khc nhau t nht v kiu hoc s tham s m chng nhn c. Cc khai bo bng lnh typedef khng nh ngha kiu mi. Chng ch thay i tn gi ca kiu c. Chng khng nh hng ti c ch a nng ha hm. Chng ta hy xem xt on m sau: typedef char * PSTR; void Print(char * Mess); void Print(PSTR Mess); Hai hm ny c cng danh sch cc tham s, do on m trn s pht sinh li. i vi kiu mng v con tr c xem nh ng nht i vi s phn bit khc nhau gia cc phin bn hm trong vic a nng ha hm. Chng hn nh on m sau se pht sinh li: void Print(char * Mess); void Print(char Mess[]); Tuy nhin, i vi mng nhiu chiu th c s phn bit gia cc phin bn hm trong vic a nng ha hm, chng hn nh on m sau hp l: void Print(char Mess[]); void Print(char Mess[][7]); void Print(char Mess[][9][42]); const v cc con tr (hay cc tham chiu) c th dng phn bit, chng hn nh on m sau hp l:
Trang 32
Trang 33
Complex SubComplex(Complex C1,Complex C2) { Complex Tmp; Tmp.Real = C1.Real-C2.Real; Tmp.Imaginary = C1.Imaginary-C2.Imaginary; return Tmp; }
/* Hin th s phc */
Hnh 2.20: Kt qu ca v d 2.17 Trong chng trnh v d 2.17, chng ta nhn thy vi cc hm va ci t dng cng v tr hai s phc 1+2i v 3+4i; ngi lp trnh hon ton khng thoi mi khi s dng bi v thc cht thao tc cng v tr l cc ton t ch khng phi l hm. khc phc yu im ny, trong C++ cho php chng ta c th nh ngha li chc nng ca cc ton t c sn mt cch tin li v t nhin hn rt nhiu. iu ny gi l a nng ha ton t. Khi chng trnh v d 2.17 c vit nh sau: V d 2.18: 1: #include <iostream.h> 2: // nh ngha s phc 3: typedef struct 4: { 5: double Real; 6: double Imaginary; 7: }Complex; 8: 9: Complex SetComplex(double R,double I); 10: void DisplayComplex(Complex C); 11: Complex operator + (Complex C1,Complex C2); 12: Complex operator - (Complex C1,Complex C2); 13: 14: int main(void) 15: { 16: Complex C1,C2,C3,C4; 17: 18: C1 = SetComplex(1.0,2.0); 19: C2 = SetComplex(-3.0,4.0); 20: cout<<"\nSo phuc thu nhat:"; 21: DisplayComplex(C1); 22: cout<<"\nSo phuc thu hai:"; 23: DisplayComplex(C2); 24: C3 = C1 + C2;
Trang 34
Hnh 2.21: Kt qu ca v d 2.18 Nh vy trong C++, cc php ton trn cc gi tr kiu s phc c thc hin bng cc ton t ton hc chun ch khng phi bng cc tn hm nh trong C. Chng hn chng ta c lnh sau: C4 = AddComplex(C3, SubComplex(C1,C2)); th trong C++, chng ta c lnh tng ng nh sau: C4 = C3 + C1 - C2;
Trang 35
Chng ta nhn thy rng c hai lnh u cho cng kt qu nhng lnh ca C++ th d hiu hn. C++ lm c iu ny bng cch to ra cc hm nh ngha cch thc hin ca mt ton t cho cc kiu d liu t nh ngha. Mt hm nh ngha mt ton t c c php sau: data_type operator operator_symbol ( parameters ) { } Trong : data_type: Kiu tr v. operator_symbol: K hiu ca ton t. parameters: Cc tham s (nu c). Trong chng trnh v d 2.18, ton t + l ton t gm hai ton hng (gi l ton t hai ngi; ton t mt ngi l ton t ch c mt ton hng) v trnh bin dch bit tham s u tin l bn tri ton t, cn tham s th hai th bn phi ca ton t. Trong trng hp lp trnh vin quen thuc vi cch gi hm, C++ vn cho php bng cch vit nh sau: C3 = operator + (C1,C2); C4 = operator - (C1,C2); Cc ton t c a nng ha s c la chn bi trnh bin dch cng theo cch thc tng t nh vic chn la gia cc hm c a nng ha l khi gp mt ton t lm vic trn cc kiu khng phi l kiu c sn, trnh bin dch s tm mt hm nh ngha ca ton t no c cc tham s i snh vi cc ton hng dng. Chng ta s tm hiu k v vic a nng ha cc ton t trong chng 4. Cc gii hn ca a nng ha ton t: Chng ta khng th nh ngha cc ton t mi. Hu ht cc ton t ca C++ u c th c a nng ha. Cc ton t sau khng c a nng ha l : Ton t ngha Ton t nh phm vi. :: Truy cp n con tr l trng ca struct hay thnh vin ca class. .* Truy cp n trng ca struct hay thnh vin ca class. . Ton t iu kin ?: sizeof v chng ta cng khng th a nng ha bt k k hiu tin x l no. Chng ta khng th thay i th t u tin ca mt ton t hay khng th thay i s cc ton hng ca n. Chng ta khng th thay i ngha ca cc ton t khi p dng cho cc kiu c sn. a nng ha cc ton t khng th c cc tham s c gi tr mc nh. Cc ton t c th a nng ho:
= &= >= [] *= ,
^ -= <<= -| ==
Trang 36
Cc ton t ny c nh ngha ch c mt tham s v phi tr v mt gi tr cng kiu vi tham s ca chng. i vi ton t sizeof phi tr v mt gi tr kiu size_t (nh ngha trong stddef.h) Ton t (data_type) c dng chuyn i kiu, n phi tr v mt gi tr c kiu l data_type. Cc ton t hai ngi: * / % + - >> << > < >= <= == != & | ^ && || Cc ton t ny c nh ngha c hai tham s. Cc php gn: = += -= *= /= %= >>= <<= ^= |= Cc ton t gn c nh ngha ch c mt tham s. Khng c gii hn v kiu ca tham s v kiu tr v ca php gn. Ton t ly thnh vin : -> Ton t ly phn t theo ch s: [] Ton t gi hm: ()
BI TP
Bi 1: Hy vit li chng trnh sau bng cch s dng li cc dng nhp/xut trong C++. /* Chng trnh tm mu chung nh nht */ #include <stdio.h> int main() { int a,b,i,min; printf("Nhap vao hai so:"); scanf("%d%d",&a,&b); min=a>b?b:a; for(i = 2;i<min;++i) if (((a%i)==0)&&((b%i)==0)) break; if(i==min) { printf("Khong co mau chung nho nhat"); return 0; } printf("Mau chung nho nhat la %d\n",i); return 0; } Bi 2: Vit chng trnh nhp vo s nguyn dng h (2<h<23), sau in ra cc tam gic c chiu cao l h nh cc hnh sau:
Trang 37 Bi 3: Mt tam gic vung c th c tt c cc cnh l cc s nguyn. Tp ca ba s nguyn ca cc cnh ca mt tam gic vung c gi l b ba Pitago. l tng bnh phng ca hai cnh bng bnh phng ca cnh huyn, chng hn b ba Pitago (3, 4, 5). Vit chng trnh tm tt c cc b ba Pitago nh th sao cho tt c cc cnh khng qu 500. Bi 4: Vit chng trnh in bng ca cc s t 1 n 256 di dng nh phn, bt phn v thp lc phn tng ng. Bi 5: Vit chng trnh nhp vo mt s nguyn dng n. Kim tra xem s nguyn n c thuc dy Fibonacci khng? Bi 6: Vit chng trnh nhn hai ma trn Amxn v Bnxp. Mi ma trn c cp pht ng v cc gi tr ca chng pht sinh ngu nhin (Vi m, n v p nhp t bn phm). Bi 7: Vit chng trnh to mt mng mt chiu ng c kch thc l n (n nhp t bn phm). Cc gi tr ca mng ny c pht sinh ngu nhin trn on [a, b] vi a v b u nhp t bn phm. Hy tm s dng nh nht v s m ln nht trong mng; nu khng c s dng nh nht hoc s m ln nht th xut thng bo "khng c s dng nh nht" hoc "khng c s m ln nht". Bi 8: Anh (ch) hy vit mt hm tnh bnh phng ca mt s. Hm s tr v gi tr bnh phng ca tham s v c kiu cng kiu vi tham s. Bi 9: Trong ngn ng C, chng ta c hm chuyn i mt chui sang s, ty thuc vo dng ca chui chng ta c cc hm chuyn i sau : int atoi(const char *s); Chuyn i mt chui s thnh s nguyn kiu int. long atol(const char *s); Chuyn i mt chui s thnh s nguyn kiu long. double atof(const char *s); Chuyn i mt chui s thnh s thc kiu double. Anh (ch) hy vit mt hm c tn l aton (ascii to number) chuyn i chui sang cc dng s tng ng. Bi 10: Anh ch hy vit cc hm sau: Hm ComputeCircle() tnh din tch s v chu vi c ca mt ng trn bn knh r. Hm ny c prototype nh sau: void ComputeCircle(float & s, float &c, float r = 1.0); Hm ComputeRectangle() tnh din tch s v chu vi p ca mt hnh ch nht c chiu cao h v chiu rng w. Hm ny c prototype nh sau: void ComputeRectangle(float & s, float &p, float h = 1.0, float w = 1.0); Hm ComputeTriangle() tnh din tch s v chu vi p ca mt tam gic c ba cnh a,b v c. Hm ny c prototype nh sau: void ComputeTriangle(float & s, float &p, float a = 1.0, float b = 1.0, float c = 1.0); Hm ComputeSphere() tnh th tch v v din tch b mt s ca mt hnh cu c bn knh r. Hm ny c prototype nh sau: void ComputeSphere(float & v, float &s, float r = 1.0);
Trang 38 Hm ComputeCylinder() tnh th tch v v din tch b mt s ca mt hnh tr c bn knh r v chiu cao h. Hm ny c prototype nh sau: void ComputeCylinder(float & v, float &s, float r = 1.0 , float h = 1.0);
Bi 11: Anh (ch) hy vit thm hai ton t nhn v chia hai s phc v d 2.18 ca chng 2. Bi 12: Mt cu trc Date cha ngy, thng v nm nh sau: struct Date { int Day; //C gi tr t 1 31 int Month; //C gi tr t 1 12 int Year; //Biu din bng 4 ch s. }; Anh (ch) hy vit cc hm nh ngha cc ton t : + - > >= < <= == != trn cu trc Date ny. Bi 13: Mt cu trc Point3D biu din ta ca mt im trong khng gian ba chiu nh sau: struct Point3D { float X; float Y; float Z; }; Anh (ch) hy vit cc hm nh ngha cc ton t : + - == != trn cu trc Point3D ny. Bi 14: Mt cu trc Fraction dng cha mt phn s nh sau: struct Fraction { int Numerator; //T s int Denominator; //Mu s }; Anh (ch) hy vit cc hm nh ngha cc ton t : + - * / > >= < <= == != trn cu trc Fraction ny.
Trang 39
LP V I TNG
I. DN NHP
By gi chng ta bt u tm hiu v lp trnh hng i tng trong C++. Trong cc phn sau, chng ta cng tm hiu v cc k thut ca thit k hng i tng (Object-Oriented Design OOD): Chng ta phn tch mt vn c th, xc nh cc i tng no cn ci t h thng, xc nh cc thuc tnh no m i tng phi c, xc nh hnh vi no m i tng cn a ra, v ch r lm th no cc i tng cn tng tc vi i tng khc thc hin cc mc tiu tng th ca h thng. Chng ta nhc li cc khi nim v thut ng chnh ca nh hng i tng. OOP ng gi d liu (cc thuc tnh) v cc hm (hnh vi) thnh gi gi l cc i tng. D liu v cc hm ca i tng c s lin h mt thit vi nhau. Cc i tng c cc c tnh ca vic che du thng tin. iu ny ngha l mc d cc i tng c th bit lm th no lin lc vi i tng khc thng qua cc giao din hon ton xc nh, bnh thng cc i tng khng c php bit lm th no cc i tng khc c thc thi, cc chi tit ca s thi hnh c du bn trong cc i tng. Trong C v cc ngn ng lp trnh th tc, lp trnh c khuynh hng nh hng hnh ng, trong khi tng trong lp trnh C++ l nh hng i tng. Trong C, n v ca lp trnh l hm; trong C++, n v ca lp trnh l lp (class) . Cc lp trnh vin C tp trung vo vit cc hm. Cc nhm ca cc hnh ng m thc hin vi cng vic c to thnh cc hm, v cc hm c nhm thnh cc chng trnh. D liu th rt quan trng trong C, nhng quan im l d liu tn ti chnh trong vic h tr cc hnh ng m hm thc hin. Cc ng t trong mt h thng gip cho lp trnh vin C xc nh tp cc hm m s hot ng cng vi vic thc thi h thng. Cc lp trnh vin C++ tp trung vo vic to ra "cc kiu do ngi dng nh ngha" (user-defined types) gi l cc lp. Cc lp cng c tham chiu nh "cc kiu do lp trnh vin nh ngha" (programmer-defined types). Mi lp cha d liu cng nh tp cc hm m x l d liu. Cc thnh phn d liu ca mt lp c gi l "cc thnh vin d liu" (data members). Cc thnh phn hm ca mt lp c gi l "cc hm thnh vin" (member functions). Ging nh thc th ca kiu c sn nh int c gi l mt bin, mt thc th ca kiu do ngi dng nh ngha (ngha l mt lp) c gi l mt i tng. Cc danh t trong mt h thng gip cho lp trnh vin C++ xc nh tp cc lp. Cc lp ny c s dng to cc i tng m s s hot ng cng vi vic thc thi h thng. Cc lp trong C++ c tin ha t nhin ca khi nim struct trong C. Trc khi tin hnh vic trnh by cc lp trong C++, chng ta tm hiu v cu trc, v chng ta xy dng mt kiu do ngi dng nh ngha da trn mt cu trc.
II.
V d 3.1: Chng ta xy dng kiu cu trc Time vi ba thnh vin s nguyn: Hour, Minute v second. Chng trnh nh ngha mt cu trc Time gi l DinnerTime. Chng trnh in thi gian di dng gi qun i v dng chun. #include <iostream.h> struct Time { int Hour; // 0-23 int Minute; // 0-59 int Second; // 0-59 }; void PrintMilitary(const Time &); //prototype void PrintStandard(const Time &); //prototype int main() { Time DinnerTime;
Trang 40
Hnh 3.1: Kt qu ca v d 3.1 C mt vi hn ch khi to cc kiu d liu mi vi cc cu trc phn trn. Khi vic khi to khng c yu cu, c th c d liu cha khi to v cc vn ny sinh. Ngay c nu d liu c khi to, n c th khi to khng chnh xc. Cc gi tr khng hp l c th c gn cho cc thnh vin ca mt cu trc bi v chng trnh trc tip truy cp d liu. Chng hn v d 3.1 dng 23 n dng 25, chng trnh gn cc gi tr khng hp l cho i tng DinnerTime. Nu vic ci t ca struct thay i, tt c cc chng trnh s dng struct phi thay i. iu ny do lp trnh vin trc tip thao tc kiu d liu. Khng c "giao din" bo m lp trnh vin s dng d liu chnh xc v bo m d liu cn li trng thi thch hp. Mt khc, cu trc trong C khng th c in nh mt n v, chng c in khi cc thnh vin c in. Cc cu trc trong C khng th so snh vi nhau, chng phi c so snh thnh vin vi thnh vin. Phn sau ci t li cu trc Time v d 3.1 nh mt lp v chng minh mt s thun li vic to ra ci gi l cc kiu d liu tru tng (Abstract Data Types ADT) nh cc lp. Chng ta s thy rng cc lp v cc cu trc c th s dng gn nh ging nhau trong C++. S khc nhau gia chng l thuc tnh truy cp cc thnh vin.
Trang 41
Trang 42
Mt constructor l mt hm thnh vin c bit m khi ng cc thnh vin d liu ca mt i tng ca lp. Mt constructor ca lp c gi t ng khi i tng ca lp c to. Thng thng, cc thnh vin d liu c lit k trong phn private ca mt lp, cn cc hm thnh vin c lit k trong phn public. Nhng c th c cc hm thnh vin private v thnh vin d liu public. Khi lp c nh ngha, n c th s dng nh mt kiu trong phn khai bo nh sau: Time Sunset, // i tng ca lp Time ArrayTimes[5], // Mng cc i tng ca lp Time *PTime, // Con tr tr n mt i tng ca lp Time &DinnerTime = Sunset; // Tham chiu n mt i tng ca lp Time V d 3.2: Xy dng li lp Time v d 3.1 1: #include <iostream.h> 2: 3: class Time 4: { 5: public: 6: Time(); //Constructor 7: void SetTime(int, int, int); //Thit lp Hour, Minute va Second 8: void PrintMilitary(); //In thi gian di dng gi qun i 9: void PrintStandard(); //In thi gian di dng chun 10: private: 11: int Hour; // 0 - 23 12: int Minute; // 0 - 59 13: int Second; // 0 - 59 14: }; 15: 16: //Constructor khi to mi thnh vin DL vi gi tr zero 17: //Bo m tt c cc i tng bt u mt t.thi thch hp 18: Time::Time() 19: { 20: Hour = Minute = Second = 0; 21: } 22: 23: //Thit lp mt gi tr Time mi s dng gi quni 24: //Thc hin vic kim tra tnh hp l trn cc gi tr d liu 25: //Thit lp cc gi tr khng hp l thnh zero 26: void Time::SetTime(int H, int M, int S) 27: { 28: Hour = (H >= 0 && H < 24) ? H : 0; 29: Minute = (M >= 0 && M < 60) ? M : 0; 30: Second = (S >= 0 && S < 60) ? S : 0; 31: } 32: 33: //In thi gian di dng gi qun i 34: void Time::PrintMilitary() 35: { 36: cout << (Hour < 10 ? "0" : "") << Hour << ":" 37: << (Minute < 10 ? "0" : "") << Minute << ":" 38: << (Second < 10 ? "0" : "") << Second; 39: } 40: 41: //In thi gian di dng chun 42: void Time::PrintStandard()
Trang 43
int main() { Time T; //i tng T ca lp Time cout << "The initial military time is "; T.PrintMilitary(); cout << endl << "The initial standard time is "; T.PrintStandard(); T.SetTime(13, 27, 6); cout << endl << endl << "Military time after SetTime is "; T.PrintMilitary(); cout << endl << "Standard time after SetTime is "; T.PrintStandard(); T.SetTime(99, 99, 99); //Th thit lp gi tr khng hp l cout << endl << endl << "After attempting invalid settings:" << endl << "Military time: "; T.PrintMilitary(); cout << endl << "Standard time: "; T.PrintStandard(); cout << endl; return 0;
Hnh 3.2: Kt qu ca v d 3.2 Trong v d 3.2, chng trnh thuyt minh mt i tng ca lp Time gi l T (dng 52). Khi constructor ca lp Time t ng gi v r rng khi to mi thnh vin d liu private l zero. Sau thi gian c in di dng gi qun i v dng chun xc nhn cc thnh vin ny c khi to thch hp (dng 54 n 57). K ti thi gian c thit lp bng cch s dng hm thnh vin SetTime() (dng 59) v thi gian li c in hai dng (dng 60 n 63). Cui cng hm thnh vin SetTime() (dng 65) th thit lp cc thnh vin d liu vi cc gi tr khng hp l, v thi gian li c in hai dng (dng 66 n 70). Chng ta nhn thy rng, tt c cc thnh vin d liu ca mt lp khng th khi to ti ni m chng c khai bo trong thn lp. Cc thnh vin d liu ny phi c khi to bi constructor ca lp hay chng c th gn gi tr bi cc hm thit lp.
Trang 44
Khi mt lp c nh ngha v cc hm thnh vin ca n c khai bo, cc hm thnh vin ny phi c nh ngha. Mi hm thnh vin ca lp c th c nh ngha trc tip trong thn lp (hin nhin bao gm prototype hm ca lp), hoc hm thnh vin c th c nh ngha sau thn lp. Khi mt hm thnh vin c nh ngha sau nh ngha lp tng ng, tn hm c t trc bi tn lp v ton t nh phm vi (::). Chng hn nh v d 3.2 gm cc dng 18, 26, 34 v 42. Bi v cc lp khc nhau c th c cc tn thnh vin ging nhau, ton t nh phm vi "rng buc" tn thnh vin ti tn lp nhn dng cc hm thnh vin ca mt lp. Mc d mt hm thnh vin khai bo trong nh ngha mt lp c th nh ngha bn ngoi nh ngha lp ny, hm thnh vin vn cn bn trong phm vi ca lp, ngha l tn ca n ch c bit ti cc thnh vin khc ca lp ngoi tr tham chiu thng qua mt i tng ca lp, mt tham chiu ti mt i tng ca lp, hoc mt con tr tr ti mt i tng ca lp. Nu mt hm thnh vin c nh ngha trong nh ngha mt lp, hm thnh vin ny chnh l hm inline. Cc hm thnh vin nh ngha bn ngoi nh ngha mt lp c th l hm inline bng cch s dng t kha inline. Hm thnh vin cng tn vi tn lp nhng t trc l mt k t ng (~) c gi l destructor ca lp ny. Hm destructor lm "cng vic ni tr kt thc" trn mi i tng ca lp trc khi vng nh cho i tng c phc hi bi h thng. V d 3.3: Ly li v d 3.2 nhng hai hm PrintMilitary() v PrintStandard() l cc hm inline. 1: #include <iostream.h> 2: 3: class Time 4: { 5: public: 6: Time(); ; //Constructor 7: void SetTime(int, int, int); //Thit lp Hour, Minute va 8: void PrintMilitary() // In thi gian di dng gi quni 9: { 10: cout << (Hour < 10 ? "0" : "") << Hour << ":" 11: << (Minute < 10 ? "0" : "") << Minute << ":" 12: << (Second < 10 ? "0" : "") << Second; 13: } 14: void PrintStandard(); // In thi gian di dng chun 15: private: 16: int Hour; // 0 - 23 17: int Minute; // 0 - 59 18: int Second; // 0 - 59 19: }; 20: //Constructor khi to mi thnh vin d liu vi gi tr zero 21: //Bo m t.c cc i tng bt u mt trng thi thch hp 22: Time::Time() 23: { 24: Hour = Minute = Second = 0; 25: } 26: 27: #9; //Thit lp mt gi tr Time mi s dng gi qun i 28: #9; //T.hin vic k.tra tnh hp l trn cc gi tr DL 29: #9; //Thit lp cc gi tr khng hp l thnh zero 30: void Time::SetTime(int H, int M, int S) 31: { 32: Hour = (H >= 0 && H < 24) ? H : 0; 33: Minute = (M >= 0 && M < 60) ? M : 0; 34: Second = (S >= 0 && S < 60) ? S : 0;
Second
Trang 45
T.SetTime(13, 27, 6); cout << endl << endl << "Military time after SetTime is "; T.PrintMilitary(); cout << endl << "Standard time after SetTime is "; T.PrintStandard(); T.SetTime(99, 99, 99); //Th thit lp gi tr khng hp l cout << endl << endl << "After attempting invalid settings:" << endl << "Military time: "; T.PrintMilitary(); cout << endl << "Standard time: "; T.PrintStandard(); cout << endl; return 0; }
IV.
Cc thnh vin d liu ca mt lp (cc bin khai bo trong nh ngha lp) v cc hm thnh vin (cc hm khai bo trong nh ngha lp) thuc vo phm vi ca lp.
Trang 46
Trong mt phm vi lp, cc thnh vin ca lp c truy cp ngay lp tc bi tt c cc hm thnh vin ca lp v c th c tham chiu mt cch d dng bi tn. Bn ngoi mt phm vi lp, cc thnh vin ca lp c tham chiu thng qua hoc mt tn i tng, mt tham chiu n mt i tng, hoc mt con tr ti i tng. Cc hm thnh vin ca lp c th c a nng ha (overload), nhng ch bi cc hm thnh vin khc ca lp. a nng ha mt hm thnh vin, n gin cung cp trong nh ngha lp mt prototype cho mi phin bn ca hm a nng ha, v cung cp mt nh ngha hm ring bit cho mi phin bn ca hm. Cc hm thnh vin c phm vi hm trong mt lp cc bin nh ngha trong mt hm thnh vin ch c bit ti hm . Nu mt hm thnh vin nh ngha mt bin cng tn vi tn mt bin trong phm vi lp, bin phm vi lp c du bi bin phm vi hm bn trong phm vi hm. Nh th mt bin b du c th c truy cp thng qua ton t nh phm vi. Cc ton t c s dng truy cp cc thnh vin ca lp c ng nht vi cc ton t s dng truy cp cc thnh vin ca cu trc. Ton t la chn thnh vin du chm (.) c kt hp vi mt tn ca i tng hay vi mt tham chiu ti mt i tng truy cp cc thnh vin ca i tng. Ton t la chn thnh vin mi tn (->)c kt hp vi mt con tr tr ti mt truy cp truy cp cc thnh vin ca i tng. V d 3.4: Chng trnh sau minh ha vic truy cp cc thnh vin ca mt lp vi cc ton t la chn thnh vin. 1: #include <iostream.h> 2: 3: class Count 4: { 5: public: 6: int X; 7: void Print() 8: { 9: cout << X << endl; 10: } 11: }; 12: 13: int main() 14: { 15: Count Counter, //To i tng Counter 16: *CounterPtr = &Counter, //Con tr tr ti Counter 17: &CounterRef = Counter; //Tham chiu ti Counter 18: 19: cout << "Assign7 to X and Print using the object's name: "; 20: Counter.X = 7; //Gn 7 cho thnh vin d liu X 21: Counter.Print(); //Gi hm thnh vin Print 22: 23: cout << "Assign 8 to X and Print using a reference: "; 24: CounterRef.X = 8; //Gn 8 cho thnh vin d liu X 25: CounterRef.Print(); //Gi hm thnh vin Print 26: 27: cout << "Assign 10 to X and Print using a pointer: "; 28: CounterPtr->X = 10; // Gn 10 cho thnh vin d liu X 29: CounterPtr->Print(); //Gi hm thnh vin Print 30: return 0; 31: } Chng ta chy v d 3.4, kt qu hnh 3.4
Trang 47
V.
Cc thuc tnh truy cp public v private (v protected chng ta s xem xt sau) c s dng iu khin truy cp ti cc thnh vin d liu v cc hm thnh vin ca lp. Ch truy cp mc nh i vi lp l private v th tt c cc thnh vin sau phn header ca lp v trc nhn u tin l private. Sau mi nhn, ch m c ko theo bi nhn p dng cho n khi gp nhn k tip hoc cho n khi gp du mc phi (}) ca phn nh ngha lp. Cc nhn public, private v protected c th c lp li nhng cch dng nh vy th him c v c th gy kh hiu. Cc thnh vin private ch c th c truy cp bi cc hm thnh vin (v cc hm friend) ca lp . Cc thnh vin public ca lp c th c truy cp bi bt k hm no trong chng trnh. Mc ch chnh ca cc thnh vin public l biu th cho client ca lp mt ci nhn ca cc dch v (services) m lp cung cp. Tp hp ny ca cc dch v hnh thnh giao din public ca lp. Cc client ca lp khng cn quan tm lm th no lp hon thnh cc thao tc ca n. Cc thnh vin private ca lp cng nh cc nh ngha ca cc hm thnh vin public ca n th khng phi c th truy cp ti client ca mt lp. Cc thnh phn ny hnh thnh s thi hnh ca lp. V d 3.5: Chng trnh sau cho thy rng cc thnh vin private ch c th truy cp thng qua giao din public s dng cc hm thnh vin public. #include <iostream.h> class MyClass { private: int X,Y; public: void Print(); }; void MyClass::Print() { cout <<X<<Y<<endl; } int main() { MyClass M; M.X = 3; M.Y = 4; M.Print(); return 0; }
Khi chng ta bin dch chng trnh ny, compiler pht sinh ra hai li ti hai dng 20 v 21 nh sau:
Hnh 3.5: Thng bo li ca v d 3.5 Thuc tnh truy cp mc nh i vi cc thnh vin ca lp l private. Thuc tnh truy cp cc thnh vin ca mt lp c th c thit lp r rng l public, protected hoc private. Thuc tnh truy cp mc
Trang 48
nh i vi cc thnh vin ca struct l public. Thuc tnh truy cp cc thnh vin ca mt struct cng c th c thit lp r rng l public, protected hoc private. Truy cp n mt d liu private cn phi c iu khin cn thn bi vic s dng ca cc hm thnh vin, gi l cc hm truy cp (access functions).
VI.
CC HM TRUY CP V CC HM TIN CH
Khng phi tt c cc hm thnh vin u l public phc v nh b phn giao din ca mt lp. Mt vi hm cn li l private v phc v nh cc hm tin ch (utility functions) cho cc hm khc ca lp. Cc hm truy cp c th c hay hin th d liu. S dng cc hm truy cp kim tra tnh ng hoc sai ca cc iu kin cc hm nh th thng c gi l cc hm khng nh (predicate functions). Mt v d ca hm khng nh l mt hm IsEmpty() ca lp container - mt lp c kh nng gi nhiu i tng ging nh mt danh sch lin kt, mt stack hay mt hng i. Mt chng trnh s kim tra hm IsEmpty() trc khi th c mc khc t i tng container. Mt hm tin ch khng l mt phn ca mt giao din ca lp. Hn na n l mt hm thnh vin private m h tr cc thao tc ca cc hm thnh vin public. Cc hm tin ch khng d nh c s dng bi cc client ca lp. V d 3.6: Minh ha cho cc hm tin ch. 1: #include <iostream.h> 2: #include <iomanip.h> 3: 4: class SalesPerson 5: { 6: public: 7: SalesPerson(); //constructor 8: void SetSales(int, double);//Ng.dng cung cp cc hnh ca 9: #9; #9; //nhng hng bn ca mt thng 10: void PrintAnnualSales(); 11: 12: private: 13: double Sales[12]; //12 hnh ca nhng hng bn hng thng 14: double TotalAnnualSales(); //Hm tin ch 15: }; 16: 17: //Hm constructor khi to mng 18: SalesPerson::SalesPerson() 19: { 20: for (int I = 0; I < 12; I++) 21: Sales[I] = 0.0; 22: } 23: 24://Hm th.lp mt trong 12 hnh ca nhng hng bn hng thng 25: void SalesPerson::SetSales(int Month, double Amount) 26: { 27: if (Month >= 1 && Month <= 12 && Amount > 0) 28: Sales[Month - 1] = Amount; 29: else 30: cout << "Invalid month or sales figure" << endl; 31: } 32: 33: //Hm tin ch tnh tng hng bn hng nm 34: double SalesPerson::TotalAnnualSales() 35: { 36: double Total = 0.0; 37:
Trang 49
Trang 50
Constructor c th cha cc tham s mc nh. Bng cch cung cp cc tham s mc nh cho constructor, ngay c nu khng c cc gi tr no c cung cp trong mt constructor th i tng vn c bo m trong mt trng thi ph hp v cc tham s mc nh. Mt constructor ca lp trnh vin cung cp m hoc tt c cc tham s ca n c gi tr mc nh hoc khng c tham s no c gi l constructor mc nh (default constructor). Ch c th c mt constructor mc nh cho mi lp. V d 3.7: Constructor vi cc tham s mc nh
#include <iostream.H> class Time { public: Time(int = 0, int = 0, int = 0); //Constructor mac dinh void SetTime(int, int, int); void PrintMilitary(); void PrintStandard(); private: int Hour; int Minute; int Second; }; //Ham constructor de khoi dong du lieu private //Cac gia tri mac dinh la 0 Time::Time(int Hr, int Min, int Sec) { SetTime(Hr, Min, Sec); } //Thiet lap cac gia tri cua Hour, Minute va Second //Gia tri khong hop le duoc thiet lap la 0 void Time::SetTime(int H, int M, int S) { Hour = (H >= 0 && H < 24) ? H : 0; Minute = (M >= 0 && M < 60) ? M : 0; Second = (S >= 0 && S < 60) ? S : 0; } //Hien thi thoi gian theo dang gio quan doi: HH:MM:SS void Time::PrintMilitary() { cout << (Hour < 10 ? "0" : "") << Hour << ":" << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second; } //Hien thi thoi gian theo dang chuan: HH:MM:SS AM (hoac PM) void Time::PrintStandard() { cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12) << ":" << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second << (Hour < 12 ? " AM" : " PM"); } Bin son: L Th M Hnh
Trang 51
cout << "Constructed with:" << endl << "all arguments defaulted:" << endl << " "; T1.PrintMilitary(); cout << endl << " "; T1.PrintStandard(); cout << endl << "Hour specified; Minute and Second defaulted:" << endl << " "; T2.PrintMilitary(); cout << endl << " "; T2.PrintStandard(); cout << endl << "Hour and Minute specified; Second defaulted:" << endl << " "; T3.PrintMilitary(); cout << endl << " "; T3.PrintStandard(); cout << endl << "Hour, Minute, and Second specified:"<<endl<<" "; T4.PrintMilitary(); cout << endl << " "; T4.PrintStandard(); cout << endl << "all invalid values specified:" << endl << " "; T5.PrintMilitary(); cout << endl << " "; T5.PrintStandard(); cout << endl; return 0; }
Chng trnh v d 3.7 khi to nm i tng ca lp Time ( dng 52). i tng T1 vi ba tham s ly gi tr mc nh, i tng T2 vi mt tham s c m t, i tng T3 vi hai tham s c m t, i tng T4 vi ba tham s c m t v i tng T5 vi cc tham s c gi tr khng hp l. Chng ta chy v d 3.7, kt qu hnh 3.7
Hnh 3.7: Kt qu ca v d 3.7 Nu khng c constructor no c nh ngha trong mt lp th trnh bin dch to mt constructor mc nh. Constructor ny khng thc hin bt k s khi to no, v vy khi i tng c to, n khng bo m trong mt trng thi ph hp.
Trang 52
Destructor ca mt lp c gi khi i tng c hy b ngha l khi s thc hin chng trnh ri khi phm vi m trong i tng ca lp c khi to. Destructor khng thc s hy b i tng n thc hin "cng vic ni tr kt thc" trc khi h thng phc hi khng gian b nh ca i tng n c th c s dng gi cc i tng mi. Mt destructor khng nhn cc tham s v khng tr v gi tr. Mt lp ch c duy nht mt destructor a nng ha destructor l khng cho php. Nu trong mt lp khng c nh ngha mt destructor th trnh bin dch s to mt destructor mc nh khng lm g c. V d 3.8: Lp c hm destructor #include <iostream.h> class Simple {private: int *X; public: Simple(); //Constructor ~Simple(); //Destructor void SetValue(int V); int GetValue(); }; Simple::Simple() { X = new int; //Cp pht vng nh cho X } Simple::~Simple() { delete X; //Gii phng vng nh khi i tng b hy b. } void Simple::SetValue(int V) { *X = V; } int Simple::GetValue() { return *X; } int main() { Simple S; int X; cout<<"Enter a number:"; cin>>X; S.SetValue(X); cout<<"The value of this number:"<<S.GetValue(); return 0; } Chng ta chy v d 3.8, kt qu hnh 3.8
Trang 53
IX.
Cc constructor v destructor c gi mt cch t ng. Th t cc hm ny c gi ph thuc vo th t trong s thc hin vo v ri khi phm vi m cc i tng c khi to. Mt cch tng qut, cc destructor c gi theo th t ngc vi th t ca cc constructor c gi. Cc constructor c gi ca cc i tng khai bo trong phm vi ton cc trc bt k hm no (bao gm hm main()) trong file m bt u thc hin. Cc destructor tng ng c gi khi hm main() kt thc hoc hm exit() c gi. Cc constructor ca cc i tng cc b t ng c gi khi s thc hin n im m cc i tng c khai bo. Cc destructor tng ng c gi khi cc i tng ri khi phm vi (ngha l khi m trong chng c khai bo). Cc constructor v destructor i vi cc i tng cc b t ng c gi mi khi cc i tng vo v ri khi phm vi. Cc constructor c gi ca cc i tng cc b tnh (static) khi s thc hin n im m cc i tng c khai bo ln u tin. Cc destructor tng ng c gi khi hm main() kt thc hoc hm exit() c gi. V d 3.9: Chng trnh sau minh ha th t cc constructor v destructor c gi. #include <iostream.h> class CreateAndDestroy { public: CreateAndDestroy(int); //Constructor ~CreateAndDestroy(); //Destructor private: int Data; }; CreateAndDestroy::CreateAndDestroy(int Value) { Data = Value; cout << "Object " << Data << " constructor"; } CreateAndDestroy::~CreateAndDestroy() { cout << "Object " << Data << " destructor " << endl; } void Create(void); //Prototype CreateAndDestroy First(1); //Doi tuong toan cuc int main() { cout << " (global created before main)" << endl; CreateAndDestroy Second(2); //Doi tuong cuc bo cout << " (local automatic in main)" << endl; static CreateAndDestroy Third(3); //Doi tuong cuc bo cout << " (local static in main)" << endl; Create(); //Goi ham de tao cac doi tuong CreateAndDestroy Fourth(4); //Doi tuong cuc bo cout << " (local automatic in main)" << endl; return 0; } //Ham tao cac doi tuong void Create(void) { CreateAndDestroy Fifth(5); cout << " (local automatic in create)" << endl; static CreateAndDestroy Sixth(6); cout << " (local static in create)" << endl;
Trang 54
Chng trnh khai bo First phm vi ton cc. Constructor ca n c gi khi chng trnh bt u thc hin v destructor ca n c gi lc chng trnh kt thc sau tt c cc i tng khc c hy b. Hm main() khai bo ba i tng. Cc i tng Second v Fourth l cc i tng cc b t ng v i tng Third l mt i tng cc b tnh. Cc constructor ca cc i tng ny c gi khi chng trnh thc hin n im m mi i tng c khai bo. Cc destructor ca cc i tng Fourth v Second c gi theo th t ny khi kt thc ca main() t n. V i tng Third l tnh, n tn ti cho n khi chng trnh kt thc. Destructor ca i tng Third c gi trc destructor ca First nhng sau tt c cc i tng khc c hy b. Hm Create() khai bo ba i tng Fifth v Seventh l cc i tng cc b t ng v Sixth l mt i tng cc b tnh. Cc destructor ca cc i tng Seventh v Fifth c gi theo th t ny khi kt thc ca create() t n. V i tng Sixth l tnh, n tn ti cho n khi chng trnh kt thc. Destructor ca i tng Sixth c gi trc cc destructor ca Third v First nhng sau tt c cc i tng khc c hy b. Chng ta chy v d 3.9, kt qu hnh 3.9
X.
Cc thnh vin d liu private ch c th c x l bi cc hm thnh vin (hay hm friend) ca lp. Cc lp thng cung cp cc hm thnh vin public cho php cc client ca lp thit lp (set) (ngha l "ghi") hoc ly (get) (ngha l "c") cc gi tr ca cc thnh vin d liu private. Cc hm ny thng khng cn phi c gi "set" hay "get", nhng chng thng t tn nh vy. Chng hn, mt lp c thnh vin d liu private c tn InterestRate, hm thnh vin thit lp gi tr c tn l SetInterestRate() v hm thnh vin ly gi tr c tn l GetInterestRate(). Cc hm "Get" cng thng c gi l cc hm cht vn (query functions). Nu mt thnh vin d liu l public th thnh vin d liu c th c c hoc ghi ti bt k hm no trong chng trnh. Nu mt thnh vin d liu l private, mt hm "get" public nht nh cho php cc hm khc c d liu nhng hm get c th iu khin s nh dng v hin th ca d liu. Mt hm "set" public c th s xem xt cn thn bt k c gng no thay i gi tr ca thnh vin d liu. iu ny s bo m rng gi tr mi th tng thch i vi mc d liu. Chng hn, mt s c gng thit lp ngy ca thng l 37 s b loi tr.
Trang 55
Cc li ch ca s ton vn d liu th khng t ng n gin bi v cc thnh vin d liu c to l private lp trnh vin phi cung cp s kim tra hp l. Tuy nhin C++ cung cp mt khung lm vic trong cc lp trnh vin c th thit k cc chng trnh tt hn. Client ca lp phi c thng bo khi mt s c gng c to ra gn mt gi tr khng hp l cho mt thnh vin d liu. Chnh v l do ny, cc hm "set" ca lp thng c vit tr v cc gi tr cho bit rng mt s c gng to ra gn mt d liu khng hp l cho mt i tng ca lp. iu ny cho php cc client ca lp kim tra cc gi tr tr v xc nh nu i tng m chng thao tc l mt i tng hp l v bt gi hot ng thch hp nu i tng m chng thao tc th khng phi hp l. V d 3.10: Chng trnh m rng lp Time v d 3.2 bao gm hm get v set i vi cc thnh vin d liu private l hour, minute v second. 1: #include <iostream.h> 2: 3: class Time 4: { 5: public: 6: Time(int = 0, int = 0, int = 0); //Constructor 7: //Cc hm set 8: void SetTime(int, int, int); //Thit lp Hour, Minute, Second 9: void SetHour(int); //Thit lp Hour 10: void SetMinute(int); //Thit lp Minute 11: void SetSecond(int); //Thit lp Second 12: //Cc hm get 13: int GetHour(); //Tr v Hour 14: int GetMinute(); //Tr v Minute 15: int GetSecond(); //Tr v Second 16: 17: void PrintMilitary(); //Xut thi gian theo dng gi quni 18: void PrintStandard(); //Xut thi gian theo dng chun 19: 20: private: 21: int Hour; //0 - 23 22: int Minute; //0 - 59 23: int Second; //0 59 24: }; 25: 26: //Constructor khing d liu private 27: //Gi hm thnh vin SetTime() thit lp cc bin 24: //Cc gi tr mc nh l 0 25: Time::Time(int Hr, int Min, int Sec) 26: { 27: SetTime(Hr, Min, Sec); 28: } 29: 30: //Thit lp cc gi tr ca Hour, Minute, v Second 31: void Time::SetTime(int H, int M, int S) 32: { 33: Hour = (H >= 0 && H < 24) ? H : 0; 34: Minute = (M >= 0 && M < 60) ? M : 0; 35: Second = (S >= 0 && S < 60) ? S : 0; 36: } 37: 38: //Thit lp gi tr ca Hour 39: void Time::SetHour(int H) 40: { 41: Hour = (H >= 0 && H < 24) ? H : 0; 42: }
Trang 56
43: 44: //Thit lp gi tr ca Minute 45: void Time::SetMinute(int M) 46: { 47: Minute = (M >= 0 && M < 60) ? M : 0; 48: } 49: 50: //Thit lp gi tr ca Second 51: void Time::SetSecond(int S) 52: { 53: Second = (S >= 0 && S < 60) ? S : 0; 54: } 55: 56: //Ly gi tr ca Hour 57: int Time::GetHour() 58: { 59: return Hour; 60: } 61: 62: //Ly gi tr ca Minute 63: int Time::GetMinute() 64: { 65: return Minute; 66: } 67: 68: //Ly gi tr ca Second 69: int Time::GetSecond() 70: { 71: return Second; 72: } 73: 74: //Hin th thi gian dng gi quni: HH:MM:SS 75: void Time::PrintMilitary() 76: { 77: cout << (Hour < 10 ? "0" : "") << Hour << ":" 78: << (Minute < 10 ? "0" : "") << Minute << ":" 79: << (Second < 10 ? "0" : "") << Second; 80: } 81: 83: //Hin th thi gian dng chun: HH:MM:SS AM (hay PM) 84: void Time::PrintStandard() 85: { 86: cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12) << ":" 87: << (Minute < 10 ? "0" : "") << Minute << ":" 88: << (Second < 10 ? "0" : "") << Second 89: << (Hour < 12 ? " AM" : " PM"); 90: } 91: 92: void IncrementMinutes(Time &, const int); //prototype 93: 94: int main() 95: { 96: Time T; 97: 99: T.SetHour(17); 100: T.SetMinute(34); 101: T.SetSecond(25); 102 cout << "Result of setting all valid values:" << endl
Trang 57
<< " Hour: " << T.GetHour() << " Minute: " << T.GetMinute() << " Second: " << T.GetSecond() << endl << endl; T.SetHour(234); //Hour khng hp lc thit lp bng 0 T.SetMinute(43); T.SetSecond(6373); //Second khng hp lc thit lp bng 0 cout << "Result of attempting to set invalid Hour and" << " Second:" << endl << " Hour: " << T.GetHour() << " Minute: " << T.GetMinute() << " Second: " << T.GetSecond() << endl << endl; T.SetTime(11, 58, 0); IncrementMinutes(T, 3); return 0; } void IncrementMinutes(Time &TT, const int Count) { cout << "Incrementing Minute " << Count << " times:" << endl << "Start time: "; TT.PrintStandard(); for (int I = 1; I <= Count; I++) { TT.SetMinute((TT.GetMinute() + 1) % 60); if (TT.GetMinute() == 0) TT.SetHour((TT.GetHour() + 1) % 24); cout << endl << "Minute + 1: "; TT.PrintStandard(); } cout << endl; }
Trong v d trn chng ta c hm IncrementMinutes() l hm dng tng Minite. y l hm khng thnh vin m s dng cc hm thnh vin get v set tng thnh vin Minite. Chng ta chy v d .10, kt qu hnh 3.10
XI.
Mt tham chiu ti mt i tng l mt b danh ca chnh i tng v do c th c s dng v tri ca php gn. Trong khung cnh , tham chiu to mt lvalue c chp nhn hon ton m c th nhn mt gi tr. Mt cch s dng kh nng ny (tht khng may!) l c mt hm thnh vin public ca lp tr v mt tham chiu khng const ti mt thnh vin d liu private ca lp .
Trang 58
V d 3.11: Chng trnh sau s dng mt phin bn n gin ca lp Time minh ha tr v mt tham chiu ti mt d liu private. 1: #include <iostream.h> 2: 3: class Time 4: { 5: public: 6: Time(int = 0, int = 0, int = 0); 7: void SetTime(int, int, int); 8: int GetHour(); 9: int &BadSetHour(int); //Nguy him tr v tham chiu !!! 10: private: 11: int Hour; 12: int Minute; 13: int Second; 14: }; 15: 16: //Constructor khing d liu private 17: //Gi hm thnh vin SetTime() thit lp cc bin 18: //Cc gi tr mcnh l 0 19: Time::Time(int Hr, int Min, int Sec) 20: { 21: SetTime(Hr, Min, Sec); 22: } 23: //Thit lp cc gi tr ca Hour, Minute, v Second 24: void Time::SetTime(int H, int M, int S) 25: { 26: Hour = (H >= 0 && H < 24) ? H : 0; 27: Minute = (M >= 0 && M < 60) ? M : 0; 28: Second = (S >= 0 && S < 60) ? S : 0; 29: } 30: 31: //Ly gi tr ca Hour 32: int Time::GetHour() 33: { 34: return Hour; 35: } 36: 37: //KHNG NN LP TRNH THEO KIU NY !!! 38: //Tr v mt tham chiu ti mt thnh vin d liu private 39: int &Time::BadSetHour(int HH) 40: { 41: Hour = (HH >= 0 && HH < 24) ? HH : 0; 42: return Hour; //Nguy him tr v tham chiu !!! 43: } 44: 45: int main() 46: { 47: Time T; 48: int &HourRef = T.BadSetHour(20); 49: 50: cout << "Hour before modification: " << HourRef << endl; 51: HourRef = 30; //Thayi vi gi tr khng hp l 52: cout << "Hour after modification: " << T.GetHour() << endl; 53: // Nguy him: Hm tr v mt tham chiu 54: //c thc s dng nh mt lvalue 55: T.BadSetHour(12) = 74; 56: cout << endl << "*********************************" << endl
Trang 59
57: << "BAD PROGRAMMING PRACTICE!!!!!!!!!" << endl 58: << "BadSetHour as an lvalue, Hour: " 59: << T.GetHour() 60: << endl << "*********************************" << endl; 61: return 0; 62: } Trong chng trnh hm BadSetHour() tr v mt tham chiu ti thnh vin d liu Hour. Chng ta chy v d 3.11, kt qu hnh 3.11
Trang 60
int main() { Date Date1(7, 4, 1993), Date2; //Date2 mc nh l 1/1/90 cout << "Date1 = "; Date1.Print(); cout << endl << "Date2 = "; Date2.Print(); Date2 = Date1; //Gn bi ton t sao chp thnh vin mc nh cout << endl << endl << "After default memberwise copy, Date2 = "; Date2.Print(); cout << endl; return 0; }
Trang 61
V d 3.13: Chng trnh sau s dng mt lp Time vi cc i tng const v cc hm thnh vin const. 2: #include <iostream.h> 3: class Time 4: { 5: public: 6: Time(int = 0, int = 0, int = 0); //Constructor mc nh 7: //Cc hm set 8: void SetTime(int, int, int); //Thit lp thi gian 9: void SetHour(int); //Thit lp Hour 10: void SetMinute(int); //Thit lp Minute 11: void SetSecond(int); //Thit lp Second 12: //Cc hm get 13: int GetHour() const; //Tr v Hour 14: int GetMinute() const; //Tr v Minute 15: int GetSecond() const; //Tr v Second 16: //Cc hm in 17: void PrintMilitary() const; //In t.gian theo dng gi qun i 18: void PrintStandard() const; //In thi gian theo dng gi chun 19: private: 20: int Hour; //0 - 23 21: int Minute; //0 - 59 22: int Second; //0 59 23: }; 24: 25: //Constructor khi ng d liu private 26: //Cc gi tr mc nh l 0 27: Time::Time(int hr, int min, int sec) 28: { 29: SetTime(hr, min, sec); 30: } 31: 32: //Thit lp cc gi tr ca Hour, Minute, v Second 33: void Time::SetTime(int h, int m, int s) 34: { 35: Hour = (h >= 0 && h < 24) ? h : 0; 36: Minute = (m >= 0 && m < 60) ? m : 0; 37: Second = (s >= 0 && s < 60) ? s : 0; 38: } 39: 40: //Thit lp gi tr ca Hour 41: void Time::SetHour(int h) 42: { 43: Hour = (h >= 0 && h < 24) ? h : 0; 44: } 45: 46: //Thit lp gi tr ca Minute 47: void Time::SetMinute(int m) 48: { 49: Minute = (m >= 0 && m < 60) ? m : 0; 50: } 51: 52: //Thit lp gi tr ca Second 53: void Time::SetSecond(int s) 54: { 55: Second = (s >= 0 && s < 60) ? s : 0; 56: } 57:
Trang 62
Chng trnh ny khai bo mt i tng hng ca lp Time v c gng sa i i tng vi cc hm thnh vin khng hng SetHour(), SetMinute() v SetSecond(). Cc li cnh bo c pht sinh bi trnh bin dch (Borland C++) nh hnh 3.13.
Trang 63
Lu : Hm thnh vin const c th c a nng ha vi mt phin bn non-const. Vic la chn hm thnh vin a nng ha no s dng c to mt cch t ng bi trnh bin dch da vo ni m i tng c khai bo const hay khng. Mt i tng const khng th c thay i bi php gn v th n phi c khi ng. Khi mt thnh vin d liu ca mt lp c khai bo const, mt b khi to thnh vin (member initializer) phi c s dng cung cp cho constructor vi gi tr ban u ca thnh vin d liu i vi mt i tng ca lp. V d 3.14: C.trnh sau s dng mt b khi to thnh vin khi to mt hng ca kiu d liu c sn. 2: #include <iostream.h> 3: class IncrementClass 4: { 5: public: 6: IncrementClass (int C = 0, int I = 1); 7: void AddIncrement() 8: { 9: Count += Increment; 10: } 11: void Print() const; 12: private: 13: int Count; 14: const int Increment; //Thnh vin d liu const 15: }; 16: 17: //Constructor ca lp IncrementClass 18: //B khi to vi thnh vin const 19: IncrementClass::IncrementClass (int C, int I) : Increment(I) 20: { 21: Count = C; 22: } 23: 24: //In d liu 25: void IncrementClass::Print() const 26: { 27: cout << "Count = " << Count 28: # # << ", Increment = " << Increment << endl; 30: } 31: 32: int main() 33: { 34: IncrementClass Value(10, 5); 35: 36: cout << "Before incrementing: "; 37: Value.Print(); 38: for (int J = 1; J <= 3; J++) 40: { 41: Value.AddIncrement(); 42: cout << "After increment " << J << ": "; 43: Value.Print(); 44: } 45: return 0; 46: } Chng trnh ny s dng c php b khi to thnh vin khi to thnh vin d liu const Increment ca lp IncrementClass dng 19. Chng ta chy v d 3.14, kt qu hnh 3.14
Trang 64
Hnh 3.14: Kt qu ca v d 3.14 K hiu : Increment(I) ( dng 19 ca v d 3.14) sinh ra Increment c khi ng vi gi tr l I. Nu nhiu b khi to thnh vin c cn, n gin bao gm chng trong danh sch phn cch du phy sau du hai chm. Tt c cc thnh vin d liu c th c khi to s dng c php b khi to thnh vin. Nu trong v d 3.14 chng ta c gng khi to Increment vi mt lnh gn hn l vi mt b khi to thnh vin nh sau: IncrementClass::IncrementClass (int C, int I) { Count = C; Increment = I; } Khi trnh bin dch (Borland C++) s c thng bo li nh sau:
Hnh 3.15: Thng bo li khi c gng khi to mt thnh vin d liu const bng php gn
Trang 65
19: public: 20: Employee(char *, char *, int, int, int, int, int, int); 21: void Print() const; 22: private: 23: char LastName[25]; 24: char FirstName[25]; 25: Date BirthDate; 26: Date HireDate; 27: }; 28: 29: //Constructor: xc nhn gi tr tng thch ca Month 30: //Gi hm CheckDay() xc nhn gi tr tng thch ca Day 31: Date::Date(int Mn, int Dy, int Yr) 32: { 33: if (Mn > 0 && Mn <= 12) 34: Month = Mn; 35: else 36: { 37: Month = 1; 38: cout << "Month " << Mn << " invalid. Set to Month 1." 39: << endl; 40: } 41: Year = Yr; 42: Day = CheckDay(Dy); 43: cout << "Date object constructor for date "; 44: Print(); 45: cout << endl; 46: } 47: 48: //Hm xc nhn gi tr Day tng thch a vo Month v Year 49: int Date::CheckDay(int TestDay) 50: { 51: static int DaysPerMonth[13] = {0, 31, 28, 31, 30, 31, 52: 9; 9; 9; 9; 9; 9; # # # # 30, 31, 31, 30,31, 30, 31}; 53: 54: if (TestDay > 0 && TestDay <= DaysPerMonth[Month]) 55: return TestDay; 56: if (Month == 2 && TestDay == 29 && 57: ; ; (Year % 400 == 0 || (Year % 4 == 0 && Year % 100 != 0))) 58: return TestDay; 59: cout << "Day " << TestDay << "invalid. Set to Day 1." << endl; 60: return 1; 61: } 62: 63: //In i tng Date dng Month/Day/Year 64: void Date::Print() const 65: { 66: cout << Month << '/' << Day << '/' << Year; 67: } 68: 69: Employee::Employee(char *FName, char *LName, 70: int BMonth, int BDay, int BYear, 71: int HMonth, int HDay, int HYear) 72: :BirthDate(BMonth, BDay, BYear), HireDate(HMonth, HDay, HYear) 73: { 74://Sao chp FName vo FirstName v phi chc chn rng n ph hp 75: int Length = strlen(FName); 76:
Trang 66
77: Length = Length < 25 ? Length : 24; 78: strncpy(FirstName, FName, Length); 79: FirstName[Length] = '\0'; 80: //Sao chp LName vo LastName v phi chc chn rng n ph hp 81: Length = strlen(LName); 82: Length = Length < 25 ? Length : 24; 83: strncpy(LastName, LName, 24); 84: LastName[Length] = '\0'; 85: cout << "Employee object constructor: " 86: << FirstName << ' ' << LastName << endl; 87: } 88: 89: void Employee::Print() const 90: { 91: cout << LastName << ", " << FirstName << endl << "Hired: "; 92: HireDate.Print(); 93: cout << " Birthday: "; 94: BirthDate.Print(); 95: cout << endl; 96: } 97: 98: int main() 99: { 100: Employee E("Bob", "Jones", 7, 24, 49, 3, 12, 88); 101: 102 cout << endl; 103: E.Print(); 104: cout << endl << "Test Date constructor with invalid values:" 105: << endl; 106: Date D(14, 35, 94); //Cc gi tr Date khng hp l 107: return 0; 108: } Chng trnh gm lp Employee cha cc thnh vin d liu private LastName, FirstName, BirthDate v HireDate. Cc thnh vin BirthDate v HireDate l cc i tng ca lp Date m cha cc thnh vin d liu private Month, Day v Year. Chng trnh khi to mt i tng Employee, v cc khi to v cc hin th cc thnh vin d liu ca n. Ch v c php ca phn u trong nh ngha constructor ca lp Employee: Employee::Employee(char *FName, char *LName, int BMonth, int BDay, int BYear, int HMonth, int HDay, int HYear) :BirthDate(BMonth, BDay, BYear), HireDate(HMonth, HDay, HYear) Constructor ly tm tham s (FName, LName, BMonth, BDay, BYear, HMonth, HDay, v HYear). Du hai chm trong phn u phn tch cc b khi to t danh sch cc tham s. Cc b khi to nh r cc tham s truyn chon constructor ca cc i tng thnh vin. V th BMonth, BDay v BYear c truyn cho constructor ca i tng BirthDate, v HMonth, HDay, v HYear c truyn cho constructor ca i tng HireDate. Nhiu b khi to c phn tch bi du phy. Chng ta chy v d 3.15, kt qu hnh 3.16
Trang 67
Hnh 3.16: Kt qu ca v d 3.15 Mt i tng thnh vin khng cn c khi to thng qua mt b khi to thnh vin. Nu mt b khi to thnh vin khng c cung cp, constructor mc nh ca i tng thnh vin s c gi mt cch t ng. Cc gi tr nu c thit lp bi constructor mc nh th c th c ghi bi cc hm set.
XV. CC HM V CC LP friend
Mt hm friend ca mt lp c nh ngha bn ngoi phm vi ca lp , lc ny c quyn truy cp n cc thnh vin private hoc protected ca mt lp. Mt hm hay ton b lp c th c khai bo l mt friend ca lp khc. khai bo mt hm l mt friend ca mt lp, ng trc prototype ca hm trong nh ngha lp vi t kha friend. nh sau: friend <function-declarator>; khai bo mt lp l friend ca lp khc nh sau: friend <class-name>; V d 3.16: Chng trnh sau minh ha khai bo v s dng hm friend. 1: #include <iostream.h> 2: 3: class Count 4: { 5: friend void SetX(Count &, int); //Khai bo friend 6: public: 7: Count()//Constructor 8: { 9: X = 0; 10: } 11: void Print() const //Xut 12: { 13: cout << X << endl; 14: } 15: private: 16: int X; 17: }; 18: 19: //C th thay i d liu private ca lp Count v 20: //SetX() khai bo l mt hm friend ca lp Count 21: void SetX(Count &C, int Val) 22: { 23: C.X = Val; //Hp l: SetX() l mt hm friend ca lp Count 24: }
Trang 68
cout << "Object.X after instantiation: "; Object.Print(); cout << "Object.X after call to SetX friend function: "; SetX(Object, 8); //Thit lp X vi mt friend Object.Print(); return 0; }
Hnh 3.17: Kt qu ca v d 3.16 C th ch nh cc hm c a nng ha l cc friend ca lp. Mi hm c a nng ha phi c khai bo tng minh trong nh ngha lp nh l mt friend ca lp.
Trang 69
Hnh 3.18: Kt qu ca v d 3.17 Mt cch khc s dng con tr this l cho php mc vo nhau cc li gi hm thnh vin. V d 3.18: Chng trnh sau minh ha tr v mt tham chiu ti mt i tng Time cho php cc li gi hm thnh vin ca lp Time c mc ni vo nhau. 1: #include <iostream.h> 2: 3: class Time 4: { 5: public: 6: Time(int = 0, int = 0, int = 0); // Constructor mc nh 7: // Cc hm set 8: Time &SetTime(int, int, int); // Thit lp Hour, Minute va Second 9: Time &SetHour(int); // Thit lp Hour 10: Time &SetMinute(int); // Thit lp Minute 11: Time &SetSecond(int); // Thit lp Second 12: // Cc hm get 13: int GetHour() const; // Tr v Hour 14: int GetMinute() const; // Tr v Minute 15: int GetSecond() const; // Tr v Second 16: // Cc hm in 17: void PrintMilitary() const; // In t.gian theo dng gi qun i 18: void PrintStandard() const; // In thi gian theo dng gi chun 19: private: 20: int Hour; // 0 - 23 21: int Minute; // 0 - 59 22: int Second; // 0 - 59 23: }; 24: 25: // Constructor khi ng d liu private 26: // Gi hm thnh vin SetTime() thit lp cc bin 27: // Cc gi tr mc nh l 0 28: Time::Time(int Hr, int Min, int Sec) 29: { 30: SetTime(Hr, Min, Sec);
Trang 70
Trang 71
89: // Hin th thi gian dng chun: HH:MM:SS AM (hay PM) 90: void Time::PrintStandard() const 91: { 92: cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12) << ":" 93: << (Minute < 10 ? "0" : "") << Minute << ":" 94: << (Second < 10 ? "0" : "") << Second 95: << (Hour < 12 ? " AM" : " PM"); 96: } 97: 100: int main() 101: { 102: Time T; 103: 104: // Cc li gi mc ni vo nhau 105: T.SetHour(18).SetMinute(30).SetSecond(22); 106: cout << "Military time: "; 107: T.PrintMilitary(); 108: cout << endl << "Standard time: "; 109: T.PrintStandard(); 110: cout << endl << endl << "New standard time: "; 111: // Cc li gi mc ni vo nhau 112: T.SetTime(20, 20, 20).PrintStandard(); 113: cout << endl; 114: return 0; 115: } Cc hm thnh vin SetTime(), SetHour(), SetMinute() v SetSecond() mi hm u tr v *this vi kiu tr v l Time &. Ton t chm lin kt t tri sang phi, v vy biu thc: T.SetHour(18).SetMinute(30).SetSecond(22); u tin gi T.SetHour(18) th tr v mt tham chiu ti i tng T l gi tr ca li gi hm ny. Phn cn li ca biu thc c hiu nh sau: T.SetMinute(30).SetSecond(22); T.SetMinute(30) gi thc hin v tr v tng ng ca T. Phn cn ca biu thc l: T.SetSecond(22); Chng ta chy v d 3.18, kt qu hnh 3.19
Trang 72
XVIII.
Bnh thng, mi i tng ca mt lp c bn sao chp ca chnh n ca tt c cc thnh vin d liu ca lp. Trong cc trng hp nht nh ch c duy nht mt bn chp thnh vin d liu c bit cn phi dng chung bi tt c cc i tng ca mt lp. Mt thnh vin d liu tnh c s dng cho nhng iu v cc l do khc. Mt thnh vin d liu tnh biu din thng tin ton lp (class-wide). Khai bo mt thnh vin tnh bt u vi t kha static. Mc d cc thnh vin d liu tnh c th ging nh cc bin ton cc, cc thnh vin d liu tnh c phm vi lp. Cc thnh vin tnh c th l public, private hoc protected. Cc thnh vin d liu tnh phi c khi to mt ln (v ch mt ln) ti phm vi file. Cc thnh vin lp tnh public c th c truy cp thng qua bt k i tng no ca lp , hoc chng c th c truy cp thng qua tn lp s dng ton t nh phm vi. Cc thnh vin lp tnh private v protected phi c truy cp thng qua cc hm thnh vin public ca lp hoc thng qua cc friend ca lp. Cc thnh vin lp tnh tn ti ngay c khi i tng ca lp khng tn ti. truy cp mt thnh vin lp tnh public khi cc i tng ca lp khng tn ti, n gin thm vo u tn lp v ton t nh phm vi cho thnh vin d liu. truy cp mt thnh vin lp tnh private hoc protected khi cc i tng ca lp khng tn ti, mt hm thnh vin public phi c cung cp v hm phi c gi bi thm vo u tn ca n vi tn lp v ton t nh phm vi. V d 3.19: Chng trnh sau minh ha vic s dng thnh vin d liu tnh private v mt hm thnh vin tnh public. 1: #include <iostream.h> 2: #include <string.h> 3: #include <assert.h> 4: 5: class Employee 6: { 7: public: 8: Employee(const char*, const char*); // Constructor 9: ~Employee(); // Destructor 10: char *GetFirstName() const; // Tr v first name 11: char *GetLastName() const; // Tr v last name 12: // Hm thnh vin tnh 13: static int GetCount(); // Tr v s i tng khi to 14: private: 15: char *FirstName; 16: char *LastName; 17: // static data member 18: static int Count; // S i tng khi to 19: }; 20: 21: // Khi to thnh vin d liu tnh 22: int Employee::Count = 0; 23: 24://nh ngha hm thnh vin tnh m tr v s i tng khi to 25: int Employee::GetCount() 26: { 27: return Count; 28: } 29: 30: // Constructor cp pht ng cho first name v last name 31: Employee::Employee(const char *First, const char *Last) 32: { 33: FirstName = new char[ strlen(First) + 1 ]; 34: assert(FirstName != 0); // Bo m vng nh c cp pht 35: strcpy(FirstName, First); 36: LastName = new char[ strlen(Last) + 1 ];
Trang 73
assert(LastName != 0); // Bo m vng nh c cp pht strcpy(LastName, Last); ++Count; // Tng s i tng ln 1 cout << "Employee constructor for " << FirstName << ' ' << LastName << " called." << endl; }
// Destructor gii phng vng nh cp pht Employee::~Employee() { cout << "~Employee() called for " << FirstName << ' ' << LastName << endl; delete FirstName; delete LastName; --Count; // Gim s i tng xung 1 } // Tr v first name char *Employee::GetFirstName() const { char *TempPtr = new char[strlen(FirstName) + 1]; assert(TempPtr != 0); // Bo m vng nh c cp pht strcpy(TempPtr, FirstName); return TempPtr; } // Tr v last name char *Employee::GetLastName() const { char *TempPtr = new char[strlen(LastName) + 1]; assert(TempPtr != 0); // Bo m vng nh c cp pht strcpy(TempPtr, LastName); return TempPtr; }
int main() { cout << "Number of employees before instantiation is " << Employee::GetCount() << endl; // S dng tn lp Employee *E1Ptr = new Employee("Susan", "Baker"); Employee *E2Ptr = new Employee("Robert", "Jones"); cout << "Number of employees after instantiation is " << E1Ptr->GetCount() << endl; cout << endl << "Employee 1: " << E1Ptr->GetFirstName() << " " << E1Ptr->GetLastName() << endl << "Employee 2: " << E2Ptr->GetFirstName() << " " << E2Ptr->GetLastName() << endl << endl; delete E1Ptr; delete E2Ptr; cout << "Number of employees after deletion is " << Employee::GetCount() << endl; return 0; } int Employee::Count = 0;
Trang 74
Thnh vin d liu Count duy tr s cc i tng ca lp Employee c khi to. Khi i tng ca lp Employee tn ti, thnh vin Count c th c tham chiu thng qua bt k hm thnh vin no ca mt i tng Employee trong v d ny, Count c tham chiu bi c constructor ln destructor. Khi cc i tng ca lp Employee khng tn ti, thnh vin Count c th vn c tham chiu nhng ch thng qua mt li gi hm thnh vin tnh public GetCount() nh sau: Employee::GetCount() Hm GetCount() c s dng xc nh s cc i tng ca Employee khi to hin hnh. Ch rng khi khng c cc i tng trong chng trnh, li gi hm Employee::GetCount() c a ra. Tuy nhin khi c cc i tng khi ng hm GetCount() c th c gi thng qua mt trong cc i tng nh sau: E1Ptr->GetCount() Trong chng trnh cc dng 34, 37, 58 v 67 s dng hm assert() (nh ngha trong assert.h). Hm ny kim tra gi tr ca biu thc. Nu gi tr ca biu thc l 0 (false), hm assert() in mt thng bo li v gi hm abort() (nh ngha trong stdlib.h) kt thc chng trnh thc thi. Nu biu thc c gi tr khc 0 (true) th chng trnh tip tc. iu ny rt c ch cho cng c debug i vi vic kim tra nu mt bin c gi tr ng. Chng hn hm dng 34 hm assert() kim tra con tr FirstName xc nh nu n khng bng 0 (null). Nu iu kin trong khng nh (assertion) cho trc l ng, chng trnh tip tc m khng ngt. Nu iu kin trong khng nh cho trc l sai, mt thng bo li cha s dng, iu kin c kim tra, v tn file trong s khng nh xut hin c in, v chng trnh kt thc. Khi lp trnh vin c th tp trung vo vng ny ca on m tm li. Cc khng nh khng phi xa t chng trnh khi debug xong. Khi cc khng nh khng cn cn thit cho mc ch debug trong mt chng trnh, dng sau: #define NDEBUG c thm vo u file chng trnh. iu ny pht sinh tin x l b qua tt c cc khng nh thay th cho lp trnh vin xa mi khng nh bng tay. Chng ta chy v d 3.19, kt qu hnh 3.20
Hnh 3.20: Kt qu ca v d 3.19 Mt hm thnh vin c th c khai bo l static nu n khng truy cp n cc thnh vin khng tnh. Khng ging nh cc thnh vin khng tnh, mt hm thnh vin tnh khng c con tr this bi v cc thnh vin d liu tnh v cc hm thnh vin tnh tn ti c lp vi bt k i tng no ca lp. Ch : Hm thnh vin d liu tnh khng c l const.
Trang 75
BI TP
Bi 1: Xy dng lp Stack, d liu bao gm nh stack v vng nh ca stack. Cc thao tc gm: Khi ng stack. Kim tra stack c rng khng? Kim tra stack c y khng? Push v pop. Bi 2: Xy dng lp hnh tr Cylinder, d liu bao gm bn knh v chiu cao ca hnh tr. Cc thao tc gm hm tnh din tch ton phn v th tch ca hnh tr . Bi 3: Hy xy dng mt lp Point cho cc im trong khng gian ba chiu (x,y,z). Lp cha mt constructor mc nh, mt hm Negate() bin i im thnh i lng c du m, mt hm Norm() tr v khong cch t gc v mt hm Print(). Bi 4: Xy dng mt lp Matrix cho cc ma trn bao gm mt constructor mc nh, hm xut ma trn, nhp ma trn t bn phm, cng hai ma trn, tr hai ma trn v nhn hai ma trn. Bi 5: Xy dng mt lp Matrix cho cc ma trn vung bao gm mt constructor mc nh, hm xut ma trn, tnh nh thc v tnh ma trn nghch o. Bi 6: Xy dng lp Person qun l h tn, nm sinh, im chn mn hc ca tt c cc hc vin ca lp hc. Cho bit bao nhiu hc vin trong lp c php lm lun vn tt nghip, bao nhiu hc vin thi tt nghip, bao nhiu ngi phi thi li v tn mn thi li. Tiu chun xt: Lm lun vn phi c im trung bnh ln hn 7 trong khng c mn no di 5. Thi tt nghip khi im trung bnh khng ln hn 7 v im cc mn khng di 5. Thi li c mn di 5. Bi 7: Xy dng mt lp String. Mi i tng ca lp String s i din mt chui k t. Cc thnh vin d liu l chiu di chui v chui k t thc. Ngoi constructor v destructor cn c cc phng thc nh to mt chui vi chiu di cho trc, to mt chui t mt chui c. Bi 8: Xy dng mt lp Vector lu tr vector gm cc s thc. Cc thnh vin d liu gm: Kch thc vector. Mt mng ng cha cc thnh phn ca vector. Ngoi constructor v destructor, cn c cc phng thc tnh tch v hng ca hai vector, tnh chun ca vector (theo chun bt k no ). Bi 9: Xy dng lp Employee gm h tn v chng minh nhn dn. Ngoi constructor cn c phng thc nhp, xut h tn v chng minh nhn dn ra mn hnh.
Trang 76
A NNG HA TON T
I. DN NHP
Trong chng 3, chng ta tm hiu cc iu c bn ca cc lp C++ v khi nim kiu d liu tru tng (ADTs). Cc thao tc trn cc i tng ca lp (ngha l cc thc th ca ADTs) c thc hin bi gi cc thng ip (di dng cc li gi hm thnh vin) ti cc i tng. K php gi hm ny th cng knh cho cc loi lp nht nh, c bit l cc lp ton hc. i vi cc loi lp ny s l p s dng tp cc ton t c sn phong ph ca C++ ch r cc thao tc ca i tng. Trong chng ny tm hiu lm th no cho php cc ton t ca C++ lm vic vi cc i tng ca lp. X l ny c gi l a nng ha ton t (operator overloading). Ton t << c s dng nhiu mc ch trong C++ l ton t chn dng (stream-insertion) v ton t dch chuyn tri. y l mt v d ca a nng ha ton t. Tng t >> cng c a nng ha. N c s dng va ton t trch dng (stream-extraction) v ton t dch chuyn phi. C++ cho php cc lp trnh vin a nng ha hu ht cc ton t biu th ng cnh m trong chng c s dng. Trnh bin dch pht sinh on m thch hp da trn kiu m trong ton t c s dng. Mt vi ton t c a nng ha thng xuyn, c bit l ton t gn v cc ton t s hc nh + v -. Cng vic thc hin bi a nng ha cc ton t cng c th c thc hin bi cc li gi hm tng minh, nhng k php thng s dng d dng c.
II.
Lp trnh vin c th s dng cc kiu c sn v c th nh ngha cc kiu mi. Cc kiu c th c s dng vi tp cc ton t phong ph. Cc ton t cung cp cho cc lp trnh vin vi k php ngn ngn cho vic biu th cc thao tc ca i tng ca cc kiu c sn. Cc lp trnh vin c th s dng cc ton t vi cc kiu do ngi dng nh ngha. Mc d C++ khng cho php cc ton t mi c to, n cho php cc ton t tn ti c a nng ha sao cho khi cc ton t ny c s dng vi cc i tng ca lp, cc ton t c ngha thch hp cc kiu mi. y chnh l mt c im mnh ca C++. Cc ton t c a nng ha bng cch vit mt nh ngha hm (bao gm phn u v thn) nh khi chng ta vit mt hm bnh thng, ngoi tr tn hm by gi tr thnh t kha operator theo sau bi k hiu ca ton t c a nng ha. Prototype ca n c dng nh sau: type operator operator_symbol ( parameter_list ); s dng mt ton t mt cc i tng ca lp, ton t phi c a nng ha ngoi tr hai iu. iu th nht ton t gn c th s dng vi mi lp m khng cn a nng ha. Cch c x mc nh ca ton t gn l mt php gn thnh vin ca cc thnh vin d liu ca lp. Chng ta nhn thy rng sao chp thnh vin mc nh th nguy him i vi cc lp vi cc thnh vin m c cp pht ng. Chng ta s a nng ha mt cch tng minh ton t gn i vi cc lp nh th. iu th hai ton t a ch (&) cng c th c s dng vi cc i tng ca bt k lp no m khng cn a nng ha; N tr v a ch ca i tng trong b nh. Ton t a ch cng c th c a nng ha.
+ ~ /= <<= --
! %= == ->*
* = ^= != ,
% > |= >= []
^ += << && ()
| *= >>= ++ delete
Trang 77
Hnh 4.2: Cc ton t khng th a nng ha Ch rng ton t ngoc trn () trong bng 4.1 l ton t gi hm. V ton t ny ng sau tn hm c th cha trong n nhiu tham s do ton t ngoc trn l mt ton t nhiu ngi. Th t u tin ca mt ton t khng th c thay i bi a nng ha. iu ny c th dn ti cc tnh trng bt tin trong mt ton t c a nng ha theo mt cch i vi mc u tin c nh ca n th khng thch hp. Tuy nhin, cc du ngoc n c th c s dng t th t c lng ca cc ton t a nng ha trong mt biu thc. Tnh kt hp ca mt ton t khng th c thay i bi a nng ha. Cc tham s mc nh khng th s dng vi mt ton t a nng ha. Khng th thay i s cc ton hng m mt ton t yu cu: a nng ha cc ton t mt ngi vn l cc ton t mt ngi; a nng ha cc ton t hai ngi vn l cc ton t hai ngi. Ton t ba ngi duy nht (?:) ca C++ khng th a nng ha. Cc ton t &, *, + v mi ton t c cc phin bn mt v hai ngi.; Cc phin bn mt v hai ngi ny c th c a nng ha ring bit. ngha ca lm sao mt ton t lm vic trn cc i tng ca cc kiu c sn khng th thay i bi vic a nng ha ton t. Chng hn, lp trnh vin khng th thay i ngha ca lm sao ton t (+) cng hai s nguyn. Vic a nng ha ton t ch lm vic vi cc i tng ca cc kiu do ngi dng nh ngha hoc vi mt s pha trn ca mt i tng ca kiu do ngi dng nh ngha v mt i tng ca mt kiu c sn. a nng ha mt ton t gn v mt ton t cng cho php cc lnh nh l: object2 = object2 + object1 khng bao hm ton t += cng c a nng ha php cc lnh nh l: object2 += object1 Hnh vi nh th c th c thc hin bi vic a nng ha r rng ton t += cho lp .
Trang 78
V d 4.1: Chng ta xy dng lp s phc vi tn lp l Complex v a nng ha ton t + trn lp ny. 1: #include <iostream.h> 2: 3: class Complex 4: { 5: private: 6: double Real, Imaginary; 7: public: 8: Complex(double R=0.0,double I=0.0);// Constructor mc nh 9: void Print(); // Hin th s phc 10: Complex operator+(Complex Z); // Php cng gia hai s phc 11: Complex operator+(double R); //cng mt s phc vi mt s thc 12: }; 13: 14: Complex::Complex(double R,double I) 15: { 16: Real = R; 17: Imaginary = I; 18: } 19: 20: void Complex::Print() 21: { 22: cout<<'('<<Real<<','<<Imaginary<<')'; 23: } 24: 25: Complex Complex::operator + (Complex Z) 26: { 27: Complex Tmp; 28: Tmp.Real = Real + Z.Real; 29: Tmp.Imaginary = Imaginary + Z.Imaginary; 30: return Tmp; 31: } 32: 33: Complex Complex::operator + (double R) 34: { 35: Complex Tmp; 36: Tmp.Real = Real + R; 37: Tmp.Imaginary = Imaginary; 38: return Tmp; 39: } 40: 41: int main() 42: { 43: Complex X,Y(4.3,8.2),Z(3.3,1.1); 44: cout<<"X: "; 45: X.Print(); 46: cout<<endl<<"Y: "; 47: Y.Print(); 48: cout<<endl<<"Z: "; 49: Z.Print(); 50: X = Y + Z; 51: cout<<endl<<endl<<"X = Y + Z:"<<endl; 52: X.Print(); 53: cout<<" = "; 54: Y.Print(); 55: cout<<" + "; 56: Z.Print();
Trang 79
Hm thnh vin ton t operator + () (t dng 25 n 31 v t dng 33 n 39) tr v mt i tng c kiu Complex l tng ca hai s phc hoc tng ca mt s phc vi mt s thc. Ch rng i tng tam thi Tmp c dng bn trong hm operator + () gi kt qu, v l i tng c tr v. Chng ta chy v d 4.1, kt qu hnh 4.3
Hnh 4.3: Kt qu ca v d 4.1 Do a nng ha ton t + trn lp Complex v d 4.1, chng ta c th vit: X = Y + Z; Cu lnh ny c trnh bin dch hiu: X = Y.operator + (Z); Nh vy, trong biu thc Y + Z i tng bn tri ton t + (l i tng Y) l i tng m qua , hm thnh vin ton t operator + () c gi. Do hm thnh vin ton t + ch nhn mt tham s l i tng bn phi ton t v i tng bn tri ton t l i tng to li gi cho hm ton t v c truyn bi con tr this. Hm operator + () tr v mt i tng Complex. Do vy chng ta c th vit: (Y + Z).Print(); in trn mn hnh s phc ca i tng c tr v. i tng do Y + Z sinh ra nh vy l mt i tng tm thi. N s khng tn ti khi hm thnh Print() kt thc. Hn na khi tr v mt i tng, ton t + cho php mt chui php cng. Nn chng ta cng c th vit: X = X + Y + Z; Tuy nhin chng ta khng th no vit c cu lnh sau: X = 3.5 + Y; // Li !!! Chnh v l do ny chng ta chn mt hm khng thnh vin a nng ha mt ton t cho php ton t c giao hon. Ch rng hm khng thnh vin khng cn thit phi l hm friend nu cc hm set v get thch hp tn ti trong phn giao din public, v t bit nht nu cc hm set v get l cc hm inline.
Trang 80
a nng ha ton t << phi c mt ton hng tri ca kiu ostream & (nh l cout trong biu thc cout<<X), v th n phi l hm khng thnh vin. Tng t, a nng ha ton t >> phi c mt ton hng tri ca kiu istream & (nh l cin trong biu thc cin>>X), v th v th n cng phi l hm khng thnh vin. Ngoi tr a nng ha ton t >> v << lin quan n dng nhp/xut d liu chng ta c hnh 4.4 v cch a nng ha ton t nh sau: Biu thc a#b #a a=b a[b] a(b) a-> a++ a-Hm thnh vin a.operator#(b) a.operator() a.operator=(b) a.operator[](b) a.operator()(b) a.operator->() a.operator++(0) a.operator--(0) operator++(a,0) operator--(a,0) Hm khng thnh vin operator#(a,b) operator#(a)
V.
Hnh 4.5: Cc ton t hai ngi c a nng ha Mt ton t hai ngi c th c a nng ha nh l hm thnh vin khng tnh vi mt tham s hoc nh mt hm khng thnh vin vi hai tham s (mt trong cc tham s ny phi l hoc l mt i tng lp hoc l mt tham chiu n i tng lp). V d 4.2: Chng ta xy dng lp s phc vi tn lp l Complex v a nng ha cc ton t tnh ton + - += -= v cc ton t so snh == != > >= < <= vi cc hm ton t l cc hm thnh vin. 1: #include <iostream.h> 2: #include <math.h> 3: 4: class Complex 5: { 6: private: 7: double Real, Imaginary; 8: public: 9: Complex(); // Constructor mc nh 10: Complex(double R,double I);
Trang 81
Complex::Complex(double R,double I)
{
Real = R; Imaginary = I;
}
Complex::Complex(double R)
{
cout<<'('<<Real<<','<<Imaginary<<')';
}
Complex Tmp; Tmp.Real = Real + Z.Real; Tmp.Imaginary = Imaginary + Z.Imaginary; return Tmp;
}
Trang 82
Trang 83
Complex X, Y(4.3,8.2), Z(3.3,1.1), T; cout<<"X: "; X.Print(); cout<<endl<<"Y: "; Y.Print(); cout<<endl<<"Z: "; Z.Print(); cout<<endl<<"T: "; T.Print(); T=5.3;// Gi constructor chuyn kiu cout<<endl<<endl<<"T = 5.3"<<endl; cout<<"T: "; T.Print(); X = Y + Z; cout<<endl<<endl<<"X = Y + Z: "; X.Print(); cout<<" = "; Y.Print(); cout<<" + "; Z.Print(); X = Y - Z; cout<<endl<<"X = Y - Z: "; X.Print(); cout<<" = "; Y.Print(); cout<<" - "; Z.Print(); cout<<endl<<endl<<"Y += T i.e "; Y.Print(); cout<<" += "; T.Print(); Y += T; cout<<endl<<"Y: "; Y.Print(); cout<<endl<<"Z -= T i.e "; Z.Print(); cout<<" -= "; T.Print(); Z -= T; cout<<endl<<"Z: "; Z.Print(); Complex U(X);// Gi constructor sao chp cout<<endl<<endl<<"U: "; U.Print(); cout<<endl<<endl<<"Evaluating: X==U"<<endl; if (X==U) cout<<"They are equal"<<endl; cout<<"Evaluating: Y!=Z"<<endl; if (Y!=Z) cout<<"They are not equal => "; if (Y>Z) cout<<"Y>Z"; else cout<<"Y<Z"; return 0;
}
Trang 84
l mt constructor sao chp (copy constructor). N khi ng mt i tng lp bng cch to mt sao chp ca mt i tng lp . Constructor sao chp thc hin cng vic ging nh ton t sao chp nhng n c mt vai tr c bit. Constructor sao chp ch nhn tham s l mt tham chiu ch n i tng thuc chnh lp m n c nh ngha. Cc constructor sao chp c dng mi khi mt s sao chp ca mt i tng cn thit nh khi c s truyn tham s bng tr, khi tr v mt i tng t hm, hoc khi khi ng mt i tng m c sao chp t i tng khc ca cng lp. Chng hn: Complex A(3.5, 4.5); Complex B(A); // Gi constructor sao chp Complex C = B; // Gi constructor sao chp Complex MyFunc(Complex Z) // Gi constructor sao chp { rZ; // Gi constructor sao chp }
Hnh 4.6: Kt qu ca v d 4.2 Chng ta ch rng, du = trong cu lnh trn ng vi constructor sao chp ch khng phi l ton t gn . Nu chng ta khng nh ngha constructor sao chp, trnh bin dch to ra mt constructor sao chp mc nh s sao chp tng thnh vin mt. dng 12 ca chng trnh v d 4.2: Complex(double R); l mt constructor chuyn i (conversion constructor). Constructor ny ly mt tham s double v khi to i tng Complex m phn thc bng gi tr tham s truyn vo v phn o bng 0.0 (t dng 48 n 52). Bt k mt constructor no c tham s n c th c ngh nh mt constructor chuyn i. Constructor chuyn i s i mt s thc thnh mt i tng Complex ri gn cho i tng ch Complex. Chng hn: T = 3.5; // Ngm nh: T = Complex(3.5)
Trang 85
Trnh bin dch t ng dng constructor chuyn i to mt i tng tm thi Complex, ri dng ton t gn gn i tng tm thi ny cho i tng khc ca Complex. Chng hn cu lnh sau vn ng: X = Y + 3.5; // Ngm nh: X = Y + Complex(3.5); Nh vy mt constructor chuyn i c s dng thc hin mt s chuyn i ngm nh. V d 4.3: Ly li v d 4.2 nhng cc hm ton t +, - v cc hm ton t so snh l hm khng thnh vin. #include <iostream.h> #include <math.h> class Complex { private: double Real,Imaginary; public: Complex();//Constructor mac dinh Complex(double R,double I); Complex (const Complex & Z);//Constructor sao chep Complex (double R);//Constructor chuyen doi void Print();//Hien thi so phuc //Cac toan tu tinh toan friend Complex operator + (Complex Z1,Complex Z2); friend Complex operator - (Complex Z1,Complex Z2); Complex operator += (Complex Z); Complex operator -= (Complex Z); //Cac toan tu so sanh friend int operator == (Complex Z1,Complex Z2); friend int operator != (Complex Z1,Complex Z2); friend int operator > (Complex Z1,Complex Z2); friend int operator >= (Complex Z1,Complex Z2); friend int operator < (Complex Z1,Complex Z2); friend int operator <= (Complex Z1,Complex Z2); private: double Abs();//Gia tri tuyet doi cua so phuc }; Complex::Complex() { Real = 0.0; Imaginary = 0.0; } Complex::Complex(double R,double I) { Real = R; Imaginary = I; } Complex::Complex(const Complex & Z) { Real = Z.Real; Imaginary = Z.Imaginary; } Complex::Complex(double R) { Real = R; Imaginary = 0.0; } void Complex::Print()
Trang 86
cout<<'('<<Real<<','<<Imaginary<<')'; } Complex operator + (Complex Z1,Complex Z2) { Complex Tmp; Tmp.Real = Z1.Real + Z2.Real; Tmp.Imaginary = Z1.Imaginary + Z2.Imaginary; return Tmp; } Complex operator - (Complex Z1,Complex Z2) { Complex Tmp; Tmp.Real = Z1.Real - Z2.Real; Tmp.Imaginary = Z1.Imaginary - Z2.Imaginary; return Tmp; } Complex Complex::operator += (Complex Z) { Real += Z.Real; Imaginary += Z.Imaginary; return *this; } Complex Complex::operator -= (Complex Z) { Real -= Z.Real; Imaginary -= Z.Imaginary; return *this; } int operator == (Complex Z1,Complex Z2) { return (Z1.Real == Z2.Real) && (Z1.Imaginary == Z2.Imaginary); } int operator != (Complex Z1,Complex Z2) { return (Z1.Real != Z2.Real) || (Z1.Imaginary != Z2.Imaginary); } int operator > (Complex Z1,Complex Z2) { return Z1.Abs() > Z2.Abs(); } int operator >= (Complex Z1,Complex Z2) { return Z1.Abs() >= Z2.Abs(); } int operator < (Complex Z1,Complex Z2) { return Z1.Abs() < Z2.Abs(); } int operator <= (Complex Z1,Complex Z2) { return Z1.Abs() <= Z2.Abs(); } double Complex::Abs() { return sqrt(Real*Real+Imaginary*Imaginary); } int main()
Trang 87
VI.
V d +c -c *c &c c->
Ton t ~ ! ++ --
Hnh 4.8: Cc ton t mt ngi c a nng ha Mt ton t mt ngi ca lp c a nng ha nh mt hm thnh vin khng tnh vi khng c tham s hoc nh mt hm khng thnh vin vi mt tham s; Tham s phi hoc l mt i tng lp hoc l mt tham chiu n i tng lp. V d 4.4: Ly li v d 4.3 v thm ton t du tr mt ngi. 1: #include <iostream.h> 2: #include <math.h> 3: 4: class Complex 5: {
Trang 88
Trang 89
64: 65: Tmp.Real = Z1.Real + Z2.Real; 66: Tmp.Imaginary = Z1.Imaginary + Z2.Imaginary; 67: return Tmp; 68: } 69: 70: Complex operator - (Complex Z1,Complex Z2) 71: { 72: Complex Tmp; 73: 74: Tmp.Real = Z1.Real - Z2.Real; 75: Tmp.Imaginary = Z1.Imaginary - Z2.Imaginary; 76: return Tmp; 77: } 78: 79: Complex Complex::operator += (Complex Z) 80: { 81: Real += Z.Real; 82: Imaginary += Z.Imaginary; 83: return *this; 84: } 85: 86: Complex Complex::operator -= (Complex Z) 87: { 88: Real -= Z.Real; 89: Imaginary -= Z.Imaginary; 90: return *this; 91: } 92: 93: Complex Complex::operator - () 94: { 95: Complex Tmp; 96: 97: Tmp.Real = -Real; 98: Tmp.Imaginary = -Imaginary; 99: return Tmp; 100: } 101 102: int operator == (Complex Z1,Complex Z2) 103: { 104: return (Z1.Real == Z2.Real) && (Z1.Imaginary == Z2.Imaginary); 105: } 106: 107: int operator != (Complex Z1,Complex Z2) 108: { 109: return (Z1.Real != Z2.Real) || (Z1.Imaginary != Z2.Imaginary); 110: } 111: 112: int operator > (Complex Z1,Complex Z2) 113: { 114: return Z1.Abs() > Z2.Abs(); 115: } 116: 117: int operator >= (Complex Z1,Complex Z2) 118: { 119: return Z1.Abs() >= Z2.Abs(); 120: } 121:
Trang 90
double Complex::Abs()
{ return sqrt(Real*Real+Imaginary*Imaginary); } int main() {
Complex X, Y(4.3,8.2), Z(3.3,1.1); cout<<"X: "; X.Print(); cout<<endl<<"Y: "; Y.Print(); cout<<endl<<"Z: "; Z.Print(); X = -Y + 3.6; cout<<endl<<endl<<"X = -Y + 3.6: "; X.Print(); cout<<" = "; (-Y).Print(); cout<<" + 3.6 "; X = -Y + -Z; cout<<endl<<"X = -Y + -Z: "; X.Print(); cout<<" = "; (-Y).Print(); cout<<" + "; (-Z).Print(); return 0;
}
Trang 91
Khi ci t cc lp vector hoc chui k t, chng ta cn phi truy cp n tng phn t ca chng, trong ngn ng C/C++ c ton t [] truy cp n mt phn t ca mng. y l ton t hai ngi, c dng a[b] v khi a nng ton t ny th hm ton t tng ng phi l thnh vin ca mt lp. V d 4.5: a nng ha ton t [] truy cp n mt phn t ca vector. 1: #include <iostream.h> 2: 3: class Vector 4: { 5: private: 6: int Size; 7: int *Data; 8: public: 9: Vector(int S=2,int V=0); 10: ~Vector(); 11: void Print() const; 12: int & operator [] (int I); 13: }; 14: 15: Vector::Vector(int S,int V) 16: { 17: Size = S; 18: Data=new int[Size]; 19: for(int I=0;I<Size;++I) 20: Data[I]=V; 21: } 22: 23: Vector::~Vector() 24: { 25: delete []Data; 26: } 27: void Vector::Print() const 28: { 29: cout<<"Vector:("; 30: for(int I=0;I<Size-1;++I) 31: cout<<Data[I]<<","; 32: cout<<Data[Size-1]<<")"<<endl; 33: } 34: 35: int & Vector::operator [](int I) 36: { 37: return Data[I]; 38: } 39: 40: int main() 41: { 42: Vector V(5,1); 43: V.Print(); 44: for(int I=0;I<5;++I) 45: V[I]*=(I+1); 46: V.Print(); 47: V[0]=10; 48: V.Print(); 49: return 0; 50: } Chng ta chy v d 4.5, kt qu hnh 4.10
Trang 92
Hnh 4.10: Kt qu ca v d 4.5 Trong chng trnh v d 4.5, hm ton t ca ton t [] lp Vector tr v mt tham chiu v ton t ny c th dng v tri ca php gn.
VII.2. Ton t ()
Ton t () c dng gi hm, ton t ny gm hai ton hng: ton hng u tin l tn hm, ton hng th hai l danh sch cc tham s ca hm. Ton t ny c dng ging nh ton t [] v khi a nng ton t ny th hm ton t tng ng phi l thnh vin ca mt lp. V d 4.6: Ly li v d 4.5 nhng a nng ha ton t () truy cp n mt phn t ca vector. 1: #include <iostream.h> 2: 3: class Vector 4: { 5: private: 6: int Size; 7: int *Data; 8: public: 9: Vector(int S=2,int V=0); 10: ~Vector(); 11: void Print() const; 12: int & operator () (int I); 13: }; 14: 15: Vector::Vector(int S,int V) 16: { 17: Size = S; 18: Data=new int[Size]; 19: for(int I=0;I<Size;++I) 20: Data[I]=V; 21: } 22: 23: Vector::~Vector() 24: { 25: delete []Data; 26: } 27: void Vector::Print() const 28: { 29: cout<<"Vector:("; 30: for(int I=0;I<Size-1;++I) 31: cout<<Data[I]<<","; 32: cout<<Data[Size-1]<<")"<<endl; 33: } 34: 35: int & Vector::operator ()(int I) 36: { 37: return Data[I]; 38: } 39: 40: int main() 41: { 42: Vector V(5,1);
Trang 93
Hnh 4.11: Kt qu ca v d 4.6 V d 4.7: a nng ha ton t () truy cp n phn t ca ma trn. 1: #include <iostream.h> 2: 3: class Matrix 4: { 5: private: 6: int Rows,Cols; 7: int **Data; 8: public: 9: Matrix(int R=2,int C=2,int V=0); 10: ~Matrix(); 11: void Print() const; 12: int & operator () (int R,int C); 13: }; 14: 15: Matrix::Matrix(int R,int C,int V) 16: { 17: int I,J; 18: Rows=R; 19: Cols=C; 20: Data = new int *[Rows]; 21: int *Temp=new int[Rows*Cols]; 22: for(I=0;I<Rows;++I) 23: { 24: Data[I]=Temp; 25: Temp+=Cols; 26: } 27: for(I=0;I<Rows;++I) 28: for(J=0;J<Cols;++J) 29: Data[I][J]=V; 30: } 31: 32: Matrix::~Matrix() 33: { 34: delete [] Data[0]; 35: delete [] Data; 36: } 37: 38: void Matrix::Print() const 39: { 40: int I,J; 41: for(I=0;I<Rows;++I)
Trang 94
for(J=0;J<Cols;++J)
{
cout<<endl;
} } int & Matrix::operator () (int R,int C) { return Data[R][C]; } int main() { int I,J;
Matrix M(2,3,1); cout<<"Matrix:"<<endl; M.Print(); for(I=0;I<2;++I) for(J=0;J<3;++J) M(I,J)*=(I+J+1); cout<<"Matrix:"<<endl; M.Print(); return 0;
}
Trang 95
IX.
Cc ton t new v delete ton cc c th c a nng ha. iu ny cho php cc lp trnh vin C++ c kh nng xy dng mt h thng cp pht b nh theo ngi dng, ci cng giao tip nh h thng cp pht mc nh. C hai cch a nng ha cc ton t new v delete: C th a nng ha mt cch ton cc ngha l thay th hn cc ton t new v delete mc nh. Chng ta a nng ha cc ton t new v delete vi t cch l hm thnh vin ca lp nu mun cc ton t new v delete p dng i vi lp . Khi chng ta dng new v delete i vi lp no , trnh bin dch s kim tra xem new v delete c c nh ngha ring cho lp hay khng; nu khng th dng new v delete ton cc (c th c a nng ha). Hm ton t ca ton t new v delete c prototype nh sau: void * operator new(size_t size); void operator delete(void * ptr); Trong tham s kiu size_t c trnh bin dch hiu l kch thc ca kiu d liu c trao cho ton t new.
Gio trnh mn Lp trnh hng i tng IX.1. a nng ha ton t new v delete ton cc
Trang 96
V d 4.15: a nng ha ton t new v delete ton cc ng thi chng t rng ton t new v delete do a nng ha thay th ton t new v delete mc nh. 1: #include <iostream.h> 2: #include <stdlib.h> 3: 4: class Point 5: { 6: private: 7: int X, Y; 8: public: 9: Point(int A=0,int B=0) 10: { 11: X=A; 12: Y=B; 13: cout<<"Constructor!"<<endl; 14: } 15: ~Point() 16: { 17: cout<<"Destructor!"<<endl; 18: } 19: void Print() const 20: { 21: cout<<"X="<<X<<","<<"Y="<<Y<<endl; 22: } 23: }; 24: 25: void * operator new(size_t Size) 26: { 27: return malloc(Size); 28: } 29: 30: void operator delete(void *Ptr) 31: { 32: free(Ptr); 33: } 34: 35: int main() 36: { 37: Point *P1,*P2; 38: P1= new Point(10,20); 39: if (P1==NULL) 40: { 41: cout<<"Out of memory!"<<endl; 42: return 1; 43: } 44: P2= new Point(-10,-20); 45: if (P2==NULL) 46: { 47: cout<<"Out of memory!"<<endl; 48: return 1; 49: } 50: int *X=new int; 51: if (X==NULL) 52: { 53: cout<<"Out of memory!"<<endl; 54: return 1;
Trang 97
Trang 98
X.
Chng ta c th a nng ha cc ton t chn dng << (stream insertion) v trch dng >> (stream extraction). Hm ton t ca ton t << c a nng ha c prototype nh sau: ostream & operator << (ostream & stream, ClassName Object); Hm ton t << tr v tham chiu ch n dng xut ostream. Tham s th nht ca hm ton t << l mt tham chiu ch n dng xut ostream, tham s th hai l i tng c chn vo dng. Khi s dng, dng trao cho ton t << (tham s th nht) l ton hng bn tri v i tng c a vo dng (tham s th hai) l ton hng bn phi. bo m cch dng ton t << lun nht qun, chng ta khng th nh ngha hm ton t << nh l hm thnh vin ca lp ang xt, thng thng n chnh l hm friend. Cn hm ton t ca ton t >> c a nng ha c prototype nh sau: istream & operator >> (istream & stream, ClassName Object); Hm ton t >> tr v tham chiu ch n dng nhp istream. Tham s th nht ca hm ton t ny l mt tham chiu ch n dng nhp istream, tham s th hai l i tng ca lp ang xt m chng ta mun to dng nh vo d liu ly t dng nhp. Khi s dng, dng nhp ng vai ton hng bn tri, i tng nhn d liu ng vai ton hng bn phi. Cng nh trng hp ton t <<, hm ton t >> khng l hm thnh vin ca lp, thng thng n chnh l hm friend.
Trang 99
XI.
MT S V D
XI.1. Lp String
V d 4.18: Chng ta s xy dng mt lp x l vic to v thao tc trn cc chui (string). C++ khng ci sn kiu d liu chui. Nhng C++ cho php chng ta thm kiu chui nh mt lp thng qua c ch a nng ha.
#include <iostream.h> #include <iomanip.h> #include <string.h>
Trang 100
#include <assert.h> class String { private: char *Ptr; //Con tro tro den diem bat dau cua chuoi int Length; //Chieu dai chuoi public: String(const char * = ""); //Constructor chuyen doi String(const String &); //Constructor sao chep ~String(); //Destructor const String &operator=(const String &); //Phep gan String &operator+=(const String &); //Phep noi int operator!() const; //Kiem tra chuoi rong int operator==(const String &) const; int operator!=(const String &) const; int operator<(const String &) const; int operator>(const String &) const; int operator>=(const String &) const; int operator<=(const String &) const; char & operator[](int); //Tra ve ky tu tham chieu String &operator()(int, int); //Tra ve mot chuoi con int GetLength() const; friend ostream &operator<<(ostream &, const String &); friend istream &operator>>(istream &, String &); }; //Constructor sao chep: Chuyen doi char * thanh String String::String(const char *S) { cout << "Conversion constructor: " << S << endl; Length = strlen(S); Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, S); } String::String(const String &Copy) { cout << "Copy constructor: " << Copy.Ptr << endl; Length = Copy.Length; Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, Copy.Ptr); } //Destructor String::~String() { cout << "Destructor: " << Ptr << endl; delete [] Ptr; } const String &String::operator=(const String &Right) { cout << "operator= called" << endl; if (&Right != this) { delete [] Ptr; Length = Right.Length; Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, Right.Ptr); } else cout << "Attempted assignment of a String to itself" << endl; return *this; }
Trang 101
Trang 102
Trang 103
Trang 104
}; int Date::Days[] = {31, 28, 31, 30, 31, 30,31, 31, 30, 31, 30, 31}; Date::Date(int M, int D, int Y) { SetDate(M, D, Y); } void Date::SetDate(int MM, int DD, int YY) { Month = (MM >= 1 && MM <= 12) ? MM : 1; Year = (YY >= 1900 && YY <= 2100) ? YY : 1900; if (Month == 2 && LeapYear(Year)) Day = (DD >= 1 && DD <= 29) ? DD : 1; else Day = (DD >= 1 && DD <= Days[Month-1]) ? DD : 1; } Date Date::operator++() { HelpIncrement(); return *this; } Date Date::operator++(int) { Date Temp = *this; HelpIncrement(); return Temp; } const Date &Date::operator+=(int AdditionalDays) { for (int I = 1; I <= AdditionalDays; I++) HelpIncrement(); return *this; } int Date::LeapYear(int Y) { if (Y % 400 == 0 || (Y % 100 != 0 && Y % 4 == 0) ) return 1; //Nam nhuan return 0; //Nam khong nhuan } int Date::EndOfMonth(int D) { if (Month == 2 && LeapYear(Year)) return D == 29; return D == Days[Month-1]; } void Date::HelpIncrement() { if (EndOfMonth(Day) && Month == 12) //Het nam { Day = 1; Month = 1; ++Year; } else if (EndOfMonth(Day)) //Het thang {
Trang 105
++Day; } ostream &operator<<(ostream &Output, const Date &D) { static char*MonthName[12]={"January","February","March","April","May", "June","July", "August","September", "October","November", "December" }; Output << MonthName[D.Month-1] << ' '<< D.Day << ", " << D.Year; return Output;
} int main() { Date D1, D2(12, 27, 1992), D3(0, 99, 8045); cout << "D1 is " << D1 << endl << "D2 is " << D2 << endl << "D3 is " << D3 << endl << endl; cout << "D2 += 7 is " << (D2 += 7) << endl << endl; D3.SetDate(2, 28, 1992); cout << " D3 is " << D3 << endl; cout << "++D3 is " << ++D3 << endl << endl; Date D4(3, 18, 1969); cout << "Testing the preincrement operator:" << endl << " D4 is " << D4 << endl; cout << "++D4 is " << ++D4 << endl; cout << " D4 is " << D4 << endl << endl; cout << "Testing the postincrement operator:" << endl << " D4 is " << D4 << endl; cout << "D4++ is " << D4++ << endl; cout << " D4 is " << D4 << endl; return 0; }
Trang 106
BI TP
Bi 1: Xy dng lp Complex cha cc s phc gm cc php ton: +, -, *, /, +=, -=, *=, /=, ==, !=, >, >=, <, <=. Bi 2: Xy dng lp String thc hin cc thao tc trn cc chui, trong lp ny c cc php ton: Php ton + ni hai chui li vi nhau. Php ton = gn mt chui cho mt chui khc. Php ton [] truy cp n mt k t trong chui. Cc php ton so snh: ==, !=, >, >=, <, <= Bi 3: Xy dng lp ma trn Matrix gm cc php ton cng, tr v nhn hai ma trn bt k. Bi 4: Xy dng lp Rational cha cc s hu t gm cc php ton +, - , *, /, ==, !=, >, >=, <, <=. Bi 5: Xy dng lp Time lu tr gi, pht, giy gm cc php ton: Php cng gia d liu thi gian v mt s nguyn l s giy, kt qu l mt d liu thi gian. Php tr gia hai d liu thi gian, kt qu l mt s nguyn chnh l s giy. ++ v tng hay gim thi gian xung mt giy. Cc php so snh. Bi 6: Xy dng lp Date lu tr ngy, thng, nm gm cc php ton: Php cng gia d liu Date v mt s nguyn l s ngy, kt qu l mt d liu Date. Php tr gia hai d liu Date, kt qu l mt s nguyn chnh l s ngy. ++ v tng hay gim thi gian xung mt ngy. Cc php so snh. Bi 7: Cc s nguyn 32 bit c th biu din trong phm vi t 2147483648 n 2147483647. Hy xy dng lp HugeInt biu din cc s nguyn 32 bit gm cc php ton +, -, *, /
Trang 107
TNH K THA
I. DN NHP
Trong chng ny v chng k, chng ta tm hiu hai kh nng m lp trnh hng i tng cung cp l tnh k tha (inheritance) v tnh a hnh (polymorphism). Tnh k tha l mt hnh thc ca vic s dng li phn mm trong cc lp mi c to t cc lp c bng cch "ht" cc thuc tnh v hnh vi ca chng v t im thm vi cc kh nng m cc lp mi i hi. Vic s dng li phn mm tit kim thi gian trong vic pht trin chng trnh. N khuyn khch s dng li phn mm cht lng cao th thch v g li, v th gim thiu cc vn sau khi mt h tr thnh chnh thc. Tnh a hnh cho php chng ta vit cc chng trnh trong mt kiu cch chung x l cc lp c lin h nhau. Tnh k tha v tnh a hnh cc k thut c hiu lc i vi s chia vi s phc tp ca phn mm. Khi to mt lp mi, thay v vit cc thnh vin d liu v cc hm thnh vin, lp trnh vin c th thit k m lp mi c k tha cc thnh vin d liu v cc hm thnh vin ca lp trc nh ngha l lp c s (base class). Lp mi c tham chiu l lp dn xut (derived class). Mi lp dn xut t n tr thnh mt ng c l mt lp c s cho lp dn xut tng lai no . Bnh thng mt lp dn xut thm cc thnh vin d liu v cc hm thnh vin, v th mt lp dn xut thng thng rng hn lp c s ca n. Mt lp dn xut c ch nh hn mt lp c s v biu din mt nhm ca cc i tng nh hn. Vi i tng n, lp dn xut, lp dn xut bt u bn ngoi thc cht ging nh lp c s. Sc mnh thc s ca s k tha l kh nng nh ngha trong lp dn xut cc phn thm, thay th hoc tinh lc cc c tnh k tha t lp c s. Mi i tng ca mt lp dn xut cng l mt i tng ca lp c s ca lp dn xut . Tuy nhin iu ngc li khng ng, cc i tng lp c s khng l cc i tng ca cc lp dn xut ca lp c s . Chng ta s ly mi quan h "i tng lp dn xut l mt i tng lp c s" thc hin cc thao tc quan trng no . Chng hn, chng ta c th lun mt s a dng ca cc i tng khc nhau c lin quan thng qua s k tha thnh danh sch lin kt ca cc i tng lp c s. iu ny cho php s a dng ca cc i tng x l mt cch tng qut. Chng ta phn bit gia "l mt" (is a) quan h v "c mt" (has a) quan h. "l mt" l s k tha. Trong mt "l mt" quan h, mt i tng ca kiu lp dn xut cng c th c x l nh mt i tng ca kiu lp c s. "c mt" l s phc hp (composition). Trong mt "c mt" quan h, mt i tng lp c mt hay nhiu i tng ca cc lp khc nh l cc thnh vin, do lp bao cc i tng ny gi l lp phc hp (composed class).
II.
K THA N
II.1. Cc lp c s v cc lp dn xut
Thng mt i tng ca mt lp tht s l mt i tng ca lp khc cng c. Mt hnh ch nht l mt t gic, v th lp Rectangle c th k tha t lp Quadrilateral. Trong khung cnh ny, lp Quadrilateral gi l mt lp c s v lp Rectangle gi l mt lp dn xut. Hnh 5.1 cho chng ta mt vi v d v k tha n. Cc ngn ng lp trnh hng i tng nh SMALLTALK s dng thut ng khc: Trong k tha, lp c s c gi l lp cha (superclass), lp dn xut c gi l lp con (subclass).
Lp c s Student Shape Lp dn xut GraduateStudent UndergraduateStudent Circle Triangle Rectangle CarLoan
Loan
Trang 108
Employee Acount
Hnh 5.1: Mt vi k tha n. S k tha hnh thnh cc cu trc phn cp ging cy (cn gi l cy ph h). Mt lp c s tn ti trong mt phn cp quan h vi lp dn xut ca n. Mt lp c th tn ti chc chn bi chnh n, nhng khi mt lp c s dng vi c ch ca s k tha th lp tr thnh hoc l mt lp c s m cung cp cc thuc tnh v cc hnh vi cho cc lp khc, hoc l lp tr thnh mt lp dn xut m k tha cc thuc tnh v cc hnh vi. Chng ta pht trin mt phn cp k tha n. Mt trng i hc cng ng c th c hng ngn ngi m l cc thnh vin cng ng. Nhng ngi ny gm cc ngi lm cng v cc sinh vin. Nhng ngi lm cng hoc l cc thnh vin khoa hoc cc thnh vin nhn vin. Cc thnh vin khoa hoc l cc nh qun l hoc ging vin. iu ny tr thnh phn cp k tha nh hnh 5.2
Hnh 5.2: Mt phn cp k tha cho cc thnh vin ca trng i hc cng ng. Phn cp k tha quan trng khc l phn cp Shape hnh 5.3.
Hnh 5.3: Phn cp lp Shape ch nh lp CommissionWorker c dn xut t lp Employee, lp CommissionWorker c nh ngha nh sau: class CommissionWorker: public Employee {. };
Trang 109
iu ny c gi l k tha public v l loi m phn ln c s dng. Ngoi ra chng ta cn c k tha private v k tha protected. Vi k tha public, cc thnh vin public v protected ca lp c s c k tha nh l cc thnh vin public v protected ca lp dn xut tng ng. Nn nh rng cc thnh vin private ca lp c s khng th truy cp t cc lp dn xut ca lp . X l cc i tng lp c s v cc i tng lp dn xut tng t; ph bin l c biu din bng cc thuc tnh v cc hnh vi ca lp c s. Cc i tng ca bt k lp no dn xut t mt lp c s chung c th tt c c x l nh cc i tng ca lp c s .
II.2.
Cc thnh vin public ca mt lp c s c truy cp bi tt c cc hm trong chng trnh. Cc thnh vin private ca mt lp c s ch c truy cp bi cc hm thnh vin v cc hm friend ca lp c s. Truy cp protected phc v nh mt mc trung gian ca s bo v gia truy cp public v truy cp private. Cc thnh vin protected ca mt lp c s c th ch c truy cp bi cc hm thnh vin v cc hm friend ca lp c s v bi cc hm thnh vin v cc hm friend ca lp dn xut. Cc thnh vin lp dn xut k tha public c th tham kho ti cc thnh vin public v protected bng cch s dng cc tn thnh vin.
File POINT.CPP 1: //POINT.CPP 2: //nh ngha cc hm thnh vin ca lp Point 3: #include <iostream.h> 4: #include "point.h"
Trang 110
File CIRCLE.H 1: //CIRCLE.H 2: //nh ngha lp Circle 3: #ifndef CIRCLE_H 4: #define CIRCLE_H 5: 6: #include "point.h" 7: class Circle : public Point 8: { 9: protected: 10: float Radius; 11: public: 12: Circle(float R = 0.0, float A = 0, float B = 0); 13: void SetRadius(float R); 14: float GetRadius() const; 15: float Area() const; 16: friend ostream & operator <<(ostream &Output, const Circle &C); 17: }; 18: 19: #endif File CIRCLE.CPP 1: //CIRCLE.CPP 2: //nh ngha cc hm thnh vin ca lp Circle 3: #include <iostream.h> 4: #include <iomanip.h> 5: #include "circle.h" 6: 7: Circle::Circle(float R, float A, float B): Point(A, B) 8: { 9: Radius = R; 10: } 11: 12: void Circle::SetRadius(float R) 13: { 14: Radius = R; 15: } 16: 17: float Circle::GetRadius() const 18: {
Trang 111
//Xut mt Circle theo dng: Center = [x, y]; Radius = #.## ostream & operator <<(ostream &Output, const Circle &C) { Output << "Center = [" << C.X << ", " << C.Y << "]; Radius = " << setiosflags(ios::showpoint) << setprecision(2) << C.Radius; return Output; }
File CT5_1.CPP: 1: //CT5_1.CPP 2: //Chng trnh 5.1: p cc con tr lp c s ti cc con tr lp dn xut 3: #include <iostream.h> 4: #include <iomanip.h> 5: #include "point.h" 6: #include "circle.h" 7: 8: int main() 9: { 10: Point *PointPtr, P(3.5, 5.3); 11: Circle *CirclePtr, C(2.7, 1.2, 8.9); 12: cout << "Point P: "<<P<<endl<<"Circle C: "<<C<< endl; 13 //X l mt Circle nh mt Point (ch xem mt phn lp c s) 14: PointPtr = &C; 15: cout << endl << "Circle C (via *PointPtr): "<<*PointPtr<<endl; 16 //X l mt Circle nh mt Circle 17: PointPtr = &C; 18: CirclePtr = (Circle *) PointPtr; 19: cout << endl << "Circle C (via *CirclePtr): " << endl 20: <<*CirclePtr<< endl << "Area of C (via CirclePtr): " 21: << CirclePtr->Area() << endl; 22: //Nguy him: Xem mt Point nh mt Circle 23: PointPtr = &P; 24: CirclePtr = (Circle *) PointPtr; 25: cout << endl << "Point P (via *CirclePtr): "<< endl 26: <<*CirclePtr<< endl << "Area of object CirclePtr points to: " 27: <<CirclePtr->Area() << endl; 28: return 0; 29: } Chng ta chy v d 5.1, kt qu hnh 5.4
Trang 112
Gio trnh mn Lp trnh hng i tng II.4. nh ngha li cc thnh vin lp c s trong mt lp dn xut
Trang 113
Mt lp dn xut c th nh ngha li mt hm thnh vin lp c s. iu ny c gi l overriding. Khi hm c cp bi tn trong lp dn xut, phin bn ca lp dn xut c chn mt cch t ng. Ton t nh phm vi c th s dng truy cp phin bn ca lp c s t lp dn xut.
public
public trong lp dn xut. protected trong lp dn xut. C th truy cp trc tip bi C th truy cp trc tip bi cc hm thnh vin khng cc hm thnh vin khng tnh, cc hm friend. tnh, cc hm friend v cc hm khng thnh vin. protected trong lp dn protected trong lp dn xut. xut. C th truy cp trc tip bi C th truy cp trc tip bi cc hm thnh vin khng cc hm thnh vin khng tnh, cc hm friend. tnh, cc hm friend. Du trong lp dn xut. Du trong lp dn xut. C th truy cp trc tip bi C th truy cp trc tip bi cc hm thnh vin khng cc hm thnh vin khng tnh, cc hm friend thng tnh, cc hm friend thng qua cc hm thnh vin qua cc hm thnh vin public v protected ca lp public v protected ca lp c s. c s.
protected
private
Trang 114
thnh vin lp c s ca i tng lp dn xut. Mt b khi to lp c s (s dng c php ging nh b khi to thnh vin) c th c cung cp trong constructor lp dn xut gi tng minh constructor lp c s, mt khc constructor lp dn xut s gi constructor mc nh lp c s. Cc constructor lp c s v cc ton t gn lp c s khng c k tha bi lp dn xut.Tuy nhin, cc constructor v cc ton t gn lp dn xut c th gi cc constructor v cc ton t gn lp c s. Mt constructor lp dn xut lun gi constructor lp c s ca n u tin khi to cc thnh vin lp c s ca lp dn xut. Nu constructor lp dn b b qua, constructor mc nh lp dn gi constructor lp c s. Cc destructor c gi theo th t ngc li th t gi cc constructor, v th destructor lp dn xut c gi trc destructor lp c s ca n. V d 5.4: Minh ha th t cc contructor v destructor lp c s v lp dn xut c gi v project c tn l CT5_4.PRJ
File POINT.H
1: //POINT.H 2: //nh ngha lp Point 3: #ifndef POINT_H 4: #define POINT_H 5: 6: class Point 7: { 8: public: 9: Point(float A= 0.0, float B= 0.0); 10: ~Point(); 11: protected: 12: float X, Y; 13: }; 14: 15: #endif
File POINT.CPP
1: //POINT.CPP 2: //nh ngha cc hm thnh vin lp Point 3: #include <iostream.h> 4: #include "point.h" 5: 6: Point::Point(float A, float B) 7: { 8: X = A; 9: Y = B; 10: cout << "Point constructor: " 11: << '[' << X << ", " << Y << ']' << endl; 12: } 13: 14: Point::~Point() 15: { 16: cout << "Point destructor: " 17: << '[' << X << ", " << Y << ']' << endl; 18: }
File CIRCLE.H
1: //CIRCLE.H
Trang 115
File CIRCLE.CPP
1: //CIRCLE.CPP 2: //nh ngha cc hm thnh vin lp Circle 3: #include "circle.h" 4: 5: Circle::Circle(float R, float A, float B): Point(A, B) 6: { 7: Radius = R; 8: cout << "Circle constructor: Radius is " 9: << Radius << " [" << A << ", " << B << ']' << endl; 10: } 11: 12: Circle::~Circle() 13: { 14: cout << "Circle destructor: Radius is " 15: << Radius << " [" << X << ", " << Y << ']' << endl; 16: }
File CT5_4.CPP
1: //CT5_4.CPP 2: //Chng trnh 5.4 3: #include <iostream.h> 4: #include "point.h" 5: #include "circle.h" 6: int main() 7: { 8: { 9: Point P(1.1, 2.2); 10: } 11: cout << endl; 12: Circle C1(4.5, 7.2, 2.9); 13: cout << endl; 14: Circle C2(10, 5, 5); 15: cout << endl; 16: return 0; 17: } Chng ta chy v d 5.4, kt qu hnh 5.8
Trang 116
Trang 117
File DERIVED.H 1: //DERIVED.H 2: //nh ngha lp Derived m k tha t nhiu lp c s (Base1 & Base2) 3: #ifndef DERIVED_H 4: #define DERIVED_H 5: 6: #include "base1.h" 7: #include "base2.h" 8: 9: class Derived : public Base1, public Base2 10: { 11: private: 12: float Real; 13: public: 14: Derived(int, char, float); 15: float GetReal() const; 16: friend ostream & operator <<(ostream &Output, const Derived &D); 17: }; 18: 19: #endif
Trang 118
File DERIVED.CPP 1: //DERIVED.H 2: //nh ngha lp Derived k tha t nhiu lp c s (Base1 & Base2) 3: #ifndef DERIVED_H 4: #define DERIVED_H 5: 6: #include "base1.h" 7: #include "base2.h" 8: 9: class Derived : public Base1, public Base2 10: { 11: private: 12: float Real; 13: public: 14: Derived(int, char, float); 15: float GetReal() const; 16: friend ostream & operator <<(ostream &Output, const Derived &D); 17: }; 18: 19: #endif File CT5_8.CPP 1: //CT5_8.CPP 2: //Chng trnh 5.8 3: #include <iostream.h> 4: #include "base1.h" 5: #include "base2.h" 6: #include "derived.h" 7: 8: int main() 9: { 10: Base1 B1(10), *Base1Ptr; 11: Base2 B2('Z'), *Base2Ptr; 12: Derived D(7, 'A', 3.5); 13: cout << "Object B1 contains integer " 14: << B1.GetData() << endl 15: << "Object B2 contains character " 16: << B2.GetData() << endl 17: << "Object D contains:" << endl << D << endl << endl; 18: cout << "Data members of Derived can be" 19: << " accessed individually:" << endl 20: << " Integer: " << D.Base1::GetData() << endl 21: << " Character: " << D.Base2::GetData() << endl 22: << "Real number: " << D.GetReal() << endl << endl; 23: cout << "Derived can be treated as an " 24: << "object of either base class:" << endl; 25: Base1Ptr = &D; 26: cout << "Base1Ptr->GetData() yields " 27: << Base1Ptr->GetData() << endl ; 28: Base2Ptr = &D; 29: cout << "Base2Ptr->GetData() yields " 30: << Base2Ptr->GetData() << endl; 31: return 0; 32: } Chng ta chy v d 5.8, kt qu hnh 5.13
Trang 119
Hnh 5.13: Kt qu ca v d 5.8 Vic k tha nhiu lp c s to ra mt lot cc im nhp nhng trong cc chng trnh C++. Chng hn, trong cc chng trnh ca v d 5.8, nu thc hin lnh: D.GetData(); th trnh bin dch (Borland C++ 3.1) s bo li: Member is ambiguous: Base1::GetData and Base1::GetData Bi v lp Derived k tha hai hm khc nhau c cng tn l GetData() t hai lp c s ca n. Base1::GetData() l hm thnh vin public ca lp c s public, v n tr thnh mt hm thnh vin public ca Derived. Base2::GetData() l hm thnh vin public ca lp c s public, v n tr thnh mt hm thnh vin public ca Derived. Do trnh bin dch khng th xc nh hm thnh vin GetData() ca lp c s no gi thc hin. V vy, chng ta phi s dng tn lp c s v ton t nh phm vi xc nh hm thnh vin ca lp c s lc gi hm GetData(). C php ca mt lp k tha nhiu lp c s: class <drived_class_name> : <type_of_inheritance> <base_class_name1> , <type_of_inheritance> <base_class_name2>, { .. }; Trnh t thc hin constructor trong a k tha: constructor lp c s xut hin trc s thc hin trc v cui cng mi ti constructor lp dn xut. i vi destructor c trnh t thc hin theo th t ngc li.
IV.
Chng ta khng th khai bo hai ln cng mt lp trong danh sch ca cc lp c s cho mt lp dn xut. Tuy nhin vn c th c trng hp cng mt lp c s c cp nhiu hn mt ln trong cc lp t tin ca mt lp dn xut. iu ny pht sinh li v khng c cch no phn bit hai lp c s gc. V d 5.9: 1: //Chng trnh 5.9 2: #include <iostream.h> 3: class A 4: { 5: public: 6: int X1;
Trang 120
Hnh 5.14 y chng ta thy c hai lp c s A cho lp D, v trnh bin dch khng th no nhn bit c vic truy cp X1 c k tha thng qua B hoc truy cp X1 c k tha thng qua C. khc phc iu ny, chng ta ch nh mt cch tng minh trong lp D nh sau: Obj.C::X1=0; Tuy nhin, y cng ch l gii php c tnh chp v, bi thc cht X1 no trong trng hp no cng c. Gii php cho vn ny l khai bo A nh lp c s kiu virtual cho c B v C. Khi chng trnh v d 5.9 c vit li nh sau:
Trang 121
BI TP
Bi 1: Xy dng lp Stack vi cc thao tc cn thit. T hy dn xut t lp Stack i mt s nguyn dng sang h m bt k. Bi 2: Hy xy dng cc lp cn thit trong phn cp hnh 5.2 Bi 3: Hy xy dng cc lp cn thit trong phn cp hnh 5.3 tnh din tch (hoc din tch xung quanh) v th tch. Bi 4: Vit mt phn cp k tha cho cc lp Quadrilateral (hnh t gic), Trapezoid (hnh thang), Parallelogram (hnh bnh hnh), Rectangle (hnh ch nht), v Square (hnh vung). Trong Quadrilateral l lp c s ca phn cp.
Trang 122
TNH A HNH
I. DN NHP
Tnh a hnh (polymorphism) l kh nng thit k v ci t cc h thng m c th m rng d dng hn. Cc chng trnh c th c vit x l tng qut nh cc i tng lp c s cc i tng ca tt c cc lp tn ti trong mt phn cp. Kh nng cho php mt chng trnh sau khi bin dch c th c nhiu din bin xy ra l mt trong nhng th hin ca tnh a hnh tnh mun mu mun v ca chng trnh hng i tng, mt thng ip c gi i (gi n i tng) m khng cn bit i tng nhn thuc lp no. thc hin c tnh a hnh, cc nh thit k C++ cho chng ta dng c ch kt ni ng (dynamic binding) thay cho c ch kt ni tnh (static binding) ngay khi chng trnh bin dch c dng trong cc ngn ng c in nh C, Pascal,
II.
Khi xy dng cc lp ca mt chng trnh hng i tng to nn mt cu trc phn cp hoc cy ph h, ngi lp trnh phi chun b cc hnh vi giao tip chung ca cc lp . Hnh vi giao tip chung s c dng th hin cng mt hnh vi, nhng c cc hnh ng khc nhau, chnh l phng thc o. y l mt phng thc tn ti c hiu lc nhng khng c thc trong lp c s, cn trong cc lp dn xut. Nh vy phng thc o ch c xy dng khi c mt h thng cy ph h. Phng thc ny s c gi thc hin t thc th ca lp dn xut nhng m t v chng trong lp c s. Chng ta khai bo phng thc o bng thm t kha virtual pha trc. Khi cc phng thc c cng tn vi phng thc ny trong cc lp dn xut cng l phng thc o. V d 6.1: 1: //Chng trnh 6.1 2: #include <iostream.h> 3: 4: class Base 5: { 6: public: 7: virtual void Display() 8: { 9: cout<<"class Base"<<endl; 10: } 11: }; 12: 13: class Derived : public Base 14: { 15: public: 16: virtual void Display() 17: { 18: cout<<"class Derived"<<endl; 19: } 20: }; 21: 21: void Show(Base *B) 22: { 23: B->Display(); //Con tr B ch n phng thc Display() no (ca lp Base 24 //hoc lp Derived) ty vo lc chy chng trnh. 25: } 26: int main() 27: { 28: Base *B=new Base; 29: Derived *D=new Derived;
Trang 123
Hnh 6.1: Kt qu ca v d 6.1 Trong v d 6.1, lp c s Base c phng thc Display() c khai bo l phng thc o. Phng thc ny trong lp dn xut Derived c nh ngha li nhng cng l mt phng thc o. Tht ra, khng ra khng c khai bo virtual cho phng thc Display() ca lp Derived cng chng sao, trnh bin dch vn hiu l phng thc o. Tuy nhin, khai bo virtual r rng cc lp dn xut lm cho chng trnh trong sng, d hiu hn. Hai dng 30 v 31, chng ta bit chc phng thc Display() ca lp no c gi (ca lp Base hoc lp Derived). Nhng hai dng 32 v 33, nu khng c c ch kt ni ng, chng ta on rng vic gi hm Show() s lun lun ko theo phng thc Base::Display(). Qu vy, b i khai bo virtual cho phng thc Base::Display(), khi dng lnh: Show(D); gi n Base::Display() v i tng lp dn xut cng l i tng lp c s (ngha l tdb t ng chuyn i kiu: i tng D kiu Derived chuyn thnh kiu Base. Nh khai bo virtual cho phng thc Base::Display() nn s khng thc hin gi phng thc Base::Display() mt cch cng nhc trong hm Show() m chun b mt c ch mm do cho vic gi phng thc Display() ty thuc vo s xc nh kiu ca tham s vo lc chy chng trnh. C ch ra sao? Khi nhn thy c khai bo virtual trong lp c s, trnh bin dch s thm vo mi i tng ca lp c s v cc lp dn xut ca n mt con tr ch n bng phng thc o (virtual function table). Con tr c tn l vptr (virtual pointer). Bng phng thc o l ni cha cc con tr ch n on chng trnh bin dch ng vi cc phng thc o. Mi lp c mt bng phng thc o. Trnh bin dch ch lp bng phng thc o khi bt u c vic to i tng ca lp. n khi chng trnh chy, phng thc o ca i tng mi c ni kt v thi hnh thng qua con tr vptr. Trong v d 6.1, lnh gi hm: Show(D); i tng D thuc lp Derived tuy b chuyn i kiu thnh mt i tng thuc lp Base nhng n khng hon ton ging mt i tng ca Base chnh cng nh B. Nu nh con tr vptr trong B ch n v tr trn bng phng thc o ng vi phng thc Base::Display(), th con tr vptr trong D vn cn ch n phng thc Derived::Display() cho d D b chuyn kiu thnh Base. l l do ti sao lnh: Show(D); gi n phng thc Derived::Display(). Cc c trng ca phng thc o: Phng thc o khng th l cc hm thnh vin tnh. Mt phng thc o c th c khai bo l friend trong mt lp khc nhng cc hm friend ca lp th khng th l phng thc o. Khng cn thit phi ghi r t kha virtual khi nh ngha mt phng thc o trong lp dn xut ( cng chng nh hng g). s kt ni ng c thc hin thch hp cho tng lp dc theo cy ph h, mt khi phng thc no c xc nh l o, t lp c s n cc lp dn xut u phi nh ngha thng nht v tn, kiu
Trang 124
tr v v danh sch cc tham s. Nu i vi phng thc o lp dn xut, chng ta li s sut nh ngha cc tham s khc i mt cht th trnh bin dch s xem l phng thc khc. y chnh l iu kin kt ni ng. V d 6.2: 2: #include <iostream.h> 3: 4: class Base 5: { 6: public: 7: virtual void Print(int A,int B); 8: }; 9: 10: class Derived : public Base 11: { 12: public: 13: virtual void Print(int A,double D); 14: }; 15: 16: void Base::Print(int A,int B) 17: { 18: cout<<"A="<<A<<",B="<<B<<endl; 19: } 20: 21: void Derived::Print(int A,double D) 22: { 23: cout<<"A="<<A<<",D="<<D<<endl; 24: } 25: 26: void Show(Base *B) 27: { 28: B->Print(3,5); 29: } 30: 31: int main() 32: { 33: Base *B=new Base; 34: Derived *D=new Derived; 35: Show(B); //Base::Print() 36: Show(D); //Base::Print() 37: return 0; 38: } Chng ta chy v d 6.2, kt qu hnh 6.2
Hnh 6.2: Kt qu ca v d 6.2 Trong v d 6.2, trong lp c s Base v lp dn xut Derived u c phng thc o Print(). Nhng quan st k chng ta, phng thc Print() trong lp Derived c tham s th hai khc kiu vi phng thc Print() trong lp Base. V th, chng ta khng th ch i lnh dng 36 s gi n phng thc Derived::Print(int,double). Phng thc Derived::Print(int,double) nm ngoi ng dy phng thc o nn hm Show() ch lun gi n phng thc Derived::Print(int,int) m thi. Do c khai bo virtual i vi phng thc Derived::Print(int,double), chng ta c th ni phng thc ny s m u cho mt ng dy phng thc o Print(int,double) mi nu sau lp Derived cn c cc lp dn xut ca n.
Trang 125
Hnh 6.3 Nh , vi hm sau: void Show(A* a) { a->Print(); } chng ta c th truyn i tng kiu cho n (A, B, C, D hoc E) m vn gi n ng phung thc Print() ph hp d kiu ca i tng lc bin dch vn cn cha bit. Vi vai tr "lt ng" nh vy, phng thc A::Print() c th chng c ni dung g c
Trang 126
Phng thc o Print() by gi l phng thc thun o phng thc c tn c gn bi gi tr zero. Lp A cha phng thc thun o c gi l lp tru tng. V d 6.3: 1: //Chng trnh 6.3 2: #include <iostream.h> 3: 4: class A 5: { 6: public: 7: virtual void Print()=0; //Phng thc thun o 8: }; 9: 10: class B : public A 11: { 12: public: 13: virtual void Print() 14: { 15: cout<<"Class B"<<endl; 16: } 17: }; 18: 19: class C : public B 20: { 21: public: 22: virtual void Print() 23: { 24: cout<<"Class C"<<endl; 25: } 26: }; 27: 28: void Show(A *a) 29: { 30: a->Print(); 31: } 32: 33: int main() 34: { 35: B *b=new B; 36: C *c=new C; 37: Show(b); //B::Print() 38: Show(c); //C::Print() 39: return 0; 40: } Chng ta chy v d 6.3, kt qu hnh 6.4
Hnh 6.4: Kt qu ca v d 6.3 Lp A c to ra lm c s cho vic hnh thnh cc lp con chu (B v C). Nh c Phng thc o Print() t lp A cho ti lp C, tnh a hnh c th hin.
Lu :
Chng ta khng th to ra mt i tng ca lp tru tng, nhng hon ton c th to ra mt con tr tr n lp ny (v con tr khng phi l i tng thuc lp) hoc l mt tham chiu.
Trang 127
Nu trong lp k tha t lp tru tng chng ta khng nh ngha phng thc thun o, do tnh k tha n s bao hm phng thc thun o ca lp c s, nn lp dn xut ny s tr thnh lp tru tng. Theo nh ngha lp tru tng, nu trong lp dn xut (t lp c s tru tng) chng ta nh ngha thm mt phng thc thun o khc, lp ny cng s tr thnh lp tru tng.
IV.
CC THNH VIN O CA MT LP
IV.1. Ton t o
Ton t thc cht cng l mt hm nn chng ta c th to ra cc ton t o trong mt lp. Tuy nhin do a nng ha khi to mt ton t cn ch n cc kiu ca cc ton hng phi s dng kiu ca lp c s gc c ton t o. V d 6.4: a nng ha ton t vi hm ton t l phng thc o. 1: //Chng trnh 6.4: Ton t o 2: #include <iostream.h> 3: 4: class A 5: { 6: protected: 7: int X1; 8: public: 9: A(int I) 10: { 11: X1=I; 12: } 13: virtual A& operator + (A& T); 14: virtual A& operator = (A& T); 15: virtual int GetA() 16: { 17: return X1; 18: } 19: virtual int GetB() 20: { 21: return 0; 22: } 23: virtual int GetC() 24: { 25: return 0; 26: } 27: void Print(char *St) 28: { 29: cout<<St<<":X1="<<X1<<endl; 30: } 31: }; 32: 33: class B : public A 34: { 35: protected: 36: int X2; 37: public: 38: B(int I,int J):A(I) 39: { 40: X2=J; 41: } 42: virtual A& operator + (A& T); 43: virtual A& operator = (A& T); 44: virtual int GetB()
Trang 128
Trang 129
Trang 130
i tng khc thuc cng lp to ra th con tr vptr cn ti. Chnh v vy bng phng thc o phi c to ra trc khi gi thc hin constructor, nn constructor khng th l phng thc o. Ngc li do mt lp ch c mt bng phng thc o nn khi mt i tng thuc lp b hy b, bng phng thc o vn cn , v con tr vptr vn cn . Hn na, destructor c gi thc hin trc khi vng nh dnh cho i tng b thu hi, do destructor c th l phng thc o. Tuy nhin, constructor ca mt lp c th gi phng thc o khc. iu ny hon ton khng c g mu thun vi c ch kt ni ng. V d 6.5: 1: //Chng trnh 6.5: Destructor o 2: #include <iostream.h> 3: 4: class Base 5: { 6: public: 7: virtual ~Base() 8: { 9: cout<<"~Base"<<endl; 10: } 11: }; 12: 13: class Derived:public Base 14: { 15: public: 16: virtual ~Derived() 17: { 18: cout<<"~Derived"<<endl; 18: } 19: }; 20: 21: int main() 22: { 23: Base *B; 24: B = new Derived; 25: delete B; 26: return 0; 27: } Chng ta chy v d 6.5, kt qu hnh 6.6
Hnh 6.6: Kt qu ca v d 6.5 Nu destructor khng l phng thc o th khi gii phng i tng B ch c destructor ca lp c s c gi m thi nhng khi destructor l phng thc o th khi gii phng i tng B ( dng 25) destructor ca lp dn xut c gi thc hin ri n destructor ca lp c s.
Trang 131
BI TP
Bi 1: Hy xy dng cc lp cn thit trong phn cp hnh 5.3 tnh din tch (hoc din tch xung quanh) v th tch trong lp Shape l lp c s tru tng. Bi 2: Hy sa i h thng lng ca chng trnh v d 6.6 bng thm cc thnh vin d liu BrithData (mt i tng kiu Date) v DepartmentCode (kiu int) vo lp Employee. Gi s lng ny c x l mt ln trn mt thng. Sau , chng trnh tnh bng lng cho mi Employee (tnh a hnh), cng thm 100.00$ tin thng vo tng s lng ca mi ngi nu y l thng m ngy sinh ca Employee xy ra. Bi 3: Ci t cc lp trong cy ph h lp sau:
Trang 132
II.
Trang 133
III. CCH TM LP
Lp nn c tm t phm vi bi ton cn gii quyt, v vy tn ca lp cng nn t tn cc i tng thc m chng ta biu din. tm ra lp cho bi ton, chng ta cn tr li cc cu hi sau: C thng tin no cn lu tr hay phn tch khng? Nu c bt k thng tin no cn phi lu tr, bin i, phn tch hoc x l th chnh l mt lp d nh cn xy dng. C h thng bn ngoi bn ngoi hay khng? H thng ngoi c th c xem nh cc lp m h thng ca chng ta cha hoc tng tc vi n. C cc mu thit k, th vin lp, thnh phn, hay khng? Cc thnh phn ny c xy dng t cc project trc , t cc ng nghip hoc cc nh sn xut? C thit b no m h thng phi p ng? Bt c thit b no c ni vi h thng c th chuyn thnh lp d tuyn. Tc nhn ng vai tr nh th no trong h thng? Cc vai din ny nn c xem l lp nh ngi s dng, khch hang, ngi iu khin h thng,
IV.
thit k mt chng trnh theo hng i tng, chng ta phi tri qua bn bc sau, t chng ta xy dng c mt cy ph h mang tnh k tha v cc mi quan h gia cc i tng: Xc nh cc dng i tng (lp) ca bi ton (nh dang cc i tng). Tm kim cc c tnh chung (d liu chung) trong cc dng i tng ny, nhng g chng cng nhau chia x. Xc nh c lp c s da trn c s cc c tnh chung ca cc dng i tng. T lp c s, s dng quan h tng qut ha c t trong vic a ra cc lp dn xut cha cc thnh phn, nhng c tnh khng chung cn li ca dng i tng. Bn cnh , chng ta cn a ra cc lp c quan h vi cc lp c s v lp dn xut; cc quan h ny c th l quan h kt hp, quan h tp hp li, quan h ph thuc. Vi cc bc trn chng ta c c cy ph h v quan h gia cc lp. i vi h thng phc tp hn, chng ta cn phi phn tch gii quyt c vn t ra theo trt t sau: Phn tch mt cch cn thn v cc i tng ca bi ton theo trt t t di ln (bottom up). Tm ra nhng g tn ti chung gia cc i tng, nhm cc c tnh ny li c cc lp c s nh hnh 7.1
Hnh 7.1 Tip tc theo hng t di ln, chng ta thit k c cc i tng ph hp nh hnh 7.2
Trang 134
Hnh 7.2
Bng cch ny, chng ta tip tc tm cc c tnh chung cho n tt cng ca cc i tng. Sau ci t theo hng i tng t trn xung bng cch ci t lp c s chung nht. Tip tc ci t cc lp dn xut trn c s cc c tnh chung ca tng nhm i tng. Cho n khi tt c cc dng i tng ca h thng c ci t xong c cy ph h.
V.
CC V D
V d 7.1: Tnh tin lng ca cc nhn vin trong c quan theo cc dng khc nhau. Dng ngi lao ng lnh lng t ngn sch Nh nc c gi l cn b, cng chc (dng bin ch). Dng ngi lao ng lnh lng t ngn sch ca c quan c gi l ngi lm hp ng. Nh vy h thng chng ta c hai i tng: bin ch v hp ng. Hai loi i tng ny c c tnh chung l vin chc lm vic cho c quan. T y c th to nn lp c s qun l mt vin chc (lp Nguoi) bao gm m s, h tn v lng. Sau chng ta xy dng cc lp cn li k tha t lp c s trn: Lp dnh cho cn b, cng chc (lp BienChe) gm cc thuc tnh: h s lng, tin ph cp chc v. Lp dnh cho ngi lm hp ng (lp HopDong) gm cc thuc tnh: tin cng lao ng, s ngy lm vic trong thng, h s vt gi.
Hnh 7.3
Trang 135
File PERSON.CPP 1: //PERSON.CPP 2: nh ngha hm thnh vin cho lp Nguoi 3: #include <iomanip.h> 4: #include <string.h> 5: #include "person.h" 6: 7: Nguoi::Nguoi() 8: { 9: strcpy(HoTen,""); 10: strcpy(MaSo,""); 11: Luong=0; 12: } 13: 14: void Nguoi::Xuat() const 15: { 16: cout<<"Ma so:"<<MaSo<<",Ho va ten:"<<HoTen 17: #9; <<",Luong:"<<setiosflags(ios::fixed)<<setprecision(0)<<Luong<<endl; 18: } 19: 20: void Nguoi::Nhap() 21: { 22: cout<<"Ma so:"; 23: cin>>MaSo; 24: cin.ignore(); 25: cout<<"Ho va ten:"; 26: cin.getline(HoTen,MAX_TEN); 27: }
Trang 136
Trang 137
File CONTRACT.CPP: 1: //CONTRACT.CPP 2: nh ngha hm thnh vin cho lp HopDong 3: #include "contract.h" 4: 5: HopDong::HopDong() 6: { 7: TienCong=NgayCong=HeSoVuotGio=0; 8: } 9: 10: void HopDong::Nhap() 11: { 12: Nguoi::Nhap(); 13: cout<<"Tien cong:"; 14: cin>>TienCong; 15: cout<<"Ngay cong:"; 16: cin>>NgayCong; 17: cout<<"He so vuot gio:"; 18: cin>>HeSoVuotGio; 19: } 20: 21: void HopDong::TinhLuong() 22: { 23: Luong=TienCong*NgayCong*(1+HeSoVuotGio); 24: } File CT7_1.CPP: 1: //CT7_1.CPP 2: //Chng trnh 7.1 3: #include <iostream.h> 4: #include <ctype.h> 5: #include "person.h" 6: #include "staff.h" 7: #include "contract.h" 8: 9: int main() 10: { 11: Nguoi *Ng[100]; 12: int N=0; 13: char Chon,Loai; 14: do 15: { 16: cout<<"Bien che hay Hop dong (B/H)? "; 17: cin>>Loai; 18: Loai=toupper(Loai); 19: if (Loai=='B') 20: Ng[N]=new BienChe; 21: else 22: Ng[N]=new HopDong;
Trang 138
Hnh 7.4: Kt qu ca v d 7.1 V d 7.2: Gi s cui nm hc cn trao gii thng cho cc sinh vin xut sc v cc ging vin c nhiu cng trnh khoa hc c cng b trn tp ch. Cc lp trong cy ph h nh hnh 7.5: lp Nguoi qun l h s c nhn, lp SinhVien qun l v sinh vin v lp GiangVien qun l ging vin. Lp Nguoi: D liu h v tn. Phng thc kim tra kh nng c khen thng. y l phng thc thun o. Phng thc xut. y l phng thc thun o. Lp SinhVien: D liu im trung bnh. Phng thc kim tra kh nng c khen thng. Phng thc xut. Lp GiangVien: D liu im trung bnh. Phng thc kim tra kh nng c khen thng. Phng thc xut.
Trang 139
Hnh 7.5 File PERSON.H 1: //PERSON.H 2: nh ngha lp Nguoi 3: #ifndef PERSON_H 4: #define PERSON_H 5: 6: #include <iostream.h> 7: 8: #define MAX_TEN 50 9: 10: class Nguoi 11: { 12: protected: 13: char HoTen[MAX_TEN]; 14: public: 15: Nguoi(char *HT); 16: virtual int DuocKhenThuong() const=0; 17: virtual void Xuat() const=0; 18: }; 19: 20: #endif File PERSON.CPP: 1: //PERSON.CPP 2: nh ngha hm thnh vin cho lp Nguoi 3: #include <string.h> 4: #include "person.h" 5: 6: Nguoi::Nguoi(char *HT) 7: { 8: strcpy(HoTen,HT); 9: } File STUDENT.H: 1: //STUDENT.H 2: nh ngha lp SinhVien 3: #ifndef STUDENT_H 4: #define STUDENT_H 5:
Trang 140
Trang 141
18: }
File CT7_2.CPP: 1: //CT7_2.CPP 2: //Chng trnh 7.2 3: #include <ctype.h> 4: #include "person.h" 5: #include "student.h" 6: #include "teacher.h" 7: 8: int main() 9: { 10: Nguoi *Ng[100]; 11: int N=0; 12: char Chon,Loai; 13: char HoTen[MAX_TEN]; 14: do 15: { 16: cout<<"Ho va ten:"; 17: cin.getline(HoTen,MAX_TEN); 18: cout<<"Sinh vien hay Giang vien(S/G)? "; 19: cin>>Loai; 20: Loai=toupper(Loai); 21: if (Loai=='S') 22: { 23: float DTB; 24: cout<<"Diem trung binh:"; 25: cin>>DTB; 26: Ng[N++]=new SinhVien(HoTen,DTB); 27: } 28: else 29: { 30: int SoBaiBao; 31: cout<<"So bai bao:"; 32: cin>>SoBaiBao; 33: Ng[N++]=new GiangVien(HoTen,SoBaiBao); 34: } 35: cout<<"Tiep tuc (C/K)? "; 36: cin>>Chon; 37: Chon=toupper(Chon); 38: cin.ignore(); 39: if ((N==100)||(Chon=='K')) 40: break; 41: } 42: while (1);
Trang 142
Hnh 7.6: Kt qu ca v d 7.2 V d 7.3: Gi s cn phi to cc hnh: hnh trn v hnh ch nht c t theo hai mu red v blue. Xy dng mt cy ph h qun l cc hnh ny. Trc ht chng ta cn c lp c s Shape lu tr thng tin chung cho cc hnh, sau l hai lp dn xut Rectangle v hnh hnh ch nht v Circle v hnh trn nh hnh 7.7 Lp Shape: Ta tm. Mu ng bin. Mu t. Phng thc thit lp t mu. Phng thc v hnh. y l phng thc thun o. Lp Rectangle: Chiu di v chiu rng. Phng thc v hnh. Lp Circle: Bn knh. Phng thc v hnh.
Trang 143
CC DNG NHP/XUT
I. DN NHP
Cc th vin chun C++ cung cp mt tp hp cc kh nng nhp/xut rng ln. Trong chng ny chng ta tm hiu mt phm vi ca cc kh nng phn ln cc thao tc nhp xut. Phn ln cc c tnh nhp xut m t y theo hng i tng. Kiu ny ca nhp/xut thi hnh vic s dng cc c tnh khc ca C++ nh cc tham chiu, a nng ha hm v a nng ha ton t. Nh chng ta s thy, C++ s dng nhp/xut kiu an ton (type safe). Mi thao tc nhp/xut c thc hin mt cch t ng theo li nhy cm v kiu d liu. Mi thao tc nhp xut c c nh ngha thch hp x l mt kiu d liu c th th hm c gi x l kiu d liu . Nu khng c i snh gia kiu ca d liu hin ti v mt hm cho vic x l kiu d liu , mt ch dn li bin dch c thit lp. V th d liu khng thch hp khng th "lch" qua h thng. Cc ngi dng c th ch nh nhp/xut ca cc kiu d liu do ngi dng nh ngha cng nh cc kiu d liu chun. Tnh m rng ny l mt trong cc c tnh quan trng ca C++.
II.
CC DNG(STREAMS)
Nhp/xut C++ xy ra trong cc dng ca cc byte. Mt dng n gin l mt dy tun t cc byte. Trong cc thao tc nhp, cc byte chy t thit b (chng hn: mt bn phm, mt a, mt kt ni mng) ti b nh chnh. Trong cc thao tc xut, cc byte chy t b nh chnh ti mt thit b (chng hn: mt mn hnh, mt my in, mt a, mt kt ni mng). ng dng lin kt vi cc byte. Cc byte c th biu din cc k t ASCII, bn trong nh dng d liu th, cc nh ha, ting ni s, hnh nh s hoc bt c loi thng tin mt ng dng c th i hi. Cng vic ca cc c ch h thng nhp/xut l di chuyn cc byte t cc thit b ti b nh v ngc li theo li chc v ng tin cy. Nh th cc di chuyn thng bao gm s di chuyn c hc nh s quay ca mt a hoc mt bng t, hoc nhn phm ti mt bn phm. Thi gian cc di chuyn ny thng thng khng l so vi thi gian b x l thao tc d liu ni ti. V th, cc thao tc nhp/xut i hi c k hoch cn thn v iu chnh bo m s thi hnh ti a. C++ cung cp c hai kh nng nhp/xut "mc thp" (low-level) v "mc cao" (high-level). Cc kh nng nhp/xut mc thp (ngha l nhp/xut khng nh dng) ch nh c th s byte no phi c di chuyn hon ton t thit b ti b nh hoc t b nh ti thit b. Trong cc di chuyn nh th, byte ring r l mc cn quan tm. V th cc kh nng mc thp cung cp tc cao, cc di chuyn dung lng cao, nhng cc kh nng ny khng phi l tin li lm cho lp trnh vin. Cc lp trnh vin u thch quan im nhp/xut mc cao, ngha l nhp/xut c nh dng, trong cc byte c nhm thnh cc n v c ngha nh cc s nguyn, cc s chm ng, cc k t, cc chui v cc kiu do ngi dng nh ngha.
Trang 144
Header <fstream.h> cha cc thng tin quan trng cho cc thao tc x l file do ngi dng kim Header <strstream.h> cha cc thng tin quan trng cho vic thc hin cc nh dng trong b nh. iu ny tng t x l file, nhng cc thao tc nhp/xut ti v t mng cc k t hn l file. Header <stdiostream.h> cha cc thng tin quan trng cho cc chng trnh trn cc kiu nhp/xut ca C v C++. Cc chng trnh mi phi trnh kiu nhp/xut C, nhng cn th hiu chnh cc chng trnh C, hoc tin trin chng trnh C thnh C++.
Hnh 8.1: Mt phn ca phn cp lp dng nhp/xut a nng ha ton t cung cp mt k hiu thch hp cho vic thc hin nhp/xut. Ton t dch chuyn tri (<<) c a nng ha nh r dng xut v c tham chiu nh l ton t chn dng. Ton t dch chuyn phi (>>) c a nng ha nh r dng nhp v c tham chiu nh l ton t trch dng. Cc ton t ny c s dng vi cc i tng dng chun cin, cout, cerr v clog, v bnh thng vi cc i tng dng do ngi dng nh ngha. cin l mt i tng ca lp istream v c ni l "b rng buc ti" (hoc kt ni ti) thit b nhp chun, thng thng l bn phm. Ton t trch dng c s dng lnh sau to ra mt gi tr cho bin nguyn X c nhp t cin ti b nh:
cout << X;
cerr l mt i tng ca lp ostream v c ni l "b rng buc ti" thit b li chun. Vic xut i tng cerr l khng vng m. iu ny c ngha l mi ln chn ti cerr to ra kt xut ca n xut hin ngay tc th; iu ny thch hp cho vic thng bo nhanh chng ngi dng khi c s c. clog l mt i tng ca lp ostream v c ni l "b rng buc ti" thit b li chun. Vic xut i tng cerr l c vng m. iu ny c ngha l mi ln chn ti cerr to ra kt xut ca n c gi trong vng m cho n khi vng m y hoc vng m c flush. Vic x l file ca C++ s dng cc lp ifstream thc hin cc thao tc nhp file, ofstream cho cc thao tc xut file, v fstream cho cc thao tc nhp/xut file. Lp ifstream k tha t istream, ofstream lp k tha t ostream, v lp fstream k tha t iostream.
Trang 145
Hnh 8.3: Kt qu ca v d 8.1 V d 8.2: Minh ha xut chui s dng nhiu lnh chn dng. 1: //Chng trnh 8.2:Xut mt chui s dng hai chn dng 2: #include <iostream.h> 3: 4: int main() 5: { 6: cout<<"Welcome to"; 7: cout<<"C++!\n"; 8: return 0; 9: } Chng ta chy v d 8.2, kt qu hnh 8.4
Trang 146
Hnh 8.4: Kt qu ca v d 8.2 Hiu qu ca chui thot \n (newline) cng t c bi b x l dng (stream manipulator) endl (end line). V d 8.3: 1: //Chng trnh 8.3:S dng b x l dng endl 2: #include <iostream.h> 3: 4: int main() 5: { 6: cout<<"Welcome to"; 7: cout<<"C++!"; 8: cout<<endl; 9: return 0; 10: } Chng ta chy v d 8.3, kt qu hnh 8.5
Hnh 8.5: Kt qu ca v d 8.3 B x l dng endl a ra mt k t newline, v hn na, flush vng m xut (ngha l to ra vng m xut c xut ngay lp tc k c n cha y). Vng m xut cng c th c flush bng: cout<<flush; V d 8.4: Cc biu thc c th xut 1: //Chng trnh 8.4: Xut gi tr biu thc. 2: #include <iostream.h> 3: 4: int main() 5: { 6: cout<<"47 plus 53 is "; 7: cout<< (47+53); 8: cout<<endl; 9: return 0; 10: } Chng ta chy v d 8.4, kt qu hnh 8.6
Trang 147
Hnh 8.7: Kt qu ca v d 8.5 Nhiu chn dng dng 6 trong v d 8.5 c thc thi nu c th vit: (((cout<<"47 plus 53 is ")<< (47+53))<<endl); ngha l << lin kt t tri qua phi. Loi lin kt ca cc ton t chn dng c php bi v ton t a nng ha << tr v mt tham chiu ti i tng ton hng bn tri ca n, ngha l cout. V th biu thc t trong ngoc bn cc tri: (cout<<"47 plus 53 is ") xut ra mt chui ch nh v tr v mt tham chiu ti cout. iu ny cho php biu thc t trong ngoc gia c c lng: (cout<< (47+53)) xut gi tr nguyn 100 v tr v mt tham chiu ti cout. Sau biu thc t trong ngoc bn cc phi c c lng: cout<<endl; xut mt newline, flush cout v tr v mt tham chiu ti cout. Tr v cui cng ny khng c s dng.
8.3.3 Xut cc bin kiu char *: Trong nhp/xut kiu C, tht cn thit cho lp trnh vin cung cp thng tin kiu. C++ xc nh cc kiu d liu mt cch t ng mt ci tin hay hn C. i khi iu ny l mt tr ngi. Chng hn, chng ta bit rng mt chui k t l kiu char *. Mc ch ca chng ta in gi tr ca con tr , ngha l a ch b nh ca k t u tin ca chui . Nhng ton t << c a nng ha in d liu ca kiu char * nh l chui kt thc k t null. Gii php l p con tr thnh kiu void *.
V d 8.6: In a ch lu trong mt bin kiu char * Chng ta chy v d 8.6, kt qu hnh 8.8
Trang 148
IV.
DNG NHP
Dng nhp c th c thc hin vi ton t trch, ngha l ton t a nng ha >>. Bnh thng ton t ny b qua cc k t khong trng (nh cc blank, tab v newline). trong dng nhp. Ton t trch dng tr v zero (false) khi kt thc file (end-of-file) c bt gp trn mt dng; Ngc li, ton t trch dng tr v mt tham chiu ti i tng xuyn qua n c ko theo. Mi dng cha mt tp cc bit trng thi (state bit) s dng iu khin trng thi ca dng (ngha l nh dng, n nh cc trng thi li,). Trch dng sinh ra failbit ca dng c thit lp nu d liu ca kiu sai c nhp, v sinh ra badbit ca dng c thit lp nu thao tc sai.
Hnh 8.9: Kt qu ca v d 8.7 Mt cch ph bin nhp mt dy cc gi tr l s dng ton t trch dng trong vng lp while. Ton t trch dng tr v false (0) khi end-of-file c bt gp: V d 8.8: 2: #include <iostream.h> 3: 4: int main() 5: { 6: int Grade, HighestGrade = -1; 7: cout << "Enter grade (enter end-of-file to end): "; 8: while (cin >> Grade) 9: { 10: if (Grade > HighestGrade ) 11: HighestGrade = Grade; 12: cout << "Enter grade (enter end-of-file to end): "; 13: } 14: cout <<endl<< "Highest grade is:" << HighestGrade<< endl; 15: return 0; 16: }
Trang 149
Trang 150
V d 8.10: S dng hm get() dng (5) 1: //Chng trnh 8.10 2: #include <iostream.h> 3: 4: const int SIZE = 80; 5: 6: int main() 7: { 8: char Buffer1[SIZE], Buffer2[SIZE]; 9: cout << "Enter a sentence:" << endl; 10: cin >> Buffer1; 11: cout << endl << "The string read with cin was:" << endl 12: << Buffer1 << endl << endl; 13: cin.get(Buffer2, SIZE); 14: cout << "The string read with cin.get was:" << endl 15: << Buffer2 << endl; 16: return 0; 17: } Chng ta chy v d 8.10, kt qu hnh 8.12
(1) istream& getline(unsigned char * puch, int len, char delim=\n); (2) istream& getline(signed char * psch, int len, char delim=\n);
V d 8.11: S dng hm getline() 1: //Chng trnh 8.11 2: #include <iostream.h> 3: 4: const SIZE = 80; 5: 6: int main() 7: { 8: char Buffer[SIZE]; 9: cout << "Enter a sentence:" << endl; 10: cin.getline(Buffer, SIZE); 11: cout << endl << "The sentence entered is:" << endl 12: << Buffer << endl; 13: return 0; 14: } Chng ta chy v d 8.11, kt qu hnh 8.13
Trang 151
V.
Hm istream::read(): istream& read(unsigned char* puch, int nCount); istream& read(signed char* psch, int nCount);
Trch cc byte t dng cho n khi gii hn nCount t n hoc cho n khi end- of-file t n. Hm ny c ch cho dng nhp nh phn.
Hm ostream::write(): ostream& write(const unsigned char* puch, int nCount); ostream& write(const signed char* psch, int nCount);
Chn nCount byte vo t vng m (c tr bi puch v psch) vo dng. Nu file c m ch text, cc k t CR c th c chn vo. Hm ny c ch cho dng xut nh phn. Chng hn:
Trang 152
VI.
thc thi x l file trong C++, cc chng trnh phi include tp tin <iostream.h> v <fstream.h>. Header <fstream.h> gm nh ngha cho cc lp dng ifstream cho nhp (c) t mt file, ofstream cho xut (ghi) ti mt file) v fstream cho nhp/xut (c/ghi) ti mt file. Cc file c m bng cch to cc i tng ca cc lp dng ny. Cy ph h ca cc lp ny hnh 8.2. Constructor ca lp ofstream: (1) ofstream(); (2) ofstream(const char* szName,int nMode=ios::out,int nProt=filebuf::openprot); (3) ofstream(int fd); (4) ofstream(filedesc fd, char* pch, int nLength); Trong : szName: Tn file c m. nMode: Mt s nguyn cha cc bit mode nh ngha l kiu liy k ca ios. C th kt hp bng ton t |. Tham s ny c th mt trong cc gi tr sau: Mode ios::app ngha Hm di chuyn con tr file ti end-of-file. Khi cc byte mi c ghi ln file, chng lun lun ni thm vo cui, ngay c v tr c di chuyn vi hm ostream::seekp(). Hm di chuyn con tr file ti end-of-file. Khi byte mi u tin c ghi ln file, chng lun lun ni thm vo cui, nhng khi cc byte k tip c ghi, chng ghi vo v tr hin hnh. M file c.Vi dng ifstream, vic m file ng nhin c thc hin ch ny. M file c.Vi dng ofstream, vic m file ng nhin c thc hin ch ny. Xa file hin c trn a v to file mi cng tn. Cng c hiu y l cht ct file c, lm cho kch thc ca n bng 0, chun b ghi ni dung mi. Mode ny c p dng nu ios::out c ch nh v ios::app, ios::ate, v ios::in khng c ch nh. Nu file khng tn ti th thao tc m tht bi. Nu file tn ti th thao tc m tht bi. M file ch nh phn (mc nh l ch vn bn).
ios::ate
ios::in
ios::out
ios::trunc
Trang 153
pch: Con tr tr ti vng dnh ring chiu di nLength. Gi tr NULL (hoc nLength=0) dn n dng khng vng m. nLength: Chiu di tnh theo byte ca vng dnh ring (0=khng vng m). Dng (1) xy dng mt i tng ofstream m khng m file. Dng (2) xy dng mt i tng ofstream v m file ch nh. Dng (3) xy dng mt i tng ofstream v gn (attach) vi mt file m. Dng (4) xy dng mt i tng ofstream m lin kt vi i tng filebuf. i tng filebuf c gn ti file m v vng dnh ring. Constructor ca lp ifstream: (1) ifstream(); (2) ifstream(const char* szName,int nMode=ios::in,int nProt=filebuf::openprot); (3) ifstream(int fd); (4) ifstream(filedesc fd, char* pch, int nLength); Dng (1) xy dng mt i tng ifstream m khng m file. Dng (2) xy dng mt i tng ifstream v m file ch nh. Dng (3) xy dng mt i tng ifstream v gn (attach) vi mt file m. Dng (4) xy dng mt i tng ofstream m lin kt vi i tng filebuf. i tng filebuf c gn ti file m v vng dnh ring. Constructor ca lp fstream: (1) fstream(); (2) fstream(const char* szName,int nMode,int nProt=filebuf::openprot); (3) fstream(int fd); (4) fstream(filedesc fd, char* pch, int nLength); Dng (1) xy dng mt i tng fstream m khng m file. Dng (2) xy dng mt i tng fstream v m file ch nh. Dng (3) xy dng mt i tng fstream v gn (attach) vi mt file m. Dng (4) xy dng mt i tng ofstream m lin kt vi i tng filebuf. i tng filebuf c gn ti file m v vng dnh ring. Nu chng ta s dng constructor dng (1) th chng ta dng hm open() m file: Hm ofstream::open(): void open(const char* szName,int nMode=ios::out,int nProt=filebuf::openprot); Hm ifstream::open(): void open(const char* szName,int nMode=ios::in,int nProt=filebuf::openprot); Hm fstream::open(): void open(const char* szName,int nMode,int nProt=filebuf::openprot); ng file chng ta dng hm close(), hm ny cc lp ifstream, ofstream, v fstream u c dng: void close();
Trang 154
Hm seekg(): (seek get) (1) istream& seekg(streampos pos); (2) istream& seekg(streamoff off,ios::seek_dir dir); Trong : + pos: V tr mi. streampos l tng ng typedef vi long. + off: Gi tr offset mi. l tng ng typedef vi long. + dir: hng seek. C mt trong cc tr sau: ios::begin ios::cur Seek t bt u ca dng. Seek t v tr hin hnh ca dng Seek t cui ca dng
ios::end Hm tellg(): (tell get) streampos tellg(); Hm tr v v tr hin hnh ca con tr file. Lp ostream:
Hm seekp(): (seek put) (1) ostream& seekp(streampos pos); (2) ostream& seekp(streamoff off,ios::seek_dir dir); Hm tellp(): (tell put) streampos tellp(); Hm tr v v tr hin hnh ca con tr file.
Trang 155
Hnh 8.30: Kt qu ca v d 8.28 V d 8.29: c file vn bn to v d 8.28 v xut ra mn hnh. 1: //Chng trnh 8.29 2: #include <iostream.h> 3: #include <fstream.h> 4: #include <iomanip.h> 5: #include <stdlib.h> 6: 7: void OutputLine(int, char*, float); 8: 9: int main() 10: { 11: ifstream InClientFile("clients.dat", ios::in); 12: if (!InClientFile) 13: { 14: cerr << "File could not be opened" << endl; 15: exit(1); 16: } 17: int Account; 18: char Name[10]; 19: float Balance; 20: cout << setiosflags(ios::left) << setw(10) << "Account" 21: << setw(13) << "Name" << "Balance" << endl; 22: while (InClientFile >> Account >> Name >> Balance) 23: OutputLine(Account, Name, Balance); 24: InClientFile.close(); 25: return 0;
Trang 156
26: } 27: 28: void OutputLine(int Acct, char *Name, float Bal) 29: { 30: cout << setiosflags(ios::left) << setw(10) << Acct 31: << setw(13) << Name << setw(7) << etprecision(2) 32:<< setiosflags(ios::showpoint | ios::right) << Bal << endl; 33: } Chng ta chy v d 8.29, kt qu hnh 8.31
Hnh 8.31: Kt qu ca v d 8.29 Do lp ifstream dn xut t lp istream nn chng ta c th dng cc hm istream::get(), istream::getline(). V d 8.30: c file vn bn to v d 8.28 bng hm istream::getline() v xut ra mn hnh. 1: //Chng trnh 8.30 2: #include <iostream.h> 3: #include <fstream.h> 4: #include <iomanip.h> 5: #include <stdlib.h> 6: 7: #define MAXLINE 256 8: 9: int main() 10: { 11: ifstream InClientFile("clients.dat", ios::in); 12: if (!InClientFile) 13: { 14: cerr << "File could not be opened" << endl; 15: exit(1); 16: } 17: char Line[MAXLINE]; 18: while (!InClientFile.eof()) 19: { 20: InClientFile.getline(Line,MAXLINE-1); 21: cout<<Line<<endl; 22: } 23: InClientFile.close(); 24: return 0; 25: } Chng ta chy v d 8.30, kt qu hnh 8.32.(ni dung tp tin clients.dat)
Trang 157
i vi file nh phn (cn gi l file truy cp ngu nhin), chng ta m ch ios::binary. i vi file nh phn, chng ta c th dng hm istream::get() v ostream::put() c v ghi tng byte mt. c v ghi nhiu byte cng lc chng ta c th dng istream::read() v ostream::write(). V d 8.31: Ly li v d 8.28 nhng lu d liu di dng nh phn. 1: //Chng trnh 8.31 2: #include <iostream.h> 3: #include <fstream.h> 4: #include <stdlib.h> 5: 6: typedef struct 7: { 8: int Account; 9: char Name[10]; 10: float Balance; 11: }Client; 12: 13: int main() 14: { 15: ofstream OutClientFile("credit.dat", ios::out|ios::binary); 16: if (!OutClientFile) 17: { 18: cerr << "File could not be opened" << endl; 19: exit(1); 20: } 21: cout << "Enter the Account, Name, and Balance." << endl 22: << "Enter EOF to end input." << endl << "? "; 23: Client C; 24: while (cin >> C.Account >> C.Name >> C.Balance) 25: { 26: OutClientFile.write((char *)&C,sizeof(Client)); 27: cout << "? "; 28: } 29: OutClientFile.close(); 30: return 0; 31: } Chng ta chy v d 8.31, kt qu hnh 8.33 (ni dung tp tin credit.dat)
Hnh 8.33: Kt qu ca v d 8.31 V d 8.32: c file to v d 8.31 v xut ra mn hnh. 1: //Chng trnh 8.32 2: #include <iostream.h> 3: #include <fstream.h> 4: #include <iomanip.h> 5: #include <stdlib.h> 6:
Trang 158
7: typedef struct 8: { 9: int Account; 10: char Name[10]; 11: float Balance; 12: }Client; 13: 14: void OutputLine(Client); 15: 16: int main() 17: { 18: ifstream InClientFile("credit.dat", ios::in|ios::binary); 19: if (!InClientFile) 20: { 21: cerr << "File could not be opened" << endl; 22: exit(1); 23: } 24: cout << setiosflags(ios::left) << setw(10) << "Account" 25: << setw(13) << "Name" << "Balance" << endl; 26: Client C; 27: while (InClientFile.read((char *)&C,sizeof(Client))) 28: OutputLine(C); 29: InClientFile.close(); 30: return 0; 31: } 32: 33: void OutputLine(Client C) 34: { 35: cout << setiosflags(ios::left) << setw(10) << C.Account 36: << setw(13) << C.Name << setw(7) << setprecision(2) 37: << setiosflags(ios::showpoint | ios::right)<< C.Balance << endl; 38: } Chng ta chy v d 8.32, kt qu hnh 8.34
BI TP
Bi 1: Ci t ton t >> v << cho kiu d liu mng nhp v xut. Bi 2: Ci t thm ton t >> v << cho lp Time trong bi 5 ca chng 4. Bi 3: Ci t thm ton t >> v << cho lp Date trong bi 6 ca chng 4. Bi 4: Vit chng trnh kim tra cc gi tr nguyn nhp vo dng h 10, h 8 v h 16. Bi 5: Vit chng trnh in bng m ASCII cho cc k t c m ASCII t 33 n 126. Chng trnh in gm gi tr k t, gi tr h 10, gi tr h 8 v gi tr h 16. Bi 6: Vit chng trnh in cc gi tr nguyn dng lun c du + pha trc. Bi 7: Vit chng trnh tng t nh lnh COPY ca DOS sao chp ni dung ca file . Bi 8: Vit chng trnh cho bit kch thc file. Bi 9: Vit chng trnh m s lng t c trong mt file vn bn ting Anh. Bin son: L Th M Hnh
Trang 159
HM V LP TEMPLATE
Trong phn ny, chng ta tm hiu v mt trong cc c tnh cn li ca C++, l template (khun mu). Cc template cho php chng ta nh r, vi mt on m n gin, mt ton b phm vi ca cc hm c lin quan (a nng ha)gi l cc hm template-hoc mt ton b phm vi ca cc lp c lin quangi l lp template. Chng ta c th vit mt hm template n gin cho vic sp xp mt mng v C++ t ng pht sinh cc hm template ring bit m s sp xp mt mng int, sp xp mt mng float, Chng ta c th vit mt lp template cho lp stack v sau C++ t ng pht sinh cc lp template ring bit nh lp stack ca int, lp stack ca float,
I.
Cc hm template
Cc hm a nng ha bnh thng c s dng thc hin cc thao tc tng t trn cc kiu khc nhau ca d liu. Nu cc thao tc ng nht cho mi kiu, iu ny c th thc hin mch lc v thun tin hn s dng cc hm template. Lp trnh vin vit nh ngha hm template n gin. Da vo cc kiu tham s cung cp trong li gi hm ny, trnh bin dch t ng pht sinh cc hm m i tng ring bit x l mi kiu ca li gi thch hp. Trong C, iu ny c th c thc hin bng cch s dng cc macro to vi tin x l #define. Tuy nhin, cc macro biu th kh nng i vi cc hiu ng l nghim trng v khng cho php trnh bin dch thc hin vic kim tra kiu. Cc hm template cung cp mt gii php mch lc ging nh cc macro, nhng cho php kim tra kiu y . Chng hn, chng ta mun vit hm ly tr tuyt i ca mt s, chng ta c th vit nhiu dng khc nhau nh sau:
int MyAbs(int X) { return X>=0?X:-X; } long MyAbs(long X) { return X>=0?X:-X; } double MyAbs(double X) { return X>=0?X:-X; }
Tuy nhin vi cc hm ny chng ta vn cha c gii php tt, mang tnh tng qut nht nh hm c tham s kiu int nhng gi tr tr v l double v ngc li. Tt c cc hm template nh ngha bt u vi t kha template theo sau mt danh sch cc tham s hnh thc vi hm template vy quanh trong cc ngoc nhn (< v >); Mi tham s hnh thc phi c t trc bi t kha class nh:
Trang 160
cout<<MyAbs(-2)<<endl; cout<<MyAbs(3.5)<<endl;
Trong ln gi th nht, hm MyAbs() c tham s thc l int nn trnh bin dch to ra hm int MyAbs(int) theo dng ca hm template, ln th hai s to ra hm float MyAbs(float). Mi tham s hnh thc trong mt nh ngha hm template phi xut hin trong danh sch tham s ca hm ti thiu mt ln. Tn ca tham s hnh thc ch c th s dng mt ln trong danh sch tham s ca phn u template. V d 9.1: S dng hm template in cc gi tr ca mt mng c kiu bt k. 1: //Chng trnh 9.1 2: #include <iostream.h> 3: 4: template<class T> 5: void PrintArray(T *Array, const int Count) 6: { 7: for (int I = 0; I < Count; I++) 8: cout << Array[I] << " "; 9: 10: cout << endl; 11: } 12: 13: int main() 14: { 15: const int Count1 = 5, Count2 = 7, Count3 = 6; 16: int A1[Count1] = {1, 2, 3, 4, 5}; 17: float A2[Count2] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7}; 18: char A3[Count3] = "HELLO"; 19: cout << "Array A1 contains:" << endl; 20: PrintArray(A1, Count1); //Hm template kiu int 21: cout << "Array A2 contains:" << endl; 22: PrintArray(A2, Count2); //Hm template kiu float 23: cout << "Array A3 contains:" << endl; 24: PrintArray(A3, Count3); //Hm template kiu char 25: return 0; 26: } Chng ta chy v d 9.1, kt qu hnh 9.1
Trang 161
Hnh 9.1: Kt qu ca v d 9.1 V d 9.2: Hm template c th c nhiu tham s. 1: //Chng trnh 9.2 2: #include <iostream.h> 3: 4: template<class T> 5: T Max(T a, T b) 6: { 7: return (a>b)?a:b; 8: } 9: 10: int main() 11: { 12: float A,B; 13: cout<<"Enter first number:"; 14: cin>>A; 15: cout<<"Enter second number:"; 16: cin>>B; 17: cout<<"Maximum:"<<Max(A,B); 18: return 0; 19: } Chng ta chy v d 9.2, kt qu hnh 9.2
Hnh 9.2: Kt qu ca v d 9.2 Mt hm template c th c a nng ha theo vi cch. Chng ta c th cung cp cc hm template khc m m t cng tn hm nhng cc tham s hm khc nhau. Mt hm template cng c th c a nng ha bi cung cp hm non-template vi cng tn hm nhng cc tham s hm khc nhau. Trnh bin dch thc hin mt x l so snh xc nh hm gi khi mt hm c gi. u tin trnh bin dch c gng tm v s dng mt i snh chnh xc m cc tn hm v cc kiu tham s i snh chnh xc. Nu iu ny tht bi, trnh bin dch kim tra nu mt hm template c m c th pht sinh mt hm template vi mt i snh chnh xc ca tn hm v cc kiu tham s. Nu mt hm template nh th c tm thy, trnh bin dch pht sinh v s dng hm template thch hp. Ch x l i snh ny vi cc template i yu cc i snh chnh xc trn tt c kiu tham s-khng c cc chuyn i t ng c p dng.
II.
Cc lp template
Bn cnh hm template, ngn ng C++ cn trang b thm lp template, lp ny cng mang y tng ca hm template. Cc lp template c gi l cc kiu c tham s (parameterized types) bi v chng i hi mt hoc nhiu tham s m t lm th no ty chnh mt lp template chung to thnh mt lp template c th.
Trang 162
Chng ta ci t mt lp Stack, thng thng chng ta phi nh ngha trc mt kiu d liu cho tng phn t ca stack. Nhng iu ny ch mang li s trong sng cho mt chng trnh v khng gii quyt c vn tng qut. Do chng ta nh ngha lp template Stack. V d 9.3: File TSTACK.H: 1: //TSTACK.H 2: //Lp template Stack 3: #ifndef TSTACK_H 4: #define TSTACK_H 5: 6: #include <iostream.h> 7: 8: template<class T> 9: class Stack 10: { 11: private: 12: int Size; //Kch thc stack 13: int Top; 14: T *StackPtr; 15: public: 16: Stack(int = 10); 17: ~Stack() 18: { 19: delete [] StackPtr; 20: } 21: int Push(const T&); 22: int Pop(T&); 23: int IsEmpty() const 24: { 25: return Top == -1; 26: } 27: int IsFull() const 28: { 29: return Top == Size - 1; 30: } 31: }; 32: 33: template<class T> 34: Stack<T>::Stack(int S) 35: { 36: Size = (S > 0 && S < 1000) ? S : 10; 37: Top = -1; 38: StackPtr = new T[Size]; 39: } 40: 41: template<class T> 42: int Stack<T>::Push(const T &Item) 43: { 44: if (!IsFull()) 45: { 46: StackPtr[++Top] = Item; 47: return 1; 48: } 49: return 0; 50: } 51:
Trang 163
File CT9_3.CPP: 1: //CT9_3.CPP 2: //Chng trnh 9.3 3: #include "tstack.h" 4: 5: int main() 6: { 7: Stack<float> FloatStack(5); 8: float F = 1.1; 9: cout << "Pushing elements onto FloatStack" << endl; 10: while (FloatStack.Push(F)) 11: { 12: cout << F << ' '; 13: F += 1.1; 14: } 15:cout << endl << "Stack is full. Cannot push " << F << endl 16: << endl << "Popping elements from FloatStack" << endl; 17: while (FloatStack.Pop(F)) 18: cout << F << ' '; 19: cout << endl << "Stack is empty. Cannot pop" << endl; 20: Stack<int> IntStack; 21: int I = 1; 22: cout << endl << "Pushing elements onto IntStack" << endl; 23: while (IntStack.Push(I)) 24: { 25: cout << I << ' '; 26: ++I ; 27: } 28:cout << endl << "Stack is full. Cannot push " << I << endl 29: << endl << "Popping elements from IntStack" << endl; 30: while (IntStack.Pop(I)) 31: cout << I << ' '; 32: cout << endl << "Stack is empty. Cannot pop" << endl; 33: return 0; 34: } Chng ta chy v d 9.3, kt qu hnh 9.3
Trang 164
BI TP
Bi 1: Vit hm template tr v gi tr trung bnh ca mt mng, cc tham s hnh thc ca hm ny l tn mng v kch thc mng. Bi 2: Ci t hng i template. Bi 3: Ci t lp template dng cho cy nh phn tm kim (BST). Bi 4: Ci t lp template cho vector qun l vector cc thnh phn c kiu bt k. Bi 5: Vit hm template sp xp kiu d liu bt k. Bi 6: Trong C++, php ton new c dng cp pht b nh, khi khng cp pht c con tr c gi tr NULL. Hy ci t li cc lp Matrix v Vector trong c b sung thm thnh vin l lp exception vi tn gi l Memory kim tra vic cp pht ny.
Trang 165