Professional Documents
Culture Documents
M u
Chng ny gii thiu nhng phn c bn ca mt chng trnh C++. Chng ta s dng nhng v d n gin trnh by cu trc cc chng trnh C++ v cch thc bin dch chng. Cc khi nim c bn nh l hng, bin, v vic lu tr chng trong b nh cng s c tho lun trong chng ny. Sau y l mt c t s b v khi nim lp trnh.
Lp trnh
My tnh s l mt cng c gii quyt hng lot cc bi ton ln. Mt li gii cho mt bi ton no c gi l mt gii thut (algorithm); n m t mt chui cc bc cn thc hin gii quyt bi ton. Mt v d n gin cho mt bi ton v mt gii thut c th l: Bi ton: Sp xp mt danh sch cc s theo th t tng dn. Gii thut:Gi s danh sch cho l list1; to ra mt danh sch rng, list2, lu danh sch sp xp. Lp i lp li cng vic, tm s nh nht trong list1, xa n khi list1, v thm vo phn t k tip trong danh sch list2, cho n khi list1 l rng. Gii thut c din gii bng cc thut ng tru tng mang tnh cht d hiu. Ngn ng tht s c hiu bi my tnh l ngn ng my. Chng trnh c din t bng ngn ng my c gi l c th thc thi. Mt chng trnh c vit bng bt k mt ngn ng no khc th trc ht cn c dch sang ngn ng my my tnh c th hiu v thc thi n. Ngn ng my cc k kh hiu i vi lp trnh vin v th h khng th s dng trc tip ngn ng my vit chng trnh. Mt s tru tng khc l ngn ng assembly. N cung cp nhng tn d nh cho cc lnh v mt k hiu d hiu hn cho d liu. B dch c gi l assembler chuyn ngn ng assembly sang ngn ng my. Ngay c nhng ngn ng assembly cng kh s dng. Nhng ngn ng cp cao nh C++ cung cp cc k hiu thun tin hn nhiu cho vic thi hnh cc gii thut. Chng gip cho cc lp trnh vin khng phi ngh nhiu v cc thut ng cp thp, v gip h ch tp trung vo gii thut. Trnh bin dch (compiler) s m nhim vic dch chng trnh vit bng ngn ng cp cao sang ngn ng assembly. M assembly c to ra bi trnh bin dch sau s c tp hp li cho ra mt chng trnh c th thc thi.
Chng 1: M u
3 4
Hng ny s dng ch th tin x l #include chn vo ni dung ca tp tin header iostream.h trong chng trnh. iostream.h l tp tin header chun ca C++ v cha ng cc nh ngha cho xut v nhp. Hng ny nh ngha mt hm c gi l main. Hm c th khng c hay c nhiu tham s (parameters); cc tham s ny lun xut hin sau tn hm, gia mt cp du ngoc. Vic xut hin ca t void gia du ngoc ch nh rng hm main khng c tham s. Hm c th c kiu tr v; kiu tr v lun xut hin trc tn hm. Kiu tr v cho hm main l int (v d: mt s nguyn). Tt c cc chng trnh C++ phi c mt hm main duy nht.Vic thc thi chng trnh lun bt u t hm main. Du ngoc nhn bt u thn ca hm main. Hng ny l mt cu lnh (statement). Mt lnh l mt s tnh ton cho ra mt gi tr. Kt thc mt lnh th lun lun c nh du bng du chm phy (;). Cu lnh ny xut ra chui "Hello World\n" gi n dng xut cout. Chui l mt dy cc k t c t trong cp nhy kp. K t cui cng trong chui ny (\n) l mt k t xung hng (newline). Dng l mt i tng c dng thc hin cc xut hoc nhp. cout l dng xut chun trong C++ (xut chun thng c hiu l mn hnh my tnh). K t << l ton t xut, n xem dng xut nh l ton hng tri v xem biu thc nh l ton hng phi, v to nn gi tr ca biu thc c gi n dng xut. Trong trng hp ny, kt qu l chui "Hello World\n" c gi n dng cout, lm cho n c hin th trn mn hnh my tnh. Du ngoc ng kt thc thn hm main.
Bng 1.1
1 2 3 4
Ch gii
Lnh triu gi b dch AT&T ca C++ trong mi trng UNIX l CC. i s cho lnh ny (hello.cc) l tn ca tp tin cha ng chng trnh. Theo qui nh th tn tp tin c phn m rng l .c, .C, hoc l .cc. (Phn m rng ny c th l khc nhau i vi nhng h iu hnh khc nhau) 2 Kt qu ca s bin dch l mt tp tin c th thc thi mc nh l a.out. chy chng trnh, chng ta s dng a.out nh l lnh. 3 y l kt qu c cung cp bi chng trnh. 4 Du nhc tr v h thng ch nh rng chng trnh hon tt s thc thi ca n. Lnh cc chp nhn cc phn ty chn. Mi ty chn xut hin nh name, trong name l tn ca ty chn (thng l mt k t n). Mt vi ty chn yu cu c i s. V d ty chn xut (-o) cho php ch nh r tp tin c th c cung cp bi trnh bin dch thay v l a.out. Bng 1.2 minh ha vic s dng ty chn ny bng cch ch nh r hello nh l tn ca tp tin c th thc thi.
Bng 1.2 1 2 3 4 $ CC hello.cc -o hello $ hello Hello World $
Mc d lnh thc s c th khc ph thuc vo trnh bin dch, mt th tc bin dch tng t c th c dng di mi trng MS-DOS. Trnh bin dch C++ da trn Windows dng tng mt mi trng thn thin vi ngi dng m vic bin dch rt n gin bng cch chn lnh t menu. Qui nh tn di MS-DOS v Windows l tn ca tp tin ngun C++ phi c phn m rng l .cpp.
Sau , trnh bin dch C++ dch cc m ca chng trnh. Trnh bin dch c th l mt trnh bin dch C++ tht s pht ra m assembly hay m my, hoc ch l trnh chuyn i dch m sang C. trng hp th hai, m C sau khi c dch ra s to thnh m assembly hay m my thng qua trnh bin dch C. Trong c hai trng hp, u ra c th khng hon chnh v chng trnh tham kho ti cc th tc trong th vin cn cha c nh ngha nh mt phn ca chng trnh. V d Danh sch 1.1 tham chiu ti ton t << m thc s c nh ngha trong mt th vin IO ring bit. Cui cng, trnh lin kt hon tt m i tng bng cch lin kt n vi m i tng ca bt k cc module th vin m chng trnh tham kho ti. Kt qu cui cng l mt tp tin thc thi.
Hnh 1.1 minh ha cc bc trn cho c hai trnh chuyn i C++ v trnh bin dch C++. Thc t th tt c cc bc trn c triu gi bi mt lnh n (nh l CC) v ngi dng thm ch s khng thy cc tp tin c pht ra ngay lp tc.
Hnh 1.1 Vic bin dch C++
C++ Program C++ TRANSLATOR C Code C COMPILER
C++ Program
Object Code
LINKER
Executable
1.4. Bin
Bin l mt tn tng trng cho mt vng nh m d liu c th c lu tr trn hay l c s dng li. Cc bin c s dng gi cc gi tr d liu v th m chng c th c dng trong nhiu tnh ton khc nhau trong mt chng trnh. Tt c cc bin c hai thuc tnh quan trng: Kiu c thit lp khi cc bin c nh ngha (v d nh: integer, real, character). Mt khi c nh ngha, kiu ca mt bin C++ khng th c chuyn i.
Chng 1: M u
Gi tr c th c chuyn i bng cch gn mt gi tr mi cho bin. Loi gi tr ca bin c th nhn ph thuc vo kiu ca n. V d, mt bin s nguyn ch c th gi cc gi tr nguyn (chng hn, 2, 100, -12). Danh sch 1.2 minh ha s dng mt vi bin n gin.
Danh sch 1.2 1 #include <iostream.h> 2 int main (void) 3 { 4 int workDays; 5 float workHours, payRate, weeklyPay; 6 7 8 9 10 11 } Ch gii workDays = 5; workHours = 7.5; payRate = 38.55; weeklyPay = workDays * workHours * payRate; cout << "Weekly Pay = "<< weeklyPay<< '\n';
Hng ny nh ngha mt bin int (kiu s nguyn) tn l workDays, bin ny i din cho s ngy lm vic trong tun. Theo nh lut chung, trc tin mt bin c nh ngha bng cch ch nh kiu ca n, theo sau l tn bin v cui cng l c kt thc bi du chm phy. 5 Hng ny nh ngha ba bin float (kiu s thc) ln lt thay cho s gi lm vic trong ngy, s tin phi tr hng gi, v s tin phi tr hng tun. Nh chng ta thy hng ny, nhiu bin ca cng kiu c th nh ngha mt lt qua vic dng du phy ngn cch chng. 6 Hng ny l mt cu lnh gn. N gn gi tr 5 cho bin workDays. V th, sau khi cu lnh ny c thc thi, workDays biu th gi tr 5. 7 Hng ny gn gi tr 7.5 ti bin workHours. 8 Hng ny gn gi tr 38.55 ti bin payRate. 9 Hng ny tnh ton s tin phi tr hng tun t cc bin workDays, workHours, v payRate (* l ton t nhn). Gi tr kt qu c lu vo bin weeklyPay. 10-12 Cc hng ny xut ba mc tun t l: chui "Weekly Pay = ", gi tr ca bin weeklyPay, v mt k t xung dng. Khi chy, chng trnh s cho kt qu nh sau:
Weekly Pay = 1445.625
Khi mt bin c nh ngha, gi tr ca n khng c nh ngha cho n khi n c gn cho mt gi tr tht s. V d, weeklyPay c mt gi tr khng c nh ngha cho n khi hng 9 c thc thi. Vic gn gi tr cho mt bin ln u tin c gi l khi to. Vic chc chn rng mt
Chng 1: M u
5
bin c khi to trc khi n c s dng trong bt k cng vic tnh ton no l rt quan trng. Mt bin c th c nh ngha v khi to cng lc. iu ny c xem nh l mt thi quen lp trnh tt bi v n ginh trc kh nng s dng bin trc khi n c khi to. Danh sch 1.3 l mt phin bn sa li ca danh sch 1.2 m c s dng k thut ny. Trong mi mc ch khc nhau th hai chng trnh l tng tng.
Danh sch 1.3 1 #include <iostream.h> 2 int main (void) 3 { 4 int workDays = 5; 5 float workHours = 7.5; 6 float payRate = 38.55; 7 float weeklyPay = workDays * workHours * payRate; 8 9 10 11 } cout << "Weekly Pay = "; cout << weeklyPay; cout << '\n';
Chng 1: M u
Ch gii
Hng ny xut ra li nhc nh What is the hourly pay rate? tm d liu nhp ca ngi dng. 8 Hng ny c gi tr nhp c g bi ngi dng v sao chp gi tr ny ti bin payRate. Ton t nhp >> ly mt dng nhp nh l ton hng tri (cin l dng nhp chun ca C++ m tng ng vi d liu c nhp vo t bn phm) v mt bin (m d liu nhp c sao chp ti) nh l ton hng phi. 9-13 Phn cn li ca chng trnh l nh trc. Khi chy, chng trnh s xut ra mn hnh nh sau (d liu nhp ca ngi dng c in m):
What is the hourly pay rate? 33.55 Weekly Pay = 1258.125
C hai << v >> tr v ton hng tri nh l kt qu ca chng, cho php nhiu thao tc nhp hay nhiu thao tc xut c kt hp trong mt cu lnh. iu ny c minh ha trong danh sch 1.5 vi trng hp cho php nhp c s gi lm vic mi ngy v s tin phi tr mi gi.
Danh sch 1.5 1 #include <iostream.h> 2 int main (void) 3 { 4 int workDays = 5; 5 float workHours, payRate, weeklyPay; 6 7 8 9 10 } Ch gii cout << "What are the work hours and the hourly pay rate? "; cin >> workHours >> payRate; weeklyPay = workDays * workHours * payRate; cout << "Weekly Pay = " << weeklyPay << '\n';
Hng ny c hai gi tr nhp c nhp vo t ngi dng v chp tng ng chng ti hai bin workHours v payRate. Hai gi tr cn c tch bit bi mt khng gian trng (chng hn, mt hay l nhiu khon trng hay l cc k t tab). Cu lnh ny tng ng vi:
(cin >> workHours) >> payRate;
V kt qu ca >> l ton hng tri, (cin >> workHours) nh gi cho cin m sau c s dng nh l ton hng tri cho ton t >> k tip.
Chng 1: M u
7
Hng ny l kt qu ca vic kt hp t hng 10 n hng 12 trong danh sch 1.4. N xut "Weekly Pay = ", theo sau l gi tr ca bin weeklyPay, v cui cng l mt k t xung dng. Cu lnh ny tng ng vi:
((cout << "Weekly Pay = ") << weeklyPay) << '\n';
V kt qu ca << l ton hng tri, (cout << "Weekly Pay = ") nh gi cho cout m sau c s dng nh l ton hng tri ca ton t << k tip. Khi chy, chng trnh s hin th nh sau:
What are the work hours and the hourly pay rate? 7.5 33.55 Weekly Pay = 1258.125
1.6. Ch thch
Ch thch thng l mt on vn bn. N c dng gii thch mt vi kha cnh ca chng trnh. Trnh bin dch b qua hon ton cc ch thch trong chng trnh. Tuy nhin cc ch thch ny l c ngha v i khi l rt quan trng i vi ngi c (ngi xem cc m chng trnh c sn) v ngi pht trin phn mm. C++ cung cp hai loi ch thch: Nhng g sau // (cho n khi kt thc hng m n xut hin) c xem nh l mt ch thch. Nhng g ng ngoc trong cp du /* v */ c xem nh l mt ch thch. Danh sch 1.6 minh ha vic s dng c hai hnh thc ny.
Danh sch 1.6 1 #include <iostream.h> 2 /* Chuong trinh nay tinh toan tong so tien phai tra hang tuan cho mot cong nhan dua tren tong so gio 3 lam viec va so tien phai tra moi gio. */ 4 int main (void) 5 { 6 int workDays = 5; // so ngay lam viec trong tuan 7 float workHours = 7.5; // so gio lam viec trong ngay 8 float payRate = 33.50; // so tien phai tra moi gio 9 float weeklyPay; // tong so tien phai tra moi tuan 10 weeklyPay = workDays * workHours * payRate; 11 cout << "Weekly Pay = " << weeklyPay << '\n'; 12 } 13
Cc ch thch nn c s dng tng cng (khng phi gy tr ngi) vic c mt chng trnh. Mt vi im sau nn c ch :
Chng 1: M u
8
Ch thch nn d c v d hiu hn s gii thch thng qua m chng trnh. Th l khng c ch thch no cn hn c mt ch thch phc tp d gy lm ln mt cch khng cn thit. S dng qu nhiu ch thch c th dn n kh c. Mt chng trnh cha qu nhiu ch thch lm bn kh c th thy m th khng th no c xem nh l mt chng trnh d c v d hiu. Vic s dng cc tn m t c ngha cho cc bin v cc thc th khc trong chng trnh, v nhng ch tht vo ca m c th lm gim i vic s dng ch thch mt cch ng k, v cng gip cho lp trnh vin d c v kim sot chng trnh.
1.7. B nh
My tnh s dng b nh truy xut ngu nhin (RAM) lu tr m chng trnh thc thi v d liu m chng trnh thc hin. B nh ny c th c xem nh l mt chui tun t cc bit nh phn (0 hoc 1). Thng thng, b nh c chia thnh nhng nhm 8 bit lin tip (gi l byte). Cc byte c nh v lin tc. V th mi byte c th c ch nh duy nht bi a ch (xem Hnh 1.2).
Hnh 1.2 Cc bit v cc byte trong b nh
Byte Address 1211 ... Byte 1212 Byte 1213 Byte 1214 Byte 1215 Byte 1216 Byte 1217 Byte ... Memory
1 1 0 1 0 0 0 1
Bit
Trnh bin dch C++ pht ra m c th thc thi m sp xp cc thc th d liu ti cc v tr b nh. V d, nh ngha bin
int salary = 65000;
lm cho trnh bin dch cp pht mt vi byte cho bin salary. S byte cn c cp pht v phng thc c s dng cho vic biu din nh phn ca s nguyn ph thuc vo s thi hnh c th ca C++. Trnh bin dch s dng a ch ca byte u tin ca bin salary c cp pht tham kho ti n. Vic gn trn lm cho gi tr 65000 c lu tr nh l mt s nguyn b hai trong hai byte c cp pht (xem Hnh 1.3).
Hnh 1.3 Biu din ca mt s nguyn trong b nh.
Chng 1: M u
1212 Byte
1213 Byte
1214
1215
1216 Byte
1217 Byte
10110011 10110011
B nh ... Memory
salary
(a two-byte integer whose address is 1214)
Trong khi vic biu din nh phn chnh xc ca mt hng mc d liu l t khi c cc lp trnh vin quan tm ti th vic t chc chung ca b nh v s dng cc a ch tham kho ti cc hng mc d liu l rt quan trng.
1.8. S nguyn
Bin s nguyn c th c nh ngha l kiu short, int, hay long. Ch khc nhau l s int s dng nhiu hn hoc t nht bng s byte nh l mt s short, v mt s long s dng nhiu hn hoc t nht cng s byte vi mt s int. V d, trn my tnh c nhn th mt s short s dng 2 byte, mt s int cng 2 byte, v mt s long l 4 byte.
short age = 20; int salary = 65000; long price = 4500000;
Mc nh, mt bin s nguyn c gi s l c du (chng hn, c mt s biu din du m n c th biu din cc gi tr dng cng nh l cc gi tr m). Tuy nhin, mt s nguyn c th c nh ngha l khng c du bng cch s dng t kha unsigned trong nh ngha ca n. T kha signed cng c cho php nhng hi d tha.
unsigned short age = 20; unsigned int salary = 65000; unsigned long price = 4500000;
S nguyn (v d, 1984) lun lun c gi s l kiu int, tr khi c mt hu t L hoc l th n c hiu l kiu long. Mt s nguyn cng c th c c t s dng hu t l U hoc u., v d:
1984L 1984l 1984U 1984u 1984LU 1984ul
1.9. S thc
Bin s thc c th c nh ngha l kiu float hay double. Kiu double s dng nhiu byte hn v v th cho min ln hn v chnh xc hn biu din cc s thc. V d, trn cc my tnh c nhn mt s float s dng 4 byte v mt s double s dng 8 byte.
Chng 1: M u
10
S thc (v d, 0.06) lun lun c gi s l kiu double, tr phi c mt hu t F hay f th n c hiu l kiu float, hoc mt hu t L hay l th n c hiu l kiu long double. Kiu long double s dng nhiu byte hn kiu double cho chnh xc tt hn (v d, 10 byte trn cc my PC). V d:
0.06F 0.06f 3.141592654L 3.141592654l
Cc s thc cng c th c biu din theo cch k hiu ha khoa hc. V d, 0.002164 c th c vit theo cch k hiu ha khoa hc nh sau:
2.164E-3 or 2.164e-3
K t E (hay e) thay cho s m (exponent). Cch k hiu ha khoa hc c thng dch nh sau:
2.164E-3 = 2.164 10-3 = 0.002164
1.10.K t
Bin k t c nh ngha l kiu char. Mt bin k t chim mt byte n lu gi m cho k t. M ny l mt gi tr s v ph thuc h thng m k t ang c dng (ngha l ph thuc my). H thng chung nht l ASCII (American Standard Code for Information Interchange). V d, k t A c m ASCII l 65, v k t a c m ASCII l 97.
char ch = 'A';
Ging nh s nguyn, bin k t c th c ch nh l c du hoc khng du. Mc nh (trong hu ht cc h thng) char ngha l signed char. Tuy nhin, trn vi h thng th n c ngha l unsigned char. Bin k t c du c th gi gi tr s trong min gi tr t -128 ti 127. Bin k t khng du c th gi gi tr s trong min gi tr t 0 t 255. Kt qu l, c hai thng c dng biu din cc s nguyn nh trong chng trnh (v c th c nh du cc gi tr s nh l s nguyn):
signed char unsigned char offset = -88; row = 2, column = 26;
K t c vit bng cch ng du k t gia cp nhy n (v d, 'A'). Cc k t m khng th in ra c biu din bng vic s dng cc m escape. V d: '\n' '\r'
Chng 1: M u
Cc du nhy n, nhy i v k t gch cho ngc cng c th s dng k hiu escape: '\'' '\"' '\\' // trch dn n (') // trch dn i (") // du vch cho ngc (\)
K t cng c th c ch nh r s dng gi tr m s ca chng. M escape tng qut \ooo (ngha l, 3 k t s c s 8 theo sau mt du gch cho ngc) c s dng cho mc ch ny. V d (gi s ASCII): '\12' '\11' '\101' '\0' // hng mi (m thp phn = 10) // tab ngang (m thp phn = 9) // 'A' (m thp phn = 65) // rng (m thp phn = 0)
1.11.Chui
Chui l mt dy lin tip cc k t c kt thc bng mt k t null. Bin chui c nh ngha kiu char* (ngha l, con tr k t). Con tr n gin ch l mt v tr trong b nh. (Cc con tr s c tho lun trong chng 5). V th bin chui cha ng a ch ca k t u tin trong chui. V d, xem xt nh ngha:
char * str = "HELLO";
Hnh 1.4 minh ha bin chui v chui "HELLO" c th xut hin nh th no trong b nh.
Hnh 1.4 Chui v bin chui trong b nh
1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218
... str
1212
'H'
'E'
'L'
'L'
'O'
'\0'
...
Chui c vit bng cch ng ngoc cc k t ca n bn trong cp du nhy kp (v d, "HELLO"). Trnh bin dch lun lun thm vo mt k t null ti mt hng chui nh du im kt thc. Cc k t chui c th c c t s dng bt k k hiu no dng c t cc k t. V d:
"Name\tAddress\tTelephone" "ASCII character 65: \101" // cc t phn cch // 'A' c c t nh '101'
Chng 1: M u
12
Chui di c th ni rng qua khi mt hng n, trong trng hp ny th mi hng trc phi c kt thc bng mt du vch cho ngc. V d:
"Example to show \ the use of backslash for \ writing a long string"
Du \ trong ng cnh ny c ngha l phn cn li ca chui c tip tc trn hng k tip. Chui trn tng ng vi chui c vit trn hng n nh sau:
"Example to show the use of backslash for writing a long string"
Mt li lp trnh chung thng xy ra l lp trnh vin thng nhm ln mt chui k t n (v d, "A") vi mt k t n (v d, 'A'). Hai iu ny l khng tng ng. Chui k t n gm 2 byte (k t 'A' c theo sau l k t '\0'),trong khi k t n gm ch mt byte duy nht. Chui ngn nht c th c l chui rng ("") ch cha k t null.
1.12.Tn
Ngn ng lp trnh s dng tn tham kho ti cc thc th khc nhau dng to ra chng trnh. Chng ta cng thy cc v d ca mt loi cc tn (ngha l tn bin) nh th. Cc loi khc gm: tn hm, tn kiu, v tn macro. S dng tn rt tin li cho vic lp trnh, n cho php lp trnh vin t chc d liu theo cch thc m con ngi c th hiu c. Tn khng c a vo m c th thc thi c to ra bi trnh bin dch. V d, mt bin temperature cui cng tr thnh mt vi byte b nh m c tham kho ti bi cc m c th thc thi thng qua a ch ca n (khng thng qua tn ca n). C++ p t nhng lut sau xy dng cc tn hp l (cng c gi l cc nh danh). Mt tn cha mt hay nhiu k t, mi k t c th l mt ch ci (ngha l, 'A'-'Z' v 'a'-'z'), mt s (ngha l, '0'-'9'), hoc mt k t gch di ('_'), ngoi tr k t u tin khng th l mt s. Cc k t vit hoa v vit thng l khc nhau.V d:
salary salary2 2salary _salary Salary // nh danh hp l // nh danh hp l // nh danh khng hp l (bt u vi mt s) // nh danh hp l // hp l nhng khc vi salary
Chng 1: M u
13
C++ khng c gii hn s k t ca mt nh danh. Tuy nhin, hu ht thi cng li p t s gii hn ny nhng thng ln khng gy bn tm cho cc lp trnh vin (v d 255 k t). Mt s t c gi bi C++ cho mt s mc ch ring v khng th c dng cho cc nh danh. Nhng t ny c gi l t kha (keyword) v c tng kt trong bng 1.3:
Bng 1.3 Cc t kha C++. asm auto break case catch char class const continue default delete do double else enum extern float for friend goto if inline int long new operator private protected public register return short signed sizeof static struct switch template this throw try typedef union unsigned virtual void volatile while
Bi tp cui chng 1
1.1 Vit chng trnh cho php nhp vo mt s o nhit theo Fahrenheit v xut ra nhit tng ng ca n theo Celsius, s dng cng thc chuyn i: 5 C = ( F 32) 9 Bin dch v chy chng trnh. Vic thc hin ca n ging nh th ny: Nhiet do theo do Fahrenheit: 41 41 do Fahrenheit = 5 do Celsius 1.2 Hng no trong cc hng sau biu din vic nh ngha bin l khng hp l? int n = -100; unsigned int i = -100; signed int = 2.9; long m = 2, p = 4; int 2k; double x = 2 * m; float y = y * 2; unsigned double z = 0.0; double d = 0.67F; float f = 0.52L; signed char = -1786; char c = '$' + 2; sign char h = '\111';
Chng 1: M u
14
char *name = "Peter Pan"; unsigned char *num = "276811"; 1.3 Cc nh danh no sau y l khng hp l? identifier seven_11 _unique_ gross-income gross$income 2by2 default average_weight_of_a_large_pizza variable object.oriented 1.4 nh ngha cc bin biu din cc mc sau y: Tui ca mt ngi. Thu nhp ca mt nhn vin. S t trong mt t in. Mt k t alphabet. Mt thng ip chc mng.
Chng 1: M u
15
Chng ny gii thiu cc ton t xy dng sn cho vic son tho cc biu thc. Mt biu thc l bt k s tnh ton no m cho ra mt gi tr. Khi tho lun v cc biu thc, chng ta thng s dng thut ng c lng. V d, chng ta ni rng mt biu thc c lng mt gi tr no . Thng th gi tr sau cng ch l l do cho vic c lng biu thc. Tuy nhin, trong mt vi trng hp, biu thc cng c th cho cc kt qu ph. Cc kt qu ny l s thay i lu di trong trng thi ca chng trnh. Trong trng hp ny, cc biu thc C++ th khc vi cc biu thc ton hc. C++ cung cp cc ton t cho vic son tho cc biu thc ton hc, quan h, lun l, trn bit, v iu kin. N cng cung cp cc ton t cho ra cc kt qu ph hu dng nh l gn, tng, v gim. Chng ta s xem xt ln lt tng loi ton t. Chng ta cng s tho lun v cc lut u tin m nh hng n th t c lng ca cc ton t trong mt biu thc c nhiu ton t.
+ * / %
V d
Ngoi tr ton t ly phn d (%) th tt c cc ton t ton hc c th chp nhn pha trn cc ton hng s nguyn v ton hng s thc. Thng thng, nu c hai ton hng l s nguyn sau kt qu s l mt s
Chng 2: Biu thc
17
nguyn. Tuy nhin, mt hoc c hai ton hng l s thc th sau kt qu s l mt s thc (real hay double). Khi c hai ton hng ca ton t chia l s nguyn th sau php chia c thc hin nh l mt php chia s nguyn v khng phi l php chia thng thng m chng ta s dng. Php chia s nguyn lun cho kt qu nguyn (c ngha l lun c lm trn). V d:
9/2 -9 / 2 // c 4, khng phi l 4.5! // c -5, khng phi l -4!
Cc php chia s nguyn khng xc nh thng l cc li lp trnh chung. thu c mt php chia s thc khi c hai ton hng l s nguyn, bn cn p mt trong hai s nguyn v s thc:
int int double cost = 100; volume = 80; unitPrice = cost / (double) volume;
// c 1.25
Ton t ly phn d (%) yu cu c hai ton hng l s nguyn. N tr v phn d cn li ca php chia. V d 13%3 c tnh ton bng cch chia s nguyn 13 i 3 c 4 v phn d l 1; v th kt qu l 1. C th c trng hp mt kt qu ca mt php ton ton hc qu ln lu tr trong mt bin no . Trng hp ny c gi l trn. Hu qu ca trn l ph thuc vo my v th n khng c nh ngha.V d:
unsigned char k = 10 * 92; // trn: 920 > 255
Chia mt s cho 0 l hon ton khng ng lut. Kt qu ca php chia ny l mt li run-time gi l li division-by-zero thng lm cho chng trnh kt thc.
Tn So snh bng So snh khng bng So snh h hn So snh h hn hoc bng So snh ln hn So snh ln hn hoc bng
V d
5 == 5 // cho 1 5 != 5 // cho 0 5 < 5.5 // cho 1 5 <= 5 // cho 1 5 > 5.5 // cho 0 6.3 >= 5 // cho 1
18
Ch rng cc ton t <= v >= ch c h tr trong hnh thc hin th. Ni ring c hai =< v => u khng hp l v khng mang ngha g c. Cc ton hng ca mt ton t quan h phi c lng v mt s. Cc k t l cc ton hng hp l v chng c i din bi cc gi tr s. V d (gi s m ASCII):
'A' < 'F' // c 1 (ging nh l 65 < 70)
Cc ton t quan h khng nn c dng so snh chui bi v iu ny s dn n cc a ch ca chui c so snh ch khng phi l ni dung chui. V d, biu thc
"HELLO" < "BYE"
lm cho a ch ca chui "HELLO" c so snh vi a ch ca chui "BYE". V cc a ch ny c xc nh bi trnh bin dch, kt qu c th l 0 hoc c th l 1, cho nn chng ta c th ni kt qu l khng c nh ngha. C++ cung cp cc th vin hm (v d, strcmp) thc hin so snh chui.
! && ||
Ph nh lun l l mt ton t n hng ch ph nh gi tr lun l ton hng n ca n. Nu ton hng ca n khng l 0 th c 0, v nu n l khng th c 1. V lun l cho kt qu 0 nu mt hay c hai ton hng ca n c lng ti 0. Ngc li, n cho kt qu 1. Hoc lun l cho kt qu 0 nu c hai ton hng ca n c lng ti 0. Ngc li, n cho kt qu 1. Ch rng y chng ta ni cc ton hng l 0 v khc 0. Ni chung, bt k gi tr khng l 0 no c th c dng i din cho ng (true), trong khi ch c gi tr 0 l i din cho sai (false). Tuy nhin, tt c cc hng sau y l cc biu thc lun l hp l:
Chng 2: Biu thc
19
// c 0 // c 1 // c 1 // c 0
C++ khng c kiu boolean xy dng sn. V l m ta c th s dng kiu int cho mc ch ny. V d:
int int sorted = 0; balanced = 1; // false // true
Tn Ph nh bit V bit Hoc bit Hoc exclusive bit Dch tri bit Dch phi bit
V d
~'\011' '\011' & '\027' '\011' | '\027' '\011' ^ '\027' '\011' << 2 '\011' >> 2
Cc ton t trn bit mong i cc ton hng ca chng l cc s nguyn v xem chng nh l mt chui cc bit. Ph nh bit l mt ton t n hng thc hin o cc bit trong ton hng ca n. V bit so snh cc bit tng ng ca cc ton hng ca n v cho kt qu l 1 khi c hai bit l 1, ngc li l 0. Hoc bit so snh cc bit tng ng ca cc ton hng ca n v cho kt qu l 0 khi c hai bit l 0, ngc li l 1. XOR bit so snh cc bit tng ng ca cc ton hng ca n v cho kt qu 0 khi c hai bit l 1 hoc c hai bit l 0, ngc li l 1. C hai ton t dch tri bit v dch phi bit ly mt chui bit lm ton hng tri ca chng v mt s nguyn dng n lm ton hng phi. Ton t dch tri cho kt qu l mt chui bit sau khi thc hin dch n bit trong chui bit ca ton hng tri v pha tri. Ton t dch phi cho kt qu l mt chui bit sau khi thc hin dch n bit trong chui bit ca ton hng tri v pha phi. Cc bit trng sau khi dch c t ti 0. Bng 2.5 minh ha chui cc bit cho cc ton hng v d v kt qu trong Bng 2.4. trnh lo lng v bit du (iu ny ph thuc vo my) thng th khai bo chui bit nh l mt s khng du:
unsigned char x = '\011'; unsigned char y = '\027';
20
Bng 2.5
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 1 0
0 1 1 0 1 1 0 0
1 0 0 0 1 1 0 0
0 1 1 0 1 1 1 0
0 1 1 0 1 1 0 1
1 1 0 1 1 0 0 0
++ ++ ---
V d
// c 16 // c 15 // c 14 // c 15
C hai ton t c th c s dng theo hnh thc tin t hay hu t l hon ton khc nhau. Khi c s dng theo hnh thc tin t th ton t c p dng trc v kt qu sau c s dng trong biu thc. Khi c s dng theo hnh thc hu t th biu thc c c lng trc v sau ton t c p dng. C hai ton t c th c p dng cho bin nguyn cng nh l bin thc mc d trong thc t th cc bin thc him khi c dng theo hnh thc ny.
bin. Cc loi khc ca gi tr tri (da trn con tr v tham chiu) s c tho lun sau. Ton t khi to c mt s bin th thu c bng cch kt ni n vi cc ton t ton hc v cc ton t trn bit. Chng c tng kt trong Bng 2.7. Cc v d gi s rng n l mt bin s nguyn.
Bng 2.7 Cc ton t khi to.
Ton t V d Tng ng vi
Php ton khi to chnh n l mt biu thc m gi tr ca n l gi tr c lu trong ton hng tri ca n. V th mt php ton khi to c th c s dng nh l ton hng phi ca mt php ton khi to khc. Bt k s lng khi to no c th c kt ni theo cch ny hnh thnh mt biu thc. V d:
int m, n, p; m = n = p = 100; // ngha l: n = (m = (p = 100)); m = (n = p = 100) + 2; // ngha l: m = (n = (p = 100)) + 2;
// min nhn gi tr 1
Ch rng trong cc ton hng th 2 v ton hng th 3 ca ton t iu kin th ch c mt ton hng c thc hin. iu ny l quan trng khi mt hoc c hai cha hiu ng ph (ngha l, vic c lng ca chng lm chuyn i gi tr ca bin). V d, vi m=1 v n=2 th trong
int min = (m < n ? m++ : n++);
m c tng ln bi v m++ c c lng nhng n khng tng v n++ khng c c lng. Bi v chnh php ton iu kin cng l mt biu thc nn n c th c s dng nh mt ton hng ca php ton iu kin khc, c ngha l cc biu thc iu kin c th c lng nhau. V d:
int m = 1, n = 2, p =3; int min = (m < n ? (m < p ? m : p) : (n < p ? n : p));
y khi m nh hn n, mCount++ c c lng v gi tr ca m c lu trong min. Ngc li, nCount++ c c lng v gi tr ca n c lu trong min.
23
Danh sch 2.1 1 #include <iostream.h> 2 int main (void) 3 { 4 cout << "char size = " << sizeof(char) << " bytes\n"; 5 cout << "char* size = " << sizeof(char*) << " bytes\n"; 6 cout << "short size = " << sizeof(short) << " bytes\n"; 7 cout << "int size = " << sizeof(int) << " bytes\n"; 8 cout << "long size = " << sizeof(long) << " bytes\n"; 9 cout << "float size = " << sizeof(float) << " bytes\n"; 10 cout << "double size = " << sizeof(double) << " bytes\n"; 11 cout << "1.55 size = " << sizeof(1.55) << " bytes\n"; 12 cout << "1.55L size = " << sizeof(1.55L) << " bytes\n"; 13 cout << "HELLO size = " << sizeof("HELLO") << " bytes\n"; 14 }
-> ! ~ % >
. * &
new delete
sizeof ()
>=
24
^ | && || ?: =
Thp nht
+= -=
*= /=
^= %=
&= |=
<<= >>=
Tri ti phi Tri ti phi Tri ti phi Tri ti phi Tri ti phi Phi ti tri Tri ti phi
Nh hng Nh hng
c * d c c lng trc bi v ton t * c u tin cao hn ton t + v ==. Sau kt qu c cng ti b bi v ton t + c u tin cao hn ton t ==, v sau == c c lng. Cc lut u tin c th c cho quyn cao hn thng qua vic s dng cc du ngoc. V d, vit li biu thc trn nh sau
a == (b + c) * d
s lm cho ton t + c c lng trc ton t *. Cc ton t vi cng mc u tin c c lng theo th t c c lng trong ct cui cng trong Bng 2.8. V d, trong biu thc
a = b += c
Nh c trnh by trong cc v d, cc nh danh kiu xy dng sn c th c s dng nh cc ton t kiu. Cc ton t kiu l n hng (ngha l ch c mt ton hng) v xut hin bn trong cc du ngoc v bn tri ton hng ca chng. iu ny c gi l chuyn kiu tng minh. Khi tn kiu ch l mt t th c th t du ngoc xung quanh ton hng:
int(3.14) // nh l: (int) 3.14
25
Trong mt vi trng hp, C++ cng thc hin chuyn kiu khng tng minh. iu ny xy ra khi cc gi tr ca cc kiu khc nhau c trn ln trong mt biu thc. V d:
double int i = i + d; d = 1; i = 10.5; // d nhn 1.0 // i nhn 10 // ngha l: i = int(double(i) + d)
Trong v d cui , i + d bao hm cc kiu khng hp nhau, v th trc tin i c chuyn thnh double (thng cp) v sau c cng vo d. Kt qu l double khng hp kiu vi i trn pha tri ca php gn, v th n c chuyn thnh int (h cp) trc khi c gn cho i. Lut trn i din cho mt vi trng hp chung n gin chuyn kiu. Cc trng hp phc tp hn s c trnh by phn sau ca gio trnh sau khi chng ta tho lun cc kiu d liu khc.
Bi tp cui chng 2
2.1 Vit cc biu thc sau y: Kim tra mt s n l chn hay khng. Kim tra mt k t c l mt s hay khng. Kim tra mt k t c l mt mu t hay khng. Thc hin kim tra: n l l v dng hoc n chn v m. t li k bit ca mt s nguyn n ti 0. t k bit ca mt s nguyn n ti 1. Cho gi tr tuyt i ca mt s n. Cho s k t trong mt chui s c kt thc bi k t null. Thm cc du ngoc ph vo cc biu thc sau hin th r rng th t cc ton t c c lng:
(++n * q-- / ++p - q) (n | p & q ^ p << 2 + q) (p < q ? n < p ? q * n - 2 : q / n + 1 : q - n)
2.2
2.3
2.4
2.5
Vit mt chng trnh cho php nhp ba s v xut ra thng ip Sorted nu cc s l tng dn v xut ra Not sorted trong trng hp ngc li.
27
Chng 3. Lnh
Chng ny gii thiu cc hnh thc khc nhau ca cc cu lnh C++ son tho chng trnh. Cc lnh trnh by vic xy dng cc khi mc thp nht ca mt chng trnh. Ni chung mi lnh trnh by mt bc tnh ton c mt tc ng chnh yu. Bn cnh cng c th c cc tc ng ph khc. Cc lnh l hu dng v tc dng chnh yu m n gy ra, s kt ni ca cc lnh cho php chng trnh phc v mt mc ch c th (v d, sp xp mt danh sch cc tn). Mt chng trnh ang chy dnh ton b thi gian thc thi cc cu lnh. Th t m cc cu lnh c thc hin c gi l dng iu khin (flow control). Thut ng ny phn nh vic cc cu lnh ang thc thi hin thi c s iu khin ca CPU, khi CPU hon thnh s c chuyn giao ti mt lnh khc. c trng dng iu khin trong mt chng trnh l tun t, lnh ny n lnh k, nhng c th chuyn hng ti ng dn khc bi cc lnh r nhnh. Dng iu khin l mt s xem xt trng yu bi v n quyt nh lnh no c thc thi v lnh no khng c thc thi trong qu trnh chy, v th lm nh hng n kt qu ton b ca chng trnh. Ging nhiu ngn ng th tc khc, C++ cung cp nhng hnh thc khc nhau cho cc mc ch khc nhau. Cc lnh khai bo c s dng cho nh ngha cc bin. Cc lnh nh gn c s dng cho cc tnh ton i s n gin. Cc lnh r nhnh c s dng ch nh ng dn ca vic thc thi ph thuc vo kt qu ca mt iu kin lun l. Cc lnh lp c s dng ch nh cc tnh ton cn c lp cho ti khi mt iu kin lun l no c tha. Cc lnh iu khin c s dng lm chuyn ng dn thc thi ti mt ng dn khc ca chng trnh. Chng ta s ln lt tho lun tt c nhng vn ny.
Chng 3: Lnh
30
V d cui trnh by mt lnh khng hu dng bi v n khng c tc ng chnh yu (d c cng vi 5 v kt qu b vt b). Lnh n gin nht l lnh rng ch gm du chm phy m thi.
; // lnh rng
Mc du lnh rng khng c tc ng chnh yu nhng n c mt vi vic dng xc tht. Nhiu lnh n c th kt ni li thnh mt lnh phc bng cch ro chng bn trong cc du ngoc xon. V d:
{ int min, i = 10, j = 20; min = (i < j ? i : j); cout << min << '\n'; }
Bi v mt lnh phc c th cha cc nh ngha bin v nh ngha mt phm vi cho chng, n cng c gi mt khi. Phm vi ca mt bin C++ c gii hn bn trong khi trc tip cha n. Cc khi v cc lut phm vi s c m t chi tit hn khi chng ta tho lun v hm trong chng k.
3.2.
Lnh if
i khi chng ta mun lm cho s thc thi mt lnh ph thuc vo mt iu kin no cn c tha. Lnh if cung cp cch thc hin cng vic ny, hnh thc chung ca lnh ny l: if (biu thc) lnh; Trc tin biu thc c c lng. Nu kt qu khc 0 (ng) th sau lnh c thc thi. Ngc li, khng lm g c. V d, khi chia hai gi tr chng ta mun kim tra rng mu s c khc 0 hay khng.
if (count != 0)
Chng 3: Lnh
31
lm cho nhiu lnh ph thuc trn cng iu kin chng ta c th s dng lnh phc:
if (balance > 0) { interest = balance * creditRate; balance += interest; }
Mt hnh thc khc ca lnh if cho php chng ta chn mt trong hai lnh: mt lnh c thc thi nu nh iu kin c tha v lnh cn li c thc hin nu nh iu kin khng tha. Hnh thc ny c gi l lnh if-else v c hnh thc chung l:
if (biu thc) else
lnh 1; lnh 2;
Trc tin biu thc c c lng. Nu kt qu khc 0 th lnh 1 c thc thi. Ngc li, lnh 2 c thc thi. V d:
if (balance > 0) { interest = balance * creditRate; balance += interest; } else { interest = balance * debitRate; balance += interest; }
Trong c hai phn c s ging nhau lnh balance += interest v th ton b cu lnh c th vit li nh sau:
if (balance > 0) interest = balance * creditRate; else interest = balance * debitRate; balance += interest;
Hoc ch l:
balance += balance * (balance > 0 ? creditRate : debitRate);
Cc lnh if c th c lng nhau bng cch cho mt lnh if xut hin bn trong mt lnh if khc. V d:
Chng 3: Lnh
32
if (callHour > 6) { if (callDuration <= 5) charge = callDuration * tarrif1; else charge = 5 * tarrif1 + (callDuration - 5) * tarrif2; } else charge = flatFee;
Mt hnh thc c s dng thng xuyn ca nhng lnh if lng nhau lin quan n phn else gm c mt lnh if-else khc. V d:
if (ch >= '0' && ch <= '9') kind = digit; else { if (ch >= 'A' && ch <= 'Z') kind = upperLetter; else { if (ch >= 'a' && ch <= 'z') kind = lowerLetter; else kind = special; } }
sau . Ch s nhiu: mi case c th c theo sau bi khng hay nhiu lnh (khng ch l mt lnh). Vic thc thi tip tc cho ti khi hoc l bt gp mt lnh break hoc tt c cc lnh xen vo n cui lnh switch c thc hin.Trng hp default cui cng l mt ty chn v c thc hin nu nh tt c cc case trc khng c so khp. V d, chng ta phi phn tch c php mt php ton ton hc nh hng thnh ba thnh phn ca n v phi lu tr chng vo cc bin operator, operand1, v operand2. Lnh switch sau thc hin php ton v lu tr kt qu vo result.
switch (operator) { case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; default: cout << "unknown operator: " << operator << '\n'; break; }
Nh c minh ha trong v d, chng ta cn thit chn mt lnh break cui mi case. Lnh break ngt cu lnh switch bng cch nhy n im kt thc ca lnh ny. V d, nu chng ta m rng lnh trn cho php x cng c th c s dng nh l ton t nhn, chng ta s c:
switch (operator) { case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case 'x': case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; default: cout << "unknown operator: " << operator << '\n'; break; }
Bi v case 'x' khng c lnh break nn khi case ny c tha th s thc thi tip tc thc hin cc lnh trong case k tip v php nhn c thi hnh. Chng ta c th quan st rng bt k lnh switch no cng c th c vit nh nhiu cu lnh if-else. V d, lnh trn c th c vit nh sau:
Chng 3: Lnh
34
if (operator == '+') result = operand1 + operand2; else if (operator == '-') result = operand1 - operand2; else if (operator == 'x' || operator == '*') result = operand1 * operand2; else if (operator == '/') result = operand1 / operand2; else cout << "unknown operator: " << ch << '\n';
ngi ta c th cho rng phin bn switch l r rng hn trong trng hp ny. Tip cn if-else nn c dnh ring cho tnh hung m trong switch khng th lm c cng vic (v d, khi cc iu kin l phc tp khng th n gin thnh cc ng thc ton hc hay khi cc nhn cho cc case khng l cc hng s).
Trng hp n l 5, Bng 3.1 cung cp bng pht ha vng lp bng cch lit k cc gi tr ca cc bin c lin quan v iu kin lp.
Bng 3.1 Vt ca vng lp while. Vng lp i Mt 1 Hai 2 Ba 3 Bn 4 N m 5 Su 6 n 5 5 5 5 5 5 i <= n 1 1 1 1 1 0 sum += i++ 1 3 6 10 15
Chng 3: Lnh
35
i khi chng ta c th gp vng lp while c thn rng (ngha l mt cu lnh null). V d vng lp sau t n ti tha s l ln nht ca n.
while (n % 2 == 0 && n /= 2) ;
y iu kin lp cung cp tt c cc tnh ton cn thit v th khng tht s cn mt thn cho vng lp. iu kin vng lp khng nhng kim tra n l chn hay khng m n cn chia n cho 2 v chc chn rng vng lp s dng.
do
Khng ging nh vng lp while, vng lp do t khi c s dng trong nhng tnh hung m n c mt thn rng. Mc d vng lp do vi thn rng c th l tng ng vi mt vng lp while tng t nhng vng lp while th lun d c hn.
Chng 3: Lnh
36
for (biu thc1; biu thc2; biu thc3) lnh; Biu thc1 (thng c gi l biu thc khi to) c c lng trc tin. Mi vng lp biu thc2 c c lng. Nu kt qu khng l 0 (ng) th sau lnh c thc thi v biu thc3 c c lng. Ngc li, vng lp kt thc. Vng lp for tng qut th tng ng vi vng lp while sau: biu thc1; while (biu thc 2) { lnh; biu thc 3; } Vng lp for thng c s dng trong cc trng hp m c mt bin c tng hay gim mi ln lp. V d, vng lp for sau tnh ton tng ca tt c cc s nguyn t 1 ti n.
sum = 0; for (i = 1; i <= n; ++i) sum += i;
iu ny c a chung hn phin bn ca vng lp while m chng ta thy trc . Trong v d ny i thng c gi l bin lp. C++ cho php biu thc u tin trong vng lp for l mt nh ngha bin. V d trong vng lp trn th i c th c nh ngha bn trong vng lp:
for (int i = 1; i <= n; ++i) sum += i;
Tri vi s xut hin, phm vi ca i khng trong thn ca vng lp m l chnh vng lp. Xt trn phm vi th trn tng ng vi:
int i; for (i = 1; i <= n; ++i) sum += i;
Bt k biu thc no trong 3 biu thc ca vng lp for c th rng. V d, xa biu thc u v biu thc cui cho chng ta dng ging nh vng lp while:
for (; i != 0;) something; // tng ng vi: while (i != 0) // something;
Xa tt c cc biu thc cho chng ta mt vng lp v hn. iu kin ca vng lp ny c gi s lun lun l ng.
for (;;) something; // vng lp v hn 37
Chng 3: Lnh
Trng hp vng lp vi nhiu bin lp th him dng. Trong nhng trng hp nh th, ton t phy (,) c s dng phn cch cc biu thc ca chng:
for (i = 0, j = 0; i + j < n; ++i, ++j) something;
Bi v cc vng lp l cc lnh nn chng c th xut hin bn trong cc vng lp khc. Ni cc khc, cc vng lp c th lng nhau. V d,
for (int i = 1; i <= 3; ++i) for (int j = 1; j <= 3; ++j) cout << '(' << i << ',' << j << ")\n";
iu ny tng ng vi:
cin >> num; if (num >= 0) { // x l s y } } while (num != 0); do {
Chng 3: Lnh
38
Khi lnh continue xut hin bn trong vng lp c lng vo th n p dng trc tip ln vng lp gn n ch khng p dng cho vng lp bn ngoi. V d, trong mt tp cc vng lp c lng nhau sau y, lnh continue p dng cho vng lp for v khng p dng cho vng lp while:
while (more) { for (i = 0; i < n; ++i) { cin >> num; if (num < 0) continue; // process num here... } //etc... }
y chng ta phi gi s rng c mt hm c gi Verify kim tra mt mt khu v tr v true nu nh mt khu ng v ngc li l false. Chng ta c th vit li vng lp m khng cn lnh break bng cch s dng mt bin lun l c thm vo (verified) v thm n vo iu kin vng lp:
verified = 0; for (i = 0; i < attempts && !verified; ++i) {
Chng 3: Lnh
39
cout << "Please enter your password: "; cin >> password; verified = Verify(password)); if (!verified) cout << "Incorrect!\n";
Bi v lnh goto cung cp mt hnh thc nhy t do khng c cu trc (khng ging nh lnh break v continue) nn d lm gy chng trnh. Phn ln cc lp trnh vin ngy nay trnh s dng n lm cho chng trnh r rng. Tuy nhin, goto c mt vi (d cho him) s dng chnh ng. V s phc tp ca nhng trng hp nh th m vic cung cp nhng v d c trnh by nhng phn sau.
3.10.Lnh return
Lnh return cho php mt hm tr v mt gi tr cho thnh phn gi n. N c hnh thc tng qut: return biu thc;
Chng 3: Lnh
40
trong biu thc ch r gi tr c tr v bi hm. Kiu ca gi tr ny nn hp vi kiu ca hm. Trng hp kiu tr v ca hm l void, biu thc nn rng: return; Hm m c chng ta tho lun n thi im ny ch c hm main, kiu tr v ca n l kiu int. Gi tr tr v ca hm main l nhng g m chng trnh tr v cho h iu hnh khi n hon tt vic thc thi. Chng hn di UNIX qui c l tr v 0 t hm main khi chng trnh thc thi khng c li. Ngc li, mt m li khc 0 c tr v. V d:
int main (void) { cout << "Hello World\n"; return 0; }
Khi mt hm c gi tr tr v khng l void (nh trong v d trn), nu khng tr v mt gi tr s mang li mt cnh bo trnh bin dch. Gi tr tr v thc s s khng c nh ngha trong trng hp ny (ngha l, n s l bt c gi tr no c gi trong v tr b nh tng ng ca n ti thi im ).
Bi tp cui chng 3
3.1 Vit chng trnh nhp vo chiu cao (theo centimet) v trng lng (theo kilogram) ca mt ngi v xut mt trong nhng thng ip: underweight, normal, hoc overweight, s dng iu kin: Underweight: weight < height/2.5 Normal: height/2.5 <= weight <= height/2.3 Overweight: height/2.3 < weight 3.2 Gi s rng n l 20, on m sau s xut ra ci g khi n c thc thi?
if (n >= 0) if (n < 10) cout << "n is small\n"; else cout << "n is negative\n";
3.3
Vit chng trnh nhp mt ngy theo nh dng dd/mm/yy v xut n theo nh dng month dd, year. V d, 25/12/61 tr thnh:
Thang muoi hai 25, 1961
3.4
Vit chng trnh nhp vo mt gi tr s nguyn, kim tra n l dng hay khng v xut ra giai tha ca n, s dng cng thc:
41
Chng 3: Lnh
giaithua (0) = 1 giaithua (n) = n giaithua (n-1) 3.5 Vit chng trnh nhp vo mt s c s 8 v xut ra s thp phn tng ng. V d sau minh ha cc cng vic thc hin ca chng trnh theo mong i:
Nhap vao so bat phan: 214 BatPhan(214) = ThapPhan(140)
3.6
Vit chng trnh cung cp mt bng cu chng n gin ca nh dng sau cho cc s nguyn t 1 ti 9:
1x1=1 1x2=2 ... 9 x 9 = 81
Chng 3: Lnh
42
Chng 4. Hm
Chng ny m t nhng hm do ngi dng nh ngha nh l mt trong nhng khi chng trnh C++. Hm cung cp mt phng thc ng gi qu trnh tnh ton mt cch d dng c s dng khi cn. nh ngha hm gm hai phn: giao din v thn. Phn giao din hm (cng c gi l khai bo hm) c t hm c th c s dng nh th no. N gm ba phn: Tn hm. y ch l mt nh danh duy nht. Cc tham s ca hm. y l mt tp ca khng hay nhiu nh danh nh kiu c s dng truyn cc gi tr ti v t hm. Kiu tr v ca hm. Kiu tr v ca hm c t cho kiu ca gi tr m hm tr v. Hm khng tr v bt k kiu no th nn tr v kiu void. Phn thn hm cha ng cc bc tnh ton (cc lnh). S dng mt hm lin quan n vic gi n. Mt li gi hm gm c tn hm, theo sau l cp du ngoc n (), bn trong cp du ngoc l khng, mt hay nhiu i s c tch bit nhau bng du phy. S cc i s phi khp vi s cc tham s ca hm. Mi i s l mt biu thc m kiu ca n phi khp vi kiu ca tham s tng ng trong khai bo hm. Khi li gi hm c thc thi, cc i s c c lng trc tin v cc gi tr kt qu ca chng c gn ti cc tham s tng ng. Sau thn hm c thc hin. Cui cng gi tr tr v ca hm c truyn ti thnh phn gi hm. V mt li gi ti mt hm m kiu tr v khng l void s mang li mt gi tr tr v nn li gi l mt biu thc v c th c s dng trong cc biu thc khc. Ngc li mt li gi ti mt hm m kiu tr v ca n l void th li gi l mt lnh.
Chng 4: Hm
45
4.1. Hm n gin
Danh sch 4.1 trnh by nh ngha ca mt hm n gin tnh ly tha ca mt s nguyn.
Danh sch 4.1 1 int Power (int base, unsigned int exponent) 2 { 3 int result = 1; 4 5 6 7 } Ch gii for (int i = 0; i < exponent; ++i) result *= base; return result;
Dng ny nh ngha giao din hm. N bt u vi kiu tr v ca hm (l int trong trng hp ny). K tip l tn hm, theo sau l danh sch cc tham s. Power c hai tham s (base v exponent) thuc kiu int v unsigned int tng ng. Ch l c php cho cc tham s l tng t nh c php cho nh ngha bin: nh danh kiu c theo sau bi tn tham s. Tuy nhin, khng th theo sau nh danh kiu vi nhiu tham s phn cch bi du phy:
int Power (int base, exponent) // Sai!
2 Du ngoc ny nh du im bt u ca thn hm. 3 Dng ny l nh ngha mt bin cc b. 4-5 Vng lp for ny tng c s base ln ly tha ca exponent v lu tr kt qu vo trong result. 6 Hng ny tr result v nh l kt qu ca hm. 7 Du ngoc ny nh du im kt thc ca thn hm. Danh sch 4.2 minh ha hm c gi nh th no. Tc ng ca li gi hm ny l u tin cc gi tr 2 v 8 tng ng c gn cho cc tham s base va exponent, v sau thn hm c c lng.
Danh sch 4.2 1 #include <iostream.h> 2 main (void) 3 { 4 cout << "2 ^ 8 = " << Power(2,8) << '\n'; 5 }
Chng 4: Hm
46
Ni chung, mt hm phi c khai bo trc khi s dng n. Khai bo hm (function declaration) n gin gm c mu ban u ca hm gi l nguyn mu hm (function prototype) ch nh tn hm, cc kiu tham s, v kiu tr v. Hng 2 trong Danh sch 4.3 trnh by hm Power c th c khai bo nh th no cho chng trnh trn. Nhng mt hm cng c th c khai bo m khng cn tn cc tham s ca n,
int Power (int, unsigned int);
Bi v mt nh ngha hm cha ng mt nguyn mu (prototype) nn n cng c xem nh l mt khai bo. V th nu nh ngha ca mt hm xut hin trc khi s dng n th khng cn khai bo thm vo. Tuy nhin vic s dng cc nguyn mu hm l khuyn khch cho mi trng hp. Tp hp ca nhiu hm vo mt tp tin header ring bit cho php nhng lp trnh vin khc truy xut nhanh chng ti cc hm m khng cn phi c ton b cc nh ngha ca chng.
4.2. Tham s v i s
C++ h tr hai kiu tham s: gi tr v tham chiu. Tham s gi tr nhn mt sao chp gi tr ca i s c truyn ti n. Kt qu l, nu hm c bt k chuyn i no ti tham s th vn khng tc ng n i s. V d, trong
#include <iostream.h> void Foo (int num) { num = 0;
Chng 4: Hm
47
int main (void) { int x = 10; Foo(x); cout << "x = " << x << '\n'; return 0;
th tham s duy nht ca hm Foo l mt tham s gi tr. n lc m hm ny c thc thi th num c s dng nh l mt bin cc b bn trong hm. Khi hm c gi v x c truyn ti n, num nhn mt sao chp gi tr ca x. Kt qu l mc d num c t v 0 bi hm nhng vn khng c g tc ng ln x. Chng trnh cho kt qu nh sau:
num = 0; x = 10;
Tri li, tham s tham chiu nhn cc i s c truyn ti n v lm trc tip trn i s . Bt k chuyn i no c to ra bi hm ti tham s tham chiu u tc ng trc tip ln i s. Bn trong ng cnh ca cc li gi hm, hai kiu truyn i s tng ng c gi l truyn-bng-gi tr v truyn-bng-tham chiu. Tht l hon ton hp l cho mt hm truyn-bng-gi tr i vi mt vi tham s v truyn-bng-tham chiu cho mt vi tham s khc. Trong thc t th truynbng-gi tr thng c s dng nhiu hn.
Cc bin ton cc khng c khi to, s c khi to t ng l 0. V cc u vo ton cc l c th thy c mc chng trnh nn chng cng phi l duy nht mc chng trnh. iu ny ngha l cng cc bin hoc hm ton cc c th khng c nh ngha nhiu hn mt ln
Chng 4: Hm
48
mc ton cc. (Tuy nhin chng ta s thy sau ny mt tn hm c th c s dng li). Thng thng cc bin hay hm ton cc c th c truy xut t mi ni trong chng trnh. Mi khi trong mt chng trnh nh ngha mt phm vi cc b. Tht vy, thn ca mt hm trnh by mt phm vi cc b. Cc tham s ca mt hm c cng phm vi nh l thn hm. Cc bin c nh ngha bn trong mt phm vi cc b c th nhn thy ti ch phm vi . Do mt bin ch cn l duy nht trong phm vi ca chnh n. Cc phm vi cc b c th lng nhau, trong trng hp ny cc phm vi bn trong chng ln cc phm vi bn ngoi. V d trong
int xyz; void Foo (int xyz) { if (xyz > 0) { double xyz; //... } } // xyz l ton cc // xyz l cc b cho thn ca Foo // xyz l cc b cho khi ny
c ba phm vi ring bit, mi phm vi cha ng mt xyz ring. Thng thng, thi gian sng ca mt bin b gii hn bi phm vi ca n. V th, v d cc bin ton cc tn ti sut thi gian thc hin chng trnh trong khi cc bin cc b c to ra khi phm vi ca chng bt u v mt i khi phm vi ca chng kt thc. Khng gian b nh cho cc bin ton cc c dnh ring trc khi s thc hin ca chng trnh bt u nhng ngc li khng gian b nh cho cc bin cc b c cp pht thi im thc hin chng trnh.
bin ton cc error l khng th truy xut c bn trong hm Error bi v n c ghi chng bi tham s error cc b. Vn ny c gii quyt nh vo s dng ton t phm vi n hng (::) , ton t ny ly u vo ton cc nh l i s:
Chng 4: Hm
49
4.5. Bin t ng
Bi v thi gian sng ca mt bin cc b l c gii hn v c xc nh hon ton t ng nn nhng bin ny cng c gi l t ng. B xc nh lp lu tr auto c th c dng ch nh r rng mt bin cc b l t ng. V d:
void Foo (void) { auto int xyz; //... }
// nh l: int xyz;
y mi vng lp i c s dng ba ln: mt ln khi n c so snh vi n, mt ln khi n c cng vo sum, v mt ln khi n c tng. V th vic gi bin i trong thanh ghi trong sut vng lp for l c ngha trong vic ci thin hiu sut chng trnh. Ch rng thanh ghi ch l mt gi cho trnh bin dch, v trong mt vi trng hp trnh bin dch c th chn khng s dng thanh ghi khi n c
Chng 4: Hm
50
yu cu lm iu . Mt l do l gii l bt k my tnh no cng c mt s hu hn cc thanh ghi v n c th trong trng hp tt c cc thanh ghi ang c s dng. Thm ch khi lp trnh vin khng khai bo thanh ghi, nhiu trnh bin dch ti u c gng thc hin mt d on thng minh v s dng cc thanh ghi m chng mun ci thin hiu sut ca chng trnh. tng s dng khai bo thanh ghi thng c xut sau cng; ngha l sau khi vit m chng trnh hon tt lp trnh vin c th xem li m v chn cc khai bo thanh ghi vo nhng ni cn thit.
4.7. Hm ni tuyn
Gi s mt chng trnh thng xuyn yu cu tm gi tr tuyt i ca mt s cc s nguyn. Cho mt gi tr c biu th bi n, iu ny c th c gii thch nh sau:
(n > 0 ? n : -n)
Tuy nhin, thay v ti to biu thc ny ti nhiu v tr khc nhau trong chng trnh, tt hn ht l nn nh ngha n trong mt hm nh sau:
int Abs (int n) { return n > 0 ? n : -n; }
Phin bn hm c mt s cc thun li. Th nht, n lm cho chng trnh d c. Th hai, n c th c s dng li. V th ba, n trnh c hiu ng ph khng mong mun khi i s chnh n l mt biu thc c cc hiu ng ph. Tuy nhin, bt li ca phin bn hm l vic s dng thng xuyn c th dn ti s bt li v hiu sut ng k v cc tn ph dnh cho vic gi hm. V d, nu hm Abs c s dng trong mt vng lp c lp i lp li mt ngn ln th sau n s c mt tc ng trn hiu sut. Tn ph c th c trnh bng cch nh ngha hm Abs nh l hm ni tuyn (inline):
inline int Abs (int n) { return n > 0 ? n : -n; }
Hiu qu ca vic s dng hm ni tuyn l khi hm Abs c gi, trnh bin dch thay v pht ra m gi hm Abs th m rng v thay th thn ca hm Abs vo ni gi. Trong khi v bn cht th cng tnh ton c thc hin nhng khng c lin quan n li gi hm v th m khng c cp pht stack.
Chng 4: Hm
51
Bi v cc li gi ti hm ni tuyn c m rng nn khng c vt ca chnh hm c a vo trong m bin dch. V th, nu mt hm c nh ngha ni tuyn trong mt tp tin th n khng sn dng cho cc tp tin khc. Do , cc hm ni tuyn thng c t vo trong cc tp tin header m chng c th c chia s. Ging nh t kha register, inline l mt gi cho trnh bin dch thc hin. Ni chung, vic s dng inline nn c hn ch ch cho cc hm n gin c s dng thng xuyn m thi. Vic s dng inline cho cc hm di v phc tp qu th chc chn b b qua bi trnh bin dch.
4.8. qui
Mt hm gi chnh n c gi l qui. qui l mt k thut lp trnh tng qut c th ng dng cho cc bi ton m c th nh ngha theo thut ng ca chnh chng. Chng hn bi ton giai tha c nh ngha nh sau: Giai tha ca 0 l 1. Giai tha ca mt s n l n ln giai tha ca n-1. Hng th hai r rng cho bit giai tha c nh ngha theo thut ng ca chnh n v v th c th c biu din nh mt hm qui:
int Factorial (unsigned int n) { return n == 0 ? 1 : n * Factorial(n-1); }
Cho n bng 3, Bng 4.1 cung cp vt ca cc li gi Factorial. Cc khung stack cho cc li gi ny xut hin tun t tng ci mt trn runtime stack.
Bng 4.1 Vt thc thi ca Factorial(3).
Call Th nht Th hai Th ba Th t
n 3 2 1 0
n == 0 0 0 0 1
Returns 6 2 1 1
Mt hm qui phi c t nht mt iu kin dng c th c tha. Ngc li, hm s gi chnh n v hn nh cho ti khi trn stack. V d hm Factorial c iu kin dng l n == 0. (Ch i vi trng hp n l s m th iu kin s khng bao gi tha v Factorial s tht bi).
Chng 4: Hm
52
4.9. i s mc nh
i s mc nh l mt thun li lp trnh b bt i gnh nng phi ch nh cc gi tr i s cho tt c cc tham s hm. V d, xem xt hm cho vic bo co li:
void Error (char *message, int severity = 0);
Nh l li gi hm u tin minh ha, mt i s mc nh c th c ghi chng bng cch ch nh r rng mt i s. Cc i s mc nh l thch hp cho cc trng hp m trong cc tham s no ca hm (hoc tt c) thng xuyn ly cng gi tr. V d trong hm Error, severity 0 li th ph bin hn l nhng trng hp khc v v th l mt ng c vin tt cho i s mc nh. Mt cch dng cc i s t ph hp c th l:
int Power (int base, unsigned int exponent = 1);
Bi v 1 (hoc bt k gi tr no khc) th khng chc xy ra thng xuyn trong tnh hung ny. trnh m h, tt c i s mc nh phi l cc i s theo ui. V th khai bo sau l khng theo lut:
void Error (char *message = "Bomb", int severity); // Tri qui tc
Mt i s mc nh khng nht thit l mt hng. Cc biu thc ty c th c s dng min l cc bin c dng trong cc biu thc l c sn cho phm vi nh ngha hm (v d, cc bin ton cc). Qui c c chp nhn dnh cho cc i s mc nh l ch nh chng trong cc khai bo hm ch khng trong nh ngha hm.
V d nh xem xt mt chng trnh c t tn l sum in ra tng ca tp hp cc s c cung cp ti n nh l cc i s hng lnh. Hp thoi 4.1 minh ha hai s c truyn nh l cc i s ti hm sum nh th no ($ l du nhc UNIX).
Hp thoi 4.1 1 $ sum 10.4 12.5 2 22.9 3 $
Cc i s hng lnh c to ra sn cho mt chng trnh C++ thng qua hm main. C hai cch nh ngha mt hm main:
int main (void); int main (int argc, const char* argv[]);
Cch sau c s dng khi chng trnh c d tnh chp nhn cc i s hng lnh. Tham s u, argc, biu th s cc i s c truyn ti chng trnh (bao gm c tn ca chnh chng trnh). Tham s th hai, argv, l mt mng ca cc hng chui i din cho cc i s. V d t hng lnh cho trong hp thoi 4.1, chng ta c: argc is 3 argv[0] is "sum" argv[1] is "10.4" argv[2] is "12.5" Danh sch 4.4 minh ha mt thi cng n gin cho chng trnh tnh tng sum. Cc chui c chuyn i sang s thc s dng hm atof c nh ngha trong th vin stdlib.h.
Danh sch 4.4 1 #include <iostream.h> 2 #include <stdlib.h> 3 int main (int argc, const char *argv[]) 4 { 5 double sum = 0; 6 for (int i = 1; i < argc; ++i) 7 sum += atof(argv[i]); 8 cout << sum << '\n'; 9 return 0; 10 }
Chng 4: Hm
54
Bi tp cui chng 4
4.1 4.2 Vit chng trnh trong bi tp 1.1 v 3.1 s dng hm. Chng ta c nh ngha ca hm Swap sau
void Swap (int x, int y) { int temp = x; x = y; y = temp; }
4.3
4.4
Mt s l s nguyn t nu nh n ch chia ht cho chnh n v 1. 4.5 nh ngha mt bng lit k gi l Month cho tt c cc thng trong nm v s dng n nh ngha mt hm nhn mt thng nh l mt i s v tr v n nh l mt hng chui. nh ngha mt hm inline IsAlpha, hm tr v khc 0 khi tham s ca n l mt k t v tr v 0 trong cc trng hp khc.
55
4.6
Chng 4: Hm
4.7 4.8
nh ngha mt phin bn qui ca hm Power c trnh by trong chng ny. Vit mt hm tr v tng ca mt danh sch cc gi tr thc
double Sum (int n, double val ...);
Chng 4: Hm
56
Chng ny gii thiu v mng, con tr, cc kiu d liu tham chiu v minh ha cch dng chng nh ngha cc bin. Mng (array) gm mt tp cc i tng (c gi l cc phn t) tt c chng c cng kiu v c sp xp lin tip trong b nh. Ni chung ch c mng l c tn i din ch khng phi l cc phn t ca n. Mi phn t c xc nh bi mt ch s biu th v tr ca phn t trong mng. S lng phn t trong mng c gi l kch thc ca mng. Kch thc ca mng l c nh v phi c xc nh trc; n khng th thay i trong sut qu trnh thc hin chng trnh. Mng i din cho d liu hn hp gm nhiu hng mc ring l tng t. V d: danh sch cc tn, bng cc thnh ph trn th gii cng vi nhit hin ti ca cc chng, hoc cc giao dch hng thng ca mt ti khon ngn hng. Con tr (pointer) n gin l a ch ca mt i tng trong b nh. Thng thng, cc i tng c th c truy xut trong hai cch: trc tip bi tn i din hoc gin tip thng qua con tr. Cc bin con tr c nh ngha tr ti cc i tng ca mt kiu c th sao cho khi con tr hy th vng nh m i tng chim gi c thu hi. Cc con tr thng c dng cho vic to ra cc i tng ng trong thi gian thc thi chng trnh. Khng ging nh cc i tng bnh thng (ton cc v cc b) c cp pht lu tr trn runtime stack, mt i tng ng c cp pht vng nh t vng lu tr khc c gi l heap. Cc i tng khng tun theo cc lut phm vi thng thng. Phm vi ca chng c iu khin r rng bi lp trnh vin. Tham chiu (reference) cung cp mt tn tng trng khc gi l bit hiu (alias) cho mt i tng. Truy xut mt i tng thng qua mt tham chiu ging nh l truy xut thng qua tn gc ca n. Tham chiu nng cao tnh hu dng ca cc con tr v s tin li ca vic truy xut trc tip cc i tng. Chng c s dng h tr cc kiu gi thng qua tham chiu ca cc tham s hm c bit khi cc i tng ln c truyn ti hm.
Chapter 5: Mng, con tr, v tham chiu
59
Mi phn t trong mng c th c truy xut thng qua ch s mng. Phn t u tin ca mng lun c ch s 0. V th, heights[0] v heights[9] biu th tng ng cho phn t u v phn t cui ca mng heights. Mi phn t ca mng heights c th c xem nh l mt bin s nguyn. V th, v d t phn t th ba ti gi tr 177 chng ta c th vit:
heights[2] = 177;
Vic c gng truy xut mt phn t mng khng tn ti (v d, heights[-1] hoc heights[10]) dn ti li thc thi rt nghim trng (c gi l li vt ngoi bin). Vic x l mng thng lin quan n mt vng lp duyt qua cc phn t mng ln lt tng phn t mt. Danh sch 5.1 minh ha iu ny bng vic s dng mt hm nhn vo mt mng cc s nguyn v tr v gi tr trung bnh ca cc phn t trong mng.
Danh sch 5.1 1 const int size = 3; 2 double Average (int nums[size]) 3 { 4 double average = 0; 5 6 7 8 } for (register i = 0; i < size; ++i) average += nums[i]; return average/size;
Ging nh cc bin khc, mt mng c th c mt b khi to. Cc du ngoc nhn c s dng c t danh sch cc gi tr khi to c phn cch bi du phy cho cc phn t mng. V d,
int nums[3] = {5, 10, 15};
khi to ba phn t ca mng nums tng ng ti 5, 10, v 15. Khi s gi tr trong b khi to nh hn s phn t th cc phn t cn li c khi to ti 0:
int nums[3] = {5, 10}; // nums[2] khi to ti 0
60
Khi b khi to c s dng hon tt th kch c mng tr thnh d tha bi v s cc phn t l n trong b khi to. V th nh ngha u tin ca nums c th vit tng ng nh sau:
int nums[] = {5, 10, 15}; // khng cn khai bo tng minh // kch c ca mng
Mt tnh hung khc m kch c c th c b qua i vi mng tham s hm. V d, hm Average trn c th c ci tin bng cch vit li n sao cho kch c mng nums khng c nh ti mt hng m c ch nh bng mt tham s thm vo. Danh sch 5.2 minh ha iu ny.
Danh sch 5.2 1 double Average (int nums[], int size) 2 { 3 double average = 0; 4 5 6 7 } for (register i = 0; i < size; ++i) average += nums[i]; return average/size;
nh ngha chui str l mt mng ca 6 k t: nm ch ci v mt k t null. K t kt thc null c chn vo bi trnh bin dch. Tri li,
char str[] = {'H', 'E', 'L', 'L', 'O'};
nh ngha str l mng ca 5 k t. Kch c ca mng c th c tnh mt cch d dng nh vo ton t sizeof. V d, vi mng ar cho m kiu phn t ca n l Type th kch c ca ar l:
sizeof(ar) / sizeof(Type)
61
Bng 5.1
Cch t chc mng ny trong b nh nh l 12 phn t s nguyn lin tip nhau. Tuy nhin, lp trnh vin c th tng tng n nh l mt mng gm ba hng vi mi hng c bn phn t s nguyn (xem Hnh 5.1).
Hnh 5.1
...
32
19
13
28
38
25
20
...
Second row
hng hai
Nh trc, cc phn t c truy xut thng qua ch s mng. Mt ch s ring bit c cn cho mi mng. V d, nhit ma h trung bnh ca thnh ph Sydney (hng u tin ct th hai) c cho bi seasonTemp[0][1]. Mng c th c khi to bng cch s dng mt b khi to lng nhau:
int seasonTemp[3][4] = { {26, 34, 22, 17}, {24, 32, 19, 13}, {28, 38, 25, 20} };
B khi to lng nhau c a chung hn bi v n linh hot v d hiu hn. V d, n c th khi to ch phn t u tin ca mi hng v phn cn li mc nh l 0:
int seasonTemp[3][4] = {{26}, {24}, {28}};
62
};
X l mng nhiu chiu th tng t nh l mng mt chiu nhng phi x l cc vng lp lng nhau thay v vng lp n. Danh sch 5.3 minh ha iu ny bng cch trnh by mt hm tm nhit cao nht trong mng seasonTemp.
Danh sch 5.3 1 const int rows 2 const int columns = 3; = 4;
3 int seasonTemp[rows][columns] = { 4 {26, 34, 22, 17}, 5 {24, 32, 19, 13}, 6 {28, 38, 25, 20} 7 }; 8 int HighestTemp (int temp[rows][columns]) 9 { 10 int highest = 0; 11 12 13 14 15 16 } for (register i = 0; i < rows; ++i) for (register j = 0; j < columns; ++j) if (temp[i][j] > highest) highest = temp[i][j]; return highest;
5.3. Con tr
Con tr n gin ch l a ch ca mt v tr b nh v cung cp cch gin tip truy xut d liu trong b nh. Bin con tr c nh ngha tr ti d liu thuc kiu d liu c th. V d,
int char *ptr1; *ptr2; // tr ti mt int // tr ti mt char
chng ta c th vit:
ptr1 = #
num c khi to ti ptr1. V th, chng ta ni rng ptr1 tr ti num. Hnh 5.2 minh ha s lc iu ny.
Hnh 5.2 Mt con tr s nguyn n gin.
ptr1 num
Vi ptr1 tr ti num th biu thc *ptr1 nhn gi tr ca bin ptr1 tr ti v v th n tng ng vi num. K hiu * l ton t ly gi tr; n nhn con tr nh mt i s v tr v ni dung ca v tr m con tr tr ti. Thng thng th kiu con tr phi khp vi kiu d liu m c tr ti. Tuy nhin, mt con tr kiu void* s hp vi tt c cc kiu. iu ny tht thun tin nh ngha cc con tr c th tr n d liu ca nhng kiu khc nhau hay l cc kiu d liu gc khng c bit. Con tr c th c p (chuyn kiu) thnh mt kiu khc. V d,
ptr2 = (char*) ptr1;
chuyn con tr ptr1 thnh con tr char trc khi gn n ti con tr ptr2. Khng quan tm n kiu ca n th con tr c th c gn ti gi tr null (gi l con tr null). Con tr null c s dng khi to cho cc con tr v to ra im kt thc cho cc cu trc da trn con tr (v d, danh sch lin kt).
5.4. B nh ng
Ngoi vng nh stack ca chng trnh (thnh phn c s dng lu tr cc bin ton cc v cc khung stack cho cc li gi hm), mt vng b nh khc gi l heap c cung cp. Heap c s dng cho vic cp pht ng cc khi b nh trong thi gian thc thi chng trnh. V th heap cng c gi l b nh ng (dynamic memory). Vng nh stack ca chng trnh cng c gi l b nh tnh (static memory). C hai ton t c s dng cho vic cp pht v thu hi cc khi b nh trn heap. Ton t new nhn mt kiu nh l mt i s v c cp pht mt khi b nh cho mt i tng ca kiu . N tr v mt con tr ti khi c cp pht. V d,
int *ptr = new int; char *str = new char[10];
B nh c cp pht t heap khng tun theo lut phm vi nh cc bin thng thng. V d, trong
void Foo (void) { char *str = new char[10]; //... }
khi Foo tr v cc bin cc b str c thu hi nhng cc khi b nh c tr ti bi str th khng. Cc khi b nh vn cn cho n khi chng c gii phng r rng bi cc lp trnh vin. Ton t delete c s dng gii phng cc khi b nh c cp pht bi new. N nhn mt con tr nh l i s v gii phng khi b nh m n tr ti. V d:
delete ptr; delete [] str; // xa mt i tng // xa mt mng cc i tng
Ch rng khi khi nh c xa l mt mng th mt cp du [] phi c chn vo ch nh cng vic ny. S quan trng s c gii thch sau khi chng ta tho lun v lp. Ton t delete nn c p dng ti con tr m tr ti bt c th g v mt i tng c cp pht ng (v d, mt bin trn stack), mt li thc thi nghim trng c th xy ra. Hon ton v hi khi p dng delete ti mt bin khng l con tr. Cc i tng ng c s dng to ra d liu ko di ti khi li gi hm to ra chng. Danh sch 5.4 minh ha iu ny bng cch s dng mt hm nhn mt tham s chui v tr v bn sao ca mt chui.
Danh sch 5.4 1 #include <string.h> 2 char* CopyOf (const char *str) 3 { 4 char *copy = new char[strlen(str) + 1]; 5 6 7 } Ch gii strcpy(copy, str); return copy;
1 4
y l tp tin header chui chun khai bo cc dng hm cho thao tc trn chui. Hm strlen (c khai bo trong th vin string.h) m cc k t trong i s chui ca n cho n (nhng khng vt qu) k t null sau cng. Bi v k t null khng c tnh vo trong vic m nn chng ta cng thm 1 ti tng v cp pht mt mng k t ca kch thc .
65
Hm strcpy (c khai bo trong th vin string.h) sao chp i s th hai n i s th nht ca n theo tng k t mt bao gm lun c k t null sau cng.
V ti nguyn b nh l c gii hn nn rt c th b nh ng c th b cn kit trong thi gian thc thi chng trnh, c bit l khi nhiu khi ln c cp pht v khng c gii phng. Ton t new khng th cp pht mt khi c kch thc c yu cu th n tr v 0. Chnh lp trnh vin phi chu trch nhim gii quyt nhng vn ny. C ch iu khin ngoi l ca C++ cung cp mt cch thc thc t gii quyt nhng vn nh th.
// tr ti phn t u tin
str++ tng str ln mt char (ngha l 1 byte) sao cho n tr ti k t th hai ca chui "HELLO" nhng ngc li ptr++ tng ptr ln mt int (ngha l 4 bytes) sao cho n tr ti phn t th hai ca nums. Hnh 5.3 minh ha s lc iu ny.
Hnh 5.3 Tnh ton con tr.
H E L L O \0 10 20 30 40
str str++
ptr ptr++
V th, cc phn t ca chui "HELLO" c th c tham kho ti nh *str, *(str + 1), *(str + 2), vng vng. Tng t, cc phn t ca nums c th c tham kho ti nh *ptr, *(ptr + 1), *(ptr + 2), v *(ptr + 3). Mt hnh thc khc ca tnh ton con tr c cho php trong C++ lin quan n tr hai con tr ca cng kiu. V d:
int *ptr1 = &nums[1]; int *ptr2 = &nums[3]; int n = ptr2 - ptr1;
// n tr thnh 2
66
Tnh ton con tr cn kho lo khi x l cc phn t ca mng. Danh sch 5.5 trnh by v d mt hm sao chp chui tng t nh hm nh ngha sn strcpy.
Danh sch 5.5 1 void CopyString (char *dest, char *src) 2 { 3 while (*dest++ = *src++) ; 4 }
Ch gii
iu kin ca vng lp ny gn ni dung ca chui src cho ni dung ca chui dest v sau tng c hai con tr. iu kin ny tr thnh 0 khi k t null kt thc ca chui src c chp ti chui dest.
Mt bin mng (nh nums) chnh n l a ch ca phn t u tin ca mng m n i din. V th cc phn t ca mng nums cng c th c tham kho ti bng cch s dng tnh ton con tr trn nums, ngha l nums[i] tng ng vi *(nums + i). Khc nhau gia nums v ptr ch nums l mt hng v th n khng th c to ra tr ti bt c th g na trong khi ptr l mt bin v c th c to ra tr ti cc s nguyn bt k. Danh sch 5.6 trnh by hm HighestTemp ( c trnh by trc trong Danh sch 5.3) c th c ci tin nh th no bng cch s dng tnh ton con tr.
Danh sch 5.6 1 int HighestTemp (const int *temp, const int rows, const int columns) 2 { 3 int highest = 0; 4 5 6 7 8 9 } Ch gii for (register i = 0; i < rows; ++i) for (register j = 0; j < columns; ++j) if (*(temp + i * columns + j) > highest) highest = *(temp + i * columns + j); return highest;
Thay v truyn mt mng ti hm, chng ta truyn mt con tr int v hai tham s thm vo c t kch c ca mng. Theo cch ny th hm khng b hn ch ti mt kch thc mng c th. Biu thc *(temp + i * columns + j) tng ng vi temp[i][j] trong phin bn hm trc.
67
Hm HighestTemp c th c n gin ha hn na bng cch xem temp nh l mt mng mt chiu ca row * column s nguyn. iu ny c trnh by trong Danh sch 5.7.
Danh sch 5.7 1 int HighestTemp (const int *temp, const int rows, const int columns) 2 { 3 int highest = 0; 4 5 6 7 8 } for (register i = 0; i < rows * columns; ++i) if (*(temp + i) > highest) highest = *(temp + i); return highest;
5.6. Con tr hm
Chng ta c th ly a ch mt hm v lu vo trong mt con tr hm. Sau con tr c th c s dng gi gin tip hm. V d,
int (*Compare)(const char*, const char*);
nh ngha mt con tr hm tn l Compare c th gi a ch ca bt k hm no nhn hai con tr k t hng nh l cc i s v tr v mt s nguyn. V d hm th vin so snh chui strcmp thc hin nh th. V th:
Compare = &strcmp; // Compare tr ti hm strcmp
Khi a ch hm c gn ti con tr hm th hai kiu phi khp vi nhau. nh ngha trn l hp l bi v hm strcmp c mt nguyn mu hm khp vi hm.
int strcmp(const char*, const char*);
Vi nh ngha trn ca Compare th hm strcmp hoc c th c gi trc tip hoc c th c gi gin tip thng qua Compare. Ba li gi hm sau l tng ng:
strcmp("Tom", "Tim"); (*Compare)("Tom", "Tim"); Compare("Tom", "Tim"); // gi trc tip // gi gin tip // gi gin tip (ngn gn)
Cch s dng chung ca con tr hm l truyn n nh mt i s ti mt hm khc; bi v thng thng cc hm sau yu cu cc phin bn khc nhau ca hm trc trong cc tnh hung khc nhau. Mt v d d hiu l hm tm
Chapter 5: Mng, con tr, v tham chiu
68
kim nh phn thng qua mt mng sp xp cc chui. Hm ny c th s dng mt hm so snh (nh l strcmp) so snh chui tm kim ngc li chui ca mng. iu ny c th khng thch hp i vi tt c cc trng hp. V d, hm strcmp l phn bit ch hoa hay ch thng. Nu chng ta thc hin tm kim theo cch khng phn bit dng ch sau mt hm so snh khc s c cn. Nh c trnh by trong Danh sch 5.8 bng cch cho hm so snh mt tham s ca hm tm kim, chng ta c th lm cho hm tm kim c lp vi hm so snh.
Danh sch 5.8 1 int BinSearch (char *item, char *table[], int n, 2 int (*Compare)(const char*, const char*)) 3 { 4 int bot = 0; 5 int top = n - 1; 6 int mid, cmp; 7 8 9 10 11 12 13 14 15 16 17 } Ch gii while (bot <= top) { mid = (bot + top) / 2; if ((cmp = Compare(item,table[mid])) == 0) return mid; // tra ve chi so hangg muc else if (cmp < 0) top = mid - 1; // gioi hn tim kiem toi nua thap hon else bot = mid + 1; // gioi han tim kiem toi nua cao hon } return -1; // khong tim thay
Tm kim nh phn l mt gii thut ni ting tm kim thng qua mt danh sch cc hng mc c sp xp. Danh sch tm kim c biu din bi table mt mng cc chui c kch thc n. Hng mc tm kim c biu th bi item. 2 Compare l con tr hm c s dng so snh item vi cc phn t ca mng. 7 mi vng lp, vic tm kim c gim i phn na. iu ny c lp li cho ti khi hai u tm kim giao nhau (c biu th bi bot v top) hoc cho ti khi mt so khp c tm thy. 9 Hng mc c so snh vi mc gia ca mng. 10 Nu item khp vi hng mc gia th tr v ch mc ca phn sau. 11 Nu item nh hn hng mc gia th sau tm kim c gii hn ti na thp hn ca mng. 14 Nu item ln hn hng mc gia th sau tm kim c gii hn ti na cao hn ca mng..
Chapter 5: Mng, con tr, v tham chiu
69
16 Tr v -1 ch nh rng khng c mt hng mc so khp. V d sau trnh by hm BinSearch c th c gi vi strcmp c truyn nh hm so snh nh th no:
char *cities[] = {"Boston", "London", "Sydney", "Tokyo"}; cout << BinSearch("Sydney", cities, 4, strcmp) << '\n';
iu ny s xut ra 2 nh c mong i.
nh ngha num2 nh l mt tham chiu ti num1. Sau nh ngha ny c hai num1 v num2 tham kho ti cng mt i tng nh th chng l cng bin. Cn bit r l mt tham chiu khng to ra mt bn sao ca mt i tng m ch n thun l mt bit hiu cho n. V vy, sau php gn
num1 = 0.16;
c hai num1 v num2 s biu th gi tr 0.16. Mt tham chiu phi lun c khi to khi n c nh ngha: n l mt bit danh cho ci g . Vic nh ngha mt tham chiu ri sau mi khi to n l khng ng lut.
double &num3; // khng ng lut: tham chiu khng c khi to num3 = num1;
Bn cng c th khi to tham chiu ti mt hng. Trong trng hp ny, mt bn sao ca hng c to ra (sau khi bt k s chuyn kiu cn thit no ) v tham chiu c thit lp tham chiu ti bn sao .
int &n = 1; // n tham kho ti bn sao ca 1
L do m n li tham chiu ti bn sao ca 1 hn l tham chiu ti chnh 1 l s an ton. Bn hy xem xt iu g s xy ra trong trng hp sau:
int &x = 1; ++x; int y = x + 1;
1 hng u tin v 1 hng th ba ging nhau l cng i tng (hu ht cc trnh bin dch thc hin ti u hng v cp pht c hai 1 trong cng mt v tr b nh). V th chng ta mong i y l 3 nhng n c th chuyn thnh
Chapter 5: Mng, con tr, v tham chiu
70
4. Tuy nhin, bng cch p buc x l mt bn sao ca 1 nn trnh bin dch m bo rng i tng c biu th bi x s khc vi c hai 1. Vic s dng chung nht ca tham chiu l cho cc tham s ca hm. Cc tham s ca hm thng lm cho d dng kiu truyn-bng-tham chiu, tri vi kiu truyn-bng-gi tr m chng ta s dng n thi im ny. quan st s khc nhau hy xem xt ba hm swap trong Danh sch 5.9.
Danh sch 5.9 1 void Swap1 (int x, int y) 2 { 3 int temp = x; 4 x = y; 5 y = temp; 6 } 7 void Swap2 (int *x, int *y) 8 { 9 int temp = *x; 10 *x = *y; 11 *y = temp; 12 } 13 void Swap3 (int &x, int &y) 14 { 15 int temp = x; 16 x = y; 17 y = temp; 18 } Ch gii
Mc d Swap1 chuyn i x v y, iu ny khng nh hng ti cc i s c truyn ti hm bi v Swap1 nhn mt bn sao ca cc i s. Nhng thay i trn bn sao th khng nh hng n d liu gc. 7 Swap2 vt qua vn ca Swap1 bng cch s dng cc tham s con tr thay th. Thng qua gii tham kho (dereferencing) cc con tr Swap2 ly gi tr gc v chuyn i chng. 13 Swap3 vt qua vn ca Swap1 bng cch s dng cc tham s tham chiu thay th. Cc tham s tr thnh cc bit danh cho cc i s c truyn ti hm v v th chuyn i chng khi cn. Swap3 c thun li thm, c php gi ca n ging nh Swap1 v khng c lin quan n nh a ch (addressing) hay l gii tham kho (dereferencing). Hm main sau minh ha s khc nhau gia cc li gi hm Swap1, Swap2, v Swap3.
int main (void) { int i = 10, j = 20; Swap1(i, j); cout << i << ", " << j << '\n'; Swap2(&i, &j); cout << i << ", " << j << '\n';
71
Swap3(i, j);
Tc dng ca cc nh ngha ny l String tr thnh mt bit danh cho char*, Name tr thnh mt bit danh cho mt mng gm 12 char, v uint tr thnh mt bit danh cho unsigned int. V th:
String Name uint n; str; name; // th tng t nh: char *str; // th tng t nh: char name[12]; // th tng t nh: unsigned int n;
Khai bo phc tp ca Compare trong Danh sch 5.8 l mt minh ha tt cho typedef:
typedef int (*Compare)(const char*, const char*); int BinSearch (char *item, char *table[], int n, Compare comp) { //... if ((cmp = comp(item, table[mid])) == 0) return mid; //... }
typedef m u Compare nh l mt tn kiu mi cho bt k hm vi nguyn mu (prototype) cho trc. Ngi ta cho rng iu ny lm cho du hiu ca BinSearch n gin hn.
72
Bi tp cui chng 5
5.1 nh ngha hai hm tng ng thc hin nhp vo cc gi tr cho cc phn t ca mng v xut cc phn t ca mng:
void ReadArray (double nums[], const int size); void WriteArray (double nums[], const int size);
5.2 5.3
Bng sau c t cc ni dung chnh ca bn loi hng ca cc ng cc im tm. nh ngha mt mng hai chiu bt d liu ny:
Top Flake Cornabix Oatabix Ultrabran S 12g 22g 28g 32g ng 25g 4g 5g 7g Bo 16g 8g 9g 2g Mui 0.4g 0.3g 0.5g 0.2g
Vit mt hm xut bng ny tng phn t mt. 5.4 nh ngha mt hm nhp vo danh sch cc tn v lu tr chng nh l cc chui c cp pht ng trong mt mng v mt hm xut chng:
void ReadNames (char *names[], const int size); void WriteNames (char *names[], const int size);
Vit mt hm khc sp xp danh sch bng cch s dng gii thut sp xp ni bt (bubble sort):
void BubbleSort (char *names[], const int size);
Sp xp ni bt lin quan n vic qut lp li danh sch, trong trong khi thc hin qut cc hng mc k nhau c so snh v i ch nu khng theo th t. Qut m khng lin quan n vic i ch ch ra rng danh sch c sp xp th t. 5.5 Vit li hm sau bng cch s dng tnh ton con tr:
char* ReverseString (char *str) { int len = strlen(str); char *result = new char[len + 1]; for (register i = 0; i < len; ++i) result[i] = str[len - i - 1]; result[len] = '\0'; return result;
73
5.6 5.7
Vit li gii thut BubbleSort (t bi 5.4) sao cho n s dng mt con tr hm so snh cc tn. Vit li cc m sau bng cch s dng nh ngha kiu:
void (*Swap)(double, double); char *table[]; char *&name; usigned long *values[10][20];
74
Chng ny gii thiu nhng khi nim c bn trong lp trnh hng i tng. Cc khi nim c bn nh lp, i tng, thuc tnh, phng thc, thng ip, v quan h ca chng s c tho lun trong phn ny. Thm vo l s trnh by ca nhng c im quan trng trong lp trnh hng i tng nh tnh bao gi, tnh tha k, tnh a hnh,.. nhm gip ngi hc c ci nhn tng qut v lp trnh hng i tng.
Nu bn cha bao gi s dng mt ngn ng OOP th trc tin bn nn nm vng cc khi nim ca OOP hn l vit cc chng trnh. Bn cn hiu c i tng (object) l g, lp (class) l g, chng c quan h vi nhau nh th no, v lm th no cc i tng trao i thng ip (message) vi nhau, vng vng. OOP l tp hp cc k thut quan trng m c th dng lm cho vic trin khai chng trnh hiu qu hn. Qu trnh tin ha ca OOP nh sau: Lp trnh tuyn tnh Lp trnh c cu trc S tru tng ha d liu Lp trnh hng i tng
76
ca mt vi b phn trong th gii thc. Tuy nhin cc i tng ny c th c biu din hay m hnh trn my tnh. Mt i tng th gii thc l mt thc th c th m thng thng bn c th s, nhn thy hay cm nhn c. Tt c cc i tng trong th gii thc u c trng thi (state) v hnh ng (behaviour). V d:
Trng thi Tn Mu Ging Vui sng Bnh rng Bn p Dy xch Bnh xe Hnh ng S a Vy tai Chy n Tng tc Gim tc Chuyn bnh rng
Con ch
Xe p
Cc i tng phn mm (software object) c th c dng biu din cc i tng th gii thc. Chng c m hnh sau khi cc i tng th gii thc c c trng thi v hnh ng. Ging nh cc i tng th gii thc, cc i tng phn mm cng c th c trng thi v hnh ng. Mt i tng phn mm c bin (variable) hay trng thi (state) m thng c gi l thuc tnh (attribute; property) duy tr trng thi ca n v phng thc (method) thc hin cc hnh ng ca n. Thuc tnh l mt hng mc d liu c t tn bi mt nh danh (identifier) trong khi phng thc l mt chc nng c kt hp vi i tng cha n. OOP thng s dng hai thut ng m sau ny Java cng s dng l thuc tnh (attribute) v phng thc (method) c t tng ng cho trng thi (state) hay bin (variable) v hnh ng (behavior). Tuy nhin C++ li s dng hai thut ng d liu thnh vin (member data) v hm thnh vin (member function) thay cho cc thut ng ny. Xt mt cch c bit, ch mt i tng ring r th chnh n khng hu dng. Mt chng trnh hng i tng thng gm c hai hay nhiu hn cc i tng phn mm tng tc ln nhau nh l s tng tc ca cc i tng trong trong th gii thc.
Khi nim 6.3
i tng (object) l mt thc th phn mm bao bc cc thuc tnh v cc phng thc lin quan.
K t y, trong gio trnh ny chng ta s dng thut ng i tng (object) ch mt i tng phn mm. Hnh 6.1 l mt minh ha ca mt i tng phn mm:
Chng 6: Lp trnh hng i tng
78
Hnh 6.1
Mt i tng phn mm
Mi th m i tng phn mm bit (trng thi) v c th lm (hnh ng) c th hin qua cc thuc tnh v cc phng thc. Mt i tng phn mm m phng cho chic xe p s c cc thuc tnh xc nh cc trng thi ca chic xe p nh: tc ca n l 10 km trn gi, nhp bn p l 90 vng trn pht, v bnh rng hin ti l bnh rng th 5. Cc thuc tnh ny thng thng c xem nh thuc tnh th hin (instance attribute) bi v chng cha ng cc trng thi cho mt i tng xe p c th. Trong k thut hng i tng th mt i tng c th c gi l mt th hin (instance).
Khi nim 6.4
Mt i tng c th c gi l mt th hin (instance).
i tng xe p phn mm cng c cc phng thc thng li, tng nhp p hay l chuyn i bnh rng. N khng c phng thc thay i tc v tc ca xe p c th tnh ra t hai yu t s vng quay v bnh rng hin ti. Nhng phng thc ny thng thng c bit nh l cc phng thc th hin (instance method) bi v chng tc ng hay thay i trng thi ca mt i tng c th.
79
6.4. Lp (Class)
Trong th gii thc thng thng c nhiu loi i tng cng loi. Chng hn chic xe p ca bn ch l mt trong hng t chic xe p trn th gii. Tng t, trong mt chng trnh hng i tng c th c nhiu i tng cng loi v chia s nhng c im chung. S dng thut ng hng i tng, chng ta c th ni rng chic xe p ca bn l mt th hin ca lp xe p. Cc xe p c mt vi trng thi chung (bnh rng hin ti, s vng quay hin ti, hai bnh xe) v cc hnh ng (chuyn bnh rng, gim tc). Tuy nhin, trng thi ca mi xe p l c lp v c th khc vi cc trng thi ca cc xe p khc. Trc khi to ra cc xe p, cc nh sn xut thng thit lp mt bng thit k (blueprint) m t cc c im v cc yu t c bn ca xe p. Sau hng lot xe p s c to ra t bn thit k ny. Khng hiu qu nu nh to ra mt bn thit k mi cho mi xe p c sn xut. Trong phn mm hng i tng cng c th c nhiu i tng cng loi chia s nhng c im chung nh l: cc hnh ch nht, cc mu tin nhn vin, cc on phim, Ging nh l cc nh sn xut xe p, bn c th to ra mt bng thit k cho cc i tng ny. Mt bng thit k phn mm cho cc i tng c gi l lp (class).
Khi nim 6.5
Lp (class) l mt thit k (blueprint) hay mt mu ban u (prototype) nh ngha cc thuc tnh v cc phng thc chung cho tt c cc i tng ca cng mt loi no . Mt i tng l mt th hin c th ca mt lp. Tr li v d v xe p chng ta thy rng mt lp Xedap l mt bng thit k cho hng lot cc i tng xe p c to ra. Mi i tng xe p l mt th hin ca lp Xedap v trng thi ca n c th khc vi cc i tng xe p khc. V d mt xe p hin ti c th l bnh rng th 5 trong khi mt chic khc c th l bnh rng th 3. Lp Xedap s khai bo cc thuc tnh th hin cn thit cha ng bnh rng hin ti, s vng quay hin ti, .. cho mi i tng xe p. Lp Xedap cng khai bo v cung cp nhng thi cng cho cc phng thc th hin cho php ngi i xe p chuyn i bnh rng, phanh li, chuyn i s vng quay, .. nh Hnh 6.3.
80
Hnh 6.3
Sau khi bn to ra lp xe p, bn c th to ra bt k i tng xe p no t lp ny. Khi bn to ra mt th hin ca lp, h thng cp pht b nh cho i tng v tt c cc thuc tnh th hin ca n. Mi th hin s c vng nh ring cho cc thuc tnh th hin ca n. Hnh 6.4 minh ha hai i tng xe p khc nhau c to ra t cng lp Xedap:
Hnh 6.4 Hai i tng ca lp Xedap
Ngoi cc thuc tnh th hin, cc lp c th nh ngha cc thuc tnh lp (class attribute). Mt thuc tnh lp cha ng cc thng tin m c chia s bi tt c cc th hin ca lp. V d, tt c xe p c cng s lng bnh rng. Trong trng hp ny, nh ngha mt thuc tnh th hin gi s lng bnh rng l khng hiu qu bi v tt c cc vng nh ca cc thuc tnh th hin ny u gi cng mt gi tr. Trong nhng trng hp nh th bn c th nh ngha mt thuc tnh lp cha ng s lng bnh rng ca xe p.Tt c cc th hin ca lp Xedap s chia thuc tnh ny. Mt lp cng c th khai bo cc phng thc lp (class methods). Bn c th triu gi mt phng thc lp trc tip t lp nhng ngc li bn phi triu gi cc phng thc th hin t mt th hin c th no .
81
Hnh 6.5
Lp v th hin ca lp
Thuc tnh lp (class attribute) l mt hng mc d liu lin kt vi mt lp c th m khng lin kt vi cc th hin ca lp. N c nh ngha bn trong nh ngha lp v c chia s bi tt c cc th hin ca lp. Phng thc lp (class method) l mt phng thc c triu gi m khng tham kho ti bt k mt i tng no. Tt c cc phng thc lp nh hng n ton b lp ch khng nh hng n mt lp ring r no.
Thuc tnh (attribute) l d liu trnh by cc c im v mt i tng. Mt thuc tnh c th c gn mt gi tr ch sau khi mt i tng da trn lp y c to ra. Mt khi cc thuc tnh c gn gi tr chng m t mt i tng. Mi i tng ca mt lp phi c cng cc thuc tnh nhng gi tr ca cc thuc tnh th c th khc nhau. Mt thuc tnh ca i tng c th nhn cc gi tr khc nhau ti nhng thi im khc nhau.
82
Phng thc (method) c lin quan ti nhng th m i tng c th lm. Mt phng thc p ng mt chc nng tc ng ln d liu ca i tng (thuc tnh). Cc phng thc xc nh cch thc hot ng ca mt i tng v c thc thi khi i tng c th c to ra.V d, cc hot ng chung ca mt i tng thuc lp Ch l sa, vy tai, chy, v n. Tuy nhin, ch khi mt i tng c th thuc lp Ch c to ra th cc phng thc sa, vy tai, chy, v n mi c thc thi. Cc phng thc mang li mt cch nhn khc v i tng. Khi bn nhn vo i tng Ca ra vo bn trong mi trng ca bn (mi trng th gii thc), mt cch n gin bn c th thy n l mt i tng bt ng khng c kh nng suy ngh. Trong tip cn hng i tng cho pht trin h thng, Ca ra vo c th c lin kt ti phng thc c gi s l c th c thc hin. V d, Ca ra vo c th m, n c th ng, n c th kha, hoc n c th m kha. Tt c cc phng thc ny gn kt vi i tng Ca ra vo v c thc hin bi Ca ra vo ch khng phi mt i tng no khc.
Mt thng ip gm c:
Khi nim 6.9 Mt thng ip (message) l mt li yu cu mt hot ng. Mt thng ip c truyn khi mt i tng triu gi mt hay nhiu phng thc ca i tng khc yu cu thng tin.
i tng nhn thng ip Tn ca phng thc thc hin Cc tham s m phng thc cn
Khi mt i tng nhn c mt thng ip, n thc hin mt phng thc tng ng. V d i tng xe p nhn c thng ip l chuyn i bnh rng n s thc hin vic tm kim phng thc chuyn i bnh rng tng ng v thc hin theo yu cu ca thng ip m n nhn c.
Mt i tng c mt giao din chung cho cc i tng khc s dng giao tip vi n. Do c tnh ng gi m cc chi tit nh: cc trng thi
Chng 6: Lp trnh hng i tng
84
c lu tr nh th no hay cc hnh ng c thi cng ra sao c th c che giu i t cc i tng khc. iu ny c ngha l cc chi tit ring ca i tng c th c chuyn i m hon ton khng nh hng ti cc i tng khc c lin h vi n. V d, mt ngi i xe p khng cn bit chnh xc c ch chuyn bnh rng trn xe p thc s lm vic nh th no nhng vn c th s dng n. iu ny c gi l che giu thng tin.
Khi nim 6.11 Che giu thng tin (information hiding) l vic n i cc chi tit ca thit k hay thi cng t cc i tng khc.
Cc lp con tha k thuc tnh v hnh ng t lp cha ca chng. V d, mt xe p leo ni khng nhng c bnh rng, s vng quay trn pht v tc ging nh mi xe p khc m cn c thm mt vi loi bnh rng v th m n cn thm mt thuc tnh l gearRange (loi bnh rng). Cc lp con c th nh ngha li cc phng thc c tha k cung cp cc thi cng ring bit cho cc phng thc ny. V d, mt xe p leo ni s cn mt phng thc c bit chuyn i bnh rng.
85
Cc lp con cung cp cc phin bn c bit ca cc lp cha m khng cn phi nh ngha li cc lp mi hon ton. y, m lp cha c th c s dng li nhiu ln.
Chng ta hy xem xt cc i tng Ca S v Ca Ci. C hai i tng c mt hnh ng chung c th thc hin l ng. Nhng mt i tng Ca Ci thc hin hnh ng c th khc vi cch m mt i tng Ca S thc hin hnh ng . Ca Ci khp cnh ca li trong khi Ca S h cc thanh ca xung. Tht vy, hnh ng ng c th thc hin mt trong hai hnh thc khc nhau. Mt v d khc l hnh ng hin th. Ty thuc vo i tng tc ng, hnh ng y c th hin th mt chui, hoc v mt ng thng, hoc l hin th mt hnh. a hnh c s lin quan ti vic truyn thng ip. i tng yu cu cn bit hnh ng no yu cu v yu cu t i tng no. Tuy nhin i tng yu cu khng cn lo lng v mt hnh ng c hon thnh nh th no.
Bi tp cui chng 6
6.1 Trnh by cc nh ngha ca cc thut ng: Lp trnh hng i tng Tru tng ha i tng Lp Thuc tnh Phng thc Thng ip
86
Phn bit s khc nhau gia lp v i tng, gia thuc tnh v gi tr, gia thng ip v truyn thng ip. Trnh by cc c im ca OOP. Nhng li ch c c thng qua tha k v bao gi. Nhng thuc tnh v phng thc c bn ca mt ci my git. Nhng thuc tnh v phng thc c bn ca mt chic xe hi. Nhng thuc tnh v phng thc c bn ca mt hnh trn. Ch ra cc i tng trong h thng rt tin t ng ATM. Ch ra cc lp c th k tha t lp in thoi, xe hi, v ng vt.
87
Chng 7. Lp
Chng ny gii thiu cu trc lp C++ nh ngha cc kiu d liu mi. Mt kiu d liu mi gm hai thnh phn nh sau: c t c th cho cc i tng ca kiu. Tp cc thao tc thc thi cc i tng. Ngoi cc thao tc c ch nh th khng c thao tc no khc c th iu khin i tng. V mt ny chng ta thng ni rng cc thao tc m t kiu, ngha l chng quyt nh ci g c th v ci g khng th xy ra trn cc i tng. Cng vi cng l do ny, cc kiu d liu thch hp nh th c gi l kiu d liu tru tng (abstract data type) - tru tng bi v s c t bn trong ca i tng c n i t cc thao tc m khng thuc kiu. Mt nh ngha lp gm hai phn: phn u v phn thn. Phn u lp ch nh tn lp v cc lp c s (base class). (Lp c s c lin quan n lp dn xut v c tho lun trong chng 8). Phn thn lp nh ngha cc thnh vin lp. Hai loi thnh vin c h tr: D liu thnh vin (member data) c c php ca nh ngha bin v ch nh cc i din cho cc i tng ca lp. Hm thnh vin (member function) c c php ca khai bo hm v ch nh cc thao tc ca lp (cng c gi l cc giao din ca lp).
C++ s dng thut ng d liu thnh vin v hm thnh vin thay cho thuc tnh v phng thc nn k t y chng ta s dng dng hai thut ng ny c t cc lp v cc i tng. Cc thnh vin lp c lit k vo mt trong ba loi quyn truy xut khc nhau: Cc thnh vin chung (public) c th c truy xut bi tt c cc thnh phn s dng lp. Cc thnh vin ring (private) ch c th c truy xut bi cc thnh vin lp. Cc thnh vin c bo v (protected) ch c th c truy xut bi cc thnh vin lp v cc thnh vin ca mt lp dn xut. Kiu d liu c nh ngha bi mt lp c s dng nh kiu c sn.
Chng 7: Lp
92
7.1. Lp n gin
Danh sch 7.1 trnh by nh ngha ca mt lp n gin i din cho cc im trong khng gian hai chiu.
Danh sch 7.1 1 class Point { 2 int xVal, yVal; 3 public: 4 void SetPt (int, int); 5 void OffsetPt (int, int); 6 }; Ch gii
Hng ny cha phn u ca lp v t tn cho lp l Point. Mt nh ngha lp lun bt u vi t kha class v theo sau l tn lp. Mt du { (ngoc m) nh du im bt u ca thn lp. 2 Hng ny nh ngha hai d liu thnh vin xVal v yVal, c hai thuc kiu int. Quyn truy xut mc nh cho mt thnh vin ca lp l ring (private). V th c hai xVal v yVal l ring. 3 T kha ny ch nh rng t im ny tr i cc thnh vin ca lp l chung (public). 4-5 Hai hng ny l cc hm thnh vin. C hai c hai tham s nguyn v mt kiu tr v void. 6 Du } (ngoc ng) ny nh du kt thc phn thn lp. Th t trnh by cc d liu thnh vin v hm thnh vin ca mt lp l khng quan trng lm. V d lp trn c th c vit tng ng nh th ny:
class Point { public: void SetPt (int, int); void OffsetPt (int, int); private: int xVal, yVal; };
nh ngha tht s ca cc hm thnh vin thng khng l b phn ca lp v xut hin mt cch tch bit. Danh sch 7.2 trnh by nh ngha ring bit ca SetPt v OffsetPt.
Chng 7: Lp
93
Danh sch 7.2 1 void Point::SetPt (int x, int y) 2 { 3 xVal = x; 4 yVal = y; 5 } 6 void Point::OffsetPt (int x, int y) 7 { 8 xVal += x; 9 yVal += y; 10 } Ch gii
nh ngha ca mt hm thnh vin th tng t nh l hm bnh thng. Tn hm c ch r trc vi tn lp v mt cp du hai chm kp. iu ny xem SetPt nh mt thnh vin ca Point. Giao din hm phi ph hp vi nh ngha giao din trc bn trong lp (ngha l, ly hai tham s nguyn v c kiu tr v l void). 3-4 Ch l hm SetPt (l thnh vin ca Point) c th t do tham kho ti d liu thnh vin xVal v yVal. Cc hm khng l hm thnh vin khng c quyn ny.
Mt khi mt lp c nh ngha theo cch ny, tn ca n bao hm mt kiu d liu mi cho php chng ta nh ngha cc bin ca kiu . V d:
Point pt; // pt l mt i tng ca lp Point pt.SetPt(10,20); // pt c t ti (10,20) pt.OffsetPt(2,2); // pt tr thnh (12,22)
Cc hm thnh vin c s dng k hiu du chm: pt.SetPt(10,20) gi hm SetPt ca i tng pt, ngha l pt l mt i s n ca SetPt. Bng cch to ra cc thnh vin ring xVal v yVal chng ta phi chc chn rng ngi s dng lp khng th iu khin trc tip chng:
pt.xVal = 10; // khng hp l
iu ny s khng bin dch. giai on ny, chng ta cn phn bit r rng gia i tng v lp. Mt lp biu th mt kiu duy nht. Mt i tng l mt phn t ca mt kiu c th (lp). V d,
Point pt1, pt2, pt3;
nh ngha tt c ba i tng (pt1, pt2, v pt3) ca cng mt lp (Point). Cc thao tc ca mt lp c ng dng bi cc i tng ca lp nhng khng bao gi c p dng trn chnh lp . V th mt lp l mt khi nim khng c s tn ti c th m chu s phn chiu bi cc i tng ca n.
Chng 7: Lp
94
Ch rng bi v thn hm c chn vo nn khng cn du chm phy sau khai bo hm. Hn na, cc tham s ca hm phi c t tn.
7.3. V d: Lp Set
Tp hp (Set) l mt tp cc i tng khng k th t v khng lp. V d ny th hin rng mt tp hp c th c nh ngha bi mt lp nh th no. n gin chng ta gii hn trn hp cc s nguyn vi s lng cc phn t l hu hn. Danh sch 7.3 trnh by nh ngha lp Set.
Danh sch 7.3 1 #include <iostream.h> 2 const maxCard = 100; 3 enum Bool {false, true}; 4 class Set { 5 public: 6 void EmptySet (void){ card = 0; } 7 Bool Member (const int); 8 void AddElem (const int); 9 void RmvElem (const int); 10 void Copy (Set&); 11 Bool Equal (Set&); 12 void Intersect(Set&, Set&); 13 void Union (Set&, Set&); 14 void Print (void); 15 private: 16 int elems[maxCard]; // cac phan tu cua tap hop 17 int card; // so phan tu cua tap hop 18 };
Chng 7: Lp
95
Ch gii
2 6 7 8
9 10 11
12 13 14 16 17
maxCard biu th s lng phn t ti a trong tp hp. EmptySet xa ni dung tp hp bng cch t s phn t tp hp v 0. Member kim tra mt s cho trc c thuc tp hp hay khng. AddElem thm mt phn t mi vo tp hp. Nu phn t c trong tp hp ri th khng lm g c. Ngc li th thm n vo tp hp. Trng hp m tp hp trn th phn t khng c xen vo. RmvElem xa mt phn t trong tp hp. Copy sao chp tp hp ti mt tp hp khc. Tham s cho hm ny l mt tham chiu ti tp hp ch. Equal kim tra hai tp hp c bng nhau hay khng. Hai tp hp l bng nhau nu chng cha ng chnh xc cng s phn t (th t ca chng l khng quan trng). Intersect so snh hai tp hp cho ra tp hp th ba cha cc phn t l giao ca hai tp hp. V d, giao ca {2,5,3} v {7,5,2} l {2,5}. Union so snh hai tp hp cho ra tp hp th ba cha cc phn t l hi ca hai tp hp. V d, hp ca {2,5,3} v {7,5,2} l {2,5,3,7}. Print in mt tp hp s dng k hiu ton hc theo qui c. V d, mt tp hp gm cc s 5, 2, v 10 c in l {5,2,10}. Cc phn t ca tp hp c biu din bng mng elems. S phn t ca tp hp c biu th bi card. Ch c cc u vo bn s u tin trong elems c xem xt l cc phn t hp l.
Vic nh ngha tch bit cc hm thnh vin ca mt lp i khi c bit ti nh l s ci t (implementation) ca mt lp. S thi cng lp Set l nh sau.
Bool Set::Member (const int elem) { for (register i = 0; i < card; ++i) if (elems[i] == elem) return true; return false; } void Set::AddElem (const int elem) { if (Member(elem)) return; if (card < maxCard) elems[card++] = elem; else cout << "Set overflow\n"; } void Set::RmvElem (const int elem) { for (register i = 0; i < card; ++i)
Chng 7: Lp
96
if (elems[i] == elem) { for (; i < card-1; ++i) // dich cac phan tu sang trai elems[i] = elems[i+1]; --card; }
void Set::Copy (Set &set) { for (register i = 0; i < card; ++i) set.elems[i] = elems[i]; set.card = card; } Bool Set::Equal (Set &set) { if (card != set.card) return false; for (register i = 0; i < card; ++i) if (!set.Member(elems[i])) return false; return true; } void Set::Intersect (Set &set, Set &res) { res.card = 0; for (register i = 0; i < card; ++i) if (set.Member(elems[i])) res.elems[res.card++] = elems[i]; } void Set::Union (Set &set, Set &res) { set.Copy(res); for (register i = 0; i < card; ++i) res.AddElem(elems[i]); } void Set::Print (void) { cout << "{"; for (int i = 0; i < card-1; ++i) cout << elems[i] << ","; if (card > 0) // khong co dau , sau phan tu cuoi cung cout << elems[card-1]; cout << "}\n"; }
Chng 7: Lp
97
s1.Print(); s2.Print();
s2.RmvElem(50); cout << "s2 - {50} = "; s2.Print(); if (s1.Member(20)) cout << "20 is in s1\n"; s1.Intersect(s2,s3); cout << "s1 intsec s2 = "; s3.Print(); s1.Union(s2,s3); cout << "s1 union s2 = "; s3.Print(); if (!s1.Equal(s2)) cout << "s1 <> s2\n"; return 0;
l mt nh ngha c th ca lp Point, trong SetPt c thay th bi mt hm xy dng c nh ngha ni tuyn. By gi chng ta c th nh ngha cc i tng kiu Point v khi to chng mt lt. iu ny qu tht l p buc i vi nhng lp cha cc hm xy dng i hi cc i s:
Point pt1 = Point(10,20); Point pt2; // tri lut
Chng 7: Lp
98
Mt lp c th c nhiu hn mt hm xy dng. Tuy nhin, trnh m h th mi hm xy dng phi c mt du hiu duy nht. V d,
class Point { int xVal, yVal; public: Point (int x, int y) Point (float, float); Point (void) void OffsetPt (int, int); };
Point::Point (float len, float angle) // cc ta cc { xVal = (int) (len * cos(angle)); yVal = (int) (len * sin(angle)); }
c ba hm xy dng khc nhau. Mt i tng c kiu Point c th c nh ngha s dng bt k hm no trong cc hm ny:
Point pt1(10,20); // ta -ct-t Point pt2(60.3,3.14); // ta cc Point pt3; // gc
{ card = 0; }
iu ny to thun li cho cc lp trnh vin khng cn phi nh gi EmptySet na. Hm xy dng m bo rng mi tp hp l rng vo lc ban u. Lp Set c th c ci tin hn na bng cch cho php ngi dng iu khin kch thc ti a ca tp hp. lm iu ny chng ta nh ngha elems nh mt con tr s nguyn hn l mng s nguyn. Hm xy dng sau c th c cung cp mt i s c t kch thc ti a mong mun. Ngha l maxCard s khng cn l hng c dng cho tt c cc i tng Set na m chnh n tr thnh mt thnh vin d liu:
class Set { public:
Set (const int size); //... private: int *elems; int maxCard; int card; };
Chng 7: Lp
99
Hm xy dng d dng cp pht mt mng ng vi kch thc mong mun v khi to gi tr ph hp cho maxCard v card:
Set::Set (const int size) { elems = new int[size]; maxCard = size; card = 0; }
Chng ta cn lu rng mt hm xy dng ca i tng c ng dng khi i tng c to ra. iu ny ph thuc vo phm vi ca i tng. V d, mt i tng ton cc c to ra ngay khi s thc thi chng trnh bt u; mt i tng t ng c to ra khi phm vi ca n c ng k; v mt i tng ng c to ra khi ton t new c p dng ti n.
7.5. Hm hy (Destructor)
Nh l mt hm xy dng c dng khi to mt i tng khi n c to ra, mt hm hy c dng dn dp mt i tng ngay trc khi n c thu hi. Hm hy lun lun c cng tn vi chnh tn lp ca n nhng c i u vi k t ~. Khng ging cc hm xy dng, mi lp ch c nhiu nht mt hm hy. Hm hy khng nhn bt k i s no v khng c mt kiu tr v r rng. Thng thng cc hm hy thng hu ch v cn thit cho cc lp cha d liu thnh vin con tr. Cc d liu thnh vin con tr tr ti cc khi b nh c cp pht t lp. Trong cc trng hp nh th th vic gii phng b nh c cp pht cho cc con tr thnh vin l cc k quan trng trc khi i tng c thu hi. Hm hy c th lm cng vic nh th. V d, phin bn sa li ca lp Set s dng mt mng c cp pht ng cho cc thnh vin elems. Vng nh ny nn c gii phng bi mt hm hy:
class Set { public:
Set (const int size); ~Set (void) {delete elems;} // destructor // cac phan tu tap hop // so phan tu toi da // so phan tu cua tap hop
Khi hm Foo c gi, hm xy dng cho s c triu tp, cp pht lu tr cho s.elems v khi to cc thnh vin d liu ca n. K tip, phn cn li ca thn hm Foo c thc thi. Cui cng, trc khi Foo tr v, hm hy cho cho s c triu tp, xa i vng lu tr b chim bi s.elems. K t y cho n khi cp pht lu tr c k n th s ng x ging nh l bin t ng ca mt kiu c sn c to ra khi phm vi ca n c bit n v c hy i khi phm vi ca n c ri khi. Ni chung, hm xy dng ca i tng c p dng trc khi i tng c thu hi. iu ny ph thuc vo phm vi ca i tng. V d, mt i tng ton cc c thu hi khi s thc hin ca chng trnh hon tt; mt i tng t ng c thu hi khi ton t delete c p dng ti n.
7.6. Bn (Friend)
i khi chng ta cn cp quyn truy xut cho mt hm ti cc thnh vin khng l cc thnh vin chung ca mt lp. Mt truy xut nh th c thc hin bng cch khai bo hm nh l bn ca lp. C hai l do c th cn n truy xut ny l: C th l cch nh ngha hm chnh xc. C th l cn thit nu nh hm ci t khng hiu qu. Cc v d ca trng hp u s c cung cp trong chng 8 khi chng ta tho lun v ti nh ngha cc ton t xut/nhp. Mt v d ca trng hp th hai c tho lun bn di. Gi s rng chng ta nh ngha hai bin th ca lp Set, mt cho tp cc s nguyn v mt cho tp cc s thc:
class IntSet { public: //... private: int elems[maxCard]; int card; }; class RealSet { public: //... private: float elems[maxCard]; int card; };
Chng 7: Lp
101
Chng ta mun nh ngha mt hm SetToReal chuyn tp hp s nguyn thnh tp hp s thc.Chng ta c th lm iu ny bng cch cho hm SetToReal l mt thnh vin ca IntSet:
void IntSet::SetToReal (RealSet &set) { set.EmptySet(); for (register i = 0; i < card; ++i) set.AddElem((float) elems[i]); }
Du cho cng vic ny c th thc hin c nhng tn ph ca vic gi hm AddElem cho mi thnh vin ca tp hp c th l khng th chp nhn. Cng vic ci t c th c ci thin nu chng ta ginh c truy xut ti cc d liu ring ca c hai IntSet v RealSet. iu ny c th c gii quyt bng cch khai bo hm SetToReal nh l bn ca lp RealSet.
class RealSet { //... friend void IntSet::SetToReal (RealSet&); }; void IntSet::SetToReal (RealSet &set) { set.card = card; for (register i = 0; i < card; ++i) set.elems[i] = (float) elems[i]; }
Trng hp cho tt c cc hm thnh vin ca lp A nh l bn ca mt lp B khc c th c din gii trong mt hnh thc ngn gn nh sau:
class A; class B { //... friend class A; };
Chng 7: Lp
102
Mc d khai bo bn xut hin bn trong mt lp nhng iu khng lm cho hm l mt thnh vin ca lp . Thng thng, v tr ca khai bo bn trong mt lp l khng quan trng: d cho n xut hin trong phn chung, ring, hay c bo v th u c cng ngha.
7.7. i s mc nh
Nh l cc hm ton cc, mt hm thnh vin ca mt lp c th c cc i s mc nh. ng dng lut tng t, tt c cc i s mc nh l cc i s phn ui (bn tay phi), v i s c th l mt biu thc gm nhiu i tng c nh ngha bn trong phm vi m lp xut hin. V d, mt hm xy dng cho lp Point c th s dng cc i s mc nh cung cp nhiu cch thc khc nhau cho vic nh ngha mt i tng Point :
class Point { int xVal, yVal; public: Point (int x = 0, int y = 0); //... };
// ta cc
Chng 7: Lp
103
pt l mt i s n cho OffsetPt. Bn trong thn ca hm thnh vin tn ti mt con tr this tham kho ti i s n ny. This biu th mt con tr ti i tng m thnh vin c triu gi. S dng this hm OffsetPt c th c vit nh sau:
Point::OffsetPt (int x, int y) { this->xVal += x; // tng ng vi: xVal += x; this->yVal += y; // tng ng vi: yVal += y; }
Vic s dng this trong trng hp ny l d tha. Tuy nhin c nhng trng hp lp trnh trong s dng con tr this l cn thit. Chng ta s thy cc v d ca nhng trng hp nh th trong chng 7 khi tho lun v ti nh ngha cc ton t. Con tr this c th c s dng tham kho n cc hm thnh vin chnh xc nh l n c s dng cho cc d liu thnh vin. Tuy nhin cn ch l con tr this c nh ngha cho vic s dng bn trong cc hm thnh vin ca ch mt lp. C th hn l n khng nh ngha cho cc hm ton cc (bao hm c cc hm bn ton cc).
Hnh thc y s dng ton t phm vi nh hng :: ch nh rng hm OffsetPt l mt thnh vin ca lp Point. Trong mt vi tnh hung, s dng ton t phm vi l cn thit. V d, trng hp m tn ca thnh vin lp b che du bi bin cc b (v d, tham s hm thnh vin) c th c vt qua bng cch s dng ton t phm vi:
class Point { public: Point (int x, int y)
Chng 7: Lp
y x v y trong hm xy dng (phm vi bn trong) che i x v y trong lp (phm vi bn ngoi). x v y trong lp c tham kho r rng l Point::x v Point::y.
Tip cn th hai s dng mt danh sch khi to thnh vin (member initialization list) trong nh ngha hm xy dng. V d:
class Image { public: Image private: int width; int height; //... };
Tc ng ca khai bo ny l width c khi to ti w v height c khi to ti h. Ch khc nhau gia tip cn ny v tip cn trc l y cc thnh vin c khi to trc khi thn ca hm xy dng c thc hin. Danh sch khi to thnh vin c th c s dng khi to bt k thnh vin d liu no ca mt lp. N lun c t gia phn u v phn thn ca hm xy dng. Mt du hai chm (:) c s dng phn bit n
Chng 7: Lp
105
vi phn u. N gm mt danh sch cc thnh vin d liu c phn bit bng du phy (,) m gi tr khi to ca chng xut hin bn trong mt cp du ngoc n.
Tuy nhin, cc hng thnh vin d liu khng th c khi to bng cch s dng cng c php nh l i vi cc hng khc:
class Image { const int width = 256; const int height = 168; //... }; // khi to tri lut // khi to tri lut
Cch chnh xc khi to mt hng thnh vin d liu l thng qua mt danh sch khi to thnh vin:
class Image { public:
Nh l mt iu c mong i, khng c hm thnh vin no c cho php gn ti mt thnh vin d liu hng. Mt thnh vin d liu hng khng thch hp cho vic nh ngha kch thc ca mt thnh vin d liu mng. V d, trong
class Set { public:
Set(void) : maxCard(10) //... private: const maxCard; int elems[maxCard]; int card; };
{ card = 0; }
// khng ng lut
Chng 7: Lp
106
mng elems s b bt b bi trnh bin dch. L do l maxCard khng c rng buc ti mt gi tr trong thi gian bin dch m c rng buc khi chng trnh chy v hm xy dng c triu gi. Cc hm thnh vin cng c th c nh ngha nh l hng. iu ny c s dng c t cc hm thnh vin no ca lp c th c triu gi cho mt i tng hng. V d,
class Set { public:
};
Set(void){ card = 0; } Bool Member(const int) const; void AddElem(const int); //...
nh ngha hm Member nh l mt hm thnh vin hng. thc hin iu kha const c chn sau phn u ca hm c hai bn trong lp v trong nh ngha hm. Mt i tng hng ch c th c sa i bi cc hm thnh vin hng ca lp:
const Set s; s.AddElem(10); // tri lut: AddElem khng l thnh vin hng s.Member(10); // ok
Lut cho php mt hm thnh vin hng c cho php triu gi cc i tng hng, nhng nu n c gng sa i bt k cc thnh vin d liu no ca lp l khng ng lut. Hm xy dng v hm hy khng bao gi cn c nh ngha nh cc thnh vin hng v chng c quyn thao tc trn cc i tng hng. Chng cng khng b tc ng bi lut trn v c th gn ti mt thnh vin d liu ca mt i tng hng tr phi thnh vin d liu chnh n l mt hng.
Chng 7: Lp
107
};
//...
y, khng quan tm n bao nhiu i tng kiu Window c nh ngha, s ch l mt th hin ca first. Ging nh cc bin tnh khc, mt thnh vin d liu tnh mc nh c khi to l 0. N c th c khi to ti mt gi tr ty trong cng phm vi m nh ngha hm thnh vin xut hin:
Window *Window::first = &myWindow;
Cc hm thnh vin cng c th c nh ngha l tnh. V mc ng ngha, mt hm thnh vin tnh ging nh l mt hm ton cc m l bn ca mt lp nhng khng th truy xut bn ngoi lp. N khng nhn mt i s n v v th khng th tham kho ti con tr this. Cc hm thnh vin tnh l cn thit nh ngha cc th tc gi li (call-back routines) m cc danh sch tham s ca n c nh trc v ngoi phm vi iu khin ca lp trnh vin. V d, lp Window c th s dng mt hm gi li sn cc vng l ra ca ca s:
class Window { //... static void PaintProc (Event *event); };
// gi li
Bi v cc hm tnh c chia s v khng nh vo con tr this nn chng c tham kho tt nht nh vo s dng c php class::member. V d, first v PaintProc s c tham kho nh Window::first v Window::PaintProc. Cc thnh vin tnh chng c th c tham kho ti thng qua s dng c php ny bi cc hm khng l thnh vin (v d, cc hm ton cc).
Tng t cc hng thnh vin d liu, mt tham chiu thnh vin d liu khng th c khi to bng cch s dng cng c php nh i vi cc tham chiu khc:
class Image { int width; int height; int &widthRef = width; //... };
Chng 7: Lp
Cch chnh xc khi to mt tham chiu thnh vin d liu l thng qua mt danh sch khi to thnh vin:
class Image { public: Image(const int w, const int h); private: int width; int height; int &widthRef; //... }; Image::Image (const int w, const int h) : widthRef(width) { //... }
Hm xy dng cho lp Rectangle cng c th khi to hai thnh vin i tng ca lp. Gi s rng lp Point c mt hm xy dng th iu ny c thc hin bng cch thm topLeft v botRight vo danh sch khi to thnh vin ca hm xy dng cho lp Rectangle:
Rectangle::Rectangle (int left, int top, int right, int bottom) : topLeft(left,top), botRight(right,bottom) { }
Nu hm xy dng ca lp Point khng c tham s hoc nu n c cc i s mc nh cho tt c tham s ca n th danh sch khi to thnh vin trn c th c b qua. Th t khi to th lun l nh sau. Trc ht hm xy dng cho topLeft c triu gi v theo sau l hm xy dng cho botRight, v cui cng l hm xy dng cho chnh lp Rectangle. Hm hy i tng lun theo hng ngc
Chng 7: Lp
109
li. Trc tin l hm xy dng cho lp Rectangle (nu c) c triu gi, theo sau l hm hy cho botRight, v cui cng l cho topLeft. L do m topLeft c khi to trc botRight khng phi v n xut hin trc trong danh khi to thnh vin m v n xut hin trc botRight trong chnh lp . V th, nh ngha hm xy dng nh sau s khng thay i th t khi to (hoc hm hy):
Rectangle::Rectangle (int left, int top, int right, int bottom) : botRight(right,bottom), topLeft(left,top) { }
7.15.Mng cc i tng
Mng cc kiu ngi dng nh ngha c nh ngha v s dng nhiu theo cng phng thc nh mng cc kiu xy dng sn. V d, hnh ng gic c th c nh ngha nh mng ca 5 im:
Point pentagon[5];
nh ngha ny gi s rng lp Point c mt hm xy dng khng i s (ngha l mt hm xy dng c th c triu gi khng cn i s). Hm xy dng c p dng ti mi phn t ca mng. Mng cng c th c khi to bng cch s dng b khi to mng thng thng. Mi mc trong danh sch khi to c th triu gi hm xy dng vi cc i s mong mun. Khi b khi to c t mc hn kch thc mng, cc phn t cn li c khi to bi hm xy dng khng i s. V d,
Point pentagon[5] = { Point(10,20), Point(10,30), Point(20,30), Point(30,20) };
khi to bn phn t ca mng pentagon ti cc im c th, v phn t sau cng c khi to ti (0,0). Khi hm xy dng c th c triu gi vi mt i s n, n va c t i s. V d,
Set sets[4] = {10, 20, 20, 30};
Chng 7: Lp
110
Sau cng, khi mng c xa bng cch s dng ton t delete th mt cp du ngoc vung ([]) nn c chn vo:
delete [] pentagon; // thu hi tt c cc phn t ca mng
Nu khng s dng cp [] c chn vo th ton t delete s khng c cch no bit rng pentagon biu th mt mng cc im ch khng phi l mt mng n. Hm hy (nu c) c ng dng ti cc phn t ca mng theo th t ngc li trc khi mng c xa. Vic loi b cp [] s lm cho hm hy c p dng ch ti phn t u tin ca mng.
delete pentagon; // thu hi ch phn t u tin!
V cc i tng ca mng ng khng th c khi to r rng thi im to ra, lp phi c mt hm xy dng khng i s iu khin vic khi to khng tng minh. Khi vic khi to khng tng minh ny khng thng tin th sau lp trnh vin c th khi to li c th cho tng phn t ca mng:
pentagon[0].Point(10, 20); pentagon[1].Point(10, 30); //...
Mng cc i tng ng c s dng trong cc tnh hung m chng ta khng th bit trc kch thc ca mng. V d, mt lp a gic tng qut khng c cch no bit c mt hnh a gic c chnh xc bao nhiu nh:
class Polygon { public: //... private: Point *vertices; // cc nh int nVertices; // s cc nh };
7.16.Phm vi lp
Mt lp m u phm vi lp rt ging vi cch mt hm (hay khi) m u mt phm vi cc b. Tt c cc thnh vin ca lp ph thuc vo phm vi lp v n i cc thc th vi cc tn ging ht trong phm vi.V d, trong
int fork (void); class Process { int fork (void); //... }; // fork h thng
hm thnh vin fork n i hm h thng ton cc fork. Hm thnh vin c th tham kho ti hm h thng ton cc bng cch s dng ton t phm vi n hng:
int Process::fork (void)
Chng 7: Lp
111
{ }
Lp chnh n c th c nh ngha bt k mt trong ba phm vi c th: phm vi ton cc. iu ny dn ti mt lp ton cc bi v n c th c tham kho ti bi tt c phm vi khc. i a s cc lp C++ (k c tt c cc v d c trnh by n thi im ny) c nh ngha phm vi ton cc. phm vi lp ca lp khc. iu ny dn ti mt lp lng nhau trong lp c cha ng bi lp khc. phm vi cc b ca mt khi hay mt hm. iu ny dn n mt lp cc b trong lp c cha ng hon ton bi mt khi hoc mt hm.
nh ngha lp Point lng bn trong lp Rectangle. Cc hm thnh vin ca lp Point c th c nh ngha hoc ni tuyn (inline) bn trong lp Point hoc phm vi ton cc. Phm vi ton cc s i hi thm cc tn ca hm thnh vin bng cch t trc chng vi Rectangle::
Rectangle::Point::Point (int x, int y) { //... }
Mt lp lng nhau vn cn c th c truy xut bn ngoi lp bao bc ca n bng cch ch nh y tn lp. V d sau l hp l bt k phm vi no (gi s rng Point c to ra chung (public) bn trong Rectangle):
Rectangle::Point pt(1,1);
Lp cc b hu dng khi mt lp c s dng ch bi mt hm hm ton cc hay hm thnh vin hoc thm ch ch l mt khi. V d,
Chng 7: Lp
112
void Render (Image &image) { class ColorTable { public: ColorTable (void) AddEntry (int r, int g, int b) { /* ... */ } //... }; ColorTable colors; //...
{ /* ... */ }
nh ngha ColorTable nh l mt lp cc b ti Render. Khng ging nh cc lp lng nhau, mt lp cc b khng th truy xut bn ngoi phm vi n c nh ngha. V th hng sau l khng hp l phm vi ton cc:
ColorTable ct; // khng c nh ngha!
Mt lp cc b phi c nh ngha y bn trong phm vi m n xut hin. V th, tt c cc hm thnh vin ca n cn c nh ngha ni tuyn bn trong lp. iu ny ng rng mt phm vi cc b khng ph hp cho nh ngha bt c ci g ngoi tr cc lp tht l n gin.
7.17.Cu trc v hp
Cu trc (structure) l tt c cc thnh vin ca n c nh ngha mc nh l chung (public). (Nh rng tt c cc thnh vin ca lp c nh ngha mc nh l ring (private)). Cc cu trc c nh ngha bng cch s dng cng c php nh cc lp ngoi tr t kha struct c s dng thay v class. V d,
struct Point { Point(int, int); void OffsetPt(int, int); int x, y; };
ng ng vi:
class Point { public:
};
Cu trc struct c bt ngun t ngn ng C, n ch c th cha ng cc thnh vin d liu. N c gi li cho kh nng tng thch v sau. Trong C, mt cu trc c th c mt b khi to vi c php tng t nh l c php ca mt mng. C++ cho php cc b khi to nh th dnh cho cc
Chng 7: Lp
113
B khi to gm cc gi tr c gn cho cc thnh vin d liu ca cu trc (hoc lp) theo th t chng xut hin. Cc kiu khi to ny phn ln c thay th bng cc hm xy dng. V li, n khng th c s dng vi lp m c hm xy dng. Hp (union) l mt lp m tt c cc thnh vin d liu ca n c nh x ti cng a ch bn trong i tng ca n (hn l lin tip nh trong trng hp ca lp). V th kch thc i tng ca mt hp l kch thc thnh vin d liu ln nht ca n. Hp c s dng ch yu cho cc tnh hung m mt i tng c th chim ly cc gi tr ca cc kiu khc nhng ch mt gi tr mt thi im. V d, xem xt mt trnh thng dch cho mt ngn ng lp trnh n gin c gi l P h tr cho mt s kiu d liu nh l: s nguyn, s thc, chui, v danh sch. Mt gi tr trong ngn ng lp trnh ny c th c nh ngha kiu:
union Value { long integer; double real; char *string; Pair list; //... };
trong Pair chnh n l mt kiu ngi dng nh ngha cho vic to ra cc danh sch:
class Pair { Value Value //... }; *head; *tail;
Gi s rng kiu long l 4 byte, kiu double l 8 byte, v con tr l 4 byte, i tng thuc kiu Value c th chnh xc 8 byte, ngha l cng kch thc vi kiu double hay i tng kiu Pair (bng vi hai con tr). Mt i tng trong ngn ng P c th c biu din bi lp,
class Object { private: enum ObjType {intObj, realObj, strObj, listObj};
Chng 7: Lp
114
};
trong type cung cp cch thc ghi nhn kiu ca gi tr m i tng gi hin ti. V d, khi type c t ti strObj, val.string c s dng tham kho ti gi tr ca n. Bi v ch c mt cch duy nht m cc thnh vin d liu c nh x ti b nh nn mt hp khng th c thnh vin d liu tnh hay thnh vin d liu m yu cu mt hm xy dng. Ging nh cu trc, tt c cc thnh vin ca hp c nh ngha mc nh l chung (public). Cc t kha private, public, v protected c th c s dng bn trong struct hoc union chnh xc theo cng cch m chng c s dng bn trong mt lp nh ngha cc thnh vin ring, chung, v c bo v.
type
channel
moreData
Cc trng ny c th c biu din thnh cc thnh vin d liu trng bit ca mt lp Packet. Mt trng bit c th c nh ngha thuc kiu int hoc kiu unsigned int:
typedef unsigned int Bit; class Packet { Bit type : 2; // rng 2 bit Bit acknowledge: 1; // rng 1 bit Bit channel : 4; // rng 4 bit Bit sequenceNo : 4; // rng 4 bit
Chng 7: Lp
115
};
: 1;
// rng 1 bit
Mt trng bit c tham kho ging nh l tham kho ti bt k thnh vin d liu no khc. Bi v mt trng bit khng nht thit bt u trn mt bin ca byte nn vic ly a ch ca n l khng hp l. Vi l do ny, mt trng bit khng c nh ngha l tnh (static). S dng bng lit k c th d dng lm vic vi cc trng bit hn. V d, t bng lit k cho trc
enum PacketType {dataPack, controlPack, supervisoryPack}; enum Bool {false, true};
chng ta c th vit:
Bi tp cui chng 7
7.1 7.2 Gii thch ti sao cc tham s ca cc hm thnh vin Set c khai bo nh l cc tham chiu. nh ngha mt lp c tn l Complex biu din cc s phc. Mt s phc c hnh thc tng qut l a + bi, trong a l phn thc v b l phn o ( i thay cho o). Cc quy lut ton hc trn s phc nh sau: (a + bi) + (c + di) (a + bi) (c + di) (a + bi) * (c + di) = = = (a + c) + (b + d)i (a + c) (b + d)i (ac bd) + (bc + ad)i
nh ngha cc thao tc ny nh l cc hm thnh vin ca lp Complex. 7.3 nh ngha mt lp c tn l Menu s dng danh sch lin kt ca cc chui biu din menu vi nhiu chn la. S dng mt lp lng nhau tn l Option biu din tp hp cc phn t. nh ngha mt hm xy dng, hm hy, v cc hm thnh vin sau cho lp Menu: Insert chn mt chn la mi vo mt v tr cho trc. Cung cp mt i s mc nh sao cho mc chn c ni vo im cui. Delete xa mt chn la tn ti. Choose hin th menu v mi ngi dng chn mt chn la. nh ngha li lp Set nh l mt danh sch lin kt sao cho khng c gii hn v s lng cc phn t mt tp hp c th c. S dng mt lp lng nhau tn l Element biu din tp hp cc phn t.
7.4
Chng 7: Lp
116
7.5
nh ngha mt lp tn l Sequence lu tr cc chui c sp xp. nh ngha mt hm xy dng, mt hm hy, v cc hm thnh vin sau cho lp Sequence: Insert chn mt chui mi vo v tr sp xp ca n. Delete xa mt chui hin c. Find tm tun t vi mt chui cho trc v tr v true nu tm c v false nu khng tm c. Print in ra cc chui tun t. nh ngha lp tn l BinTree lu tr cc chui c sp xp nh l mt cy nh phn. nh ngha cng tp cc hm thnh vin nh i vi lp Sequence bi tp trc. nh ngha mt hm thnh vin cho lp BinTree chuyn mt chui thnh cy nh phn nh l bn ca lp Sequence. S dng hm ny nh ngha mt hm xy dng cho lp BinTree nhn mt chui lm i s. Thm mt thnh vin d liu ID l s nguyn vo lp Menu (Bi tp 7.3) sao cho tt c cc i tng menu c nh s tun t bt u t 0. nh ngha mt hm thnh vin ni tuyn tr v s ID. Bn s theo di ID cui cng c cp pht nh th no? Sa i lp Menu sao cho chn la chnh n c th l mt menu, bng cch y cho php cc menu lng nhau.
7.6
7.7
7.8
7.9
Chng 7: Lp
117
Chng 8. Ti nh ngha
Chng ny tho lun v ti nh ngha hm v ton t trong C++. Thut ng ti nh ngha (overloading) ngha l cung cp nhiu nh ngha. Ti nh ngha hm lin quan n vic nh ngha cc hm ring bit chia s cng tn, mi hm c mt du hiu duy nht. Ti nh ngha hm thch hp cho: nh ngha cc hm v bn cht l lm cng cng vic nhng thao tc trn cc kiu d liu khc nhau. Cung cp cc giao din ti cng hm.
Ti nh ngha hm (function overloading) l mt tin li trong lp trnh. Ging nh cc hm, cc ton t nhn cc ton hng (cc i s) v tr v mt gi tr. Phn ln cc ton t C++ c sn c ti nh ngha ri. V d, ton t + c th c s dng cng hai s nguyn, hai s thc, hoc hai a ch. V th, n c nhiu nh ngha khc nhau. Cc nh ngha xy dng sn cho cc ton t c gii hn trn nhng kiu c sn. Cc nh ngha thm vo c th c cung cp bi cc lp trnh vin sao cho chng cng c th thao tc trn cc kiu ngi dng nh ngha. Mi nh ngha thm vo c ci t bi mt hm. Ti nh ngha cc ton t s c minh ha bng cch s dng mt s lp n gin. Chng ta s tho lun cc qui lut chuyn kiu c th c s dng nh th no rt gn nhu cu cho nhiu ti nh ngha ca cng ton t. Chng ta s trnh by cc v d ca ti nh ngha mt s ton t ph bin gm << v >> cho xut nhp, [] v () cho cc lp cha, v cc ton t con tr. Chng ta cng s tho lun vic khi to v gn t ng, tm quan trng ca vic ci t chnh xc chng trong cc lp s dng cc thnh vin d liu c cp pht ng. Khng ging nh cc hm v cc ton t, cc lp khng th c ti nh ngha; mi lp phi c mt tn duy nht. Tuy nhin, nh chng ta s thy trong chng 8, cc lp c th c sa i v m rng thng qua kh nng tha k (inheritance).
Chng 8: Ti nh ngha
122
8.1. Ti nh ngha hm
Xem xt mt hm, GetTime, tr v thi gian hin ti ca ngy theo cc tham s ca n, v gi s rng cn c hai bin th ca hm ny: mt tr v thi gian theo giy tnh t na m, v mt tr v thi gian theo gi, pht, giy. R rng cc hm ny phc v cng mc ch nn khng c l do g li cho chng c nhng ci tn khc nhau. C++ cho php cc hm c ti nh ngha, ngha l cng hm c th c hn mt nh ngha:
long GetTime (void); // s giy tnh t na m void GetTime (int &hours, int &minutes, int &seconds);
Khi hm GetTime c gi, trnh bin dch so snh s lng v kiu cc i s trong li gi vi cc nh ngha ca hm GetTime v chn mt ci khp vi li gi. V d:
int h, m, s; long t = GetTime(); GetTime(h, m, s); // khp vi GetTime(void) // khp vi GetTime(int&, int&, int&);
trnh nhm ln th mi nh ngha ca mt hm c ti nh ngha phi c mt du hiu duy nht. Cc hm thnh vin ca mt lp cng c th c ti nh ngha:
class Time { //... long GetTime (void); // s giy tnh t na m void GetTime (int &hours, int &minutes, int &seconds); };
Ti nh ngha hm gip ta thu c nhiu phin bn a dng ca hm m khng th c c bng cch s dng n c cc i s mc nh. Cc hm c ti nh ngha cng c th c cc i s mc nh:
void Error (int errCode, char *errMsg = ""); void Error (char *errMsg);
Chng 8: Ti nh ngha
123
Point operator + (Point &p) {return Point(x + p.x,y + p.y);} Point operator - (Point &p) {return Point(x - p.x,y - p.y);} private: int x, y; };
Vic ti nh ngha cc ton t + v nh trn s dng cc hm thnh vin. Mt kh nng khc l mt ton t c th c ti nh ngha ton cc:
class Point { public: Point (int x, int y) {Point::x = x; Point::y = y;} friend Point operator + (Point &p, Point &q) {return Point(p.x + q.x,p.y + q.y);} friend Point operator - (Point &p, Point &q) {return Point(p.x - q.x,p.y - q.y);} private: int x, y; };
Thng thng, nh ngha mt ton t xc nh trc th chng ta nh ngha mt hm tn operator . Nu l mt ton t nh hng:
operator phi nhn chnh xc mt i s nu c nh ngha nh mt thnh vin ca lp, hoc hai i s nu c nh ngha ton cc.
operator phi nhn khng i s nu c nh ngha nh mt thnh vin ca lp, hoc mt i s nu c nh ngha ton cc.
Chng 8: Ti nh ngha
124
Bng 8.1
Cc ton t c th ti nh ngha.
n hng
+ new + = ==
* delete * += -= != <
! / /= >
~ % %= <=
++ | |= & &
-^ ^= ||
() << << = []
->*
Nh hng
Ton t n hng (v d ~) khng th c ti nh ngha nh nh hng hoc ton t nh hng (v d =) khng th c ti nh ngha nh ton t n hng. C++ khng h tr nh ngha ton t new bi v iu ny c th dn n s m h. Hn na, lut u tin cho cc ton t xc nh trc c nh v khng th c sa i. V d, d cho bn ti nh ngha ton t * nh th no th n s lun c u tin cao hn ton t +. Cc ton t ++ v - c th c ti nh ngha nh l tin t cng nh l hu t. Cc lut tng ng khng c p dng cho cc ton t ti nh ngha. V d, ti nh ngha + khng nh hng ti += tr phi ton t += cng c ti nh ngha r rng. Cc ton t ->, =, [], v () ch c th c ti nh ngha nh cc hm thnh vin, v khng nh ton cc. trnh sao chp cc i tng ln khi truyn chng ti cc ton t ti nh ngha th cc tham chiu nn c s dng. Cc con tr th khng thch hp cho mc ch ny bi v mt ton t c ti nh ngha khng th thao tc ton b trn con tr.
V d: Cc ton t trn tp hp
Lp Set c gii thiu trong chng 6. Phn ln cc hm thnh vin ca Set c nh ngha nh l cc ton t ti nh ngha tt hn. Danh sch 8.1 minh ha.
Chng 8: Ti nh ngha
125
Danh sch 8.1 1 #include <iostream.h> 2 const maxCard = 100; 3 enum Bool {false, true}; 4 class Set { 5 public: 6 Set(void) { card = 0; } 7 friend Bool operator & (const int, Set&); 8 friend Bool operator == (Set&, Set&); 9 friend Bool operator != (Set&, Set&); 10 friend Set operator * (Set&, Set&); 11 friend Set operator + (Set&, Set&); 12 //... 13 void AddElem(const int elem); 14 void Copy (Set &set); 15 void Print (void); 16 private: 17 int elems[maxCard]; 18 int card; 19 };
y, chng ta phi quyt nh nh ngha cc hm thnh vin ton t nh l bn ton cc. Chng c th c nh ngha mt cch d dng nh l hm thnh vin. Vic thi cng cc hm ny l nh sau.
Bool operator & (const int elem, Set &set) { for (register i = 0; i < set.card; ++i) if (elem == set.elems[i]) return true; return false; } Bool operator == (Set &set1, Set &set2) { if (set1.card != set2.card) return false; for (register i = 0; i < set1.card; ++i) if (!(set1.elems[i] & set2)) // s dng & ti nh ngha return false; return true; } Bool operator != (Set &set1, Set &set2) { return !(set1 == set2); // s dng == ti nh ngha } Set operator * (Set &set1, Set &set2) { Set res; for (register i = 0; i < set1.card; ++i) if (set1.elems[i] & set2) // s dng & ti nh ngha res.elems[res.card++] = set1.elems[i];
Chng 8: Ti nh ngha
126
return res;
Set operator + (Set &set1, Set &set2) { Set res; set1.Copy(res); for (register i = 0; i < set2.card; ++i) res.AddElem(set2.elems[i]); return res;
C php s dng cc ton t ny ngn gn hn c php ca cc hm m chng thay th nh c minh ha bi hm main sau:
int main (void) { Set s1, s2, s3; s1.AddElem(10); s1.AddElem(20); s1.AddElem(30); s1.AddElem(40); s2.AddElem(30); s2.AddElem(50); s2.AddElem(10); s2.AddElem(60); cout << "s1 = "; cout << "s2 = "; s1.Print(); s2.Print();
if (20 & s1) cout << "20 thuoc s1\n"; cout << "s1 giao s2 = "; cout << "s1 hop s2 = "; (s1 * s2).Print(); (s1 + s2).Print();
ton hng u ca & (ngha l 'a') c chuyn kiu n t char sang int, bi v ton t & ti nh ngha mong i ton hng u ca n thuc kiu int.
Chng 8: Ti nh ngha
127
Bt k s chuyn kiu no khc thm vo phi c nh ngha bi lp trnh vin. V d, gi s chng ta mun ti nh ngha ton t + cho kiu Point sao cho n c th c s dng cng hai im hoc cng mt s nguyn ti c hai ta ca mt im:
class Point //... friend Point operator + (Point, Point); friend Point operator + (int, Point); friend Point operator + (Point, int); };
lm cho ton t + c tnh giao hon, chng ta phi nh ngha hai hm cng mt s nguyn vi mt im: mt hm i vi trng hp s nguyn l ton hng u tin v mt hm i vi trng hp s nguyn l ton hng th hai. Quan st rng nu chng ta bt u xem xt cc kiu khc thm vo kiu int th tip cn ny dn n mc bin i kh kim sot ca ton t. Mt tip cn tt hn l s dng hm xy dng chuyn i tng ti cng kiu nh chnh lp sao cho mt ton t ti nh ngha c th iu khin cng vic. Trong trng hp ny, chng ta cn mt hm xy dng nhn mt int c t c hai ta ca mt im:
class Point { //... Point (int x) { Point::x = Point::y = x; } friend Point operator + (Point, Point); };
V th c th vit cc biu thc lin quan n cc bin hoc hng thuc kiu Point v int bng cch s dng ton t +.
Point p(10,20), q = 0; q = p + 5; // tng ng vi: q = p + Point(5);
y, 5 c chuyn tm thi thnh i tng Point v sau c cng vo p. i tng tm sau s c hy i. Tc ng ton b l mt chuyn kiu khng tng minh t int thnh Point. V th gi tr cui ca q l (15,25). Ci g xy ra nu chng ta mun thc hin chuyn kiu ngc li t kiu lp thnh mt kiu khc? Trong trng hp ny cc hm xy dng khng th c s dng bi v chng lun tr v mt i tng ca lp m chng thuc v. thay th, mt lp c th nh ngha mt hm thnh vin m chuyn r rng mt i tng thnh mt kiu mong mun.
Chng 8: Ti nh ngha
128
V d, vi lp Rectangle cho chng ta c th nh ngha mt hm chuyn kiu thc hin chuyn mt hnh ch nht thnh mt im bng cch ti nh ngha ton t kiu Point trong lp Rectangle:
class Rectangle { public: Rectangle (int left, int top, int right, int bottom); Rectangle (Point &p, Point &q); //... operator Point () {return botRight - topLeft;} private: Point topLeft; Point botRight; };
Ton t ny c nh ngha chuyn mt hnh ch nht thnh mt im m ta ca n tiu biu cho rng v chiu cao ca hnh ch nht. V th, trong on m
Point p(5,5); Rectangle r(10,10,20,30); r + p;
trc ht hnh ch nht r c chuyn khng tng minh thnh mt i tng Point bi ton t chuyn kiu v sau c cng vo p. Chuyn kiu Point cng c th c p dng tng minh bng cch s dng k hiu p kiu thng thng. V d:
Point(r); (Point)r; // p kiu tng minh thnh Point // p kiu tng minh thnh Point
Thng thng vi kiu ngi dng nh ngha X cho v kiu Y khc (c sn hay ngi dng nh ngha) th: Hm xy dng c nh ngha cho X nhn mt i s n kiu Y s chuyn khng tng minh cc i tng Y thnh cc i tng X khi c cn. Ti nh ngha ton t Y trong X s chuyn khng tng minh cc i tng X thnh cc i tng Y khi c cn.
class X { //... X (Y&); operator Y (); };
Mt trong nhng bt li ca cc phng thc chuyn kiu do ngi dng nh ngha l nu chng khng c s dng mt cch hn ch th chng c th lm cho cc hot ng ca chng trnh l kh c th tin on. Cng c s ri ro thm vo ca vic to ra s m h. S m h xy ra khi trnh bin
Chng 8: Ti nh ngha
129
dch c hn mt chn la cho n p dng cc qui lut chuyn kiu ngi dng nh ngha v v th khng th chn c. Tt c nhng trng hp nh th c bo co nh nhng li bi trnh bin dch. minh ha cho cc m h c th xy ra, gi s rng chng ta cng nh ngha mt hm chuyn kiu cho lp Rectangle (nhn mt i s Point) cng nh l ti nh ngha cc ton t + v -:
class Rectangle { public: Rectangle (int left, int top, int right, int bottom); Rectangle (Point &p, Point &q); Rectangle (Point &p); operator Point () {return botRight - topLeft;} friend Rectangle operator + (Rectangle &r, Rectangle &t); friend Rectangle operator - (Rectangle &r, Rectangle &t); private: Point topLeft; Point botRight; };
By gi, trong
Point p(5,5); Rectangle r(10,10,20,30); r + p;
hoc l:
Point(r) + p // cho ra mt Point
Nu lp trnh vin khng gii quyt s m h bi vic chuyn kiu tng minh th trnh bin dch s t chi.
V d: Lp S Nh Phn
Danh sch 8.2 nh ngha mt lp tiu biu cho cc s nguyn nh phn nh l mt chui cc k t 0 v 1.
Chng 8: Ti nh ngha
130
Danh sch 8.2 1 #include <iostream.h> 2 #include <string.h> 3 int const binSize = 16; // chieu dai so nhi phan la 16
4 class Binary { 5 public: 6 Binary (const char*); 7 Binary (unsigned int); 8 friend Binary operator + (const Binary, const Binary); 9 operator int (); // chuyen kieu 10 void Print (void); 11 private: 12 char bits[binSize]; // cac bit nhi phan 13 }; Ch gii
Hm xy dng ny cung cp mt s nh phn t mu bit ca n. Hm xy dng ny chuyn mt s nguyn dng thnh biu din nh phn tng ng ca n. 8 Ton t + c ti nh ngha cng hai s nh phn. Php cng c lm tng bit mt. n gin th nhng li trn c b qua. 9 Ton t chuyn kiu ny c s dng chuyn mt i tng Binary thnh i tng int . 10 Hm ny n gin ch in mu bit ca s nh phn. 12 Mng ny c s dng gi cc bit 0 v 1 ca s lng 1 bit nh l cc k t. Ci t cc hm ny l nh sau:
Binary::Binary (const char *num) { int iSrc = strlen(num) - 1; int iDest = binSize - 1; while (iSrc >= 0 && iDest >= 0) // sao chep cac bit bits[iDest--] = (num[iSrc--] == '0' ? '0' : '1'); while (iDest >= 0) // dat cac bit trai ve 0 bits[iDest--] = '0';
6 7
Binary::Binary (unsigned int num) { for (register i = binSize - 1; i >= 0; --i) { bits[i] = (num % 2 == 0 ? '0' : '1'); num >>= 1; } } Binary operator + (const Binary n1, const Binary n2) { unsigned carry = 0;
Chng 8: Ti nh ngha
131
unsigned value; Binary res = "0"; for (register i = binSize - 1; i >= 0; --i) { value = (n1.bits[i] == '0' ? 0 : 1) + (n2.bits[i] == '0' ? 0 : 1) + carry; res.bits[i] = (value % 2 == 0 ? '0' : '1'); carry = value >> 1; } return res;
Binary::operator int () { unsigned value = 0; for (register i = 0; i < binSize; ++i) value = (value << 1) + (bits[i] == '0' ? 0 : 1); return value;
void Binary::Print (void) { char str[binSize + 1]; strncpy(str, bits, binSize); str[binSize] = '\0'; cout << str << '\n'; }
Hai hng cui ca hm main ng x hon ton khc nhau. Hng u ca hai hng ny chuyn 5 thnh Binary, thc hin cng, v sau chuyn kt qu Binary thnh int trc khi gi n n dng xut cout. iu ny tng ng vi:
cout << (int) Binary::operator+(n2,Binary(5)) << '\n';
Hng th hai trong hai hng ny chuyn n1 thnh int (bi v ton t - khng c nh ngha cho Binary), thc hin tr, v sau gi kt qu n dng xut cout. iu ny tng ng vi:
cout << ((int) n2) - 5 << '\n';
Chng 8: Ti nh ngha
132
Trong trng hp ny th ton t chuyn kiu c p dng khng tng minh. Kt qu cho bi chng trnh l bng chng cho cc chuyn kiu c thc hin chnh xc:
0000000000001011 0000000000011010 0000000000100101 16 6
Tham s u phi l mt tham chiu ti dng xut ostream sao cho c nhiu s dng ca << c th ni vo nhau. Tham s th hai khng cn l mt tham chiu nhng iu ny li hiu qu cho cc i tng c kch thc ln. V d, thay v hm thnh vin Print ca lp Binary chng ta c th ti nh ngha ton t << cho lp. Bi v ton hng u ca ton t << phi l mt i tng ostream nn n khng th c ti nh ngha nh l mt hm thnh vin. V th n c nh ngha nh l hm ton cc:
class Binary { //... friend };
ostream& operator << (ostream &os, Binary &n) { char str[binSize + 1]; strncpy(str, n.bits, binSize); str[binSize] = '\0'; cout << str; return os; }
T nh ngha cho, << c th c nh ngha cho xut cc s nh phn theo cch ging nh cc kiu c sn. V d:
Binary n1 = "01011", n2 = "11010"; cout << n1 << " + " << n2 << " = " << n1 + n2 << '\n';
s cho ra kt qu sau:
0000000000001011 + 0000000000011010 = 0000000000100101
Chng 8: Ti nh ngha
133
Vi cch thc n gin, kiu xut ny loi b i gnh nng ca vic nh tn hm xut i vi mi kiu ngi dng nh ngha. Trong trng hp khng s dng ti nh ngha << th v d cui c th c vit nh sau: (gi s rng \n c xa t hm Print):
Binary n1 = "01011", n2 = "11010"; n1.Print(); cout << " + "; n2.Print(); cout << " = "; (n1 + n2).Print(); cout << '\n';
Tham s u tin phi l mt tham chiu ti dng nhp istream sao cho s dng nhiu >> c th c ni vo nhau. Tham s th hai phi l mt tham chiu v n s c sa i bi hm. Tip theo lp Binary chng ta ti nh ngha ton t >> nhp vo mt chui cc bit. Nhc li, bi v ton hng u tin ca ton t >> phi l mt i tng istream nn n khng th c ti nh ngha nh l mt hm thnh vin:
class Binary { //... friend };
istream& operator >> (istream &is, Binary &n) { char str[binSize + 1]; cin >> str; n = Binary(str); // use the constructor for simplicity return is; }
Vi nh ngha cho ny th ton t >> c th c s dng nhp vo cc s nh phn theo cch ca cc kiu d liu c sn. V d,
Binary n; cin >> n;
s c mt s nh phn t bn phm ti n.
Chng 8: Ti nh ngha
134
8.6. Ti nh ngha []
Danh sch 8.3 nh ngha mt lp vect kt hp n gin. Mt vect kt hp l mt mng mt chiu m cc phn t c th c tm kim bng ni dung ca chng hn l v tr ca chng trong mng. Trong AssocVec th mi phn t c mt tn dng chui (thng qua n c th c tm kim) v mt gi tr s nguyn kt hp.
Danh sch 8.3 1 #include <iostream.h> 2 #include <string.h> 3 class AssocVec { 4 public: 5 AssocVec (const int dim); 6 ~AssocVec (void); 7 int& operator [] (const char *idx); 8 private: 9 struct VecElem { 10 char *index; 11 int value; 12 } *elems; // cac phan tu cua vecto 13 int dim; // kich thuoc cua vecto 14 int used; // cac phan tu duoc su dung toi hien tai 15 }; Ch gii
Hm xy dng to ra mt vect kt hp c kch c c ch nh bi tham s ca n. 7 Ton t [] ti nh ngha c s dng truy xut cc phn t ca vect. Hm ti nh ngha [] phi c chnh xc mt tham s. Vi mt chui cho n tm kim phn t tng ng cha trong vect. Nu mt vic so khp ch s c tm thy th sau mt tham chiu ti gi tr kt hp vi n c tr v. Ngc li, mt phn t mi c to ra v mt tham chiu ti gi tr ny c tr v. 12 Cc phn t vect c biu din bi mt mng ng ca cc cu trc VecElem. Mi phn t ca vect gm mt chui (c biu th bi index) v mt gi tr s nguyn (c biu th bi value). Thi cng ca cc hm ny nh sau:
AssocVec::AssocVec (const int dim) { AssocVec::dim = dim; used = 0; elems = new VecElem[dim]; } AssocVec::~AssocVec (void) {
Chng 8: Ti nh ngha
135
int& AssocVec::operator [] (const char *idx) { for (register i = 0; i < used; ++i) // tim phan tu ton tai if (strcmp(idx,elems[i].index) == 0) return elems[i].value; if (used < dim && // tao ra phan tu moi (elems[used].index = new char[strlen(idx)+1]) != 0) { strcpy(elems[used].index,idx); elems[used].value = used + 1; return elems[used++].value; } static int dummy = 0; return dummy;
Ch rng bi v AssocVec::operator[] phi tr v mt tham chiu hp l, mt tham chiu ti mt s nguyn tnh gi c tr v khi vect y hay ton t new tht bi. Mt biu thc tham chiu l mt gi tr tri v v th c th xut hin trn c hai pha ca mt php gn. Nu mt hm tr v mt tham chiu sau mt li gi hm ti hm c th c gn ti. iu ny l ti sao kiu tr v ca AssocVec::operator[] c nh ngha l mt tham chiu. S dng AssocVec chng ta by gi c th to ra cc vect kt hp m x l rt ging cc vect bnh thng:
AssocVec count(5); count["apple"] = 5; count["orange"] = 10; count["fruit"] = count["apple"] + count["orange"];
iu ny s t count["fruit"] ti 15.
8.7. Ti nh ngha ()
Danh sch 8.4 nh ngha mt lp ma trn. Mt ma trn l mt bng cc gi tr (mng hai chiu) m kch thc ca n c biu th bi s hng v s ct trong bng. Mt v d ca ma trn n gin 2 x 3 s l:
M= 10 20 30 21 52 19
Chng 8: Ti nh ngha
136
K hiu ton hc chun tham kho cc phn t ca ma trn l cc du ngoc. V d phn t 20 ca ma trn M (ngha l trong hng u v ct th hai) c tham kho ti nh l M(1,2). i s hc ca ma trn cung cp mt tp cc thao tc ci t ma trn bao gm cng, tr, nhn, v chia.
Danh sch 8.4 1 #include <iostream.h>
2 class Matrix { public: 3 Matrix (const short rows, const short cols); 4 ~Matrix (void) {delete elems;} 5 double& operator () (const short row, const short col); 6 friend ostream& operator << (ostream&, Matrix&); 7 friend Matrix operator + (Matrix&, Matrix&); 8 friend Matrix operator - (Matrix&, Matrix&); 9 friend Matrix operator * (Matrix&, Matrix&); 10 11 12 13 14 15 };
Ch gii
private: const short rows; // s hng ca ma trn const short cols; // s ct ca ma trn double *elems; // cc phn t ca ma trn
Hm xy dng to ra mt ma trn c kch c c ch nh bi cc tham s ca n, tt c cc phn t ca n c khi to l 0. 6 Ton t() ti nh ngha c s dng truy xut cc phn t ca ma trn. Hm ti nh ngha ton t () c th khng c hay c nhiu tham s. N tr v mt tham chiu ti gi tr ca phn t c ch nh. 7 Ton t << ti nh ngha c s dng in mt ma trn theo hnh thc bng. 8-10 Cc ton t ti nh ngha ny cung cp cc thao tc trn ma trn. 14 Cc phn t ca ma trn c biu din bi mt mng ng kiu double. Vic ci t ca ba hm u tin nh sau:
Matrix::Matrix (const short r, const short c) : rows(r), cols(c) { elems = new double[rows * cols]; } double& Matrix::operator () (const short row, const short col) { static double dummy = 0.0; return (row >= 1 && row <= rows && col >= 1 && col <= cols) ? elems[(row - 1)*cols + (col - 1)] : dummy; } ostream& operator << (ostream &os, Matrix &m) {
Chng 8: Ti nh ngha
137
for (register r = 1; r <= m.rows; ++r) { for (int c = 1; c <= m.cols; ++c) os << m(r,c) << " "; os << '\n'; } return os;
Nh trc bi v Matrix::operator() phi tr v mt tham chiu hp l, mt tham chiu ti mt s thc double tnh gi c tr v khi phn t c ch nh khng tn ti. on m sau minh ha rng cc phn t ca ma trn l cc gi tr tri:
Matrix m(2,3); m(1,1) = 10; m(2,1) = 15; cout << m << '\n'; m(1,2) = 20; m(2,2) = 25; m(1,3) = 30; m(2,3) = 35;
iu ny s cho kt qu sau:
10 15 20 30 25 35
Hm sau tr v mt i tng Matrix c khi to ti m. Vic khi to c iu khin bi mt hm xy dng bn trong do trnh bin dch t ng pht ra cho lp Matrix:
Matrix::Matrix (const Matrix &m) : rows(m.rows), cols(m.cols) { elems = m.elems; }
Hnh thc khi to ny c gi l khi to ngm nh bi v hm xy dng c bit khi to tng thnh vin mt ca i tng. Nu chnh cc thnh vin d liu ca i tng ang c khi to li l cc i tng ca lp khc th sau chng cng c khi to ngm nh.
Chng 8: Ti nh ngha
138
Kt qu ca vic khi to ngm nh l cc thnh vin d liu elems ca c hai i tng s tr ti cng khi c cp pht ng. Tuy nhin m c hy nh vo tr v ca hm. Do cc hm hy xa i khi c tr ti bi m.elems b li thnh vin d liu ca i tng tr v ang tr ti mt khi khng hp l! Cui cng iu ny dn n mt tht bi trong khi thc thi chng trnh. Hnh 8.2 minh ha.
Hnh 8.2 Li ca vic khi to ngm nh
sao chp ngm nh ca m c to A memberwise copy of m is made Matrix m sau khi m b hy After m is destroyed
Dynamic Block
Invalid Block
Khi to ngm nh xy ra trong cc tnh hung sau: Khi nh ngha v khi to mt i tng trong mt cu lnh khai bo m s dng i tng khc nh l b khi to ca n, v d lnh khi to Matrix n = m trong hm Foo bn di. Khi truyn mt i s l i tng n mt hm (khng c th dng c i s con tr hay tham chiu), v d m trong hm Foo bn di. Khi tr v mt gi tr i tng t mt hm (khng c th dng c i s con tr hay tham chiu), v d return n trong hm Foo bn di.
Matrix Foo (Matrix m) // sao chp ngm nh ti m { Matrix n = m; // sao chp ngm nh ti n //... return n; // sao chp ngm nh n v tr v sao chp }
R rng vic khi to ngm nh l thch hp cho cc lp khng c cc thnh vin d liu con tr (v d, lp Point). Cc vn gy ra bi khi to ngm nh ca cc lp khc c th c trnh bng cch nh ngha cc hm xy dng ph trch cng vic khi to ngm nh mt cch r rng. Hm xy dng ny cn c gi l hm xy dng sao chp. i vi bt k lp X cho th hm xy dng sao chp lun c hnh thc:
X::X (const X&);
Chng 8: Ti nh ngha
139
};
Matrix::Matrix (const Matrix &m) : rows(m.rows), cols(m.cols) { int n = rows * cols; elems = new double[n]; // cng kch thc for (register i = 0; i < n; ++i) // sao chp cc phn t elems[i] = m.elems[i]; }
8.9. Gn ngm nh
Cc i tng thuc cng lp c gn ti mt lp khc bi mt ti nh ngha ton t gn bn trong m c pht ra t ng bi trnh bin dch. V d iu khin php gn trong
Matrix m(2,2), n(2,2); //... m = n;
iu ny ging y ht nh trong vic khi to ngm nh v c gi l gn ngm nh. N cng c cng vn nh trong khi to ngm nh v c th khc phc bng cch ti nh ngha ton t = mt cch r rng. V d i vi lp Matrix th vic ti nh ngha ton t = sau y l thch hp:
Matrix& Matrix::operator = (const Matrix &m) { if (rows == m.rows && cols == m.cols) { // phi khp int n = rows * cols; for (register i = 0; i < n; ++i) // sao chp cc phn t elems[i] = m.elems[i]; } return *this; }
Chng 8: Ti nh ngha
140
};
Tn kiu size_t c nh ngha trong stddef.h.. Ton t new s lun tr v void*. Tham s ca new l kch thc ca khi c cp pht (tnh theo byte). i s tng ng lun c truyn mt cch t ng ti trnh bin dch. Tham s u ca ton t delete l khi c xa. Tham s hai (ty chn) l
Chng 8: Ti nh ngha
141
kch thc khi cp pht. Cc i s c truyn mt cch t ng ti trnh bin dch. V cc khi, freeList v used l tnh nn chng khng nh hng n kch thc ca i tng Point. Nhng khi ny c khi to nh sau:
Point::Block *Point::blocks = new Block[maxPoints]; Point::Block *Point::freeList = 0; int Point::used = 0;
Ton t new nhn khi c sn k tip t blocks v tr v a ch ca n. Ton t delete gii phng mt khi bng cch chn n trc danh sch lin kt c biu din bi freeList. Khi used t ti maxPoints, new tr v 0 khi danh sch lin kt l rng, ngc li new tr v khi u tin trong danh sch lin kt.
void* Point::operator new (size_t bytes) { Block *res = freeList; return used < maxPoints ? &(blocks[used++]) : (res == 0 ? 0 : (freeList = freeList->next, res)); } void Point::operator delete (void *ptr, size_t bytes) { ((Block*) ptr)->next = freeList; freeList = (Block*) ptr; }
Point::operator new v Point::operator delete c triu gi ch cho cc i tng Point. Li gi new vi bt k i s kiu khc s triu gi nh ngha ton cc ca new, thm ch nu li gi xy ra bn trong mt hm thnh vin ca Point. V d:
Point *pt = new Point(1,1); char *str = new char[10]; delete pt; delete str; // gi Point::operator new // gi ::operator new // gi Point::operator delete // gi ::operator delete
Khi new v delete c ti nh ngha cho mt lp, new v delete ton cc cng c th c s dng khi to v hy mng cc i tng:
Point *points = new Point[5]; //... delete [] points; // gi ::operator new // gi ::operator delete
Ton t new c triu gi trc khi i tng c xy dng trong khi ton t delete c gi sau khi i tng c hy.
Chng 8: Ti nh ngha
142
8.11.Ti nh ngha ++ v -Cc ton t tng v gim mt cng c th c ti nh ngha theo c hai hnh thc tin t v hu t. phn bit gia hai hnh thc ny th phin bn hu t c c t nhn mt i s nguyn ph. V d, cc phin bn tin t v hu t ca ton t ++ c th c ti nh ngha cho lp Binary nh sau:
class Binary { //... friend friend };
Binary Binary
operator ++ operator ++
// tien to // hau to
Mc d chng ta phi chn nh ngha cc phin bn ny nh l cc hm bn ton cc nhng chng cng c th c nh ngha nh l cc hm thnh vin. C hai c nh ngha d dng theo thut ng ca ton t + c nh ngha trc :
Binary operator ++ (Binary &n) { return n = n + Binary(1); } Binary operator ++ (Binary &n, int) { Binary m = n; n = n + Binary(1); return m; } // tien to
// hau to
Ch rng chng ta n gin pht l tham s ph ca phin bn hu t. Khi ton t ny c s dng th trnh bin dch t ng cung cp mt i s mc nh cho n. on m sau thc hin c hai phin bn ca ton t:
Binary n1 = "01011"; Binary n2 = "11010"; cout << ++n1 << '\n'; cout << n2++ << '\n'; cout << n2 << '\n';
N s cho kt qu sau:
0000000000001100 0000000000011010 0000000000011011
Chng 8: Ti nh ngha
143
Bi tp cui chng 8
8.1 8.2 Vit cc phin bn ti nh ngha ca hm Max so snh hai s nguyn, hai s thc, hoc hai chui, v tr v thnh phn ln hn. Ti nh ngha hai ton t sau cho lp Set: Ton t - cho hiu ca cc tp hp (v d, s - t cho mt tp hp gm cc phn t thuc s m khng thuc t). Ton t <= kim tra mt tp hp c cha trong mt tp hp khc hay khng (v d, s <= t l true nu tt c cc phn t thuc s cng thuc t). Ti nh ngha hai ton t sau y cho lp Binary: Ton t - cho hiu ca hai gi tr nh phn. n gin, gi s rng ton hng u tin lun ln hn ton hng th hai. Ton t [] ly ch s mt bit thng qua v tr ca n v tr v gi tr ca n nh l mt s nguyn 0 hoc 1. Cc ma trn tha c s dng trong mt s phng thc s (v d, phn tch phn t c hn). Mt ma trn tha l mt ma trn c i a s cc phn t ca n l 0. Trong thc t, cc ma trn tha c kch thc ln n 500 500 l bnh thng. Trn mt my s dng biu din 64 bit cho cc s thc, lu tr mt ma trn nh th nh mt mng s yu cu 2 megabytes lu tr. Mt biu din kinh t hn s ch cn ghi nhn cc phn t khc 0 cng vi cc v tr ca chng trong ma trn. nh ngha mt lp SparseMatrix s dng mt danh sch lin kt ghi nhn ch cc phn t khc 0, v ti nh ngha cc ton t +, -, v * cho n. Cng nh ngha mt hm xy dng khi to ngm nh v mt ton t khi to ngm nh cho lp. Hon tt vic ci t ca lp String. Ch rng hai phin bn ca hm xy dng ngm nh v ton t = ngm nh c i hi, mt cho khi to hoc gn ti mt chui bng cch s dng char*, v mt cho khi to hoc gn ngm nh. Ton t [] nn ch mc mt k t chui bng cch s dng v tr ca n. Ton t + cho php ni hai chui vo nhau.
class String { public: String String String ~String
8.3
8.4
8.5
String& operator =(const char*); String& operator =(const String&); char& operator [](const short); int Length(void) {return(len);} friend String operator +(const String&, const String&); friend ostream& operator << (ostream&, String&);
Chng 8: Ti nh ngha
144
};
private: char *chars; // cac ky tu chuoi short len; // chieu dai cua chuoi
8.6
Mt vct bit l mt vct vi cc phn t nh phn, ngha l mi phn t c gi tr hoc l 0 hoc l 1. Cc vct bit nh c biu din thun tin bng cc s nguyn khng du. V d, mt unsigned char c th bng mt vct bit 8 phn t. Cc vct bit ln hn c th c nh ngha nh mng ca cc vct bit nh hn. Hon tt s thi cng ca lp Bitvec, nh c nh ngha bn di. Nn cho php cc vct bit ca bt k kch thc c to ra v c thao tc bng cch s dng cc ton t kt hp.
enum Bool {false, true}; typedef unsigned char uchar; class BitVec { public:
BitVec (const short dim); BitVec (const char* bits); BitVec (const BitVec&); ~BitVec (void){ delete vec; } BitVec& operator = (const BitVec&); BitVec& operator &= (const BitVec&); BitVec& operator |= (const BitVec&); BitVec& operator ^= (const BitVec&); BitVec& operator <<= (const short); BitVec& operator >>= (const short); int operator [] (const short idx); void Set (const short idx); void Reset (const short idx); BitVec operator ~ (void); BitVec operator & (const BitVec&); BitVec operator | (const BitVec&); BitVec operator ^ (const BitVec&); BitVec operator << (const short n); BitVec operator >> (const short n); Bool operator == (const BitVec&); Bool operator != (const BitVec&);
friend ostream& operator << (ostream&, BitVec&); private: uchar *vec; short bytes; };
Chng 8: Ti nh ngha
145
Chng 9. Tha k
Trong thc t hu ht cc lp c th k tha t cc lp c trc m khng cn nh ngha li mi hon ton. V d xem xt mt lp c t tn l RecFile i din cho mt tp tin gm nhiu mu tin v mt lp khc c t tn l SortedRecFile i din cho mt tp tin gm nhiu mu tin c sp xp. Hai lp ny c th c nhiu im chung. V d, chng c th c cc thnh vin hm ging nhau nh l Insert, Delete, v Find, cng nh l thnh vin d liu ging nhau. SortedRecFile l mt phin bn c bit ca RecFile vi thuc tnh cc mu tin ca n c t chc theo th t c thm vo. V th hu ht cc hm thnh vin trong c hai lp l ging nhau trong khi mt vi hm m ph thuc vo yu t tp tin c sp xp th c th khc nhau. V d, hm Find c th l khc trong lp SortedRecFile bi v n c th nh vo yu t thun li l tp tin c sp thc hin tm kim nh phn thay v tm tuyn tnh nh hm Find ca lp RecFile. Vi cc thuc tnh c chia s ca hai lp ny th vic nh ngha chng mt cch c lp l rt di dng. R rng iu ny dn ti vic phi sao chp li m ng k. M khng ch mt thi gian lu hn vit n m cn kh c th c bo tr hn: mt thay i ti bt k thuc tnh chia s no c th phi c sa i ti c hai lp. Lp trnh hng i tng cung cp mt k thut thun li gi l tha k gii quyt vn ny. Vi tha k th mt lp c th tha k nhng thuc tnh ca mt lp c trc. Chng ta c th s dng tha k nh ngha nhng thay i ca mt lp m khng cn nh ngha li lp mi t u. Cc thuc tnh chia s ch c nh ngha mt ln v c s dng li khi cn. Trong C++ tha k c h tr bi cc lp dn xut (derived class). Lp dn xut th ging nh lp gc ngoi tr nh ngha ca n da trn mt hay nhiu lp c sn c gi l lp c s (base class). Lp dn xut c th chia s nhng thuc tnh chn (cc thnh vin hm hay cc thnh vin d liu) ca cc lp c s ca n nhng khng lm chuyn i nh ngha ca bt k lp c s no. Lp dn xut chnh n c th l lp c s ca mt lp dn xut khc. Quan h tha k gia cc lp ca mt chng trnh c gi l quan h cp bc lp (class hierarchy). Lp dn xut cng c gi l lp con (subclass) bi v n tr thnh cp thp hn ca lp c s trong quan h cp bc. Tng t mt lp c s c th c gi l lp cha (superclass) bi v t n c nhiu lp khc c th c dn xut.
Chng 9: Tha k
148
9.1. V d minh ha
Chng ta s nh ngha hai lp nhm mc ch minh ha mt s khi nim lp trnh trong cc phn sau ca chng ny. Hai lp c nh ngha trong Danh sch 9.1 v h tr vic to ra mt th mc cc i tc c nhn.
Danh sch 9.1 1 #include <iostream.h> 2 #include <string.h> 3 class Contact { 4 public: 5 Contact(const char *name, const char *address, const char *tel); 6 ~Contact (void); 7 const char*Name (void) const {return name;} 8 const char*Address(void) const {return address;} 9 const char*Tel(void) const {return tel;} 10 friend ostream& operator << (ostream&, Contact&); 11 private: 12 char *name; // ten doi tac 13 char *address; // dia chi doi tac 14 char *tel; // so dien thoai 15 }; 16 //------------------------------------------------------------------17 class ContactDir { 18 public: 19 ContactDir(const int maxSize); 20 ~ContactDir(void); 21 void Insert(const Contact&); 22 void Delete(const char *name); 23 Contact* Find(const char *name); 24 friend ostream& operator <<(ostream&, ContactDir&); 25 private: 26 int Lookup(const char *name); 27 Contact **contacts;// danh sach cac doi tac int dirSize; // kich thuoc thu muc hien tai 28 int maxSize; // kich thuoc thu muc toi da 29 };
Ch gii
Lp Contact lu gi cc chi tit ca mt i tc (ngha l, tn, a ch, v s in thoi). 18 Lp ContactDir cho php chng ta thm, xa, v tm kim mt danh sch cc i tc. 22 Hm Insert xen mt i tc mi vo th mc. iu ny s vit chng ln mt i tc tn ti (nu c) vi tn ging nhau. 23 Hm Delete xa mt i tc (nu c) m tn ca i tc trng vi tn cho.
Chng 9: Tha k
149
24 Hm Find tr v mt con tr ti mt i tc (nu c) m tn ca i tc khp vi tn cho. 27 Hm Lookup tr v ch s v tr ca mt i tc m tn ca i tc khp vi tn cho. Nu khng tn ti th sau hm Lookup tr v ch s ca v tr m ti m mt u vo nh th s c thm vo. Hm Lookup c nh ngha nh l ring (private) bi v n l mt hm ph c s dng bi cc hm Insert, Delete, v Find. Ci t ca hm thnh vin v hm bn nh sau:
Contact::Contact (const char *name, const char *address, const char *tel) { Contact::name = new char[strlen(name) + 1]; Contact::address = new char[strlen(address) + 1]; Contact::tel = new char[strlen(tel) + 1]; strcpy(Contact::name, name); strcpy(Contact::address, address); strcpy(Contact::tel, tel); } Contact::~Contact (void) { delete name; delete address; delete tel; } ostream& operator << (ostream &os, Contact &c) { os << "(" << c.name << " , " << c.address << " , " << c.tel << ")"; return os; } ContactDir::ContactDir (const int max) { typedef Contact *ContactPtr; dirSize = 0; maxSize = max; contacts = new ContactPtr[maxSize]; }; ContactDir::~ContactDir (void) { for (register i = 0; i < dirSize; ++i) delete contacts[i]; delete [] contacts; } void ContactDir::Insert (const Contact& c) { if (dirSize < maxSize) { int idx = Lookup(c.Name()); if (idx > 0 && strcmp(c.Name(), contacts[idx]->Name()) == 0) { delete contacts[idx];
Chng 9: Tha k
150
} else { for (register i = dirSize; i > idx; --i) // dich phai contacts[i] = contacts[i-1]; ++dirSize; } contacts[idx] = new Contact(c.Name(), c.Address(), c.Tel());
void ContactDir::Delete (const char *name) { int idx = Lookup(name); if (idx < dirSize) { delete contacts[idx]; --dirSize; for (register i = idx; i < dirSize; ++i) contacts[i] = contacts[i+1]; } }
// dich trai
Contact *ContactDir::Find (const char *name) { int idx = Lookup(name); return (idx < dirSize && strcmp(contacts[idx]->Name(), name) == 0) ? contacts[idx] : 0; } int ContactDir::Lookup (const char *name) { for (register i = 0; i < dirSize; ++i) if (strcmp(contacts[i]->Name(), name) == 0) return i; return dirSize; } ostream &operator << (ostream &os, ContactDir &c) { for (register i = 0; i < c.dirSize; ++i) os << *(c.contacts[i]) << '\n'; return os; }
Chng 9: Tha k
151
};
3 4 5 7
Phn u ca lp dn xut chn vo cc lp c s m n tha k. Mt du hai chm (:) phn bit gia hai phn. y, lp ContactDir c c t l lp c s m lp SmartDir c dn xut. T kha public pha trc lp ContactDir ch nh rng lp ContactDir c s dng nh mt lp c s chung. Lp SmartDir c hm xy dng ca n, hm xy dng ny triu gi hm xy dng ca lp c s trong danh sch khi to thnh vin ca n. Hm Recent tr v mt con tr ti i tc c tm kim sau cng (hoc 0 nu khng c). Hm Find c nh ngha li sao cho n c th ghi nhn u vo c tm kim sau cng. Con tr recent c t ti tn ca u vo c tm sau cng.
152
Chng 9: Tha k
Bi v lp ContactDir l mt lp c s chung ca lp SmartDir nn tt c thnh vin chung ca lp ContactDir tr thnh cc thnh vin chung ca lp martDir. iu ny ngha l chng ta c th triu gi mt hm thnh vin nh l Insert trn mt i tng SmartDir v y l mt li gi ti ContactDir::Insert. Tng t, tt c cc thnh vin ring ca lp ContactDir tr thnh cc thnh vin ring ca lp SmartDir. Ph hp vi cc nguyn l n thng tin, cc thnh vin ring ca lp ContactDir s khng th c truy xut bi SmartDir. V th, lp SmartDir s khng th truy xut ti bt k thnh vin d liu no ca lp ContactDir cng nh l hm thnh vin ring Lookup. Lp SmartDir nh ngha li hm thnh vin Find. iu ny khng nn nhm ln vi ti nh ngha. C hai nh ngha phn bit ca hm ny: ContactDir::Find v SmartDir::Find (c hai nh ngha c cng du hiu du cho chng c th c cc du hiu khc nhau nu c yu cu). Triu gi hm Find trn i tng SmartDir th hai s c gi. Nh c minh ha bi nh ngha ca hm Find trong lp SmartDir,hm th nht c th vn cn c triu gi bng cch s dng tn y ca n. on m sau minh ha lp SmartDir c x nh l lp ContactDir nhng cng theo di u vo c tm kim c gn nht:
SmartDir dir(10); dir.Insert(Contact("Mary", "11 South Rd", "282 1324")); dir.Insert(Contact("Peter", "9 Port Rd", "678 9862")); dir.Insert(Contact("Jane", "321 Yara Ln", "982 6252")); dir.Insert(Contact("Fred", "2 High St", "458 2324")); dir.Find("Jane"); dir.Find("Peter"); cout << "Recent: " << *dir.Recent() << '\n';
iu ny s cho ra kt qu sau:
Recent: (Peter , 9 Port Rd , 678 9862)
Mt i tng kiu SmartDir cha ng tt c d liu thnh vin ca ContactDir cng nh l bt k d liu thnh vin thm vo c gii thiu bi
Chng 9: Tha k
153
9.3. K hiu th bc lp
Th bc lp thng c minh ha bng cch s dng k hiu ha n gin. Hnh 9.2 minh ha k hiu ca ngn ng UML m chng ta s ang s dng trong gio trnh ny. Mi lp c biu din bng mt hp c gn nhn l tn lp. Tha k gia hai lp c minh ha bng mt mi tn c hng v t lp dn xut n lp c s. Mt ng thng vi hnh kim cng mt u miu t composition (tm dch l quan h b phn, ngha l mt i tng ca lp c bao gm mt hay nhiu i tng ca lp khc). S i tng cha bi i tng khc c miu t bi mt nhn (v d, n).
Hnh 9.2 Mt th bc lp n gin
ContactDir
Contact
Sm artDir
Hnh 9.2 c thng dch nh sau. Contact, ContactDir, v SmartDir l cc lp. Lp ContactDir gm c khng hay nhiu i tng Contact. Lp SmartDir c dn xut t lp ContactDir.
9.4. Hm xy dng v hm hy
Lp dn xut c th c cc hm xy dng v mt hm hy. Bi v mt lp dn xut c th cung cp cc d liu thnh vin da trn cc d liu thnh vin t lp c s ca n nn vai tr ca hm xy dng v hm hy l khi to v hy b cc thnh vin thm vo ny. Khi mt i tng ca mt lp dn xut c to ra th hm xy dng ca lp c s c p dng ti n trc tin v theo sau l hm xy dng ca lp dn xut. Khi mt i tng b thu hi th hm hy ca lp dn xut c p dng trc tin v sau l hm hy ca lp c s. Ni cch khc th cc hm xy dng c ng dng theo th t t gc (lp cha) n ngn (lp con)
Chng 9: Tha k
154
v cc hm hy c p dng theo th t ngc li. V d xem xt mt lp C c dn xut t lp B, m lp B li c dn xut t lp A. Hnh 9.3 minh ha mt i tng c thuc lp C c to ra v hy b nh th no.
class A class B : public A class C : public B { /* ... */ } { /* ... */ } { /* ... */ }
Hnh 9.3
A::A
A::~A
B::B
B::~B
C::C
.........
C::~C
Bi v hm xy dng ca lp c s yu cu cc i s, chng cn c ch nh trong phn nh ngha hm xy dng ca lp dn xut. lm cng vic ny, hm xy dng ca lp dn xut triu gi r rng hm xy dng lp c s trong danh sch khi to thnh vin ca n. V d, hm xy dng SmartDir truyn i s ca n ti hm xy dng ContactDir theo cch ny:
SmartDir::SmartDir (const int max) : ContactDir(max) { /* ... */ }
Thng thng, tt c nhng g m mt hm xy dng lp dn xut yu cu l mt i tng t lp c s. Trong mt vi tnh hung, iu ny thm ch c th khng cn tham kho ti hm xy dng lp c s:
extern ContactDir cd; // c nh ngha u SmartDir::SmartDir (const int max) : cd { /* ... */ }
Mc d cc thnh vin ring ca mt lp lp c s c tha k bi mt lp dn xut nhng chng khng th c truy xut. V d, lp SmartDir tha k tt c cc thnh vin ring (v chung) ca lp ContactDir nhng khng c php tham kho trc tip ti cc thnh vin ring ca lp ContactDir. tng l cc thnh vin ring nn c che du hon ton sao cho chng khng th b can thip vo bi cc khch hng (client) ca lp. S gii hn ny c th chng t chiu hng ngn cm cc lp c kh nng l lp c s cho nhng lp khc. Vic t chi truy xut ca lp dn xut ti cc thnh vin ring ca lp c s vng vo s ci t n hay thm ch lm cho vic nh ngha n l khng thc t. S gii hn c th c gii phng bng cch nh ngha cc thnh vin ring ca lp c s nh l c bo v (protected). n khi cc khch hng ca lp c xem xt, mt thnh vin c bo v th ging nh mt thnh vin ring: n khng th c truy xut bi cc khch hng lp. Tuy nhin,
Chng 9: Tha k
155
mt thnh vin lp c s c bo v c th c truy xut bi bt k lp no c dn xut t n. V d, cc thnh vin ring ca lp ContactDir c th c to ra l c bo v bng cch thay th t kha protected cho t kha private:
class ContactDir { //... protected: int Lookup (const char *name); Contact **contacts;// danh sach cac doi tac int dirSize; // kich thuoc thu muc hien tai int maxSize; // kich thuoc thu muc toi da };
Kt qu l, hm Lookup v cc thnh vin d liu ca lp ContactDir by gi c th truy xut bi lp SmartDir. Cc t kha truy xut private, public, v protected c th xut hin nhiu ln trong mt nh ngha lp. Mi t kha truy xut ch nh cc c im truy xut ca cc thnh vin theo sau n cho n khi bt gp mt t kha truy xut khc:
class Foo { public: // cac thanh vien chung... private: // cac thanh vien rieng... protected: // cac thanh vien duoc bao ve... public: // cac thanh vien chung nua... protected: // cac thanh vien duoc bao ve nua... };
Chng 9: Tha k
156
Tt c cc thnh vin ca mt lp c s ring tr thnh cc thnh vin ring ca lp dn xut. V th tt c x, Fx, y, Fy, z, v Fz tr thnh cc thnh vin ring ca B v C. Cc thnh vin ca lp c s chung gi cc c im truy xut ca chng trong lp dn xut. V th, x v Fx tr thnh cc thnh vin ring D, y v Fy tr thnh cc thnh vin chung ca D, v z v Fz tr thnh cc thnh vin c bo v ca D. Cc thnh vin ring ca lp c s c bo v tr thnh cc thnh vin ring ca lp dn xut. Nhng ngc li, cc thnh vin chung v c bo v ca lp c s c bo v tr thnh cc thnh vin c bo v ca lp dn xut. V th, x v Fx tr thnh cc thnh vin ring ca E, v y, Fy, z, v Fz tr thnh cc thnh vin c bo v ca E.
Bng 9.1
Chng ta cng c th min cho mt thnh vin ring l ca lp c s t nhng chuyn i truy xut c c t bi mt lp dn sao cho n vn gi li nhng c im truy xut gc ca n. lm iu ny, cc thnh vin c min c t tn y trong lp dn xut vi c im truy xut gc ca n. V d:
class C : private A { //... public: A::Fy; // lam cho Fy la mot thanh vien chung cua C protected: A::z; // lam cho z la mot thanh vien duoc bao ve // cua C };
9.6. Hm o
Xem xt s thay i khc ca lp ContactDir c gi l SortedDir, m m bo rng cc i tc mi c xen vo phn cn li ca danh sch c sp xp. Thun li r rng ca iu ny l tc tm kim c th c ci thin bng cch s dng gii thut tm kim nh phn thay v tm kim tuyn tnh. Vic tm kim trong thc t c thc hin bi hm thnh vin Lookup. V th chng ta cn nh ngha li hm ny trong lp SortedDir sao cho n s dng gii thut tm kim nh phn. Tuy nhin, tt c cc hm thnh vin khc tham kho ti ContactDir::Lookup. Chng ta cng c th nh ngha cc hm ny sao cho chng tham kho ti SortedDir::Lookup. Nu chng ta theo tip cn ny, gi tr ca tha k tr nn ng ng hn bi v thc t chng ta c th phi nh ngha li ton b lp.
Chng 9: Tha k
157
Thc s ci m chng ta mun lm l tm cch biu din iu ny: hm Lookup nn c lin kt ti kiu ca i tng m triu gi n. Nu i tng thuc kiu SortedDir sau triu gi Lookup (t bt k ch no, thm ch t bn trong cc hm thnh vin ca ContactDir) c ngha l SortedDir::Lookup. Tng t, nu i tng thuc kiu ContactDir sau gi Lookup (t bt k ch no) c ngha l ContactDir::Lookup. iu ny c th c thc thi thng qua lin kt ng (dynamic binding) ca hm Lookup: s quyt nh chn phin bn no ca hm Lookup gi c to ra thi gian chy ph thuc vo kiu ca i tng. Trong C++, lin kt ng c h tr thng qua cc hm thnh vin o. Mt hm thnh vin c khai bo nh l o bng cch chn thm t kha virtual trc nguyn mu (prototype) ca n trong lp c s. Bt k hm thnh vin no, k c hm xy dng v hm hy, c th c khai bo nh o. Hm Lookup nn c khai bo nh o trong lp ContactDir:
class ContactDir { //... public: virtual int //... };
Ch cc hm thnh vin khng tnh c th c khai bo nh l o. Mt hm thnh vin o c nh ngha li trong mt lp dn xut phi c chnh xc cng tham s v kiu tr v nh mt hm thnh vin trong lp c s. Cc hm o c th c ti nh ngha ging nh cc thnh vin khc. Danh sch 9.3 trnh by nh ngha ca lp SortedDir nh lp dn xut ca lp ContactDir.
Danh sch 9.3 1 class SortedDir : public ContactDir { 2 public: 3 SortedDir (const int max) : ContactDir(max) {} 4 public: 5 virtual int Lookup (const char *name); 6 }; Ch gii
3 5
Hm xy dng n gin ch gi hm xy dng lp c s. Hm Lookup c khai bo li nh l o cho php bt k lp no c dn xut t lp SortedDir nh ngha li n. nh ngha mi ca hm Lookup nh sau:
int SortedDir::Lookup (const char *name) { int bot = 0; int top = dirSize - 1;
Chng 9: Tha k
158
int pos = 0; int mid, cmp; while (bot <= top) { mid = (bot + top) / 2; if ((cmp = strcmp(name, contacts[mid]->Name())) == 0) return mid; else if (cmp < 0) pos = top = mid - 1; // gioi han tim tren nua thap hon else pos = bot = mid + 1; // gioi han tim tren nua cao hon } return pos < 0 ? 0 : pos;
on m sau minh ha rng hm SortedDir::Lookup c gi bi hm ContactDir::Insert khi c triu gi thng qua i tng SortedDir:
SortedDir dir(10); dir.Insert(Contact("Mary", "11 South Rd", "282 1324")); dir.Insert(Contact("Peter", "9 Port Rd", "678 9862")); dir.Insert(Contact("Jane", "321 Yara Ln", "982 6252")); dir.Insert(Contact("Jack", "42 Wayne St", "663 2989")); dir.Insert(Contact("Fred", "2 High St", "458 2324")); cout << dir;
N s cho ra kt qu sau:
(Fred , 2 High St , 458 2324) (Jack , 42 Wayne St , 663 2989) (Jane , 321 Yara Ln , 982 6252) (Mary , 11 South Rd , 282 1324) (Peter , 9 Port Rd , 678 9862)
9.7. a tha k
Cc lp dn xut m chng ta bt gp n thi im ny trong chng ny ch l biu din n tha k, bi v mi lp tha k cc thuc tnh ca n t mt lp c s n. Mt tip cn c th khc, mt lp dn xut c th c nhiu lp c s. iu ny c bit n nh l a tha k (multiple inheritance). V d, chng ta phi nh ngha hai lp tng ng biu din cc danh sch ca cc ty chn v cc ca s im nh:
class OptionList { public: OptionList (int n); ~OptionList (void); //... }; class Window { public: Window (Rect &bounds); ~Window (void); //... };
Chng 9: Tha k
159
Mt menu l mt danh sch ca cc ty chn c hin th bn trong ca s ca n. V th n c th nh ngha Menu bng cch dn xut t lp OptionList v lp Window:
class Menu : public OptionList, public Window { public: Menu (int n, Rect &bounds); ~Menu (void); //... };
Vi a tha k, mt lp dn xut tha k tt c cc thnh vin ca cc lp c s ca n. Nh trc, mi thnh vin ca lp c s c th l ring, chung, hay l c bo v. p dng cng cc nguyn l truy xut thnh vin lp c s. Hnh 9.4 minh ha th bc lp cho Menu..
Hnh 9.4 Th bc lp cho Menu
OptionLis t Window
Menu
V cc lp c s ca lp Menu c cc hm xy dng yu cu cc i s nn hm xy dng cho lp dn xut nn triu gi nhng hm xy dng trong danh sch khi to thnh vin ca n:
Menu::Menu (int n, Rect &bounds) : OptionList(n), Window(bounds) { //... }
Th t m cc hm xy dng c triu gi cng vi th t m chng c c t trong phn u ca lp dn xut (khng theo th t m chng xut hin trong danh sch khi to thnh vin ca cc hm xy dng lp dn xut). V d, vi Menu hm xy dng cho lp OptionList c triu gi trc khi hm xy dng cho lp Window, thm ch nu chng ta chuyn i th t trong hm xy dng:
Menu::Menu (int n, Rect &bounds) : Window(bounds), OptionList(n) { //... }
Chng 9: Tha k
160
S ci t r rng ca i tng lp dn xut l cha ng mt i tng t mi i tng ca cc lp c s ca n. Hnh 9.5 minh ha mi quan h gia mt i tng lp Menu v cc i tng lp c s.
Hnh 9.5 Cc i tng lp dn xut v c s.
OptionList object OptionList data members Window object
Window data members Menu object OptionList data members
9.8. S m h
a tha k lm phc tp thm na cc qui lut tham kho ti cc thnh vin ca mt lp. V d, gi s c hai lp OptionList v Window c mt hm thnh vin gi l Highlight lm ni bc mt phn c th ca kiu i tng ny hay kiu kia:
class OptionList { public: //... void Highlight (int part); }; class Window { public: //... void Highlight (int part); };
(trong m l mt i tng Menu) l m h v s khng bin dch bi v n khng r rng, n tham kho ti hoc l OptionList::Highlight hoc l Window::Highlight. S m h c gii quyt bng cch lm cho li gi r rng:
Chng 9: Tha k
161
m.Window::Highlight(0);
Mt kh nng chn la khc, chng ta c th nh ngha mt hm thnh vin Highlight cho lp Menu gi cc thnh vin Highlight ca cc lp c s:
class Menu : public OptionList, public Window { public: //... void Highlight (int part); }; void Menu::Highlight (int part) { OptionList::Highlight(part); Window::Highlight(part); }
Nhng chuyn i nh th l an ton bi v i tng lp dn xut lun cha ng tt c cc i tng lp c s ca n. V d, php gn u tin lm cho thnh phn Window ca menu c gn ti win. Ngc li, khng c s chuyn i t lp c s thnh lp dn xut. L do mt s chuyn kiu nh th c kh nng nguy him v thc t i tng lp dn xut c th c cc d liu thnh vin khng c mt trong i tng lp c s. V th cc thnh vin d liu ph kt thc bi cc gi tr khng th tin ton. Tt c chuyn kiu nh th phi c p kiu r rng xc nhn nh ca lp trnh vin:
Menu Menu &mRef = (Menu&) win; *mPtr = (Menu*) &win; // cn thn! // cn thn!
Mt i tng lp c s khng th c gn ti mt i tng lp c s tr phi c mt hm xy dng chuyn kiu trong lp dn xut c nh ngha cho mc ch ny. V d, vi
class Menu : public OptionList, public Window { public: //... Menu (Window&); };
Chng 9: Tha k
162
th cu lnh gn sau l hp l v c th s dng hm xy dng chuyn i win thnh i tng Menu trc khi gn:
menu = win; // triu gi Menu::Menu(Window&)
9.10.Lp c s o
Tr li lp Menu v gi s rng hai lp c s ca n cng c dn xut t nhiu lp khc:
class OptionList : public Widget, List { /*...*/ }; class Window : public Widget, Port { /*...*/ }; class Menu : public OptionList, public Window { /*...*/ };
V lp Widget l lp c s cho c hai lp OptionList v Window nn mi i tng menu s c hai i tng widget (xem Hnh 9.6a). iu ny l khng mong mun (bi v mt menu c xem xt l mt widget n) v c th dn n m h. V d, khi p dng hm thnh vin widget ti mt i tng menu, tht khng r rng nh p dng ti mt trong hai i tng widget. Vn ny c khc phc bng cch lm cho lp Widget l mt lp c s o ca lp OptionList v Window. Mt lp c s c lm cho o bng cch t t kha virtual trc tn ca n trong phn u lp dn xut:
class OptionList : virtual public Widget, List class Window : virtual public Widget, Port { /*...*/ }; { /*...*/ };
iu ny m bo rng mt i tng Menu s cha ng va ng mt i tng Widget. Ni cch khc, lp OptionList v lp Window s chia s cng i tng Widget. Mt i tng ca mt lp m c dn xut t mt lp c s o khng cha ng trc tip i tng ca lp c s o m ch l mt con tr ti n (xem Hnh 9.6b v 9.6c). iu ny cho php nhiu hnh vi ca mt lp o trong mt h thng cp bc c ghp li thnh mt (xem Hnh 9.6d). Nu trong mt h thng cp bc lp mt vi th hin ca lp c s X c khai bo nh l o v cc th hin khc nh l khng o th sau i tng lp dn xut s cha ng mt i tng X cho mi th hin khng o ca X, v mt i tng n X cho tt c s xy ra o ca X. Mt i tng lp c s o khng c khi to bi lp dn xut trc tip ca n m c khi to bi lp dn xut xa nht di h thng cp bc lp. Lut ny m bo rng i tng lp c s o c khi to ch mt ln. V d, trong mt i tng menu, i tng widget c khi to bi hm
Chng 9: Tha k
163
Khng quan tm v tr n xut hin trong mt h thng cp bc lp, mt i tng lp c s o lun c xy dng trc cc i tng khng o trong cng h thng cp bc.
Hnh 9.6 Cc lp c s o v khng o
(a) Menu object
Widget data members List data members OptionList data members
(c) Window object with Widget as virtual
Nu trong mt h thng cp bc lp mt c s o c khai bo vi cc phm vi truy xut i lp (ngha l, bt k s kt hp ca ring, c bo v, v chung) sau kh nng truy xut ln nht s thng tr. V d, nu Widget c khai bo l mt lp c s o ring ca lp OptionList v l mt lp c s o chung ca lp Window th sau n s vn cn l mt lp c s o chung ca lp Menu.
Chng 9: Tha k
164
Tng t, php gn memberwise c iu khin bi ti nh ngha ton t = c pht ra t ng (hay do ngi dng nh ngha):
Y& Y::operator = (Y&)
Khi to memberwise (hoc gn) ca i tng lp dn xut lin quan n khi to memberwise (hoc gn) ca cc lp c s ca n cng nh l cc thnh vin i tng lp ca n. Cn s quan tm c bit khi mt lp dn xut nh vo ti nh ngha cc ton t new v delete cho lp c s ca n. V d, tr li vic ti nh ngha hai ton t ny cho lp Point trong Chng 7, v gi s rng chng ta mun s dng chng cho mt lp dn xut:
class Point3D : public Point { public: //... private: int depth; };
Bi v s ci t ca Point::operator new gi s rng khi c cn s c kch thc ca i tng Point, vic tha k ca n bi lp Point3D dn ti mt vn : khng th gii thch ti sao d liu thnh vin ca lp Point3D (ngha l, depth) li cn khng gian ph. trnh vn ny, ti nh ngha ca ton t new c gng cp pht va ng tng s lng lu tr c ch nh bi tham s kch thc ca n hn l mt kch thc gii hn trc. Tng t, ti nh ngha ca delete nn ch vo kch c c ch nh bi tham s th hai ca n v c gng gii phng va ng cc byte ny.
Chng 9: Tha k
165
Bi tp cui chng 9
9.1 Xem xt lp Year chia cc ngy trong nm thnh cc ngy lm vic v cc ngy ngh. Bi v mi ngy c mt gi tr nh phn nn lp Year d dng c dn xut t BitVec:
enum Month { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; class Year : public BitVec { public: Year (const short year); void WorkDay (const short day);// dat ngay nhu ngay lam viec void OffDay (const short day);// dat ngay nhu ngay nghi Bool Working (const short day);// true neu la ngay lam viec short Day (const short day, // chuyen date thanh day const Month month, const short year); protected: short year; // nam theo lich };
Cc ngy c nh s t im bt u ca nm, bt u t ngy 1 thng 1 nm 1. Hon tt lp Year bng cch thi cng cc hm thnh vin ca n. 9.2 Cc bng lit k c gii thiu bi mt khai bo enum l mt tp con nh ca cc s nguyn. Trong mt vi ng dng chng ta c th cn xy dng cc tp hp ca cc bng lit k nh th. V d, trong mt b phn tch c php, mi hm phn tch c th c truyn mt tp cc k hiu m s c b qua khi b phn tch c php c gng phc hi t mt li h thng. Cc k hiu ny thng thng c dnh ring nhng t ca ngn ng:
enum Reserved {classSym, privateSym, publicSym, protectedSym, friendSym, ifSym, elseSym, switchSym,...};
Vi nhng th cho c th c nhiu nht n phn t (n l mt s nh) tp hp c th c trnh by c hiu qu nh mt vect bit ca n phn t. Dn xut mt lp t tn l EnumSet t BitVec lm cho iu ny d dng. Lp EnumSet nn ti nh ngha cc ton t sau: Ton t + hp tp hp. Ton t - hiu tp hp. Ton t * giao tp hp. Ton t % kim tra mt phn t c l thnh vin ca tp hp. Cc ton t <= v >= kim tra mt tp hp c l mt tp con ca tp khc hay khng. Cc ton t >> v << thm mt phn t ti tp hp v xa mt phn t t tp hp. 9.3 Lp tru tng l mt lp m khng bao gi c s dng trc tip nhng cung cp mt khung cho cc lp khc c dn xut t n. Thng thng, tt
166
Chng 9: Tha k
N cung cp mt khung cho cc lp ging nh c s d liu. Cc v d ca loi lp c th c dn xut t c s d liu gm: danh sch lin kt, cy nh phn, v B-cy. Trc tin dn xut lp B-cy t lp Database v sau dn xut lp B*-cy t lp B-cy:
class BTree : public Database { /*...*/ }; class BStar : public BTree { /*...*/ };
Chng 9: Tha k
167