You are on page 1of 449

Li Gii thiu Vo thu khi u s dng my tnh, cch lp trnh l lp trnh tun t.

Khong nhng nm 70-80 xu hng lp trnh ch yu l lp trnh c cu trc. Bc sang nhng nm 90, phng php lp trnh hng i tng tr nn ph bin, c nhng ngi lm tin hc quan tm nghin cu nhiu. Lp trnh hng i tng tr thnh phng php lp trnh hin i v n c nhng u im nh: - S tru tng ho: mi i tng trong chng trnh l mt tru xut ca mt i tng (vt l hay phi vt l) trong thc t ca bi ton. iu ny lm cho chng trnh gn gi hn vi ngi dng v d thit k hn i vi ngi lp trnh. - S ng gi: Mi i tng l mt s ng gi c ba mt: d liu, trng thi v thao tc, lm cho i tng l mt n nguyn bn vng cho qu trnh phn tch, thit k v lp trnh. Xy dng trn nguyn tc giu kn ti a, cng khai ti thiu, i tng thch ng d dng vi vic sa li, bo tr hay pht trin. - Vic s dng li: i tng l mt n v lp ln, c th s dng li cho bi ton khc. - S k tha c vn dng cho cc i tng lm tit kim c m ngun, ng thi to kh nng cho s tip ni v m rng chng trnh. Ngy nay c nhiu ngn ng lp trnh h tr cho i tng: - C nhng ngn ng ch mi da vo i tng (c ng gi m khng c k tha), nh ADA (83). - C nhng ngn ng hng i tng thun khit, ch c php s dng i tng trong lp trnh, nh SMALLTALK, JAVA... - C nhng ngn ng lai, c th lp trnh hng i tng mt cch y , m cng c th lp trnh dng i tng. Turbo PASCAL, C++ thuc loi ny.

Ngn ng C t khi ra i sm khng nh c v th l cng c ch yu trong cng ngh phn mm. C++ pht trin C thnh ngn ng hng i tng tha k c cc im mnh ca C v thch ng vi xu hng lp trnh hin i. Chn C++ ging dy cng nh lm cng c pht trin phn mm l hp l, v khng nhng n mnh, m n d hiu cho nhng ngi vn quen vi lp trnh truyn thng, nay i vo lp trnh hng i tng. Nh vy ch ca cun sch l hon ton thch hp vi nhu cu ging dy lp trnh cc trng i hc, cng nh vi nhu cu ca nhng lp trnh vin ang hnh ngh. Cun sch gm 6 chng v 4 ph lc - Chng 1: Lp trnh hng i tng-phng php gii quyt bi ton mi - Chng 2: Nhng m rng ca C++ - Chng 3: i tng v lp - Chng 4: nh ngha ton t trn lp - Chng 5: K thut tha k - Chng 6: Khun hnh - Ph lc 1: Cc knh xut nhp - Ph lc 2: X l li - Ph lc 3: Bi ton quan h gia nh - Ph lc 4: M chng trnh bi ton quan h gia nh. Nh vy cun sch bao trm cc vn cn cp v c cu trc kh hp l. Mi chng u kt thc bi phn tm tt v cc bi tp, thun tin cho vic hc v thc hnh. Ni dung cc phn c trnh by d hiu, chun xc, c nhiu th d minh ho. Cun sch c th dng lm: - Gio trnh ging dy v lp trnh hng i tng cc trng i hc.

- Sch tham kho v C++ cho nhng ngi lp trnh chuyn nghip. Ti cho rng quyn sch l rt c ch v hy vng s sm c xut bn phc v bn c. Xin trn trng gii thiu vi bn c cun sch Lp trnh hng i tng vi C++, mt sxn phm lao ng khoa hc nghim tc ca tp th cn b ging dy khona Cng ngh Thng tin, i hc Bch khoa H ni. H ni, ngy 4 thng 5 nm 1999 GS. Nguyn Vn Ba Khoa CNTT, HBK H ni

Trng i hc Bch khoa H ni Khoa Cng ngh Thng tin --0-L ng Hng, T Tun Anh, Nguyn Hu c Nguyn Thanh Thu

Lp trnh hng i tng vi C++

H ni 1999

Ti liu tham kho [1]. Claude Delannoy, Programmer en langage C++, EYROLLES. [2]. Scott Robert Ladd, Turbo C++ Techniques and Applications, M&T Books. [3]. H.M. Deitel & P.J. Deitel, C How to program.

Li ni u Ngn ng C c xem l mt ngn ng lp trnh vn nng v c s dng rng ri gii quyt cc bi ton khoa hc k thut: x l nh, ho, ghp ni my tnh. Ngn ng C cng l mt cng c mnh cho php xy dng cc chng trnh h thng nh h iu hnh UNIX, cc chng trnh dch v cc cng c tin ch khc. im mnh ng ch ca ngn ng C chnh l s mm do v kh nng trao chuyn cao gia cc h thng tnh ton. Trn c s ngn ng C ngi ta tin hnh xy dng mt phin bn hng i tng gi l C++ nhm tha k cc im mnh vn c ca C. Vic tm hiu ngn ng C++ ang l mt xu th c quan tm bi cc nh lp trnh nhm pht trin cc phn mm ng dng Vit nam. Hin nay, trn th trng c mt s ti liu tham kho gii thiu v C++. Tuy nhin, cc ti liu ny ch mi dng li mc gii thiu v m t cc kha cnh c php ca ngn ng. Trong cun sch ny, nhng trnh by v cc kha cnh lp trnh hng i tng c tnh s phm cao, i t mc d n kh nhm gip ngi c c th lnh hi cc kin thc c bn khng ch l thuc vo mt ngn ng lp trnh c th nh C++ c quan tm thch ng. Trong chng trnh ging dy c nhn, k s chuyn ngnh Cng ngh Thng tin, ngn ng lp trnh C++ c chn minh ho cho lp trnh hng i tng nh cc u im trong kh nng biu din d liu v th hin cc kha cnh lp trnh. Vic nm bt cc kha cnh c o ca ngn ng v lm ch cc yu t c bn khi lp trnh trong ngn ng C++ s l c s nng cao hiu bit v k nng lp trnh bng ngn ng JAVA, mt cng c khng th thiu c trong vic pht trin cc ng dng trn mng.

Chng ti bin son ti liu ny vi hy vng rng n s rt b ch v cn thit i vi cc sinh vin cao ng v i hc khng ch trong chuyn ngnh Cng ngh Thng tin m c cc ngnh k thut, cng ngh khc nh in t Vin Thng, T ng ho iu khin v.v... Khi bin son, chng ti c gng a ra mt b cc ca cun sch sao cho bm st c cc ni dung c bn xung quanh cc kha cnh c php ca ngn ng v nhng k nng lp trnh trn . Cc kin thc c trnh by c ng nhm gip ngi hc v t hc d tip thu cc kin thc c truyn th. Trong qu trnh bin son cun sch, chng ti nhn c nhiu kin ng gp qu bu ca GS. Nguyn Vn Ba, GS. V Lc, GS Xun Li, Ths. Vn Uy v cc thy c trong khoa Cng ngh Thng tin, trng i hc Bch khoa H ni. Chng ti xin chn thnh cm n s gip qu gi . Nhn dp ny chng ti cng xin by t s bit n ti GS Nguyn Thc Hi v Ban ch nhim khoa Cng ngh Thng tin v Nh xut bn Gio dc to iu kin vt cht v tinh thn cun sch sm ra mt bn c. Tuy ht sc c gng nhng chng ti ngh rng s khng trnh khi nhng thiu st, rt mong nhn c cc kin ng gp nng cao cht lng trong cc ln ti bn sau. H ni, ngy 1 thng 5 nm 1999 Cc tc gi

Mc lc Chng 1. Lp trnh hng i tng, phng php gii quyt bi ton mi 1.Phng php lp trnh 1 2.Bi ton quan h gia nh 2 3.Lp trnh hng i tng6 3.1Mt s khi nim..................................................... 7 3.2Cc u im ca LTHT ........................................ 8 3.3Nhng ng dng ca LTHT.................................. 9 4.Cc ngn ng lp trnh hng i tng 9 5.Ngn ng lp trnh C++ 10 Chng 2. Cc m rng ca C++ so vi C 1. Cc im khng tng thch gia C++ v ANSI C 13 1.1 nh ngha hm.................................................... 13 1.2 Khai bo hm nguyn mu .................................. 13

1.3 S tng thch gia con tr void v cc con tr khc............................................................................. 14 2. Cc kh nng vo/ra mi ca C++ 15 2.1 Ghi d liu ln thit b ra chun (mn hnh) cout15 2.2 Cc kh nng vit ra trn cout.............................. 16 2.3 c d liu t thit b vo chun (bn phm) cin 18 3. Nhng tin ch cho ngi lp trnh 19 3.1 Ch thch cui dng ............................................. 19 3.2 Khai bo mi ni.................................................. 20 3.3 Ton t phm vi :: ............................................ 20 4. 5. Hm inline Tham chiu 21 23

5.1 Tham chiu ti mt bin ...................................... 23 5.2 Truyn tham s cho hm bng tham chiu .......... 25 5.3 Gi tr tr v ca hm l tham chiu .................... 28 6. nh ngha chng hm (Overloading functions) 29
Trng hp cc hm c mt tham s ................................................... 31 Trng hp cc hm c nhiu tham s................................................. 32

7. Tham s ngm nh trong li gi hm 32 8. B sung thm cc ton t qun l b nh ng: new v delete 35 8.1 Ton t cp pht b nh ng new ...................... 35 8.2 Ton t gii phng vng nh ng delete .......... 36 9. Tm tt 38 9.1 Ghi nh................................................................. 38 9.2 Cc li thng gp ............................................... 39 9.3 Mt s thi quen lp trnh tt .............................. 39 10. Bi tp 39 Chng 3. i tng v lp 1. 2. i tng 40 Lp 42 2.1 Khai bo lp ......................................................... 42

2.1.1To i tng................................................................................ 44 2.1.2Cc thnh phn d liu ................................................................. 45 2.1.3Cc hm thnh phn ..................................................................... 45 2.1.4Tham s ngm nh trong li gi hm thnh phn....................... 49 2.1.5Phm vi lp................................................................................... 50 2.1.6T kho xc nh thuc tnh truy xut ......................................... 50 2.1.7Gi mt hm thnh phn trong mt hm thnh phn khc .......... 54

2.2 Kh nng ca cc hm thnh phn ...................... 54


2.2.1nh ngha chng cc hm thnh phn. ....................................... 54 2.2.2Cc tham s vi gi tr ngm nh................................................ 56

2.2.3S dng i tng nh tham s ca hm thnh phn ................... 57 2.2.4Con tr this................................................................................... 59

3.

Php gn cc i tng

59

4. Hm thit lp (constructor) v hm hu b (destructor) 60 4.1 Hm thit lp........................................................ 60


4.1.1Chc nng ca hm thit lp ........................................................ 60 4.1.2Mt s c im quan trng ca hm thit lp ............................ 62 4.1.3Hm thit lp ngm nh .............................................................. 63 4.1.4Con tr i tng.......................................................................... 67 4.1.5Khai bo tham chiu i tng .................................................... 69

4.2 Hm hu b.......................................................... 70
4.2.1Chc nng ca hm hu b .......................................................... 70 4.2.2Mt s qui nh i vi hm hu b ............................................ 71

4.3 S cn thit ca cc hm thit lp v hu b -lp vector trong khng gian n chiu ..................................... 72 4.4 Hm thit lp sao chp(COPY CONSTRUCTOR) . 75
4.4.1Cc tnh hung s dng hm thit lp sao chp ........................... 75 4.4.2Hm thit lp sao chp ngm nh ............................................... 76 4.4.3Khai bo v nh ngha hm thit lp sao chp tng minh......... 76 4.4.4Hm thit lp sao chp cho lp vector.......................................... 79

5.

Cc thnh phn tnh (static)83 5.1 Thnh phn d liu static. .............................. 83 5.2 Khi to cc thnh phn d liu tnh ................... 84 5.3 Cc hm thnh phn static ................................... 86

6.

i tng hng (CONSTANT )

89

6.1 i tng hng..................................................... 89 6.2 Hm thnh phn const ........................................ 89 7. Hm bn v lp bn 89 7.1 t vn ............................................................ 89

7.2 Hm t do bn ca mt lp.................................. 90 7.3 Cc kiu bn b khc ........................................... 92


7.3.1Hm thnh phn ca lp l bn ca lp khc.............................. 92 7.3.2Hm bn ca nhiu lp................................................................. 93 7.3.3Tt c cc hm ca lp l bn ca lp khc ................................. 94

7.4 Bi ton nhn ma trn vi vector ......................... 95


Gii php th nht - prod l hm bn t do .......................................... 95 Gii php th hai- prod l hm thnh phn ca lp matrix v l bn ca vect 97

V d tng hp 98 Tm tt 103 9.1 Ghi nh............................................................... 103 9.2 Cc li thng gp ............................................. 104 9.3 Mt s thi quen lp trnh tt ............................ 105 10. Bi tp 105 Chng 4. nh ngha ton t trn lp 1. 2. Gii thiu chung 109 V d trn lp s phc 110 2.1 Hm ton t l hm thnh phn ......................... 110 2.2 Hm ton t l hm bn ..................................... 112 3. Kh nng v gii hn ca nh ngha chng ton t 122 Phn ln ton t trong C++ u c th nh ngha chng ........................................................................ 122 Trng hp cc ton t ++ v -- ............................... 123 La chn gia hm thnh phn v hm bn ............. 124 4. Chin lc s dng hm ton t 124 Cc php ton mt ngi ............................................ 124 Cc php ton hai ngi ............................................. 124 Cc php gn............................................................. 124 Ton t truy nhp thnh phn ->........................... 125

8. 9.

Ton t truy nhp thnh phn theo ch s ................ 125 Ton t gi hm........................................................ 125 5. Mt s v d tiu biu 125 5.1 nh ngha chng php gn = ....................... 125 5.2 nh ngha chng php []" ............................... 130 5.3 nh ngha chng << v >> ............................... 133 5.4 nh ngha chng cc ton t new v delete ... 135 5.5 Php nhn ma trn vc t ................................... 137 6. Chuyn i kiu 142 6.1 Hm ton t chuyn kiu p buc...................... 143
6.1.1 6.1.2 Hm ton t chuyn kiu trong li gi hm ..................... 145 Hm ton t chuyn kiu trong biu thc ......................... 147

6.2 Hm ton t chuyn i kiu c s sang kiu lp 148


6.2.1 6.2.2 6.2.3 6.3.1 6.3.2 Hm thit lp trong cc chuyn i kiu lin tip ............ 150 La chn gia hm thit lp v php ton gn.................. 150 S dng hm thit lp m rng ngha mt php ton 152 Hm ton t chuyn kiu bt buc ................................... 154 Hm thit lp dng lm hm ton t................................. 156

6.3 Chuyn i kiu t lp ny sang mt lp khc.. 154

Tm tt 157 7.1 Ghi nh............................................................... 157 7.2 Cc li thng gp ............................................. 158 7.3 Mt s thi quen lp trnh tt ............................ 158 8. Bi tp 158

7.

Chng 5. K thut tha k 1. 2. Gii thiu chung 161 n tha k 165 2.1 V d minh ho................................................... 165 2.2 Truy nhp cc thnh phn ca lp c s t lp dn xut ........................................................................... 167 2.3 nh ngha li cc thnh phn ca lp c s trong lp dn xut .............................................................. 168 2.4 Tnh tha k trong lp dn xut ......................... 168

2.4.1 S tng thch ca i tng thuc lp dn xut vi i tng thuc lp c s ......................................................................... 168 2.4.2 2.4.3 c s 2.5.1 2.5.2 2.5.3 2.6.1 2.6.2 2.6.3 Tng thch gia con tr lp dn xut v con tr lp c s 170 Tng thch gia tham chiu lp dn xut v tham chiu lp 172 Hm thit lp trong lp ..................................................... 174 Phn cp li gi................................................................. 176 Hm thit lp sao chp...................................................... 177 Dn xut public ................................................................ 182 Dn xut private ............................................................... 182 Dn xut protected .......................................................... 182

2.5 Hm thit lp trong lp dn xut ....................... 174

2.6 Cc kiu dn xut khc nhau. ............................ 181

Bng tng kt cc kiu dn xut......................................................... 182

3.

Hm o v tnh a hnh 183 3.1 t vn .......................................................... 183 3.2 Tng qut v hm o.......................................... 190
Phm vi ca khai bo virtual ........................................... 190 Khng nht thit phi nh ngha li hm virtual ............. 194 nh ngha chng hm o ................................................. 197 Khai bo hm o mt lp bt k trong s tha k .... 197 Hm hu b o .................................................................. 201

3.2.1 3.2.2 3.2.3 3.2.4 3.2.5

3.3 Lp tru tng v hm o thun tu .................. 204

4.

a tha k 205 4.1 t vn .......................................................... 205 4.2 Lp c s o ....................................................... 210 4.3 Hm thit lp v hu b - vi lp o.................. 213 4.4 Danh sch mc ni cc i tng...................... 219

Xy dng lp tru tng..................................................................... 219

4.5 To danh sch mc ni khng ng nht .......... 227 5. Tm tt 231 5.1 Ghi nh............................................................... 231 5.2 Cc li thng gp ............................................. 232 5.3 Mt s thi quen lp trnh tt ............................ 232 6. Bi tp 232 Chng 6. Khun hnh 1. Khun hnh hm233 1.1 Khun hnh hm l g?....................................... 233 1.2 To mt khun hnh hm ................................... 233 1.3 S dng khun hnh hm ................................... 234
Khun hnh hm cho kiu d liu c s ........................... 234 Khun hnh hm min cho kiu char *.............................. 235 Khun hnh hm min vi kiu d liu lp ........................ 236 Cc tham s kiu trong nh ngha khun hnh hm ........ 237

1.3.1 1.3.2 1.3.3 1.4.1

1.4 Cc tham s kiu ca khun hnh hm .............. 237 1.5 Gii thut sn sinh mt hm th hin ................ 240 1.6 Khi to cc bin c kiu d liu chun............ 241 1.7 Cc hn ch ca khun hnh hm ...................... 241 1.8 Cc tham s biu thc ca mt khun hnh hm242 1.9 nh ngha chng cc khun hnh hm ............. 244 1.10C th ho cc hm th hin 246

1.11Tng kt v cc khun hnh hm 247 2. Khun hnh lp 247 2.1 Khun hnh lp l g?......................................... 247 2.2 To mt khun hnh lp..................................... 248 2.3 S dng khun hnh lp ..................................... 249 2.4 V d s dng khun hnh lp............................ 250 2.5 Cc tham s trong khun hnh lp ..................... 251
2.5.1 2.5.2 S lng cc tham s kiu trong mt khun hnh lp....... 251 Sn sinh mt lp th hin .................................................. 251

2.6 Cc tham s biu thc trong khun hnh lp ..... 252 2.7 Tng qut v khun hnh lp ............................. 254 2.8 C th ho khun hnh lp ................................ 255 2.9 S ging nhau ca cc lp th hin.................... 257 2.10Cc lp th hin v cc khai bo bn b 258
2.10.1 Khai bo cc lp bn hoc cc hm bn thng thng..... 258 2.10.2 Khai bo bn b ca mt th hin ca khun hnh hm, khun hnh lp.................................................................................... 258 2.10.3 Khai bo bn b ca khun hnh hm, khun hnh lp .... 259

2.11V d v lp bng c hai ch s 259 3. Tm tt 263 3.1 Ghi nh............................................................... 263 4. Bi tp 263 Ph lc 1. Cc knh xut nhp Gii thiu chung 265 1.1 Khi nim v knh ............................................. 265 1.2 Th vin cc lp vo ra ...................................... 265 2. Lp ostream 266 1.

2.1 2.2 2.3 2.4


2.4.1 2.4.2

nh ngha chng ton t << trong lp ostream 266 Hm put.............................................................. 266 Hm write........................................................... 267 Kh nng nh dng ........................................... 267
Chn c s th hin........................................................... 267 t rng ....................................................................... 268

3.

Lp istream 270 3.1 nh ngha chng ton t >> trong lp istream 270 3.2 Hm thnh phn get ........................................... 271 3.3 Cc hm thnh phn getline v gcount..... 272 3.4 Hm thnh phn read ...................................... 272

3.5 Mt s hm khc................................................ 273 4. Trng thi li ca knh nhp 273 4.1 Cc c li ........................................................... 273 4.2 Cc thao tc trn cc bit li................................ 274
4.2.1 4.2.2 c gi tr ......................................................................... 274 Thay i trng thi li....................................................... 274

4.3 nh ngha cc ton t () v ! ............................ 274 5. Qun l nh dng 275 5.1 Trng thi nh dng ca mt dng ................... 275 5.2 T trng thi nh dng...................................... 276 5.3 Thao tc trn trng thi nh dng ..................... 277
5.3.1 5.3.2 5.3.3 Cc ton t thao tc nh dng khng tham s (TTDKTS) 278 Cc ton t nh dng c tham s(TTDCTS) ................. 278 Cc hm thnh phn.......................................................... 279

6.

Lin kt knh xut/nhp vi mt tp tin280 6.1 Lin kt xut vi mt tp tin .............................. 280 6.2 Lin kt knh nhp vi mt tp tin .................... 282 6.3 Cc kh nng truy nhp trc tip ....................... 283

6.4 Cc ch m tp tin khc nhau ....................... 286 Ph lc 2. X l li 1. 2. 3. By v bt li 287 Hot ng ca chng trnh khi mt li pht sinh 290 X l li trong lp ng dng 293

Ph lc 3. Bi ton quan h gia nh Ph lc 4. M ngun bi ton quan h gia nh

Chng 1 Lp trnh hng i tng phng php gii quyt bi ton mi 1. Phng php lp trnh T nhiu nm nay chng ta nghe nhiu n thut ng Lp trnh hng i tng (OOP - Object Oriented Programming). Vy thc cht n l g? hiu c vn ny chng ta bt u nhn li mt cht lch s pht trin cc phng php lp trnh. Vo nhng ngy u pht trin ca my tnh, khi cc phn mm cn rt n gin ch c vi chc dng lnh, chng trnh c vit tun t vi cc cu lnh thc hin t u n cui. Cch vit chng trnh nh th ny gi l phng php lp trnh tuyn tnh. Khoa hc my tnh ngy cng pht trin, cc phn mm i hi ngy cng phc tp v ln hn rt nhiu. n lc ny phng php lp trnh tuyn tnh t ra km hiu qu v c nhng trng hp ngi lp trnh khng th kim sot c chng trnh. Th l phng php lp trnh cu trc (LTCT) ra i. Theo cch tip cn ny, chng trnh c t chc thnh cc chng trnh con. Mi chng trnh con m nhn x l mt cng vic nh trong ton b h thng. Mi chng trnh con ny li c th chia nh thnh cc chng trnh con nh hn. Qu trnh phn chia nh vy tip tc din ra cho n cc chng trnh con nh nhn c n gin. Ngi ta gi l qu trnh lm mn dn. Cc chng trnh con tng i c lp vi nhau, do c th phn cng cho tng nhm m nhn vit cc chng trnh con khc nhau. Ngn ng lp trnh th hin r nt nht phng php lp trnh cu trc chnh l Pascal. Tuy nhin, khi s dng phng php lp trnh ny vn cn gp mt kh khn ln l t chc d liu ca h thng nh th no trong my tnh. Bi v theo quan im ca LTCT

th Chng trnh = Cu trc d liu + Gii thut. lm c vic ny i hi ngi lp trnh phi c kin rt vng v cu trc d liu. Mt kh khn na gp phi l gii thut ca chng trnh ph thuc rt cht ch vo cu trc d liu, do vy ch cn mt s thay i nh cu trc d liu cng c th lm thay i gii thut v nh vy phi vit li chng trnh. iu ny r rng khng th thch hp khi phi xy dng mt d n phn mm rt ln. Mt phng php lp trnh mi ra i khc phc nhc im ny v chnh l phng php lp trnh hng i tng (LTHT). im cn bn ca phng php ny l thit k chng trnh xoay quanh d liu ca h thng. Ngha l lc ny cc thao tc x l ca h thng c gn lin vi d liu v nh vy mt s thay i nh ca d liu ch nh hng n cc mt s nh cc hm x l lin quan. S gn kt gia d liu v cc hm x l trn chng to ra i tng. Mt u im na c phng php LTHT l cch tip cn bi ton tr nn gn gi vi thc t hn. hiu r hn v phng php lp trnh ny, khng g tt hn l chng ta i vo mt bi ton c th, chng hn bi ton quan h gia nh. y yu cu lm th no th hin c cc mi quan h gia cc thnh vin trong mt gia nh trn my tnh v c th tr li c cu hi dng kh tng qut: A v B c quan h nh th no trong gia nh ? vi A v B l hai c th bt k. Chng ta s phn tch xem cch gii quyt bi ton ny nh th no. 2. Bi ton quan h gia nh Trong x hi, mi ngi u c mt gia nh, trong tn ti nhiu mi quan h gia nh kh phc tp nh ng, b, cha, m, c, ch, bc, v.v. Thng thng, th hin cc mi quan h ny ngi ta biu din bng mt s cy quan h. Di y l mt v d biu din mt gia nh ba th h bng hnh 1.1.

Mr. Thng

Ms. Nga

Mr. Quang

Ms. Vn

Mr. Tun

Ms. Hng

Mr. Hng

Miss. Trang

Miss. Mai

Hnh 1.1 Cy quan h trong mt gia nh

gii quyt bi ton ny theo phng php LTCT, cng vic u tin l phi xy dng mt cu trc d liu th hin c cy quan h trn. Trng qua c v l n gin nhng nu th lm xem s thy khng n gin cht no, thm ch cn kh. Bi v n i hi ngi lp trnh phi rt thnh tho s dng con tr, phi xy dng c gii thut cp nht thng tin trn cy quan h. Cc gii thut ny tng i phc tp i vi mt cu trc d liu nh trong bi ton. Yu cu ca bi ton l tr li c cu hi dng nh Hng v Mai c quan h nh th no ?. Cu tr li ca chng trnh phi l Hng l anh h ca Mai. c th thc hin c nh vy, r rng chng ta phi xy dng c gii thut tm c mi quan h gia hai nt trn cy quan h. Mt vn phc tp v t nh hn l tn gi cho cc mi quan h gia nh Vit nam rt phong ph! Mt kh khn l phi vt cn ht cc mi quan h c th c trn mt cy quan h. Mt kh khn na gp phi l khi cn pht trin, chng trnh phi qun l c nhiu gia nh cng mt lc v cc gia nh ny c mi quan h thng gia vi nhau. Hnh 1.2 l s quan h c pht trin t s v d trn minh ho cho vn ny.
- - - - - - - - Mr. Quang Ms. Vn Mr. Tun Ms. Hng Mr. Thng Ms. Nga Mr. Thnh Ms. Lan

- - - - - - -

Mr. Hng

Miss. Trang

Miss. Mai

Hnh 1.2 M rng quan h gia cc gia

Mt cu hi t ra: Liu vi cu trc d liu c c m bo gii quyt c vn ny khng ?. R rng cu tr li l khng. S quan h trn hnh v s phi m t quan h ca mt gia nh. Ch vi cht t s thay i v cu trc d liu cng dn n mt lot vn i hi phi vit li cc gii thut ca chng trnh. Phng php lp trnh mi hng i tng cho php chng ta khc phc c cc vn nu ra. Trong sut cc trnh by ca cun sch ny s c gng nu bt c cch gii quyt vn nh LTHT. Theo cch tip cn LTHT, bi ton quan h gia nh c xem xt di gc qun l tp cc i tng Con ngi. bit mi quan h gia nh ca mi c th, cn th hin mt s quan h c bn nh cha, m, anh em, con ci, v chng ca c th . Nh vy, mi i tng con ngi ca bi ton c cc thuc tnh ring, ni ln rng cha m, anh em, v.v.. ca h l ai. Ngoi ra cng cn c mt thuc tnh na cho bit tn c th l g. C th m t mt lp cc i tng con ngi nh hnh 1.3.
Con ngi Tn ? Cha ? M ? Anh em ? Con ci ? V / Chng ? Hnh 1.3 M t mt lp cc i tng con ngi

Nu ch c nh vy th chng khc g mt cu trc hay bn ghi trong cu trc d diu c s dng phng php LTCT. Vn y l phng php LTHT xem cc mi quan h trong gia nh c hnh thnh mt cch t nhin do cc s kin c th trong cuc sng to nn. V d, khi ngi ph n sinh con, a con c ta sinh ra s c m l c ta v cha l chng c ta, ng thi anh chng phi c cp nht c thm a con ny. Nhng a

con trc ca c ta s c thm a em ny v a b c thm nhng ngi anh hoc ngi ch . D dng thy rng c hai s kin chnh tc ng n mi quan h gia nh l s sinh con ca ngi ph n v hn nhn gia hai c th khc gii trong x hi. Cc s kin ny gn lin vi tng con ngi trong bi ton. iu ny c ngha l khi ni n mt s kin no th phi ch ra n c pht sinh bi ngi no. V d, khi ni s kin sinh con th phi bit ngi no sinh. Khi mt s kin ca mt con ngi no xy ra (v d nh sinh con) th cc thuc tnh ca chnh anh ta s b thay i, ng thi thuc tnh ca mt s i tng lin quan cng c th thay i theo. Qu trnh ng gi gia cc s kin v thuc tnh s to ra i tng, khi nim c bn ca phng php LTHT. Mt m t chung cho cc i tng con ngi ca bi ton c gi l mt Lp. Hnh 1.4 minh ho mt lp Con ngi c thm cc s kin ca bi ton.
Con ngi Tn ? Cha ? M ? Anh em ? Con ci ? V / Chng ? Sinh con Hnh 1.4 Cc s kin b sung gn vi con ngi.

Sau khi gn kt cc s kin vo i tng nh trn, vn l to mt s quan h gia nh nh th no. Di y l mt v d minh ho vic to ra mt quan h gia nh da trn cc s kin cuc sng. Gi thit l c hai i tng l ng Thng v b Mai.
Mr. Thng Ms. Mai

Miss. Nga

Mr. Tun

Cc s kin to ra cy quan h trn c th vit theo trt t nh sau: Thng.Ci (Mai) Mai.Sinh con (gi, Nga) Mai.Sinh con (trai,Tun) Cc s kin vit theo c php:
i tng to s kin . S kin ( thng s km theo s kin

Nh vy cc bn thy rng chng ta khng cn phi quan tm n cch to mt cu trc cy quan h nh th no bn trong d liu ca chng trnh m vn c th cung cp d liu bi ton cho chng trnh thng qua cc s kin nh trn. Chng ta quay li vn chnh ca bi ton l tr li cc cu hi v mi quan h gia nh nh th no khi tip cn bi ton theo phng php ny. tr li c cu hi tng qut X v Y c quan h gia nh nh th no ? ta cn phi tr li cc cu hi nh nh X c phi l anh ca Y khng ?, X c phi l ng ni ca Y khng ?, v.v.. Cu hi c th nhn t gc i tng X nh : i tng c phi l anh ca Y khng ?, c phi l ng ni ca Y khng ?, v.v.. Nh vy cu hi lc ny giao v cho i tng tr li. Cc i tng lc ny cn phi c cc phng thc tr li cc cu hi nh vy. V by gi mt lp i tng Con ngi c minh ho nh hnh 1.5.
Con ngi Tn ? Cha ? M ? Anh em ? Con ci ? V / Chng ? Sinh con Ci L anh L ng ni Hnh 1.5 Thm cc phng thc tr li cu hi

Ta xem xt cc i tng tr li cc cu hi nh th no? Chng hn X tr li cu hi i tng c phi l anh ca Y khng ? hon ton n gin. N ch cn kim tra xem Y c phi l anh em m trong thuc tnh ca n lu gi khng. Hon ton tng t i vi cc cu hi quan h gn nh l em, l ch, l b, l m,... Cn cu hi nh i tng c phi l ng ni ca Y khng ? phc tp hn cht t. tr li c cc cu hi c quan h xa nh th ta phi da vo kt qu tr li ca cc cu hi v cc quan h gn gi hn. bit c X ng l ng ni ca Y th phi ch ra mt ngi Z no m X l b ca Z v Z l b ca Y. Nu khng ch ra c Z th X khng phi l ng ni ca Y. Vic tm kim Z hon ton n gin bi v chng trnh qun l tp cc i tng con ngi. Hy tm Z trong tp i tng Con ngi. C th thy cu hi ban u c phn chia thnh hai cu hi n gin vi chng m c cch tr li. Tm li, cc vn ca bi ton c gii quyt khi tip cn theo phng php LTHT. Mt li im c th thy ngay l bi ton c phn tch rt gn vi thc t v t nhin. Trn y mi ch l s phn tch s khai bi ton da theo phng php LTHT. lm hon chnh c bi ton cn cn mt s k thut ca LTHT nh tnh k tha, tnh a hnh, ... Chng ti hy vng rng qua s phn tch mt bi ton nh trn chng t c li ch ca phng php LTHT. Trong mc tip theo chng ti s tm tt v a ra tng quan s b v LTHT. 3. Lp trnh hng i tng Lp trnh hng i tng t trng tm vo i tng, yu t quan trng trong qu trnh pht trin chng trnh v khng cho php d liu bin ng t do trong h thng. D liu c gn cht vi cc hm thnh cc vng ring m ch c cc hm tc ng ln v cm cc hm bn ngoi truy nhp ti mt cch tu tin. LTHT cho php chng ta phn tch bi ton thnh cc thc th c gi l cc i tng v sau xy dng cc d liu cng cc hm xung quanh cc i tng . Cc i tng c

th tc ng, trao i thng tin vi nhau thng qua c ch thng bo (message). T chc mt chng trnh hng i tng c th m t nh trong hnh 1.6.
i tng A D liu i tng C D liu Hnh 1.6 Cc i tng trao i qua thng bo message i tng B D liu

LTHT c cc c tnh ch yu sau: 1. Tp trung vo d liu thay cho cc hm 2. Chng trnh c chia thnh cc i tng. 3. Cc cu trc d liu c thit k sao cho c t c i tng. 4. Cc hm thao tc trn cc vng d liu ca i tng c gn vi cu trc d liu . 5. D liu c ng gi li, c che giu v khng cho php cc hm ngoi lai truy nhp t do. 6. Cc i tng tc ng v trao i thng tin vi nhau qua cc hm 7. C th d dng b sung d liu v cc hm mi vo i tng no khi cn thit 8. Chng trnh c thit k theo cch tip cn t di ln (bottom-up). Sau y l mt s khi nim c s dng trong LTHT. 3.1 Mt s khi nim i tng (object)

i tng l s kt hp gia d liu v th tc (hay cn gi l cc phng thc - method) thao tc trn d liu . C th a ra cng thc phn nh bn cht k thut ca LTHT nh sau: i tng = D liu + Phng thc Lp (class) Lp l mt khi nim mi trong LTHT so vi cc k thut lp trnh khc. l mt tp cc i tng c cu trc d liu v cc phng thc ging nhau (hay ni cch khc l mt tp cc i tng cng loi). Nh vy khi c mt lp th chng ta s bit c mt m t cu trc d liu v phng thc ca cc i tng thuc lp . Mi i tng s l mt th hin c th (instance) ca lp . Trong lp trnh, chng ta c th coi mt lp nh l mt kiu, cn cc i tng s l cc bin c kiu ca lp. Nguyn tc ng gi d liu Trong LTCT ta thy l cc hm hay th tc c s dng m khng cn bit n ni dung c th ca n. Ngi s dng ch cn bit chc nng ca hm cng nh cc tham s cn truyn vo gi hm chy m khng cn quan tm n nhng lnh c th bn trong n. Ngi ta gi l s ng gi v chc nng. Trong LTHT, khng nhng cc chc nng c ng gi m c d liu cng nh vy. Vi mi i tng ngi ta khng th truy nhp trc tip vo cc thnh phn d liu cu n m phi thng qua cc thnh phn chc nng (cc phng thc) lm vic . Chng ta s thy s ng gi thc s v d liu ch c trong mt ngn ng LTHT thun khit (pure) theo ngha cc ngn ng c thit k ngay t u ch cho LTHT. Cn i vi cc ngn ng lai (hybrid) c xy dng trn cc ngn ng khc ban u cha phi l HT nh C++ c ni n trong cun sch ny, vn c nhng ngoi l nht nh vi phm nguyn tc ng gi d liu. Tnh k tha (inheritance)

Mt khi nim quan trng ca LTHT l s k tha. S k tha cho php chng ta nh ngha mt lp mi trn c s cc lp tn ti, tt nhin c b sung nhng phng thc hay cc thnh phn d liu mi. Kh nng k tha cho php chng ta s dng li mt cch d dng cc module chng trnh m khng cn mt thay i cc module . R rng y l mt im mnh ca LTHT so vi LTCT. Tnh a hnh (polymorphime) Tnh a hnh xut hin khi c khi nim k tha. Gi s chng ta c mt k tha lp hnh t gic v lp hnh tam gic k tha t lp hnh a gic (hnh tam gic v t gic s c y cc thuc tnh v tnh cht ca mt hnh a gic). Lc ny mt i tng thuc lp hnh tam gic hay t gic u c th hiu rng n l mt hnh a gic. Mt khc vi mi a gic ta c th tnh din tch ca n. Nh vy lm th no m mt a gic c th s dng ng cng thc tnh din tch ph hp vi n l hnh tam gic hay t gic. Ta gi l tnh a hnh. 3.2 Cc u im ca LTHT LTHT em li mt s li th cho ngi thit k ln ngi lp trnh. Cch tip cn hng i tng gii quyt c nhiu vn tn ti trong qu trnh pht trin phn mm v to ra c nhng phn mm c phc tp v cht lng cao. Phng php ny m ra mt trin vng to ln cho ngi lp trnh. Nhng u im chnh ca LTHT l: 1. Thng qua nguyn l k tha, chng ta c th loi b c nhng on chng trnh lp li trong qu trnh m t cc lp v c th m rng kh nng s dng ca cc lp xy dng m khng cn phi vit li. 2. Chng trnh c xy dng t nhng n th (i tng) trao i vi nhau nn vic thit k v lp trnh s c thc hin theo quy trnh nht nh ch khng phi da vo kinh nghim v k thut

3.

4. 5.

6. 7.

8.

nh trc na. iu ny m bo rt ngn c thi gian xy dng h thng v tng nng sut lao ng. Nguyn l ng gi hay che giu thng tin gip ngi lp trnh to ra c nhng chng trnh an ton khng b thay i bi nhng on chng trnh khc. C th xy dng c nh x cc i tng ca bi ton vo i tng chng trnh. Cch tip cn thit k t trng tm vo d liu, gip chng ta xy dng c m hnh chi tit v d dng ci t hn. Cc h thng hng i tng d m rng, nng cp thnh nhng h ln hn. K thut truyn thng bo trong vic trao i thng tin gia cc i tng lm cho vic m t giao din vi cc h thng bn ngoi tr nn n gin hn. C th qun l c phc tp ca nhng sn phm phn mm.

3.3 Nhng ng dng ca LTHT LTHT l mt trong nhng thut ng c nhc n nhiu nht hin nay trong cng ngh phn mm v n c ng dng pht trin phn mm trong nhiu lnh vc khc nhau. Trong s , ng dng quan trng v ni ting nht hin nay l thit k giao din vi ngi s dng, kiu nh Windows. Cc h thng tin qun l trong thc t thng rt phc tp, cha nhiu i tng vi cc thuc tnh v hm phc tp. gii quyt nhng h thng tin phc tp nh th, LTHT t ra rt hiu qu. Cc lnh vc ng dng ph hp vi k thut LTHT c th lit k nh di y: Cc h thng lm vic theo thi gian thc. Cc h m hnh ho hoc m phng cc qu trnh. Cc h c s d liu hng i tng.

Cc h siu vn bn (hypertext), a phng tin (multimedia). Cc h thng tr tu nhn to v cc h chuyn gia. Cc h thng song song v mng n-ron. Cc h t ng ho vn phng hoc tr gip quyt nh. Cc h CAD/CAM. Vi nhiu c tnh phong ph ca LTHT ni ring, ca phng php phn tch thit k v pht trin hng i tng ni chung chng ta hy vng cng nghip phn mm s c nhng ci tin nhy vt khng nhng v cht lng, m cn gia tng nhanh v s lng trong tng lai. 4. Cc ngn ng lp trnh hng i tng LTHT khng phi l c quyn ca mt ngn ng c bit no. Cng ging nh k thut lp trnh c cu trc, cc khi nim trong LTHT c th hin trong nhiu ngn ng lp trnh khc nhau. Nhng ngn ng cung cp c nhng kh nng LTHT c gi l ngn ng lp trnh hng i tng. Tuy vn c nhng ngn ng ch cung cp kh nng to lp v i tng m khng cho php k tha, do hn ch kh nng LTHT. Hnh 1.7 cho chng ta mt ci nhn tng quan v s pht trin cc ngn ng LTHT.

SIMULA (66) SMALLTALK SMALLTALK ADA (83) C++ (86)

EIFFEL (90) ADA (95) JAVA (95)

Cc ngn ng SIMULA, SMALLTALK, JAVA thuc h ngn ng LTHT thun khit, ngha l n khng cho php pht trin cc chng trnh cu trc trn cc ngn ng loi ny. Cn ngn ng C++ thuc loi ngn ng lai bi v n c pht trin t ngn ng C. Do trn C++ vn c th s dng tnh cu trc v i tng ca chng trnh. iu ny t ra rt ph hp khi chng ta mi bt u hc mt ngn ng lp trnh. chnh l l do m chng ti s dng ngn ng C++ gii thiu phng php LTHT trong cun sch ny. Mt l do khc na l C++ s dng c php ca ngn ng C l ngn ng rt thng dng trong lp trnh chuyn nghip. 5. Ngn ng lp trnh C++ Vo nm 1983, gio s Bjarne Stroustrap bt u nghin cu v pht trin vic ci t kh nng LTHT vo ngn ng C to ra mt ngn ng mi gi l C++. Tn gi ny c th phn tch ngha rng n l ngn ng C m c hai c im mi tng ng vi hai du cng. c im th nht l mt s kh nng m rng so vi C nh tham chiu, chng hm, tham s mc nh... c im th hai chnh l kh nng LTHT. Hin nay C++ cha phi l mt ngn ng hon ton n nh. K t khi phin bn u tin ra i vo nm 1986 c rt nhiu thay i trong cc phin bn C++ khc nhau: bn 1.1 ra i vo nm 1986, 2.0 vo nm 1989 v 3.0 vo nm 1991. Phin bn 3.0 ny c s dng lm c s cho vic nh ngha mt ngn ng C++ chun (kiu nh Ansi C). Trn thc t hin nay tt c cc chng trnh dch C++ u tng thch vi phin bn 3.0. V vy C++ hu nh khng gy bt k mt kh khn no khi chuyn i t mt mi trng ny sang mi trng khc, nh chng ta bit C++ nh l mt s b sung kh nng LTHT vo ngn ng C. S c nhiu ngi ngh rng ngn ng C ni y l C theo chun ANSI. Thc ra khng phi hon ton nh vy. Tn thc t vn tn ti mt vi im khng tng thch gia ANSI C v C++.

Mt khc cng cn thy rng nhng m rng c trong C++ so vi Ansi C khng ch l phc v cho mc ch to cho ngn ng kh nng LTHT. C nhng thay i ch vi mc ch n thun l tng sc mnh cho ngn ng C hin thi. Ngoi ra c mt vi thay i nh C++ so vi ANSI C nh sau: nh ngha cc hm: khai bo, truyn tham s v gi tr tr li. S tng thch gia cc con tr. Tnh linh hot ca cc hng (const). Cc c im m rng trong C++ Nh cp trn C++ cha c nhng m rng so vi C m khng lin quan n k thut hng i tng. Nhng m rng ny s c m t c th trong chng sau, y chng ta ch tm tt li mt vi im chnh. Kh nng vit cc dng ch thch mi. Kh nng khai bo linh hot hn. Kh nng nh ngha li cc hm: cc hm cng tn c th thc hin theo nhng thao tc khc nhau. Cc li gi hm s dng kiu v s tham s xc nh ng hm no cn thc hin. C thm cc ton t nh ngha b nh ng mi: new v delete. Kh nng nh ngha cc hm inline tng tc thc hin chng trnh. To cc bin tham chiu n cc bin khc. LTHT trong C++ C++ cha ng khi nim lp. Mt lp bao gm cc thnh phn d liu hay l thuc tnh v cc phng thc hay l hm thnh phn. T mt lp ta c th to ra cc i tng hoc bng cch khai bo thng thng mt bin c kiu l lp hoc bng cch cp pht b nh ng nh s dng ton t new. C++ cho php chng ta

ng gi d liu nhng n khng bt buc chng ta thc hin iu . y l mt nhc im ca C++. Tuy nhin cng cn thy rng bn thn C++ ch l s m rng ca C nn n khng th l mt ngn ng LTHT thun khit c. C++ cho php ta nh ngha cc hm thit lp (constructor) cho mt lp. Hm thit lp l mt phng thc c bit c gi n ti thi im mt i tng ca lp c to ra. hm thit lp c nhim v khi to mt i tng: cp pht b nh, gn cc gi tr cho cc thnh phn d liu cng nh vic chun b ch cho cc i tng mi. Mt lp c th c mt hay nhiu hm thit lp. xc nh hm thit lp no cn gi n, chng trnh bin dch s so snh cc i s vi cc tham s truyn vo. Tng t nh hm thit lp, mt lp c th c mt hm hu b (destructor), mt phng thc c bit c gi n khi i tng c gii phng khi b nh. Lp trong C++ thc cht l mt kiu d liu do ngi s dng nh ngha. Khi nim nh ngha chng ton t cho php nh ngha cc php ton trn mt lp ging nh cc kiu d liu chun ca C. V d ta c th nh ngha mt lp s phc vi cc php ton cng, tr, nhn, chia. Cng ging nh C, C++ c kh nng chuyn i kiu. Khng nhng th, C++ cn cho php m rng s chuyn i ny sang cc kiu do ngi s dng t nh ngha (cc lp). V d, ta c th chuyn i t kiu chun int ca C sang kiu s phc m ta nh ngha chng hn. C++ cho php thc hin k tha cc lp xy dng. T phin bn 2.0 tr i, C++ cn cho php mt lp k tha cng mt lc t nhiu nhiu lp khc nhau (gi l s a k tha). Cui cng C++ cung cp nhng thao tc vo ra mi da trn c s khi nim lung d liu (flow). S u vit ca cc thao tc ny ch: S dng n gin.

Kch thc b nh c rt gn. Kh nng p dng trn cc kiu do ngi s dng nh ngha bng cch s dng c ch nh ngha chng ton t. 1.Phng php lp trnh ................................................. 18 2.Bi ton quan h gia nh ........................................... 19 3.Lp trnh hng i tng .......................................... 24 3.1Mt s khi nim................................................... 25 3.2Cc u im ca LTHT ...................................... 27 3.3Nhng ng dng ca LTHT................................ 28 4.Cc ngn ng lp trnh hng i tng .................... 29 5.Ngn ng lp trnh C++.............................................. 30

Chng 2 Nhng m rng ca C++ Mc ch chng ny: 1) Gii thiu nhng im khc bit ch yu gia C v C++ 2) Cc im mi ca C++ so vi C (nhng vn c bn nht) 6. Cc im khng tng thch gia C++ v ANSI C 6.1 nh ngha hm Trong nh ngha hm, ANSI C cho php hai kiu khai bo dng tiu ca hm, trong khi C++ ch chp nhn mt cch:
/*C++ khng c khai bo kiu ny*/ double fexple(u,v) int u; double v; /*c C v C++ cho php*/ double fexple(int u,double v) int u; double v; {}

6.2Khai bo hm nguyn mu Trong ANSI C, khi s dng mt hm cha c nh ngha trc trong cng mt tp, ta c th: 1) khng cn khai bo (khi ngm nh gi tr tr v ca hm l int) 2) ch cn khai bo tn hm v gi tr tr v, khng cn danh sch kiu ca cc tham s. 3) khai bo hm nguyn mu. Vi C++, ch c phng php th 3 l chp nhn c. Ni cch khc, mt li gi hm ch c chp nhn khi trnh bin dch bit c kiu ca cc tham s, kiu ca gi tr tr v. Mi khi trnh bin dch gp mt li gi

hm, n s so snh cc kiu ca cc i s c truyn vi cc tham s hnh thc tng ng. Trong trng hp c s khc nhau, c th thc hin mt s chuyn kiu t ng cho hm nhn c c danh sch cc tham s ng vi kiu c khai bo ca hm. Tuy nhin phi tun theo nguyn tc chuyn kiu t ng sau y: char-->int-->longint-->float-->double V d 2.1 double fexple (int, double) fexple*/ .... main(){ int n; char c; double z,res1,res2,res3; .... res1 = fexple(n,z); /* khng c chuyn i kiu*/ res2 = fexple(c,z); /* c chuyn i kiu, t char (c) thnh int*/ res3 = fexple(z,n); /* c chuyn i kiu, t double(z) thnh int v t int(n) thnh double*/ .... } Trong C++ bt buc phi c t kho void trc tn ca hm trong phn khai bo ch rng hm khng tr v gi tr. Trng hp khng c, trnh bin dch ngm hiu kiu ca gi tr tr v l int v nh th trong thn hm bt buc phi c cu lnh return. iu ny hon ton khng cn thit i vi m t trong ngn ng C. /*khai bo hm

Thc ra, cc kh nng va m t khng hon ton l im khng tng thch gia C v C++ m ch l s gn lc cc im yu v hon thin cc mt cn cha hon chnh ca C. 6.2 S tng thch gia con tr void v cc con tr khc Trong ANSI C, kiu void * tng thch vi cc kiu tr khc c hai chiu. Chng hn vi cc khai bo sau : void *gen; int *adj;

hai php gn sau y l hp l trong ANSI C: gen = adj; adj = gen; Thc ra, hai cu lnh trn km theo cc php chuyn kiu ngm nh: int* --->void* i vi cu lnh th nht, v void* --->int* i vi cu lnh th hai. Trong C++, ch c chuyn i kiu ngm nh t mt kiu tr tu thnh void* l chp nhn c, cn mun chuyn i ngc li, ta phi thc hin chuyn kiu tng minh nh cch vit sau y: gen = adj; adj = (int *)gen; 7. Cc kh nng vo/ra mi ca C++ Cc tin ch vo/ra (hm hoc macro) ca th vin C chun u c th s dng trong C++. s dng cc hm ny chng ta ch cn khai bo tp tiu trong c cha khai bo hm nguyn mu ca cc tin ch ny.

Bn cnh , C++ cn ci t thm cc kh nng vo/ra mi da trn hai ton t <<(xut) v >> (nhp) vi cc c tnh sau y: 4) n gin trong s dng 5) c kh nng m rng i vi cc kiu mi theo nhu cu ca ngi lp trnh. Trong tp tiu iostream.h ngi ta nh ngha hai i tng cout v cin tng ng vi hai thit b chun ra/vo c s dng cng vi << v >>. Thng thng ta hiu cout l mn hnh cn cin l bn phm. 7.1 Ghi d liu ln thit b ra chun (mn hnh) cout Trong phn ny ta xem xt mt s v d minh ho cch s dng cout v << a thng tin ra mn hnh. V d 2.2 Chng trnh sau minh ho cch s dng cout a ra mn hnh mt xu k t. #include <iostream.h> /*phi khai bo khi mun s dng cout*/ main() { cout << "Welcome C++"; } Welcome C++ << l mt ton t hai ngi, ton hng bn tri m t ni kt xut thng tin (c th l mt thit b ngoi vi chun hay l mt tp tin ), ton hng bn phi ca << l mt biu thc no . Trong chng trnh trn, cu lnh cout <<"Welcome C++" a ra mn hnh xu k t Welcome C++.

V d 2.3 S dng cout v << a ra cc gi tr khc nhau: #include <iostream.h> /*phi khai bo khi mun s dng cout*/ void main() { int n = 25; cout << "Value : "; cout << n; } Value : 25 Trong v d ny chng ta s dng ton t << in ra mn hnh u tin l mt xu k t, sau l mt s nguyn. Chc nng ca ton t << r rng l khc nhau trong hai ln kt xut d liu: vi cu lnh th nht, ch a ra mn hnh mt dy cc k t, cu lnh sau, s dng mt khun mu chuyn i mt gi tr nh phn thnh mt chui cc k t ch s. Vic mt ton t c nhiu vai tr khc nhau lin quan n mt khi nim mi trong C++, l nh ngha chng ton t. iu ny s c cp n trong chng 4. V d 2.4 Trong v d ny ta gp c hai cu lnh kt xut trong v d 2.3 thnh mt cu lnh phc tp hn, tuy kt qu khng khc trc: #include <iostream.h> /*phi khai bo khi mun s dng cout*/ void main() { int n = 25; cout << "Value : " << n; }

Value : 25 7.2 Cc kh nng vit ra trn cout. Chng ta va xem xt mt vi v d vit mt xu k t, mt s nguyn. Mt cch tng qut, chng ta c th s dng ton t << cng vi cout a ra mn hnh gi tr ca mt biu thc c cc kiu sau: 1) kiu d liu c s ( char, int, float, double), 2) xu k t: (char *), 3) con tr (tr con tr char *) Trong trng hp mun a ra a ch bin xu k t phi thc hin php chuyn kiu tng minh, chng hn (char *) --> (void *). Xt v d sau y: V d 2.4 #include <iostream.h> void void main(){ int n = 25; long p = 250000; unsigned q = 63000; char c = 'a'; float x = 12.3456789; double y = 12.3456789e16; char * ch = "Welcome C++"; int *ad = &n; cout <<"Value of n : " << n <<"\n"; cout <<"Value of p : " << p <<"\n"; cout <<"Value of c : " << c <<"\n"; cout <<"Value of q : " << q <<"\n"; cout <<"Value of x : " << x <<"\n"; cout <<"Value of y : " << y <<"\n";

cout <<"Value of ch : " << ch <<"\n"; cout <<"Addrese of n : " << ad <<"\n"; cout <<"Addrese de ch : " << (void *)ch <<"\n"; } Value of n : 25 Value of p : 250000 Value of c : a Value of q : 63000 Value of x : 12.345679 Value of y : 1.234567e+17 Value of ch : Welcome C++ Addrese of n : 0xfff2 Addrese de ch : 0x00b2

7.3 c d liu t thit b vo chun (bn phm) cin Nu nh cout dng ch thit b ra chun, th cin c dng ch mt thit b vo chun. Mt cch tng t, ton t >> c dng km vi cin nhp vo cc gi tr; hai cu lnh int n; cin >> n; yu cu c cc k t trn bn phm v chuyn chng thnh mt s nguyn v gn cho bin n. Ging nh cout v <<, c th nhp nhiu gi tr cng kiu hay khc kiu bng cch vit lin tip tn cc bin cn nhp gi tr cng vi >> ngay sau cin. Chng hn: int n; float p; char c; cin >> c >> n >> p; C th s dng ton t >> nhp d liu cho cc bin c kiu char, int, float, double v char *. Ging vi hm scanf(), cin tun theo mt s qui c dng trong vic phn tch cc k t: (i) Cc gi tr s c phn cch bi: SPACE, TAB, CR, LF. Khi gp mt k t khng hp l ( du . i vi s nguyn, ch ci i vi s, ...) s kt thc vic c t cin; k t khng hp l ny s c xem xt trong ln c sau. (ii) i vi gi tr xu k t, du phn cch cng l SPACE, TAB,CR, cn i vi gi tr k t, du phn cch l k t CR. Trong hai trng hp ny khng c khi nim k t khng hp l. M sinh ra do bm phm Enter ca ln nhp trc vn c

xt trong ln nhp xu/k t tip theo v do vy s c nguy c khng nhp c ng gi tr mong mun khi a ra lnh nhp xu k t hoc k t ngay sau cc lnh nhp cc gi tr khc. Gii php khc phc vn ny m bo cng vic din ra ng theo l trc mi ln gi lnh nhp d liu cho xu/k t ta s dng mt trong hai ch th sau y: fflush(stdin); //khai bo trong stdio.h cin.clear(); //hm thnh phn ca lp nh ngha i tng cin

Ta tham kho ch-ng trnh sau: V d 2.6 #include <iostream.h> #include <conio.h> void main() { int n; float x; char t[81]; clrscr(); do { cout << "Nhap vao mot so nguyen, mot xau, mot so thuc : "; cin >> n >> t >> x; cout << "Da nhap " << n << "," << t << " va " << x << "\n"; } while (n); } Nhap vao mot so nguyen, mot xau, mot so thuc : 3 long 3.4 Da nhap 3,long va 3.4 Nhap vao mot so nguyen, mot xau, mot so thuc : 5 hung 5.6 Da nhap 5,hung and 5.6 Nhap vao mot so nguyen, mot xau, mot so thuc : 0 4 3 Da nhap 0,4 va 3

8. Nhng tin ch cho ngi lp trnh 8.1 Ch thch cui dng Mi k hiu i sau // cho n ht dng c coi l ch thch, c chng trnh dch b qua khi bin dch chng trnh. Xt v d sau: cout << "Xin chao\n"; //li cho hi Thng ta s dng ch thch cui dng khi mun gii thch ngha ca mt cu lnh g . i vi mt on chng trnh kiu ch thch gii hn bi /* v */ cho php m t c nhiu thng tin hn.

8.2 Khai bo mi ni Trong C++ khng nht thit phi nhm ln u cc khai bo t bn trong mt hm hay mt khi lnh, m c th t xen k vi cc lnh x l. V d. { int n; n=23; cout <<n<<"\n"; ... int *p=&n; cout <<p<<"\n"; ... } Gi tr khi u cho cc bin c th thay i ti cc thi im chy chng trnh khc nhau. Mt v d minh ho cho kh nng nh ngha khp mi ni l c th khai bo cc bin iu khin ngay bn trong cc vng lp nu bin cha c khai bo trc trong cng khi lnh cng nh khng c khai bo li phn sau. Xem on chng trnh sau: { ... //cha c i for(int i=0;...;...) ... //khng c khai bo i } 8.3 Ton t phm vi :: Bnh thng, bin cc b che lp bin ton cc cng tn. Chng hn: #include <iostream.h>

int x; main() { int x = 10; //x cc b cout<<x<<\n;//x cc b } Trong nhng trng hp cn thit, khi mun truy xut ti bin ton cc phi s dng ton t :: trc tn bin: #include <iostream.h> int x; main() { int x = 10; //x cc b ::x = 10; //x ton cc cout<<x<<\n;//x cc b cout<<::x<<\n;//x ton cc } 9. Hm inline Trong C++ c th nh ngha cc hm c thay th trc tip thnh m lnh my ti ch gi (inline) mi ln c tham chiu. im ny rt ging vi cch hot ng ca cc macro c tham s trong C. u im ca cc hm inline l chng khng i hi cc th tc b sung khi gi hm v tr gi tr v. Do vy hm inline c thc hin nhanh hn so vi cc hm thng thng. Mt hm inline c nh ngha v c s dng ging nh bnh thng. im khc nhau duy nht l phi t m t inline trc khai bo hm. Xt v d sau y: V d 2.7 #include <iostream.h>

#include <math.h> #include <conio.h> inline double norme(double vec[3]); // khai bo hm inline void main(){ clrscr(); double v1[3],v2[3]; int i; for(i=0;i<3;i++) { v1[i]=i;v2[i]=2*i-1;} cout <<"norme cua v1 : "<<norme(v1) <<" - norme cua v2 : "<<norme(v2); getch(); } /*nh ngha hm inline*/ inline double norme(double vec[3]) int i;double s=0; for(i=0;i<3;i++) s+=vec[i]*vec[i]; return(sqrt(s)); } norme cua v1 : 2.236068 - norme cua v2 : 3.316625 Hm norme() nhm mc ch tnh chun ca vector vi ba thnh phn. T kho inline yu cu chng trnh bin dch x l hm norme khc vi cc hm thng thng. C th l, mi ln gi norme(), trnh bin dch ghp trc tip cc ch th tng ng ca hm vo trong chng trnh ( dng ngn ng my). Do c ch qun l li gi v tr v {

khng cn na (khng cn lu ng cnh, sao chp cc thng s...), nh vy tit kim thi gian thc hin. Bn cnh cc ch th tng ng s c sinh ra mi khi gi hm do chi ph lu tr tng ln khi hm c gi nhiu ln. im bt li khi s dng cc hm inline l nu chng qu ln v c gi thng xuyn th kch thc chng trnh s tng ln rt nhanh. V l do ny, ch nhng hm n gin, khng cha cc cu trc lp mi c khai bo l hm inline. Vic s dng hm inline so vi cc macro c tham s c hai im li. Trc ht hm inline cung cp mt cch c cu trc hn khi m rng cc hm n gin thnh hm inline. Thc t cho thy khi to mt macro c tham s thng hay qun cc du ng ngoc, rt cn n m bo s m rng ni tuyn ring trong mi trng hp. Vi macro c th gy ra hiu ng ph hoc b hn ch kh nng s dng. Chng hn vi macro: #define square(x) {x++*x++} Vi li gi square(a) vi a l bin s sn sinh ra biu thc a++*a++ v kt qu l lm thay i gi tr ca bin a ti hai ln. Cn li gi square (3) s gy li bin dch v ta khng th thc hin cc php ton tng gim trn cc ton hng l hng s. Vic s dng hm inline nh mt gii php thay th s trnh c cc tnh hung nh th. Ngoi ra, cc hm inline c th c ti u bi chng trnh bin dch. iu quan trng l c t inline ch l mt yu cu, ch khng phi l mt ch th i vi trnh bin dch. Nu

v mt l do no trnh bin dch khng th p ng c yu cu (chng hn khi bn trong nh ngha hm inline c cc cu trc lp) th hm s c bin dch nh mt hm bnh thng v yu cu inline s b b qua. Hm inline phi c khai bo bn trong tp tin ngun cha cc hm s dng n. Khng th dch tch bit cc hm inline. 1 10. Tham chiu Ngn ng C++ gii thiu mt khi nim mi reference tm dch l tham chiu. V bn cht, tham chiu l b danh ca mt vng nh c cp pht cho mt bin no . Mt tham chiu c th l mt bin, tham s hnh thc ca hm hay dng lm gi tr tr v ca mt hm. Cc phn tip sau ln lt gii thiu cc kh nng ca tham chiu c s dng trong chng trnh vit bng ngn ng C++. 10.1 Tham chiu ti mt bin Xt hai ch th: int n; int &p = n; Trong ch th th hai, du & xc nh p l mt bin tham chiu cn du = v tn bin n xc nh vng nh m p tham chiu ti. Lc ny c hai nh danh p v n cng xc nh vng nh c cp pht cho bin n. Nh vy cc ch th sau: n =3; cout <<p;

cho kt qu 3 trn thit b hin th.


1

Bin dch tch bit cho php khai bo hm trong mt tp tiu , cn nh ngha hm li trong tp tin chng trnh s dng hm.

Xt v bn cht tham chiu v tham tr ging nhau v cng ch n cc i tng c a ch, cng c cp pht a ch khi khai bo. Nhng cch s dng chng th khc nhau. Khi ni n tham chiu &p ta phi gn n vi mt bin no khai bo qua &p=n, trong khi khai bo con tr *p khng nht thit phi khi to gi tr cho n. Trong chng trnh bin tr c th tham chiu n nhiu bin khc nhau cn bin tham chiu th vn ng thuyn t khi khai bo, c ngha l sau khi khi to cho tham chiu gn vi mt bin no ri th ta khng th thay i gn tam chiu vi mt bin khc. Xt cc ch th sau: V d 2.8 int n=3,m=4; int *p; p=&n; //p ch n n *p=4; //gn gi tr ca m cho n thng qua con tr p ... p=&m; //cho p ch n m int &q=n; //khai bo tham chiu q ch n n q=4; //gn cho bin n gi tr 4 ... q=m; //gn gi tr ca bin m cho bin n. Ni mt cch n gin, tham chiu ca mt bin ging nh b danh ca mt con ngi no . C ngha l ch n mt con ngi c th no , ta c th ng thi s dng tn ca anh ta hoc b danh. Do vy, truy nhp n vng nh tng ng vi mt bin, chng ta c th s dng hoc l tn bin hoc l tn tham chiu tng ng. i vi con ngi, b danh bao gi cng nhm ni n mt ngi tn ti, v nh vy tham chiu cng phi c khai bo v khi to sau khi bin c khai

bo. Chng trnh sau y s gy li bin dch do tham chiu y cha c khi to. V d 2.9 Chng trnh sai #include <iostream.h> void main() { int x=3, &y;//li v y phi c khi to cout <<" x = "<<x<<"\n" <<" y = "<<y<<"\n"; y = 7; cout <<" x = "<<x<<"\n" <<" y = "<<y<<"\n"; } Chng trnh ng nh sau: #include <iostream.h> void main() { int x=3, &y=x;//y by gi l mt b danh ca x cout <<" x = "<<x<<"\n" <<" y = "<<y<<"\n"; y = 7; cout <<" x = "<<x<<"\n" <<" y = "<<y<<"\n"; } x = 3 y = 3 x = 7 y = 7

Lu cui cng l khng th gn mt tham chiu vi mt hng s tr trng hp c t kho const ng trc khai bo tham chiu. D dng kim tra cc nhn xt sau: int &p =3; //khng hp l const int & p =3; //hp l 10.2 Truyn tham s cho hm bng tham chiu

Trong C, cc tham s v gi tr tr v ca mt hm c truyn bng gi tr. gi lp c ch truyn tham bin ta phi s dng con tr. Trong C++, vic dng khi nim tham chiu trong khai bo tham s hnh thc ca hm s yu cu chng trnh bin dch truyn a ch ca bin cho hm v hm s thao tc trc tip trn cc bin . Chng trnh sau a ra ba cch vit khc nhau ca hm thc hin vic hon i ni dung ca hai bin.

V d 2.10 /*swap.cpp*/ #include <conio.h> #include <iostream.h> /*Hm swap1 c gi vi cc tham s c truyn theo tham tr*/ void swap1(int x, int y) { int temp = x; x = y; y = temp; } /*Hm swap2 thc hin vic truyn tham s bng tham tr*/ void swap2(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } /*Hm swap3 thc hin vic truyn tham s bng tham chiu*/ void swap3(int &x, int &y) { int temp = x; x = y; y = temp; } void main() { int a=3, b=4; clrscr(); cout <<"Truoc khi goi swap1:\n";

cout<<"a = "<<a<<" b = "<<b<<"\n"; swap1(a,b); cout <<"Sau khi goi swap:\n"; cout<<"a = "<<a<<" b = "<<b<<"\n"; a=3; b =4; cout <<"Truoc khi goi swap2:\n"; cout<<"a = "<<a<<" b = "<<b<<"\n"; swap2(&a,&b); cout <<"Sau khi goi swap2:\n"; cout<<"a = "<<a<<" b = "<<b<<"\n"; a=3;b=4; cout <<"Truoc khi goi swap3:\n"; cout<<"a = "<<a<<" b = "<<b<<"\n"; swap3(a,b); cout <<"Sau khi goi swap3:\n"; cout<<"a = "<<a<<" b = "<<b<<"\n"; getch(); } Truoc khi goi swap1: a = 3 b = 4 Sau khi goi swap1: a = 3 b = 4 Truoc khi goi swap2 a = 3 b = 4 Sau khi goi swap2: a = 4 b = 3 Truoc khi goi swap3: a = 3 b = 4

Sau khi goi swap3: a = 4 b = 3 Trong chng trnh trn, ta truyn tham s a,b cho hm swap1() theo tham tr cho nn gi tr ca chng khng thay i trc v sau khi gi hm. Gii php a ra trong hm swap2() l thay v truyn trc tip gi tr hai bin a v b ngi ta truyn a ch ca chng ri thng qua cc a ch ny xc nh gi tr bin. Bng cch gi tr ca hai bin a v b s hon i cho nhau sau li gi hm. Khc vi swap2(), hm swap3() a ra gii php s dng tham chiu. Cc tham s hnh thc ca hm swap3() by gi l cc tham chiu n cc tham s thc c truyn cho hm. Nh vy m gi tr ca hai tham s thc a v b c th hon i c cho nhau. C mt vn m chc rng bn c s phn vn: lm th no khi to cc tham s hnh thc l tham chiu. Xin tha rng iu c thc hin t ng trong mi li gi hm ch khng phi trong nh ngha. T ny sinh thm mt nhn xt quan trng: tham s ng vi tham s hnh thc l tham chiu phi l bin tr trng hp c t kho const ng trc khai bo tham s hnh thc. Chng hn khng th thc hin li gi hm sau: swap3(2,3); Bn c c th xem thm phn Hm thit lp sao chp li thy c ch li to ln ca vic truyn tham s cho hm bng tham chiu. Ch : khi mun truyn bng tham bin mt bin tr th vit nh sau: int * & adr; //adr l mt tham chiu ti mt bin tr ch n mt bin nguyn.

10.3

Gi tr tr v ca hm l tham chiu

nh ngha ca hm c dng nh sau: <type> & fct( ...) { ... return <bien co pham vi toan cuc>; } Trong trng hp ny biu thc c tr li trong cu lnh return phi l tn ca mt bin xc nh t bn ngoi hm, bi v ch khi mi c th s dng c gi tr ca hm. Khi ta tr v mt tham chiu n mt bin cc b khai bo bn trong hm, bin cc b ny s b mt i khi kt thc thc hin hm v do vy, tham chiu ca hm cng khng cn c ngha na. Khi gi tr tr v ca hm l tham chiu, ta c th gp cc cu lnh gn k d trong v tri l mt li gi hm ch khng phi l tn ca mt bin. iu ny hon ton hp l, bi l bn thn hm c gi tr tr v l mt tham chiu. Ni cch khc, v tri ca lnh gn (biu thc gn) c th l li gi n mt hm c gi tr tr v l mt tham chiu. Xt v d sau y: V d 2.11 /*fr.cpp*/ #include <iostream.h> #include <conio.h> int a[5]; int &fr(int *d,int i); void main() { clrscr(); cout<<"Nhap gia tri cho mang a:\n"; for(int i=0;i<5;i++) {

cout<<"a["<<i<<"]= "; cin>>fr(a,i); } cout<<"Mang a sau khi nhap\n"; for(i=0;i<5;i++) cout<<a[i]<<" "; cout<<"\n"; getch(); } int &fr(int *d,int i) { return d[i]; } Nhap gia tri cho mang a: a[0]= 6 a[1]= 4 a[2]= 3 a[3]= 5 a[4]= 6 Mang a sau khi nhap 6 4 3 5 6 Bn c c th xem thm phn nh ngha chng ton t thy c li ch ca vn tr v tham chiu cho hm. 11. nh ngha chng hm (Overloading functions) C++ cho php s dng mt tn cho nhiu hm khc nhau ta gi l s chng hm. Trong trng hp ,

cc hm s khc nhau gi tr tr v v danh sch kiu cc tham s. Chng hn chng ta mun nh ngha cc hm tr v s nh nht trong: 1) hai s nguyn 2) hai s thc 3) hai k t 4) ba s nguyn 5) mt dy cc s nguyn ... D nhin c th tm cho mi hm nh vy mt tn phn. Li dng kh nng nh ngha chng hm ca C++, chng ta c th vit cc hm nh sau: V d 2.12 #include <iostream.h> //Hm nguyn mu int min(int, int); //Hm 1 double min(double, double);//Hm 2 char min(char, char);//Hm 3 int min(int, int, int);//Hm 4 int min(int, int *);//Hm 5 main() { int n=10, p =12, q = -12; double x = 2.3, y = -1.2; char c = A, d= Q; int td[7] = {1,3,4,-2,0,23,9}; cout<<min (n,p) : <<min(n,p)<<\m; //Hm 1 cout<<min (n,p,q) : <<min(n,p,q)<<\m; //Hm 4 cout<<min (c,d) : <<min(c,d)<<\m; //Hm 3

cout<<min (x,y) : <<min(n,p)<<\m; //Hm 2 cout<<min (td) : <<min(7,td)<<\m; //Hm 5 cout<<min (n,x) : <<min(n,x)<<\m; //Hm 2 //cout<<min (n,p,x) : <<min(n,p,x)<<\m; //Li } int min(int a, int b) { return (a> b? a: b); } int min(int a, int b, int c) { return (min(min(a,b),c)); } double min(double a, double b) { return (a> b? a: b); } char min(char a, char b) { return (a> b? a: b); } int min(int n, int *t) { int res = t[0]; for (int i=1; i<n; i++) res = min(res,t[i]); return res; } Nhn xt 1) Mt hm c th gi n hm cng tn vi n (v d nh hm 4,5 gi hm 1).

2) Trong trng hp c cc hm trng tn trong chng trnh, vic xc nh hm no c gi do chng trnh dch m nhim v tun theo cc nguyn tc sau: Trng hp cc hm c mt tham s Chng trnh dch tm kim s tng ng nhiu nht c th c; c cc mc tng ng nh sau (theo u tin gim dn): a) Tng ng tht s: ta phn bit cc kiu d liu c s khc nhau ng thi lu n c du. b) Tng ng d liu s nhng c s chuyn i kiu d liu t ng (numeric promotion): char v short -->int; float -->int. c) Cc chuyn i kiu chun c C v C++ chp nhn. d) Cc chuyn i kiu do ngi s dng nh ngha. Qu trnh tm kim bt u t mc cao nht v dng li mc u tin cho php tm thy s ph hp. Nu c nhiu hm ph hp cng mt mc, chng trnh dch a ra thng bo li do khng bit chn hm no gia cc hm ph hp. Trng hp cc hm c nhiu tham s tng chung l phi tm mt hm ph hp nht so vi tt c nhng hm cn li. t mc ch ny, chng trnh dch chn cho mi tham s cc hm ph hp ( tt c cc mc ). Trong s cc hm c la chn, chng trnh dch chn ra (nu tn ti v tn ti duy nht) hm sao cho i vi mi i s n t c s ph hp hn c so vi cc hm khc. Trong trng hp vn c nhiu hm tho mn, li bin dch xy ra do chng trnh dch khng bit chn hm no trong s cc hm tha mn. c bit lu khi s dng nh ngha chng hm cng vi vic khai bo cc hm vi tham s c gi tr ngm nh s c trnh by trong mc tip theo.

12. Tham s ngm nh trong li gi hm Ta xt v d sau: V d 2.13 #include <iostream.h> void main() { int n=10,p=20; void fct(int, int = 12) ;//khai bo hm vi mt gi tr ngm nh fct(n,p); //li gi thng thng, c hai tham s fct(n); //li gi ch vi mt tham s //fct() s khng c chp nhn } //khai bo bnh thng void fct(int a, int b) cout<<"tham so thu hai } tham so thu nhat : 10 tham so thu hai tham so thu hai : 20 : 12 tham so thu nhat : 10 Trong khai bo ca fct() bn trong hm main() : void fct(int,int =12); { : "<<b<<"\n";

cout <<"tham so thu nhat : " <<a <<"\n";

khai bo int = 12 ch ra rng trong trng hp vng mt tham s th hai li gi hm fct() th tham s hnh thc tng ng s c gn gi tr ngm nh 12. Li gi fct(); khng c chp nhn bi v khng c gi tr ngm nh cho tham s th nht. V d 2.14 #include <iostream.h> void main(){ int n=10,p=20; void fct(int = 0, int = 12);//khai bo hm vi hai tham s c gi tr ngm nh fct(n,p); //li gi thng thng, c hai tham s fct(n); fct() ; } void fct(int a, int b) { cout<<"tham so thu nhat : " <<a <<"\n"; cout<<"tham so thu hai } tham so thu nhat : 10 tham so thu hai tham so thu hai : 20 : 12 tham so thu nhat : 10 : "<<b<<"\n"; //khai bo bnh thng //li gi ch vi mt tham s //fct() c chp nhn

tham so thu nhat : 0 tham so thu hai : 12 Ch 1) Cc tham s vi gi tr ngm nh phi c t cui trong danh sch cc tham s ca hm trnh nhm ln cc gi tr. 2) Cc gi tr ngm nh ca tham s c khai bo khi s dng ch khng phi trong phn nh ngha hm. V d sau y gy ra li bin dch:

V d 2.15 #include <conio.h> #include <iostream.h> void f(); void main() { clrscr(); int n=10,p=20; void fct(int =0,int =12); cout<<"Goi fct trong main\n"; fct(n,p); fct(n); fct(); getch(); } void fct(int a=10,int b=100) { cout<<"Tham so thu nhat : "<<a<<"\n"; cout<<"Tham so thu hai } 3) Nu mun khai bo gi tr ngm nh cho mt tham s bin tr, th phi ch vit * v = cch xa nhau t nht mt du cch. 4) Cc gi tr ngm nh c th l mt biu thc bt k (khng nht thit ch l biu thc hng), c gi tr c tnh ti thi im khai bo: float x; int n; void fct(float = n*2+1.5); 5) Chng hm v gi hm vi tham s c gi tr ngm nh c th s dn n li bin dch khi : "<<b<<"\n";

chng trnh dch khng xc nh c hm ph hp. Xt v d sau: V d 2.16 #include <iostream.h> void fct(int, int=10); void fct(int); void main() { int n=10, p=20; fct(n,p);//OK fct(n);//ERROR } 13. B sung thm cc ton t qun l b nh ng: new v delete 13.1 Ton t cp pht b nh ng new Vi khai bo int * adr; ch th ad = new int; cho php cp pht mt vng nh cn thit cho mt phn t c kiu int v gn cho adr a ch tng ng. Lnh tng ng trong C: ad =(int *) malloc(sizeof(int)); Vi khai bo char *adc; ch th adc =new char [100];

cho php cp pht vng nh cho mt bng cha 100 k t v t a ch u ca vng nh cho bin adc. Lnh tng ng trong C nh sau: adc =(char *)malloc(100); Hai cch s dng new nh sau: Dng 1 new type; gi tr tr v l [4]. mt con tr n v tr tng ng khi cp pht thnh cng [5]. NULL trong trng hp tri li. Dng 2 new type[n]; trong n l mt biu thc nguyn khng m no , khi ton t new xin cp pht vng nh cha n thnh phn kiu type v tr li con tr n u vng nh nu nh cp pht thnh cng. 13.2 Ton t gii phng vng nh ng delete Mt vng nh ng c cp pht bi new phi c gii phng bng delete m khng th dng free c, chng hn: delete adr; delete adc; V d 2.17 Cp pht b nh ng cho mng hai chiu #include<iostream.h> void Nhap(int **mat);//nhp ma trn hai chiu void In(int **mat);//In ma trn hai chiu void main() {

int **mat; int i; /*cp pht mng 10 con tr nguyn*/ mat = new int *[10]; for(i=0; i<10; i++) /*mi con tr nguyn xc nh vng nh 10 s nguyn*/ mat[i] = new int [10]; /*Nhp s liu cho mng va c cp pht*/ cout<<"Nhap so lieu cho matran 10*10\n"; Nhap(mat); /*In ma trn*/ cout<<"Ma tran vua nhap \n"; In(mat); /*Gii phng b nh*/ for(i=0;i<10;i++) delete mat[i]; delete mat; } void Nhap(int ** mat) { int i,j; for(i=0; i<10;i++) for(j=0; j<10;j++) { cout<<"Thanh ["<<i<<"]["<<j<<"]= "; cin>>mat[i][j]; } } phan thu

void In(int ** mat) { int i,j; for(i=0; i<10;i++) { for(j=0; j<10;j++) cout<<mat[i][j]<<" "; cout<<"\n"; } } V d 2.18 Qun l trn b nh set_new_handler #include <iostream> main() { void outof(); set_new_handler(&outof); long taille; int *adr; int nbloc; cout<<"Kich thuoc can nhap? "; cin >>taille; for(nbloc=1;;nbloc++) { adr =new int [taille]; cout <<"Cap "<<nbloc<<"\n"; } } void outof()//hm c gi khi thiu b nh phat bloc so :

{ cout <<"Het bo nho -Ket thuc \n"; exit(1); } 14. Tm tt 14.1 Ghi nh C++ l mt s m rng ca C(superset), do c th s dng mt chng trnh bin dch C++ dch v thc hin cc chng trnh ngun vit bng C. C yu cu cc ch thch nm gia /* v */. C++ cn cho php to mt ch thch bt u bng // cho n ht dng. C++ cho php khai bo kh tu . Thm ch c th khai bo bin trong phn khi to ca cu lnh lp for. C++ cho php truyn tham s cho hm bng tham chiu. iu ny tng t nh truyn tham bin cho chng trnh con trong ngn ng PASCAL. Trong li gi hm ta dng tn bin v bin s c truyn cho hm qua tham chiu. iu cho php thao tc trc tip trn bin c truyn ch khng phi gin tip qua bin tr. Ton t new v delete trong C++ c dng qun l b nh ng thay v cc hm cp pht ng ca C. C++ cho php ngi vit chng trnh m t cc gi tr ngm nh cho cc tham s ca hm, nh hm c th c gi vi mt danh sch cc tham s khng y . Ton t :: cho php truy nhp bin ton cc khi ng thi s dng bin cc b v ton cc trng tn. C th nh ngha cc hm cng tn vi cc tham s khc nhau. Hai hm cng tn s c phn bit nh gi tr tr v v danh sch kiu cc tham s.

14.2

Cc li thng gp

Qun ng */ cho cc ch thch. Khai bo bin sau khi bin c s dng. S dng lnh return tr v gi tr nhng khi nh ngha li m t hm kiu void hoc ngc li, qun cu lnh ny trong trng hp hm yu cu c gi tr tr v. Khng c hm nguyn mu cho cc hm. B qua vic khi to cho cc tham chiu. Thay i gi tr ca bin hng. To cc hm cng tn, cng tham s. 14.3 Mt s thi quen lp trnh tt S dng // trnh li khng ng */ khi ch thch nm gn trong mt dng. S dng cc kh nng vo ra mi ca C++ chng trnh d c hn. t cc khai bo bin ln u cc khi lnh. Ch dng t kho inline vi cc hm nh, khng phc tp S dng con tr truyn tham s cho hm khi cn thay i gi tr tham s, cn tham chiu dng truyn cc tham s c kch thc ln m khng c nhu cu thay i ni dung. Trnh s dng bin cng tn cho nhiu mc ch khc nhau trong chng trnh. 15. Bi tp Bi tp 2.1 S dng cin v cout vit chng trnh nhp vo mt dy s nguyn ri sp xp dy s tng dn. Bi tp 2.2 S dng new v delete thc hin cc thao tc cp pht b nh cho mt mng ng hai chiu. Hon thin

chng trnh bng cch thc hin cc thao lin quan n ma trn vung. Bi tp 2.3 Lp chng trnh m phng cc hot ng trn mt ngn xp cha cc s nguyn.

1. Cc im khng tng thch gia C++ v ANSI C. 34 1.1 nh ngha hm.................................................... 34 1.2 Khai bo hm nguyn mu .................................. 34 1.3 S tng thch gia con tr void v cc con tr khc............................................................................. 36 2. Cc kh nng vo/ra mi ca C++ ......................... 36 2.1 Ghi d liu ln thit b ra chun (mn hnh) cout37 2.2 Cc kh nng vit ra trn cout.............................. 39 2.3 c d liu t thit b vo chun (bn phm) cin 41 3. Nhng tin ch cho ngi lp trnh ......................... 44 3.1 Ch thch cui dng ............................................. 44 3.2 Khai bo mi ni.................................................. 45 3.3 Ton t phm vi :: ............................................ 45 4. Hm inline............................................................... 46 5. Tham chiu .............................................................. 49 5.1 Tham chiu ti mt bin ...................................... 49 5.2 Truyn tham s cho hm bng tham chiu .......... 52 5.3 Gi tr tr v ca hm l tham chiu .................... 56 6. nh ngha chng hm (Overloading functions) .... 57
Trng hp cc hm c mt tham s ................................................... 60 Trng hp cc hm c nhiu tham s................................................. 60

7. Tham s ngm nh trong li gi hm .................... 61 8. B sung thm cc ton t qun l b nh ng: new v delete ........................................................................ 65 8.1 Ton t cp pht b nh ng new ...................... 65 8.2 Ton t gii phng vng nh ng delete .......... 66 9. Tm tt .................................................................... 69 9.1 Ghi nh................................................................. 69

9.2 Cc li thng gp ............................................... 70 9.3 Mt s thi quen lp trnh tt .............................. 70 10. Bi tp...................................................................... 70 Bi tp 2.1 ................................................................... 70 Bi tp 2.2 ................................................................... 70 Bi tp 2.3 ................................................................... 71

Chng 3 i tng v lp (Object & Class) Mc ch chng ny: 6) Khi nim v ng gi d liu. 7) Khai bo v s dng mt lp. 8) Khai bo v s dng i tng, con tr i tng, tham chiu i tng. 9) Hm thit lp v hm hu b. 10) Khai bo v s dng hm thit lp sao chp. 11) Vai tr ca hm thit lp ngm nh. 16. i tng i tng l mt khi nim trong lp trnh hng i tng biu th s lin kt gia d liu v cc th tc (gi l cc phng thc) thao tc trn d liu . Ta c cng thc sau:
i tng = D liu+Phng thc

y chng ta hiu rng i tng chnh l cng c h tr cho s ng gi. S ng gi l c ch lin kt cc lnh thao tc v d liu c lin quan, gip cho c hai c an ton trnh c s can thip t bn ngoi v vic s dng sai. Nhn chung nh ngha mt i tng phc tp hn so vi nh ngha cc bin cu trc thng thng, bi l ngoi vic m t cc thnh phn d liu, ta cn phi xc nh c cc thao tc tc ng ln i tng . Hnh 2.1 m t cc i tng im trn mt phng: Mi i tng c xc nh bi hai thnh phn to c biu din bi hai bin nguyn. Cc thao tc tc ng ln im bao gm vic xc nh to mt im trn mt phng to (th hin bng vic gn gi tr cho hai thnh phn to ), thay i to v hin th kt qu

ln trn mt phng to (tng t nh vic chm im trn mt phng ). Li ch ca vic ng gi l khi nhn t bn ngoi, mt i tng ch c bit ti bi cc m t v cc phng thc ca n, cch thc ci t cc d liu khng quan trng i vi ngi s dng. Vi mt i tng im, ngi ta ch quan tm n vic c th thc hin c thao tc g trn n m khng cn bit cc thao tc c thc hin nh th no, cng nh iu g xy ra bn trong bn thn i tng . Ta thng ni l s tru tng ho d liu (khi cc chi tit ci t c th c giu i).
M t i tng im { //d liu int x,y; //phng thc void init(int ox,int oy); void move(int dx,int dy); void display(); };
Hnh 3.1 M t cc i tng im

ng gi c nhiu li ch gp phn nng cao cht lng ca chng trnh. N lm cho cng vic bo tr chng trnh thun li hn rt nhiu: mt s thay i cu trc ca mt i tng ch nh hng ti bn thn i tng; ngi s dng i tng khng cn bit n thay i ny (vi lp trnh cu trc th ngi lp trnh phi t qun l s thay i ). Chng hn c th biu din to mt im di dng s thc, khi ch c ngi thit k i tng phi quan tm sa li nh ngha ca i tng trong khi ngi s dng khng cn hay bit v iu , min l nhng thay i khng tc ng n vic s dng i tng im. Tng t nh vy, ta c th b sung thm thuc tnh mu v mt s thao tc ln mt i tng im, c

c mt i tng im mu. R rng l ng gi cho php n gin ho vic s dng mt i tng. Trong lp trnh hng i tng, ng gi cho php d liu ca i tng c che lp khi nhn t bn ngoi, ngha l nu ngi dng mun tc ng ln d liu ca i tng th phi gi n i tng cc thng ip(message). y cc phng thc ng vai tr l giao din bt buc gia cc i tng v ngi s dng. Ta c nhn xt: Li gi n mt phng thc l truyn mt thng bo n cho i tng. Cc thng ip gi ti i tng no s gn cht vi i tng v ch i tng no nhn c thng ip mi phi thc hin theo thng ip ; chng hn cc i tng im c lp vi nhau, v vy thng ip thay i to i tng im p ch lm nh hng n cc thnh phn to trong p ch khng th thay i c ni dung ca mt i tng im q khc. So vi lp trnh hng i tng thun tu, cc ci t c th ca i tng trong C++ linh ng hn mt cht, bng cch cho php ch che du mt b phn d liu ca i tng v m rng hn kh nng truy nhp n cc thnh phn ring ca i tng. Khi nim lp chnh l c s cho cc linh ng ny. Lp l mt m t tru tng ca nhm cc i tng c cng bn cht. Trong mt lp ngi ta a ra cc m t v tnh cht ca cc thnh phn d liu, cch thc thao tc trn cc thnh phn ny(hnh vi ca cc i tng), ngc li mi mt i tng l mt th hin c th cho nhng m t tru tng . Trong cc ngn ng lp trnh, lp ng vai tr mt kiu d liu c ngi dng nh ngha v vic to ra mt i tng c v nh khai bo mt bin c kiu lp.

17. Lp 17.1 Khai bo lp T quan im ca lp trnh cu trc, lp l mt kiu d liu t nh ngha. Trong lp trnh hng i tng, chng trnh ngun c phn b trong khai bo v nh nghi ca cc lp. Sau y l mt v d in hnh v c php khai bo lp. Kinh nghim cho thy mi kiu khai bo khc u c th chun ho a v dng ny.
class <tn lp> { private: <khai bo cc thnh phn ring trong tng i tng> public: <khai bo cc thnh phn cng cng ca tng i tng> }; <nh nghi ca cc hm thnh phn cha c nh ngha bn trong khai bo lp> ...

Cc chi tit lin quan n khai bo lp s ln lt c cp n trong cc phn sau. d hnh dung xt mt v d v khai bo lp im trong mt phng. Trong v d ny ta c cp n mt vi kha cnh lin quan n khai bo lp, i tng v s dng chng. V d 3.1 /*point.cpp*/ #include <iostream.h> #include <conio.h> class point { /*khai bo cc thnh phn d liu ring*/ private:

int x,y; /*khai bo cc hm thnh phn cng cng*/ public: void init(int ox, int oy); void move(int dx, int dy); void display(); }; /*nh ngha cc hm thnh phn bn ngoi khai bo lp*/ void point::init(int ox, int oy) { cout<<"Ham thanh phan init\n"; x = ox; y = oy; /*x,y l cc thnh phn ca i tng gi hm thnh phn*/ } void point::move(int dx, int dy) { cout<<"Ham thanh phan move\n"; x += dx; y += dy; } void point::display() { cout<<"Ham thanh phan display\n"; cout<<"Toa do: "<<x<<" "<<y<<"\n"; } void main() { clrscr(); point p; p.init(2,4); /*gi hm thnh phn t i tng*/ p.display(); p.move(1,2); p.display();

getch(); } Ham thanh phan init Ham thanh phan display Toa do: 2 4 Ham thanh phan move Ham thanh phan display Toa do: 3 6 Nhn xt 12) C th khai bo trc tip cc hm thnh phn bn trong khai bo lp. Tuy vy iu i khi lm mt m quan ca chng trnh ngun, do vy ngi ta thng s dng cch khai bo cc hm thnh phn bn ngoi khai bo lp. Khi ta s dng c php:
<tn kiu gi tr tr li> <tn lp>::<tn hm> (<danh sch tham s>) { <ni dung > }

13) Gi hm thnh phn ca lp t mt i tng chnh l truyn thng ip cho hm thnh phn . C php nh sau:
<tn i tng>.<tn hm thnh phn>(<danh sch cc tham s nu c>);

17.1.1 To i tng Trong C++, mt i tng c th c xc lp thng quan mt bin/hng c kiu lp.
<tn lp> <tn i tng>;

Do vng nh c cp pht cho mt bin kiu lp s cho ta mt khung ca i tng bao gm d liu l cc

th hin c th ca cc m t d liu trong khai bo lp cng vi cc thng ip gi ti cc hm thnh phn. Mi i tng s hu mt tp cc bin tng ng vi tn v kiu ca cc thnh phn d liu nh ngha trong lp. Ta gi chng l cc bin th hin ca i tng. Tuy nhin tt c cc i tng cng mt lp chung nhau nh ngha ca cc hm thnh phn. Lp l mt kiu d liu v vy c th khai bo con tr hay tham chiu n mt i tng thuc lp v bng cch y c th truy nhp gin tip n i tng. Nhng ch l con tr v tham chiu khng phi l mt th hin ca lp.

Khung DL

Lp

Phng thc
i tng D liu c th 1 Tham chiu phng thc i tng D liu c th 2 Tham chiu phng thc

Hnh 3.2 i tng l mt th hin ca lp

17.1.2 Cc thnh phn d liu C php khai bo cc thnh phn d liu ging nh khai bo bin:
<tn kiu> <tn thnh phn>;

Mt thnh phn d liu c th l mt bin kiu c s (int, float, double, char, char *), kiu trng bit, kiu lit k (enum) hay cc kiu do ngi dng nh ngha. Thm

ch, thnh phn d liu cn c th l mt i tng thuc lp c khai bo trc . Tuy nhin khng th dng trc tip cc lp khai bo kiu thnh phn d liu thuc vo bn thn lp ang c nh ngha. Mun vy, trong khai bo ca mt lp c th dng cc con tr hoc tham chiu n cc i tng ca chnh lp . Trong khai bo ca cc thnh phn d liu, c th s dng t kho static nhng khng c s dng cc t kho auto, register, extern trong khai bo cc thnh phn d liu. Cng khng th khai bo v khi u gi tr cho cc thnh phn . 17.1.3 Cc hm thnh phn Hm c khai bo trong nh ngha ca lp c gi l hm thnh phn hay phng thc ca lp (hm thnh phn l thut ng ca C++, cn phng thc l thut ng trong lp trnh hng i tng ni chung). Cc hm thnh phn c th truy nhp n cc thnh phn d liu v cc hm thnh phn khc trong lp. Nh trn ni, C++ cho php hm thnh phn truy nhp ti cc thnh phn ca cc i tng cng lp, min l chng c khai bo bn trong nh ngha hm (nh l mt i tng cc b hay mt tham s hnh thc ca hm thnh phn). Phn tip sau s c cc v d minh ho cho kh nng ny. Trong chng trnh point.cpp, trong khai bo ca lp point c cha cc khai bo cc hm thnh phn ca lp. Cc khai bo ny cng tun theo c php khai bo cho cc hm bnh th-ng. nh ngha ca cc hm th c th t bn trong hay bn ngoi khai bo lp; Khi nh ngha hm thnh phn t trong khai bo lp (nu hm thnh phn n gin, khng cha cc cu trc lp 2) khng c g khc so vi nh ngha ca hm thng thng. Chng trnh point1.cpp sau y l

Hm thnh phn nh ngha trong khai bo lp -c ch-ng trnh dch hiu l hm inline, nn khng -c qu phc tp.

mt cch vit khc ca point.cpp trong hm thnh phn init() c nh ngha ngay bn trong khai bo lp. V d 3.2 /*point1.cpp*/ #include <iostream.h> #include <conio.h> class point { /*khai bo cc thnh phn d liu private*/ private: int x,y; /*khai bo cc hm thnh phn public*/ public: /*nh ngha hm thnh phn bn trong khai bo lp*/ void init(int ox, int oy){ cout<<"Ham thanh phan init\n"; x = ox; y = oy; /*x,y l cc thnh phn ca i tng gi hm thnh phn*/ } void move(int dx, int dy); void display(); }; /*nh ngha cc hm thnh phn bn ngoi khai bo lp*/ void point::move(int dx, int dy) { cout<<"Ham thanh phan move\n"; x += dx; y += dy; } void point::display() {

cout<<"Ham thanh phan display\n"; cout<<"Toa do: "<<x<<" "<<y<<"\n"; } void main() { clrscr(); point p; p.init(2,4); /*gi hm thnh phn t i tng*/ p.display(); p.move(1,2); p.display(); getch(); } Ham thanh phan init Ham thanh phan display Toa do: 2 4 Ham thanh phan move Ham thanh phan display Toa do: 3 6 Khi nh ngha hm thnh phn ngoi lp, dng tiu ca hm thnh phn phi cha tn ca lp c hm l thnh vin tip theo l ton t nh phm vi ::. l cch phn bit hm thnh phn vi cc hm t do, ng thi cn cho php hai lp khc nhau c th c cc hm thnh phn cng tn. C th t nh ngha hm thnh phn trong cng tp tin khai bo lp hoc trong mt tp tin khc. V d sau y sau y l mt ci bin khc t point.cpp, trong ta t ring khai bo lp point trong mt

tp tiu . Tp tiu s -c tham chiu ti trong tp ch-ng trnh point2.cpp cha nh ngha cc hm thnh phn ca lp point. V d 3.3 Tp tiu /*point.h*/ /* y l tp tin tiu khai bo lp point c gp vo tp point2.cpp */ #ifndef point_h #define point_h #include <iostream.h> class point { /*khai bo cc thnh phn d liu private*/ private: int x,y; /*khai bo cc hm thnh phn public*/ public: /*nh ngha hm thnh phn bn trong khai bo lp*/ void init(int ox, int oy); void move(int dx, int dy); void display(); }; #endif Tp chng trnh ngun /*point2.cpp*/ /*Tp tin chng trnh, nh ngha v s dng cc hm thnh phn trong lp point c khai bo trong tp tin tiu point.h */

#include point.h/*chn nh ngha lp point vo chng trnh*/ #include <conio.h> /*nh ngha cc hm thnh phn bn ngoi khai bo lp*/ void point::init(int ox, int oy) { cout<<"Ham thanh phan init\n"; x = ox; y = oy; /*x,y l cc thnh phn ca i tng gi hm thnh phn*/ } void point::move(int dx, int dy) { cout<<"Ham thanh phan move\n"; x += dx; y += dy; } void point::display() { cout<<"Ham thanh phan display\n"; cout<<"Toa do: "<<x<<" "<<y<<"\n"; } void main() { clrscr(); point p; p.init(2,4); /*gi hm thnh phn t i tng*/ p.display(); p.move(1,2); p.display(); getch(); } Ham thanh phan init Ham thanh phan display

Toa do: 2 4 Ham thanh phan move Ham thanh phan display Toa do: 3 6 17.1.4 Tham s ngm nh trong li gi hm thnh phn y khng nn nhm ln khi nim ny vi li gi hm vi tham s c gi tr ngm nh. Li gi hm thnh phn lun c mt v ch mt tham s ngm nh l i tng thc hin li gi hm. Nh th cc bin x, y trong nh ngha ca cc hm point::init(), point::display(), hay point::move() chnh l cc bin th hin ca i tng dng lm tham s ngm nh trong li gi hm. Do vy li gi hm thnh phn: p.init(2,4) s gn 2 cho p.x cn p.y s c gi tr 4. Tt nhin, theo nguyn tc ng gi, khng gn tr cho cc thnh phn d liu ca i tng mt cch trc tip. p.x = 2; p.y = 4; Hn na, khng th thc hin li gi ti hm thnh phn nu khng ch r i tng c tham chiu. Ch th: init(5,2); trong hm main s c th gy li bin dch nu trong chng trnh khng c hm t do vi tn init.

17.1.5 Phm vi lp Phm vi ch ra phn chng trnh trong c th truy xut n mt i tng no . Trong C c bn kiu phm vi lin quan n cch thc v v tr khai bo bin: phm vi khi lnh, phm vi tp, phm vi chng trnh v phm vi hm nguyn mu, trong thng dng nht l phm vi ton cc (tp, chng trnh) v phm vi cc b (khi lnh, hm). Mc ch ca phm vi l kim sot vic truy xut n cc bin/hng/hm. kim sot truy nhp n cc thnh phn (d liu, hm) ca cc lp, C++ a ra khi nim phm vi lp. Tt c cc thnh phn ca mt lp s c coi l thuc phm vi lp; trong nh ngha hm thnh phn ca lp c th tham chiu n bt k mt thnh phn no khc ca cng lp . Tun theo tng ng gi, C++ coi tt c cc thnh phn ca mt lp c lin h vi nhau. Ngoi ra, C++ cn cho php m rng phm vi lp n cc lp con chu, bn b v h hng (Xem thm chng 5 - K tha v cc mc tip sau hiu r hn). 17.1.6 T kho xc nh thuc tnh truy xut Trong phn ny ta ni ti vai tr ca hai t kho private v public - dng xc nh thuc tnh truy xut ca cc thnh phn lp. Trong nh ngha ca lp ta c th xc nh kh nng truy xut thnh phn ca mt lp no t bn ngoi phm vi lp. Trong lp point c hai thnh phn d liu v ba thnh phn hm. Cc thnh phn d liu c khai bo vi nhn l private, cn cc hm thnh vi nhn public. private v public l cc t kho xc nh thuc tnh truy xut. Mi thnh phn c lit k trong phn public u c th truy xut trong bt k hm no. Nhng thnh phn c lit k trong phn private ch c truy xut bn trong phm vi lp, bi chng thuc s hu ring ca lp, trong khi cc thnh phn public thuc s hu chung ca mi thnh phn trong chng trnh.

Vi khai bo lp point ta thy rng cc thnh phn private c tnh t ch n xut hin cho n trc nhn public. Trong lp c th c nhiu nhn private v public. Mi nhn ny c phm vi nh hng cho n khi gp mt nhn k tip hoc ht khai bo lp. Xem chng trnh tamgiac.cpp sau y:

V d 3.4 /*tamgiac.cpp*/ #include <iostream.h> #include <math.h> #include <conio.h> /*khai bo lp tam gic*/ class tamgiac{ private: float a,b,c;/* di ba cnh*/ public: void nhap();/*nhp vo di ba cnh*/ void in();/*in ra cc thng tin lin quan n tam gic*/ private: int loaitg();/*cho bit kiu ca tam gic: 1d,2-vc,3-c,4-v,5-t*/ float dientich();/*tnh din tch ca tam gic*/ }; /*nh ngha hm thnh phn*/ void tamgiac::nhap() { /*nhp vo ba cnh ca tam gic, c kim tra iu kin*/ do { cout<<"Canh a : "; cin>>a; cout<<"Canh b : "; cin>>b; cout<<"Canh c : "; cin>>c; }while(a+b<=c||b+c<=a||c+a<=b); }

void tamgiac::in() { cout<<"Do dai ba canh :"<<a<<" "<<b<<" "<<c<<"\n"; /* gi hm thnh phn bn trong mt hm thnh phn khc cng lp */ cout<<"Dien tich tam giac : "<<dientich()<<"\n"; switch(loaitg()) { case 1: cout<<"Tam giac deu\n";break; case 2: can\n";break; case 4: vuong\n";break; default:cout<<"Tam thuong\n";break; } } float tamgiac::dientich() { return (0.25*sqrt((a+b+c)*(a+b-c)*(ab+c)*(-a+b+c))); } int tamgiac::loaitg() { if (a==b||b==c||c==a) if (a==b && b==c) return 1; else if (a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b) return 2; else return 3; cout<<"Tam giac vuong

case 3: cout<<"Tam giac can\n";break; cout<<"Tam giac giac

else if (a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b) return 4; else return 5; } void main() { clrscr(); tamgiac tg; tg.nhap(); tg.in(); getch(); } Canh a : 3 Canh b : 3 Canh c : 3 Do dai ba canh :3 3 3 Dien tich tam giac : 3.897114 Tam giac deu Canh a : 3 Canh b : 4 Canh c : 5 Do dai ba canh :3 4 5 Dien tich tam giac : 6 Tam giac vuong Cc thnh phn trong mt lp c th c sp xp mt cch ht sc tu . Do c th sp xp li cc khai bo hm thnh phn cho cc thnh phn private trn, cn cc thnh phn public di trong khai bo

lp. Chng hn c th a ra mt khai bo khc cho lp tamgiac trong tamgiac.cpp nh sau: class tamgiac{ private: float a,b,c;/* di ba cnh*/ int loaitg();/*cho bit kiu ca tam gic: 1d,2-vc,3-c,4-v,5-t*/ float dientich();/*tnh din tch ca tam gic*/ public: void nhap();/*nhp vo di ba cnh*/ void in();/*in ra cc thng tin lin quan n tam gic*/ }; Ngoi ra, cn c th b nhn private i v C++ ngm hiu rng cc thnh phn trc nhn public u tin l private ( y chng ta tm thi cha bn n t kho protected). Tm li, khai bo sc tch nht cho lp tam gic nh sau: class tamgiac { float a,b,c;/* di ba cnh*/ int loaitg();/*cho bit kiu ca tam gic: 1d,2-vc,3-c,4-v,5-t*/ float dientich();/*tnh din tch ca tam gic*/ public: void nhap();/*nhp vo di ba cnh*/ void in();/*in ra cc thng tin lin quan n tam gic*/ };

17.1.7 Gi mt hm thnh phn trong mt hm thnh phn khc Khi khai bo lp, c th gi hm thnh phn t mt hm thnh phn khc trong cng lp . Khi mun gi mt hm t do trng tn v danh sch tham s ta phi s dng ton t phm vi ::. Bn c c th kim nghim iu ny bng cch nh ngha mt hm t do tn loaitg v gi n trong nh ngha ca hm tamgiac::in(). Nhn xt 14) Nu tt c cc thnh phn ca mt lp l public, lp s hon ton tng ng vi mt cu trc, khng c phm vi lp. C++ cng cho php khai bo cc cu trc vi cc hm thnh phn. Hai khai bo sau l tng ng nhau: struct point { int x, y; void init(int, int); void move(int, int); void display(); }; class point { public: int x, y; void init(int, int); void move(int, int); void display(); };

15) Ngoi public v private, cn c t kho protected (c bo v) dng ch nh trng thi ca cc thnh phn trong mt lp. Trong phm vi ca lp hin ti mt thnh phn protected c tnh cht ging nh thnh phn private.

17.2

Kh nng ca cc hm thnh phn

17.2.1 nh ngha chng cc hm thnh phn. Cc hm thnh phn c th c trng tn nhng phi khc nhau kiu gi tr tr v, danh sch kiu cc tham s. Hm thnh phn c php gi ti cc hm thnh phn khc, thm ch trng tn. Chng trnh point3.cpp sau y l mt ci bin mi ca point.cpp: V d 3.5 /*point3.cpp*/ #include <iostream.h> #include <conio.h> class point int x,y; public: /*nh ngha chng cc hm thnh phn init v display*/ void init(); void init (int); void init (int,int); void display(); void display(char *); }; void point::init() x=y=0; } void point::init(int abs) x=abs;y=0; } { { {

void point::int(int abs,int ord) x=abs; y=ord; } void point::display() {

cout<<"Toa do : "<<x<<" "<<y<<"\n"; } void point::display(char *mesg) cout<<mesg; display(); } void main() clrscr(); point a; a.init();/*point::init()*/ a.display();/*point::display()*/ point b; b.init(5); /*point::init(int )*/ b.display("point b - ");/*point::display(char *)*/ point c; c.init(3,12); /*point::init(int, int)*/ c.display("Hello ----"); getch(); } Toa do : 0 0 point b - Toa do : 5 0 Hello ----Toa do : 3 12 { {

17.2.2 Cc tham s vi gi tr ngm nh Ging nh cc hm thng thng, li gi hm thnh phn c th s dng gi tr ngm nh cho cc tham s. Gi tr ngm nh ny s c khai bo trong nh ngha hm thnh phn hay trong khai bo (trong khai bo lp) ca n. Chng trnh point4.cpp sau y c ci tin t point3.cpp ngn gn hn nhng vn gi c tt c cc kh nng nh trong point3.cpp V d 3.6 /*point4.cpp*/ #include <iostream.h> #include <conio.h> class point int x,y; public: void init (int=0,int=0); void display(char *=); }; void point::int(int abs,int ord) x=abs; y=ord; } void point::display(char *mesg) cout<<mesg; display(); } void main() clrscr(); point a; a.init();/*a.init(0,0)*/ a.display();/*a.display();*/ { { { {

point b; b.init(5);/*b.init(5,0)*/ b.display("point b - "); point c; c.init(3,12);/*c.init(3,12)*/ c.display("Hello ----"); getch(); } Toa do : 0 0 point b - Toa do : 5 0 Hello ----Toa do : 3 12 17.2.3 S dng i tng nh tham s ca hm thnh phn y cp n kh nng m rng phm vi lp i vi cc i tng h hng. 17.2.3.1 Truy nhp n cc thnh phn private trong i t-ng Hm thnh phn c quyn truy nhp n cc thnh phn private ca i tng gi n. Xem nh ngha hm thnh phn point::init(): void point::int(int abs,int ord) { x=abs; y=ord; } 17.2.3.2 Truy nhp n cc thnh phn private trong cc tham s l i t-ng truyn cho hm thnh phn. Hm thnh phn c quyn truy nhp n tt c cc thnh phn private ca cc i tng, tham chiu i

tng hay con tr i tng c cng kiu lp khi c dng l tham s hnh thc ca n. class point { int x,y; public: ... /* Cc i tng c truyn theo gi tr ca chng */ int coincide(point pt) {return(x==pt.x && y==pt.y);} /* Cc i tng c truyn bng a ch */ int coincide(point *pt) {return(x==pt->x && y==pt->y);} /* Cc i tng c truyn bng tham chiu */ int coincide(point &pt) {return(x==pt.x && y==pt.y);} } 17.2.3.3 Dng i t-ng nh- gi tr tr v ca hm thnh phn hm trong cng lp Hm thnh phn c th truy nhp n cc thnh phn private ca cc i tng, con tr i tng, tham chiu i tng nh ngha bn trong n. class point { int x,y; public: ... point symetry() {

point res; res.x=-x;res.y=-y; return res; } }; 17.2.4 Con tr this T kho this trong nh ngha ca cc hm thnh phn lp dng xc nh a ch ca i tng dng lm tham s ngm nh cho hm thnh phn. Ni cch khc, con tr this tham chiu n i tng ang gi hm thnh phn. Nh vy, c th truy nhp n cc thnh phn ca i tng gi hm thnh phn gin tip thng qua this. Sau y l mt cch vit khc cho nh ngha ca cc hm point::coincide() v point::display(): int point::coincide(point pt) {return(this->x==pt.x >y==pt.y);} void point::display() { cout<<"Dia chi : "<<x<<" "<<y<<"\n"; } 18. Php gn cc i tng C th thc hin php gn gia hai i tng cng kiu. Chng hn, vi lp point khai bo trn: point a, b; a.init(5,2); b=a; "<<this<<"Toa do : && this-

V thc cht l vic sao chp gi tr cc thnh phn d liu (x, y) t i tng a sang i tng b tng ng tng i mt (khng k lbcc thnh phn public a hay private).
x y 5 2 5 2 x y

Ch Khi cc i tng trong php gn cha cc thnh phn d liu ng, vic sao chp li khng lin quan n cc vng d liu (Ngi ta ni rng l s sao chp b mt ). Chng hn, nu hai i tng a v b cng kiu, c cc thnh phn d liu x,y(tnh) v z l mt con tr ch n mt vng nh c cp pht ng. Php gn a = b; c minh ho nh trn hnh v:
a b x y z 5 2 5 2 x y z

vng d liu ng

iu ny c th t nhiu gy kh khn cho vic qun l cp pht ng. Th nht, vng nh ng trc y trong a (nu c) by gi khng th kim sot c na. Th hai, vng nh ng ca b by gi s c truy nhp bi cc hm thnh phn ca c a v b v nh vy tnh ring t d liu ca cc i tng b vi phm. 19. Hm thit lp (constructor) v hm hu b (destructor) 19.1 Hm thit lp

19.1.1 Chc nng ca hm thit lp Hm thit lp l mt hm thnh phn c bit khng th thiu c trong mt lp. N c gi t ng mi khi c mt i tng c khai bo. Chc nng ca hm thit lp l khi to cc gi tr thnh phn d liu ca i

tng, xin cp pht b nh cho cc thnh phn d liu ng. Chng trnh point5.cpp sau y l mt phin bn mi ca point.cpp trong thay th hm thnh phn init bi hm thit lp.

V d 3.7 /*point5.cpp*/ #include <iostream.h> #include <conio.h> /*nh ngha lp point*/ class point { /*khai bo cc thnh phn d liu*/ int x; int y; public: /*khai bo cc thnh phn hm*/ point(int ox,int oy) {x=ox;y=oy;}/*hm thit lp*/ void move(int dx,int dy) ; void display(); }; void point::move(int dx,int dy){ x+=dx; y+=dy; } void point::display(){ cout<<Toa do : <<x<<" "<<y<<"\n"; } void main() { clrscr(); point a(5,2); /*S dng hm thit lp*/ a.display();

a.move(-2,4); a.display(); point b.init(1,-1);b.display(); clrscr(); } Toa do : 5 2 Toa do : 3 6 Toa do : 1 -1 19.1.2 Mt s c im quan trng ca hm thit lp 16) Hm thit lp c cng tn vi tn ca lp. 17) Hm thit lp phi c thuc tnh public. 18) Hm thit lp khng c gi tr tr v. V khng cn khai bo void 3. 19) C th c nhiu hm thit lp trong cng lp (chng cc hm thit lp). 20) Khi mt lp c nhiu hm thit lp, vic to cc i tng phi km theo cc tham s ph hp vi mt trong cc hm thit lp khai bo. V d: /*nh ngha li lp point*/ class point { int x,y; public: point() {x=0;y=0;} point(int ox, int oy) {x=ox;y=oy;} /*hm thit lp c hai tham s*/
3

S gii hn ny l khng th trnh c v hm thit lp thng c gi vo lc nh ngha mt i tng mi, m lc th khng c cch no ly li hoc xem xt gi tr tr v ca hm thit lp c. iu ny c th tr thnh mt vn khi hm thit lp cn phi tr v mt trng thi li. Gii quyt vn ny ngi ta dng n kh nng kim sot li s c trnh by trong ph lc 2.

void move(int,int); void display(); }; point a(1); /* Li v tham s khng ph hp vi hm thit lp */ point b;/*ng, tham s ph hp vi hm thit lp khng tham s*/ point c(2,3);/*ng, tham s ph hp vi hm thit lp th hai, c hai tham s*/ 21) Hm thit lp c th c khai bo vi cc tham s c gi tr ngm nh. Xt v d sau: /*nh ngha li lp point*/ class point { int x,y; public: point(int ox, int oy = 0) {x=ox;y=oy;} /*hm thit lp c hai tham s*/ void move(int,int); void display(); }; point a; /*Li: khng c hm thit lp ngm nh hoc hm thit lp vi cc tham s c gi tr ngm nh*/ point b(1);//i s th hai nhn gi tr 0 point c(2,3);//ng Nhn xt Trong v d trn, ch th: point b(1);

c th c thay th bng cch vit khc nh sau: point b=1; Cch vit th hai hm rng c chuyn kiu ngm nh t s nguyn 1 thnh i tng kiu point. Chng ta s cp vn ny mt cch y hn trong chng 4. 19.1.3 Hm thit lp ngm nh Hm thit lp ngm nh do chng trnh dch cung cp khi trong khai bo lp khng c nh ngha hm thit lp no. Lp point nh ngha trong chng trnh point.cpp l mt v d trong chng trnh bin dch t b sung mt hm thit lp ngm nh cho khai bo lp. D nhin hm thit lp ngm nh khng thc hin bt c nhim v no ngoi vic lp ch trng. i khi ngi ta cng gi hm thit lp khng c tham s do ngi s dng nh ngha l hm thit lp ngm nh. Cn phi c hm thit lp ngm nh khi cn khai bo mng cc i tng. V d, trong khai bo: X a[10]; bt buc trong lp X phi c mt hm thit lp ngm nh. Ta minh ho nhn xt ny bng hai v d sau: a. Trong trng hp th nht khng dng hm thit lp khng tham s: V d 3.8 /*point6.cpp*/ #include <iostream.h> /*nh ngha lp point*/ class point { /*khai bo cc thnh phn d liu*/

int x; int y; public: /*khai bo cc hm thnh phn */ point(int ox,int oy) {x=ox;y=oy;} void move(int dx,int dy) ; void display(); }; /*phn bit cc hm thnh phn vi cc hm thng thng nh tn lp v ton t ::*/ void point::move(int dx,int dy) { x+=dx; y+=dy; } void point::display() } void main() { point a(5,2); //OK a.display(); a.move(-2,4); a.display(); point b[10];//li v khng cung cp thng s cn thit cho hm thit lp } Trong chng trnh point6.cpp, li xy ra v ta mun to ta mi i tng nhng khng cung cp cc tham s cho hm thit lp c nh nh ngha ( y ta cha cp n hm thit lp sao chp ngm nh, n s c trnh by trong phn sau). Gii quyt tnh hung ny bng hai cch: hoc b lun hm thit lp hai { cout<<Toa do : <<x<<" "<<y<<"\n";

tham s trong khai bo lp nhng khi , khai bo ca i tng a s khng cn ng na. Do vy ta thng s dng gii php nh ngha thm mt hm thit lp khng tham s: b. nh nghi hm thit lp khng tham s V d 3.9 /*point7.cpp*/ #include <iostream.h> #include <conio.h> class point { /*khai bo cc thnh phn d liu*/ int x; int y; public: /*khai bo cc hm thnh phn*/ point(int ox,int oy) {x=ox;y=oy;} /*nh ngha thm hm thit lp khng tham s*/ point() {x = 0; y = 0;} void move(int dx,int dy) ; void display(); }; /*phn bit cc thnh phn hm vi cc hm thng thng nh tn lp v ton t ::*/ void point::move(int dx,int dy) { x+=dx; y+=dy; } void point::display() { cout<<Toa do : <<x<<" "<<y<<"\n"; }

void main() { clrscr(); point a(5,2); //OK a.display(); a.move(-2,4); a.display(); point b[10];/*Ht li v hm thit lp khng tham s c gi to cc i tng thnh phn ca */ getch(); } Cn mt gii php khc khng cn nh ngha thm hm thit lp khng tham s. Khi cn khai bo gi tr ngm nh cho cc tham s ca hm thit lp hai tham s: V d 3.10 /*point8.cpp*/ #include <iostream.h> #include <conio.h> class point { /*khai bo cc thnh phn d liu*/ int x; int y; public: /*khai bo cc hm thnh phn */ point(int ox = 1,int oy =0) {x=ox;y=oy;} void move(int dx,int dy) ; void display(); }; void point::move(int dx,int dy){

x+=dx; y+=dy; } void point::display() } void main() { clrscr(); point a(5,2); //OK a.display(); a.move(-2,4); a.display(); point b[10];/*Trong trng hp ny cc i tng thnh phn ca b c to ra nh hm thit lp c gi vi hai tham s c gi tr ngm nh l 1 v 0.*/ getch(); } 19.1.4 Con tr i tng Con tr i tng c khai bo nh sau: point *ptr; Con tr i tng c th nhn gi tr l a ch ca cc i tng c cng kiu lp: ptr = &a; Khi c th gi cc hm thnh phn ca lp point thng qua con tr nh sau: ptr->display(); ptr->move(-2,3); { cout<<Toa do : <<x<<" "<<y<<"\n";

Khi dng ton t new cp pht mt i tng ng, hm thit lp cng c gi, do vy cn cung cp danh sch cc tham s. Chng hn, gi s trong lp point c mt hm thit lp hai tham s, khi cu lnh sau: ptr = new point(3,2); s xin cp pht mt i tng ng vi hai thnh phn x v y nhn gi tr tng ng l 2 v 3. Kt qu ny c minh chng qua li gi hm: ptr->display(); Toa do : 2 3

Ta xt chng trnh v d sau: V d 3.11 /*point9.cpp*/ #include <conio.h> #include <iostream.h> class point { /*khai bo cc thnh phn d liu*/ int x; int y; public: /*khai bo cc hm thnh phn */ point(int ox = 1,int oy =0) {x=ox;y=oy;} void move(int dx,int dy) ; void display(); }; void point::move(int dx,int dy){ x+=dx; y+=dy; } void point::display() { cout<<"Toa do : "<<x<<" "<<y<<"\n"; } void main() { clrscr(); point a(5,2); a.display(); point *ptr = &a;

ptr->display(); a.move(-2,4); ptr->display(); ptr->move(2,-4); a.display(); ptr = new point;/*Gi hm thit lp vi hai tham s c gi tr ngm nh*/ ptr->display(); delete ptr; ptr = new point(3);/*Tham s th hai ca hm thit lp c gi tr ngm nh*/ ptr->display(); delete ptr; ptr = new point (3,5);/*Hm thit lp c cung cp hai tham s tng minh*/ ptr->display(); delete ptr; point b[10]; getch(); } Toa do : 5 2 Toa do : 5 2 Toa do : 3 6 Toa do : 5 2 Toa do : 1 0 Toa do : 3 0 Toa do : 3 5

19.1.5 Khai bo tham chiu i tng Khi i tng l ni dung mt bin c kiu lp, ta c th gn cho n cc b danh; ngha l c th khai bo cc tham chiu n chng. Mt tham chiu i tng ch c ngha khi tham chiu ti mt i tng no c khai bo trc . Chng hn: point a(2,5); point &ra=a; a.display(); ra.display(); ra.move(2,3); a.display(); Toa do : 2 5 Toa do : 2 5 Toa do : 4 8 19.2 Hm hu b

19.2.1 Chc nng ca hm hu b Ngc vi hm thit lp, hm hu b c gi khi i tng tng ng b xo khi b nh. Ta xt chng trnh v d sau: V d 3.12 /*test.cpp*/ #include <iostream.h> #include <conio.h> int line=1; class test { public: int num; test(int);

~test(); }; test::test(int n) { num = n; cout<<line++<<.; cout<<"++ Goi ham thiet lap voi num = "<<num<<"\n"; } test::~test() { cout<<line++<<.; cout<<"-- Goi "<<num<<"\n"; } void main() { clrscr(); void fct(int); test a(1); for(int i=1; i<= 2; i++) fct(i); } void fct(int p) { test x(2*p); } 1. ++ Goi ham thiet lap voi num = 1 2. ++ Goi ham thiet lap voi num = 2 3. -- Goi ham huy bo voi num = 2 4. ++ Goi ham thiet lap num = 4 5. -- Goi ham huy bo voi num = 4 6. -- Goi ham huy bo voi num = 1 ham huy bo voi num =

Ta l gii nh sau: trong chng trnh chnh, dng th nht to ra i tng a c kiu lp test, do c dng thng bo s 1. Vng lp for hai ln gi ti hm fct(). Mi li gi hm fct() ko theo vic khai bo mt i tng cc b x trong hm. V l i tng cc b bn trong hm fct() nn x b xo khi vng b nh ngn xp (dng cp pht cho cc bin cc b khi gi hm) khi kt thc thc hin hm. Do , mi li gi ti fct() sinh ra mt cp dng thng bo, tng ng vi li gi hm thit lp, hm hu b(cc dng thng bo 2, 3, 4, 5 tng ng). Cui cng, khi hm main() kt thc thc hin, i tng a c gii phng, hm hu b i vi a s cho ra dng thng bo th 6. 19.2.2 Mt s qui nh i vi hm hu b 22) Tn ca hm hu b bt u bng du ~ theo sau l tn ca lp tng ng. Chng hn lp test th s hm hu b tn l ~test. 23) Hm hu b phi c thuc tnh public 24) Ni chung hm hu b khng c tham s, mi lp ch c mt hm hu b (Trong khi c th c nhiu cc hm thit lp). 25) Khi khng nh ngha hm hu b, chng trnh dch t ng sn sinh mt hm nh vy (hm hu b ngm nh), hm ny khng lm g ngoi vic lp ch trng. i vi cc lp khng c khai bo cc thnh phn b nh ng, c th dng hm hu b ngm nh. Tri li, phi khai bo hm hu b tng minh m bo qun l tt vic gii phng b nh ng do cc i tng chim gi chim gi khi chng ht thi gian lm vic. 26) Ging nh hm thit lp, hm hu b khng c gi tr tr v.

19.3 S cn thit ca cc hm thit lp v hu b -lp vector trong khng gian n chiu Trn thc t, vi cc lp khng c cc thnh phn d liu ng ch cn s dng hm thit lp v hu b ngm nh l . Hm thit lp v hu b do ngi lp trnh to ra rt cn thit khi cc lp cha cc thnh phn d liu ng. Khi to i tng hm thit lp xin cp pht mt khi b nh ng, do hm hu b phi gii phng vng nh c cp pht trc . V d sau y minh ho vai tr ca hm hu b trong trng hp lp c cc thnh phn cp pht ng. V d 3.13 /*vector.cpp*/ #include <iostream.h> #include <conio.h> class vector { int n; public: vector(); //Hm thit lp khng tham s vector(int size); //Hm thit lp mt tham s vector(int size, float *a); ~vector();//Hm hu b, lun lun khng c tham s void display(); }; vector::vector() int i; cout<<"Tao doi tuong tai "<<this<<endl; cout<<"So chieu :";cin>>n; { //s chiu //vng nh to float *v;

v= new float [n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) { cout<<"Toa do thu "<<i+1<<" : "; cin>>v[i]; } } vector::vector(int size) int i; cout<<"Su so\n"; n=size; cout<<"So chieu :"<<size<<endl; v= new float [n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) { cout<<"Toa do thu "<<i+1<<" : "; cin>>v[i]; } } vector::vector(int size,float *a ) int i; cout<<"Su so\n"; n=size; dung ham thiet lap 2 tham { dung ham thiet lap 1 tham {

cout<<"Tao doi tuong tai "<<this<<endl;

cout<<"Tao doi tuong tai "<<this<<endl;

cout<<"So chieu :"<<n<<endl; v= new float [n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) v[i] = a[i]; } vector::~vector() { cout<<"Giai phong "<<v<<"cua doi tuong tai"<<this<<endl; delete v; } //Hin th kt qu void vector::display() int i; cout<<"Doi tuong tai :"<<this<<endl; cout<<"So chieu :"<<n<<endl; for(i=0;i<n;i++) cout <<v[i] <<" "; cout <<"\n"; } void main() clrscr(); vector s1; s1.display(); vector s2(4); s2.display(); float a[3]={1,2,3}; vector s3(3,a); s3.display(); { {

getch(); } Tao doi tuong tai 0xfff2 So chieu :3 Xin cap phat vung bo nho 3 so thuc tai0x13cc Toa do thu 1 : 2 Toa do thu 2 : 3 Toa do thu 3 : 2 Doi tuong tai :0xfff2 So chieu :3 2 3 2 Su dung ham thiet lap 1 tham so Tao doi tuong tai 0xffee So chieu :4 Xin cap phat vung bo nho 4 so thuc tai0x13dc Toa do thu 1 : 3 Toa do thu 2 : 2 Toa do thu 3 : 3 Toa do thu 4 : 2 Doi tuong tai :0xffee So chieu :4 3 2 3 2 Su dung ham thiet lap 2 tham so Tao doi tuong tai 0xffea So chieu :3 Xin cap phat vung bo nho 3 so thuc tai0x13f0

Doi tuong tai :0xffea So chieu :3 1 2 3 Doi tuong tai :0xfff2 So chieu :3 2 3 2 Giai phong tai0xffea Giai phong tai0xffee Giai phong tai0xfff2 0x13f0cua 0x13dccua 0x13cccua doi doi doi tuong tuong tuong

Ch Khng c ln ln gia cp pht b nh ng trong hm thnh phn ca i tng (thng thng l hm thit lp) vi vic cp pht ng cho mt i tng. 19.4 Hm thit CONSTRUCTOR) lp sao chp(COPY

19.4.1 Cc tnh hung s dng hm thit lp sao chp Xt cc ch th khai bo v khi to gi tr cho mt bin nguyn: int p; int x = p; Ch th th hai khai bo mt bin nguyn x v gn cho n gi tr ca bin nguyn p. Tng t, ta cng c th khai bo mt i tng v gn cho n ni dung ca mt i tng cng lp tn ti trc . Chng hn: point p(2,3);/*gi thit lp point c hm thit lp hai tham s*/

point q =p; D nhin hai i tng, mi q v c p c cng ni dung. Khi mt i tng c to ra (khai bo) th mt hm thit lp ca lp tng ng s c gi. Hm thit lp c gi khi khai bo v khi to ni dung mt i tng thng qua mt i tng khc, gi l hm thit lp sao chp. Nhim v ca hm thit lp sao chp l to ra mt i tng ging ht mt i tng c. Thot nhn hm thit lp sao chp c v thc hin cc cng vic ging nh php gn, nhng nu s thy gia chng c cht t khc bit; php gn thc hin vic sao chp ni dung t i tng ny sang i tng khc, do vy c hai i tng trong php gn u tn ti: point p(2,3);//gi thit lp point c hm thit lp hai tham s point q;//gi thit lp point c hm thit lp khng tham s q = p; Ngc li, hm thit lp thc hin ng thi hai nhim v: to i tng v sao chp ni dung t mt i tng c sang i tng mi to ra . Ngoi tnh hung trn y, cn c hai trng hp cn dng hm thit lp sao chp: truyn i tng cho hm bng tham tr hoc hm tr v mt i tng nhm to mt i tng ging ht mt i tng cng lp c trc . Trong phn sau chng ta s c v d minh ho cho cc trnh by ny. 19.4.2 Hm thit lp sao chp ngm nh Ging nh hm thit lp ngm nh (hm thit lp khng tham s), nu khng c m t tng minh, s c mt hm thit lp sao chp ngm nh do chng trnh dch cung cp nhm m bo tnh ng n ca chng trnh trong cc tnh hung cn n hm thit lp. Nh vy, trong khai bo ca mt lp c t nht hai hm thit

lp ngm nh: hm thit lp ngm nh v hm thit lp sao chp ngm nh. Do l mt hm c to ra t ng nn hm thit lp sao chp ngm nh cng ch thc hin nhng thao tc ti thiu (ngm nh): to gi tr ca cc thuc tnh trong i tng mi bng cc gi tr ca cc thuc tnh tng ng trong i tng c. Bn c c th xem li phn 3 ca chng hiu r hn. Ni chung, vi cc lp khng khai bo cc thnh phn d liu ng th ch cn dng hm thit lp sao chp ngm nh l . Vn s khc i khi cn n cc thao tc qun l b nh ng trong cc i tng. Trong trng hp ny khng c dng hm thit lp sao chp ngm nh m phi gi hm thit lp sao chp tng minh. 19.4.3 Khai bo v nh ngha hm thit lp sao chp tng minh Dng ca hm thit lp sao chp Xt cc i tng thuc lp point. Cu lnh point q=p; s gi n hm thit lp sao chp. Nh nhn xt trong phn trn ta c th vit theo cch khc nh sau: point q(p); T cch vit trn c th cho rng dng ca hm thit lp sao chp cho lp point c th l: point (point); hoc point(point &); Ta nhn thy dng th nht khng dng c v vic gi n i hi phi truyn cho hm mt i tng nh mt tham tr, do gy ra quy v hn ln.

Vi dng th hai ta thit lp mt tham chiu ti i tng nh mt tham s hnh thc truyn cho hm, nn c th chp nhn c. Dng khai bo ca hm thit lp l:
point (point &); hoc point(const point &);

trong t kho const trong khai bo tham s hnh thc ch nhm ngn cm mi thay i ni dung ca tham s truyn cho hm. Chng trnh point10.cpp sau y b sung thm hm thit lp sao chp vo lp point. V d 3.14 /*point10.cpp*/ #include <conio.h> #include <iostream.h> /*nh ngha lp point*/ class point { /*khai bo cc thnh phn d liu*/ int x; int y; public: /*khai bo cc thnh phn hm*/ point(int ox = 1,int oy =0) { cout<<"Tao doi tuong : "<<this<<endl; cout<<"Dung ham thiet lap hai tham so\n"; x=ox;y=oy; } /*Hm thit lp sao chp*/ point(point &p) {

cout<<"Tao doi tuong : "<<this<<endl; cout<<"Dung ham thiet lap sao chep\n"; x = p.x; y = p.y; } void move(int dx, int dy) { x+=dx; y+=dy; } void display(); }; void point::display() } point fct(point a) { point b=a; b.move(2,3); return b; } void main(){ clrscr(); point a(5,2); a.display(); point b=fct(a); b.display(); getch(); } Tao doi tuong : 0xfff2 Dung ham thiet lap hai tham so Toa do : 5 2 { cout<<"Toa do : "<<x<<" "<<y<<"\n";

Tao doi tuong : 0xffea Dung ham thiet lap sao chep Tao doi tuong : 0xffde Dung ham thiet lap sao chep Tao doi tuong : 0xffee Dung ham thiet lap sao chep Toa do : 7 5 19.4.4 Hm thit lp sao chp cho lp vector Chng trnh v d sau gii thiu cch nh ngha hm thit lp khi i tng c cc thnh phn d liu ng. V d 3.15 /*vector2.cpp*/ #include <iostream.h> #include <conio.h> class vector { int n; public: vector(); vector(int size); vector(int size, float *a); vector(vector &);//hm thit lp sao chp ~vector(); void display(); }; vector::vector() int i; { //s chiu ca vector //vng nh cha cc to float *v;

cout<<"Tao doi tuong tai "<<this<<endl; cout<<"So chieu :";cin>>n; v= new float [n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) { cout<<"Toa do thu "<<i+1<<" : "; cin>>v[i]; } } vector::vector(int size) { int i; cout<<"Su so\n"; n=size; cout<<"So chieu :"<<size<<endl; v= new float [n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) { cout<<"Toa do thu "<<i+1<<" : "; cin>>v[i]; } } vector::vector(int size,float *a ) { int i; cout<<"Su so\n"; dung ham thiet lap 2 tham dung ham thiet lap 1 tham

cout<<"Tao doi tuong tai "<<this<<endl;

cout<<"Tao doi tuong tai "<<this<<endl; n=size; cout<<"So chieu :"<<n<<endl; v= new float [n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) v[i] = a[i]; } vector::vector(vector &b) { int i; cout<<"Su chep\n"; dung ham thiet lap sao

cout<<"Tao doi tuong tai "<<this<<endl; /*xin cp pht mt vng nh ng bng kch thc c trong i tng c*/ v= new float [n=b.n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) /*gn ni dung vng nh ng ca i tng c sang i tng mi*/ v[i] = b.v[i]; } vector::~vector() { cout<<"Giai phong "<<v<<"cua doi tuong tai"<<this<<endl; delete v; } //hin th kt qu

void vector::display() int i;

cout<<"Doi tuong tai :"<<this<<endl; cout<<"So chieu :"<<n<<endl; for(i=0;i<n;i++) cout <<v[i] <<" "; cout <<"\n"; } void main() { clrscr(); vector s1;//gi hm thit lp khng tham s s1.display(); vector s2(4); //4 gi tr s2.display(); float a[3]={1,2,3}; vector s3(3,a); s3.display(); vector s4 = s1;//hm thit lp sao chp s4.display(); getch(); } Tao doi tuong tai 0xfff2 So chieu :3 Xin cap phat vung bo nho 3 so thuc tai0x142c Toa do thu 1 : 1 Toa do thu 2 : 2 Toa do thu 3 : 3 Doi tuong tai :0xfff2

So chieu :3 1 2 3 Su dung ham thiet lap 1 tham so Tao doi tuong tai 0xffee So chieu :4 Xin cap phat vung bo nho 4 so thuc tai0x143c Toa do thu 1 : Su dung ham thiet lap 1 tham so Tao doi tuong tai 0xffee So chieu :4 Xin cap phat vung bo nho 4 so thuc tai0x143c Toa do thu 1 : 2 Toa do thu 2 : 3 Toa do thu 3 : 4 Toa do thu 4 : 5 Doi tuong tai :0xffee So chieu :4 2 3 4 5 Su dung ham thiet lap 2 tham so Tao doi tuong tai 0xffea So chieu :3 Xin cap phat vung bo nho 3 so thuc tai0x1450 Doi tuong tai :0xffea So chieu :3 1 2 3 Su dung ham thiet lap sao chep

Tao doi tuong tai 0xffe6 Xin cap phat vung bo nho 3 so thuc tai0x1460 Doi tuong tai :0xffe6 So chieu :3 1 2 3 Giai phong tai0xffe6 Giai phong tai0xffea Giai phong tai0xffee Giai phong tai0xfff2 0x1460cua 0x1450cua 0x143ccua 0x142ccua doi doi doi doi tuong tuong tuong tuong

20. Cc thnh phn tnh (static) 20.1 Thnh phn d liu static. Thng thng, trong cng mt chng trnh cc i tng thuc cng mt lp ch s hu cc thnh phn d liu ca ring n. V d, nu chng ta nh ngha lp exple1 bng: class exple1 { int n; float x; .... }; khai bo : exple1 a,b;

s to ra hai i tng a,b s hu ring bit hai vng d liu khc nhau nh hnh v:
a.n a.x b.n b.x

object a

object b

C th cho php nhiu i tng cng chia x d liu bng cch t t kho static trc khai bo thnh phn d liu tng ng. V d, nu ta nh ngha lp exple2 bng: class exple2 { static int n; float x; .... }; th khai bo exple2 a,b; to ra hai i tng c chung thnh phn n:
a.n a.x b.n b.x

Nh vy, vic ch nh static i vi mt thnh phn d liu c ngha l trong ton b lp, ch c mt th hin duy nht ca thnh phn . Thnh phn static c dng chung cho tt c cc i tng ca lp v do vn chim gi vng nh ngay c khi khng khai bo bt k i tng no. C th ni rng cc thnh phn

d liu tnh ging nh cc bin ton cc trong phm vi lp. Cc phn tip sau s lm ni bt nhn xt ny. 20.2 Khi to cc thnh phn d liu tnh Cc thnh phn d liu static ch c mt phin bn trong tt c cc i tng. Nh vy khng th khi to chng bng cc hm thit lp ca mt lp. Cng khng th khi to lc khai bo cc thnh phn d liu static nh trong v d sau: class exple2{ static int n=2;//li }; Mt thnh phn d liu static phi c khi to mt cch tng minh bn ngoi khai bo lp bng mt ch th nh sau: int exple2::n=5; Trong C++ vic khi to gi tr nh th ny khng vi phm tnh ring t ca cc i tng. Ch rng cn phi c tn lp v ton t phm vi ch nh cc thnh phn ca lp c khi to. Ngoi ra, khc vi cc bin ton cc thng thng, cc thnh phn d liu static khng c khi to ngm nh l 0. Chng trnh counter.cpp sau y minh ho cch s dng v thao tc vi thnh phn d liu static, dng m s i tng hin ang c s dng: V d 3.16 /*counter.cpp*/ #include <iostream.h> #include <conio.h> class counter { //m s i tng c static int count; to ra

public : counter (); ~ counter (); }; int counter::count=0;//khi to gi tr cho thnh phn static //hm thit lp counter:: counter () {

cout<<"++Tao : bay gio co "<<++count<<" doi tuong\n"; } counter:: ~counter () { cout<<"--Xoa : bay gio con "<<--count<<" doi tuong\n"; } void main() clrscr(); void fct(); counter a; fct(); counter b; } void fct() } ++Tao : bay gio co 1 doi tuong ++Tao : bay gio co 2 doi tuong ++Tao : bay gio co 3 doi tuong { counter u,v; {

--Xoa : bay gio con 2 doi tuong --Xoa : bay gio con 1 doi tuong ++Tao : bay gio co 2 doi tuong --Xoa : bay gio con 1 doi tuong --Xoa : bay gio con 0 doi tuong Nhn xt 27) Thnh phn d liu tnh c th l private hay public. 28) Trong C thut ng static c ngha l:"lp lu tr c nh" hay c phm vi gii hn bi file ngun. Trong C++, cc thnh phn d liu static cn c thm ngha khc: "khng ph thuc vo bt k th hin no ca lp. Trong phn sau chng ta s cp n cc hm thnh phn static. 20.3 Cc hm thnh phn static Mt hm thnh phn c khai bo bt u vi t kho static c gi l hm thnh phn static, hm thnh phn static cng c lp vi bt k i tng no ca lp. Ni cch khc hm thnh phn static khng c tham s ngm nh. V khng i hi i tng lm tham s ngm nh nn khng th s dng con tr this trong nh ngha ca hm thnh phn static. Cc hm thnh phn static ca mt lp c th c gi, cho d c khai bo cc i tng ca lp hay khng.

C php gi hm trong trng hp ny l:


<tn lp>::<tn hm thnh phn>(<cc tham s nu c>)

Tt nhin vn c th gi cc hm thnh phn static thng qua cc i tng. Tuy nhin cch gi thng qua tn lp trc quan hn v phn nh c bn cht ca hm thnh phn static. 4 Thng thng, cc hm thnh phn static c dng x l chung trn tt c cc i tng ca lp, chng hn hin th cc thng tin lin quan n cc thnh phn d liu static. Chng trnh counter1.cpp sau y c ci tin t counter.cpp bng cch thm mt hm thnh phn static trong lp counter. V d 3.17 /*counter1.cpp*/ #include <iostream.h> #include <conio.h> class counter { static int count; to ra public : counter (); ~ counter (); static void counter_display(); }; int counter::count=0; //khi to gi tr cho thnh phn static void counter::counter_display() {
4

//m s i tng c

C mt s phin bn chng trnh dch C++ khng chp nhn cch gi hm thnh phn static qua i tng.

cout<<"Hien tuong \n"; }

dang

co

"<<count<<"

doi

counter:: counter () { cout<<"++Tao : bay gio co "<<++count<<" doi tuong\n"; } counter:: ~counter () { cout<<"--Xoa : bay gio con "<<--count<<" doi tuong\n"; } void main() { clrscr(); void fct(); counter a; fct(); counter::counter_display(); counter b; } void fct() { counter u; counter::counter_display();//gi qua tn lp counter v; v.counter_display();//gi qua i tng } ++Tao : bay gio co 1 doi tuong ++Tao : bay gio co 2 doi tuong Hien dang co 2 doi tuong ++Tao : bay gio co 3 doi tuong

Hien dang co 3 doi tuong --Xoa : bay gio con 2 doi tuong --Xoa : bay gio con 1 doi tuong Hien dang co 1 doi tuong ++Tao : bay gio co 2 doi tuong --Xoa : bay gio con 1 doi tuong --Xoa : bay gio con 0 doi tuong

21. i tng hng (CONSTANT ) 21.1 i tng hng Cng nh cc phn t d liu khc, mt i tng c th c khai bo l hng. Tr khi c cc ch nh c th, phng thc duy nht s dngcc i tng hng l cc hm thit lp v hm hu b. Bi l cc i tng hng khng th thay i, m ch c to ra hoc hu b i. Tuy nhin, ta c th to ra cc phng thc khc x l cc i tng hng. Bt k hm thnh phn no c t kho const ng ngay sau danh sch cc tham s hnh thc trong dng khai bo (ta gi l hm thnh phn const) u c th s dng cc i tng hng trong lp. Ni cch khc, ngoi hm thit lp v hu b, cc i tng hng ch c th gi c cc hm thnh phn c khai bo vi t kho const. Xt v d sau y: class point { int x,y; public: point(...); void display() const; void move(...); }; 21.2 Hm thnh phn const

Hm thnh phn ca lp c khai bo vi t kho const ng ngay sau danh sch cc tham s hnh thc c gi l hm thnh phn const. Hm thnh phn const th khng th thay i ni dung mt i tng. Mt hm thnh phn const phi c m t c trong khai bo v khi nh ngha. Hm thnh phn const c th c nh ngha chng bng mt hm khc khng phi const.

22. Hm bn v lp bn 22.1 t vn Trong cc phn trc ta thy rng nguyn tc ng gi d liu trong C++ b vi phm t cht; cc thnh phn private ca i tng ch c th truy nhp bi cc hm thnh phn ca chnh lp . Ngoi ra, hm thnh phn cn c th truy nhp n tt c thnh phn private ca cc i tng cng lp c khai bo cc b bn trong hm thnh phn hoc c truyn nh l tham s ca hm thnh phn (c th bng tham tr , bng tham chiu hay bng tham tr). C th thy iu ny trong nh ngha ca hm thnh phn point::coincide() v hm thnh phn point::symetric() trnh by trn. Nhng vi phm trn y u chp nhn c do lm tng kh nng ca ngn ng v nng cao tc thc hin chng trnh. Khi cho php cc hm bn, lp bn nguyn tc ng gi d liu li b vi phm. S vi phm hon ton chp nhn c v t ra rt hiu qu trong mt s tnh hung c bit: gi s chng ta c nh ngha lp vc t vector, lp ma trn matrix. V mun nh ngha hm thc hin nhn mt ma trn vi mt vc t. Vi nhng kin thc v C++ cho n nay, ta khng th nh ngha hm ny bi n khng th l hm thnh phn ca lp vector, cng khng th l hm thnh phn ca lp matrix v cng khng th l mt hm t do (c ngha l khng ca lp no). Tt nhin, c th khai bo tt c cc thnh phn d liu trong hai lp vector v matrix l public, nhng iu s lm mt i kh nng bo v chng. Mt bin php khc l nh ngha cc hm thnh phn public cho php truy nhp d liu, tuy nhin gii php ny kh phc tp v chi ph thi gian thc hin khng nh. Khi nim hm bn - friend function a ra mt gii php tt hn nhiu cho vn t ra trn. Khi nh ngha mt lp, c th khai bo rng mt hay nhiu hm bn (bn ngoi lp) ; khai bo bn b nh th cho php cc hm ny truy xut c ti cc thnh phn private

ca lp ging nh cc hm thnh phn ca lp . u im ca phng php ny l kim sot cc truy nhp cp lp: khng th p t hm bn cho mt lp nu iu khng c d tr trc trong khai bo ca lp. iu ny c th v nh vic cp th ra vo mt s c quan; khng phi ai mun u c cp th m ch nhng ngi c quan h c bit vi c quan mi c cp. C nhiu kiu bn b: 29) Hm t do l bn ca mt lp. 30) Hm thnh phn ca mt lp l bn ca mt lp khc. 31) Hm bn ca nhiu lp. 32) Tt c cc hm thnh phn ca mt lp l bn ca mt lp khc. Sau y chng ta s xem xt c th cch khai bo, nh ngha v s dng mt hm bn cng cc tnh hung nu trn. 22.2 Hm t do bn ca mt lp Tr li v d nh ngha hm point::coincide() kim tra s trng nhau ca hai i tng kiu point. Trc y chng ta nh ngha n nh mt hm thnh phn ca lp point: class point { int x,y; public: ... int coincide (point p); }; y cn c mt cch khc nh ngha coincide nh mt hm t do bn ca lp point. Trc ht, cn phi a ra trong lp point khai bo bn b: friend int coincide(point , point);

Trong trng hp hm coincide() ny l hm t do v khng cn l hm thnh phn ca lp point nn chng ta phi d tr hai tham s kiu point cho coincide. Vic nh ngha hm coincide ging nh mt hm thng thng. Sau y l mt v d ca chng trnh: V d 3.18 /*friend1.cpp*/ #include <iostream.h> class point { int x, y; public: point(int abs =0, int ord =0) { x = abs;y = ord; } friend int coincide (point,point); }; int coincide (point p, point q) { if ((p.x == q.x) && (p.y == q.y)) return 1; else return 0; } void main() { point a(1,0),b(1),c; if (coincide (a,b)) cout <<"a trung voi b\n"; else cout<<"a va b khac nhau\n"; if (coincide(a,c)) c\n"; cout<<"a trung voi

else cout<<"a va c khac nhau\n";

} a trung voi b a va c khac nhau

Nhn xt 33) V tr ca khai bo bn b trong lp point hon ton tu . 34) Trong hm bn, khng cn tham s ngm nh this nh trong hm thnh phn. Cng ging nh cc hm thnh phn khc danh sch tham s ca hm bn gn vi nh ngha chng cc ton t. Hm bn ca mt lp c th c mt hay nhiu tham s, hoc c gi tr tr v thuc kiu lp . Tuy rng iu ny khng bt buc. C th c cc hm truy xut n cc thnh phn ring ca cc i tng cc b trong hm. Khi hm bn ca mt lp tr gi tr thuc lp ny, thng l gi tr d liu ca i tng cc b bn trong hm, vic truyn tham s phi thc hin bng tham tr, b l truyn bng tham chiu (hoc bng a ch) hm gi s nhn a ch ca mt vng nh b gii phng khi hm kt thc. 22.3 Cc kiu bn b khc

22.3.1 Hm thnh phn ca lp l bn ca lp khc C th xem y nh l mt trng hp c bit ca tnh hung trn, ch khc cch m t hm. Ngi ta s dng tn y ca hm thnh phn bao gm tn lp, ton t phm vi v tn hm thnh phn bn b. Gi thit c hai lp A v B, trong B c mt hm thnh phn f khai bo nh sau: int f(char , A); Nu f c nhu cu truy xut vo cc thnh phn ring ca A th f cn phi c khai bo l bn ca A trong lp A bng cu lnh: friend int B::f(char , A); Ta c cc nhn xt quan trng sau:

bin dch c cc khai bo ca lp A c cha khai bo bn b kiu nh: friend int B::f(char, A); chng trnh dch cn phi bit c ni dung ca lp B; ngha l khai bo ca B (khng nht thit nh ngha ca cc hm thnh phn) phi c bin dch trc khai bo ca A. Ngc li, khi bin dch khai bo: int f(char, A) ; bn trong lp B, chng trnh dch khng nht thit phi bit chi tit ni dung ca A, n ch cn bit rng l mt lp. c c iu ny ta dng ch th sau: class A; trc khai bo lp B. Vic bin dch nh ngha hm f cn cc thng tin y v cc thnh phn ca A v B; nh vy cc khai bo ca A v B phi c trc nh ngha y ca f. Tm li, s khai bo v nh ngha phi nh sau: class A; class B { ... int f(char, A); ... }; class A { ... friend int B::f(char, A); ... }; int B::f(char ...,A ...) { ... }

ngh bn c th nghim trng hp "bn b cho nhau", ngha l ng thi hm thnh phn ca lp ny l bn ca lp kia v mt hm thnh phn ca lp kia l bn ca lp ny. 22.3.2 Hm bn ca nhiu lp V nguyn tc, mi hm (hm t do hay hm thnh phn) u c th l bn ca nhiu lp khc nhau. Sau y l mt v d mt hm l bn ca hai lp A v B. class A { ... friend void f(A, B); ... }; class B { ... friend void f(A,B); ... }; void f(A...,B...) { //truy nhp vo cc thnh phn ring ca hai lp bt k A v B } Nhn xt y, khai bo ca A c th c bin dch khng cn khai bo ca B nu c ch th class B; ng trc. Tng t, khai bo ca lp B cng c bin dch m khng cn n A nu c ch th class A; ng trc. Nu ta mun bin dch c hai khai bo ca A v ca B, th cn phi s dng mt trong hai ch th ch ra trn. Cn nh ngha ca hm f cn phi c y c hai

khai bo ca A v ca B ng trc. Sau y l mt v d minh ho: class B; class A { ... friend void f(A, B); ... }; class B { ... friend void f(A,B); ... }; void f(A...,B...) { //truy nhp vo cc thnh phn ring ca hai lp bt k A v B } 22.3.3 Tt c cc hm ca lp l bn ca lp khc y l trng hp tng qut trong c th khai bo lp bn b vi cc hm. Mi vn s n gin hn nu ta a ra mt khai bo tng th ni rng tt c cc hm thnh phn ca lp B l bn ca lp A. Mun vy ta s t trong khai bo lp A ch th: friend class B; Nhn xt: Trong trng hp ny, bin dch khai bo ca lp A, ch cn t trc n ch th: class B; kiu khai bo lp bn cho php khng phi khai bo tiu ca cc hm c lin quan.

22.4

Bi ton nhn ma trn vi vector

Trong phn ny ta s gii quyt bi ton xy dng mt hm nhn ma trn (i tng thuc lp matrix) vi vector (i tng thuc lp vect). n gin, ta gii hn ch c cc hm thnh phn: [6]. [7]. mt constructor cho vect v matrix, mt hm hin th (display) cho vect.

Ta trnh by hai gii php da trn vic nh ngha prod c hai i s, mt l i tng matrix v mt l i tng vect: 35) prod l hm t do v l bn ca hai lp vect v matrix, 36) prod l hm thnh phn ca matrix v l bn ca vect. Gii php th nht - prod l hm bn t do V d 3.19 /*vectmat1.cpp*/ #include <iostream.h> class matrix; //*****class vect class vect { double v[3]; //vector c ba thnh phn public: vect (double v1=0, double v3=0) } friend vect prod(matrix, vect); void display () { int i; v2=0, double

{ v[0] = v1; v[1] = v2; v[2] = v3;

for (int i=0; i<3; i++) cout<<v[i]<<" "; cout<<endl; } }; //*****class matrix class matrix { double mat[3][3]; public: matrix(double t[3][3]) { int i; int j; for(i=0; i<3; i++) for(j=0; j<3; j++) mat[i][j] = t[i][j]; } friend vect prod (matrix, vect); }; //*****Hm prod vect prod (matrix m, vect x) { int i,j; double sum; vect res; //kt qu for(i=0; i<3; i++) { for(j=0,sum=0; j<3; j++) sum +=m.mat[i][j]*x.v[j]; res.v[i] = sum; } return res; }

//**** chng trnh kim tra void main() { vect w91,2,3); vect res; double tb[3][3] = {1,2,3,4,,5,6,7,8,9}; matrix a=tb; res=prod(a,w); res.display(); } 14 32 50 Gii php th hai- prod l hm thnh phn ca lp matrix v l bn ca vect V d 3.20 /*vectmat2.cpp*/ #include <iostream.h> class vect; //***class matrix class matrix { double mat[3][3]; public: matrix(double t[3][3]) { int i; int j; for(i=0; i<3; i++) for(j=0; j<3; j++) mat[i][j] = t[i][j]; } vect prod (vect); }; //*** class vect

class vect { double v[3]; public: vect (double v1=0, double v3=0) } friend vect matrix::prod(vect); void display () { int i; for (int i=0; i<3; i++) cout<<v[i]<<" "; cout<<endl; } }; //***Hm matrix::prod vect matrix::prod (vect x) { int i,j; double sum; vect res; for(i=0; i<3; i++) { for(j=0,sum=0; j<3; j++) sum +=mat[i][j]*x.v[j]; res.v[i] = sum; } return res; } //*** chng trnh kim tra void main() { vect w91,2,3); v2=0, double

{ v[0] = v1; v[1] = v2; v[2] = v3;

vect res; double tb[3][3] = {1,2,3,4,,5,6,7,8,9}; matrix a=tb; res=a.prod(w); res.display(); } 14 32 50 23. V d tng hp Chng trnh vectmat3.cpp sau y c pht trin da trn cc chng trnh vector2.cpp , vectmat1.cpp v vectmat2.cpp. V d 3.21 /*vectmat2.cpp*/ #include <iostream.h> #include <conio.h> /*lp vector*/ class matrix;/*khai bo troc lp matrix*/ /*khai bo lp vector*/ class vector{ static int n; float *v; public: vector(); vector(float *); vector(vector &);//hm thit lp sao chp ~vector(); void display(); static int & Size() {return n;} //s chiu ca vector //vng nh cha cc to

friend vector prod(matrix &, vector &); friend class matrix; }; int vector::n = 0; /*cc hm thnh phn ca lp vector*/ vector::vector() { int i; v= new float [n]; for(i=0;i<n;i++) { cout<<"Toa do thu "<<i+1<<" : "; cin>>v[i]; } } vector::vector(float *a) { for(int i =0; i<n; i++) v[i]=a[i]; } vector::vector(vector &b) { int i; for(i=0;i<n;i++) v[i] = b.v[i]; } vector::~vector(){ delete v; } void vector::display() //hin th kt qu

{ for(int i=0;i<n;i++) cout <<v[i] <<" "; cout <<"\n"; } /*khai bo lp matrix*/ class matrix{ static int n; vector *m; public: matrix(); ~matrix(); void display(); static int &Size() {return n;} friend vector prod(matrix &, vector &); }; int matrix::n =0; /*hm thnh phn ca lp matrix*/ matrix::matrix(){ int i; m= new vector [n]; } matrix::~matrix() { delete m; } void matrix::display() { //hin th kt qu //s chiu ca vector //vng nh cha cc to

for (int i=0; i<n; i++) m[i].display(); } /*hm prod*/ vector prod(matrix &m,vector &v) { float *a = new float [vector::Size()]; int i,j; for (i=0; i<matrix::Size(); i++) { a[i]=0; for(j=0; j<vector::Size(); j++) a[i]+=m.m[i].v[j]*v.v[j]; } return vector(a); } void main() { clrscr(); int size; cout<<"Kich cin>>size; thuoc cua vector ";

vector::Size() = size; matrix::Size() = size; cout<<"Tao mot vector \n"; vector v; cout<<" v= \n"; v.display(); cout<<"Tao mot ma tran \n"; matrix m; cout<<" m = \n";

m.display(); cout<<"Tich m*v \n"; vector u = prod(m,v); u.display(); getch(); } Kich thuoc cua vector 3 Tao mot vector Toa do thu 1 : 1 Toa do thu 2 : 1 Toa do thu 3 : 1 v= 1 1 1 Tao mot ma tran Toa do thu 1 : 2 Toa do thu 2 : 3 Toa do thu 3 : 2 Toa do thu 1 : 1 Toa do thu 2 : 2 Toa do thu 3 : 3 Toa do thu 1 : 2 Toa do thu 2 : 3 Toa do thu 3 : 2 m = 2 3 2 1 2 3 2 3 2 Tich m*v

7 6 7 24. Tm tt 24.1 Ghi nh Trong C++, tn cu trc l mt kiu d liu khng cn phi km theo t kho struct. Lp cho php ngi lp trnh m t cc i tng thc t vi cc thuc tnh v hnh vi. Trong C++ thng s dng t kho class khai bo mt lp. Tn lp l mt kiu d liu dng khi khai bo cc i tng thuc lp (cc th hin c th ca lp). Thuc tnh ca i tng trong mt lp c m t di dng cc bin th hin. Cc hnh vi l cc hm thnh phn bn trong lp. C hai cch nh ngha cc hm thnh phn ca mt lp; khi nh ngha hm thnh phn bn ngoi khai bo lp phi t trc tn hm thnh phn tn ca lp v ton t :: phn bit vi cc hm t do cng tn. Ch nn nh ngha hm thnh phn bn trong lp khi n khng qu phc tp cho chng trnh d c. C th khai bo v s dng cc con tr i tng, tham chiu i tng. Hai t kho public v private dng ch nh thuc tnh truy nhp cho cc thnh phn (d liu/hm) khai bo bn trong lp. Thnh phn bn trong lp c khai bo public c th truy nhp t mi hm khai bo mt i tng thuc lp . Thnh phn private trong mt i tng ch c th truy nhp c bi cc hm thnh phn ca i tng hoc cc hm thnh phn ca lp dng to i tng ( y tnh c trng hp i tng l tham s ca hm thnh phn).

Hai hm thnh phn c bit ca mt lp gi l hm thit lp v hm hu b. Hm thit lp c gi t ng (ngm nh) mi khi mt i tng c to ra v hm hu b c gi t ng khi i tng ht thi gian s dng. Hm thit lp c thuc tnh public, cng tn vi tn lp nhng khng c gi tr tr v. Mt lp c t nht hai hm thit lp: hm thit lp sao chp ngm nh v hm thit lp do ngi lp trnh thit lp (nu khng c m t tng minh th l hm thit lp ngm nh). Hm hu b cng c thuc tnh public, khng tham s, khng gi tr tr v v c tn bt u bi ~ theo sau l tn ca lp. Bn trong phm vi lp (nh ngha ca cc hm thnh phn), cc thnh phn ca lp c gi theo tn. Trng hp c mt i tng ton cc cng tn, mun xc nh i tng y phi s dng ton t :: Lp c th cha cc thnh phn d liu l cc i tng c kiu lp khc. Cc i tng ny phi c khi to trc i tng tng ng ca lp bao. Mi i tng c mt con tr ch n bn thn n, ta gi l con tr this. Con tr ny c th c s dng tng minh hoc ngm nh tham xc nh cc thnh phn bn trong i tng. Thng thng ngi ta s dng this di dng ngm nh. Ton t new t ng to ra mt i tng vi kch thc thch hp v tr v con tr c kiu lp. gii phng vng nh cp pht cho i tng ny s dng ton t delete. Thnh phn d liu tnh biu th cc thng tin dng chung trong tt c cc i tng thuc lp. Khai bo ca thnh phn tnh bt u bng t kho static.

C th truy nhp ti cc thnh phn tnh thng qua cc i tng kiu lp hoc bng tn lp nh s dng ton t phm vi. Hm thnh phn c th c khai bo l tnh nu n ch truy nhp n cc thnh phn d liu tnh. Hm bn ca mt lp l hm khng thuc lp nhng c quyn truy nhp ti cc thnh phn private ca lp. Khai bo bn b c th t bt k ni no trong khai bo lp. 24.2 Cc li thng gp Qun du ; cui khai bo lp. Khi to gi tr cho cc thnh phn d liu trong khai bo lp. nh ngha chng mt hm thnh phn bng mt hm khng thuc lp. Truy nhp n cc thnh phn ring ca lp t bn ngoi phm vi lp Khai bo gi tr tr v cho hm thit lp v hm hu b. Khai bo hm hu b c tham s, nh ngha chng hm hu b. Gi tng minh hm thit lp v hm hu b. Gi cc hm thnh phn bn trong hm thit lp nh ngha mt hm thnh phn const thay i cc thnh phn d liu ca mt i tng. nh ngha mt hm thnh phn const gi ti mt hm thnh phn khng phi const. Gi cc hm thnh phn khng phi const t cc i tng const. Thay i ni dung mt i tng const. Nhm ln gia new v delete vi malloc v free.

S dng this bn trong cc hm thnh phn tnh. 24.3 Mt s thi quen lp trnh tt Nhm tt c cc thnh phn c cng thuc tnh truy nhp mt ni trong khai bo lp, nh vy mi t kho m t truy nhp ch c xut hin mt ln. Khai bo lp v vy d c hn. Theo kinh nghim, cc thnh phn private trc tin ri n cc thnh phn protected, cui cng l cc thnh phn public. nh ngha tt c cc hm thnh phn bn ngoi khai bo lp. iu ny nhm phn bit gia hai phn giao din v phn ci t ca lp. S dng cc ch th tin x l #ifndef, #define, #endif cho cc tp tin tiu ch xut hin mt ln bn trong cc chng trnh ngun. Phi nh ngha cc hm thit lp m bo rng cc i tng u c khi to ni dung mt cch ng n. Khai bo l const tt c cc hm thnh phn ch s dng vi cc i tng const. Nn s dng new v delete thay v malloc v free. 25. Bi tp Bi tp 3.1 So snh ngha ca struct v class trong C++ Bi tp 3.2 To mt lp gi l Complex thc hin cc thao tc s hc vi cc s phc. Vit mt chng trnh kim tra lp ny. S phc c dng <Phn thc> + <Phn o>*j S dng cc bin thc biu din cc thnh phn d liu ring ca lp. Cung cp mt hm thit lp to i

tng. Hm thit lp s dng cc tham s c gi tr ngm nh. Ngoi ra cn c cc hm thnh phn public thc hin cc cng vic sau: + Cng hai s phc: cc phn thc c cng vi nhau v cc phn o c cng vi nhau. + Tr hai s phc: Phn thc ca s phc th hai c tr cho phn thc ca s phc th nht. Tng t cho phn o. + In s phc ra mn hnh di dng (a, b) trong a l phn thc v b l phn o.

Bi tp 3.3 To mt lp gi l PS thc hin cc thao tc s hc vi phn s. Vit chng trnh kim tra lp va to ra. S dng cc bin nguyn biu din cc thnh phn d liu ca lp-t s v mu s. Vit nh ngha hm thit lp to i tng sao cho phn o phi l s nguyn dng. Ngoi ra cn c cc hm thnh phn khc thc hin cc cng vic c th: + Cng hai phn s. Kt qu phi c ti gin. + Tr hai phn s. Kt qu phi c ti gin. + Nhn hai phn s. Kt qu di dng ti gin. + Chia hai phn s. Kt qu di dng ti gin. + In ra mn hnh phn s di dng a/b trong a l t s, cn b l mu s. + In phn s di dng s thp phn. Bi tp 3.4 Khai bo, nh ngha v s dng lp time m t cc thng tin v gi, pht v giy vi cc yu cu nh sau: To tp tin tiu TIME.H cha khai bo ca lp time vi cc thnh phn d liu m t gi, pht v giy: hour, minute,second.
+

Trong lp time khai bo : mt hm thit lp ngm nh, dng gn cho cc thnh phn d liu gi tr 0. hm thnh phn set(int, int,int) vi ba tham s tng ng mang gi tr ca ba thnh phn d liu. hm hin th trong gi c hin th vi gi tr 0 ti 24. hm hin th chun c phn bit gi trc v sau bui tra.

To tp tin chng trnh TIME.CPP cha nh ngha ca cc hm thnh phn trong lp time, v chng trnh minh ho cch s dng lp time. Bi tp 3.5

Tng t nh bi 3.4 nhng y hm thit lp c ba tham s c gi tr ngm nh bng 0. Bi tp 3.6 Vn da trn lp time, nhng y ta b sung thm cc hm thnh phn thit lp ring r gi, pht, giy: + void setHour(int) + void setMiniute(int) + void setSecond(int) ng thi c cc hm ly tng gi tr ca tng i tng: + int getHour() + int getMiniute(); + int getSecond() Bi tp 3.7 Thm mt hm thnh phn tick() vo lp time tng thi gian trong mt i tng time mi ln mt giy. Lu cc trng hp, tng sang pht tip theo, tng sang gi tip theo, tng sang ngy tip theo. Bi tp 3.8 Khai bo lp date m t thng tin v ngy thng nm: month, day,year.
+ +

Lp date c hai hm thnh phn: hm thit lp vi ba tham s c gi tr ngm nh. hm print() in thng tin v ngy thng di dng quen thuc mm-dd-yy.

Vit chng trnh kim ta vic s dng php gn cho cc i tng thuc lp date. Bi tp 3.9 Da trn lp date ca bi 3.8 ngi ta thc hin mt s thay i kim sot li trn gi tr cc tham s ca hm thit lp. ng thi b sung thm hm thnh phn nextDay() tng date tng ngy mt. Bi tp 3.10

Kt hp lp time trong bi 3.7 v lp date trong bi 3.9 to nn mt lp date_time m t ng thi thng tin v ngy, gi. Thay i hm thnh phn tick() gi ti hm tng ngy mi khi cn thit. Thm cc hm hin th thng tin v ngy gi. Hon thin chng trnh kim tra hot ng ca lp. Bi tp 3.11 Vit chng trnh khai bo lp m t hot ng ca mt ngn xp hoc hng i cha cc s nguyn.

Chng 4 nh ngha ton t trn lp (class operators) Mc ch chng ny : 37) Cch nh ngha cc php ton cho kiu d liu lp v cu trc 38) Cc ton t chuyn kiu p dng cho kiu d liu lp 26. Gii thiu chung Thc ra, vn nh ngha chng ton t tng c trong C, v d trong biu thc: a + b k hiu + tu theo kiu ca a v b c th biu th: 39) php cng hai s nguyn, 40) php cng hai s thc chnh xc n (float) 41) php cng hai s thc chnh xc i (double) 42) php cng mt s nguyn vo mt con tr. Trong C++, c th nh ngha chng i vi hu ht cc php ton (mt ngi hoc hai ngi) trn cc lp, ngha l mt trong s cc ton hng tham gia php ton l cc i tng. y l mt kh nng mnh v n cho php xy dng trn cc lp cc ton t cn thit, lm cho chng trnh c vit ngn gn d c hn v c ngha hn. Chng hn, khi nh ngha mt lp complex biu din cc s phc, c th vit trong C++: a+b, a-b, a*b, a/b vi a,b l cc i tng complex. c c iu ny, ta nh ngha chng cc php ton +, -, * v / bng cch nh ngha hot ng ca tng php ton ging nh nh ngha mt hm, ch khc l y l hm ton t (operator function). Hm ton t c tn c ghp bi t kho operator v k hiu ca

php ton tng ng. Bng 4.1 a ra mt s v d v tn hm ton t. Hm ton t c th dng nh l mt hm thnh phn ca mt lp hoc l hm t do; khi hm ton t phi c khai bo l bn ca cc lp c cc i tng m hm thao tc.

Tn hm operator+ operator* operator/ operator+ =

Dng nh ngha php + nh ngha php nhn * nh ngha php chia / nh ngha php t cng +=

operator!= nh ngha php so snh khc nhau Bng 4.1 Mt s tn hm ton t quen thuc 27. V d trn lp s phc 27.1 Hm ton t l hm thnh phn Trong chng trnh complex1.cpp ton t + gia hai i tng complex c nh ngha nh mt hm thnh phn. Hm ton t thnh phn c mt tham s ngm nh l i tng gi hm nn ch c mt tham s tng minh. V d 4.1 /*complex1.cpp*/ #include <iostream.h> #include <conio.h> #include <math.h> class complex { float real, image; public: complex(float r=0, float i =0) { real = r; image = i; } void display() { cout<<real<<(image>=0?'+':'')<<"j*"<<fabs(image)<<endl;

} /*hm operator+ nh ngha php ton + hai ngi trn lp s phc complex*/ complex operator+(complex b) { complex c; c.real = a.real+b.real; c.image =a.image+b.image; return c; } }; void main() { clrscr(); complex a(-2,5); complex b(3,4); cout<<"Hai so phuc:\n"; a.display(); b.display(); cout<<"Tong hai so phuc:\n"; complex c; c=a+b;//a.operator+(b) c.display(); getch(); } Hai so phuc: -2+j*5 3+j*4 Tong hai so phuc: 1+j*9

Ch th c = a+b; trong v d trn c chng trnh dch hiu l: c = a.operator+(b); Nhn xt 43) Thc ra cch vit a+b ch l mt quy c ca chng trnh dch cho php ngi s dng vit gn li, nh cm thy t nhin hn. 44) Hm ton t operator+ phi c thuc tnh public v nu khng chng trnh dch khng th thc hin c n ngoi phm vi lp. 45) Trong li gi a.operator+(b), a ng vai tr ca tham s ngm nh ca hm thnh phn v b l tham s tng minh. S tham s tng minh cho hm ton t thnh phn lun t hn s ngi ca php ton l 1 v c mt tham s ngm nh l i tng gi hm ton t. 46) Chng trnh dch s khng th hiu c biu thc 3+a v cch vit tng ng 3.operator(a) khng c ngha. gii quyt tnh hung ny ta dng hm bn nh ngha hm ton t. 27.2 Hm ton t l hm bn Chng trnh complex2.cpp c pht trin t complex1.cpp bng cch thm hm ton t cng thm mt s thc float vo phn thc ca mt i tng complex, c biu th bi php cng vi s thc float l ton hng th nht, cn i tng complex l ton hng th hai. Trong trng hp ny khng th dng php cng nh hm thnh phn v tham s th nht ca hm ton t khng cn l mt i tng. V d 4.2 /*complex2.cpp*/

#include <iostream.h> #include <conio.h> #include <math.h> class complex { float real, image; public: complex(float r=0, float i =0) { real = r; image = i; } void display() { cout<<real<<(image>=0?'+':'')<<"j*"<<fabs(image)<<endl; } /*hm thnh phn operator+ nh ngha php ton + hai ngi trn lp s phc complex*/ complex operator+(complex b) { cout<<Goi toi complex::operator+(float, complex)\n; complex c; c.real = real+b.real; c.image =image+b.image; return c; } /*hm t do operator+ nh ngha php ton + gia mt s thc v mt i tng s phc*/ friend complex operator+(float x, complex b); }; complex operator+(float x, complex b) {

cout<<Goi complex)\n; complex c;

toi

operator+(float,

c.real = x+b.real; c.image = b.image; return c; } void main() { clrscr(); complex a(-2,5); complex b(3,4); cout<<"Hai so phuc:\n"; cout<<"a = "; a.display(); cout<<"b = "; b.display(); cout<<"Tong hai so phuc:\n"; complex c; c=a+b; //a.operator+(b); cout<<"c = "; c.display(); cout<<"Tang them phan thuc cua a 3 don vi\n"; complex d; d=3+a; //operator+(3,a); cout<<"d = "; d.display(); getch(); }

Hai so phuc: a = -2+j*5 b = 3+j*4 Tong hai so phuc: Goi toi complex::operator+(complex) c = 1+j*9 Tang them phan thuc cua a 3 don vi Goi toi operator+(float, complex) d = 1+j*5 Trong chng trnh trn, biu thc a+b c chng trnh hiu l li gi hm thnh phn a.operator+(b), trong khi vi biu thc 3+a, chng trnh dch s thc hin li gi hm t do operator+(3,a). S tham s trong hm ton t t do operator+(...) ng bng s ngi ca php + m n nh ngha. Trong nh ngha ca hm ton t t do, tham s th nht c th c kiu bt k ch khng nht thit phi c kiu lp no . Vi mt hm operator+ no ch c th thc hin c php + tng ng gia hai ton hng c kiu nh c m t trong tham s hnh thc, ngha l mun c c php cng vn nng p dng cho mi kiu ton hng ta phi nh ngha rt nhiu hm ton t operator+ (nh ngha chng cc hm ton t). Vn bo ton cc tnh cht t nhin ca cc php ton khng c C++ cp, m n ph thuc vo cch ci t c th trong chng trnh dch C++ hoc bn thn ngi s dng khi nh ngha cc hm ton t. Chng hn, php gn: c = a+b; c chng trnh dch hiu nh l: c a.operator+(b); trong khi vi php gn: =

d = a+b+c; ngn ng C++ khng a ra din gii ngha duy nht. Mt s chng trnh bin dch s to ra i tng trung gian t: t=a.operator+(b); v d=t.operator+(c); Chng trnh complex3.cpp sau y minh ho l gii ny:

V d 4.3 /*complex3.cpp*/ #include <iostream.h> #include <conio.h> #include <math.h> class complex { float real, image; public: complex(float r=0, float i =0) { cout<<"Tao doi tuong :"<<this<<endl; real = r; image = i; } void display() { cout<<real<<(image>=0?'+':'')<<"j*"<<fabs(image)<<endl; } complex operator+(complex b) { toi cout<<"Goi complex::operator+(complex)\n"; cout<<this<<endl; complex c; c.real=real+b.real; c.image=image+b.image; return c; } friend complex complex b); }; complex operator+(float x, complex b) { operator+(float x,

cout<<"Goi complex)\n"; complex c;

toi

operator+(float,

c.real = x+b.real; c.image = b.image; return c; } void main() { clrscr(); cout<<"so phuc a \n"; complex a(-2,5); cout<<"so phuc b \n"; complex b(3,4); cout<<"Hai so phuc:\n"; cout<<"a = "; a.display(); cout<<"b = "; b.display(); complex c(2,3); cout<<"Cong a+b+c\n"; cout<<"so phuc d \n"; complex d; d = a+b+c; cout<<"a = ";a.display(); cout<<"b = ";b.display(); cout<<"c = ";c.display(); cout<<"d = a+b+c : "; d.display(); getch();

} so phuc a Tao doi tuong :0xffee so phuc b Tao doi tuong :0xffe6 Hai so phuc: a = -2+j*5 b = 3+j*4 Tao doi tuong :0xffde Cong a+b+c so phuc d Tao doi tuong :0xffd6 Goi toi complex::operator+(complex) 0xffee Tao doi tuong :0xffa0 Goi toi complex::operator+(complex) 0xffce Tao doi tuong :0xffa8 a = -2+j*5 b = 3+j*4 c = 2+j*3 d = a+b+c : 3+j*12 Cng c th lm nh sau: trong nh ngha ca hm ton t, ta tr v tham chiu n mt trong hai i tng tham gia biu thc (chng hn a). Khi a+b+c c hiu l a.operator+(b) v sau l a.operator+(c). Tt nhin trong trng hp ny ni dung ca i tng a b thay i sau mi php cng. Xt chng trnh sau:

V d 4.4 /*complex4.cpp*/ #include <iostream.h> #include <conio.h> #include <math.h> class complex { float real, image; public: complex(float r=0, float i =0) { cout<<"Tao doi tuong :"<<this<<endl; real = r; image = i; } void display() { cout<<real<<(image>=0?'+':'')<<"j*"<<fabs(image)<<endl; } complex & operator+(complex b) { cout<<"Goi complex::operator+(complex)\n"; cout<<this<<endl; real+=b.real; image+=b.image; return *this; } friend complex complex b); }; complex operator+(float x, complex b) { cout<<"Goi complex)\n"; toi operator+(float, operator+(float x, toi

complex c; c.real = x+b.real; c.image = b.image; return c; } void main() { clrscr(); cout<<"so phuc a \n"; complex a(-2,5); cout<<"so phuc b \n"; complex b(3,4); cout<<"Hai so phuc:\n"; cout<<"a = "; a.display(); cout<<"b = "; b.display(); cout<<"so phuc c \n"; complex c; c=a+b; //a.operator+(b); cout<<"c = a+b: "; c.display(); cout<<"a = "; a.display(); cout<<"Cong a+b+c\n"; cout<<"so phuc d \n"; complex d; d = a+b+c;//a.operator+(b);a.operator+(c); cout<<"a = ";a.display();

cout<<"b = ";b.display(); cout<<"c = ";c.display(); cout<<"d = a+b+c : "; d.display(); getch(); } so phuc a Tao doi tuong :0xffee so phuc b Tao doi tuong :0xffe6 Hai so phuc: a = -2+j*5 b = 3+j*4 so phuc c Tao doi tuong :0xffde Goi toi complex::operator+(complex) 0xffee c = a+b: 1+j*9 a = 1+j*9 Cong a+b+c so phuc d Tao doi tuong :0xffd6 Goi toi complex::operator+(complex) 0xffee Goi toi complex::operator+(complex) 0xffee a = 5+j*22 b = 3+j*4

c = 1+j*9 d = a+b+c : 5+j*22 Trong hai v d trn, vic truyn cc i s v gi tr tr v ca hm ton t c thc hin bng gi tr. Vi cc i tng c kch thc ln, ngi ta thng dng tham chiu truyn i cho hm. complex operator+(float , complex &); Tuy nhin vic dng tham chiu nh l gi tr tr v ca hm ton t, c nhiu iu ng ni. Biu thc nm trong lnh return bt buc phi tham chiu n mt vng nh tn ti ngay c khi thc hin xong biu thc tc l khi hm ton t kt thc thc hin. Vng nh y c th l mt bin c cp tnh static (cc bin ton cc hay bin cc b static), mt bin th hin (mt thnh phn d liu) ca mt i tng no ngoi hm. Bn c c th xem chng trnh vecmat3.cpp trong chng 3 hiu r hn. Vn tng t cng c cp khi gi tr tr v ca hm ton t l a ch; trong trng hp ny, mt i tng c to ra nh cp pht ng trong vng nh heap dng c lp vi vng nh ngn xp dng cp pht bin, i tng cc b trong chng trnh, do vy vn cn lu li khi hm ton t kt thc cng vic. Hm ton t cng c th tr v kiu void khi nh hng ch tc ng ln mt trong cc ton hng tham gia biu thc. Xem nh ngha ca hm o du s phc trong v d sau: V d 4.5 /*complex5.cpp*/ #include <iostream.h> #include <conio.h> #include <math.h> class complex { float real, image;

public: complex(float r=0, float i =0) { real = r; image = i; } void display() { cout<<real<<(image>=0?'+':'')<<"j*"<<fabs(image)<<endl; } /*Hm o du ch tc ng ln ton hng, khng s dng c trong cc biu thc */ void operator-() { real = -real; image = -image; } complex operator+(complex b) { complex c; c.real=real+b.real; c.image=image+b.image; return c; } friend complex complex b); }; complex operator+(float x, complex b) { cout<<"Goi complex)\n"; complex c; c.real = x+b.real; c.image = b.image; toi operator+(float, operator+(float x,

return c; } void main() { clrscr(); cout<<"so phuc a \n"; complex a(-2,5); cout<<"so phuc b \n"; complex b(3,4); cout<<"Hai so phuc:\n"; cout<<"a = "; a.display(); cout<<"b = "; b.display(); complex c; -a; cout<<"a = ";a.display(); getch(); } so phuc a so phuc b Hai so phuc: a = -2+j*5 b = 3+j*4 a = 2-j*5 Ch : Cu lnh complex c; c=-a+b

s gy li v -a c gi tr void. 28. Kh nng v gii hn ca nh ngha chng ton t Phn ln ton t trong C++ u c th nh ngha chng K hiu ng sau t kho operator phi l mt trong s cc k hiu ton t p dng cho cc kiu d liu c s, khng th dng cc k hiu mi. Mt s ton t khng th nh ngha chng (chng hn ton t truy nhp thnh phn cu trc., ton t phm vi ::, ton t iu kin ? :) v c mt s ton t ta phi tun theo cc rng buc sau: [8]. php =, [] nht nh phi c nh ngha nh hm thnh phn ca lp. [9]. php << v >> dng vi cout v cin phi c nh ngha nh hm bn. [10]. hai php ton ++ v -- c th s dng theo hai cch khc nhau ng vi dng tin t ++a, --b v dng hu t a++, b--. iu ny i hi hai hm ton t khc nhau. Cc ton t c nh ngha chng phi bo ton s ngi ca chnh ton t theo cch hiu thng thng, v d: c th nh ngha ton t - mt ngi v hai ngi trn lp tng ng vi php o du (mt ngi) v php tr s hc (hai ngi), nhng khng th nh ngha ton t gn mt ngi, cn ++ li cho hai ngi. Nu lm vy, chng trnh dch s hiu l to ra mt k hiu php ton mi. Khi nh ngha chng ton t, phi tun theo nguyn tc l Mt trong s cc ton hng phi l i tng. Ni cch khc, hm ton t phi : [1]. hoc l hm thnh phn, khi , hm c mt tham s ngm nh c kiu lp chnh l i tng gi hm. Tham s ngm nh ny ng vai

tr ton hng u tin(i vi php ton hai ngi) hay ton hng duy nht (i vi php ton mt ngi). Do vy, nu ton t l mt ngi th hm ton t thnh phn s khng cha mt tham s no khc. Ngc li khi ton t l hai ngi, hm s c thm mt i s tng minh. [2]. hoc l mt hm t do. Trong trng hp ny, t nht tham s th nht hoc tham s th hai (nu c) phi c kiu lp. Hn na, mi hm ton t ch c th p dng vi kiu ton hng nht nh; cn ch rng cc tnh cht vn c, chng hn tnh giao hon ca ton t khng th p dng mt cch tu tin cho cc ton t c nh ngha chng. V d: a+3.5 khc vi 3.5+a y a l mt i tng complex no . Cn lu rng khng nn nh ngha nhng hm hm ton t khc nhau cng lm nhng cng vic ging nhau v d xy ra nhp nhng. Chng hn, c mt hm operator+ l mt hm thnh phn c tham s l i tng complex th khng c nh ngha thm mt hm operator+ l mt hm t do c hai tham s l i tng complex. Trng hp cc ton t ++ v -Hm cho dng tin t operator++() operator--() Hm cho dng hu t operator++(int) operator--(int)

Lu rng tham s int trong dng hu t ch mang ngha tng trng (dump type)

La chn gia hm thnh phn v hm bn Phi tun theo cc quy tc sau y: [1]. Lu n hn ch ca chng trnh dch, xem dng no c php. [2]. Nu i s u tin l mt i tng, c th mt trong hai dng. Ngc li phi dng hm bn. [3]. Tri li, phi dng hm bn. 29. Chin lc s dng hm ton t V nguyn tc, nh ngha chng mt php ton l kh n gin, nhng vic s dng php ton nh ngha chng li khng phi d dng v i hi phi cn nhc bi l nu b lm dng s lm cho chng trnh kh hiu. Phi lm sao cc php ton vn gi c ngha trc quan nguyn thu ca chng. Chng hn khng th nh ngha cng + nh php tr - hai gi tr. Phi xc nh trc ngha cc php ton trc khi vit nh ngha ca cc hm ton t tng ng. Cc php ton mt ngi Cc php ton mt ngi l: *, &, ~, !, ++, --, sizeof (kiu) Cc hm ton t tng ng ch c mt i s v phi tr v gi tr cng kiu vi ton hng, ring sizeof c gi tr tr v kiu nguyn khng du v ton t (kiu) dng tr v mt gi tr c kiu nh ghi trong du ngoc. Cc php ton hai ngi Cc php ton hai ngi nh: *,/,%,+,,<<,>>,<,>,<=,>=,==,!=,&,|,^,&&,|| Hai ton hng tham gia cc php ton khng nht thit phi cng kiu, mc d trong thc t s dng th thng l nh vy. Nh vy ch cn mt trong hai i s ca hm ton t tng ng l i tng l .

Cc php gn Cc ton t gn gm c: =,+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|= Do cc ton t gn c nh ngha di dng hm thnh phn, nn ch c mt tham s tng minh v khng c rng buc g v kiu i s v kiu gi tr tr v ca cc php gn. Ton t truy nhp thnh phn -> Php ton ny c dng truy xut cc thnh phn ca mt cu trc hay mt lp v cn phn bit vi nhng cch s dng khc trnh dn n s nhm ln. C th nh ngha php ton ly thnh phn ging nh i vi cc php ton mt ngi. Ton t truy nhp thnh phn theo ch s Ton t ly thnh phn theo ch s c dng xc nh mt thnh phn c th trong mt khi d liu ( cp pht ng hay tnh ). Thng thng php ton ny c dng vi mng, nhng cng c th nh ngha li n khi lm vic vi cc kiu d liu khc. Chng hn vi kiu d liu vector c th nh ngha php ly theo ch s tr v mt thnh phn to no vector. V phi c nh ngha nh hm thnh phn c mt i s tng minh. Ton t gi hm y l mt php ton th v nhng ni chung rt kh a ra mt v d c th. 30. Mt s v d tiu biu 30.1 nh ngha chng php gn = Vic nh ngha chng php gn ch cn khi cc i tng c cc thnh phn d liu ng (chng 3 cp vn ny). Chng ta xt vn ny qua phn tch nh ngha chng php gn = p dng cho lp vector.

im u tin cn lu l hm operator= nht thit phi c nh ngha nh l hm thnh phn ca lp vector. Nh vy hm operator= s ch c mt tham s tng minh (ton hng bn phi du =). Gi s a v b l hai i tng thuc lp vector, khi a=b; c hiu l a.operator=(b); do b c truyn cho hm di dng tham tr hoc tham chiu. Vic truyn bng tham tr i hi s c mt ca hm thit lp sao chp, hn th na s lm cho chng trnh chy chm v mt thi gian sao chp mt lng ln d liu. V vy, b s c truyn cho hm operator= di dng tham chiu. Gi tr tr v ca hm operator= ph thuc vo mc ch s dng ca biu thc gn. Chng ta chn gii php tr v tham chiu ca i tng ng bn tri du bng nhm gi hai tnh cht quan trong ca biu thc gn: (i) trt t kt hp t bn phi sang tri, (ii) c th s dng kt qu biu thc gn trong cc biu thc khc. Ngoi ra gii php ny cng hn ch vic sao chp d liu t ni ny i ni khc trong b nh. Chng ta phn bit hai trng hp: Trng hp 1 a=a; Vi hai ton hng l mt. Trong trng hp ny hm operator= khng lm g, ngoi vic tr v tham chiu n a. Trng hp 2 a=b;

khi hai i tng tham gia biu thc gn hon ton khc nhau, vic u tin l phi gii phng vng nh ng chim gi trc trong a, trc khi xin cp pht mt vng nh ng khc bng kch thc vng nh ng c trong b, cui cng sao chp ni dung t vng nh ng trong b sang a. V khng qun sao chp gi tr ca cc thnh phn khng ng cn li. Ta xt chng trnh minh ho. V d 4.6 /*vector4.cpp*/ #include <iostream.h> #include <conio.h> class vector{ int n; public: vector(); //hm thit lp khng tham s vector(int size); //hm thit lp 1 tham s vector(int size, float *a); vector(vector &); vector & operator=(vector & b); ~vector(); void display(); }; vector::vector() { int i; cout<<"Tao doi tuong tai "<<this<<endl; cout<<"So chieu :";cin>>n; v= new float [n]; //s to ca vector //con tr ti vng nh to float *v;

cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) { cout<<"Toa do thu "<<i+1<<" : "; cin>>v[i]; } } vector::vector(int size) { int i; cout<<"Su so\n"; n=size; cout<<"So chieu :"<<size<<endl; v= new float [n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) { cout<<"Toa do thu "<<i+1<<" : "; cin>>v[i]; } } vector::vector(int size,float *a ) int i; cout<<"Su so\n"; n=size; dung ham thiet lap 2 tham { dung ham thiet lap 1 tham

cout<<"Tao doi tuong tai "<<this<<endl;

cout<<"Tao doi tuong tai "<<this<<endl;

cout<<"So chieu :"<<n<<endl; v= new float [n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) v[i] = a[i]; } vector::vector(vector &b) int i; cout<<"Su chep\n"; dung ham thiet lap sao {

cout<<"Tao doi tuong tai "<<this<<endl; v= new float [n=b.n]; cout<<"Xin cap phat vung bo nho "<<n<<" so thuc tai"<<v<<endl; for(i=0;i<n;i++) v[i] = b.v[i]; } vector::~vector() { cout<<"Giai phong "<<v<<"cua doi tuong tai"<<this<<endl; delete v; } vector & vector::operator=(vector & b) { cout<<"Goi operator=() cho "<<this<<" va "<<&b<<endl; if (this !=&b){ /*xo vng nh ng c trong i tng v tri */ cout<<"xoa vung nho dong"<<v<<" trong "<<this<<endl;

delete v; /*cp pht vng nh mi c kch thc nh trong b*/ v=new float [n=b.n]; cout<<"cap phat vung nho dong moi"<<v<<" trong "<<this<<endl; for(int i=0;i<n;i++) v[i]=b.v[i]; } /*khi hai i tng ging nhau, khng lm g */ else cout<<"Hai doi tuong la mot\n"; return *this; } void vector::display() { int i; cout<<"Doi tuong tai :"<<this<<endl; cout<<"So chieu :"<<n<<endl; for(i=0;i<n;i++) cout <<v[i] <<" "; cout <<"\n"; } void main() { clrscr(); vector s1;//gi hm thit lp khng tham s s1.display(); vector s2 = s1;//gi hm thit lp sao chp s2.display(); vector s3(0); s3=s1;//gi hm ton t vector::operator=(...) s1=s1; getch();

} Tao doi tuong tai 0xfff2 So chieu :3 Xin cap phat vung bo nho 3 so thuc tai0x148c Toa do thu 1 : 2 Toa do thu 2 : 3 Toa do thu 3 : 2 Doi tuong tai :0xfff2 So chieu :3 2 3 2 Su dung ham thiet lap sao chep Tao doi tuong tai 0xffee Xin cap phat vung bo nho 3 so thuc tai0x149c Doi tuong tai :0xffee So chieu :3 2 3 2 Su dung ham thiet lap 1 tham so Tao doi tuong tai 0xffea So chieu :0 Xin cap phat vung bo nho 0 so thuc tai0x14ac Goi operator=() cho 0xffea va 0xfff2 xoa vung nho dong0x14ac trong 0xffea cap phat vung nho dong moi0x14ac trong 0xffea Goi operator=() cho 0xfff2 va 0xfff2 Hai doi tuong la mot

30.2

nh ngha chng php []"

Xt chng trnh sau: V d 4.7 /*vector5.cpp*/ #include <iostream.h> #include <conio.h> class vector{ int n; public: vector(); //hm thit lp khng tham s vector(vector &); int length() { return n;} vector & operator=(vector &); float & operator[](int i) { return v[i]; } ~vector(); }; vector::vector() { int i; cout<<"So chieu :";cin>>n; v= new float [n]; } vector::vector(vector &b) { int i; v= new float [n=b.n]; for(i=0;i<n;i++) //s gi tr //con tr ti vng nh to float *v;

v[i] = b.v[i]; } vector::~vector() { delete v; } vector & vector::operator=(vector & b){ cout<<"Goi operator=() cho "<<this<<" va "<<&b<<endl; if (this !=&b) { /*xo vng nh ng c trong i tng v tri*/ cout<<"xoa vung nho dong"<<v<<" trong "<<this<<endl; delete v; /*cp pht vng nh mi c kch thc nh trong b*/ v=new float [n=b.n]; cout<<"cap phat vung nho moi"<<v<<" trong "<<this<<endl; for(int i=0;i<n;i++) v[i]=b.v[i]; } /*khi hai i tng ging nhau, khng lm g */ else cout<<"Hai doi tuong la mot\n"; return *this; } void Enter_Vector(vector &s) { for (int i=0; i<s.length();i++) { cout<<"Toa do thu "<<i+1<<" : "; cin>>s[i]; } dong

} void Display_Vector(vector &s) { cout<<"So chieu : "<<s.length()<<endl; for(int i=0; i<s.length(); i++) cout<<s[i]<<" "; cout<<endl; } void main() { clrscr(); cout<<"Tao doi tuong s1\n"; vector s1; /*Nhp cc to cho vector s1*/ cout<<"Nhap cac toa do cua s1\n"; Enter_Vector(s1); cout<<"Thong tin ve vector s1\n"; Display_Vector(s1); vector s2 = s1; cout<<"Thong tin ve vector s2\n"; Display_Vector(s2); getch(); } Tao doi tuong s1 So chieu :4 Nhap cac toa do cua s1 Toa do thu 1 : 2 Toa do thu 2 : 3 Toa do thu 3 : 2 Toa do thu 4 : 3

Thong tin ve vector s1 So chieu : 4 2 3 2 3 Thong tin ve vector s2 So chieu : 4 2 3 2 3 Nhn xt 47) Nh gi tr tr v ca hm operator[] l tham chiu n mt thnh phn to ca vng nh ng nn ta c th c/ghi cc thnh phn to ca mi i tng vector. Nh vy c th s dng cc i tng vector ging nh cc bin mng. Trong v d trn chng ta cng khng cn n hm thnh phn vector::display() in ra cc thng tin ca cc i tng. 48) C th ci tin hm ton t operator[] bng cch b sung thm phn kim tra trn ch s. 30.3 nh ngha chng << v >> C th nh ngha chng hai ton t vo/ra << v >> cho php cc i tng ng bn phi chng khi thc hin cc thao tc vo ra. Chng trnh sau a ra mt cch nh ngha chng hai ton t ny. V d 4.8 #include <iostream.h> #include <conio.h> #include <math.h> class complex { float real, image; friend ostream & operator<<(ostream &o, complex &b);

friend istream & operator>>(istream &i, complex &b); }; ostream & operator<<(ostream &os, complex &b) { os<<b.real<<(b.image>=0?'+':'')<<"j*"<<fabs(b.image)<<endl; return os; } istream & operator>>(istream &is, complex &b) { cout<<"Phan thuc : "; is>>b.real; cout<<"Phan ao : "; is>>b.image; return is; } void main() { clrscr(); cout<<"Tao so phuc a\n"; complex a; cin>>a; cout<<"Tao so phuc b\n"; complex b; cin >>b; cout<<"In hai so phuc\n"; cout<<"a = "<<a; cout<<"b = "<<b; getch();

} Tao so phuc a Phan thuc : 3 Phan ao : 4 Tao so phuc b Phan thuc : 5 Phan ao : 3 In hai so phuc a = 3+j*4 b = 5+j*3 Nhn xt 49) Trong chng trnh trn, ta khng thy cc hm thit lp tng minh gn gi tr cho cc i tng. Thc t, vic gn cc gi tr cho cc i tng c m nhim bi hm ton t operator>>. 50) Vic hin th ni dung ca cc i tng s phc c trc y do hm thnh phn display() m nhim th nay c th thay th nh hm ton t operator<<. 51) Hai hm operator<< v operator>> cho php s dng cout v cin cng lc vi nhiu i tng khc nhau: gi tr s nguyn, s thc, xu k t, k t v cc i tng ca lp complex. C th th nghim cc cch khc thy -c rng gii php -a ra trong ch-ng trnh trn l tt nht. 30.4 nh ngha chng cc ton t new v delete Cc ton t new v delete c nh ngha cho tng lp v chng ch c nh hng i vi cc lp lin quan, cn cc lp khc vn s dng cc ton t new v delete nh bnh thng.

nh ngha chng ton t new buc phi s dng hm thnh phn v p ng cc rng buc sau: [1]. c mt tham s kiu size_t ( trong tp tiu stddef.h). Tham s ny tng ng vi kch thc (tnh theo byte) ca i tng xin cp pht. Lu rng y l tham s gi (dump argument) v n s khng c m t khi gi ti ton t new, m do chng trnh bin dch t ng tnh da trn kch thc ca i tng lin i. [2]. tr v mt gi tr kiu void * tng ng vi a ch vng nh ng c cp pht. Khi nh ngha chng ton delete ta phi s dng hm thnh phn, tun theo cc quy tc sau y: [1]. nhn mt tham s kiu con tr ti lp tng ng; con tr ny mang a ch vng nh ng c cp pht cn gii phng, [2]. khng c gi tr tr v (tr v void) Nhn xt C th gi c cc ton t new v delete chun (ngay c khi chng c nh ngha chng) thng qua ton t phm vi. Cc ton t new v delete l cc hm thnh phn static ca cc lp bi v chng khng c tham s ngm nh. Sau y gii thiu v d nh ngha chng cc ton t new v delete trn lp point. V d cng ch ra cch gi li cc ton t new v delete truyn thng. V d 4.9 /*newdelete.cpp*/ #include <iostream.h> #include <stddef.h> #include <conio.h> class point {

static int npt;/*s im tnh*/ static int npt_dyn;/*s im ng*/ int x, y; public: point(int ox=0, int oy = 0) { x = ox; y = oy; npt++; cout<<"++Tong "<<npt<<endl; } ~point () { npt--; cout<<"--Tong "<<npt<<endl; } void * operator new (size_t sz) { npt_dyn++; cout<<" dong "<<endl; } void operator delete (void *dp) { npt_dyn--; cout<<" dong "<<endl; ::delete (dp); } }; int point::npt = 0; Co "<<npt_dyn<<" diem Co "<<npt_dyn<<" diem so diem : so diem :

return ::new char [sz];

int point::npt_dyn = 0; void main() { clrscr(); point * p1, *p2; point a(3,5); p1 = new point(1,3); point b; p2 = new point (2,0); delete p1; point c(2); delete p2; getch(); } ++Tong so diem : 1 Co 1 diem dong ++Tong so diem : 2 ++Tong so diem : 3 Co 2 diem dong ++Tong so diem : 4 --Tong so diem : 3 Co 1 diem dong ++Tong so diem : 4 --Tong so diem : 3 Co 0 diem dong Nhn xt D cho new c c nh ngha chng hay khng, li gi ti new lun lun cn n cc hm thit lp.

30.5

Php nhn ma trn vc t

Chng trnh vectmat4.cpp sau y c ci tin t vectmat3.cpp trong hm prod() c thay th bi operator*. V d 4.10 /*vectmat4.cpp*/ #include <iostream.h> #include <conio.h> class matrix;/*khai bo trc lp matrix*/ /*lp vector*/ class vector{ static int n; float *v; public: vector(); vector(float *); vector(vector &);//hm thit lp sao chp ~vector(); void display(); static int & Size() {return n;} friend vector &); }; int vector::n = 0; /*cc hm thnh phn ca lp vector*/ vector::vector() { int i; v= new float [n]; vector operator*(matrix &, //s chiu ca vector //vng nh cha cc to

friend class matrix;

for(i=0;i<n;i++) { cout<<"Toa do thu "<<i+1<<" : "; cin>>v[i]; } } vector::vector(float *a) { for(int i =0; i<n; i++) v[i]=a[i]; } vector::vector(vector &b){ int i; for(i=0;i<n;i++) v[i] = b.v[i]; } vector::~vector(){ delete v; } void vector::display() { for(int i=0;i<n;i++) cout <<v[i] <<" "; cout <<"\n"; } /* lp matrix*/ class matrix { static int n; vector *m; public: //s chiu ca vector //vng nh cha cc to //hin th kt qu

matrix(); matrix(matrix &);//hm thit lp sao chp ~matrix(); void display(); static int &Size() {return n;} friend vector &); }; int matrix::n =0; /*hm thnh phn ca lp matrix*/ matrix::matrix(){ int i; m= new vector [n]; } matrix::matrix(matrix &b) { int i,j; m= new vector[n]; for (i=0; i<n; i++) for (j=0; j<n; j++) m[i].v[j]=b.m[i].v[j]; } matrix::~matrix() { delete m; } void matrix::display() for (int i=0; i<n; i++) m[i].display(); } { vector operator*(matrix &,

/*hm ton t*/ vector operator*(matrix &m,vector &v) { float *a = new float [vector::Size()]; int i,j; for (i=0; i<matrix::Size(); i++) { a[i]=0; for(j=0; j<vector::Size(); j++) a[i]+=m.m[i].v[j]*v.v[j]; } return vector(a); } void main() { clrscr(); int size; cout<<"Kich cin>>size; thuoc cua vector ";

vector::Size() = size; matrix::Size() = size; cout<<"Tao mot vector \n"; vector v; cout<<" v= \n"; v.display(); cout<<"Tao mot ma tran \n"; matrix m; cout<<" m = \n"; m.display(); cout<<"Tich m*v \n"; vector u = m*v;/* opertaor*(m,v) */ u.display();

getch(); } Kich thuoc cua vector 4 Tao mot vector Toa do thu 1 : 1 Toa do thu 2 : 2 Toa do thu 3 : 3 Toa do thu 4 : 4 v= 1 2 3 4 Tao mot ma tran Toa do thu 1 : 3 Toa do thu 2 : 2 Toa do thu 3 : 1 Toa do thu 4 : 2 Toa do thu 1 : 3 Toa do thu 2 : 2 Toa do thu 3 : 3 Toa do thu 4 : 2 Toa do thu 1 : 3 Toa do thu 2 : 2 Toa do thu 3 : 3 Toa do thu 4 : 2 Toa do thu 1 : 2 Toa do thu 2 : 3 Toa do thu 3 : 2 Toa do thu 4 : 3 m =

3 2 1 2 3 2 3 2 3 2 3 2 2 3 2 3 Tich m*v 18 24 24 26 31. Chuyn i kiu Vi cc kiu d liu chun, ta c th thc hin cc php chuyn kiu ngm nh, chng hn c th gn mt gi tr int vo mt bin long, hoc cng gi tr long vo mt bin float . Th-ng c hai kiu chuyn kiu: chuyn kiu ngm nh(t ng) v chuyn kiu t-ng minh (p kiu). Php chuyn kiu ngm nh -c thc hin bi ch-ng trnh bin dch. Php chuyn kiu t-ng minh xy ra khi s dng php p kiu bt buc. Php p kiu th-ng -c dng trong cc cu lnh gi hm gi cc tham s c kiu khc vi cc tham s hnh thc t-ng ng. Cc kiu lp khng th thoi mi chuyn sang cc kiu khc -c m phi do ng-i t lm ly. C++ cng cung cp cch thc nh ngha php chuyn kiu ngm nh v t-ng minh. Php chuyn kiu ngm nh -c nh ngha bng mt hm thit lp chuyn kiu (conversion constructor), cn php chuyn kiu t-ng minh -c xc nh thng qua ton t chuyn kiu hoc p kiu (cast operator). Php chuyn kiu ngm nh -c nh ngha thng qua mt hm thit lp chuyn kiu cho lp. Vi i s c kiu kiu cn phi chuyn thnh mt i t-ng ca lp

. Tham s ny c th c kiu c s hay l mt i t-ng thuc lp khc. Hm thit lp mt tham s trong lp point trong cc ch-ng trnh point?.cpp ch-ng tr-c l v d cho hm thit lp chuyn kiu. Trong ch th point p=2; chuyn kiu t gi tr nguyn 2 sang mt i tng point. Thc t y chng trnh dch gi ti hm thit lp mt tham s. y l s chuyn kiu mt chiu, nhn gi tr hoc i tng no v chuyn n thnh i tng ca lp. Cc hm thit lp chuyn kiu khng th s dng chuyn cc i tng ca lp mnh sang cc kiu khc v chng ch c th c s dng trong cc php gn v php khi to gi tr. Tuy nhin, cc ton t chuyn kiu c th c dng chuyn cc i tng sang cc kiu khc v cng c th c dng cho cc mc ch khc ngoi php gn v khi to gi tr. C++ qui nh rng mt hm ton t chuyn kiu nh th buc phi l hm thnh phn ca lp lin quan v khng c tham s hoc kiu tr v. Tn ca n c cho theo dng nh sau: operator type(); trong type l tn ca kiu d liu m mt i tng s c chuyn sang; c th l kiu d liu c s (khi ta phi chuyn kiu t i tng sang kiu c s) hay mt kiu lp khc (khi ta phi chuyn kiu t i tng lp ny sang lp khc). 31.1 Hm ton t chuyn kiu p buc Chng trnh complex6.cpp sau y minh ho cch ci t cc hm ton t chuyn kiu ngm nh v chuyn kiu t lp complex sang mt s thc. Vn chuyn kiu t lp ny sang lp khc s c gii thiu sau.

V d 4.11 /*complex6.cpp*/ #include <iostream.h> #include <conio.h> #include <math.h> class complex { float real, image; public: complex( ) { real = 0; image = 0; } /*hm thit lp ng vai tr mt hm ton t chuyn kiu t ng*/ complex(float r) { real = r; image = 0; } complex(float r, float i ) { real = r; image = i; } /*Hm ton t chuyn kiu p buc*/ operator float() { return real; } void display() { cout<<real<<(image>=0?'+':'')<<"j*"<<fabs(image)<<endl; } /*hm operator+ nh ngha php ton + hai ngi trn lp s phc complex*/

complex operator+(complex b) { complex c; c.real = real+b.real; c.image =image+b.image; return c; } }; void main() { clrscr(); cout<<"a = "; complex a(-2,5); a.display(); cout<<"b = "; complex b(3,4); b.display(); cout<<"c = a+b : "; complex c; c=a+b;//a.operator+(b) c.display(); cout<<"d = 3+c : "; complex d; d= complex(3)+c; d.display(); cout<<"float x = a : "; float x = a;//float(complex) cout<<x<<endl; getch(); }

a = -2+j*5 b = 3+j*4 c = a+b : 1+j*9 d = 3+c : 4+j*9 float x = a : -2 Ch : 52) Php cng 3+c khc vi complex(3)+c v trong php th nht ngi ta thc hin chuyn i c thnh s thc v php cng thc hin gia hai s thc. C th th nghim kim tra li kt qu sau: 53) on chng trnh d = 3 + c; d.display() cho ra kt qu 4+j*0 Cc php ton nguyn thu c u tin hn so vi cc php ton c nh ngha chng. 31.1.1 Hm ton t chuyn kiu trong li gi hm Trong chng trnh di y ta nh ngha hm fct() vi mt tham s thc (float) v s gi hm ny hai ln: ln th nht vi mt tham s thc, ln th hai vi mt tham s kiu complex. Trong lp complex cn c mt hm thit lp sao chp, khng c gi khi ta truyn i tng complex cho hm fct() v y xy ra s chuyn i kiu d liu. V d 4.12 /*complex7.cpp*/ #include <iostream.h> #include <conio.h> class complex {

float real, image; public: complex(float r, float i ) { real = r; image = i; } complex(complex &b ) { cout<<Ham thiet lap sao chep\n; real = b.r; image = b.i; } /*Hm ton t chuyn kiu p buc*/ operator float() { cout<<"Goi float() cho complex\n"; return real; } void display() { cout<<real<<(image>=0?'+':'')<<"j*"<<fabs(image)<<endl; } }; void fct(float n) { cout<<"Goi fct voi tham so : "<<n<<endl; } void main() { clrscr(); complex a(3,4); fct(6);//li gi hm thng thng fct(a);//li gi hm c xy ra chuyn i kiu d liu getch();

} Goi fct voi tham so : 6 Goi float() cho complex Goi fct voi tham so : 3 Trong chng trnh ny, li gi hm fct(a) c chng trnh dch chuyn thnh cc thao tc: [1]. chuyn i i tng thnh float, [2]. li gi hm fct() vi tham s l gi tr thu c sau chuyn i. S chuyn i c thc hin khi gi hm do khng xy ra vic sao chp li i tng a. 31.1.2 Hm ton t chuyn kiu trong biu thc Chng trnh di y cho ta bit biu thc dng a+b hoc a+3 c tnh nh th no vi a, b l cc i tng kiu complex. V d 4.13 /*complex8.cpp*/ #include <iostream.h> #include <conio.h> class complex { float real, image; public: complex(float r, float i ) { real = r; image = i; } /*Hm ton t chuyn kiu p buc*/ operator float() {

cout<<"Goi float() cho complex\n"; return real; } void display() { cout<<real<<(image>=0?'+':'')<<"j*"<<fabs(image)<<endl; } }; void main() { clrscr(); complex a(3,4); complex b(5,7); float n1, n2; n1 = a+3; cout<<"n1 = "<<n1<<endl; n2 = a + b;cout<<"n2 = "<<n2<<endl; double z1, z2; z1 = a+3; cout<<"z1 = "<<z1<<endl; z2 = a + b;cout<<"z2 = "<<z2<<endl; getch(); } Goi float() cho complex n1 = 6 Goi float() cho complex Goi float() cho complex n2 = 8 Goi float() cho complex z1 = 6 Goi float() cho complex

Goi float() cho complex z2 = 8 Khi gp biu thc dng a+3 vi php ton + c nh ngha vi cc ton hng c kiu lp complex v s thc, chng trnh dch trc ht i tm xem c mt ton t + c nh ngha chng tng ng vi cc kiu d liu ca cc ton hng ny hay cha. Trong trng hp ny v khng c, nn chng trnh dch s chuyn i kiu d liu ca cc ton hng ph hp vi mt trong s cc php ton nh ngha, c th l chuyn i t i tng a sang float. 31.2 Hm ton t chuyn i kiu c s sang kiu lp Tr li chng trnh complex6.cpp, ta c th thc hin cc ch th kiu nh: complex e=10; hoc a=1; Ch th th nht nhm to mt i tng tm thi c kiu complex tng ng vi phn thc bng 10, phn o bng 0 ri sao chp sang i tng e mi c khai bo. Trong ch th th hai, cng c mt i tng tm thi kiu complex c to ra v ni dung ca n (phn thc 1, phn o 0) c gn cho a. Nh vy, trong c hai trng hp u phi gi ti hm thit lp mt tham s ca lp complex. Tng t, nu c hm fct() vi khai bo: fct(complex) th li gi fct(4) s i hi phi chuyn i t gi tr nguyn 4 thnh mt i tng tm thi c kiu complex, truyn cho

fct(). Sau y l chng trnh nhn c do sa i t complex6.cpp. V d 4.14 /*complex9.cpp*/ #include <iostream.h> #include <conio.h> class complex { float real, image; public: complex(float r) { cout<<"Ham thiet lap dong vai tro cua ham toan tu chuyen kieu ngam dinh\n"; real = r; image = 0; } complex(float r, float i ) { cout<<"Ham thiet lap \n"; real = r; image = i; } complex(complex &b) { cout<<"Ham thiet lap sao chep lai "<<&b<<" Sang "<<this<<endl; real = b.real; image = b.image; } }; void fct(complex p) { cout<<"Goi fct \n"; } void main() { clrscr();

complex a(3,4); a = complex(12); a = 12; fct(4); getch(); } Ham thiet lap Ham thiet lap dong vai tro cua ham toan tu chuyen kieu ngam dinh Ham thiet lap dong vai tro cua ham toan tu chuyen kieu ngam dinh Ham thiet lap dong vai tro cua ham toan tu chuyen kieu ngam dinh Goi fct 31.2.1 Hm thit lp trong cc chuyn i kiu lin tip Trong lp s phc complex hm thit lp vi mt tham s cho php thc hin chuyn i float -->complex ng thi c chuyn i ngm nh int --> float. tc l n c th cho php mt chui cc chuyn i: int --> float -->complex Chng hn khi gp php gn kiu nh: a = 2; Cn ch kh nng chuyn i ny phi da trn cc quy tc chuyn i thng thng nh ni trn. 31.2.2 La chn gia hm thit lp v php ton gn Vi ch th gn:

a=12; trong chng trnh complex9.cpp khng c nh ngha ton t gn mt s nguyn cho mt i tng complex. Gi s c mt ton t gn nh vy th c th s xy ra xung t gia: [1]. chuyn i float-->complex bi hm thit lp v php gn complex-->complex. [2]. s dng trc tip ton t gn float->complex. gii quyt vn ny ta tun theo quy tc : Cc chuyn i do ngi s dng nh ngha ch c thc hin khi cn thit, ngha l vi ch th gn: a = 12; nu nh trong lp complex c nh ngha ton t gn, n s c u tin thc hin. Chng trnh sau y minh ho nhn xt ny: V d 4.15 /*complex10.cpp*/ #include <iostream.h> #include <conio.h> class complex { float real, image; public: complex(float r) { cout<<"Ham thiet lap dong vai tro cua ham toan tu chuyen kieu ngam dinh\n"; real = r; image = 0; } complex(float r, float i ) { cout<<"Ham thiet lap \n"; real = r; image = i;

} complex & operator=(complex &p) { real = p.real;image = p.image; cout<<"gan complex -->complex "<<&p<<" sang "<<this<<endl; return *this; } complex & operator=(float n) { real = n;image = 0; cout<<"gan float -->complex "<<endl; return *this; } }; void main() { clrscr(); complex a(3,4); a = 12; getch(); } Ham thiet lap gan float -->complex 31.2.3 S dng hm thit lp m rng ngha mt php ton Ta xt lp complex v hm thit lp mt tham s ca lp c b sung thm mt hm ton t di dng hm bn (trng hp ny khng nn s dng hm ton t thnh phn). Vi cc iu kin ny, khi a l mt i tng kiu complex, biu thc kiu nh: a + 3 tu

s c ngha. Thc vy trong trng hp ny chng trnh dch s thc hin cc thao tc sau: [1]. chuyn i t s thc 3 sang s phc complex. [2]. cng gia i tng nhn c vi a bng cch gi hm ton t operator+. Kt qu s l mt i tng kiu complex. Ni cch khc, biu thc a + 3 tng ng vi operator+(a, point(3)). Tng t, biu thc 5 + a s tng ng vi: operator+(point(5),a). Tuy nhin trng hp sau s khng cn ng khi operator+ l hm ton t thnh phn. Sau y l mt chng trnh minh ho cc kh nng m chng ta va cp. V d 4.16 /*complex11.cpp*/ #include <iostream.h> #include <conio.h> #include <math.h> class complex { float real, image; public: complex(float r) { cout<<"Ham thiet lap dong vai tro cua ham toan tu chuyen kieu ngam dinh\n"; real = r; image = 0; } complex(float r, float i ) {

cout<<"Ham thiet lap 2 tham so\n"; real = r; image = i; } void display() { cout<<real<<(image>=0?"+j*":"j*")<<fabs(image)<<endl; } friend complex); }; complex operator+(complex a, complex b) { complex c(0,0); c.real = a.real + b.real; c.image = a.image + b.image; return c; } void main() { clrscr(); complex a(3,4),b(9,4); a = b + 5;a.display(); a = 2 + b;a.display(); getch(); } Ham thiet lap 2 tham so Ham thiet lap 2 tham so Ham thiet lap dong vai tro cua ham toan tu chuyen kieu ngam dinh Ham thiet lap 2 tham so 14+j*4 complex operator+(complex ,

Ham thiet lap dong vai tro cua ham toan tu chuyen kieu ngam dinh Ham thiet lap 2 tham so 11+j*4 Nhn xt Hm thit lp lm nhim v ca hm ton t chuyn i kiu c s sang kiu lp khng nht thit ch c mt tham s hnh thc. Trong trng hp hm thit lp c nhiu tham s hn, cc tham s tnh t tham s th hai phi c gi tr ngm nh. 31.3 Chuyn i kiu t lp ny sang mt lp khc Kh nng chuyn i qua li gia kiu c s v mt kiu lp c th c m rng cho hai kiu lp khc nhau: [1]. Trong lp A, ta c th nh ngha mt hm ton t thc hin chuyn i t kiu A sang kiu B (cast operator). [2]. Hm thit lp ca lp A ch vi mt tham s kiu B s thc hin chuyn i kiu t B sang A. 31.3.1 Hm ton t chuyn kiu bt buc V d sau y minh ho kh nng dng hm ton t complex ca lp point cho php thc hin chuyn i mt i tng kiu point thnh mt i tng kiu complex.

V d 4.17 /*pointcomplex1.cpp*/ #include <iostream.h> #include <conio.h> #include <math.h> class complex;//khai bo trc lp complex class point { int x, y; public: point(int ox = 0, int oy =0) {x = ox; y = oy;} operator >complex }; complex();//chuyn i point--

class complex { float real, image; public: complex(float r=0, float i=0 ) { real = r; image = i; } friend point::operator complex(); void display() { cout<<real<<(image>=0?"+j*":"j*")<<fabs(image)<<endl; } }; point::operator complex() { complex r(x,y); cout<<"Chuyen doi "<<x<<" "<<y

<<" thanh r.image<<endl; return r; } void main() { clrscr();

"<<r.real<<"

"<<

point a(2,5); complex c; c = (complex) a; c.display(); point b(9,12); c = b; c.display(); getch(); } Chuyen doi 2 5 thanh 2 + 5 2+j*5 Chuyen doi 9 12 thanh 9 + 12 9+j*12 31.3.2 Hm thit lp dng lm hm ton t Chng trnh sau y minh ho kh nng dng hm thit lp complex(point) biu thc hin chuyn i mt i tng kiu point thnh mt i tng kiu complex. V d 4.18 /*pointcomplex2.cpp*/ #include <iostream.h> #include <conio.h> #include <math.h> class point;//khai bo trc lp complex class complex {

float real, image; public: complex(float r=0, float i=0 ) { real = r; image = i; } complex(point); void display() { cout<<real<<(image>=0?"+j*":"j*")<<fabs(image)<<endl; } }; class point { int x, y; public: point(int ox = 0, int oy =0) {x = ox; y = oy;} friend complex::complex(point); }; complex::complex(point p) { real= p.x; image = p.y; } void main() { clrscr(); point a(3,5); complex c = a; c.display(); getch(); } 3+j*5

32. Tm tt 32.1 Ghi nh Ton t c nh ngha chng bng cch nh ngha mt hm ton t. Tn hm ton t bao gm t kho operator theo sau l k hiu ca ton t c nh ngha chng. Hu ht cc ton t ca C++ u c th nh ngha chng. Khng th to ra cc k hiu php ton mi. Phi m bo cc c tnh nguyn thu ca ton t c nh ngha chng, chng hn: u tin, trt t kt hp, s ngi . Khng s dng tham s c gi tr ngm nh nh ngha chng ton t. Cc ton t (), [], ->, = yu cu hm ton t phi l hm thnh phn ca lp. Hm ton t c th l hm thnh phn hoc hm bn ca lp. Khi hm ton t l hm thnh phn, ton hng bn tri lun l i tng thuc lp. Nu ton hng bn tri l i tng ca lp khc th hm ton t tng ng phi l hm bn. Chng trnh dch khng t bit cch chuyn kiu gia kiu d liu chun v kiu d liu t nh ngha. V vy ngi lp trnh cn phi m t tng minh cc chuyn i ny di dng hm thit lp chuyn kiu hay hm ton t chuyn kiu. Mt hm ton t chuyn kiu thc hin chuyn i t mt i tng thuc lp sang i tng thuc lp khc hoc mt i tng c kiu c nh ngha trc. Hm thit lp chuyn kiu c mt tham s v thc hin chuyn i t mt gi tr sang i tng kiu lp. Ton t gn l ton t hay c nh ngha chng nht, c bit khi lp c cc thnh phn d liu ng.

nh ngha chng ton t tng, gim mt ngi, phi phn bit hai hm ton t tng ng cho dng tin t v dng hu t. 32.2 Cc li thng gp To mt ton t mi. Thay i nh ngha ca cc ton t trn cc kiu c nh ngha trc. Cho rng vic nh ngha chng mt ton t s t ng ko theo nh ngha chng ca cc ton t lin quan. Qun nh ngha chng ton t gn v hm thit lp sao chp cho cc lp c cc thnh phn d liu ng. 32.3 Mt s thi quen lp trnh tt S dng ton t nh ngha chng khi iu lm cho chng trnh trong sng hn. Trnh lm dng nh ngha chng ton t v iu dn n kh kim sot chng trnh. Ch n cc tnh cht nguyn thu ca ton t c nh ngha chng. Hm thit lp, ton t gn, hm thit lp sao chp ca mt lp thng i cng nhau. 33. Bi tp Bi tp 4.1. B sung thm mt s ton t trn lp s phc complex. nh ngha hai php ton vo ra trn lp vector.

Bi tp 4.2. Mt ma trn -c hiu l mt vector m mi thnh phn ca n li l mt vector. Theo tinh thn hy nh ngha lp matrix da trn vector. Tm cch cho ch-ng trnh dch hiu -c php truy nhp m[i][j] trong m l mt i t-ng thuc lp matrix. Bi tp 4.3. nh ngha cc php nhn, cng, tr trn cc ma trn vung. Bi tp 4.4. Da trn nh ngha ca lp complex , lp vector v lp matrix xy dng ch-ng trnh m phng cc thao tc trn ma trn v vector phc. Bi tp 4.5. Thay th hm thnh phn tick() trong lp date_time bi tp 3.10 bi hm ton t tng ng vi php ton ++. Bi tp 4.6. To lp phn s PS vi cc kh nng sau: [1]. To mt hm thit lp vi mu s dng, dng ti gin hoc rt gn v dng ti gin. [2]. nh ngha chng cc ton t cng, tr, nhn, chia cho lp ny. [3]. nh ngha chng cc ton t quan h trn lp s phc.

1. Gii thiu chung .................................................... 165 2. V d trn lp s phc ........................................... 167 2.1 Hm ton t l hm thnh phn ......................... 167 2.2 Hm ton t l hm bn ..................................... 169 3. Kh nng v gii hn ca nh ngha chng ton t 183 Phn ln ton t trong C++ u c th nh ngha chng ........................................................................ 183 Trng hp cc ton t ++ v -- ............................... 184 La chn gia hm thnh phn v hm bn ............. 185 4. Chin lc s dng hm ton t............................ 185 Cc php ton mt ngi ............................................ 185 Cc php ton hai ngi ............................................. 185 Cc php gn............................................................. 186 Ton t truy nhp thnh phn ->........................... 186 Ton t truy nhp thnh phn theo ch s ................ 186 Ton t gi hm........................................................ 186 5. Mt s v d tiu biu............................................ 186 5.1 nh ngha chng php gn = ....................... 186 5.2 nh ngha chng php []" ............................... 193 5.3 nh ngha chng << v >> ............................... 196 5.4 nh ngha chng cc ton t new v delete ... 198 5.5 Php nhn ma trn vc t ................................... 202 6. Chuyn i kiu .................................................... 207 6.1 Hm ton t chuyn kiu p buc...................... 208
6.1.1 6.1.2 Hm ton t chuyn kiu trong li gi hm ..................... 211 Hm ton t chuyn kiu trong biu thc ......................... 213

6.2 Hm ton t chuyn i kiu c s sang kiu lp 215

6.2.1 6.2.2 6.2.3 6.3.1 6.3.2

Hm thit lp trong cc chuyn i kiu lin tip ............ 217 La chn gia hm thit lp v php ton gn.................. 217 S dng hm thit lp m rng ngha mt php ton 219 Hm ton t chuyn kiu bt buc ................................... 222 Hm thit lp dng lm hm ton t................................. 224

6.3 Chuyn i kiu t lp ny sang mt lp khc.. 222

7. Tm tt .................................................................. 226 7.1 Ghi nh............................................................... 226 7.2 Cc li thng gp ............................................. 227 7.3 Mt s thi quen lp trnh tt ............................ 227 8. Bi tp.................................................................... 227

1. i tng................................................................. 74 2. Lp........................................................................... 77 2.1 Khai bo lp ......................................................... 77


2.1.1To i tng................................................................................ 79 2.1.2Cc thnh phn d liu ................................................................. 80 2.1.3Cc hm thnh phn ..................................................................... 81 2.1.4Tham s ngm nh trong li gi hm thnh phn....................... 86 2.1.5Phm vi lp................................................................................... 87 2.1.6T kho xc nh thuc tnh truy xut ......................................... 87 2.1.7Gi mt hm thnh phn trong mt hm thnh phn khc .......... 93

2.2 Kh nng ca cc hm thnh phn ...................... 94


2.2.1nh ngha chng cc hm thnh phn. ....................................... 94 2.2.2Cc tham s vi gi tr ngm nh................................................ 96 2.2.3S dng i tng nh tham s ca hm thnh phn ................... 97 2.2.4Con tr this................................................................................... 99

3. Php gn cc i tng ........................................... 99 4. Hm thit lp (constructor) v hm hu b (destructor)........................................................... 101 4.1 Hm thit lp...................................................... 101
4.1.1Chc nng ca hm thit lp ...................................................... 101 4.1.2Mt s c im quan trng ca hm thit lp .......................... 104 4.1.3Hm thit lp ngm nh ............................................................ 106 4.1.4Con tr i tng........................................................................ 110 4.1.5Khai bo tham chiu i tng .................................................. 114

4.2 Hm hu b........................................................ 114


4.2.1Chc nng ca hm hu b ........................................................ 114 4.2.2Mt s qui nh i vi hm hu b .......................................... 116

4.3 S cn thit ca cc hm thit lp v hu b -lp vector trong khng gian n chiu ............................... 117 4.4 Hm thit lp sao chp(COPY CONSTRUCTOR) 121
4.4.1Cc tnh hung s dng hm thit lp sao chp ......................... 121

4.4.2Hm thit lp sao chp ngm nh ............................................. 122 4.4.3Khai bo v nh ngha hm thit lp sao chp tng minh....... 123 4.4.4Hm thit lp sao chp cho lp vector........................................ 126

5. Cc thnh phn tnh (static).................................. 131 5.1 Thnh phn d liu static. ............................ 131 5.2 Khi to cc thnh phn d liu tnh ................. 133 5.3 Cc hm thnh phn static ................................. 135 6. i tng hng (CONSTANT )............................... 139 6.1 i tng hng................................................... 139 6.2 Hm thnh phn const ...................................... 139 7. Hm bn v lp bn............................................... 140 7.1 t vn .......................................................... 140 7.2 Hm t do bn ca mt lp................................ 141 7.3 Cc kiu bn b khc ......................................... 144
7.3.1Hm thnh phn ca lp l bn ca lp khc............................ 144 7.3.2Hm bn ca nhiu lp............................................................... 146 7.3.3Tt c cc hm ca lp l bn ca lp khc ............................... 147

7.4 Bi ton nhn ma trn vi vector ....................... 148


Gii php th nht - prod l hm bn t do ........................................ 148 Gii php th hai- prod l hm thnh phn ca lp matrix v l bn ca vect 150

8. V d tng hp....................................................... 152 9. Tm tt .................................................................. 157 9.1 Ghi nh............................................................... 157 9.2 Cc li thng gp ............................................. 159 9.3 Mt s thi quen lp trnh tt ............................ 160 10. Bi tp.................................................................... 160

Chng 5 K thut tha k (Inheritance) Mc ch chng ny: 54) Ci t s tha k. 55) S dng cc thnh phn ca lp c s. 56) nh ngha li cc hm thnh phn. 57) Truyn thng tin gia cc hm thit lp ca lp dn xut v lp c s. 58) Cc loi dn xut khc nhau v s thay i trng thi ca cc thnh phn lp c s. 59) S tng thch gia cc i tng ca lp dn xut v lp c s. 60) Ton t gn v tha k. 61) Hm o v tnh a hnh 62) Hm o thun tu v lp c s tru tng 63) a tha k v cc vn lin quan. 34. Gii thiu chung Tha k l mt trong bn nguyn tc c s ca phng php lp trnh hng i tng. c bit y l c s cho vic nng cao kh nng s dng li cc b phn ca chng trnh. Tha k cho php ta nh ngha mt lp mi, gi l lp dn xut, t mt lp c, gi l lp c s. Lp dn xut s tha k cc thnh phn (d liu, hm) ca lp c s, ng thi thm vo cc thnh phn mi, bao hm c vic lm tt hn hoc lm li nhng cng vic m trong lp c s cha lm tt hoc khng cn ph hp vi lp dn xut. Chng hn c th nh ngha lp mt hng nhp khu da trn lp mt hng, bng cch b sung thm thuc tnh thu. Khi cch tnh chnh lch gi bn, mua c trong lp mt hng s khng ph hp na nn cn phi sa li cho ph hp. Lp

im c mu c nh ngha da trn lp im khng mu bng cch b sung thm thuc tnh mu, hm display() lc ny ngoi vic hin th hai thnh phn to cn phi cho bit mu ca i tng im. Trong c hai v d a ra, trong lp dn xut u c s b sung v thay i thch hp vi tnh hnh mi. Tha k cho php khng cn phi bin dch li cc thnh phn chng trnh vn c trong cc lp c s v hn th na khng cn phi c chng trnh ngun tng ng. K thut ny cho php chng ta pht trin cc cng c mi da trn nhng g c c. Ngi s dng Borland C hay Turbo Pascal 6.0/7.0 rt thch s dng Turbo Vision - mt th vin cung cp cc lp, i tng l c s xy dng cc giao din ng dng ht sc thn thin i vi ngi s dng. Tt c cc lp ny u c cung cp di dng cc tp tin *.obj, *.lib ngha l ngi s dng hon ton khng th v khng cn phi bit r phn chng trnh ngun tng ng. Tuy nhin iu khng quan trng khi ngi lp trnh c php tha k cc lp nh ngha trc . Tha k cng cho php nhiu lp c th dn xut t cng mt lp c s, nhng khng ch gii hn mt mc: mt lp dn xut c th l lp c s cho cc lp dn xut khc. y ta thy rng khi nim tha k ging nh cng c cho php m t c th ho cc khi nim theo ngha: lp dn xut l mt c th ho hn na ca lp c s v nu b i cc d bit trong cc lp dn xut s ch cn cc c im chung nm trong lp c s. Hnh 5.1 m t mt s tha k ca cc lp, c cung i t lp ny sang lp kia nu chng c quan h tha k. Ta gi l th tha k. Sau y l mt s m t cho cc lp xut hin trong th tha k trn. 1. Lp mt hng cc thuc tnh tn s lng trong kho

gi mua gi bn cc phng thc hm chnh lch gi bn mua {gi bn - gi mua} th tc mua(q) {Thm vo trong kho q n v mt hng} th tc bn(q) {Bt i q n v mt hng c trong kho} 2. Lp mt hng nhp khu tha k t mt hng cc thuc tnh thu nhp khu cc phng thc hm chnh lch gi bn -mua {gi bn - gi mua* thu nhp khu} 3. Lp xe gn my tha k t mt hng nhp khu cc thuc tnh dung tch xy lanh cc phng thc 4. Lp hng in t dn dng tha k t mt hng cc thuc tnh in p thi hn bo hnh cc phng thc hm thi gian bo hnh thc t ... Tnh a hnh cng l mt trong cc im l th trong lp trnh hng i tng, c thit lp trn c s tha k trong i tng c th c biu hin khc nhau tu

thuc vo tnh hung c th. Tnh a hnh y c th xy ra mt hnh vi ca i tng hay trong ton b i tng. V d trc quan th hin tnh a hnh l mt ti vi c th va l i tng ca mt hng va l i tng ca lp mt hng in t dn dng. Cc i tng hnh hc nh hnh vung, hnh trn, hnh ch nht u c cng cch v nh nhau: xc nh hai im u v cui, ni hai im ny. Do vy thut ton tuy ging nhau i vi tt c cc i tng hnh, nhng cch v th ph thuc vo tng lp i tng c th. Ta ni phng thc ni im ca cc i tng hnh hc c tnh a hnh. Tnh a hnh cn c th hin trong cch thc hin th thng tin trong cc i tng im mu/khng mu. Cc ngn ng lp trnh hng i tng u cho php a tha k, theo mt lp c th l dn xut ca nhiu lp khc. Do vy dn ti kh nng mt lp c s c th c tha k nhiu ln trong mt lp dn xut khc, ta gi l s xung t tha k. iu ny hon ton khng hay, cn phi trnh. Tng ngn ng s c nhng gii php ca ring mnh, C++ a ra khi nim tha k o. Trong chng ny ta s cp ti cc kh nng ca C++ th hin nguyn tc tha k khi vit chng trnh.

Lp mt hng cc thuc tnh tn s lng trong kho gi mua gi bn cc phng thc chnh lch gi bn mua mua(q) bn(q)

Lp mt hng nhp khu cc thuc tnh thu nhp khu cc phng thc chnh lch gi bn -mua Lp in t dn dng cc thuc tnh in p Lp Xe gn my cc thuc tnh dung tch xy lanh thi hn bo hnh cc phng thc thi gian bo hnh thc t

Lp t cc thuc tnh Mc

Lp Tivi cc thuc tnh kch thc mn hnh iu khin t xa

Hnh 5.1 V d v s tha k

35. n tha k 35.1 V d minh ho Chng trnh inheri1.cpp sau y l mt v d th hin tnh tha k n ca lp coloredpoint, m t cc im mu trn mt phng, t lp cc im khng mu ni chung point. Chng trnh ny cp n kh nhiu kha cnh, lin quan n k thut ci t tnh tha k trong C++, l: [4]. Truy nhp cc thnh phn lp c s t lp dn xut, nh ngha li () cc thnh phn lp c s trong lp dn xut Truyn thng tin gia cc hm thit lp V d 5.1 /*inheri1.cpp*/ #include <iostream.h> #include <conio.h> class point { float x,y; public: point() {x = 0; y = 0;} point(float ox, float oy) {x = ox; y = oy; } point(point &p) {x = p.x; y = p.y;} void display() { cout<<"Goi ham point::display() \n"; cout<<"Toa do :"<<x<<" "<<y<<endl; } void move(float dx, float dy) { x += dx;

y += dy; } }; /*lop coloredpoint tha k t point*/ class coloredpoint : public point { unsigned int color; public: coloredpoint():point() { color =0; } coloredpoint(float ox, float unsigned int c):point(ox,oy) { color = c; } coloredpoint(coloredpoint &b):point((point &)b) { color = b.color; } void display() { cout<<"Ham coloredpoint::display()\n"; point::display();/*gi ti hm cng tn trong lp c s*/ cout<<"Mau "<<color<<endl; } }; void main() { clrscr(); coloredpoint m; cout<<"Diem m \n"; oy,

m.display(); cout<<"Chi hien thi toa do cua m\n"; m.point::display();/*gi phng thc display trong lp point*/ coloredpoint n(2,3,6); cout<<"Diem n \n"; n.display(); cout<<"Chi hien thi toa do cua n\n"; n.point::display(); coloredpoint p =n; cout<<"Diem p \n"; p.display(); cout<<"Chi hien thi toa do cua p\n"; p.point::display(); getch(); } Diem m Ham coloredpoint::display() Goi ham point::display() Toa do :0 0 Mau 0 Chi hien thi toa do cua m Goi ham point::display() Toa do :0 0 Diem n Ham coloredpoint::display() Goi ham point::display() Toa do :2 3

Mau 6 Chi hien thi toa do cua n Goi ham point::display() Toa do :2 3 Diem p Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 6 Chi hien thi toa do cua p Goi ham point::display() Toa do :2 3 35.2 Truy nhp cc thnh phn ca lp c s t lp dn xut Cc thnh phn private trong lp c s khng th truy nhp c t cc lp dn xut. Chng hn cc thnh phn private x v y trong lp c s point khng c dng trong nh ngha cc hm thnh phn ca lp dn xut coloredpoint. Tc l Phm vi lp ch m rng cho bn b, m khng c m rng n cc lp con chu. Trong khi , trong nh ngha ca cc hm thnh phn trong lp dn xut c php truy nhp n cc thnh phn protected v public trong lp dn xut, chng hn c th gi ti hm thnh phn point::dislay() ca lp c s bn trong nh ngha hm thnh phn coloredpoint::display() trong lp dn xut. 35.3 nh ngha li cc thnh phn ca lp c s trong lp dn xut Chng trnh inheri1.cpp cng c mt v d minh ho cho iu ny: hm display() tuy c trong lp

point, c nh ngha li trong lp coloredpoint.Lc ny, thc t l c hai phin bn khc nhau ca display() cng tn ti trong lp coloredpoint, mt c nh ngha trong lp point, c xc nh bi point::display() v mt c nh ngha trong lp coloredpoint v c xc nh bi coloredpoint::display(). Trong phm vi ca lp dn xut hm th hai che lp hm th nht, ngha l tn gi display() trong nh ngha ca hm thnh phn ca lp coloredpoint hoc trong li gi hm thnh phn display() t mt i tng lp coloredpoint phi tham chiu n coloredpoint::display(). Nu mun gi ti hm display() ca lp point ta phi vit y tn ca n, ngha l point::display(). Trong nh ngha hm coloredpoint::display() nu ta thay th point::display() bi display() th s to ra li gi quy v hn ln. Cn ch rng vic nh ngha li mt hm thnh phn khc vi nh ngha chng hm thnh phn, bi v khi nim nh ngha li ch c xt ti khi ta ni n s tha k. Hm nh ngha li v hm b nh ngha li ging ht nhau v tn, tham s v gi tr tr v, chng ch khc nhau v tr, mt hm t trong lp dn xut v hm kia th c mt trong lp c s. Trong khi , cc hm chng ch c cng tn, thng khc nhau v danh sch tham s v tt c chng thuc v cng mt lp. nh ngha li hm thnh phn chnh l c s cho vic ci t tnh a hnh ca cc phng thc ca i tng. C++ cn cho php khai bo bn trong lp dn xut cc thnh phn d liu cng tn vi cc thnh phn d liu c trong lp c s. Hai thnh phn cng tn ny c th cng kiu hay khc kiu. Lc ny bn trong mt i tng ca lp dn xut c ti hai thnh phn khc nhau c cng tn, nhng trong phm vi lp dn xut tn chung nhm ch nh thnh phn c khai bo li trong lp dn xut. Khi mun ch nh thnh phn cng

tn trong lp c s, phi s dng tn lp c s v ton t phm vi :: t trc tn thnh phn . 35.4 Tnh tha k trong lp dn xut

35.4.1 S tng thch ca i tng thuc lp dn xut vi i tng thuc lp c s Mt cch tng qut, trong lp trnh hng i tng, mt i tng ca lp dn xut c th thay th mt i tng ca lp c s. Ngha l: tt c nhng thnh phn d liu c trong lp c s u tm thy trong lp dn xut; tt c cc hnh ng thc hin c trn lp c s lun lun c th lm c trn cc lp dn xut. Trong chng trnh inheri1.cpp ta thy rng: i tng m ca lp coloredpoint c ng thi hai thnh phn to x , y v thm thnh phn d liu b sung color; ngoi ra c th gi cc hm thnh phn point::display() v point::move(...) thng qua i tng m. Tnh tng thch gia mt i tng ca lp dn xut v i tng lp c s c th hin ch c th chuyn kiu ngm nh t mt i tng ca lp dn xut sang mt i tng ca lp c s. Xt cc ch th sau: point p; p.display(); coloredpointcol pc(2,3,5); cu lnh p=pc; p.display(); pc.display(); cho kt qu Diem p khong mau Goi ham point::display() Toa do :0 0

Diem pc co mau Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 5 p =pc Goi ham point::display() Toa do :2 3 Tuy nhin nhn xt trn y khng hon ton ng xt theo chiu ngc li. Cu lnh sau y khng ng nu khng c nh ngha chng ton t gn ga hai i tng vi cc kiu d liu coloredpoint v point. pc=p;

Ch T pc ch c th gi n cc thnh phn hm public trong lp point (xem thm phn sau hiu r hn). 35.4.2 Tng thch gia con tr lp dn xut v con tr lp c s Tng t nh vn trnh by trong phn trnmt con tr i tng lp c s c th ch n mt i tng lp dn xut, cn mt con tr lp dn xut khng th nhn a ch ca i tng lp c s, tr trng hp p kiu. Ta xt chng trnh v d sau: V d 5.2 /*inheri2.cpp*/ #include <iostream.h> #include <conio.h> class point { float x,y; public: point() {x = 0; y = 0;} point(float ox, float oy) {x = ox; y = oy; } point(point &p) {x = p.x; y = p.y;} void display() { cout<<"Goi ham point::display() \n"; cout<<"Toa do :"<<x<<" "<<y<<endl; } void move(float dx, float dy) { x += dx; y += dy; }

}; /*lp coloredpoint tha k t point*/ class coloredpoint : public point { unsigned int color; public: coloredpoint():point() { color =0; } coloredpoint(float ox, float unsigned int c):point(ox,oy) { color = c; } coloredpoint(coloredpoint &b):point((point &)b) { color = b.color; } void display() { cout<<"Ham coloredpoint::display()\n"; point::display();/*gi ti hm cng tn trong lp c s*/ cout<<"Mau "<<color<<endl; } }; void main() { clrscr(); point *adp; coloredpoint pc(2,3,5); pc.display(); cout<<"adp = &pc \n"; oy,

adp=&pc; adp->move(2,3); cout<<"adp->move(2,3)\n"; pc.display(); adp->display(); getch(); } Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 5 adp = &pc adp->move(2,3) Ham coloredpoint::display() Goi ham point::display() Toa do :4 6 Mau 5 Goi ham point::display() Toa do :4 6 Nhn xt Ch kt qu thc hin ch th : adp->display(); Goi ham point::display() Toa do :4 6 Nh vy, mc d adp cha a ch ca i tng coloredpoint l pc, nhng apd->display()

vn l point::display() ch khng phi coloredpoint::display(). Hin tng ny c gii thch l do adp c khai bo l con tr kiu point v v cc hm trong point u c khai bo nh bnh thng nn adp ch c th gi c cc hm thnh phn c trong point ch khng ph thuc vo i tng m adp cha a ch. Mun c c tnh a hnh cho display() ngha l li gi ti display() ph thuc vo kiu i tng c a ch cha trong adp, ta phi khai bo hm thnh phn display() trong point nh l mt hm o. Phn sau chng ta s cp vn ny, 35.4.3 Tng thch gia tham chiu lp dn xut v tham chiu lp c s Vn c xt trong phn 2.4.2 cng hon ton tng t i vi tham chiu. Ta xt chng trnh sau: V d 5.3 /*inheri3.cpp*/ #include <iostream.h> #include <conio.h> class point { float x,y; public: point() {x = 0; y = 0;} point(float ox, float oy) {x = ox; y = oy; } point(point &p) {x = p.x; y = p.y;} void display() { cout<<"Goi ham point::display() \n"; cout<<"Toa do :"<<x<<" "<<y<<endl;

} void move(float dx, float dy) { x += dx; y += dy; } }; /*lp coloredpoint tha k t point*/ class coloredpoint : public point { unsigned int color; public: coloredpoint():point() { color =0; } coloredpoint(float ox, float unsigned int c):point(ox,oy) { color = c; } coloredpoint(coloredpoint &b):point((point &)b) { color = b.color; } void display() { cout<<"Ham coloredpoint::display()\n"; point::display(); cout<<"Mau "<<color<<endl; } }; void main() { clrscr(); oy,

coloredpoint pc(2,3,5); pc.display(); cout<<"point &rp = pc \n"; point &rp=pc; rp.move(2,3); cout<<"rp.move(2,3)\n"; pc.display(); rp.display(); getch(); } Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 5 point &rp = pc rp.move(2,3) Ham coloredpoint::display() Goi ham point::display() Toa do :4 6 Mau 5 Goi ham point::display() Toa do :4 6 35.5 Hm thit lp trong lp dn xut

35.5.1 Hm thit lp trong lp Nu lp c khai bo tng minh t nht mt hm thit lp th khi to ra mt i tng s c mt li gi n mt trong cc hm thit lp c nh ngha. Vic chn la hm thit lp da theo cc tham s c cung cp km theo. Trng hp khng c hm thit lp no ph hp s

sinh ra mt li bin dch. Nh vy khng th to ra mt i tng nu khng dng n mt trong cc hm thit lp c nh ngha. Trong trng hp tht s khng c hm thit lp tng minh ta khng th m t tng tn cc d liu ca i tng lin quan. Xt chng trnh sau: V d 5.4 #include <iostream.h> #include <conio.h> /*khai bo lp point m khng c hm thit lp tng minh*/ class point { float x,y; public: void display() { cout<<"Goi ham point::display() \n"; cout<<"Toa do :"<<x<<" "<<y<<endl; } void move(float dx, float dy) { x += dx; y += dy; } }; void main() { clrscr(); cout<<"Diem p \n"; point p; p.display(); getch(); }

Diem p Goi ham point::display() Toa do :8.187236e-34 2.637535e-11 35.5.2 Phn cp li gi Mt i tng lp dn xut v thc cht c th coi l mt i tng ca lp c s, v vy vic gi hm thit lp lp dn xut to i tng lp dn xut s ko theo vic gi n mt hm thit lp trong lp c s. V nguyn tc, nhng phn ca i tng lp dn xut thuc v lp c s s c to ra trc khi cc thng tin mi c xc lp. Nh vy, th t thc hin ca cc hm thit lp s l: hm thit lp cho lp c s, ri n hm thit lp cho lp dn xut nhm b sung nhng thng tin cn thiu. C ch trn y c thc hin mt cch ngm nh, khng cn phi gi tng minh hm thit lp lp c s trong hm thit lp lp dn xut (thc t l cng khng th thc hin c iu v khng th gi hm thit lp ca bt k lp no mt cch tng minh). Gii php ca C++ (cng c nhiu ngn ng lp trnh hng i tng khc chp nhn) l: trong nh ngha ca hm thit lp lp dn xut, ta m t lun mt li gi ti mt trong cc hm thit lp lp c s. Hy xem li nh ngha ca cc hm thit lp lp coloredpoint trong chng trnh inheri1.cpp: Mt s nhn xt quan trng [5]. Nu mun s dng hm thit lp ngm nh ca lp c s th c th khng cn m t cng vi nh ngha ca hm thit lp lp dn xut, ngha l nh ngha ca hm coloredpoint::coloredpoint() c th vit li nh sau: coloredpoint(){/* to phn i tng point s dng hm point::point()*/

color =0; } [6]. Cc tham s m hm thit lp lp dn xut truyn cho hm thit lp lp c s khng nht thit ly nguyn si t cc tham s n nhn c m c th c ch bin i t nhiu. V d, ta c th vit li nh ngha cho coloredpoint::coloredpoint(float, float,unsigned) nh sau: coloredpoint::coloredpoint (float ox, float oy, unsigned point((ox+oy)/2, (ox-oy)/2) { color = c; } c) :

35.5.3 Hm thit lp sao chp Nu trong lp dn xut khng khai bo tng minh hm thit lp sao chp, th cng vic ny c chng trnh bin dch m nhim nh nh ngha hm thit lp sao chp ngm nh. V nguyn tc, trong nh ngha ca hm thit lp sao chp lp dn xut ta c th m t bt k hm thit lp no c mt trong lp c s. Chng trnh sau minh ho iu : V d 5.5 /*inheri4.cpp*/ #include <iostream.h> #include <conio.h> class point { float x,y; public: float getx() {return x;} float gety() {return y;} point() {x = 0; y = 0;} point(float ox, float oy) {x = ox; y = oy; } point(point &p) {x = p.x; y = p.y;} void display() { cout<<"Goi ham point::display() \n"; cout<<"Toa do :"<<x<<" "<<y<<endl; } void move(float dx, float dy) { x += dx; y += dy; }

}; /*lp coloredpoint tha k t point*/ class coloredpoint : public point { unsigned int color; public: coloredpoint():point() { color =0; } coloredpoint(float unsigned int c); ox, float oy,

coloredpoint(coloredpoint &b):point(b.getx(),b.gety()) { cout<<"Goi ham thiet lap sao chep"" <<" coloredpoint::coloredpoint(coloredpoint &) \n"; color = b.color; } void display() { cout<<"Ham coloredpoint::display()\n"; point::display(); cout<<"Mau "<<color<<endl; } }; coloredpoint::coloredpoint (float ox, point(ox, oy) { color = c; } float oy, unsigned c) :

void main() { clrscr(); coloredpoint pc(2,3,5); cout<<"pc = "; pc.display(); cout<<"coloredpoint qc = pc;\n"; coloredpoint qc = pc; cout<<"qc= "; qc.display(); getch(); }

pc = Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 5 coloredpoint qc = pc; Goi ham thiet lap sao chep coloredpoint::coloredpoint(coloredpoin t &) qc= Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 5 Trong thc t, ta thng s dng mt cch lm khc, gi hm thit lp sao chp ca lp c s trong nh ngha ca hm thit lp sao chp lp dn xut. Cch tip cn ny yu cu phi tch cho c tham chiu n i tng lp c s dng lm tham s ca hm thit lp c s. Ta xt nh ngha hm coloredpoint::coloredpoint(coloredpoi nt&) trong chng trnh sau: V d 5.6 /*inheri5.cpp*/ #include <iostream.h> #include <conio.h> class point { float x,y; public: point() {x = 0; y = 0;}

point(float ox, float oy) {x = ox; y = oy; } point(point &p) {x = p.x; y = p.y;} void display() { cout<<"Goi ham point::display() \n"; cout<<"Toa do :"<<x<<" "<<y<<endl; } void move(float dx, float dy) { x += dx; y += dy; } }; /*lp coloredpoint tha k t point*/ class coloredpoint : public point { unsigned int color; public: coloredpoint():point() { color =0; } coloredpoint(float ox, float unsigned int c):point(ox,oy) { color = c; } coloredpoint(coloredpoint &b):point((point &)b) { color = b.color; } void display() { cout<<"Ham coloredpoint::display()\n"; oy,

point::display(); cout<<"Mau "<<color<<endl; } }; void main() { clrscr(); coloredpoint m(2,3,5); cout<<"Diem m \n"; m.display(); cout<<"coloredpoint p =m;\n"; coloredpoint p =m; cout<<"Diem p \n"; p.display(); getch(); } Diem m Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 5 coloredpoint p =m; Diem p Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 5 Nu bn c cn nh phn 2.4.3 ca chng ny th s thy rng nh ngha ca

coloredpoint::coloredpoint(coloredpoint &) c th ci tin thm mt cht nh sau: coloredpoint(coloredpoint &b):point(b) { color = b.color; } Thc t y c s chuyn kiu ngm nh t coloredpoint & sang point &. 35.6 Cc kiu dn xut khc nhau. Tu thuc vo t kho ng trc lp c s trong khai bo lp dn xut, ngi ta phn bit ba loi dn xut nh sau: T kho public private protected 35.6.1 Dn xut public Trong dn xut public, cc thnh phn, cc hm bn v cc i tng ca lp dn xut khng th truy nhp n cc thnh phn private ca lp c s. Cc thnh phn protected trong lp c s tr thnh cc thnh phn private trong lp dn xut. Cc thnh phn public ca lp c s vn l public trong lp dn xut. 35.6.2 Dn xut private Trong trng hp ny, cc thnh phn public trong lp c s khng th truy nhp c t cc i tng ca Kiu dn xut dn public dn private xut xut

dn xut protected

lp dn xut, ngha l chng tr thnh cc thnh phn private trong lp dn xut. Cc thnh phn protected trong lp c s c th truy nhp c t cc hm thnh phn v cc hm bn ca lp dn xut. Dn xut private c s dng trong mt s tnh hung c bit khi lp dn xut khng khai bo thm cc thnh phn hm mi m ch nh ngha li cc phng thc c trong lp c s. 35.6.3 Dn xut protected Trong dn xut loi ny, cc thnh phn public, protected trong lp c s tr thnh cc thnh phn protected trong lp dn xut. Bng tng kt cc kiu dn xut Lp c s TT TN TN NS FM D A pub C pro C pri C Ghi ch T vit tt TT TTM TN FMA TN NSD Din gii Trng thi u Trng thi mi Truy nhp bi cc hm thnh phn hoc hm bn. Truy nhp bi ngi s dng C K K Dn xut public TT M TN NSD Dn xut protect ed TT M TN NSD Dn xut private TT M TN NSD

pub pro pri

C K K

pro pro pri

K K K

pri pri pri

K K K

pro pub pri C K

protected public private C Khng

36. Hm o v tnh a hnh 36.1 t vn Cho n nay, ta ch mi bit rng mt tham tr ti mt i tng c th nhn a ch ca bt c i tng con chu no (cc i tng ca cc lp tha k). Tuy vy u im ny phi tr gi: li gi n mt phng thc ca mt i tng c tr ti lun c coi nh li gi n phng thc tng ng vi kiu con tr ch khng phi tng ng vi i tng ang c tr n. Ta c dp minh chng iu ny trong v d phn 35.4.2 ca chng ny. Ta gi l gn kiu tnh-static typing hay gn kiu sm-early binding ( tc l hm thnh phn gi t con tr i tng c xc nh ngay khi khai bo). Thc t c nhiu vn khi xc nh phng thc hay hnh ng c th tu thuc vo thi im tham chiu i tng, chng hn khi v cc i tng hnh ch nht, hnh vung, hnh trn, tt c u gi ti phng thc v c tha k t lp tng qut hn (lp hnh v). Trong nh ngha ca phng thc c li gi n mt phng thc khc l ni im ch c xc nh mt cch tng minh trong tng i tng c th l hnh ch nht, hnh vung hay hnh trn. gi c phng thc tng ng vi i tng c tr n, cn phi xc nh c kiu ca i tng c xem xt ti thi im thc hin chng trnh bi l kiu ca i tng c ch nh bi cng mt con tr c th thay i trong qu trnh thc hin ca chng trnh. Ta gi l gn kiu ng - dynamic typing hay gn kiu mun - late binding, ngha l xc nh hm

thnh phn no tng ng vi mt li gi hm thnh phn t con tr i tng ph thuc c th vo i tng m con tr ang cha a ch. Khi nim hm o c C++ a ra nhm p ng nhu cu ny. Chng trnh polymorphism1.cpp sau y a ra mt v d v hm o: V d 5.7 /*polymorphism1.cpp*/ #include <iostream.h> #include <conio.h> class point { float x,y; public: point() { cout<<"point::point()\n"; x = 0; y = 0; } point(float ox, float oy) { cout<<"point::point(float, float)\n"; x = ox; y = oy; } point(point &p) { cout<<"point::point(point &)\n"; x = p.x; y = p.y; } virtual void display() {

cout<<"Goi ham point::display() \n"; cout<<"Toa do :"<<x<<" "<<y<<endl; } void move(float dx, float dy) { x += dx; y += dy; } }; /*lp coloredpoint tha k t point*/ class coloredpoint : public point { unsigned int color; public: coloredpoint():point() { cout<<"coloredpoint::coloredpoint()\n"; color =0; } coloredpoint(float unsigned int c); ox, float oy,

coloredpoint(coloredpoint &b):point((point &)b) { cout<<"coloredpoint::coloredpoint(coloredp oint &)\n"; color = b.color; } void display() { cout<<"Ham coloredpoint::display()\n"; point::display(); cout<<"Mau "<<color<<endl;

} }; coloredpoint::coloredpoint(float ox, float oy, unsigned c) : point(ox, oy){ cout<<"coloredpoint::coloredpoint(float, float, unsigned)\n"; color = c; } void main() { clrscr(); cout<<"coloredpoint pc(2,3,5);\n"; coloredpoint pc(2,3,5); cout<<"pc.display();\n"; pc.display(); cout<<"point *ptr=&pc;\n"; point *ptr=&pc; cout<<"ptr->display();\n"; ptr->display(); cout<<"point p(10,20);\n"; point p(10,20); cout<<"ptr = &p\n"; ptr = &p; cout<<"p.display()\n"; p.display(); cout<<"ptr->display();\n"; ptr->display(); getch(); }

coloredpoint pc(2,3,5); point::point(float, float) coloredpoint::coloredpoint(float, float, unsigned) pc.display(); Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 5 point *ptr=&pc; ptr->display(); Ham coloredpoint::display() Goi ham point::display() Toa do :2 3 Mau 5 point p(10,20); point::point(float, float) ptr = &p p.display() Goi ham point::display() Toa do :10 20 ptr->display(); Goi ham point::display() Toa do :10 20 Nhn xt 64) Trong nh ngha ca lp point, dng tiu khai bo hm thnh phn point::display() c t kho virtual, t kho ny c th t trc hay sau

tn kiu d liu nhng phi trc tn hm ch nh rng hm point::display() l mt hm o. 65) Hm thnh phn point::dislay() c nh ngha li trong lp dn xut tuy rng trong trng hp tng qut iu ny khng bt buc nu nh bn thn hm o c inh ngha. Khi tu thuc vo kiu ca i tng c a ch cha trong con tr lp dn xut ptr m li gi hm ptr->display() s gi n point::display() hay coloredpoint::display(); Tnh a hnh cn th hin khi mt hm thnh phn trong lp c s c gi t mt i tng lp dn xut, cn bn thn hm th gi ti hm thnh phn c nh ngha ng thi trong c lp c s (khai bo virtual c mt y) v trong cc lp dn xut. Mi bn c xem chng trnh polymorphism2.cpp sau y: V d 5.8 /*polymorphism2.cpp*/ #include <iostream.h> #include <conio.h> class point { float x,y; public: point() { cout<<"point::point()\n"; x = 0; y = 0; } point(float ox, float oy) { cout<<"point::point(float, float)\n"; x = ox;

y = oy; } point(point &p) { cout<<"point::point(point &)\n"; x = p.x; y = p.y; } void display() ; void move(float dx, float dy) { x += dx; y += dy; } virtual void Identifier() { cout<<"Diem khong mau \n"; } }; void point::display() Identifier(); } /*lp coloredpoint tha k t point*/ class coloredpoint : public point { unsigned int color; public: coloredpoint():point() { cout<<"coloredpoint::coloredpoint()\n"; color =0; } { cout<<"Toa do : "<<x<<" "<<y<<endl;

coloredpoint(float unsigned int c);

ox,

float

oy,

coloredpoint(coloredpoint &b):point((point &)b) { cout<<"coloredpoint::coloredpoint(coloredp oint &)\n"; color = b.color; } void Identifier() { cout<<"Mau : "<<color<<endl; } }; coloredpoint::coloredpoint(float ox, float oy, unsigned c) : point(ox, oy) { cout<<"coloredpoint::coloredpoint(float, float, unsigned)\n"; color = c; } void main() { clrscr(); cout<<"coloredpoint pc(2,3,5);\n"; coloredpoint pc(2,3,5); cout<<"pc.display()\n"; pc.display(); cout<<"point p(10,20);\n"; point p(10,20);

cout<<"p.display()\n"; p.display(); getch(); } coloredpoint pc(2,3,5); point::point(float, float) coloredpoint::coloredpoint(float, float, unsigned) pc.display() Toa do : 2 3 Mau : 5 point p(10,20); point::point(float, float) p.display() Toa do : 10 20 Diem khong mau Trong chng trnh trn, lp coloredpoint tha k t lp point hm thnh phn display(). Hm ny gi ti hm thnh phn o Identifier c nh ngha li trong coloredpoint. Tu thuc vo i tng gi hm display() l ca point hay ca coloredpoint chng trnh dch s pht li gi n point::Identifier() hay coloredpoint::Identifier(). Ni cch khc trong trng hp ny Identifier cng biu hin tnh a hnh. 36.2 Tng qut v hm o

36.2.1 Phm vi ca khai bo virtual Khi mt hm f() c khai bo virtual trong mt lp A, n c xem nh th hin ca s ghp kiu ng

trong lp A v trong tt c cc lp dn xut t A hoc t con chu ca A. Xt li gi ti hm Identifier() trong hm display() c gi t cc i tng khc nhau trong chng trnh sau: V d 5.9 #include <iostream.h> #include <conio.h> class point { float x,y; public: point() { cout<<"point::point()\n"; x = 0; y = 0; } point(float ox, float oy) { cout<<"point::point(float, float)\n"; x = ox; y = oy; } point(point &p) { cout<<"point::point(point &)\n"; x = p.x; y = p.y; } void display() ; void move(float dx, float dy) { x += dx;

y += dy; } virtual void Identifier() { cout<<"Diem khong mau \n"; } }; void point::display() Identifier(); } class coloredpoint : public point { unsigned int color; public: coloredpoint():point() { cout<<"coloredpoint::coloredpoint()\n"; color =0; } coloredpoint(float unsigned int c); ox, float oy, { cout<<"Toa do : "<<x<<" "<<y<<endl;

coloredpoint(coloredpoint &b):point((point &)b) { cout<<"coloredpoint::coloredpoint(coloredp oint &)\n"; color = b.color; } void Identifier() { cout<<"Mau : "<<color<<endl; }

}; class threedimpoint : public point { float z; public: threedimpoint() { z = 0; } threedimpoint(float ox, float oz):point (ox, oy) { z = oz; } threedimpoint(threedimpoint :point(p) { z = p.z; } void Identifier() { cout<<"Toa do z : "<<z<<endl; } }; class coloredthreedimpoint threedimpoint { unsigned color; public: coloredthreedimpoint() { color = 0; } coloredthreedimpoint(float oy, float oz,unsigned c): (ox, oy, oz) ox, float : public &p) float oy,

threedimpoint

{ color = c; } coloredthreedimpoint(coloredthreedimpoint &p) :threedimpoint(p) { color = p.color; } void Identifier() { cout<<"Diem mau } }; coloredpoint::coloredpoint(float ox, float oy, unsigned c) : point(ox, oy) { cout<<"coloredpoint::coloredpoint(float, float, unsigned)\n"; color = c; } void main() { clrscr(); cout<<"coloredpoint pc(2,3,5);\n"; coloredpoint pc(2,3,5); cout<<"pc.display()\n"; pc.display();/*gi ti coloredtpoint::Identifier()*/ cout<<"point p(10,20);\n"; point p(10,20); : "<<color<<endl;

cout<<"p.display()\n"; p.display();/*gi ti point::Identifier()*/ cout<<"threedimpoint p3d(2,3,4);\n"; threedimpoint p3d(2,3,4); cout<<"p3d.display();\n"; p3d.display();/*gi threedimpoint::Identifier()*/ cout<<"coloredthreedimpoint p3dc(2,3,4,10);\n"; coloredthreedimpoint p3dc(2,3,4,10); cout<<"p3dc.display();\n"; p3dc.display();/*gi coloredthreedimpoint::Identifier()*/ getch(); } coloredpoint pc(2,3,5); point::point(float, float) coloredpoint::coloredpoint(float, float, unsigned) pc.display() Toa do : 2 3 Mau : 5 point p(10,20); point::point(float, float) p.display() Toa do : 10 20 Diem khong mau threedimpoint p3d(2,3,4); point::point(float, float) ti ti

p3d.display(); Toa do : 2 3 Toa do z : 4 coloredthreedimpoint p3dc(2,3,4,10); point::point(float, float) p3dc.display(); Toa do : 2 3 Diem mau : 10

36.2.2 Khng nht thit phi nh ngha li hm virtual Trong trng hp tng qut, ta lun phi nh ngha li trong cc lp dn xut cc phng thc c khai bo l virtual trong lp c s. Trong mt s trng hp khng nht thit buc phi lm nh vy. Khi m hm display() c mt nh ngha hon chnh trong point, ta khng cn nh ngha li n trong lp coloredpoint. Chng trnh polymorphism4.cpp sau y minh chng cho nhn nh ny. V d 5.10 #include <iostream.h> #include <conio.h> class point { float x,y; public: point() { cout<<"point::point()\n"; x = 0; y = 0; }

point(float ox, float oy) { cout<<"point::point(float, float)\n"; x = ox; y = oy; } point(point &p) { cout<<"point::point(point &)\n"; x = p.x; y = p.y; } virtual void display() { cout<<"Goi ham point::display() \n"; cout<<"Toa do :"<<x<<" "<<y<<endl; } void move(float dx, float dy) { x += dx; y += dy; } }; class coloredpoint : public point { unsigned int color; public: coloredpoint():point() { cout<<"coloredpoint::coloredpoint()\n"; color =0; }

coloredpoint(float unsigned int c);

ox,

float

oy,

coloredpoint(coloredpoint &b):point((point &)b) { cout<<"coloredpoint::coloredpoint(coloredp oint &)\n"; color = b.color; } }; coloredpoint::coloredpoint(float ox, float oy, unsigned c) : point(ox, oy) { cout<<"coloredpoint::coloredpoint(float, float, unsigned)\n"; color = c; } void main() { clrscr(); cout<<"coloredpoint pc(2,3,5);\n"; coloredpoint pc(2,3,5); cout<<"pc.display();\n"; pc.display(); cout<<"point *ptr=&pc;\n"; point *ptr=&pc; cout<<"ptr->display();\n"; ptr->display(); cout<<"point p(10,20);\n";

point p(10,20); cout<<"ptr = &p\n"; ptr = &p; cout<<"p.display()\n"; p.display(); cout<<"ptr->display();\n"; ptr->display(); getch(); } coloredpoint pc(2,3,5); point::point(float, float) coloredpoint::coloredpoint(float, float, unsigned) pc.display(); Goi ham point::display() Toa do :2 3 point *ptr=&pc; ptr->display(); Goi ham point::display() Toa do :2 3 point p(10,20); point::point(float, float) ptr = &p p.display() Goi ham point::display() Toa do :10 20 ptr->display(); Goi ham point::display()

Toa do :10 20 36.2.3 nh ngha chng hm o C th nh ngha chng mt hm o v cc hm nh ngha chng nh th c th khng cn l hm o na. Hn na, nu ta nh ngha mt hm o trong mt lp v li nh ngha chng n trong mt lp dn xut vi cc tham s khc th c th xem hm nh ngha chng l mt hm hon ton khc khng lin quan g n hm o hin ti, ngha l nu n khng c khai bo virtual th n c tnh cht gn kiu tnh-static typing. Ni chung, nu nh ngha chng hm o th tt c cc hm nh ngha chng ca n nn c khai bo l virtual vic xc nh li gi hm n gin hn. 36.2.4 Khai bo hm o mt lp bt k trong s tha k Trong chng trnh polymorphism5.cpp, hm point::Identifier() khng l virtual trong khi khai bo virtual li c p dng cho hm threedimpoint::Identifier(). Chng trnh dch s xem point::Identifier() v threedimpoint::Identifier() c tnh cht khc nhau: point::Identifier() c tnh cht gn kiu tnh- static typing, trong khi threedimpoint::Identifier() li c tnh cht gn kiu ng-dynamic typing. V d 5.11 /*polymorphism5.cpp*/ #include <iostream.h> #include <conio.h> class point { float x,y; public:

point() { cout<<"point::point()\n"; x = 0; y = 0; } point(float ox, float oy) { cout<<"point::point(float, float)\n"; x = ox; y = oy; } point(point &p) { cout<<"point::point(point &)\n"; x = p.x; y = p.y; } void display() ; void move(float dx, float dy) { x += dx; y += dy; } void Identifier() { cout<<"Diem khong mau \n"; } }; void point::display() Identifier(); } { cout<<"Toa do : "<<x<<" "<<y<<endl;

class threedimpoint : public point { float z; public: threedimpoint() { z = 0; } threedimpoint(float ox, float oz):point (ox, oy) { z = oz; } threedimpoint(threedimpoint :point(p) { z = p.z; } virtual void Identifier() { cout<<"Toa do z : "<<z<<endl; } }; class coloredthreedimpoint threedimpoint { unsigned color; public: coloredthreedimpoint() { color = 0; } coloredthreedimpoint(float oy, float oz,unsigned c): (ox, oy, oz) { ox, float : public &p) float oy,

threedimpoint

color = c; } coloredthreedimpoint(coloredthreedimpoint &p) :threedimpoint(p) { color = p.color; } void Identifier() { cout<<"Diem mau } }; void main() { clrscr(); cout<<"point p(10,20);\n"; point p(10,20); cout<<"p.display()\n"; p.display(); cout<<"threedimpoint p3d(2,3,4);\n"; threedimpoint p3d(2,3,4); cout<<"p3d.display();\n"; p3d.display(); cout<<"p3d.Identifier();\n"; p3d.Identifier(); cout<<"coloredthreedimpoint p3dc(2,3,4,10);\n"; coloredthreedimpoint p3dc(2,3,4,10); cout<<"p3dc.display();\n"; p3dc.display(); cout<<"p3dc.Identifier();\n"; : "<<color<<endl;

p3dc.Identifier(); getch(); } point p(10,20); point::point(float, float) p.display() Toa do : 10 20 Diem khong mau threedimpoint p3d(2,3,4); point::point(float, float) p3d.display(); Toa do : 2 3 Diem khong mau p3d.Identifier(); Toa do z : 4 coloredthreedimpoint p3dc(2,3,4,10); point::point(float, float) p3dc.display(); Toa do : 2 3 Diem khong mau p3dc.Identifier(); Diem mau : 10

36.2.5 Hm hu b o Hm thit lp khng th l hm o, trong khi hm hu b li c th. Ta quan st s c xy ra khi s dng tnh a hnh x l cc i tng ca cc lp trong s tha k c cp pht ng. Nu mi i tng c dn dp tng minh nh s dng ton t delete cho con tr lp c s ch n i tng th hm hu b ca lp c

s s c gi m khng cn bit kiu ca i tng ang c x l, cng nh tn hm hu b ca lp tng ng vi i tng (tuy c th khc vi hm hu b ca lp c s). Mt gii php n gin cho vn ny l khai bo hm hu b ca lp c s l hm o, lm cho cc hm hu b ca cc lp dn xut l o m khng yu cu chng phi c cng tn. Chng trnh polymorphism6.cpp sau y minh ho tnh a hnh ca hm o: V d 5.12 #include <iostream.h> #include <conio.h> class point { float x,y; public: point() { cout<<"point::point()\n"; x = 0; y = 0; } point(float ox, float oy) { cout<<"point::point(float, float)\n"; x = ox; y = oy; } point(point &p) { cout<<"point::point(point &)\n"; x = p.x; y = p.y;

} virtual ~point() { cout<<"point::~point() \n"; } void display() ; void move(float dx, float dy) { x += dx; y += dy; } virtual void Identifier() { cout<<"Diem khong mau \n"; } }; void point::display() Identifier(); } class threedimpoint : public point { float z; public: threedimpoint() { z = 0; } threedimpoint(float ox, float oz):point (ox, oy) { float oy, { cout<<"Toa do : "<<x<<" "<<y<<endl;

cout<<"threedimpoint::threedimpoint(float, float,float)\n"; z = oz;

} threedimpoint(threedimpoint :point(p) { z = p.z; } ~threedimpoint() { cout<<"threedimpoint::~threedimpoint()"; } void Identifier() { cout<<"Toa do z : "<<z<<endl; } }; class coloredthreedimpoint threedimpoint { unsigned color; public: coloredthreedimpoint() { color = 0; } coloredthreedimpoint(float oy, float oz,unsigned c): oy, oz) { cout<<"coloredthreedimpoint::coloredthreed impoint(float, float,float,unsigned)\n"; color = c; } ox, float : public &p)

threedimpoint (ox,

coloredthreedimpoint(coloredthreedimpoint &p) :threedimpoint(p) { color = p.color; } ~coloredthreedimpoint() { cout<<"coloredthreedimpoint::~coloredthree dimpoint()\n"; } void Identifier() { cout<<"Diem mau } }; void main() { clrscr(); point *p0 = new point(2,10); point *p1 = new threedimpoint(2,3,5); point *p2 = coloredthreedimpoint(2,3,4,10); delete p0; delete p1; delete p2; getch(); } point::point(float, float) point::point(float, float) threedimpoint::threedimpoint(float, float,float) point::point(float, float) new : "<<color<<endl;

threedimpoint::threedimpoint(float, float,float) coloredthreedimpoint::coloredthreedimp oint(float, float,float,unsigned) point::~point() threedimpoint::~threedimpoint()point:: ~point() coloredthreedimpoint::~coloredthreedim point() threedimpoint::~threedimpoint()point:: ~point() 36.3 Lp tru tng v hm o thun tu Hm o thun tu l hm khng c phn nh ngha. nh ngha mt hm o nh th c vit nh sau: class mere { public: virtual display() = 0; //hm o thun tu }; Lp c t nht mt hm thnh phn o thun tu c gi l lp tru tng. Phi tun theo mt s quy tc sau y: [7]. Khng th s dng lp tru tng khi khai bo cc bin, m m t lp cc i tng mt cch chung nht. Sau cc lp tha k s c chi tit dn dn. y, lp tru tng l tng qut ho ca cc lp tha k n, v ngc li cc lp dn xut l s c th ho ca lp tru tng. [8]. c php khai bo con tr c kiu l mt lp tru tng. [9]. Mt hm o thun tu khai bo trong mt lp tru tng c s phi c nh ngha li trong mt lp dn xut hoc nu khng th phi c tip tc khai bo o

trong lp dn xut. Trong trng hp ny lp dn xut mi ny li l mt lp tru tng. Trong phn 37.5 s c mt v d v vic s dng lp tru tng xy dng mt danh sch cc i tng khng ng nht. 37. a tha k 37.1 t vn a tha k cho php mt lp c th l dn xut ca nhiu lp c s, do vy nhng g cp trong phn n tha k c tng qut ho cho trng hp a tha k. Tuy vy cn phi gii quyt cc vn sau: 66) Lm th no biu th c tnh c lp ca cc thnh phn cng tn bn trong mt lp dn xut? 67) Cc hm thit lp v hu b c gi nh th no: th t, truyn thng tin v.v.? 68) Lm th no gii quyt tnh trng tha k xung t trong , lp D dn xut t B v C, v c hai cng l dn xut ca A. Chng ta xem xt mt tnh hung n gin : mt lp c tn l coloredpoint tha k t hai lp point v col.
point col

coloredpoint

Gi s cc lp point v col c trnh by nh sau: class point { class col { float x,y; public: point(...){... } ~point{...} unsigned color; public: col (...) {...} ~color() {...} void

void display(){...} };

display(){...} };

Chng ta c th nh ngha lp coloredpoint tha k hai lp ny nh sau: class coloredpoint:public point,public col {...}; Quan st cu lnh khai bo trn ta thy tip theo tn lp dn xut l mt danh sch cc lp c s cng vi cc t kho xc nh kiu dn xut. Bn trong lp coloredpoint ta c th nh ngha cc thnh phn mi ( y gii hn vi hm thit lp, hm hu b v hm hin th). Trong trng hp n tha k, hm thit lp lp dn xut phi truyn mt s thng tin cho hm thit lp lp c s. iu ny vn cn trong trng hp a tha k, ch khc l phi truyn thng tin cho hai hm thit lp tng ng vi hai hai lp c s. Dng tiu trong phn nh ngha hm thit lp coloredpoint c dng: coloredpoint(.............)point(......... ...),col(............)
cc tham s cho coloredpoint cc tham s cho point cc tham s cho col

Th t gi cc hm thit lp nh sau: cc hm thit lp ca cc lp c s theo th t khai bo ca cc lp c s trong lp dn xut ( y l point v col), v cui cng l hm thit lp ca lp dn xut ( y l coloredpoint). Cn cc hm hu b li c gi theo th t ngc li khi i tng coloredpoint b xo.

Ging nh trong n tha k, trong hm thnh phn ca lp dn xut c th s dng tt c cc hm thnh phn public (hoc protected ) ca lp c s. Khi c nhiu hm thnh phn cng tn trong cc lp khc nhau (nh ngha li mt hm), ta c th loi b s nhp nhng bng cch s dng ton t phm vi ::. Ngoi ra to thi quen lp trnh tt, khi thc hin cc li gi hm thnh phn nn tun theo th t khai bo ca cc lp c s. Nh vy bn trong hm coloredpoint::display() c cc cu lnh sau: point::display(); col::display(); Tt nhin khi hm thnh phn trong lp c s khng c nh ngha li trong lp dn xut th s khng c s nhp nhng v do khng cn dng n ton t ::. Vic s dng lp coloredpoint khng c g c bit, mt i tng kiu coloredpoint thc hin li gi n cc hm thnh phn ca coloredpoint cng nh l cc hm thnh phn public ca point v col. Nu c trng tn hm, phi s dng ton t phm vi ::. Chng hn vi khai bo: coloredpoint p(3,9,2); cu lnh p.display() s gi ti coloredpoint::display(), cn cu lnh p.point::display() gi ti point::display().

Nu mt trong hai lp point v col li l dn xut ca mt lp c s khc, th c th s dng c cc thnh phn bn trong lp c s mi ny. Sau y l mt v d hon chnh minh ho vic nh ngha v s dng coloredpoint. V d 5.13 /*mulinher1.cpp*/ #include <iostream.h> #include <conio.h> class point{ float public: point (float ox,float oy) { cout<<"++Constr. point\n"; x=ox; y=oy; } ~point(){cout<<"--Destr. point\n";} void display(){ cout<<"Toa do : "<<x<<" "<<y<<"\n"; } }; class col { unsigned color; public: col(unsigned c) { x,y;

cout<<"++Constr. col \n"; color=c; } ~col() {cout<<"--Destr. col\n";} void display() "<<color<<"\n";} }; class col { coloredpoint :public point,public {cout<<"Mau :

public: coloredpoint(float ox,float unsigned c) : point(ox,oy),col(c) { cout<<"++Constr. coloredpoint\n"; } ~coloredpoint() { cout<<"--Destr. coloredpoint\n"; } void display() { point::display(); col::display(); } }; void main() { clrscr(); coloredpoint p(3,9,2); cout<<"---------------\n"; oy,

p.display(); cout<<"---------------\n"; p.point::display(); cout<<"---------------\n"; p.col::display(); cout<<"---------------\n"; getch(); } ++Constr. point ++Constr. col ++Constr. coloredpoint --------------Toa do : 3 9 Mau : 2 --------------Toa do : 3 9 --------------Mau : 2 ----------------Destr. coloredpoint --Destr. col --Destr. point

Nhn xt Trong trng hp cc thnh phn d liu ca cc lp c s trng tn, ta phn bit chng bng cch s dng tn lp tng ng i km vi ton t phm vi ::. Xt v d: class A { class B { ... public: int x; ... }; class C:public A,public B {...}; Lp C c hai thnh phn d liu cng tn l X, mt tha k t A, mt tha k t B. Bn trong cc thnh phn hm ca C, chng ta phn bit chng nh ton t phm vi::: l A::x v B::x 37.2 Lp c s o Xt tnh hung nh sau:
A B D C

... public: int x; ... };

tng ng vi cc khai bo sau: class A ... int x,y; }; {

class B:public A{....}; class C:public A{....}; class D:public B,public C {....}; Theo mt ngha no , c th ni rng D tha k A hai ln. Trong cc tnh hung nh vy, cc thnh phn ca A (hm hoc d liu) s xut hin trong D hai ln. i vi cc hm thnh phn th iu ny khng quan trng bi ch c duy nht mt hm cho mt lp c s, cc hm thnh phn l chung cho mi i tng ca lp. Tuy nhin, cc thnh phn d liu li c lp li trong cc i tng khc nhau (thnh phn d liu ca mi i tng l c lp). Nh vy, phi chng c s d tha d liu? Cu tr li ph thuc vo tng tnh hung c th. Nu chng ta mun D c hai bn sao d liu ca A, ta phi phn bit chng nh: A::B::x v A::C::x Thng thng, chng ta khng mun d liu b lp li v gii quyt bng cch chn mt trong hai bn sao d liu thao tc. Tuy nhin iu tht chn ngt v khng an ton. Ngn ng C++ cho php ch t hp mt ln duy nht cc thnh phn ca lp A trong lp D nh khai bo trong cc lp B v C (ch khng phi trong D!) rng lp A l o (t kho virtual): class B:public virtual A{....}; class C:public virtual A{....}; class D:public B,public C{....}; Vic ch th A l o trong khai bo ca B v C ngha l A s ch xut hin mt ln trong cc con chu ca chng. Ni cch khc, khai bo ny khng nh hng n cc

lp B v C. Ch rng t kho virtual c th c t trc hoc sau t kho public (hoc private, protected). Ta xt chng trnh v d sau y: V d 5.14 /*mulinher2.cpp Solution to multiple inheritance*/ #include <iostream.h> #include <conio.h> class A { float x,y; public: void set(float ox, float oy) { x = ox; y = oy; } float getx() { return x; } float gety() { return y; } }; class B : public virtual A { }; class C : public virtual A { }; class D : public B, public C { }; void main() { clrscr();

D d; cout<<"d.B::set(2,3);\n"; d.B::set(2,3); cout<<"d.C::getx() cout<<d.C::getx()<<endl; cout<<"d.B::getx() cout<<d.B::getx()<<endl; cout<<"d.C::gety() cout<<d.C::gety()<<endl; cout<<"d.B::gety() cout<<d.B::gety()<<endl; cout<<"d.C::set(10,20);\n"; d.B::set(2,3); cout<<"d.C::getx() cout<<d.C::getx()<<endl; cout<<"d.B::getx() cout<<d.B::getx()<<endl; cout<<"d.C::gety() cout<<d.C::gety()<<endl; cout<<"d.B::gety() cout<<d.B::gety()<<endl; getch(); } = = = = "; "; "; "; = = = = "; "; "; ";

d.B::set(2,3); d.C::getx() = 2 d.B::getx() = 2 d.C::gety() = 3 d.B::gety() = 3 d.C::set(10,20); d.C::getx() = 2 d.B::getx() = 2 d.C::gety() = 3 d.B::gety() = 3 37.3 Hm thit lp v hu b - vi lp o Thng thng khi khi to cc i tng dn xut cc hm thit lp c gi theo th t xut hin trong danh sch cc lp c s c khai bo, ri n hm thit lp ca lp dn xut. Thng tin c chuyn t hm thit lp ca lp dn xut sang hm thit lp ca cc lp c s.

Trong tnh hung c lp c s virtual, vn c khc i cht. Xem hnh v sau:


A

Trong trng hp ny, ta ch xy dng mt i tng duy nht c kiu A. Cc tham s c truyn cho hm thit lp A c m t ngay khi nh ngha hm thit lp D. V nh vy, khng cn m t cc thng tin truyn cho A mc B v C. Cn phi tun theo quy tc, quy nh sau y: Th t gi cc hm thit lp: hm thit lp ca mt lp o lun lun c gi trc cc hm thit lp khc. Vi s tha k c trn hnh v, th t gi hm thit lp s l: A,B,C v cui cng l D. Chng trnh sau minh chng cho nhn xt ny: V d 5.15 /*mulinher3.cpp Solution to multiple inheritance*/ #include <iostream.h> #include <conio.h> class A { float x,y; public: A() {x = 0; y =0;} A(float ox, float oy) { cout<<"A::A(float, float)\n"; x = ox; y = oy; } float getx() { return x; } float gety() {

return y; } }; class B : public virtual A { public: B(float ox, float oy) : A(ox,oy) { cout<<"B::B(float, float)\n"; } }; class C : public virtual A { public: C(float ox, float oy):A(ox,oy) cout<<"C::C(float, float)\n"; } }; class D : public B, public C { public: D(float ox, float A(ox,oy),B(10,4),C(1,1) { } }; void main() { clrscr(); D d(2,3); cout<<"D d(2,3)\n"; cout<<"d.C::getx() cout<<d.C::getx()<<endl; = "; oy) : {

cout<<"D::D(float,float);\n";

cout<<"d.B::getx() cout<<d.B::getx()<<endl; cout<<"d.C::gety() cout<<d.C::gety()<<endl; cout<<"d.B::gety() cout<<d.B::gety()<<endl; cout<<"D d1(10,20);\n"; D d1(10,20); cout<<"d1.C::getx() cout<<d1.C::getx()<<endl; cout<<"d1.B::getx() cout<<d1.B::getx()<<endl; cout<<"d1.C::gety() cout<<d1.C::gety()<<endl; cout<<"d1.B::gety() cout<<d1.B::gety()<<endl; getch(); } A::A(float, float) B::B(float, float) C::C(float, float) D::D(float,float); D d(2,3) d.C::getx() = 2 d.B::getx() = 2 d.C::gety() = 3 d.B::gety() = 3 D d1(10,20); A::A(float, float)

= = =

"; "; ";

= = = =

"; "; "; ";

B::B(float, float) C::C(float, float) D::D(float,float); d1.C::getx() = 10 d1.B::getx() = 10 d1.C::gety() = 20 d1.B::gety() = 20 tnh hung khc:
E

G (virtual F)

H (virtual F)

th t thc hin cc hm thit lp l: E, F, G, H, I. Ta xt chng trnh sau: V d 5.16 /*mulinher4.cpp Solution to multiple inheritance*/ #include <iostream.h> #include <conio.h> class O { float o; public: O(float oo) { cout<<"O::O(float)\n"; o = oo;

} }; class A :public O{ float x,y; public: A(float oo,float ox, float oy):O(oo) { cout<<"A::A(float, float, float)\n"; x = ox; y = oy; } float getx() { return x; } float gety() { return y; } }; class B : public virtual A { public: B(float oo,float A(oo,ox,oy) { } }; class C : public virtual A { public: C(float oo, oy):A(oo,ox,oy) { } float ox, float ox, float oy) :

cout<<"B::B(float, float, float)\n";

cout<<"C::C(float, float, float)\n";

}; class D : public B, public C { public: D(float oo, float ox, float oy) : A(oo,ox,oy),B(oo,10,4),C(oo,1,1) { cout<<"D::D(float, float);\n"; } }; void main() { clrscr(); D d(2,3,5); cout<<"D d(2,3,5)\n"; cout<<"d.C::getx() cout<<d.C::getx()<<endl; cout<<"d.B::getx() cout<<d.B::getx()<<endl; cout<<"d.C::gety() cout<<d.C::gety()<<endl; cout<<"d.B::gety() cout<<d.B::gety()<<endl; cout<<"D d1(10,20,30);\n"; D d1(10,20,30); cout<<"d1.C::getx() cout<<d1.C::getx()<<endl; cout<<"d1.B::getx() cout<<d1.B::getx()<<endl; cout<<"d1.C::gety() cout<<d1.C::gety()<<endl; = = = "; "; "; = = = = "; "; "; "; float,

cout<<"d1.B::gety() cout<<d1.B::gety()<<endl; getch(); } O::O(float) A::A(float, float, float) B::B(float, float, float) C::C(float, float, float) D::D(float, float, float); D d(2,3,5) d.C::getx() = 3 d.B::getx() = 3 d.C::gety() = 5 d.B::gety() = 5 D d1(10,20,30); O::O(float) A::A(float, float, float) B::B(float, float, float) C::C(float, float, float) D::D(float, float, float); d1.C::getx() = 20 d1.B::getx() = 20 d1.C::gety() = 30 d1.B::gety() = 30 37.4

";

Danh sch mc ni cc i tng

Trong phn ny, chng ta a ra cch xy dng mt lp, cho php qun l mt danh sch mc ni cc i tng kiu point. Cc cng vic cn phi lm l thit k mt lp c bit qun l danh sch mc ni c lp

vi kiu i tng lin quan. Mt lp nh vy hon ton mang ngha tru tng, cng vi point s l lp tha k cho mt lp dn xut cha danh sch mc ni. Xy dng lp tru tng Ta gii hn xy dng mt danh sch mc ni n gin, vi cc phn t c hai thnh phn: thnh phn d liu v thnh phn con tr, ch ti phn t i tip sau. S ca danh sch nh vy c dng nh sau:

info1

info2

info3

y Head l con tr i tng, ch n phn t u tin ca danh sch mc ni. Tuy nhin, c th thng tin tng ng vi mi thnh phn trong danh sch cha c bit nn biu th mi infoi ta dng mt con tr ch ti mt i tng d liu no (void *). Ta c s nh sau:

Head

Head info1 info2 info3

y, mi phn t ca danh sch cha: [10]. Mt con tr n phn t tip theo,

[11]. Mt con tr n i tng cha thng tin lin quan. Cn lp list qun l danh sch s c t nht: [12]. mt thnh phn d liu: con tr n phn t u tin (Head), [13]. mt hm thnh phn c chc nng chn vo danh sch mt i tng ti mt a ch no . Ch rng a ch ny phi c kiu void * m bo s tng thch vi cc kiu d liu khc nhau. C th hnh dung s b lp list c khai bo nh sau: struct element sch list { void *content; tu }; class list { element *head; u tin public: list(); //hm thit lp ~list();//hm hu b void add(void *); //thm mt phn t vo u danh sch .... }; qun l danh sch ta c th thm cc chc nng x l khc nh: //con tr n phn t //cu trc mt phn t ca danh

element *next; //con tr n thnh phn i sau //con tr n mt i tng

[14]. Hin th cc i tng c ch bi danh sch [15]. Tm kim mt phn t [16]. Xo mt phn t v.v... Cc thao tc ny c th c thc hin trc tip trn list nhng nhm mc ch che du v do c im ca cc thng tin trong mi phn t ta u khng bit, nn tt nht l cho cc hm thnh phn thc hin. Cc thao tc trn danh sch c nu ra trn u gn vi c ch duyt danh sch. Vic duyt ny cn phi c kim sot t bn ngoi danh sch nhng c th da trn cc thnh phn hm c s l: [17]. Khi to vic duyt, [18]. Chuyn sang phn t tip theo. Hai hm thnh phn ny u dng tham s l con tr n phn t hin ti, ta t tn cho n l current. Ngoi ra, hai hm thnh phn trn s tr v cc thng tin lin quan phn t hin ti, c th la chn: [19]. a ch ca phn t hin ti, kiu l element* [20]. a ch ca i tng hin ti, c kiu content* [21]. Ni dung d liu ca phn t hin ti. Gii php u bao hm gii php th hai bi l nu ptr l a ch ca phn t hin ti trong danh sch, ptr>content s cho a ch ca i tng d liu tng ng. Nhng thc t ngi lp trnh khng c quyn truy nhp n cc phn t ca danh sch list. Cn gii php th 3 lm mt kh nng kim tra cc phn t ca danh sch v thay i chng bi l ch vi ni dung d liu ca phn t hin ti, ta khng th truy nhp ti cc phn t tip theo. y, ta chn gii php th 2. Trong trng hp ny, ngi ta vn cha th pht hin phn t cui danh sch. Do vy ta s a vo mt hm thnh phn b sung cho php kim tra liu gp cui danh sch hay cha.

Theo cc phn tch trn, ta s dng thm ba hm thnh phn: void *first(); void *prochain(); int last(); Sau y l nh ngha ca lp tru tng list: V d 5.17 #include <stddef.h>// nh ngha NULL //class list struct element { element *next; void *content; }; class list { element *head; element *current; public: list() { head=NULL;current=head; } ~list(); void add(void *) void first() {current=head;} void *prochain(){ void *adel =NULL;

if (current !=NULL) { adel =current->content; current=current->next; } return adel; } int last() {return (current==NULL);} }; list::~list() { element *suiv; current=head; while(current!=NULL) {suiv=current->next;delete current;current=suiv;} } void list::add(void *chose) adel->next =head; adel->content=chose; head=adel; } Gi s lp point c nh ngha nh sau: #include <iostream.h> class point { int x,y; public: point(int {x=abs;y=ord;} abs=0,int ord=0) { element *adel= new element;

void display() {cout <<" Toa do : "<<x<," "<<y<<"\n";} }; Ta nh ngha mt lp mi list_points tha k t list v point, cho php qun l danh sch mc ni cc i tng point nh sau: class point { public: list_points() {} void display(); }; void list_points::display() { first(); while (!last()) { point *ptr=(point *)prochain();ptr>display();} } Sau y l chng trnh hon chnh: V d 5.18 /*list_hom.cpp homogenous list*/ #include <iostream.h> #include <stddef.h>//de dinh nghia NULL #include <conio.h> //class list struct element { list_points :public list,public

element *next; void *content; }; class list { element *head; element *current; public: list() { head=NULL;current=head; } ~list(); void add(void *); current=head;} void *nextelement() { void *adel =NULL; if (current !=NULL) { adel =current->content; current=current->next; } return adel; } int (current==NULL);} }; list::~list() { element *suiv; current=head; while(current!=NULL) { last() {return void first() {

suiv=current->next; delete current; current=suiv; } } void list::add(void *chose) { element *adel= new element; adel->next =head; adel->content=chose; head=adel; } class point { int x,y; public: point (int abs=0,int ord=0){ x=abs; y=ord; } void display(){ cout<<" Toa do : "<<x<<" "<<y<<"\n"; } }; class point list_points { list_points() {} void display(); }; void list_points::display() { :public list,public

public:

first(); while (!last()) { point *)nextelement(); ptr->display(); } } void main() { clrscr(); list_points l; point a(2,3),b(5,9),c(0,8); l.add(&a); l.display();cout<<"------------\n"; l.add(&b); l.display();cout<<"------------\n"; l.add(&c); l.display();cout<<"------------\n"; getch(); } Toa do : 2 3 ------------Toa do : 5 9 Toa do : 2 3 ------------Toa do : 0 8 Toa do : 5 9 Toa do : 2 3 ------------*ptr=(point

37.5

To danh sch mc ni khng ng nht

Phn trc xt v d v danh sch mc ni ng nht. V nguyn tc, cc phn t trong danh sch c th cha cc thng tin bt k-danh sch khng ng nht. Vn ch phc tp khi ta hin th cc thng tin d liu lin quan, v khi ta hon ton khng bit c thng tin v kiu i tng khi khai bo tham tr (c th xem li hm display_list() thy r hn). Khi nim lp tru tng v hm o cho php ta xy dng thm mt lp dng lm c s cho cc lp c i tng tham gia danh sch mc ni. Trong khai bo ca lp c s ny, c mt hm thnh phn o s c nh ngha li trong cc lp dn xut. Cc hm ny c chc nng (trong cc lp c s ) hin th cc thng tin lin quan n i tng tng ng ca mt lp. n y, nh khai bo mt tham tr n lp c s ny, mi vn truy nhp n cc hm hin th thng tin v tng thnh phn s khng cn kh khn na. Sau y l mt chng trnh minh ho cho nhn xt trn. Trong chng trnh ny, lp c s chung cho cc lp dng lm kiu d liu cho cc thnh phn ca danh sch ch c dng khai bo con tr gi ti cc thnh phn hm hin th, nn tt nht ta l khai bo hm nh l hm o thun tu v lp tng ng s l lp tru tng. V d 5.19 /*list_hete.cpp heterogenous list*/ #include <iostream.h> #include <stddef.h> #include <conio.h> //lp tru tng class mere { public: //cha gi tr NULL

virtual void display() = 0 ; //hm o thun tu }; //lp qun l danh sch mc ni struct element //cu trc mt thnh phn ca danh sch { element *next;//ch n thnh phn i sau void *content; }; class list { element *head; element *current; public: list(){ head = NULL; current=head; } ~list(); void add(void *);//thm mt thnh phn vo u danh sch void first(){ current=head; } /*cho a ch ca phn t hin ti , xc nh thnh phn tip theo*/ void *nextelement() { void *adnext=NULL; //ch n mt i tng bt k

if (current !=NULL) { adnext=current->content; current=current->next; } return adnext; } /*lit k tt c cc phn t trong danh sch*/ void display_list(); int last() {return (current==NULL);} }; list::~list() { element *suiv; current = head; while(current !=NULL) suiv =current->next; delete current; current=suiv; } } void list::add(void * chose) adel->next = head; adel->content = chose; head = adel; } void list::display_list() { { element *adel = new element; {

mere *ptr ;//ch phi l mere* chu khong phai void * first();//in t u danh sch while (!last() ) ptr->display(); } } //lp im class point : public mere { int x,y; public: point(int abs {x=abs;y=ord;} void display() {cout << "<<y<<"\n";} }; //lp s phc class complexe :public mere { double reel,imag; public: complexe(double =r; imag=i;} void display(){ cout<<" So "<<imag<<"i\n"; } }; phuc : "<<reel<<" + r=0,double i=0) {reel "Toa do : "<<x<<" =0, int ord =0) { ptr =(mere *) nextelement();

//chng trnh th void main() { clrscr(); list l; point a(2,3),b(5,9); complexe x(4.5,2.7), y(2.35,4.86); l.add(&a); l.add(&x); l.display_list(); cout<<"----------------\n"; l.add(&y); l.add(&b); l.display_list(); getch(); } So phuc : 4.5 + 2.7i Toa do : 2 3 ---------------Toa do : 5 9 So phuc : 2.35 + 4.86i So phuc : 4.5 + 2.7i Toa do : 2 3

38. Tm tt 38.1 Ghi nh Tha k nng cao kh nng s dng li ca cc on m chng trnh. Ngi lp trnh c th khai bo lp mi tha k d liu v hm thnh phn t mt lp c s c nh ngha trc . Ta gi lp mi l lp dn xut. Trong n tha k, mt lp ch c th c mt lp c s. Trong a tha k cho php mt lp l dn xut ca nhiu lp. Lp dn xut thng b sung thm cc thnh phn d liu v cc hm thnh phn trong nh ngha, ta ni lp dn xut c th hn so vi lp c s v v vy thng m t mt lp cc i tng c phm vi hp hn lp c s. Lp dn xut khng c quyn truy nhp n cc thnh phn private ca lp c s. Tuy nhin lp c s c quyn truy xut n cc thnh phn cng cng v c bo v (protected). Hm thit lp ca lp dn xut thng t ng gi cc hm thit lp ca cc lp c s khi to gi tr cho cc thnh phn trong lp c s. Hm hu b c gi theo th t ngc li. Thuc tnh truy nhp protected l mc trung gian gia thuc tnh public v private. Ch c cc hm thnh phn v hm bn ca lp c s v lp dn xut c quyn truy xut n cc thnh phn protected ca lp c s. C th nh ngha li cc thnh phn ca lp c s trong lp dn xut khi thnh phn khng cn ph hp trong lp dn xut. C th gn ni dung i tng lp dn xut cho mt i tng lp c s. Mt con tr lp dn xut c th chuyn i thnh con tr lp c s.

Hm o c khai bo vi t kho virtual trong lp c s. Cc lp dn xut c th a ra cc ci t li cho cc hm o ca lp c s nu mun, tri li chng c th s dng nh ngha nu trong lp c s. Nu hm o c gi bng cch tham chiu qua tn mt i tng th tham chiu c xc nh da trn lp ca i tng tng ng. Mt lp c hm o khng c nh ngha (hm o thun tu) c gi l lp tru tng. Cc lp tru tng khng th dng khai bo cc i tng nhng c th khai bo con tr c kiu lp tru tng. Tnh a hnh l kh nng cc i tng ca cc lp khc nhau c quan h tha k phn ng khc nhau i vi cng mt li gi hm thnh phn. Tnh a hnh c ci t da trn hm o. Khi mt yu cu c a ra thng qua con tr lp c s tham chiu n hm o, C++ la chn hm thch hp trong lp dn xut thch hp gn vi i tng ang c tr ti. Thng qua vic s dng hm o v tnh a hnh, mt li gi hm thnh phn c th c nhng hnh ng khc nhau da vo kiu ca i tng nhn c li gi. 38.2 Cc li thng gp Cho con tr lp dn xut ch n i tng lp c s v gi ti cc hm thnh phn khng c trong lp c s. nh ngha li trong lp dn xut mt hm o trong lp c s m khng m bo chc chn rng phin bn mi ca hm trong lp dn xut cng tr v cng gi tr nh phin bn c ca hm. Khai bo i tng ca lp tru tng. Khai bo hm thit lp l hm o.

38.3

Mt s thi quen lp trnh tt

Khi tha k cc kh nng khng cn thit trong lp dn xut, tt nht nn nh ngha li chng. 39. Bi tp Bi 5.1. M phng cc thao tc trn mt cy nh phn tm kim vi ni dung ti mi nt l mt s nguyn. Bi 5.2. M phng hot ng ca ngn xp, hng i cy nh phn di dng danh sch mc ni s dng m hnh lp.

1. Gii thiu chung .................................................... 233 2. n tha k ........................................................... 238 2.1 V d minh ho................................................... 238 2.2 Truy nhp cc thnh phn ca lp c s t lp dn xut ........................................................................... 241 2.3 nh ngha li cc thnh phn ca lp c s trong lp dn xut .............................................................. 241 2.4 Tnh tha k trong lp dn xut ......................... 243
2.4.1 S tng thch ca i tng thuc lp dn xut vi i tng thuc lp c s ......................................................................... 243 2.4.2 2.4.3 c s 2.5.1 2.5.2 2.5.3 2.6.1 2.6.2 2.6.3 Tng thch gia con tr lp dn xut v con tr lp c s 245 Tng thch gia tham chiu lp dn xut v tham chiu lp 248 Hm thit lp trong lp ..................................................... 250 Phn cp li gi................................................................. 252 Hm thit lp sao chp...................................................... 254 Dn xut public ................................................................ 260 Dn xut private ............................................................... 260 Dn xut protected .......................................................... 261

2.5 Hm thit lp trong lp dn xut ....................... 250

2.6 Cc kiu dn xut khc nhau. ............................ 260

Bng tng kt cc kiu dn xut......................................................... 261

3. Hm o v tnh a hnh ......................................... 262 3.1 t vn .......................................................... 262 3.2 Tng qut v hm o.......................................... 270
3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 Phm vi ca khai bo virtual ........................................... 270 Khng nht thit phi nh ngha li hm virtual ............. 276 nh ngha chng hm o ................................................. 280 Khai bo hm o mt lp bt k trong s tha k .... 280 Hm hu b o .................................................................. 284

3.3 Lp tru tng v hm o thun tu .................. 289

4. a tha k.............................................................. 290 4.1 t vn .......................................................... 290 4.2 Lp c s o ....................................................... 296 4.3 Hm thit lp v hu b - vi lp o.................. 300 4.4 Danh sch mc ni cc i tng...................... 307
Xy dng lp tru tng..................................................................... 308

4.5 To danh sch mc ni khng ng nht .......... 317 5. Tm tt .................................................................. 322 5.1 Ghi nh............................................................... 322 5.2 Cc li thng gp ............................................. 323 5.3 Mt s thi quen lp trnh tt ............................ 324 6. Bi tp.................................................................... 324

Chng 6 khun hnh (Template) Mc ch chng ny: 69) Hiu c li ch ca vic s dng khun hnh hm v khun hnh lp vit chng trnh. 70) Bit cch to v s dng mt khun hnh hm v khun hnh lp. 71) Khi nim cc tham s kiu v cc tham s biu thc trong khun hnh hm, khun hnh lp. 72) nh ngha chng khun hnh hm. 73) C th ho mt khun hnh hm, mt hm thnh phn ca khun hnh lp. 74) Thut ton sn sinh mt th hin hm (hm th hin) ca mt khun hnh hm 75) Cc vn khc ca lp trnh hng i tng lin quan n khun hnh lp. 40. Khun hnh hm 40.1 Khun hnh hm l g? Ta bit nh ngha chng hm cho php dng mt tn duy nht cho nhiu hm thc hin cc cng vic khc nhau. Khi nim khun hnh hm cng cho php s dng cng mt tn duy nht thc hin cc cng vic khc nhau, tuy nhin so vi nh ngha chng hm, n c phn mnh hn v cht ch hn; mnh hn v ch cn vit nh ngha khun hnh hm mt ln, ri sau chng trnh bin dch lm cho n thch ng vi cc kiu d liu khc nhau; cht ch hn bi v da theo khun hnh hm, tt c cc hm th hin c sinh ra bi trnh bin dch s tng ng vi cng mt nh ngha v nh vy s c cng mt gii thut.

40.2

To mt khun hnh hm

Gi thit rng chng ta cn vit mt hm min a ra gi tr nh nht trong hai gi tr c cng kiu. Ta c th vit mt nh ngha nh th i vi kiu int nh sau: int min (int a, int b) { if (a < b) return a; else return b; } Gi s, ta li phi vit nh ngha hm min() cho kiu double,float,char,char*... float min(float a, float b) { if (a < b) return a; else b; } Nu tip tc nh vy, s c khuynh hng phi vit rt nhiu nh ngha hm hon ton tng t nhau; ch c kiu d liu cc tham s l thay i. Cc chng trnh bin dch C++ hin c cho php gii quyt n gin vn trn bng cch nh ngha mt khun hnh hm duy nht theo cch nh sau: #include <iostream.h> //to mt khun hnh hm template <class T> T min(T a, T b) { if (a < b) return a; else return b; } So snh vi nh ngha hm thng thng, ta thy ch c dng u tin b thay i: template <class T> T min (T a, T b) trong

template<class T> xc nh rng l mt khun hnh vi mt tham s kiu T; Phn cn li T min(T a, T b) ni rng, min() l mt hm vi hai tham s hnh thc kiu T v c gi tr tr v cng l kiu T. 40.3 S dng khun hnh hm

40.3.1 Khun hnh hm cho kiu d liu c s s dng khun hnh hm min() va to ra, ch cn s dng hm min() trong nhng iu kin ph hp ( y c ngha l hai tham s ca hm c cng kiu d liu). Nh vy, nu trong mt chng trnh c hai tham s nguyn n v p, vi li gi min(n,p) chng trnh bin dch s t ng sn sinh ra hm min() (ta gi l mt hm th hin) tng ng vi hai tham s kiu nguyn int. Nu chng ta gi min() vi hai tham s kiu float, chng trnh bin dch cng s t ng sn sinh mt hm th hin min khc tng ng vi cc tham s kiu float v c th. Sau y l mt v d hon chnh: V d 6.1 /*template1.cpp*/ #include <iostream.h> #include <conio.h> //to mt khun hnh hm template <class T> T min(T a, T b) { if ( a < b) return a; else return b; } //v d s dng khun hnh hm min void main() {

clrscr(); int n = 4, p = 12; float x = 2.5, y= 3.25; cout<<"min (n, p) p)<<"\n";//int min(int, int) = "<<min "<<min (n, (x,

cout<<"min (x, y) = y)<<"\n";//float min(float, float) getch(); } min(n, p) = 4 min(x, y) = 2.5

40.3.2 Khun hnh hm min cho kiu char * /*template2.cpp*/ #include <iostream.h> #include <conio.h> template <class T> T min (T a, T b) { if (a < b) return a; else return b; } void main() { clrscr(); char * adr1 = "DHBK"; char * adr2 = "CDSD"; cout << "min (adr1, adr2) ="<<min (adr1, adr2); getch(); } min (adr1, adr2) = DHBK

Kt qu kh th v v ta hy vng hm min() tr v xu "CDSD". Thc t, vi biu thc min(adr1, adr2) , chng trnh bin dch sinh ra hm th hin sau y: char * min(char * a, char * b) { if (a < b) return a; else return b; } Vic so snh a < b thc hin trn cc gi tr bin tr ( y trong cc khun hnh my PC ta lun lun c a < b). Ngc li vic hin th thc hin bi ton t << s a ra xu k t tr bi con tr k t. 40.3.3 Khun hnh hm min vi kiu d liu lp p dng khun hnh hm min() trn vi kiu lp, cn phi nh ngha lp sao cho c th p dng php ton so snh < vi cc i tng ca lp ny, ngha l ta phi nh ngha mt hm ton t operator < cho lp. Sau y l mt v d minh ho: V d 6.2 /*template3.cpp*/ #include <iostream.h> #include <conio.h> //khun hnh hm min template <class T> T min( T a, T b) { if (a < b) return a; else return b; } //lp vect class vect { int x, y; public:

vect(int abs =0, int ord = 0) { x= abs, y= ord;} void display() "<<y<<"\n"; } }; int operator < (vect a, vect b) { return a.x*a.x + a.y*a.y < b.x*b.x + b.y*b.y; } void main() { clrscr(); vect u(3,2),v(4,1); cout<<"min (u, v) = "; min(u,v).display(); getch(); } min (u, v) = 3 2 Nu ta p dng khun hnh hm min() i vi mt lp m cha nh ngha ton t <, chng trnh bin dch s a ra mt thng bo li tng t nh vic nh ngha mt hm min() cho kiu lp . 40.4 Cc tham s kiu ca khun hnh hm Phn ny trnh by cch a vo cc tham s kiu trong mt khun hnh hm, chng trnh bin dch sn sinh mt hm th hin. 40.4.1 Cc tham s kiu trong nh ngha khun hnh hm Mt cch tng qut, khun hnh hm c th c mt hay nhiu tham s kiu, vi mi tham s ny c t kho { cout <<x<<"

friend int operator < (vect , vect);

class i lin trc, chng hn nh: template <class T, class U> int fct (T a, T *b, U c) {... } Cc tham s ny c th bt k u trong nh ngha ca khun hnh hm, ngha l: Trong dng tiu ( nh ch ra trong v d trn). Trong cc khai bo cc bin cc b. [22]. Trong cc ch th thc hin. Chng hn: template <class T, class U> int fct (T a, T *b, U c) { T x; //bin cc b x kiu T U *adr; //bin cc b adr kiu U * ... adr = new T [10];//cp pht mt mng 10 thnh phn kiu T ... n = sizeof (T); } Ta xem chng trnh sau: V d 6.3 /*templat4.cpp*/ #include <iostream.h> #include <conio.h> template <class T, class U> T fct(T x, U y, T z) { return x + y + z; } void main() { clrscr(); int n= 1, p = 2, q = 3;

float x =2.5, y = 5.0; cout <<fct( n, x, p)<<"\n";// (int) 5 cout <<fct(x, n, y)<<"\n"; // (float)8.5 cout <<fct(n, p, q)<<"\n"; // (int) 6 //cout <<fct(n, p, x)<<"\n"; // li getch(); } Trong mi trng hp, mi tham s kiu phi xut hin t nht mt ln trong khai bo danh sch cc tham s hnh thc ca khun hnh hm. iu hon ton logic bi v nh cc tham s ny, chng trnh dch mi c th sn sinh ra hm th hin cn thit. iu g s xy ra nu trong danh sch cc tham s ca khun hnh hm khng c cc tham s kiu? Hin nhin khi chng trnh dch khng th xc nh cc tham s kiu d liu thc ng vi cc tham s kiu hnh thc trong template<...>. Khun hnh hm sau y thc hin trao i ni dung ca hai bin. V d 6.4 /*templat5.cpp*/ #include <iostream.h> #include <conio.h> //nh ngha khun hnh hm i ch ni dung hai bin vi kiu bt k template <class X> void swap(X &a, X &b) { X temp; temp=a; a=b; b=temp; }

void main() { clrscr(); int i=10, j=20; float x=10.1, y=23.1; cout<<"I J ban dau: "<<i<<" "<<j<<endl; cout<<"X Y ban dau: "<<x<<" "<<y<<endl; swap(i,j);//i ch hai s nguyn swap(x,y); //i ch hai s nguyn cout<<"I J "<<j<<endl; cout<<"X Y "<<y<<endl; getch(); } I J ban dau: 10 20 X Y ban dau: 10.1 23.1 I J sau khi doi cho: 20 10 X Y sau khi doi cho: 23.1 10.1 40.5 Gii thut sn sinh mt hm th hin Tr li khun hnh hm min(): template <class T> T min(T a, T b) { if (a < b) return a; else return b; } Vi cc khai bo: int n; char c; sau sau khi khi doi doi cho: cho: "<<i<<" "<<x<<"

cu hi t ra l: chng trnh dch s lm g khi gp li gi kiu nh l min(n,c)? Cu tr li da trn hai nguyn tc sau y: [23]. C++ quy nh phi c mt s tng ng chnh xc gia kiu ca tham s hnh thc v kiu tham s thc s c truyn cho hm, tc l ta ch c th s dng khun hnh hm min() trong cc li gi vi hai tham s c cng kiu. Li gi min(n, c) khng c chp nhn v s gy ra li bin dch. [24]. C++ thm ch cn khng cho php cc chuyn kiu thng thng nh l: T thnh const T hay T[] thnh T * , nhng trng hp hon ton c php trong nh ngha chng hm. Ta tham kho on chng trnh sau y: int n; char c; unsigned int q; const int r = 10; int t[10]; int *adi; ... min (n, c) //li min (n, q) //li min (n, r) //li min (t, adi) //li 40.6 Khi to cc bin c kiu d liu chun

Trong khun hnh hm, tham s kiu c th tng ng khi th mt kiu d liu chun, khi th mt kiu d liu lp. S lm g khi ta cn phi khai bo bn trong khun hnh hm mt i tng v truyn mt hay nhiu tham s cho hm thit lp ca lp. Xem v d sau y:

template <class T> fct(T a) { T x(3);//x l mt i tng cc b kiu T m chng ta xy dng bng cch //truyn gi tr 3 cho hm thit lp ... } Khi s dng hm fct() cho mt kiu d liu lp, mi vic u tt p. Ngc li, nu chng ta c gng p dng cho mt kiu d liu chun, chng hn nh int, khi chng trnh dch sn sinh ra hm sau y: fct( int a) { int x(3); ... } cho ch th int x(3) ; khng gy ra li, C++ ngm hiu cu lnh nh l php khi to bin x vi gi tr 3, ngha l: int x = 3; Mt cch tng t: double x(3.5); //thay v double x = 3.5; char c('e'); //thay v char c = 'e'; 40.7 Cc hn ch ca khun hnh hm

V nguyn tc, khi nh ngha mt khun hnh hm, mt tham s kiu c th tng ng vi bt k kiu d liu no, cho d l mt kiu chun hay mt kiu lp do ngi dng nh ngha. Do vy khng th hn ch vic th hin i vi mt s kiu d liu c th no . Chng hn, nu mt khun hnh hm c dng u tin: template <class T> void fct(T) chng ta c th gi fct() vi mt tham s vi kiu bt k: int, float, int *,int **, t * (t l mt kiu d liu no y)

Tuy nhin, chnh nh ngha bn trong khun hnh hm li cha mt s yu t c th lm cho vic sn sinh hm th hin khng ng nh mong mun. Ta gi l cc hn ch ca cc khun hnh hm. u tin, chng ta c th cho rng mt tham s kiu c th tng ng vi mt con tr. Do , vi dng tiu : template <class T> void fct(T *) ta ch c th gi fct() vi mt con tr n mt kiu no : int*, int **, t *, t **. Trong cc trng hp khc, s gy ra cc li bin dch. Ngoi ra, trong nh ngha ca mt khun hnh hm, c th c cc ch th khng thch hp i vi mt s kiu d liu nht nh. Chng hn, khun hnh hm: template <class T> T min(T a, T b) { if (a < b) return a; else return b; } khng th dng c nu T tng ng vi mt kiu lp trong php ton < khng c nh ngha chng. Mt cch tng t vi mt khun hnh hm kiu: template <class T> void fct(T) { ... T x(2, 5); /*i tng cc b c khi to bng mt hm thit lp vi hai tham s*/ } khng th p dng cho cc kiu d liu lp khng c hm thit lp vi hai tham s. Tm li, mc d khng tn ti mt c ch hnh thc hn ch kh nng p dng ca cc khun hnh hm, nhng bn trong mi mt khun hnh hm u c cha

nhng nhn t ngi ta c th bit c khun hnh hm c th c p dng n mc no. 40.8 Cc tham s biu thc ca mt khun hnh hm Trong nh ngha ca mt khun hnh hm c th khai bo cc tham s hnh thc vi kiu xc nh. Ta gi chng l cc tham s biu thc. Chng trnh templat6.cpp sau y nh ngha mt khun hnh hm cho php m s lng cc phn t nul (0 i vi cc gi tr s hoc NULL nu l con tr) trong mt bng vi kiu bt k v kch thc no : V d 6.5 /*templat6.cpp*/ #include <iostream.h> #include <conio.h> template <class T> int compte(T * tab, int n) { int i, nz = 0; for (i=0; i<n; i++) if (!tab[i]) nz++; return nz; } void main() { clrscr(); int t[5] = {5, 2, 0, 2, 0}; char c[6] = { 0, 12, 0, 0, 0}; cout<<" 5)<<"\n"; compte (t) = "<<compte(t, (c) =

cout<<" compte "<<compte(c,6)<<"\n";

getch(); } compte (t) = 2 compte (c) = 4 Ta c th ni rng khun hnh hm compte nh ngha mt h cc hm compte trong kiu ca tham s u tin l tu (c xc nh bi li gi), cn kiu ca tham s th hai xc nh (kiu int).

40.9

nh ngha chng cc khun hnh hm

Ging nh vic nh ngha chng cc hm thng thng, C++ cho php nh ngha chng cc khun hnh hm, tc l c th nh ngha mt hay nhiu khun hnh hm c cng tn nhng vi cc tham s khc nhau. iu s to ra nhiu h cc hm (mi khun hnh hm tng ng vi mt h cc hm). V d c ba h hm min: [25]. H th nht bao gm cc hm tm gi tr nh nht trong hai gi tr, [26]. H th hai tm s nh nht trong ba s, [27]. H th ba tm s nh nht trong mt mng. V d 6.6 /*templat7.cpp*/ #include <iostream.h> #include <conio.h> //khun hnh 1 template <class T> T min(T a, T b) { if (a < b) return a; else return b; } //khun hnh 2 template <class T> T min(T a, T b, T c) { return min (min (a, b), c); } //khun hnh 3 template <class T> T min (T *t, int n) { T res = t[0]; for(int i = 1; i < n; i++) if (res > t[i])

res = t[i]; return res; } void main() { clrscr(); int n = 12, p = 15, q = 2; float x = 3.5, y = 4.25, z = 0.25; int t[6] = {2, 3, 4,-1, 21}; char c[4] = {'w', 'q', 'a', 'Q'}; cout<<min(n,p) = <<min(n,p)<<"\n"; // khun hnh 1 int min(int, int) cout<<min(n,p,q) = <<min(n,p,q)<<"\n";//khun hnh 2 int min(int,int,int) cout<<min(x,y) = <<min(x,y)<<"\n"; // khun hnh 1 float min(float, float) cout<<min(x,y,z) = <<min(x,y,z)<<"\n";// khun hnh 2 float min(float,float, float) cout<<min(t,6) = <<min(t,6)<<"\n"; // khun hnh 3 int min(int *, int) cout<<min(c,4) = <<min(c,4)<<"\n"; // khun hnh 3 char min(char *, int) getch(); } min(n,p) = 12 min(n,p,q) = 2 min(x,y) = 3.5 min(x,y,z) = 0.25 min(t,6) = -1

min(c,4) = Q Nhn xt Cng ging nh nh ngha chng cc hm, vic nh ngha chng cc khun hnh hm c th gy ra s nhp nhng trong vic sn sinh cc hm th hin. Chng hn vi bn h hm sau y: template <class T> T fct(T, T) {...} template <class T> T fct(T *, T) {...} template <class T> T fct(T, T*) {...} template <claas T> T fct(T *, T*) {...} Xt cc cu lnh sau y: int x; int y;

Li gi fct(&x, &y) c th tng ng vi khun hnh hm 1 hay khun hnh hm 4. 40.10 C th ho cc hm th hin Mt khun hnh hm nh ngha mt h cc hm da trn mt nh ngha chung, ni cch khc chng thc hin theo cng mt gii thut. Trong mt s trng hp, s tng qut ny c th chu ri ro, chng hn nh trong trng hp p dng khun hnh hm min cho kiu char* nh ni trn. Khi nim c th ho, a ra mt gii php khc phc cc ri ro kiu nh trn. C++ cho php ta cung cp, ngoi nh ngha ca mt khun hnh hm, nh ngha ca mt s cc hm cho mt s kiu d liu ca tham s. Ta xt chng trnh v d sau y: V d 6.7 /*templat8.cpp*/ #include <iostream.h> #include <string.h> #include <conio.h> //khun hnh hm min template <class T> T min (T a, T b) { if (a < b) return a; else return b; } //hm min cho kiu xu k t char * min (char *cha, char *chb) { if (strcmp(cha, chb) <0) return cha; else return chb; }

void main() { clrscr(); int n= 12, p = 15; char *adr1= "DHBK", *adr2 ="CD2D"; cout<<"min(n, p) = "<<min(n, p)<<"\n"; //khun hnh hm cout<<"min(adr1,adr2) = "<<min(adr1,adr2)<<endl; //hm char * min (char *, //char *) getch(); } min(n, p) = 12 min(adr1,adr2) = CD2D Nh vy, bn cht ca c th ho khun hnh hm l nh ngha cc hm thng thng c cng tn vi khun hnh hm gii quyt mt s trng hp ri ro khi ta p dng khun hnh hm cho mt s kiu d liu c bit no . 40.11 Tng kt v cc khun hnh hm Mt cch tng qut, ta c th nh ngha mt hay nhiu khun hnh cng tn, mi khun hnh c cc tham s kiu cng nh l cc tham s biu thc ring. Hn na, c th cung cp cc hm thng thng vi cng tn vi mt khun hnh hm; trong trng hp ny ta ni l s c th ho mt hm th hin. Trong trng hp tng qut khi c ng thi c hm nh ngha chng v khun hnh hm, chng trnh dch la chn hm tng ng vi mt li gi hm da trn cc nguyn tc sau y:

[28]. u tin, kim tra tt c cc hm thng thng cng tn v ch n s tng ng chnh xc; nu ch c mt hm ph hp, hm c chn; cn nu c nhiu hm cng tho mn (c s nhp nhng) s to ra mt li bin dch v qu trnh tm kim b gin on. [29]. Nu khng c hm thng thng no tng ng chnh xc vi li gi, khi ta kim tra tt c cc khun hnh hm c cng tn vi li gi; nu ch c mt tng ng chnh xc c tm thy, hm th hin tng ng c sn sinh v vn c gii quyt; cn nu c nhiu hn mt khun hnh hm( c s nhp nhng) iu s gy ra li bin dch v qu trnh tm kim b ngt. [30]. Cui cng, nu khng c khun hnh hm ph hp, ta kim tra mt ln na tt c cc hm thng thng cng tn vi li goi. Trong trng hp ny chng ta phi tm kim s tng ng da vo c cc chuyn kiu cho php trong C/C++. 41. KHUN hnh lp 41.1 Khun hnh lp l g? Bn cnh khi nim khun hnh hm, C++ cn cho php nh ngha khun hnh lp. Cng ging nh khun hnh hm, y ta ch cn vit nh ngha cc khun hnh lp mt ln ri sau c th p dng chng vi cc kiu d liu khc nhau c cc lp th hin khc nhau. 41.2 To mt khun hnh lp Ta thng to ra lp point theo kiu ( y ta b qua nh ngha ca cc hm thnh phn ): class point { int x, y; public: point (int abs =0, int ord =0);

void display(); //... }; Trong v d ny, ta nh ngha mt lp cc im c to nguyn. Nu mun to im c kiu d liu khc (float, double, long, unsigned int) ta phi nh ngha mt lp khc bng cch thay th, trong nh ngha lp point, t kho int bng t kho tng ng vi kiu d liu mong mun. trnh s trng lp trong cc tnh hung nh trn, chng trnh dch C++ cho php nh ngha mt khun hnh lp v sau , p dng khun hnh lp ny vi cc kiu d liu khc nhau thu c cc lp th hin nh mong mun: template <class T> class point { T x; T y; public: point (T abs=0, T ord=0); void display(); }; Cng ging nh cc khun hnh hm, tp hp template<class T> xc nh rng l mt khun hnh trong c mt tham s kiu T; Cng cn phi nhc li rng, C++ s dng t kho class ch ni rng T i din cho mt kiu d liu no . Tip theo y ta bn n vic nh ngha cc hm thnh phn ca khun hnh lp. Ngi ta phn bit hai trng hp: (i) Khi hm thnh phn c nh ngha bn trong nh ngha lp trng hp ny khng c g thay i. Xt nh ngha hm thit lp sau y: template <class T> class point { T x; T y;

public: point(T abs=0, T ord=0) { x = abs; y = ord; } ... }; (ii) Ngc li, khi nh ngha ca hm thnh phn nm ngoi nh ngha lp, khi cn phi nhc li cho chng trnh dch bit: cc tham s kiu ca khun hnh lp, c ngha l phi nhc li: template <class T> trc nh ngha hm, cn tn ca khun hnh lp c vit nh l point<T> Tm li, dng tiu y cho hm thnh phn display() ca khun hnh hm point nh sau: template <class point<T>::display() T> void

Sau y l nh ngha y ca khun hnh lp point: #include <iostream.h> //to khun hnh hm template <class T> class point { T x, y; public: // nh ngha hm thnh phn bn trong khun hnh lp point(T abs = 0, T ord = 0) { x = abs; y = ord; } void display(); }; // nh ngha hm thnh phn bn ngoi khun hnh lp

template <class point<T>::display() { } 41.3 S dng khun hnh lp

T>

void

cout<<"Toa do: "<<x<<" "<<y<<"\n";

Mt khi khun hnh lp point c nh ngha, mt khai bo nh : point<int> ai; khai bo mt i tng ai c hai thnh phn to l kiu nguyn (int). iu c ngha l point<int> c vai tr nh mt kiu d liu lp; ngi ta gi n l mt lp th hin ca khun hnh lp point. Mt cch tng qut, khi p dng mt kiu d liu no vi khun hnh lp point ta s c c mt lp th hin tng ng vi kiu d liu. Nh vy: point<double> ad; nh ngha mt i tng ad c cc to l s thc; cn vi point<double> ng vai tr mt lp v c gi l mt lp th hin ca khun hnh lp point. Trong trng hp cn phi truyn cc tham s cho cc hm thit lp, ta lm bnh thng. V d: point<int> ai(3,5); point<double> ad(2.5,4.4); 41.4 V d s dng khun hnh lp

Ta xt v d sau: V d 6.8 /*templat9.cpp*/ #include <iostream.h> #include <conio.h>

//to mt khun hnh lp template <class T> class point { T x, y; public: point(T abs = 0, T ord = 0) { x = abs; y = ord; } void display() { cout<<"Toa do: "<<x<<" "<<y<<"\n"; } }; void main() { clrscr(); point<int> ai(3,5); ai.display(); point<char> ac('d','y'); ac.display(); point<double> ad.display(); getch(); } Toa do: 3 5 Toa do: d y Toa do: 3.5 2.3 41.5 Cc tham s trong khun hnh lp Hon ton ging nh khun hnh hm, cc khun hnh lp c th c cc tham s kiu v tham s biu thc. Trong phn ny ta bn v cc tham s kiu; cn cc tham s biu thc s c ni trong phn sau. Tuy c nhiu im ging nhau gia khun hnh hm v khun hnh ad(3.5, 2.3);

lp, nhng cc rng buc i vi cc kiu tham s li khng nh nhau. 41.5.1 S lng cc tham s kiu trong mt khun hnh lp Xt v d khai bo sau: template <class T, class U, class V> //danh sch ba tham s kiu class try { T x; U t[5]; ... V fm1 (int, U); ... }; 41.5.2 Sn sinh mt lp th hin Mt lp th hin c khai bo bng cch lit k ng sau tn khun hnh lp cc tham s thc (l tn cc kiu d liu) vi s lng bng vi s cc tham s trong danh sch (template<...>) ca khun hnh lp. Sau y a ra mt s v d v lp th hin ca khun hnh lp try: try <int, float, int> // lp th hin vi ba tham s int, float, int try <int,int *, double>// lp th hin vi ba tham s int, int *, double try <char *, int, obj> // lp th hin vi ba tham s char *, int, obj Trong dng cui ta cui gi nh obj l mt kiu d liu c nh ngha trc . Thm ch c th s dng cc lp th hin lm tham s thc cho cc lp th hin khc, chng hn:

try <float, point<int>, double> try <point<int>,point<float>, char *> Cn ch rng, vn tng ng chnh xc c ni ti trong cc khun hnh hm khng cn hiu lc vi cc khun hnh lp. Vi cc khun hnh hm, vic sn sinh mt th hin khng ch da vo danh sch cc tham s c trong template<...> m cn da vo danh sch cc tham s hnh thc trong tiu ca hm. Mt tham s hnh thc ca mt khun hnh hm c th c kiu, l mt lp th hin no , chng hn: template <class T> void fct(point<T>) { ... } Vic khi to mi cc kiu d liu mi vn p dng c trong cc khun hnh lp. Mt khun hnh lp c th c cc thnh phn(d liu hoc hm) static. Trong trng hp ny, cn phi bit rng, mi th hin ca lp c mt tp hp cc thnh phn static ca ring mnh: 41.6 Cc tham s biu thc trong khun hnh lp Mt khun hnh lp c th cha cc tham s biu thc. So vi khun hnh hm, khi nim tham s biu thc trong khun hnh lp c mt s im khc bit: tham s thc t tng ng vi tham s biu thc phi l mt hng s. Gi s rng ta mun nh ngha mt lp table thao tc trn cc bng cha cc i tng c kiu bt k. Mt cch t nhin ta ngh ngay n vic to mt khun hnh lp vi mt tham s kiu. ng thi cn c th dng mt tham s th hai xc nh s thnh phn ca mng. Trong trng hp ny, nh ngha ca khun hnh lp c dng nh sau: template <class T, int n> class table { T tab[n];

public: ... }; Danh sch cc tham s (template<...>) cha hai tham s vi c im khc nhau hon ton: mt tham s kiu c xc inh bi t kho class, mt tham s biu thc kiu int>. Chng ta s phi ch r gi tr ca chng trong khai bo cc lp th hin. Chng hn, lp th hin: table <int ,4> tng ng vi khai bo nh sau: class table<int,4> { int tab[4]; public: ... }; Sau y l mt v d hon chnh: V d 6.9 /*templat10.cpp*/ #include <iostream.h> #include <conio.h> template <class T, int n> class table { T tab[n]; public: table() { cout<<"Tao bang\n";} T & operator[](int i) { return tab[i]; } };

class point { int x, y; public: point (int abs = 1, int ord = 1) { x = abs; y = ord; cout<<"Tao diem "<<x<<" "<<y<<"\n"; } void display() { cout<<"Toa do: "<<x<<" "<<y<<"\n"; } }; void main() { clrscr(); table<int, 4> ti; for(int i = 0; i < 4; i++) ti[i] = i; cout<<"ti: "; for(i = 0; i < 4; i++) cout <<ti[i]<<" "; cout<<"\n"; table <point, 3> tp; for(i = 0; i < 3; i++) tp[i].display(); getch(); } Tao bang ti: 0 1 2 3 Tao diem 1 1

Tao diem 1 1 Tao diem 1 1 Tao bang Toa do: 1 1 Toa do: 1 1 Toa do: 1 1 41.7 Tng qut v khun hnh lp Ta c th khai bo mt s tu cc tham s biu thc trong danh sch cc tham s ca khun hnh hm. Cc tham s ny c th xut hin bt k ni no trong nh ngha ca khun hnh lp. Khi sn sinh mt lp c cc tham s biu thc, cc tham s thc t tng ng phi l cc biu thc hng ph hp vi kiu d liu khai bo trong danh sch cc tham s hnh thc ca khun hnh lp. 41.8 C th ho khun hnh lp Kh nng c th ho khun hnh lp c i cht khc bit so vi khun hnh hm. Khun hnh lp nh ngha h cc lp trong mi lp cha ng thi nh ngha ca chnh n v cc hm thnh phn. Nh vy, tt c cc hm thnh phn cng tn s c thc hin theo cng mt gii thut. Nu ta mun cho mt hm thnh phn thch ng vi mt tnh hung c th c th no , c th vit mt nh ngha khc cho n. Sau y l mt v d ci tin khun hnh lp point. y chng ta c th ho hm hin th display() cho trng hp kiu d liu char: V d 6.10 /*templat11.cpp*/ #include <iostream.h> #include <conio.h> //to mt khun hnh lp

template <class T> class point { T x, y; public: point(T abs = 0, T ord = 0) { x = abs; y = ord; } void display(); }; template <class point<T>::display() { } //Thm mt hm display c th ho trong trng hp cc k t void point<char>::display() { cout<<"Toa "<<(int)y<<"\n"; } void main() { clrscr(); point <int> ai(3,5); ai.display(); point <char> ac('d','y'); ac.display(); point <double> ad(3.5, 2.3); ad.display(); getch(); } Toa do: 3 5 do: "<<(int)x<<" T> void

cout<<"Toa do: "<<x<<" "<<y<<"\n";

Toa do: 100 121 Toa do: 3.5 2.3 Ta ch dng tiu trong khai bo mt thnh phn c c th ho: void point<char>::display() Khai bo ny nhc chng trnh dch s dng hm ny thay th hm display() ca khun hnh lp point (trong trng hp gi tr thc t cho tham s kiu l char). Nhn xt [31]. C th c th ho gi tr ca tt c cc tham s. Xt khun hnh lp sau y: template <class T, int n> class table { T tab[n]; public: table() {cout<<" Tao bang\n"; } ... }; Khi , chng ta c th vit mt nh ngha c th ho cho hm thit lp cho cc bng 10 phn t kiu point nh sau: table<point,10>::table(...) {...} [32]. C th c th ho mt hm thnh phn hay mt lp. Trong v d 6.10 chng trnh template11.cpp c th ho mt hm thnh phn ca khun hnh lp. Ni chung c th: c th ho mt hay nhiu hm thnh phn, hoc khng cn thay i nh ngha ca bn thn lp (thc t cn phi lm nh vy) m c th ho bn thn lp bng cch a thm nh ngha. Kh nng th hai ny c dn ti vic phi c th ho mt s hm thnh phn. Chng hn, sau khi nh ngha

khun hnh template<class T> class point, ta c th nh ngha mt phin bn c th cho kiu d liu point thch hp vi th hin point<char>. Ta lm nh sau: class point<char> { //nh ngha mi }; 41.9 S ging nhau ca cc lp th hin

Xt cu lnh gn gia hai i tng. Nh chng ta bit, ch c th thc hin c php gn khi hai i tng c cng kiu (vi trng hp tha k vn c bit hn mt cht nhng thc cht ch l chuyn kiu ngm nh i vi biu thc v phi ca lnh gn). Trc y, ta bit rng hai i tng c cng kiu nu chng c khai bo vi cng mt tn lp. Trong trng hp khun hnh lp, nn hiu s cng kiu y nh th no? Thc t, hai lp th hin tng ng vi cng mt kiu nu cc tham s kiu tng ng nhau mt cch chnh xc v cc tham s biu thc c cng gi tr. Nh vy (gi thit rng chng ta nh ngha khun hnh lp table trong mc 2.6) vi cc khai bo: table <int, 12> t1; table <float,12> t2; ta khng c quyn vit: t2 = t1; //khng tng thch gia hai tham s u Cng vy, vi cc khai bo: table <int, 12> ta; table <int, 20> tb; cng khng c quyn vit ta = tb;//gi tr thc ca hai tham s sau khc nhau.

Nhng qui tc cht ch trn nhm lm cho php gn ngm nh c thc hin chnh xc. Trng hp c cc nh ngha chng ton t gn, c th khng nht thit phi tun theo qui tc nu trn. Chng hn hon ton c th thc hin c php gn t2 = t1; nu ta c nh ngha hai lp th hin table<int, m> v table<float,n> v trong lp th hai c nh ngha chng php gn bng. 41.10 Cc lp th hin v cc khai bo bn b Cc khun hnh lp cng cho php khai bo bn b. Bn trong mt khun hnh lp, ta c th thc hin ba kiu khai bo bn b nh sau. 41.10.1 Khai bo cc lp bn hoc cc hm bn thng thng Gi s A l mt lp thng thng v fct() l mt hm thng thng. Xt khai bo sau y trong khai bo A l lp bn v fct() l hm bn ca tt c cc lp th hin ca khun hnh lp: template <class T> class try { int x; public: friend class A; friend int fct(float); ... }; 41.10.2 Khai bo bn b ca mt th hin ca khun hnh hm, khun hnh lp Xt hai v d khai bo sau y. Gi s chng ta c khun hnh lp v khun hnh hm sau: template <class T> class point {...};

template <class T> int fct (T) {...}; Ta nh ngha hai khun hnh lp nh sau: template <class T, class U> class try1 { int x; public: friend class point<int>; friend int fct(double); ... }; Khai bo ny xc nh hai th hin rt c th ca khun hnh hm fct v khun hnh lp point l bn ca khun hnh lp try1. template <class T, class U> class try2 { int x; public: friend class point<T>; friend int fct(U); ... }; So vi try1, trong try2 ngi ta khng xc nh r cc th hin ca fct() v point l bn ca mt th hin ca try2. Cc th hin ny s c c th ti thi im chng ta to ra mt lp th hin ca try2. V d, vi lp th hin try2<double, long> ta c lp th hin bn l point<double> v hm th hin bn l fct<long> 41.10.3 Khai bo bn b ca khun hnh hm, khun hnh lp Xt v d sau y: template <class T, class U> class try3 { int x; public: template <class X> friend class point<X>;

template <class X> friend int fct(X); ... }; Ln ny, tt c cc th hin ca khun hnh lp point u l bn ca cc th hin no ca khun hnh lp try3. Tng t nh vy tt c cc th hin ca khun hnh hm fct() u l bn ca cc th hin ca khun hnh lp try3. 41.11 V d v lp bng c hai ch s Trc y, nh ngha mt lp table c hai ch s ta phi s dng mt lp vector trung gian. y, ta xt mt cch lm khc nh s dng khun hnh lp. Vi nh ngha sau: template <class T, int n> class table { T tab[n]; public: T &operator [](int i) { return tab[i]; } }; ta c th khai bo: table <table<int,2>,3> t2d; Trong trng hp ny, thc cht ta c mt bng ba phn t, mi phn t c kiu table<int,2>. Ni cch khc, mi phn t li l mt bng cha hai s nguyn. K hiu t2d[1][2] biu th mt tham chiu n thnh phn th ba ca t2d[1], bng t2d[1] l phn t th hai ca bng hai chiu cc s nguyn t2d. Sau y l mt chng trnh hon chnh: V d 6.10

#include <iostream.h> #include <conio.h> template <class T, int n> class table { T tab[n]; public: table() //hm thit lp { cout<<"Tao tu\n"; } T & operator[] (int i) //hm ton t [] { return tab[i]; } }; void main() { clrscr(); table <table<int,2>,3> t2d; t2d[1][2] = 15; cout <<"t2d [1] [2] ="<<t2d[1][2]<<"\n"; int i, j; for (i = 0; i < 2; i++) for(j = 0; j < 3; j++) t2d[i][j] = i*3+j; for(i =0; i < 2; i++) { for(j = 0; j < 3; j++) cout <<t2d[i][j]<<" "; cout<<"\n"; } bang co "<<n<<"phan

} Tao bang co 2 phan tu Tao bang co 2 phan tu Tao bang co 2 phan tu Tao bang co 3 phan tu t2d [1] [2] = 15 0 1 2 3 4 5 6 7 8 Ch Chng trnh v d trn y cn c mt s im yu: cha qun l vn trn ch s bn, khng khi to gi tr cho cc thnh phn ca bng. gii quyt cn c mt hm thit lp vi mt tham s c kiu int, v mt hm thit lp c nhim v chuyn kiu int thnh kiu T bt k. Cc yu cu ny coi nh l bi tp. V d 6.11 /*templa13.cpp*/ #include <iostream.h> #include <conio.h> template <class T, int n> class table { T tab[n]; int limit; public: table (int init = 0); T & operator[] (int i) { if (i < 0 || i >limit) cout<<"Tran chi so "<<i<<"\n"; else return tab[i]; } };

template <class T, int table<T,n>::table(int init = 0) { int i;

n>

for (i = 0; i < n; i++) tab[i] = init; limit = n - 1; cout<<"Tao bang kich init = "<<init<<"\n"; } void main() { clrscr(); table <table<int,3>,2>ti; //khi to ngm nh table <table<float,4>,2> td(10); //khi tao bng 10 ti[1][6] = 15; ti[8][-1] = 20; cout<<ti[1][2]<<"\n"; cout<<td[1][0]<<"\n"; getch(); } Tao bang kich thuoc 3 init = 0 Tao bang kich thuoc 3 init = 0 Tao bang kich thuoc 3 init = 0 Tao bang kich thuoc 3 init = 0 Tao bang kich thuoc 2 init = 0 Tao bang kich thuoc 4 init = 0 Tao bang kich thuoc 4 init = 0 Tao bang kich thuoc 4 init = 10 Tao bang kich thuoc 4 init = 10 thuoc "<<n<<"

Tao bang kich thuoc 2 init = 10 Tran chi so 6 Tran chi so 8 Tran chi so -1 0 10 Ch Nu cc thng bo to cc bng ta thy rng ta thu c nhiu hn hai ln so vi d kin vi cc bng c hai ch s. Li gii thch nm trong cu lnh gn tab[i] = init ca hm thit lp table. Khi khai bo mng cc i tng T chng trnh dch gi ti cc hm thit lp ngm nh vi cc tham s bng 0. thc hin lnh gn tab[i] = init chng trnh dch s thc hin chuyn i t kiu s nguyn sang mt i tng tm thi kiu T. iu ny cng s gi ti hm thit lp table(int). Chng hn trong khai bo ca bng td, ta thy, chng trnh dch to ra hai bng mt chiu cc s thc vi kch thc l 4 v init =0, ng thi cng c hai ln to cc bng trung gian vi kch thc bng 4 v init=10. 42. Tm tt 42.1 Ghi nh Khun hnh lp/hm l phng tin m t ngha ca mt lp/hm tng qut cn lp/hm th hin l mt bn sao ca khun hnh tng qut vi cc kiu d liu c th. Cc khun hnh lp/hm thng c tham s ho, tuy nhin vn c th s dng cc kiu c th trong cc khun hnh lp/hm nu cn. 43. Bi tp Bi 6.1. Vit chng trnh khai bo khun hnh lp m phng hot ng ca hng i hoc ngn xp trn cc kiu i tng khc nhau.

1. Khun hnh hm.................................................... 327 1.1 Khun hnh hm l g?....................................... 327 1.2 To mt khun hnh hm ................................... 328 1.3 S dng khun hnh hm ................................... 329
1.3.1 1.3.2 1.3.3 1.4.1 Khun hnh hm cho kiu d liu c s ........................... 329 Khun hnh hm min cho kiu char *.............................. 330 Khun hnh hm min vi kiu d liu lp ........................ 331 Cc tham s kiu trong nh ngha khun hnh hm ........ 332

1.4 Cc tham s kiu ca khun hnh hm .............. 332 1.5 Gii thut sn sinh mt hm th hin ................ 335 1.6 Khi to cc bin c kiu d liu chun............ 336 1.7 Cc hn ch ca khun hnh hm ...................... 337 1.8 Cc tham s biu thc ca mt khun hnh hm339 1.9 nh ngha chng cc khun hnh hm ............. 341 1.10C th ho cc hm th hin 344 1.11Tng kt v cc khun hnh hm 345 2. KHUN hnh lp ................................................... 346 2.1 Khun hnh lp l g?......................................... 346 2.2 To mt khun hnh lp..................................... 346 2.3 S dng khun hnh lp ..................................... 349 2.4 V d s dng khun hnh lp............................ 349 2.5 Cc tham s trong khun hnh lp ..................... 350
2.5.1 2.5.2 S lng cc tham s kiu trong mt khun hnh lp....... 351 Sn sinh mt lp th hin .................................................. 351

2.6 Cc tham s biu thc trong khun hnh lp ..... 352 2.7 Tng qut v khun hnh lp ............................. 355 2.8 C th ho khun hnh lp ................................ 355

2.9 S ging nhau ca cc lp th hin.................... 358 2.10Cc lp th hin v cc khai bo bn b 359


2.10.1 Khai bo cc lp bn hoc cc hm bn thng thng..... 359 2.10.2 Khai bo bn b ca mt th hin ca khun hnh hm, khun hnh lp.................................................................................... 359 2.10.3 Khai bo bn b ca khun hnh hm, khun hnh lp .... 360

2.11V d v lp bng c hai ch s 361 3. Tm tt .................................................................. 365 3.1 Ghi nh............................................................... 365 4. Bi tp.................................................................... 365

Ph lc 1 Cc knh xut nhp 44. Gii thiu chung 44.1 Khi nim v knh Trong cc chng trc, chng ta thng s dng cc ch th vit ra thit b ra chun nh : cout<<n; Ch th ny gi n ton t << v cung cp cho n hai ton hng, mt tng ng vi knh xut - output stream( y l cout), ton hng th hai l biu thc m chng ta mun vit gi tr ca n ( y l n). Tng t, cc ch th c t thit b vo chun kiu nh: cin >> x; gi ti ton t >> v cung cp cho n hai ton hng, mt l knh nhp-input stream( y l cin), cn ton hng th hai l mt bin m ta mun nhp gi tr cho n. Mt cch tng qut, mt knh(stream) c hiu nh mt knh truyn: [33]. nhn thng tin, trong trng hp ta ni n dng xut [34]. cung cp thng tin, trong trng hp ta ni n dng nhp. Cc ton t << v >> y ng vai tr chuyn giao thng tin, cng vi khun dng ca chng. Mt knh c th c ni vi mt thit b ngoi vi hoc mt tp tin. Knh cout c nh ngha ni n thit b ra chun (tng ng stdout). Cng vy, knh cin c nh ngha trc ni n thit b vo

chun(stdin). Thng thng cout tng ng vi mn hnh, cn cin th i din cho bn phm. Tuy nhin trong trng hp cn thit th c th i hng cc vo ra chun ny n mt tp tin. Ngoi cc knh chun cin v cout, ngi s dng c th nh ngha cho mnh cc knh xut nhp khc kt ni vi cc tp tin. 44.2 Th vin cc lp vo ra C++ cung cp mt th vin cc lp phc v cho cng vic vo ra. Lp streambuf l c s cho tt c cc thao tc vo ra bng ton t; n nh ngha cc c trng c bn ca cc vng m lu tr cc k t xut hay nhp. Lp ios l lp dn xut t streambuf, ios nh ngha cc dng c bn v kh nng kim tra li dng cho streambuf. ios l mt lp c s o cho cc lp istream v ostream. Mi lp ny c nh ngha chng ton t << v >> cho cc kiu d liu c s khc nhau. s dng cc kh nng ny phi dng ch th #include i vi tp tin tiu iostream.h. C ch lp ca C++ cho php to ra h thng giao tip c kh nng m rng v nht qun. Trong chng 4 a ra hai nh ngha chng cho cc ton t vo/ra trong C++. Ph lc ny tp trung trnh by cc kh nng vo ra do C++ cung cp, bao gm cc ni dung sau: [35]. [36]. kh nng ca ostream, istream, kim sot li vo ra

45. Lp ostream 45.1 nh ngha chng ton t << trong lp ostream Trong lp ostream, ton t << c nh ngha cho tt c cc kiu d liu c s di dng mt hm ton t thnh phn: ostream &operator<<(expression)

trong expression c kiu c s bt k. Vai tr ca hm ton t ny l chuyn gi tr ca biu thc ti knh lin quan, ng thi nh dng gi tr mt cch thch hp. Xt ch th: cout<<n; Nu n c gi tr 1234, ton t << s chuyn i gi tr nh phn ca n sang h thp phn v chuyn n cout cc k t tng ng vi cc ch s ca s thp phn nhn c ( y l 1, 2, 3, 4). Ngoi ra, ton t ny tr v gi tr l tham chiu n knh xut gi n, sau khi thng tin c vit ra. Do vy, cho php vit lin tip nhiu gi tr ln cng mt knh: cout<<Gia tri : <<n<<\n; 45.2 Hm put

Hm thnh phn put trong lp ostream dng a ra knh xut tham s k t. Ch th cout.put(c); s a ra knh xut cout k t c. Gi tr tr v ca put l tham chiu n knh xut ang s dng. C th ghi lin tip cc k t trn cng knh xut nh sau: cout.put(c1).put(c2).put(c3); Ch tr trn tng ng vi ba ch th ring bit: cout.put(c1); cout.put(c2); cout.put(c3); 45.3 Hm write

Hm thnh phn write cho php ghi ra knh xut

mt chui cc k t c chiu di cho. V d, vi: char t[] = hello; ch th cout.write(t, 4); s gi n cout bn k t u tin ca xu t l h e l l. Ging nh put, hm write tr v gi tr l tham chiu n chnh knh xut va nhn thng tin. Tng t, c th gi lin tip cc hm write nh i vi hm put: //in ra ba k t u tin ca xu t. cout.write(t,1).write(t+1,1).write(t+2,1); 45.4 Kh nng nh dng

45.4.1 Chn c s th hin Khi vit mt gi tr s nguyn, c s ngm nh biu din gi tr l h m thp phn. Tuy nhin ta c th la chn cc c s khc nhau hin th gi tr: 10 (decimal), 16 (hexa decimal), 8 (octal). Chng trnh io1.cpp sau y a ra mt v d minh ho: V d /*io1.cpp*/ #include <iostream.h> #include <conio.h> void main() clrscr(); int n = 12000; cout<<"Ngam dinh " <<n<<endl; cout<<"Duoi he 16 "<<hex<<n<<endl; cout<<"Duoi he 10 "<<dec<<n<<endl; {

cout<<"Duoi he 8 cout<<"va ... getch(); } Ngam dinh 12000

"<<oct<<n<<endl; " <<n<<endl;

Duoi he 16 2ee0 Duoi he 10 12000 Duoi he 8 va ... 27340 27340

Cc k hiu hex, dec, oct c gi l ton t nh dng. chnh l cc ton t c nh ngha trc trong ostream. Cc ton t ny ch c mt ton hng l i tng ostream v tr v chnh i tng sau khi n thc hin mt s tho tc nht nh. Trong v d ny, thao tc c thc hin l thay i c s hin th gi tr v thng tin v c s s c ghi li trong ostream cho cc ln thc hin tip sau. 45.4.2 t rng Lp ostream cung cp cho ngi s dng cc phng thc hoc cc ton t kim sot cch thc my tnh nh dng xut v nhp cc gi tr. xc nh rng ca trng hin th thng tin ta s dng phng thc width. Xt cc ch th sau: int x = 10; cout.width(5); cout<<x; Gi tr ca x s c hin th st l phi trong trng vi rng 5 k t. Nu kch thc ca x ln hn rng t th gi tr nh ca rng s b b qua v ton b gi tr ca x s c hin th. Gi tr ngm nh ca rng cho mt knh xut nhp l 0, ngha l d liu

c xut ra theo kch thc thc t m khng n thm k t g. Sau mi ln xut, rng s c t li gi tr l 0. on chng trnh sau: int x = 1, y =2; cout.width(5); cout<<x<< <<y; s xut ra gi tr ca x trong mt trng c 5 k t, sau l mt du trng v gi tr ca y vi kch thc thc t ca n. width cng khng phi l phng thc duy nht c dng thay i c tnh ca cc knh xut/nhp. Xt cc ch th sau: float pi=3.1415927; int orig_prec = cout.precision(2); cout<<pi; cout.precision(orig_prec); Trong on chng trnh trn, phng thc precision dng xc nh li s ch s s c in ra sau du chm thp phn cho cc gi tr thc. Phng thc precision c th c tham s v s tr v s ch s thp phn thc c ng sau du chm. Gi tr ngm nh cho precision l 6. Trong trng hp gi tr t cho rng ln hn chiu di ca gi tr c xut ra, th dng cc k t n lp khong trng. K t n ngm nh l du cch. Tuy vy c th s dng phng thc fill s dng mt k t khc du trng. on chng trnh sau: int x = 10; cout.fill(0); cout.width(5); cout<<x; cho kt qu nh sau:

00010 C th thay th phng thc width trong cout, cin bng ton t setw nh sau:

thay v s dng cout.width(5); cout<<x; ta dng cout<<setw(5)<<x; 46. Lp istream 46.1 nh ngha chng ton t >> trong lp istream Trong lp istream, ton t >> c nh ngha chng c th lm vic vi tt c cc kiu d liu c s (bao gm c char *) di dng hm thnh phn: istream & opertaor >>(&base_type) Theo khai bo ny ton t >> c hai ton hng, ton hng ng bn tri s l i tng kiu istream, i tng ny s l tham s ngm nh cho hm ton t. Ton hng ng bn phi >> l tham chiu n bin kiu c s s nhp gi tr. Thc hin >> s cho kt qu l mt tham chiu n i tng c kiu istream. Thng thng, chnh l i tng knh nhp d liu. Cng nh i vi cout v <<, ton t >> cng cho php nhp lin tip cc bin khc nhau. Cc du phn cch bao gm: \t \v \n \r \f s khng c xem xt khi c; chng hn, xt vng lp thc hin ch th ( trong c c kiu k t char): cin >>c; Vi u vo c dng x i n c

h a o th ch c cc k t x, i, n, c, h, a, o c c. c c cc k t trng, phi s dng hm thnh phn get trong istream. Mt khc khi c mt xu k t khng th c cc du trng trong xu . Chng hn, vi ni dung ca dng nhp l

Xin chao th ch ly c phn u Xin trong xu ny lm ni dung. c th c c cc xu c cha du phn cch s dng hm thnh phn getline nh ngha trong lp istream. 46.2 Hm thnh phn get Hm thnh phn istream & get( char &); cho php c mt k t t knh nhp v gn n cho bin c kiu k t (l tham s ca hm). Hm ny tr v gi tr l mt tham chiu n knh nhp, nn c th gi get lin tip c nhiu k t. Khc vi ton t >>, hm get c th c tt c cc k t k c l cc du phn cch. Bn c c th kim tra s k t c c nh s dng get i vi dng nhp c ni dung: x i nc hao Khi gp EOF (ht dng nhp) hm get tr v gi tr 0. Xt on chng trnh sau: char c; ... while (cin.get(c)) //chp li dng nhp cin cout.put(c); (cin)=0 Cn mt hm thnh phn get khc ca lp istream: // ln dng xut cout // cng vic s dng khi eof v khi

int get() Khi gp du kt thc tp tin, hm tr v gi tr EOF cn bnh thng hm a li k t c c.

46.3

Cc hm thnh phn getline v gcount

Hai hm ny s dng c cc xu k t. Khai bo ca getline c dng: istream & getline(char * ch, int size, char delim=\n) Hm getline c cc k t trn knh nhp gi n v t vo vng nh c a ch xc nh bi ch. Hm b ngt khi: - k t phn cch delim xut hin trong dng nhp - hoc c size-1 k t. Trong c hai trng hp, hm ny b sung thm mt k t kt thc xu ngay sau cc k t c c (xem li hm gets() trong stdio.h). K t phn cch delim c gi tr ngm nh l \n khi c cc dng vn bn. Hm gcount cho bit s k t c c trong ch th gi hm getline gn nht, y khng tnh ti k t phn cch cng nh k t cui xu c thm vo t ng. Xem cc ch th sau: const LG_LIG = 120; // chiu di cc i ca mt dng ... char ch[LG_LIG+1]; int lg; ... while(cin.getline(ch,LG_LIG)) { lg = cin.gcount(); //x l mt dng c lg k t //khai bo 1 dng

} 46.4 Hm thnh phn read

Hm read cho php c t knh nhp mt dy k t c chiu di xc nh. Chng hn, vi: char t[10]; ch th cin.read(t,5); s c t thit b vo 5 k t v a vo 5 k t u tin ca mng cc k t t. Hm read khng phn bit du trng vi cc k t khc trn knh nhp. 46.5 Mt s hm khc Hm putback(char c) cho php tr li knh nhp mt k t c (tham s ca hm). Hm peek() a ra k t tip theo trong dng nhp nhng khng ly k t ra khi dng nhp. 47. Trng thi li ca knh nhp Mi knh nhp hay xut u c mt s c xc nh trng thi li ca knh hin ti. Trong mc ny trc ht ta s xem xt ngha ca cc c ny, sau s tm hiu cch ly gi tr ca chng v thay i cc gi tr ca cc c theo mc ch ca chng ta. Cui cng ta xem xt nh ngha chng cc php ton () v ! nhm n gin ho cch s dng mt knh d liu. 47.1 Cc c li Cc c li c nh ngha nh l cc hng trong lp ios dn xut t ostream v istream. l: eofb Kt thc tp tin; c ny c kch hot nu gp it du kt thc tp tin. Ni cch khc khi knh

nhp khng cn k t c tip na. failb Bit ny c bt khi thao tc vo ra tip theo it khng th tin hnh c. bad Bit ny c bt khi knh trng thi khng th bit khi phc c. failbit v badbit ch khc nhau i vi cc knh nhp. Khi failbit c kch hot, cc thng tin trc trong knh nhp khng b mt; trong khi iu ny khng cn ng i vi badbit . Ngoi ra, cn c c goodbit tng ng vi trng thi khng c li. C th ni rng mt thao tc vo ra thnh cng khi goodbit hay eofbit c bt. Tng t, thao tc vo ra tip theo ch c tin hnh nu goodbit c bt. Khi mt dng trng thi li, mi thao tc tip theo phi ch cho n khi: - trng thi li c sa cha, - cc c li c tt. Ta s xem xt cc hm thc hin cc cng vic ny trong cc mc di y. 47.2 Cc thao tc trn cc bit li C hai loi hm thnh phn thc hin cc thao tc ny: [37]. Cc hm thnh phn cho php gi tr cc c li, [38]. Cc hm thnh phn cho php bt tt cc c li . 47.2.1 c gi tr Trong lp ios c nh ngha nm hm thnh phn sau y: eof() tr v 1 nu gp du kt thc file, c ngha l

eofbit c kch hot. bad() fail() tr v 1 nu badbit c bt. tr v 1 nu failbit c bt.

good() tr v 1 nu ba hm trn cho gi tr 0 rdstat tr v mt s nguyn tng ng vi tt c cc c li. e() 47.2.2 Thay i trng thi li Trong istream/ostream c hm thnh phn void clear(int i = 0) bt cc bit li tng ng vi gi tr c s dng lm tham s. Thng thng, ta xc nh gi tr da trn cc hng s ca cc c li. Chng hn, nu fl biu th mt knh, ch th: fl.clear(ios::badbit); s bt c li badbit v tt tt c cc c cn li. Nu ta mun bt c ny ng thi khng mun thay i gi tr cc c khc, s dng ch th sau: fl.clear(ios::badbit|fl.rdstate()); 47.3 nh ngha cc ton t () v !

C th kim tra mt knh bng cch xem n nh mt gi tr logic. iu ny c thc hin nh vic nh ngha chng trong lp ios cc ton t () v !. Chi tit hn, ton t () c nh ngha chng di dng (trong fl biu th mt dng): (fl) - tr v mt gi tr khc 0 nu cc c li c tt, c ngha l hm good() c gi tr bng 1. - tr v gi tr 0 trong trng hp ngc li, c ngha

l khi good() c gi tr 0. Nh vy: if(fl) ... c th thay th cho (hoc c thay th bi) if(fl.good()) ... Cng vy, ton t ! c nh ngha nh l !fl - tr v gi tr khng nu c t nht mt c li c bt ln - tr v gi tr khc khng trong trng hp ngc li. Nh vy: if ( !fl) ... c th thay th (hoc c thay th bi) if (!flot.good()) ... 48. Qun l nh dng Cc knh xut/nhp dng gi tr c iu khin dng nhp v xut. Mt u im ca phng php qun l nh dng s dng trong C++ l cho php ngi lp trnh b qua tt c cc kha cnh nh dng trong cc ch th a ra, nu s dng cc c ngm nh. Bn cnh , khi c nhu cu, ngi lp trnh c th a ra cc nh dng thch hp (mt ln cho tt c cc ch th vo/ra) vi cc loi d liu. 48.1 Trng thi nh dng ca mt dng Trng thi nh dng ca mt dng cha: - mt t trng thi, trong mi bit c mt ngha xc nh - cc gi tr s m t gi tr ca cc hng sau:

S k t a thng tin ra. Gi tr ny l tham s ca setw, mt ton t nh ngha trong ostream/istream. Khi gi tr ny qu nh, n s khng c tc dng na, cc dng s hin th thng tin theo rng bng kch thc m d liu c. chnh S ch s c hin th sau du chm thp phn trong dng du chm c nh v cng xc l s k t c ngha trong k php khoa hc. Ngha l cc k t c s dng in K t thay th thm vo phn cn trng khi gi tr a ra khng in ht rng. K t thay th ngm nh l du cch. rng

Tn trng

Tn bit

ngha

ios::skipws B qua cc du phn cch (khi nhp) ios::adjus ios::left Cn l bn tri (xut) tfield ios::right Cn l bn phi (xut) ios::intern Cc k t n c in gia du v gi al tr ios::basef ios::dec C s hin th l c s 10 ield ios::hex C s hin th l c s 16 ios::oct C s hin th l c s 8 ios::showba se ios::showpo Hin th cc ch s 0 int sau cc s thp phn ngay c khi chng khng c. Ngm nh c ny khng c bt. ios::upperc Tt c cc ch s hin ase th s c chuyn i sang ch in. ios::showpo Du + s c xut ra trc bt k s s nguyn no. Ngm nh c ny khng c bt. ios::scient Khi c bt, cc gi ific tr du phy ng s c xut ra theo dng khoa hc. S ch c mt con s ng trc du chm thp phn v cc con s thp phn c ngha s i sau n, sau l ch e dng ch hoa hy thng (tu thuc c uppercase), theo sau l gi tr s

48.2

T trng thi nh dng

T trng thi nh dng c m t nh mt s nguyn trong mi bit (c) tng ng vi mt hng s nh ngha trong lp ios. Mi c nh dng c bt khi bit tng ng c gi tr 1, tri li ta ni c b tt. Gi tr ca cc c c th s dng : - nhn din bit tng ng trong t nh dng - to nn mt t trng thi. Cc trng bit (t nht 3) c thay i gi tr m khng cn cung cp tham s cho cc hm thnh phn, l do chng c nh ngha ngay bn trong t trng thi, l i tng gi hm thnh phn c tc dng thay i ni dung cc c. Sau y l danh sch cc c km theo tn ca trng bit tng ng. 48.3 Thao tc trn trng thi nh dng tc ng ln cc trng thi nh dng, c th s dng cc ton t thao tc nh dng hoc s dng cc hm thnh phn ca cc lp istream v ostream. Tu theo tng trng hp, cc thao tc ny c th tc ng ln ton b t trng thi hay ch cc gi tr: rng, chnh xc, k t n. Bn cnh cn c cc hm thnh phn cho php chng ta lu gi gi tr cc trng thi nh dng khi phc li v sau. 48.3.1 Cc ton t thao tc nh dng khng tham s (TTDKTS) y l cc ton t nh dng c s dng dng sau (trong fl ng vai tr mt dng nhp/ xut, manipulator l ton t nh dng): fl<<manipulator hay fl>>manipulator

Kt qu thc hin cho ta tham chiu n knh hin ti, do vy cho php x l chng nh cch thc chuyn thng tin. c bit n cn cho php p dng nhiu ln lin tip cc ton t << v >>. Sau y l danh sch cc ton t nh dng khng tham s: TTD KTS Dec Hex Oct Ws Endl Ends flush S dng trong cc knh vo/ra vo/ra vo/ra vo ra ra ra Hot ng

Kch hot c c s biu din h 10 Kch hot c c s biu din h 16 Kch hot c c s biu din h 8 Kch hot c skipws Thm du xung dng Thm k t kt thc xu Lm rng b m t nh dng c tham

48.3.2 Cc ton s(TTDCTS)

Cc ton t ny c khai bo trong cc lp ostream, istream di dng hm thnh phn: istream &manipulator(argument) hoc ostream &manipulator(argument) Cc ton t ny c s dng ging nh cc ton t nh dng khng c tham s. Tuy nhin, mun s dng chng phi tham chiu tp tin tiu iomaip.h bng ch th: #include <iomanip.h>

Sau y l danh sch cc ton t nh dng c tham s: TTDCTS setbase(int) Resetiosflags (long) setiosflags(l ong) setfill(int) setprecision( int) Setw(int) S dng cho cc dng vo/ra vo/ra Vai tr nh ngha c s hin th t li 0 tt c cc bit c mt trong tham s Kch hot cc bit c trong tham s nh ngha li k t n nh ngha chnh xc cho cc s thc nh ngha rng

vo/ra

vo/ra vo/ra

vo/ra

48.3.3 Cc hm thnh phn Trong hai lp istream v ostream c bn hm thnh phn: setf, fill, precision, v width c m t nh sau: Hm setf Hm ny cho php thay i t trng thi nh dng. Hm ny c hai phin bn khc nhau: long setf(long) li gi ti phin bn ny kch hot cc c c m t trong tham s. Gi tr tr v ca hm l trng thi c ca t trng thi nh dng. Lu rng hm ny khng tc ng n cc c khng c m t. Nh vy, vi fl biu th mt knh, ch th:

fl.setf(ios::oct); s kch hot c oct. Tuy nhin, rt c th cc c khc nh dec hay hex vn cn tc dng. Dng th hai ca hm setf hay c s dng trong thc t l: long setf(long, long) Li gi ti phin bn ny kch hot cc c m t trong tham s th nht trong tham s th hai. Chng hn, nu fl l mt knh, ch th sau: fl.setf(ios::oct,ios::basedfield); s kch hot c ios::oct v tt cc c khc trong ios::basefield. Gi tr tr v ca li gi ny l gi tr c ca tham s th hai. Hm fill Hm ny cho php xc nh v xc lp li k t n. Cng c hai phin bn khc nhau cho hm ny: char fill() Phin bn ny tr v k t n hin ang c s dng, trong khi char fill(char) c s dng thay i k t n. Hm precision Hm ny cho php xc nh hoc xc lp li chnh xc biu din s thc. Hai phin bn khc nhau cho hm l: int precision() s tr v gi tr m t chnh xc hin thi, cn int precision(int) t li chnh xc mi, ng thi tr v gi tr c. Hm width

Hm ny cho php xc nh hay xc lp li rng ca trng hin th thng tin. Cng c hai phin bn khc nhau: int width() s tr v rng ang c s dng hin ti, cn int width(int) s tr v rng hin thi ng thi xc lp rng mi l tham s c m t trong li gi hm. 49. Lin kt knh xut/nhp vi mt tp tin Mc ny trnh by cch chuyn hng vo ra ti mt tp tin, ng thi cng gii thiu cc kh nng truy nhp trc tip vo cc tp tin. 49.1 Lin kt xut vi mt tp tin lin kt mt knh xut vi mt tp tin, ta ch cn to mt i tng kiu lp ofstream, mt lp k tha t ofstream. Vic s dng lp ny cn ti tp tin tiu fstream.h. Hm thit lp ca lp ofstream c hai tham s: - tn ca tp tin lin quan(di dng mt xu k t) - ch m tp tin c xc nh bi mt s nguyn. Lp ios c nh ngha mt s gi tr m t cc ch m tp tin khc nhau. Ch th sau y l mt v d minh ho: ofstream output(abc.txt,ios::out); Khi , i tng output s c lin kt vi tp tin tn l abc.txt, tp tin ny c m ch ghi. Sau khi to c mt i tng ofstream, vic ghi ra tp tin c thc hin ging nh kt xut ra mt knh xut, chng hn: output<<12<<abc<<endl;

C th kim tra trng thi li ca dng xut tng ng vi tp tin ging nh cch ta dng i vi cc knh xut chun: if(output) ... Chng trnh v d sau m t cch thc ghi mt s s nguyn vo mt tp tin. /*io2.cpp*/ #include <stdlib.h> #include <iostream.h> #include <fstream.h> #include <iomanip.h> #include <conio.h> const int LGMAX = 20; void main() { clrscr(); char filename[LGMAX+1]; int n; cout<<"Ten tap tin : "; cin>>setw(LGMAX)>>filename; ofstream output(filename,ios::out); if (!output) { cout<<"Khong the tao duoc tap tin\n"; exit(1); } do { cin >>n; if (n>0) output<<n<<' '; }while(n>0 && (output)); output<<endl;

output.close(); } 49.2 Lin kt knh nhp vi mt tp tin Mt i tng ca lp ifstream s c s dng lin kt vi mt tp tin cha thng tin cn nhp. Ging nh ofstream, lp ifstream cng c nh ngha trong tp tiu fstream.h. Lp ifstream c hm thit lp vi hai tham s ging nh ofstream. Ch th sau y s lin kt mt i tng ifstream vi tp tin abc.txt: ifstream input(abc.txt,ios::in); Vic s dng input c ni dung abc.txt ging ht nh vic s dng cin c d liu t bn phm. Ta xt v d sau: /*io3.cpp*/ #include <stdlib.h> #include <iostream.h> #include <fstream.h> #include <iomanip.h> #include <conio.h> const int LGMAX = 20; void main() { clrscr(); char filename[LGMAX+1]; int n; cout<<"Ten tap tin : "; cin>>setw(LGMAX)>>filename; ifstream input(filename,ios::in); if (!input) {

cout<<"Khong the mo duoc tap tin\n"; exit(1); } while(input) { input>>n; cout<<n<<endl; } input.close(); } Nhn xt Lp fstream (tha k t hai lp ifstream v ofstream) dng nh ngha cc knh d liu thc hin ng thi c hai chc nng nhp v xut trn mt tp tin. Vic khai bo mt i tng kiu fstream cng ging nh khai bo i tng ofstream v ifstream. Ch th: fstream file(abc.txt,ios::in|ios::out); s gn i tng file vi tp tin abc.txt, c m c v ghi ng thi. 49.3 Cc kh nng truy nhp trc tip Vic truy nhp (c/ghi) n tp tin da trn mt phn t l con tr tp tin. Ti mi thi im, con tr tp tin xc nh mt v tr ti thc hin thao tc truy nhp. C th xem con tr ny nh cch m s phim trong my nh. Sau mi mt thao tc truy nhp, con tr tp tin t ng chuyn sang v tr tip theo ging nh vic ln phim mi khi bm my nh. Ta gi cch truy nhp tp tin kiu ny l truy nhp tun t. Cc chng trnh io2.cpp, io3.cpp s dng cch truy nhp ny c v ghi thng tin trn cc tp tin. Nhc im ca cch truy nhp tun t l phi i t u tp tin qua cc tt c cc phn t c trong tp tin i n c phn t cn thit, do vy

tn khng t thi gian. Cch truy nhp trc tip s cho php n thng ti phn t chng ta cn nh s dng mt s hm thnh phn thch hp trong cc lp ifstream v ofstream. Trong lp ifstream c hm seekg v trong lp ofstream c hm seekp c dng di chuyn con tr tp tin. Mi hm thnh phn c hai tham s: - Tham s th nht l s nguyn m t dch chuyn (tnh theo byte) con tr bao nhiu v tr so vi v tr gc, c m t bi tham s th hai (xem hai hm fseek trong stdio.h). - Tham s th hai ly mt trong ba gi tr sau: ios::b v tr gc l u tp tin eg ios::c v tr gc l v tr hin thi ca ur con tr tp tin ios::e v tr gc l cui tp tin. nd Hai hm tellg (i vi ifstream) v tellp (i vi ofstream) dng xc nh v tr hin thi ca cc con tr tp tin. Chng trnh sau y minh ho kh nng truy nhp tp tin trc tip. /*io4.cpp*/ #include <stdlib.h> #include <iostream.h> #include <fstream.h> #include <iomanip.h> #include <conio.h> const int LGMAX = 20; void main() {

clrscr(); char filename[LGMAX+1]; int n,num; cout<<"Ten tap tin : "; cin>>setw(LGMAX)>>filename; ifstream input(filename,ios::in); if(!input) { cout<<"Khong mo duoc tap tin"; exit(1); } do { cout<<"So thu tu cua so nguyen se tim : "; cin>>num; if (num >0) { input.seekg(sizeof(int)*(num1),ios::beg); input>>n; if (input) "<<n<<endl; else { cout<<"--Loi\n"; input.clear(); } } } while(num); input.close(); } Ten tap tin : abc.txt cout<<"--Gia tri :

So thu tu cua so nguyen se tim : 3 --Gia tri : 3 So thu tu cua so nguyen se tim : 2 --Gia tri : 22 So thu tu cua so nguyen se tim : 1 --Gia tri : 1 So thu tu cua so nguyen se tim : 3 --Gia tri : 3 So thu tu cua so nguyen se tim : 4 --Gia tri : 3 So thu tu cua so nguyen se tim : 5 --Gia tri : 4 So thu tu cua so nguyen se tim : 6 --Gia tri : 3 So thu tu cua so nguyen se tim : 7 --Gia tri : 2 So thu tu cua so nguyen se tim : 6 --Gia tri : 3 So thu tu cua so nguyen se tim : 100 --Loi So thu tu cua so nguyen se tim : 0

49.4 Cc ch m tp tin khc nhau Ch ios::in ios::out ios::app ios::ate ios::trunc ios::nocre ate ios::norep lace ios::binar y ios::text M t hnh ng tng ng M mt tp tin c(bt buc i vi ifstream) M mt tp tin ghi(bt buc i vi ofstream) M mt tp tin gn thm cc thng tin vo cui. t con tr tp tin vo cui tp tin Nu tp tin c, ni dung ca n s b mt. Tp tin bt buc phi tn ti. Tp tin cha tn ti Tp tin c m ch nh phn 5 Tp tin c m ch vn bn.

thc hin c nhiu hnh ng trn cng mt tp tin phi t hp cc bit m t ch bng cch s dng ton t | (cng bit). Chng hn: fstream f(abc.txt,ios::in|ios::out);

Trong cc mi trng dos v windows ngi ta phn bit cc tp tin vn bn v tp tin nh phn. Khi m mt tp tin phi xc nh ngay l liu chng ta s lm vic vi cc tp tin loi no. S phn bit ny v thc cht lin quan n vic x l k t cui dng.

1. Gii thiu chung .................................................... 368 1.1 Khi nim v knh ............................................. 368 1.2 Th vin cc lp vo ra ...................................... 369 2. Lp ostream........................................................... 369 2.1 nh ngha chng ton t << trong lp ostream 369 2.2 Hm put.............................................................. 370 2.3 Hm write........................................................... 370 2.4 Kh nng nh dng ........................................... 371
2.4.1 2.4.2 Chn c s th hin........................................................... 371 t rng ....................................................................... 372

3. Lp istream............................................................ 375 3.1 nh ngha chng ton t >> trong lp istream 375 3.2 Hm thnh phn get ........................................... 377 3.3 Cc hm thnh phn getline v gcount..... 379 3.4 Hm thnh phn read ...................................... 380 3.5 Mt s hm khc................................................ 380 4. Trng thi li ca knh nhp................................. 380 4.1 Cc c li ........................................................... 380 4.2 Cc thao tc trn cc bit li................................ 381
4.2.1 4.2.2 c gi tr ......................................................................... 381 Thay i trng thi li....................................................... 382

4.3 nh ngha cc ton t () v ! ............................ 382 5. Qun l nh dng ................................................. 383 5.1 Trng thi nh dng ca mt dng ................... 383 5.2 T trng thi nh dng...................................... 385 5.3 Thao tc trn trng thi nh dng ..................... 386
5.3.1 Cc ton t thao tc nh dng khng tham s (TTDKTS) 386

5.3.2 5.3.3

Cc ton t nh dng c tham s(TTDCTS) ................. 387 Cc hm thnh phn.......................................................... 388

6. Lin kt knh xut/nhp vi mt tp tin ............... 390 6.1 Lin kt xut vi mt tp tin .............................. 390 6.2 Lin kt knh nhp vi mt tp tin .................... 392 6.3 Cc kh nng truy nhp trc tip ....................... 393 6.4 Cc ch m tp tin khc nhau ....................... 397

Ph lc 2 X l li Bt u t phin bn 3.0, C++ cung cp c ch x l li (exception handling) do ngi s dng iu hnh. Trong chng trnh c th a ra quyt nh rng mt php x l no b li bng cch s dng t kho throw. Khi c li, vic x l b ngt v quyn iu khin s trao tr cho on x l li m ngi s dng bt c. 50. By v bt li Ta ly v d vit mt hm tnh gi tr ca mt phn s vi u vo l t s v mu s. Rc ri s ny sinh khi ngi s dng hm truyn vo cho mu s gi tr bng 0. gii quyt trng hp ny, C++ s t ng to sinh by li gp trng hp mu s bng 0. Sau y l chng trnh v d cho hm tnh gi tr phn s c x l li. #include <iostream.h> // lp kiu li m khng c thnh phn no class Loi_Chia_0 {}; float GiaTriPS(int ts, int ms){ // pht li nu mu = 0 if ( ms==0 ) throw( Loi_Chia_0 ); return float(ts)/ms; } void main(){ int ts, ms; cout << Tinh gia tri phan so\n; cout << TS = ; cin >> ts; cout << MS = ; cin >> ms;

try {

// thc hin c bt li

float gt = GiaTriPS(ts, ms); cout << Gia tri PS la: << gt; } catch Loi_Chia_0 { } } ( Loi_Chia_0 ) // bt li kiu

cout << Loi: Mau so bang 0;

Tinh gia tri phan so TS = 1 MS = 0 Loi: Mau so bang 0 Chng trnh ny c hai phn by li v bt li. Hm tnh phn s s pht sinh mt by li bng t kho throw khi mu s bng 0. Pha sau t kho throw l i tng thuc lp phc v bt li. y ta s dng lp Loi_Chia_0 khng c thnh phn no bn trong phc v cho vic bt li ny. Khi mt li c pht sinh, ton b nhng lnh tip theo trong hm x l b hu b. Trong thn chng trnh chnh chng ta s dng cu trc try... catch... bt li. Hm GiaTriPS c t trong try, do vy khi n pht sinh li (li loi Loi_Chia_0 c pht sinh khi mu s truyn vo l 0) th chng trnh dng hot ng v trao quyn iu khin cho on m bt li ny. Ta dng catch ( Loi_Chia_0 ) bt li. Nh vy, khi c mt li chia 0 th chng trnh s in ra dng thng bo Loi: Mau so bang 0. Khi trong chng trnh c mt li pht sinh m khng c on bt li tng

ng th chng trnh s t ng kt thc bt thng. iu ny s gy tr ngi ng k cho vic g ri chng trnh. Mt chng trnh c th pht sinh nhiu loi li khc nhau. Loi li pht sinh th hin kiu lp li c s dng trong cc lnh throw. Do vy, ta cng c th s dng nhiu ln catch bt cc loi li khc nhau trong mt chng trnh nh trong v d sau. #include <iostream.h> class Loi_A {}; class Loi_B {}; void PhatLoi(int i){ // neu i khac 0 thi phat Loi_A con khong Loi_B if (i) throw ( Loi_A ); throw ( Loi_B ); } void main(){ int i; cout << i = ; cin >> i; try { PhatLoi( i ); } catch ( Loi_A ) { cout << Loi loai A; } catch ( Loi_B ) { cout << Loi loai B; }

} i = 1 Loi loai A i = 0 Loi loai B Ta cng c th s dng catch(...) bt tt c cc loi li. Lp li c th c cc thnh phn ging nh lp bnh thng dng lm cc thng s x l li khi bt c. Chng hn, trong chng trnh x l li chia 0 trn ta c th thm vo thuc tnh lu li t s ca php chia li dng in ra khi bt li. #include <iostream.h> class Loi_Chia_0{ public: int ts; Loi_Chia_0(int t): ts(t) {} }; float GiaTriPS(int ts, int ms){ if ( ms==0 ) throw( Loi_Chia_0(ts) );

return float(ts)/ms; } void main(){ int ts, ms; cout << Tinh gia tri phan so\n; cout << TS = ; cin >> ts; cout << MS = ; cin >> ms; try {

float gt = GiaTriPS(ts, ms); cout << Gia tri PS la: << gt; } catch ( Loi_Chia_0 loi ) { cout << Loi chia << loi.ts << cho 0; } } Tinh gia tri phan so TS = 1 MS = 0 Loi chia 1 cho 0 51. Hot ng ca chng trnh khi mt li pht sinh Khi mt li trong chng trnh b bt th chng trnh tip tc hot ng bnh thng theo m lnh x l li bt c. Trong mt hm x l ngi s dng c th bt li xy ra v sau tip tc nm n duy tr li ca chng trnh bng t kho throw m khng c kiu loi li pha sau. #include <iostream.h> class Loi {}; void PhatLoi(){ throw ( Loi ); } void BatLoi(){ try { PhatLoi(); }

catch ( Loi ) lai\n;

cout << Loi da bi bat va duoc nem throw; // nm li li b bt } } void main() { try { BatLoi(); } catch ( Loi ) } } Loi da bi bat va duoc nem lai Loi bi bat lai lan hai Khi mt li xy ra m khng c mt bt li no p ng th chng trnh s kt thc v trc khi kt thc n s thc hin hm x l c xc lp trong cu lnh set_terminate. #include <iostream.h> class Loi {}; void KetThucLoi(){ cout << Chuong trinh bi loi va ket thuc bat thuong\n; } void PhatLoi(){ throw ( Loi ); { cout << Loi bi bat lai lan hai;

} void main(){ // xc lp hm kt thc bt thng set_terminate(KetThucLoi); cout << Goi ham phat loi ma khong bat\n; PhatLoi(); cout << Ket thuc binh thuong\n; } Goi ham phat loi ma khong bat Chuong trinh bi loi va ket thuc bat thuong Trong mt hm x l ngi x dng c th xc nh tt c nhng li c th xy ra bng cch dng t kho throw ng ngay sau khai bo tham s hm v lit k nhng lp li c th xy ra trong cp du ( ). Nu khng c lp li no c lit k th hiu rng hm s khng c li. Cn nu khng c t kho throw th hm c th c bt k li no. // hm c th c Li_A hoc Li_B void fct1() throw(Loi_A, Loi_B); // hm s khng c li no void fct2() throw(); // hm c th c bt k loi li no void fct3(); Trng hp vi mt hm no tuy c xc nh mt s li c th xy ra, nhng khi chy li xut hin mt li khng phi l li xc nh, th chng trnh s kt thc. Trc khi kt thc n s thc hin php x l ca hm c xc lp bng hm set_unexpected.

#include <iostream.h> class Loi_A {}; class Loi_B {} void LoiKhongCho() { cout << Chuong trinh ket thuc vi gap loi khong cho\n; } void PhatLoi() throw(Loi_B){ throw (Loi_A); } void main(){ // xc lp hm kt thc khi gp li khng ch i set_unexpected(LoiKhongCho); try { cout loi\n; PhatLoi(); } catch ( ... ) } } Goi ham phat loi Chuong trinh ket thuc vi gap loi khong cho { cout << Loi da bi bat; << Goi ham phat

52. X l li trong lp ng dng Trong mc ny chng ta s xy dng mt lp ng dng mng ng c kim sot li khi to vi s phn t nh hn hoc bng khng v li truy nhp phn t ngoi ch s. #include <iostream.h> #include <stdlib.h> class Loi{ public: virtual void InLoi()=0; }; // li khi to class Loi_KT : public Loi { public: int spt; Loi_KT(int n): spt(n) {} void InLoi() { cout << Loi khoi tao voi << spt << phan tu\n; } }; // loi truy cap class Loi_TC : public Loi { public: int cs; Loi_TC(int i): cs(i) {} void InLoi() { cout << Loi truy cap chi so << cs << \n; }

}; class Array { int spt; // so phan tu mang int *dl; // du lieu cua mang public: Array(int n): spt(n) { if ( spt <= 0 ) throw( Loi_KT(spt) ); dl = new int[spt]; } ~Array() { delete dl; } int & operator [] (int i){ if ( Loi_TC(i) ); } }; void main(){ try { Array a(-3); a[5] = 10; } // bat toan bo loi ke thua tu Loi catch ( Loi& l ) { l.InLoi(); // in loi tuong ung boi } } i<0 || i>=spt ) throw(

return dl[i];

Loi khoi tao voi -3 phan tu Trong chng trnh trn dng k thut a hnh to mt lp li tru tng c s c phng thc in li o. Cc li c th k tha t lp ny v thi hnh c th vic in li cho n. Khi bt li, ch cn bt li lp c s mt cch tng qut th tt c cc kiu li trong lp k tha u b bt. Khi gi th tc in li b bt, h thng s in ng li ca lp n thuc vo tng t nh tnh tng ng bi.

1. By v bt li......................................................... 400 2. Hot ng ca chng trnh khi mt li pht sinh 404 3. X l li trong lp ng dng ................................. 408

Ph lc 3 Bi ton quan h gia nh Trong mc ny, ta s xy dng chng trnh cho bi ton quan h gia nh c phn tch chng mt. Theo nh s phn tch ban u ca bi ton, ta c mt tp cc c th v m t bng lp Con ngi bao gm cc thuc tnh tn, anh em, cha m, ... v cc phng thc sinh, ci, ... Nhng ta c nhn xt rng phng thc sinh ch thc hin c trn nhng c th l n v phng thc ci ch xy ra cho hai c th khc gii. Nh vy c s phn chia tp i tng ca bi ton thnh hai lp khc nhau l Nam v N. R rng, hai lp ny phi k tha t lp Con ngi. Lp con ngi s cha cc thuc tnh v phng thc chung, d c th l Nam hay N cng u phi c. Ngoi c thnh phn c k tha t lp Con ngi, lp Nam c thm thuc tnh V, lp N c thm thuc tnh Chng v phng thc Sinh con. Thit k cc lp ban u ca bi ton nh hnh di y.
Con ngi Tn Cha m Anh em Con ci Gii tnh Ci

Nam V

N Chng Sinh con


Thit k s b cc lp ca bi ton

Phng thc Gii tnh dng tr li xem mt c th l Nam hay N. Nu l Nam kt qu l 1 cn l kt qu l 0. R rng ti lp Con ngi phng thc Gii tnh khng th tr li c l Nam hay N. Cu tr li ch xc nh ti cc phng thc Gii tnh lp k tha Nam v N. Phng thc Gii tnh lp Nam tr kt qu l 1 cn lp N tr kt qu l 0. thc hin c k thut ny, ta dng k thut hm o trong LTHT. Lp lun tng t cho phng thc Ci, bi v phng thc ny cn bit ci chng hay ci v. tr li cho cc cu hi v mi quan h gia nh chng ta cng cn phi xy nhng phng thc tr li cc cu hi nh L Anh, L ng(X), v.v... Hnh di y thit k cc lp ca bi ton.
Con ngi Tn Cha m Anh em Con ci Gii tnh <o> Ci <o> L Anh L ng ....

Nam V Gii tnh Ci

N Chng Sinh con Gii tnh Ci


Thit k cc lp ca bi ton

Sau y l th hin ca cc lp di ngn ng C++ c b sung thm mt s thuc tnh v phng thc phc v vic ci t lp. class Nguoi { friend class Nam; friend class Nu; char Ten[25]; Nam *Bo; Nu *Me; Nguoi *CacCon[10]; *AnhChi[10], *CacEm[10],

int SoAnhChi, SoEm, SoCon; Nguoi(char *ten, Nam *bo, Nu *me) : Bo(bo), SoEm(0), SoCon(0) { strcpy(Ten, ten); } void ThemAnhChi(Nguoi* nguoi) { AnhChi[SoAnhChi++] = nguoi; } void ThemEm(Nguoi* nguoi) { CacEm[SoEm++] = nguoi; } Me(me), SoAnhChi(0),

void ThemCon(Nguoi* nguoi) { CacCon[SoCon++] = nguoi; } public: // 1 la Nam, 0 la Nu virtual int GioiTinh()=0; virtual int Cuoi(Nguoi*)=0; int LaCha(Nguoi *); int LaMe(Nguoi *); int LaCon(Nguoi *); int LaAnh(Nguoi *); int LaChi(Nguoi *); int LaEm(Nguoi *); int LaCo(Nguoi *); int LaDi(Nguoi *); int LaChu(Nguoi *); int LaCau(Nguoi *); int LaMo(Nguoi *); int LaBac(Nguoi *); int LaOngNoi(Nguoi *); int LaBaNoi(Nguoi *); int LaOngNgoai(Nguoi *); int LaBaNgoai(Nguoi *); int LaAnhHo(Nguoi *); int LaChiHo(Nguoi *); int LaEmHo(Nguoi *); virtual int LaVo(Nguoi*)=0;

virtual int LaChong(Nguoi*)=0; }; class Nam : public Nguoi { Nu *Vo; int LaVo(Nguoi *) { return 0; } public: Nam(char *ten, Nam *bo=0, Nu *me=0) : Nguoi(ten, bo, me), Vo(0) {} int GioiTinh() { return 1; } int Cuoi(Nguoi *vo); int LaChong(Nguoi * nguoi); }; class Nu : public Nguoi { Nam *Chong; int LaChong(Nguoi *) { return 0; } public: Nu(char *ten, Nam *bo=0, Nu *me=0): Nguoi(ten, bo, me), Chong(0) {} int GioiTinh() { return 0; } int Cuoi(Nguoi *chong); void SinhCon(char* ten, int gioitinh); int LaVo(Nguoi * nguoi); };

Phng thc ci ch thc hin i vi c th cha lp gia nh. Trong trng hp lp gia nh th n s tr ra 0. int Nam::Cuoi(Nguoi *vo) { if (Vo||vo->GioiTinh()) return 0; Vo = (Nu*)vo; Vo->Cuoi(this); return 1; } int Nu::Cuoi(Nguoi *chong) { if return 0; (Chong||chong->GioiTinh()==0)

Chong = (Nam*)chong; Chong->Cuoi(this); return 1; } void Nu::SinhCon(char *ten, int gioitinh) { Nguoi* nguoi = TaoNguoi(ten, gioitinh, Chong, this); ThemCon(nguoi); if (Chong) Chong->ThemCon(nguoi); for (int i=0; i<SoCon; i++) { CacCon[i]->ThemEm(nguoi); nguoi->ThemAnhChi(CacCon[i]); }

} Trong phng thc sinh con dng hm TaoNguoi to ra mt th hin ca lp Nam hay Nu ph thuc vo gii tnh. i tng mi to ra s c gia nhp vo cng ng v c xem xt cc mi quan h sau ny, chi tit v hm ny chng ta s bn lun sau. Sau khi c i tng th cc mi quan h gia nh cha, m, con ci, anh, ch, em phi c xc lp. Thc hin ci t cc phng thc tr li cu hi quan h ca lp Con ngi. i vi cc mi quan h gn nh LaAnh, LaCha th vic kim tra rt n gin thng qua cc thuc tnh Bo, Me, AnhChi,... ca i tng. Nhng i vi mi quan h xa hn cht t nh LaOngNoi, LaCo, LaChu,... th tr nn kh khn hn nhiu. Chng ta dng mt phng php kim tra n gin theo m hnh ton hc. V d, A l ng ni ca B khi v ch khi trong cng ng tn ti mt i tng X m A l cha ca X v X l cha ca B. Nh vy thc hin c kim tra ny th cn phi lu c ton b cc i tng trong cng ng phc v tm kim X. Trong chng trnh dng mt mng tnh cc con tr ti i tng Con ngi qun l cng ng ngi ny. Mng ny c khai bo nh mt thnh phn tnh ca lp Con ngi. Phng thc TaoNguoi s to mt i tng l Nam hoc N ph thuc gii tnh truyn vo. i tng mi to ra s c thm vo cng ng. Phng thc TimNguoi tm i tng trong cng ng c tn nh tn a vo, nu khng tm thy tr v NULL. Di y l mt s b sung cho lp Con ngi. class Nguoi { . . . static Nguoi* NhanDan[100]; static int SoDan; public:

. . . static int LaySoDan() { return SoDan; } static Nguoi* ThemDan(Nguoi* nguoi) { return NhanDan[SoDan++] = nguoi; } static Nguoi* TaoNguoi(char*, int, Nam *bo=0, Nu *me=0); static Nguoi* TimNguoi(char* ten); }; Nguoi* Nguoi::NhanDan[]; int Nguoi::SoDan = 0;

Nguoi* Nguoi::TaoNguoi(char* ten, int gioitinh, Nam *bo, Nu *me) { return gioitinh ? ThemDan(new Nam(ten, bo, me)) : ThemDan(new Nu(ten, bo, me)); } Nguoi* Nguoi::TimNguoi(char* ten) { for (int i=0; i<SoDan; i++) if (strcmp(ten, >LayTen())==0) return NhanDan[i]; NhanDan[i]-

return 0; } Sau khi t chc c d liu lu tr con ngi chng ta c th xy dng cc hm kim tra quan h nh di y. A l i tng gi hm kim tra, B l i tng truyn vo, X l i tng tm kim NhanDan[i] (dng vng for duyt). int Nguoi::LaOngNoi(Nguoi *nguoi) { if (GioiTinh()==0) return 0; for (int i=0; i<SoDan; i++) if (LaCha(NhanDan[i])&&NhanDan[i]>LaCha(nguoi)) return 1; return 0; } int Nguoi::LaBaNoi(Nguoi *nguoi) { if (GioiTinh()) return 0; for (int i=0; i<SoDan; i++) if (LaMe(NhanDan[i])&&NhanDan[i]>LaCha(nguoi)) return 1; return 0; } Mc ch ca chng trnh l sau khi c d liu phi tr li c cu hi quan h khi a tn hai ngi vo. Sau khi ngi s dng a tn vo chng ta s tm i tng trong cng ng. Nu tm thy th gi hm a ra thng bo quan h ca hai i tng va tm thy.

Trong hm di y thc hin bng cch kim tra cc quan h b trn nu tt c khng tho mn th li i ngc li i tng gi phng thc kim tra. char qh[256]; // a ra thng bo v quan h ca 2 i tng char* QuanHe(Nguoi* A, Nguoi* B) { for (int i=1; i<=2; i++) { strcpy(qh, A->LayTen()); strcat(qh, " va "); strcat(qh, B->LayTen()); strcat(qh, " co quan he "); if (A->LaOngNoi(B)) return noi"); if (A->LaBaNoi(B)) return noi"); if (A->LaOngNgoai(B)) return ngoai"); if (A->LaBaNgoai(B)) return ngoai"); if (A->LaCha(B)) return strcat(qh, "cha con"); if (A->LaMe(B)) return strcat(qh, "me con"); if (A->LaCo(B)) strcat(qh, "ba chau strcat(qh, "ong chau strcat(qh, "ba chau strcat(qh, "ong chau

return strcat(qh, "co chau"); if (A->LaDi(B)) return strcat(qh, "di chau"); if (A->LaChu(B)) return strcat(qh, "chu chau"); if (A->LaBac(B)) return strcat(qh, "bac chau"); if (A->LaAnh(B)) return strcat(qh, "anh em"); if (A->LaChi(B)) return strcat(qh, "chi em"); if (A->LaAnhHo(B)) return ho"); if (A->LaChiHo(B)) return ho"); if (A->LaVo(B)) return strcat(qh, "vo chong"); Nguoi* temp = A; A = B; B = temp; } strcpy(qh, A->LayTen()); strcat(qh, " va "); strcat(qh, B->LayTen()); return strcat(qh, " khong co quan he gia dinh"); strcat(qh, "chi em strcat(qh, "anh em

} // tm quan h ca hai i tng c tn nhp vo t bn phm void TimQuanHe() { clrscr(); char ten1[25]; cout << "Ten nguoi thu nhat: "; gets(ten1); Nguoi *A = Nguoi::TimNguoi(ten1); if (A==0) { cout << "Khong co nguoi ten " << ten1 << endl; getch(); return; } char ten2[25]; cout << "Ten nguoi thu hai: "; gets(ten2); Nguoi *B = Nguoi::TimNguoi(ten2); if (B==0) { cout << "Khong co nguoi ten " << ten2 << endl; getch(); return; } cout << QuanHe(A, B) << endl;

getch(); } n gin trong vic thit k nhp d liu cho chng trnh, chng ta dng phng php nhp d liu t tp. Vic hnh thnh con ngi v cc mi quan h ca chng l thng qua cc s kin chnh: To mt con ngi, m ci ca hai ngi, Sinh con ca ngi ph n. Do vy tp d liu phi th hin c iu ny. Dng tp vn bn m t cc s kin t ra thch hp trong trng hp ny. Di y l mt tp vn bn m t cho mt quan h gia nh n gin.
Thng (Nam) Mai (N)

Nga (N)

Tun (Nam)

Tp vn bn d liu:
Tao Thang 1 Tao Mai 0 Cuoi Thang Mai Sinh Mai Nga 0 Sinh Mai Tuan 1
To ngi tn Thng l nam

To ngi tn Mai l n

Thng ci Mai

Mai sinh con gi tn l Nga

Mai sinh con trai tn l Tun

Hm nhp d liu t tp vn bn. void NhapDuLieu() { clrscr(); char s[80]; cout << "Ten tep nhap du lieu: "; cin >> s; ifstream ios::in|ios::nocreate); input.seekg(0L, ios::end ); if ( input.tellg() < 0) getch(); return; } input.seekg(0L, ios::beg); cout << "Dang nhap du lieu........\n"; int dong = 1; while (1) { input.getline(s, sizeof(s)); if (input.gcount()==0) break; if (strcmp(s, "")==0) dong++; continue; } if (strcmp(s, "Tao")==0) { char ten[25]; input.getline(ten, sizeof(ten)); if (strcmp(ten, "")) { { { cout << "Loi mo tep ! \n"; input(s,

int gt; input >> gt; cout << "Tao nguoi ten " << ten << endl; if (Nguoi::TimNguoi(ten)) cout << "Da co nguoi ten la " << ten << endl; else Nguoi::TaoNguoi(ten, gt); dong += 2; continue; } } if (strcmp(s, "Cuoi")==0) { char ten1[25]; input.getline(ten1, sizeof(ten1)); char ten2[25]; input.getline(ten2, sizeof(ten2)); Nguoi* Nguoi::TimNguoi(ten1); Nguoi* Nguoi::TimNguoi(ten2); A B = =

cout << "Cuoi " << ten1 << " va "<< ten2 << endl; if (A==0) cout << "Khong co nguoi ten " << ten1 << endl; if (B==0)

cout << "Khong co nguoi ten " << ten2 << endl; if (A&&B&&A->Cuoi(B)==0) cout duoc\n"; dong += 2; continue; } if (strcmp(s, "Sinh")==0) { char ten1[25]; input.getline(ten1, sizeof(ten1)); char ten2[25]; input.getline(ten2, sizeof(ten2)); if (strcmp(ten2, "")) { cout << ten1 << " sinh con "<< ten2 << endl; Nguoi* Nguoi::TimNguoi(ten1); if (A==0) cout << "Khong co nguoi ten " << ten1 << endl; int gt; input >> gt; if (Nguoi::TimNguoi(ten2)) cout << "Da co nguoi ten la " << ten2 << endl; else { A = << "Khong cuoi

if ( A ) if >GioiTinh() ) cout << ten1 <<" la nam khong sinh con duoc\n"; else ((Nu*)A)>SinhCon(ten2, gt); } dong += 3; continue; } } cout << "Loi o dong thu " << dong << endl; break; } cout << "Ket thuc nhap.\n"; getch(); } Vit thm menu cho chng trnh c dng nh sau: Lua chon cong viec theo so 1. Nhap du lieu 2. Tim quan he 3. Ket thuc void Menu() { clrscr(); cout << "\n\n theo so\n\n"; Lua chon cong viec ( A-

cout << " cout << " cout << " } void main(){ int i; Menu(); do {

1. Nhap du lieu\n"; 2. Tim quan he\n"; 3. Ket thuc\n";

i = getch(); switch (i) case '1': Nguoi::XoaDuLieu(); NhapDuLieu(); Menu(); break; case '2': TimQuanHe(); Menu(); } }while (i!='3'); Nguoi::XoaDuLieu(); } V d sau khi nhp d liu cho chng trnh t tp d liu nh ta c trn v thc hin tm quan h mn hnh s c dng nh sau Ten nguoi thu nhat: Thang Ten nguoi thu hai: Mai Mai va Thang co quan he vo chong {

Ph lc 4 M chng trnh Bi ton Quan h gia nh #include <fstream.h>

#include <string.h> #include <conio.h> #include <stdio.h> class Nguoi { friend class Nam; friend class Nu; static Nguoi* NhanDan[100]; static int SoDan; char Ten[25]; Nam *Bo; Nu *Me; Nguoi *CacCon[10]; *AnhChi[10], *CacEm[10],

int SoAnhChi, SoEm, SoCon; Nguoi(char *ten, Nam *bo, Nu *me) : Bo(bo), SoEm(0), SoCon(0) { strcpy(Ten, ten); } void ThemAnhChi(Nguoi* nguoi) { AnhChi[SoAnhChi++] = nguoi; Me(me), SoAnhChi(0),

} void ThemEm(Nguoi* nguoi) { CacEm[SoEm++] = nguoi; } void ThemCon(Nguoi* nguoi) { CacCon[SoCon++] = nguoi; } public: static int LaySoDan() { return SoDan; } static Nguoi* ThemDan(Nguoi* nguoi) { return NhanDan[SoDan++] = nguoi; } static Nguoi* TaoNguoi(char* ten, int gioitinh, Nam *bo=0, Nu *me=0); static Nguoi* TimNguoi(char* ten); static void XoaDuLieu(); virtual int GioiTinh()=0; virtual int Cuoi(Nguoi*)=0; int LaCha(Nguoi *); int LaMe(Nguoi *); int LaCon(Nguoi *);

int LaAnh(Nguoi *); int LaChi(Nguoi *); int LaEm(Nguoi *); int LaCo(Nguoi *); int LaDi(Nguoi *); int LaChu(Nguoi *); int LaCau(Nguoi *); int LaMo(Nguoi *); int LaBac(Nguoi *); int LaOngNoi(Nguoi *); int LaBaNoi(Nguoi *); int LaOngNgoai(Nguoi *); int LaBaNgoai(Nguoi *); int LaAnhHo(Nguoi *); int LaChiHo(Nguoi *); int LaEmHo(Nguoi *); virtual int LaVo(Nguoi*)=0; virtual int LaChong(Nguoi*)=0; char* LayTen() { return Ten; } }; Nguoi* Nguoi::NhanDan[]; int Nguoi::SoDan = 0;

class Nam : public Nguoi {

Nu *Vo; int LaVo(Nguoi *) { return 0; } public: Nam(char *ten, Nam *bo=0, Nu *me=0) : Nguoi(ten, bo, me), Vo(0) {} int GioiTinh() { return 1; } int Cuoi(Nguoi *vo); int LaChong(Nguoi * nguoi); }; class Nu : public Nguoi { Nam *Chong; int LaChong(Nguoi *) { return 0; } public: Nu(char *ten, Nam *bo=0, Nu *me=0) : Nguoi(ten, bo, me), Chong(0) {} int GioiTinh() { return 0; }

int Cuoi(Nguoi *chong); void SinhCon(char* ten, int gioitinh); int LaVo(Nguoi * nguoi); }; Nguoi* Nguoi::TaoNguoi(char* gioitinh, Nam *bo, Nu *me) { return gioitinh ? ThemDan(new Nam(ten, bo, me)) : ThemDan(new Nu(ten, bo, me)); } Nguoi* Nguoi::TimNguoi(char* ten) { for (int i=0; i<SoDan; i++) if (strcmp(ten, NhanDan[i]>LayTen())==0) return NhanDan[i]; return 0; } void Nguoi::XoaDuLieu() { for (int i=0; i<SoDan; i++) delete NhanDan[i]; SoDan = 0; } ten, int

inline int Nguoi::LaCha(Nguoi *nguoi) { return nguoi->Bo==this; } inline int Nguoi::LaMe(Nguoi *nguoi) { return nguoi->Me==this; } int Nguoi::LaCon(Nguoi *nguoi) { return >LaMe(this); } int Nguoi::LaAnh(Nguoi *nguoi) { if (GioiTinh()==0) return 0; return nguoi->LaEm(this); } int Nguoi::LaChi(Nguoi *nguoi) { if (GioiTinh()) return 0; return nguoi->LaEm(this); } int Nguoi::LaEm(Nguoi *nguoi) { for (int i=0; i<SoAnhChi; i++) if (AnhChi[i]==nguoi) return 1; return 0; } nguoi->LaCha(this)||nguoi-

int Nguoi::LaCo(Nguoi *nguoi) { if (GioiTinh()) return 0; for (int i=0; i<SoDan; i++) { if (NhanDan[i]>LaAnh(this)&&NhanDan[i]->LaCha(nguoi)) return 1; } return 0; } int Nguoi::LaDi(Nguoi *nguoi) { if (GioiTinh()) return 0; for (int i=0; i<SoDan; i++) if (NhanDan[i]>LaChi(this)&&NhanDan[i]->LaMe(nguoi)) return 1; return 0; } int Nguoi::LaChu(Nguoi *nguoi) { if (GioiTinh()==0) return 0; for (int i=0; i<SoDan; i++) if (LaEm(NhanDan[i])&&NhanDan[i]>LaCha(nguoi)) return 1; return 0; } int LaCau(Nguoi *nguoi) {

if (GioiTinh()==0) return 0; for (int i=0; i<SoDan; i++) if (LaEm(NhanDan[i])&&NhanDan[i]>LaMe(nguoi)) return 1; return 0; } int LaMo(Nguoi *nguoi) { if (GioiTinh()) return 0; for (int i=0; i<SoDan; i++) if (LaVo(NhanDan[i])&&NhanDan[i]>LaCau(nguoi)) return 1; return 0; } int Nguoi::LaBac(Nguoi *nguoi) { for (int i=0; i<SoDan; i++) if (NhanDan[i]->LaEm(this)&&nguoi>LaCon(NhanDan[i])) return 1; return 0; } int Nguoi::LaOngNoi(Nguoi *nguoi) { if (GioiTinh()==0) return 0; for (int i=0; i<SoDan; i++) if (LaCha(NhanDan[i])&&NhanDan[i]>LaCha(nguoi)) return 1; return 0; }

int Nguoi::LaBaNoi(Nguoi *nguoi) { if (GioiTinh()) return 0; for (int i=0; i<SoDan; i++) if (LaMe(NhanDan[i])&&NhanDan[i]>LaCha(nguoi)) return 1; return 0; } int Nguoi::LaOngNgoai(Nguoi *nguoi) { if (GioiTinh()==0) return 0; for (int i=0; i<SoDan; i++) if (LaCha(NhanDan[i])&&NhanDan[i]>LaMe(nguoi)) return 1; return 0; } int Nguoi::LaBaNgoai(Nguoi *nguoi) { if (GioiTinh()) return 0; for (int i=0; i<SoDan; i++) if (LaMe(NhanDan[i])&&NhanDan[i]>LaMe(nguoi)) return 1; return 0; } int Nguoi::LaAnhHo(Nguoi *nguoi) { if (GioiTinh()==0) return 0; return nguoi->LaEmHo(this); }

int Nguoi::LaChiHo(Nguoi *nguoi) { if (GioiTinh()) return 0; return nguoi->LaEmHo(this); } int Nguoi::LaEmHo(Nguoi *nguoi) { for (int i=0; i<SoDan; i++) if LaCon(NhanDan[i])&&(NhanDan[i]>LaChu(nguoi) ||NhanDan[i]>LaDi(nguoi)||NhanDan[i]->LaCo(nguoi)) return 1; return 0; } int Nam::Cuoi(Nguoi *vo) { if (Vo||vo->GioiTinh()) return 0; Vo = (Nu*)vo; Vo->Cuoi(this); return 1; } inline int Nam::LaChong(Nguoi *nguoi) { return Vo==nguoi; } int Nu::Cuoi(Nguoi *chong) { (

if return 0;

(Chong||chong->GioiTinh()==0)

Chong = (Nam*)chong; Chong->Cuoi(this); return 1; } void Nu::SinhCon(char *ten, int gioitinh) { Nguoi* nguoi = TaoNguoi(ten, gioitinh, Chong, this); ThemCon(nguoi); if (Chong) Chong->ThemCon(nguoi); for (int i=0; i<SoCon; i++) { CacCon[i]->ThemEm(nguoi); nguoi->ThemAnhChi(CacCon[i]); } } inline int Nu::LaVo(Nguoi *nguoi) { return Chong==nguoi; } char qh[256]; char* QuanHe(Nguoi* A, Nguoi* B) { for (int i=1; i<=2; i++) {

strcpy(qh, A->LayTen()); strcat(qh, " va "); strcat(qh, B->LayTen()); strcat(qh, " co quan he "); if (A->LaOngNoi(B)) return noi"); if (A->LaBaNoi(B)) return noi"); if (A->LaOngNgoai(B)) return ngoai"); if (A->LaBaNgoai(B)) return ngoai"); if (A->LaCha(B)) return strcat(qh, "cha con"); if (A->LaMe(B)) return strcat(qh, "me con"); if (A->LaCo(B)) return strcat(qh, "co chau"); if (A->LaDi(B)) return strcat(qh, "di chau"); if (A->LaChu(B)) return strcat(qh, "chu chau"); if (A->LaBac(B)) return strcat(qh, "bac chau"); if (A->LaAnh(B)) strcat(qh, "ba chau strcat(qh, "ong chau strcat(qh, "ba chau strcat(qh, "ong chau

return strcat(qh, "anh em"); if (A->LaChi(B)) return strcat(qh, "chi em"); if (A->LaAnhHo(B)) return ho"); if (A->LaChiHo(B)) return ho"); if (A->LaVo(B)) return strcat(qh, "vo chong"); Nguoi* temp = A; A = B; B = temp; } strcpy(qh, A->LayTen()); strcat(qh, " va "); strcat(qh, B->LayTen()); return strcat(qh, " khong co quan he gia dinh"); } // th tc nhp d liu t tp to cy gia nh void NhapDuLieu() { clrscr(); char s[80]; cout << "Ten tep nhap du lieu: "; strcat(qh, "chi em strcat(qh, "anh em

cin >> s; ifstream ios::in|ios::nocreate); input.seekg(0L, ios::end ); if ( input.tellg() < 0) { cout << "Loi mo tep ! \n"; getch(); return; } input.seekg(0L, ios::beg); cout << "Dang nhap du lieu........\n"; int dong = 1; while (1) { input.getline(s, sizeof(s)); if (input.gcount()==0) break; if (strcmp(s, "")==0) { dong++; continue; } if (strcmp(s, "Tao")==0) { char ten[25]; input.getline(ten, sizeof(ten)); input(s,

if (strcmp(ten, "")) { int gt; input >> gt; cout << "Tao nguoi ten " << ten << endl; if (Nguoi::TimNguoi(ten)) cout << "Da co nguoi ten la " << ten << endl; else Nguoi::TaoNguoi(ten, gt); dong += 2; continue; } } if (strcmp(s, "Cuoi")==0) { char ten1[25]; input.getline(ten1, sizeof(ten1)); char ten2[25]; input.getline(ten2, sizeof(ten2)); Nguoi* Nguoi::TimNguoi(ten1); Nguoi* Nguoi::TimNguoi(ten2); A B = =

cout << "Cuoi " << ten1 << " va "<< ten2 << endl;

if (A==0) cout << "Khong co nguoi ten " << ten1 << endl; if (B==0) cout << "Khong co nguoi ten " << ten2 << endl; if (A&&B&&A->Cuoi(B)==0) cout duoc\n"; dong += 2; continue; } if (strcmp(s, "Sinh")==0) { char ten1[25]; input.getline(ten1, sizeof(ten1)); char ten2[25]; input.getline(ten2, sizeof(ten2)); if (strcmp(ten2, "")) { cout << ten1 << " sinh con "<< ten2 << endl; Nguoi* Nguoi::TimNguoi(ten1); A = << "Khong cuoi

if (A==0) cout << "Khong co nguoi ten " << ten1 << endl; int gt; input >> gt; if (Nguoi::TimNguoi(ten2)) cout << "Da co nguoi ten la " << ten2 << endl;

else { if ( A ) if >GioiTinh() ) cout << ten1 << " la nam khong sinh con duoc\n"; else ((Nu*)A)>SinhCon(ten2, gt); } dong += 3; continue; } } cout << "Loi o dong thu " << dong << endl; break; } cout << "Ket thuc nhap.\n"; getch(); } void TimQuanHe() { clrscr(); char ten1[25]; cout << "Ten nguoi thu nhat: "; gets(ten1); ( A-

Nguoi *A = Nguoi::TimNguoi(ten1); if (A==0) { cout << "Khong co nguoi ten " << ten1 << endl; getch(); return; } char ten2[25]; cout << "Ten nguoi thu hai: "; gets(ten2); Nguoi *B = Nguoi::TimNguoi(ten2); if (B==0) { cout << "Khong co nguoi ten " << ten2 << endl; getch(); return; } cout << QuanHe(A, B) << endl; getch(); } void Menu() { clrscr(); cout << "\n\n theo so\n\n"; cout << " Lua chon cong viec

1. Nhap du lieu\n";

cout << " cout << " } void main() { int i; Menu(); do {

2. Tim quan he\n"; 3. Ket thuc\n";

i = getch(); switch (i) { case '1': Nguoi::XoaDuLieu(); NhapDuLieu(); Menu(); break; case '2': TimQuanHe(); Menu(); } }while (i!='3'); Nguoi::XoaDuLieu(); }

You might also like