Gtrinh OOP Trong C++

Embed Size (px)

Citation preview

  • 8/2/2019 Gtrinh OOP Trong C++

    1/165

    I HC NNGTRNG I HC K THUT

    KHOA CNG NGH THNG TIN - IN TVIN THNG

    GIO TRNH MN HC

    LP TRNH HNG I TNG

    BIN SON: L TH M HNH

    NNG, 09/2002

  • 8/2/2019 Gtrinh OOP Trong C++

    2/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    2

    MC LC

    CHNG 1: GII THIU V LP TRNH HNG I TNG.......................... 5

    I. LP TRNH HNG I TNG (OOP) L G ? .............................................. 5I.1. Lp trnh tuyn tnh ............................................................................................ 5I.2. Lp trnh cu trc................................................................................................ 5I.3. S tru tng ha d liu................................................................................... 6I.4. Lp trnh hng i tng ................................................................................. 6

    II. MT S KHI NIM MI TRONG LP TRNH HNG I TNG........... 8II.1. Sng gi (Encapsulation) .............................................................................. 8II.2. Tnh k tha (Inheritance).................................................................................. 9II.3. Tnh a hnh (Polymorphism) .......................................................................... 10

    III. CC NGN NGV VI NG DNG CA OOP............................................ 11

    CHNG 2: CC MRNG CA C++...................................................................... 12I. LCH SCA C++ ................................................................................................. 12II. CC M RNG CA C++..................................................................................... 12

    II.1. Cc t kha mi ca C++................................................................................. 12II.2. Cch ghi ch thch ............................................................................................ 12II.3. Dng nhp/xut chun...................................................................................... 13II.4. Cch chuyn i kiu d liu ........................................................................... 14II.5. V tr khai bo bin........................................................................................... 14II.6. Cc bin const................................................................................................... 15II.7. V struct, union v enum.................................................................................. 16

    II.8. Ton tnh phm vi ....................................................................................... 16II.9. Ton t new v delete....................................................................................... 17II.10. Hm inline ........................................................................................................ 23II.11. Cc gi tr tham s mc nh ............................................................................ 24II.12. Php tham chiu ............................................................................................... 25II.13. Php a nng ha (Overloading)...................................................................... 29

    CHNG 3: LP V I TNG .............................................................................. 39I. DN NHP.............................................................................................................. 39II. CI T MT KIU DO NGI DNG NH NGHA VI MT STRUCT. 39

    III. CI T MT KIU DLIU TRU TNG VI MT LP...................... 41IV. PHM VI LP V TRUY CP CC THNH VIN LP .................................. 45V. IU KHIN TRUY CP TI CC THNH VIN............................................ 47VI. CC HM TRUY CP V CC HM TIN CH............................................... 48VII.KHI NG CC I TNG CA LP : CONSTRUCTOR......................... 49VIII.SDNG DESTRUCTOR..................................................................................... 51 IX. KHI NO CC CONSTRUTOR V DESTRUCTOR C GI ? .................. 53X. SDNG CC THNH VIN DLIU V CC HM THNH VIN ........ 54XI. TR V MT THAM CHIU TI MT THNH VIN DLIU PRIVATE.. 57XII.PHP GN BI TON TSAO CHP THNH VIN MC NH ................. 59

    XIII.CC I TNG HNG V CC HMTHNH VIN CONST..................... 60XIV.LP NHL CC THNH VIN CA CC LP KHC ............................... 64XV.CC HM V CC LP FRIEND........................................................................ 67

  • 8/2/2019 Gtrinh OOP Trong C++

    3/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    3

    XVI.CON TR THIS ...................................................................................................... 68XVII.CC I TNG C CP PHT NG ................................................... 71XVIII.CC THNH VIN TNH CA LP................................................................. 72

    CHNG 4: A NNG HA TON T...................................................................... 76I. DN NHP.............................................................................................................. 76

    II. CC NGUYN TC C BN CA A NNG HA TON T...................... 76III. CC GII HN CA A NNG HA TON T.............................................. 76IV. CC HM TON TC TH L CC THNH VIN CA LP HOC

    KHNG L CC THNH VIN........................................................................... 77V. A NNG HO CC TON THAI NGI ....................................................... 80VI. A NNG HA CC TON TMT NGI ..................................................... 87VII.A NNG HA MT S TON TC BIT ................................................ 90

    VII.1.Ton t [] ............................................................................................................ 91VII.2.Ton t () ............................................................................................................ 92

    VIII.TON TCHUYN I KIU............................................................................ 94

    IX. TON TNEW V DELETE................................................................................ 95IX.1.a nng ha ton t new v delete ton cc........................................................ 96IX.2.a nng ha ton t new v delete cho mt lp .................................................. 97

    X. A NNG HA CC TON TCHN DNG > ...... 98XI. MT S V D ....................................................................................................... 99

    XI.1.Lp String............................................................................................................. 99 XI.2.Lp Date............................................................................................................. 103

    CHNG 5: TNH K THA...................................................................................... 107I. DN NHP............................................................................................................ 107II. K THA N ..................................................................................................... 107

    II.1.Cc lp csv cc lp dn xut ....................................................................... 107II.2.Cc thnh vin protected...................................................................................... 109II.3.p kiu cc con tr lp csti cc con tr lp dn xut.................................. 109II.4.nh ngha li cc thnh vin lp cstrong mt lp dn xut:........................ 113II.5.Cc lp cspublic, protected v private........................................................... 113II.6.Cc contructor v destructor lp dn xut ........................................................... 113II.7.Chuyn i ngm nh i tng lp dn xut sang i tng lp cs........... 116

    III. A K THA (MULTIPLE INHERITANCE)..................................................... 116IV. CC LP C SO (VIRTUAL BASE CLASSES) ......................................... 119

    CHNG 6: TNH A HNH ....................................................................................... 122I. DN NHP............................................................................................................ 122II. PHNG THC O (VIRTUAL FUNCTION).................................................. 122III. LP TRU TNG (ABSTRACT CLASS) ....................................................... 125IV. CC THNH VIN O CA MT LP............................................................ 127

    IV.1.Ton to........................................................................................................... 127IV.2.C constructor v destructoro hay khng?...................................................... 129

    CHNG 7: THIT K CHNG TRNH THEO HNG I TNG ......... 132I. DN NHP............................................................................................................ 132II. CC GIAI ON PHT TRIN H THNG..................................................... 132

    III. CCH TM LP .................................................................................................... 133IV. CC BC CN THIT THIT K CHNG TRNH............................. 133V. CC V D ............................................................................................................ 134

  • 8/2/2019 Gtrinh OOP Trong C++

    4/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    4

    CHNG 8: CC DNG NHP/XUT...................................................................... 143I. DN NHP............................................................................................................ 143II. CC DNG(STREAMS) ...................................................................................... 143

    II.1.Cc file header ca th vin iostream.................................................................. 143II.2.Cc lp v cc i tng ca dng nhp/xut ..................................................... 144

    III. DNG XUT......................................................................................................... 145III.1.Ton t chn dng.............................................................................................. 145III.2.Ni cc ton t chn dng v trch dng............................................................ 146III.3.Xut k t vi hm thnh vin put(); Ni vi nhau hm put() .......................... 147

    IV. DNG NHP......................................................................................................... 148IV.1.Ton t trch dng:............................................................................................. 148IV.2.Cc hm thnh vin get() v getline() ................................................................ 149IV.3.Cc hm thnh vin khc ca istream................................................................ 151IV.4.Nhp/xut kiu an ton....................................................................................... 151

    V. NHP/XUT KHNG NH DNG VI READ(),GCOUNT() V WRITE() 151VI. DNG NHP/ XUT FILE .................................................................................. 152

    VI.1.Nhp/xut file vn bn ....................................................................................... 154

    CHNG 9: HM V LP TEMPLATE................................................................... 159I. CC HM TEMPLATE........................................................................................ 159II. CC LP TEMPLATE........................................................................................... 161

  • 8/2/2019 Gtrinh OOP Trong C++

    5/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    5

    CHNG 1

    GII THIU V LP TRNH HNG I TNG

    I. LP TRNH HNG I TNG (OOP) L G ?

    Lp trnh hng i tng (Object-Oriented Programming, vit tt l OOP) l mt phng php mi

    trn bc ng tin ha ca vic lp trnh my tnh, nhm lm cho chng trnh trnn linh hot, tin cyv d pht trin. Tuy nhin hiu c OOP l g, chng ta hy bt u t lch s ca qu trnh lp trnh xem xt OOP tin ha nh th no.

    I.1. Lp trnh tuyn tnh

    My tnh u tin c lp trnh bng m nh phn, s dng cc cng tt ckh np chng trnh.Cng vi s xut hin ca cc thit b lu tr ln v b nhmy tnh c dung lng ln nn cc ngn nglp trnh cp cao u tin c a vo s dng . Thay v phi suy ngh trn mt dy cc bit v byte, lptrnh 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 tngi 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 tngln. Cc ngn ng l p trnh ngy trc khng cn thch hp i vi vic l p 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 lptrnh tuyn tnh. Tht ra, mt on lnh thng phi c chp lp li mi khi chng ta dng trong nhiuchng 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 cnthit 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 dliu trong chng trnh u l d liu ton cc ngha l chng c th b sa i bt k phn no cachng trnh. Vic d tm cc thay i khng mong mun ca cc phn t d liu trong mt dy m lnhdi 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 ngdng tinh vi hn. Vo cui cc nm trong 1960 v 1970, ngn ng lp trnh c cu trc ra i. Cc chngtrnh 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 lpvi 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 hmli c th truy xut c chng. Nh vy, cc hm c thc xem l cc chng trnh con c t chungvi 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 cithin c tnh tin cy v d bo qun chng trnh. Mt chng trnh c cu trc c hnh thnh bngcch b gy cc chc nng cbn ca chng trnh thnh cc mnh nh m sau trthnh cc hm. Bngcch c lp cc cng vic vo trong cc hm, chng trnh c cu trc c th lm gim kh nng ca mthm ny nh hng n mt hm khc. Vic ny cng lm cho vic tch cc vn trnn d dng hn. Sgi gn ny cho php chng ta c th vit cc chng trnh sng sa hn v gic iu khin trn tnghm. 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 cutrc chng trnh, lm cho vic trin khai v bo dng chng trnh nhanh hn v hu hin hn v hiu quhn.

  • 8/2/2019 Gtrinh OOP Trong C++

    6/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    6

    Mt khi nim ln c a ra trong lp trnh c cu trc l stru tng ha (Abstraction). Stru tng ha c th xem nh kh nng quan st mt s vic m khng cn xem xt n cc chi tit bntrong ca n. Trong mt chng trnh c cu trc, chng ta ch cn bit mt hm cho c th lm c mtcng vic c th g l . Cn lm th no m cng vic li thc hin c l khng quan trng, chngno hm cn tin cy c th cn c th dng n m khng cn phi bit n thc hin ng n chc nngca mnh nh th no. iu ny gi l stru 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, dbo 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 angtip 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 trr rng l cu trc d liu trong chng trnh quan trng chngkm g cc php ton thc hin trn chng. iu ny cng trr rng hn khi kch thc ca chng trnhcng 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 qui vi cc chng trnh chng ngn dng lnh v hng trm hm trln.

    Mt yu im na ca vic lp trnh c cu trc l khi c nhiu lp trnh vin lm vic theo nhm cngmt ng dng no . Trong mt chng trnh c cu trc, cc lp trnh vin c phn cng vit mt tphp cc hm v cc kiu d liu. V c nhiu lp trnh vin khc nhau qun l cc hm ring, c lin quann cc kiu d liu dng chung nn cc thay i m lp trnh vin to ra trn mt phn t d liu s lm nhhng 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. Stru tng ha dliu

    S tru tng ha d liu (Data abstraction) tc ng trn cc d liu cng tng t nh s trutng ha theo chc nng. Khi c tru tng ha d liu, cc cu trc d liu v cc phn t c thc sdng m khng cn bn tm n cc chi tit c th. Chng hn nh cc s du chm ng c trutng ha trong tt c cc ngn ng lp trnh, Chng ta khng cn quan tm cch biu din nh phn chnhxc 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 vhiu c.

    S tru tng ha d liu gip chng ta khng phi bn tm v cc chi tit khng cn thit. Nu lptrnh 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 nglp trnh i vi cc d liu phc tp nh s du chm ng. Tuy nhin ch mi gn y, ngi ta mi phttrin cc ngn ng cho php chng ta nh ngha cc kiu d liu tru tng ring.

    I.4. Lp trnh hng i tng

    Khi nim hng i tng c xy dng trn nn tng ca khi nim lp trnh c cu trc v s trutng ha d liu. S thay i cn bn ch, mt chng trnh hng i tng c thit k xoay quanhd liu m chng ta c th lm vic trn , hn l theo bn thn chc nng ca chng trnh. iu ny honton t nhin mt khi chng ta hiu rng mc tiu ca chng trnh l x l d liu. Suy cho cng, cng vicm my tnh thc hin vn thng c gi l x l d liu. D liu v thao tc lin kt vi nhau mt mccbn (cn c th gi l mc thp), mi thu 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 lLp trnh

    nh hngi tng, chnh l phng php lp trnh ly i tng lm nn tng xy dng thut gii, xy

  • 8/2/2019 Gtrinh OOP Trong C++

    7/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    7

    dng chng trnh. Thc cht y khng phi l mt phng php mi m l mt cch nhn mi trong viclp trnh. phn bit, vi phng php lp trnh theo kiu cu trc m chng ta quen thuc trc y, haycn gi l phng php lp trnh hng th tc (Procedure-Oriented Programming), ngi lp trnh phntch 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 minhho 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 suydin 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 hthng chng trnh gii quyt vn t ra. Chnh v vy, cch thc phn tch mt h thng ly chngtrnh 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 lunlun suy ngh theo hng lm thno gii quyt cng vic, chng ta c thnh hng t duy theo

    phong cch vi mt si tng c, phi lm g gii quytc cng vic t ra hoc phong phhn, lm ci g vi mt si 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 nghv

    th gii quanh mnh. Chng ta thng gn mt s cc hot ng c th vi mt loi hot ng no v tcc 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 vnng c mi che hnh vng cung, nhng kin trc thm mvi 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 thvi btng, st thp v khng nhiu lm nhng vin gch, ngi xy dng cng c th thit k nhng cngtrnh 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 itng kho st, Cht liu xy dng v nguyn l kt dnh cc cht liu li vi nhau c hiu theo nghad 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 thi hng ca nbng cch quo tay li. Tng t nh th, mt ci cy l mt loi thc vt c thn g v l. Mt chic xekhng phi l mt ci cy, m ci cy khng phi l mt chic xe, chng ta c th gi thit rng ci mchng ta c th lm c vi mt chic xe th khng th lm c vi mt ci cy. Chng hn, tht l vngha 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 nghnh vy vi cc khi nimtru tng c s dng trong cc chng trnh my tnh. Mt mu tin (record) nhn s c thc c ra,

    thay i v lu tr li; cn s phc th c thc dng trong cc tnh ton. Tuy vy khng th no li vitmt s phc vo tp tin lm mu tin nhn s v ngc li hai mu tin nhn s li khng th cng vi nhauc. 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 khcnhau.

    Chng ta cn c th to ra cc quan h gia cc kiu d liu tng t nhng khc nhau trong mtchng trnh hng i tng. Ngi ta thng t nhin phn loi ra mi th, thng t mi lin h giacc 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 ccth 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 xydng cc cc ccu d liu v thao tc mi da trn cc ccu c sn, mang theo cc tnh nng ca cc ccu nn m chng da trn , trong khi vn thm vo cc tnh nng mi.

  • 8/2/2019 Gtrinh OOP Trong C++

    8/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    8

    Lp trnh hng i tng cho php chng ta t chc d liu trong chng trnh theo mt cch tng tnh 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 dliu. Khi mt phn t d liu c khai bo l phn t ca mt l p 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 vtth c thc bn trong b nh, thc cht l mt i tng (ngha l mt i tng c cp pht vngnh).

    Mi mt i tng c ring cho mnh mt bn sao cc phn t d liu ca lp cn gi l cc bin thcth (Instance variable). Cc phng thc nh ngha trong mt lp c thc gi bi cc i tng calp . iu ny c gi l gi mt thng ip (Message) cho i tng. Cc thng ip ny ph thucvo i tng, chi tng no nhn thng ip mi phi lm vic theo thng ip . Cc i tng uc 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 ncc i tng khc.

    Nh vy, i tng c hiu theo ngha l mt thc th m trong ca d liu v th tc tcng ln d liu c ng gi li vi nhau. Hay itngc c trng bi mt sthao tc(operation) v cc thng tin (information) ghi nhstc 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 cangn xp, chng ta phi ci t km theo cc thao tc nh khi to (creat) ngn xp, kim tra ngnxp 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 bvi 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 itng, Phng thc ca i tng c qui nh bi d liu v ngc li, d liu ca i tngc t trng bi cc phng thc ca i tng. Chnh nh s gn b , chng ta c th gicng mt thng ip n nhng i tng khc nhau. iu ny gip ngi lp trnh khng phi xl trong chng trnh ca mnh mt dy cc cu trc iu khin tu theo thng ip nhn vo, mchng 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. MT S KHI NIM MI TRONG LP TRNH HNG I TNG

    Trong phn ny, chng ta tm hiu cc khi nim nh sng gi, tnh k tha v tnh a hnh. y lcc khi nim cn bn, l nn tng t tng ca lp trnh hng i tng. Hiu c khi nim ny, chngta bc u tip cn vi phong cch lp trnh mi, phong cch lp trnh da vo i tng lm nn tng mtrong quan im che du thng tin thng qua sng gi l quan im trung tm ca vn .

    II.1. Sng gi (Encapsulation)Sng gi l cch rng buc d liu v thao tc trn d liu thnh mt th thng nht, trnh c

    cc tc ng bt ngt bn ngoi. Th thng nht ny gi l i tng.

  • 8/2/2019 Gtrinh OOP Trong C++

    9/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    9

    Trong Objetc Oriented Software Engineeringca Ivar Jacibson, tt c cc thng tin ca mt h thngnh 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, sng gi khng chn thun l s gom chung d liu vchng trnh vo trong mt khi, chng cn c hiu theo ngha l sng nht gia d liu v cc thaotc 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 vi tng chc truy cp bi cc thnh phn cai tng, iu ny ngha l thao tc hay d liu ring khng th truy cp bi cc phn khc ca chngtrnh tn ti ngoi i tng. Khi thao tc hay d liu l chung, cc phn khc ca chng trnh c th truycp 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.

    Cchng gi l phng thc tt thc hin cch che du thng tin so vi cc ngn ng lp trnhcu trc.

    II.2. Tnh k tha (Inheritance)

    Chng ta c th xy dng cc lp mi t cc lp c thng qua s k tha. Mt lp mi cn gi l lp

    dn xut (derived class), c th tha hng d liu v cc phng thc ca lp cs(base class) ban u.Trong lp ny, c th b sung cc thnh phn d liu v cc phng thc mi vo nhng thnh phn d liuv cc phng thc m n tha hng t lp cs. Mi lp (k c lp dn xut) c th c mt s lng btk cc lp dn xut. Qua ccu k tha ny, dng hnh cy ca cc lp c hnh thnh. Dng cy ca cclp trng ging nh cc cy gia ph v th cc lp cscn c gi l lp cha (parent class) v cc lpdn xut c gi l lp con (child class).

    V d 1.2: Chng ta s xy dng mt tp cc lp m t cho th vin cc n phm. C hai kiu n phm:tp ch v sch. Chng ta c th to mt n phm tng qut bng cch nh ngha cc thnh phn d liutng ng vi s trang, m s tra cu, ngy thng xut bn, bn quyn v nh xut bn. Cc n phm c thc ly ra, ct i v c. l cc phng thc thc hin trn mt n phm. Tip chng ta nh ngha

    hai lp dn xut tn l tp ch v sch. Tp ch c tn, s k pht hnh v cha nhiu bi ca cc tc gi khcnhau . Cc thnh phn d liu tng ng vi cc yu t ny c t vo nh ngha ca lp tp ch. Tp chcng cn c mt phng thc na l t mua. Cc thnh phn d liu xc nh cho sch s bao gm tnca (cc) tc gi, loi ba (cng hay mm) v s hiu ISBN ca n. Nh vy chng ta c th thy, sch v tpch c chung cc c trng n phm, trong khi vn c cc thuc tnh ring ca chng.

    Hnh 1.1: Lp n phm v cclp dn xut ca n.

    Vi tnh k tha, chng ta

    khng phi mt cng xy dng li tu cc lp mi, ch cn b sung c c trong cc lp dn xut ccc trng cn thit.

  • 8/2/2019 Gtrinh OOP Trong C++

    10/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    10

    II.3. Tnh a hnh (Polymorphism)

    l kh nng cho mt thng ip c th thay i cch thc hin ca n theo lp c th ca itng nhn thng ip. Khi mt lp dn xut c to ra, n c th thay i cch thc hin cc phng thcno m n tha hng t lp csca n. Mt thng ip khi c gi n mt i tng ca lp cs,s dng phng thc nh ngha cho n trong lp cs. Nu mt lp dn xut nh ngha li mt phng

    thc tha hng t lp csca n th mt thng ip c cng tn vi phng thc ny, khi c gi timt 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 cngchung 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 vhnh cgi 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 sc v ln.

    Trong cc ngn ng lp trnh OOP, tnh a hnh th hin qua kh nng cho php m t nhng phngthc c tn ging nhau trong cc lp khc nhau. c im ny gip ngi lp trnh khng phi vit nhngcu trc iu khin rm r trong chng trnh, cc kh nng khc nhau ca thng ip ch thc si 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 cngging nhau. Khi phi ly ra tp ch, th phi s dng phng php ly ra ring cho tp ch (da trn mt bntra 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 cunsch. Khi ly ra mt tp ch n s dng phng thc ly ra dnh ring cho tp ch, cn khi ly ra mt cunsch th n s dng phng thc ly ra tng ng vi sch. Kt qu l ch cn mt tn phng thc duy nhtc 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 sc gi. Hm c thc gi s tu thuc vo vic phn t nhn thng ip lc lthuc 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 khichng trnh ang thc hin.

    Hnh 1.2: Minh ha tnh a hnh i vilp n phm v cc lp dn xut ca n.

  • 8/2/2019 Gtrinh OOP Trong C++

    11/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    11

    III. CC NGN NGV VI NG DNG CA OOP

    Xut pht t t tng ca ngn ng SIMULA67, trung tm nghin cu Palo Alto (PARC) ca hngXEROR tp trung 10 nm nghin cu hon thin ngn ng OOP u tin vi tn gi l Smalltalk. Sau cc ngn ng OOP ln lt ra i nh Eiffel, Clos, Loops, Flavors, Object Pascal, Object C, C++, Delphi,Java

    Chnh XEROR trn csngn ng OOP ra t tng giao din biu tng trn mn hnh (iconbase screen interface), k t Apple Macintosh cng nh Microsoft Windows pht trin giao din hanh ngy nay. Trong Microsoft Windows, t tng OOP c th hin mt cch r nt nht l "chng taclick vo i tng", mi i tng c th l control menu, control menu box, menu bar, scroll bar, button,minimize box, maximize box, sp ng cng vic ty theo c tnh ca i tng. Turbo Vision cahng Borland l mt ng dng OOP tuyt vi, gip lp trnh vin khng quan tm n chi tit ca chngtrnh gia din m ch cn thc hin cc ni dung chnh ca vn .

  • 8/2/2019 Gtrinh OOP Trong C++

    12/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    12

    CHNG 2

    CC MRNG CA C++

    I. LCH SCA C++

    Vo nhng nm u thp nin 1980, ngi dng bit C++ vi tn gi "C with Classes" c m t tronghai bi bo ca Bjarne Stroustrup (thuc AT&T Bell Laboratories) vi nhan "Classes: An Abstract DataType Facility for the C Language" v "Adding Classes to C : AnExercise in Language Evolution". Trongcng trnh ny, tc gi xut khi nim lp, b sung vic kim tra kiu tham s ca hm, cc chuyn ikiu v mt s mrng khc vo ngn ng C. Bjarne Stroustrup nghin cu mrng ngn ng C nhm tn 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 bindch ra i. V chnh t, xut hin tn gi "C++". Bjarne Stroustrup m t ngn ng C++ ln u tintrong bi bo c nhan "Data Abstraction in C". Sau mt vi hiu chnh C++ c cng b rng ri trongquyn "The C++ Programming Language" ca Bjarne Stroustrup xut hin nh du s hin din thc s

    ca C++, ngi lp tnh chuyn nghip ty c mt ngn ng mnh cho cc d n thc tin camnh.

    V thc cht C++ ging nh C nhng b sung thm mt s mrng quan trng, c bit l tng vi tng, lp trnh nh hng i tng.Tht ra cc tng v cu trc trong C++ xut pht vo ccnm 1970 t Simula 70 v Algol 68. Cc ngn ng ny a ra cc khi nim v lp v n th. Ada lmt ngn ng pht trin t, nhng C++ khng nh vai tr thc s ca mnh.

    II. CC MRNG CA C++

    II.1. Cc tkha 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 trckhi chng trnh c dch li bng C++. Cc t kha mi ny l :

    asm catch class delete friend inline

    new operator private protected public template

    this throw try virtual

    II.2. Cch ghi ch thch

    C++ chp nhn hai kiu ch thch. Cc lp trnh vin bng C quen vi cch ch thch bng /**/.

    Trnh bin dch s b qua mi th nm gia /**/.

    V d 2.1: Trong chng trnh sau :

    #include int main(){

    int I;for(I = 0; I < 10 ; ++ I) // 0 - 9

    cout

  • 8/2/2019 Gtrinh OOP Trong C++

    13/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    13

    Mi th nm gia /**/ t dng 1 n dng 3 u c chng trnh b qua. Chng trnh ny cnminh ha cch ch thch th hai. l cch ch thch bt u bng // dng 8 v dng 9. Chng ta chy vd 2.1, kt quhnh 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.

    II.3. Dng nhp/xut chunTrong chng trnh C, chng ta thng s dng cc hm nhp/xut d liu l printf() v scanf(). Trong

    C++ chng ta c th dng dng nhp/xut chun (standard input/output stream) nhp/xut d liu thngqua hai bin i tng ca dng (stream object) l cout v cin.

    V d 2.2: Chng trnh nhp vo hai s. Tnh tng v hiu ca hai s va nhp.//Chuong trinh 2.2#include int main(){

    int X, Y;cout>X;cout>Y;cout

  • 8/2/2019 Gtrinh OOP Trong C++

    14/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    14

    Hnh 2.3: Dng nhp/xut d liu

    II.4. Cch chuyn i kiu dliu

    Hnh thc chuyn i kiu trong C tng i ti ngha, v vy C++ trang b thm mt cch chuyn ikiu ging nh mt lnh gi hm.

    V d 2.3:#include int main(){

    int X = 200;long Y = (long) X; //Chuyen doi kieu theo cach cua Clong Z = long(X); //Chuyen doi kieu theo cach moi cua C++cout

  • 8/2/2019 Gtrinh OOP Trong C++

    15/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    15

    5: cout>X;7: int Y;8: cout>Y;10: char Op;11: coutOp;13: switch(Op)14: {15: case +:16: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    16/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    16

    Phm vi ca cc bin const gia ANSI C v C++ khc nhau. Trong ANSI C, cc bin constc khaibo bn ngoi mi hm th chng c phm vi ton cc, iu ny ngha l chng c th nhn thy cbnngoi file m chng c nh ngha, tr khi chng c khai bo l static. Nhng trong C++, cc binconst c hiu mc nh l static.

    II.7. V struct, union v enum

    Trong C++, cc struct v union thc s cc cc kiu class. Tuy nhin c s thay i i vi C++. ltn ca struct v unionc xem lun l tn kiu ging nh khai bo bng lnh typedefvy.

    Trong C, chng ta c th c on m sau :struct Complex{

    float Real;float Imaginary;

    };..struct Complex C;

    Trong C++, vn trnn n gin hn:struct Complex{

    float Real;float Imaginary;

    };..Complex C;

    Quy nh ny cng p dng cho cunion v enum. Tuy nhin tng thch vi C, C++ vn chp nhnc php c.

    Mt kiu union c bit c thm vo C++ gi l union nc danh (anonymous union). N ch khai bomt lot cc trng(field) dng chung mt vng a ch b nh. Mt union nc danh khng c tn tag, cctrng c thc truy xut trc tip bng tn ca chng. Chng hn nhon 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 kiuunion c tn, cc trng ca union nc danh th c truy xut trc tip, chng hn nh sau:

    Num = 12;

    Value = 30.56;

    II.8. Ton tnh phm vi

    Ton tnh phm vi (scope resolution operator) k hiu l ::, n c dng truy xut mt phn t bche bi phm vi hin thi.

    V d 2.5 :

    1: #include 2: int X = 5;3: int main()4: {5: int X = 16;6: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    17/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    17

    Ton tnh 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 tnh phm vi cn c thc dng phn bit cc thnh phn trng tn ca cc lp cskhc nhau.

    II.9. Ton tnew v delete

    Trong cc chng trnh C, tt c cc cp pht ng b nhu c x l thng qua cc hm th vin

    nhmalloc(), calloc() v free(). C++ nh ngha mt phng thc mi thc hin vic cp pht ng bnhbng cch dng hai ton tnew v delete. S dng hai ton t ny s linh hot hn rt nhiu so vi cchm th vin ca C.

    on chng trnh sau dng c p pht vngnhng theo li cin ca C.

    int *P;P = malloc(sizeof(int));if (P==NULL)printf("Khong con du bo nho de cap phat\n");

    else{

    *P = 290;printf("%d\n", *P);free(P);

    }

    Trong C++, chng ta c th vit li on chngtrnh trn nh sau:int *P;P = new int;if (P==NULL)

    cout

  • 8/2/2019 Gtrinh OOP Trong C++

    18/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    18

    cp pht mt mng, chng ta lm nh sau :

    int *P;

    P = new int[10]; //Cp pht mng 10 s nguyn

    if (P!=NULL)

    {

    for(int I = 0;I

  • 8/2/2019 Gtrinh OOP Trong C++

    19/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    19

    Chng ta chy v d 2.6, kt quhnh 2.7

    Hnh 2.7: Kt qu ca v d 2.6

    V d 2.7: Chng trnh cng hai ma trn trong mi ma trn c cp pht ng.

    Chng ta c th xem mng hai chiu nh mng mt chiu nh hnh 2.8

    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 + jChng ta c chng trnh nh sau :

    1: #include 2: #include 3: //prototype4: 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: coutM;18: coutN;20: //Cp pht vng nh cho ma trn A21: if (!AllocMatrix(&A,M,N))

    22: { //endl: Xut ra k t xung dng (\n)23: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    20/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    20

    26: //Cp pht vng nh cho ma trn B27: if (!AllocMatrix(&B,M,N))28: {29: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    21/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    21

    94: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    22/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    22

    Khi ton tnewc s dng cp pht ng v mt li xy ra do cp pht, C++ t gi n hm c chbi con tr ny. nh ngha ca con tr ny nh sau:

    typedef void (*pvf)();

    pvf _new_handler(pvf p);

    iu ny c ngha l con tr_new_handler l con tr trn hm khng c tham s v khng tr v gi

    tr. Sau khi chng ta nh ngha hm nh vy v gn a ch ca n cho_new_handler chng ta c th btc tt c cc li do cp pht ng.

    V d 2.8:1: #include 2: #include 3: #include 4:5: void MyHandler();6:7: unsigned long I = 0; 9;8: void main()

    9: {10: int *A;11: _new_handler = MyHandler;12: for( ; ; ++I)13: A = new int;14:15: }16:17: void MyHandler()18: {19: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    23/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    23

    13: Ptr = new char[64000u];14: set_new_handler(0); //Thit lp li gi tr mc nh15: return 0;16: }17:18: void MyHandler()19: {

    20: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    24/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    24

    Ch :

    S dng hm inline s lm cho chng trnh ln ln v trnh bin dch chn on chng trnh vo ccch 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 thchng trnh s b bo li:

    #include float Cube(float S);int main(){

    coutSide;cout

  • 8/2/2019 Gtrinh OOP Trong C++

    25/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    25

    V d 2.11: Tnh th tch ca hnh hp1: #include 2: int BoxVolume(int Length = 1, int Width = 1, int Height = 1);3:4: int main()5: {

    6: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    26/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    26

    void Swap(int *X, int *Y);

    {

    int Temp = *X;

    *X = *Y;

    *Y = *Temp;}

    hon i gi tr hai binA vB th chng ta gi hm nh sau:

    Swap(&A, &B);

    R rng cch vit ny khng c thun tin lm. Trong trng hp ny, C++ a ra mt kiu bin rtc bit gi l bin tham chiu (reference variable). Mt bin tham chiu ging nh l mt b danh ca binkhc. Bin tham chiu s lm cho cc hm c thay i ni dung cc tham s ca n c vit mt cch thanhthot 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 bintham chiu cho tham s ca C++ tng t nh cc tham sc 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 chomt hm.

    Hnh 2.14: Mt tham s kiu tham chiu nhn mt tham chiuti mt bin c chuyn cho tham s ca hm.

  • 8/2/2019 Gtrinh OOP Trong C++

    27/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    27

    V d 2.12: Chng trnh hon i gi tr ca hai bin.#include //prototypevoid Swap(int &X,int &Y);int main(){

    int X = 10, Y = 5;

    cout

  • 8/2/2019 Gtrinh OOP Trong C++

    28/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    28

    cout

  • 8/2/2019 Gtrinh OOP Trong C++

    29/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    29

    5: int & MyFunc();6:7: int main()8: {9: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    30/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    30

    V d 2.16:1: #include 2: #include 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

  • 8/2/2019 Gtrinh OOP Trong C++

    31/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    31

    MyAbs(c); //Gi int MyAbs(int)

    MyAbs(2.34f); //Gi double MyAbs(double)

    Cc php chuyn kiu c sn sc u tin hn cc php chuyn kiu m chng ta to ra (chng ta sxem 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 nhngha. Chng hn nh:

    int (*pf1)(int);

    long (*pf2)(long);

    int (*pf3)(double);

    pf1 = MyAbs; //Trn hm int MyAbs(int)

    pf2 = MyAbs; //Trn 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 thtrnh 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. Nhvy 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 typedefkhng nh ngha kiu mi. Chng ch thay i tn gi ca kiu c. Chng khng nh hng ti ccha 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 trc xem nhng nht i vi s phn bit khc nhau gia cc

    phin bn hm trong vic a nng ha hm. Chng hn nhon 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 hahm, chng hn nhon 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 nhon m sauhp l:

  • 8/2/2019 Gtrinh OOP Trong C++

    32/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    32

    void Print(char *Mess);

    void Print(const char *Mess);

    II.13.2. a nng ha cc ton t(Operators overloading) :

    Trong ngn ng C, khi chng ta t to ra mt kiu d liu mi, chng ta thc hin cc thao tc lin quann kiu d liu thng thng qua cc hm, iu ny trnn khng thoi mi.

    V d 2.17: Chng trnh ci t cc php ton cng v tr s phc1: #include 2: /* nh ngha s phc */3: typedef struct4: {5: double Real;6: double Imaginary;7: }Complex;8:9: Complex SetComplex(double R,double I);10: Complex AddComplex(Complex C1,Complex C2);

    11: Complex SubComplex(Complex C1,Complex C2);12: void DisplayComplex(Complex C);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: printf("\nSo phuc thu nhat:");21: DisplayComplex(C1);22: printf("\nSo phuc thu hai:");

    23: DisplayComplex(C2);24: C3 = AddComplex(C1,C2); //Hi bt tin !!!25: C4 = SubComplex(C1,C2);26: printf("\nTong hai so phuc nay:");27: DisplayComplex(C3);28: printf("\nHieu hai so phuc nay:");29: DisplayComplex(C4);30: return 0;31: }32:33: /* t gi tr cho mt s phc */34: Complex SetComplex(double R,double I)

    35: {36: Complex Tmp;37:38: Tmp.Real = R;39: Tmp.Imaginary = I;40: return Tmp;41: }42: /* Cng hai s phc */43: Complex AddComplex(Complex C1,Complex C2)44: {45: Complex Tmp;46:

    47: Tmp.Real = C1.Real+C2.Real;48: Tmp.Imaginary = C1.Imaginary+C2.Imaginary;49: return Tmp;

  • 8/2/2019 Gtrinh OOP Trong C++

    33/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    33

    50: }51:52: /* Tr hai s phc */53: Complex SubComplex(Complex C1,Complex C2)54: {55: Complex Tmp;56:

    57: Tmp.Real = C1.Real-C2.Real;58: Tmp.Imaginary = C1.Imaginary-C2.Imaginary;59: return Tmp;60: }61:62: /* Hin th s phc */63: void DisplayComplex(Complex C)64: {65: printf("(%.1lf,%.1lf)",C.Real,C.Imaginary);66: }

    Chng ta chy v d 2.17, kt quhnh 2.20

    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 sphc 1+2i v 3+4i; ngi lp trnh hon ton khng thoi mi khi s dng bi v thc cht thao tc cng vtr l cc ton t ch khng phi l hm. khc phc yu im ny, trong C++ cho php chng ta c thnh 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 2: // nh ngha s phc3: typedef struct4: {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

  • 8/2/2019 Gtrinh OOP Trong C++

    34/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    34

    25: C4 = C1 - C2;26: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    35/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    35

    Chng ta nhn thy rng c hai lnh u cho cng kt qu nhng lnh ca C++ th d hiu hn. C++ lmc iu ny bng cch to ra cc hm nh ngha cch thc hin ca mt ton t cho cc kiu d liu tnh ngha. Mt hm nh ngha mt ton t c c php sau:

    data_typeoperatoroperator_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 tmt ngi l ton t ch c mt ton hng) v trnh bin dch bit tham su tin l bn tri ton t, cntham 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 tc a nng ha sc la chn bi trnh bin dch cng theo cch thc tng t nhvic chn la gia cc hm c a nng ha l khi gp mt ton t lm vic trn cc kiu khng phi lkiu c sn, trnh bin dch s tm mt hm nh ngha ca ton t no c cc tham si snh vi ccton 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 thnh ngha cc ton t mi.

    Hu ht cc ton t ca C++ u c thc a nng ha. Cc ton t sau khng c a nng

    ha l :Ton t ngha

    :: Ton tnh 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 tiu kinsizeof

    v chng ta cng khng tha nng ha bt k k hiu tin x l no.

    Chng ta khng th thay i th tu 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 tha nng ho:

    + - * / % ^! = += -=

    ^= &= |= = ==!= , -> ->*

  • 8/2/2019 Gtrinh OOP Trong C++

    36/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    36

    Cc ton tc phn loi nh sau :

    Cc ton t mt ngi : * & ~ ! ++ -- sizeof (data_type)

    Cc ton t ny c nh ngha ch c mt tham s v phi tr v mt gi tr cng kiu vi tham s cachng. i vi ton tsizeofphi 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: * / % + - >> = >= b?b:a;for(i = 2;i

  • 8/2/2019 Gtrinh OOP Trong C++

    37/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    37

    Bi 3: Mt tam gic vung c th c tt c cc cnh l cc s nguyn. Tp ca ba s nguyn cacc 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 ccc 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 lcphn tng ng.

    Bi 5: Vit chng trnh nhp vo mt s nguyn dng n. Kim tra xem s nguyn n c thucdy Fibonacci khng?

    Bi 6: Vit chng trnh nhn hai ma trn Amxnv Bnxp. Mi ma trn c cp pht ng vcc 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 nhthoc s m ln nht th xut thng bo "khng c s dng nh nht" hoc "khng c s m lnnht".

    Bi 8: Anh (ch) hy vit mt hm tnh bnh phng ca mt s. Hm s tr v gi tr bnhphng 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 cachui 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 ccdng 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 knhr. 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 cchiu 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 bacnh 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 cbn knh r. Hm ny c prototype nh sau:

    void ComputeSphere(float & v, float &s, float r = 1.0);

  • 8/2/2019 Gtrinh OOP Trong C++

    38/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    38

    Hm ComputeCylinder() tnh th tch v v din tch b mt s ca mt hnh trc 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 31int Month; //C gi tr t 1 12int Year; //Biu din bng 4 ch s.

    };Anh (ch) hy vit cc hm nh ngha cc ton t : + - > >= < >= <

  • 8/2/2019 Gtrinh OOP Trong C++

    39/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    39

    CHNG 3

    LP V I TNG

    I. DN NHP

    By gichng ta bt u tm hiu v lp trnh hng i tng trong C++. Trong cc phn sau, chng tacng 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 mi tng phi c, xc nh hnh vi no m i tng cn a ra, v ch r lm th no cc i tng cntng 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 slin h mt thit vi nhau. Cc i tng c cc c tnh ca vic che du thng tin. iu ny ngha l mcd cc i tng c th bit lm th no lin lc vi i tng khc thng qua cc giao din hon ton xcnh, bnh thng cc i tng khng c php bit lm th no cc i tng khc c thc thi, cc chitit 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++, nv 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 cngvic c to thnh cc hm, v cc hm c nhm thnh cc chng trnh. D liu th rt quan trng trongC, nhng quan im l d liu tn ti chnh trong vic h trcc hnh ng m hm thc hin. Cc ng ttrong mt h thng gip cho lp trnh vin C xc nh tp cc hm m s hot ng cng vi vic thc thi hthng.

    Cc l p trnh vin C++ t p trung vo vic to ra "cc kiu do ngi dng nh ngha" (user-definedtypes) gi l cc l p. Cc lp cng c tham chiu nh "cc kiu do l p trnh vin nh ngha"

    (programmer-defined types). Mi lp cha d liu cng nh tp cc hm m x l d liu. Cc thnh phnd liu ca mt lp c gi l "cc thnh vin d liu" (data members). Cc thnh phn hm ca mt lpc gi l "cc hm thnh vin" (member functions). Ging nh thc th ca kiu c sn nhint c gil 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 trnhby cc lp trong C++, chng ta tm hiu v cu trc, v chng ta xy dng mt kiu do ngi dng nhngha da trn mt cu trc.

    II. CI T MT KIU DO NGI DNG NH NGHA VI MT struct

    V d 3.1: Chng ta xy dng kiu cu trc Time vi ba thnh vin s nguyn:Hour,Minute vsecond.Chng trnh nh ngha mt cu trc Time gi lDinnerTime. Chng trnh in thi gian di dng giquni v dng chun.

    #include struct Time{int Hour; // 0-23int Minute; // 0-59int Second; // 0-59

    };void PrintMilitary(const Time &); //prototype

    void PrintStandard(const Time &); //prototypeint main(){Time DinnerTime;

  • 8/2/2019 Gtrinh OOP Trong C++

    40/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    40

    //Thiet lap cac thanh vien voi gia tri hop leDinnerTime.Hour = 18;DinnerTime.Minute = 30;DinnerTime.Second = 0;cout

  • 8/2/2019 Gtrinh OOP Trong C++

    41/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    41

    III. CI T MT KIU DLIU TRU TNG VI MT LP

    Cc lp cho php lp trnh vin m hnh cc i tng m c cc thuc tnh (biu din nh cc thnhvin d liu Data members) v cc hnh vi hoc cc thao tc (biu din nh cc hm thnh vin Memberfunctions). Cc kiu cha cc thnh vin d liu v cc hm thnh vin c nh ngha thng thng trongC++ s dng t kha class, c c php nh sau:

    class {

    //Thn ca lp

    };

    Trong :

    class-name: tn lp.

    member-list: c t cc thnh vin d liu v cc hm thnh vin.

    Cc hm thnh vin i khi c gi l cc phng thc (methods) trong cc ngn ng lp trnh hng

    i tng khc, v c a ra trong vic p ng cc message gi ti mt i tng. Mt message tngng vi vic gi hm thnh vin.

    Khi mt lp c nh ngha, tn lp c thc s dng khai bo i tng ca lp theo c phpsau:

    ;

    Chng hn, cu trc Time sc nh ngha di dng lp nh sau:class Time{

    public:

    Time();void SetTime(int, int, int)void PrintMilitary();void PrintStandard()

    private:int Hour; // 0 - 23int Minute; // 0 - 59int Second; // 0 - 59

    };

    Trong nh ngha lp Time cha ba thnh vin d liu l Hour, Minute v Second, v cng trong lpny, chng ta thy cc nhn public v private c gi l cc thuc tnh xc nh truy c p thnh vin(member access specifiers) gi tt l thuc tnh truy cp.

    Bt k thnh vin d liu hay hm thnh vin khai bo sau public c thc truy cp bt k ni nom chng trnh truy cp n mt i tng ca lp. Bt k thnh vin d liu hay hm thnh vin khai bosau private ch c thc truy cp bi cc hm thnh vin ca lp. Cc thuc tnh truy cp lun lun ktthc vi du hai chm (:) v c th xut hin nhiu ln v theo th t bt k trong nh ngha lp. Mc nhthuc tnh truy cp l private.

    nh ngha lp cha cc prototype ca bn hm thnh vin sau thuc tnh truy cp public l Time(),SetTime(), PrintMilitary() v PrintStandard(). l cc hm thnh vin public (public member function)hoc giao din (interface) ca lp. Cc hm ny sc s dng bi cc client (ngha l cc phn ca mt

    chng trnh m l cc ngi dng) ca lp x l d liu ca lp. C th nhn thy trong nh ngha lpTime, hm thnh vin Time() c cng tn vi tn l p Time, n c gi l hm xy dng (constructorfunction) ca lp Time.

  • 8/2/2019 Gtrinh OOP Trong C++

    42/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    42

    Mt constructor l mt hm thnh vin c bit m khi ng cc thnh vin d liu ca mt i tngca lp. Mt constructor ca lp c gi tng 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 thnhvin c lit k trong phn public. Nhng c th c cc hm thnh vin private v thnh vin d liupublic.

    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 trn 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.11: #include 2:3: class Time

    4: {5: public:6: Time(); //Constructor7: void SetTime(int, int, int); //Thit lp Hour, Minute va Second8: void PrintMilitary(); //In thi gian di dng gi qun i9: void PrintStandard(); //In thi gian di dng chun10: private:11: int Hour; // 0 - 2312: int Minute; // 0 - 5913: int Second; // 0 - 5914: };15:

    16: //Constructor khi to mi thnh vin DL vi gi tr zero17: //Bo m tt c cc i tng bt u mt t.thi thch hp18: Time::Time()19: {20: Hour = Minute = Second = 0;21: }22:23: //Thit lp mt gi tr Time mi s dng gi quni24: //Thc hin vic kim tra tnh hp l trn cc gi tr d liu25: //Thit lp cc gi tr khng hp l thnh zero26: 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 i34: void Time::PrintMilitary()35: {36: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    43/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    43

    43: {44: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    44/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    44

    Khi mt lp c nh ngha v cc hm thnh vin ca n c khai bo, cc hm thnh vin ny phic nh ngha. Mi hm thnh vin ca lp c thc nh ngha trc tip trong thn lp (hin nhin baogm prototype hm ca lp), hoc hm thnh vin c thc nh ngha sau thn lp. Khi mt hm thnhvin c nh ngha sau nh ngha lp tng ng, tn hm c t trc bi tn lp v ton tnh phmvi (::). Chng hn nhv d 3.2 gm cc dng 18, 26, 34 v 42. Bi v cc lp khc nhau c th c cc tnthnh vin ging nhau, ton tnh 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 thnh ngha bn ngoi nh ngha

    lp ny, hm thnh vin vn cn bn trong phm vi ca lp, ngha l tn ca n chc bit ti ccthnh vin khc ca lp ngoi tr tham chiu thng qua mt i tng ca lp, mt tham chiu ti mt itng 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 hminline. Cc hm thnh vin nh ngha bn ngoi nh ngha mt lp c th l hm inline bng cch s dngt kha inline.

    Hm thnh vin cng tn vi tn lp nhng t trc l mt k t ng (~) c gi l destructor ca lpny. Hm destructor lm "cng vic ni trkt thc" trn mi i tng ca lp trc khi vng nhcho itng c phc hi bi h thng.

    V d 3.3: Ly li v d 3.2 nhng hai hmPrintMilitary() vPrintStandard() l cc hm inline.1: #include 2:3: class Time4: {5: public:6: Time(); ; //Constructor7: void SetTime(int, int, int); //Thit lp Hour, Minute vaSecond

    8: void PrintMilitary() // In thi gian di dng gi quni9: {10: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    45/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    45

    35: }36:37: #9; //In thi gian di dng chun38: inline void Time::PrintStandard()39: {40: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    46/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    46

    Trong mt phm vi lp, cc thnh vin ca lp c truy cp ngay lp tc bi tt c cc hm thnh vinca lp v c thc tham chiu mt cch d dng bi tn. Bn ngoi mt phm vi lp, cc thnh vinca lp c tham chiu thng qua hoc mt tn i tng, mt tham chiu n mt i tng, hoc mtcon tr ti i tng.

    Cc hm thnh vin ca lp c thc a nng ha (overload), nhng ch bi cc hm thnh vin khcca 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 chc bit ti hm . Nu mt hm thnh vin nh ngha mt bin cng tn vi tn mt bin trong phm vilp, bin phm vi lp c du bi bin phm vi hm bn trong phm vi hm. Nh th mt bin b du cthc truy cp thng qua ton tnh phm vi.

    Cc ton tc 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 cai tng hay vi mt tham chiu ti mt i tng truy cp cc thnh vin ca i tng. Ton t lachn thnh vin mi tn (->)c kt hp vi mt con tr tr ti mt truy cp truy cp cc thnh vin cai tng.

    V d 3.4: Chng trnh sau minh ha vic truy cp cc thnh vin ca mt lp vi cc ton t la chnthnh vin.

    1: #include 2:3: class Count4: {5: public:6: int X;7: void Print()8: {9: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    47/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    47

    Hnh 3.4: Kt qu ca v d 3.4

    V. IU KHIN TRUY CP TI CC THNH VINCc 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 vilp l private v th tt c cc thnh vin sau phn header ca lp v trc nhn u tin l private. Sau minhn, ch m c ko theo bi nhn p dng cho n khi gp nhn k tip hoc cho n khi gp dumc phi (}) ca phn nh ngha lp. Cc nhn public, private v protected c thc lp li nhng cchdng nh vy th him c v c th gy kh hiu.

    Cc thnh vin private ch c thc truy cp bi cc hm thnh vin (v cc hm friend) ca lp .Cc thnh vin public ca lp c thc 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 calp khng cn quan tm lm th no lp hon thnh cc thao tc ca n. Cc thnh vin private ca lpcng nh cc nh ngha ca cc hm thnh vin public ca n th khng phi c th truy cp ti client camt 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 giaodin public s dng cc hm thnh vin public.

    #include class MyClass{

    private:

    int X,Y;public:

    void Print();};void MyClass::Print(){

    cout

  • 8/2/2019 Gtrinh OOP Trong C++

    48/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    48

    nh i vi cc thnh vin ca struct l public. Thuc tnh truy cp cc thnh vin ca mt struct cng cthc 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 thnhvin, 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. Mtvi 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 thc hay hin th d liu. S dng cc hm truy cp kim tra tnh ng hocsai ca cc iu kin cc hm nh th thng c gi l cc hm khng nh (predicate functions). Mt vd ca hm khng nh l mt hmIsEmpty() 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 hmIsEmpty()trc khi thc mc khc ti tng container.

    Mt hm tin ch khng l mt phn ca mt giao din ca lp. Hn na n l mt hm thnh vinprivate m h trcc thao tc ca cc hm thnh vin public. Cc hm tin ch khng dnh c s dng

    bi cc client ca lp.

    V d 3.6: Minh ha cho cc hm tin ch.1: #include 2: #include 3:4: class SalesPerson5: {6: public:7: SalesPerson(); //constructor8: void SetSales(int, double);//Ng.dng cung cp cc hnh ca9: #9; #9; //nhng hng bn ca mt thng10: void PrintAnnualSales();

    11:12: private:13: double Sales[12]; //12 hnh ca nhng hng bn hng thng14: double TotalAnnualSales(); //Hm tin ch15: };16:17: //Hm constructor khi to mng18: 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 thng25: void SalesPerson::SetSales(int Month, double Amount)26: {27: if (Month >= 1 && Month 0)28: Sales[Month - 1] = Amount;29: else30: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    49/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    49

    38: for (int I = 0; I < 12; I++)39: Total += Sales[I];40: return Total;41: }42:43: //In tng hng bn hng nm44: void SalesPerson::PrintAnnualSales()

    45: {46: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    50/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    50

    Constructor c th cha cc tham s mc nh. Bng cch cung c p cc tham s mc nh choconstructor, ngay c nu khng c cc gi tr no c cung cp trong mt constructor th i tng vnc bo m trong mt trng thi ph hp v cc tham s mc nh. Mt constructor ca lp trnh vincung cp m hoc tt c cc tham s ca n c gi tr mc nh hoc khng c tham s no c gi lconstructor 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 class Time{public:

    Time(int = 0, int = 0, int = 0); //Constructor mac dinhvoid 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 0Time::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 0void 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:SSvoid Time::PrintMilitary()

    {cout

  • 8/2/2019 Gtrinh OOP Trong C++

    51/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    51

    int main(){

    Time T1,T2(2),T3(21,34),T4(12,25,42),T5(27,74,99);

    cout

  • 8/2/2019 Gtrinh OOP Trong C++

    52/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    52

    Destructor ca mt lp c gi khi i tng c hy b ngha l khi s thc hin chng trnh rikhi phm vi m trong i tng ca lp c khi to. Destructor khng thc s hy bi tng n thc hin "cng vic ni trkt thc" trc khi h thng phc hi khng gian b nhca i tng nc thc 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 nhkhng lm g c.

    V d 3.8: Lp c hm destructor#include 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;coutX;

    S.SetValue(X);cout

  • 8/2/2019 Gtrinh OOP Trong C++

    53/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    53

    IX. KHI NO CC CONSTRUTOR V DESTRUCTOR C GI ?

    Cc constructor v destructorc gi mt cch tng. Th t cc hm ny c gi ph thuc voth t trong s thc hin vo v ri khi phm vi m cc i tng c khi to. Mt cch tng qut,cc destructorc gi theo th t ngc vi th t ca cc constructorc gi.

    Cc constructorc 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() ktthc hoc hm exit()c gi.

    Cc constructor ca cc i tng cc b tng c gi khi s thc hin n im m cc i tngc khai bo. Cc destructor tng ng c gi khi cc i tng ri khi phm vi (ngha l khi mtrong chng c khai bo). Cc constructor v destructori vi cc i tng cc b tng c gimi khi cc i tng vo v ri khi phm vi.

    Cc constructorc gi ca cc i tng cc b tnh (static) khi s thc hin n im m cc itng c khai bo ln u tin. Cc destructor tng ng c gi khi hm main() kt thc hoc hmexit()c gi.

    V d 3.9: Chng trnh sau minh ha th t cc constructor v destructorc gi.#include class CreateAndDestroy{

    public:CreateAndDestroy(int); //Constructor~CreateAndDestroy(); //Destructor

    private:int Data;

    };CreateAndDestroy::CreateAndDestroy(int Value){

    Data = Value;cout

  • 8/2/2019 Gtrinh OOP Trong C++

    54/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    54

    CreateAndDestroy Seventh(7);cout

  • 8/2/2019 Gtrinh OOP Trong C++

    55/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    55

    Cc li ch ca s ton vn d liu th khng tng n gin bi v cc thnh vin d liu c to lprivate 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 chomt thnh vin d liu. Chnh v l do ny, cc hm "set" ca lp thng c vit tr v cc gi tr cho bitrng 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 itng 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 mrng lp Time v d 3.2 bao gm hm get v set i vi cc thnh vind liu private l hour, minute vsecond.

    1: #include 2:3: class Time4: {5: public:6: Time(int = 0, int = 0, int = 0); //Constructor7: //Cc hm set8: void SetTime(int, int, int); //Thit lp Hour, Minute, Second9: void SetHour(int); //Thit lp Hour10: void SetMinute(int); //Thit lp Minute11: void SetSecond(int); //Thit lp Second12: //Cc hm get13: int GetHour(); //Tr v Hour14: int GetMinute(); //Tr v Minute15: int GetSecond(); //Tr v Second16:17: void PrintMilitary(); //Xut thi gian theo dng gi quni18: void PrintStandard(); //Xut thi gian theo dng chun19:20: private:21: int Hour; //0 - 2322: int Minute; //0 - 5923: int Second; //0 5924: };25:26: //Constructor khing d liu private27: //Gi hm thnh vin SetTime() thit lp cc bin24: //Cc gi tr mc nh l 025: 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 Second31: 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: }

  • 8/2/2019 Gtrinh OOP Trong C++

    56/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    56

    43:44: //Thit lp gi tr ca Minute45: void Time::SetMinute(int M)46: {47: Minute = (M >= 0 && M < 60) ? M : 0;48: }49:

    50: //Thit lp gi tr ca Second51: void Time::SetSecond(int S)52: {53: Second = (S >= 0 && S < 60) ? S : 0;54: }55:56: //Ly gi tr ca Hour57: int Time::GetHour()58: {59: return Hour;60: }61:

    62: //Ly gi tr ca Minute63: int Time::GetMinute()64: {65: return Minute;66: }67:68: //Ly gi tr ca Second69: int Time::GetSecond()70: {71: return Second;72: }73:74: //Hin th thi gian dng gi quni: HH:MM:SS75: void Time::PrintMilitary()76: {77: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    57/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    57

    103:

  • 8/2/2019 Gtrinh OOP Trong C++

    58/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    58

    V d 3.11: Chng trnh sau s dng mt phin bn n gin ca lp Time minh ha tr v mttham chiu ti mt d liu private.

    1: #include 2:3: class Time4: {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 private17: //Gi hm thnh vin SetTime() thit lp cc bin18: //Cc gi tr mcnh l 019: 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 Second24: 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 Hour32: 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 private39: 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

  • 8/2/2019 Gtrinh OOP Trong C++

    59/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    59

    57:

  • 8/2/2019 Gtrinh OOP Trong C++

    60/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    60

    28:29: int main()30: {31: Date Date1(7, 4, 1993), Date2; //Date2 mc nh l 1/1/9032: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    61/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    61

    V d 3.13: Chng trnh sau s dng mt lp Time vi cc i tng const v cc hm thnh vinconst.

    2: #include 3: class Time4: {5: public:6: Time(int = 0, int = 0, int = 0); //Constructor mc nh7: //Cc hm set8: void SetTime(int, int, int); //Thit lp thi gian9: void SetHour(int); //Thit lp Hour10: void SetMinute(int); //Thit lp Minute11: void SetSecond(int); //Thit lp Second12: //Cc hm get13: int GetHour() const; //Tr v Hour14: int GetMinute() const; //Tr v Minute15: int GetSecond() const; //Tr v Second16: //Cc hm in17: void PrintMilitary() const; //In t.gian theo dng gi qun i18: void PrintStandard() const; //In thi gian theo dng gi chun19: private:20: int Hour; //0 - 2321: int Minute; //0 - 5922: int Second; //0 5923: };24:25: //Constructor khi ng d liu private26: //Cc gi tr mc nh l 027: 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 Second33: 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 Hour41: void Time::SetHour(int h)

    42: {43: Hour = (h >= 0 && h < 24) ? h : 0;44: }45:46: //Thit lp gi tr ca Minute47: void Time::SetMinute(int m)48: {49: Minute = (m >= 0 && m < 60) ? m : 0;50: }51:52: //Thit lp gi tr ca Second53: void Time::SetSecond(int s)

    54: {55: Second = (s >= 0 && s < 60) ? s : 0;56: }57:

  • 8/2/2019 Gtrinh OOP Trong C++

    62/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    62

    58: //Ly gi tr ca Hour59: int Time::GetHour() const60: {61: return Hour;62: }63:64: //Ly gi tr ca Minute

    65: int Time::GetMinute() const66: {67: return Minute;68: }69:70: //Ly gi tr ca Second71: int Time::GetSecond() const72: {73: return Second;74: }75:76: //Hin th thi gian dng gi qun i: HH:MM:SS

    77: void Time::PrintMilitary() const78: {79: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    63/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    63

    Lu : Hm thnh vin const c thc a nng ha vi mt phin bn non-const. Vic la chn hmthnh vin a nng ha no s dng c to mt cch tng bi trnh bin dch da vo ni m itng c khai bo const hay khng.

    Mt i tng const khng thc thay i bi php gn v th n phi c khi ng. Khi mtthnh vin d liu ca mt lp c khai bo const, mt b khi to thnh vin (member initializer) phic 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 csn.

    2: #include 3: class IncrementClass4: {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 const15: };16:17: //Constructor ca lp IncrementClass18: //B khi to vi thnh vin const19: IncrementClass::IncrementClass (int C, int I) : Increment(I)20: {21: Count = C;22: }23:24: //In d liu25: void IncrementClass::Print() const26: {27: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    64/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    64

    Hnh 3.14: Kt qu ca v d 3.14K hiu : Increment(I) (dng 19 ca v d 3.14) sinh raIncrementc khi ng vi gi tr lI. Nu

    nhiu b khi to thnh vin c cn, n gin bao gm chng trong danh sch phn cch du phy sau duhai chm. Tt c cc thnh vin d liu c thc khi to s dng c php b khi to thnh vin.

    Nu trong v d 3.14 chng ta c gng khi toIncrementvi mt lnh gn hn l vi mt b khi tothnh 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 constbng php gn

    XIV. LP NHL CC THNH VIN CA CC LP KHCMt lp c th c cc i tng ca cc lp khc nh cc thnh vin. Khi mt i tng i vo phm vi,

    constructor ca n c gi mt cch tng, v th chng ta cn m t cc tham sc truyn nh thno ti cc constructor ca i tng thnh vin. Cc i tng thnh vin c xy dng theo th t mtrong chng c khai bo (khng theo th t m chng c lit k trong danh sch b khi to thnhvin ca constructor) v trc cc i tng ca lp cha ng chng c xy dng.

    V d 3.15: Chng trnh sau minh ha cc i tng nh cc thnh vin ca cc i tng khc.1: #include 2: #include 3:

    4: class Date5: {6: public:7: Date(int = 1, int = 1, int = 1900); //Constructor mc nh8: void Print() const; //In ngy theo dng Month/Day/Year9: private:10: int Month; //1-1211: int Day; //1-3112: int Year; //Nm bt k13://Hm tin ch kim tra Day tng thch i vi Month v Year14: int CheckDay(int);15: };

    16:17: class Employee18: {

  • 8/2/2019 Gtrinh OOP Trong C++

    65/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    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 Month30: //Gi hm CheckDay() xc nhn gi tr tng thch ca Day31: Date::Date(int Mn, int Dy, int Yr)32: {33: if (Mn > 0 && Mn

  • 8/2/2019 Gtrinh OOP Trong C++

    66/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    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 hp81: Length = strlen(LName);82: Length = Length < 25 ? Length : 24;83: strncpy(LastName, LName, 24);

    84: LastName[Length] = '\0';85: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    67/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    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 bkhi to thnh vin khng c cung cp, constructor mc nh ca i tng thnh vin sc gi mtcch tng. Cc gi tr nu c thit lp bi constructor mc nh th c thc 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 cpn cc thnh vin private hoc protected ca mt lp. Mt hm hay ton b lp c thc khai bo lmt friend ca lp khc.

    khai bo mt hm l mt friend ca mt lp, ng trc prototype ca hm trong nh ngha lp vit kha friend. nh sau:

    friend ;

    khai bo mt lp l friend ca lp khc nh sau:

    friend ;

    V d 3.16: Chng trnh sau minh ha khai bo v s dng hm friend.1: #include 2:3: class Count4: {5: friend void SetX(Count &, int); //Khai bo friend6: public:7: Count()//Constructor8: {9: X = 0;

    10: }11: void Print() const //Xut12: {13: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    68/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    68

    25:26: int main()27: {28: Count Object;29:30: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    69/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    69

    17: void Test::Print() const18: {19: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    70/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    70

    31: }32:33: // Thit lp cc gi tr ca Hour, Minute, v Second34: Time &Time::SetTime(int H, int M, int S)35: {36: Hour = (H >= 0 && H < 24) ? H : 0;37: Minute = (M >= 0 && M < 60) ? M : 0;

    38: Second = (S >= 0 && S < 60) ? S : 0;39: return *this; // Cho php mc ni40: }41:42: // Thit lp gi tr ca Hour43: Time &Time::SetHour(int H)44: {45: Hour = (H >= 0 && H < 24) ? H : 0;46: return *this; // Cho php mc ni47: }48:49: // Thit lp gi tr ca Minute

    50: Time &Time::SetMinute(int M)51: {52: Minute = (M >= 0 && M < 60) ? M : 0;53: return *this; // Cho php mc ni54: }55:56: // Thit lp gi tr ca Second57: Time &Time::SetSecond(int S)58: {59: Second = (S >= 0 && S < 60) ? S : 0;60: return *this; // Cho php mc ni61: }62:63: // Ly gi tr ca Hour64: int Time::GetHour() const65: {66: return Hour;67: }68:69: // Ly gi tr ca Minute70: int Time::GetMinute() const71: {72: return Minute;73: }74:75: // Ly gi tr ca Second76: int Time::GetSecond() const77: {78: return Second;79: }80:81: // Hin th thi gian dng gi qun i: HH:MM:SS82: void Time::PrintMilitary() const83: {84: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    71/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    71

    89: // Hin th thi gian dng chun: HH:MM:SS AM (hay PM)90: void Time::PrintStandard() const91: {92: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    72/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    72

    XVIII. CC THNH VIN TNH CA LP

    Bnh thng, mi i tng ca mt lp c bn sao chp ca chnh n ca tt c cc thnh vin d liuca lp. Trong cc trng hp nht nh ch c duy nht mt bn chp thnh vin d liu c bit cn phidng 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 mtthnh 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 cphm vi lp. Cc thnh vin tnh c th l public, private hoc protected. Cc thnh vin d liu tnh phic khi to mt ln (v ch mt ln) ti phm vi file. Cc thnh vin lp tnh public c thc truy cpthng qua bt ki tng no ca lp , hoc chng c thc truy cp thng qua tn lp s dng tontnh phm vi. Cc thnh vin lp tnh private v protectedphi c truy cp thng qua cc hm thnhvin public ca lp hoc thng qua cc friend ca lp. Cc thnh vin lp tnh tn ti ngay c khi i tngca 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 tnh phm vi cho thnh vin d liu. truy cp mt thnh vinlp tnh private hoc protected khi cc i tng ca lp khng tn ti, mt hm thnh vin public phic cung cp v hm phi c gi bi thm vo u tn ca n vi tn lp v ton tnh phm vi.

    V d 3.19: Chng trnh sau minh ha vic s dng thnh vin d liu tnh private v mt hm thnhvin tnh public.

    1: #include 2: #include 3: #include 4:5: class Employee6: {7: public:8: Employee(const char*, const char*); // Constructor9: ~Employee(); // Destructor

    10: char *GetFirstName() const; // Tr v first name11: char *GetLastName() const; // Tr v last name12: // Hm thnh vin tnh13: static int GetCount(); // Tr v si tng khi to14: private:15: char *FirstName;16: char *LastName;17: // static data member18: static int Count; // Si tng khi to19: };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 si tng khi to25: int Employee::GetCount()26: {27: return Count;28: }29:30: // Constructor cp pht ng cho first name v last name31: Employee::Employee(const char *First, const char *Last)32: {33: FirstName = new char[ strlen(First) + 1 ];

    34: assert(FirstName != 0); // Bo m vng nhc cp pht35: strcpy(FirstName, First);36: LastName = new char[ strlen(Last) + 1 ];

  • 8/2/2019 Gtrinh OOP Trong C++

    73/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    73

    37: assert(LastName != 0); // Bo m vng nhc cp pht38: strcpy(LastName, Last);39: ++Count; // Tng si tng ln 140: cout

  • 8/2/2019 Gtrinh OOP Trong C++

    74/165

    Gio trnh mn Lp trnh hng i tng Trang

    Bin son: L Th M Hnh

    74

    Thnh vin d liu Count duy tr s cc i tng ca lpEmployee c khi to. Khi i tngca lpEmployee tn ti, thnh vin Countc thc tham chiu thng qua bt k hm thnh vin no camt i tngEmployee trong v d ny, Countc tham chiu bi c constructor ln destructor. Khi cci tng ca lp Employee khng tn ti, thnh vin Countc th vn c tham chiu nhng ch thngqua mt li gi hm thnh vin tnh public GetCount() nh sau:

    Employee::GetCount()

    Hm GetCount() c s dng xc nh s cc i tng caEmployee khi to hin hnh. Ch rng khi khng c cc i tng trong chng trnh, li gi hmEmployee::GetCount() c a ra. Tuynhin khi c cc i tng khi ng hm GetCount() c thc gi thng qua mt trong cc i tngnh sau:

    E1Ptr->GetCount()

    Trong chng trnh cc dng 34, 37, 58 v 67 s dng hm assert() (nh ngha trong assert.h). Hmny kim tra gi tr ca biu thc. Nu gi tr ca biu thc l 0 (false), hm assert() in mt thng bo li vgi 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 cgi trng. Chng hn hm dng 34 hm assert() kim tra con trFirstName xc nh nu n khng

    bng 0 (null). Nu iu kin trong khng nh (assertion) cho trc