You are on page 1of 51
Phan Il: Lam viéc vdi 96 tign xi y 53 $ saee Argument 1 = (null) GO trén 14 két qua khi ban chay chyong trinh sau khi bién dich véi cd -DNDEBUG cho trinh bién dich. Nhu ban cé thé thay né rét khae véi truéng hyp ma macro assert duye bat. Cha y rang khéng cé déi sé duve cung c&p cho chudng trinh, do dé chung ta that su bude qua bé nhd vao le ndy. Vi mang pointer chia day ce déi sé dan dén tng dung, ching ta gidi han chi trong s6 déi 86 duge chuyén vao. Néu khong ¢6 gi duge chuyén vao chung trinh, sé khong cé gi trong mang déi s@ va cac pointer trong ming argy sé tré vao théng tin thi. That may thay, chung ta da khéng cé Jam bat et diéu gi véi pointer ngoai tri’ in né ra, nhung c6 1é né e6 thé dé dang khién cho mét chyong trinh tu dé vé. Hay tuéng tugng ma nay da duye dua vio mét hé théng udt. Lan déu tién mat build tdi uu hod (thuéng duge goi 1A mot lease") di duge tao, chuong trinh sé bi dd vo ngay khi ngu’i ding chay né ma khong cho chung trinh bat ky adi s6 trea dong lénh. Ro rang, day khéng phi la mét gidi php toi uu khi ban lam vige trong thuc té, Phan tiép theo sé huéng dan ban cach gidi quyét van dé nay. Xi ly vain dé Assert © macro Assert cé gid tri - dae bi dé die bigt giy phién phue. Bang cdch lam cho ma chia day cae assert, ban ¢6 thé thee doi nhiing diéu kién ma ban da khong mong dgi. Tuy nhién, nhiing assert dé sé khong cho ban don gian bo qua nhéing diéu kién phién phite an tim thay. Dé gidi quyét. vin dé nay, phan lién quan cla Listing 7.1 sé duge viét lai. Bude sau day huéng din ban cach thye hign. khi ban theo déi nhGng van 1. Chinh sita mA nguén cho ting dung tht: nghigm nhu trong List- ing 7.2. ‘Trong truéng hgp nay, file ma nguén géc duge ggi 1A chO7.cpp. Listing 7.2 Gidi quyél vin dé Asserts Finolude “stdio.i" dinclide “asser.n” int main(int arge, char * *argy) 1 assert{ argo > 1}: if (ange > 1) printti"Argument 1 = Yasin", argy[1] 54 Phan I: Lam viée vdi be tién xu ly return 0: Sy khée bidt & day la gi? Rd rang néu ban bién dich chuong trinh trong ché dO debug (nghia 1a khéng duge tdi uu hod) va chay nd ichong ¢6 cae déi s6, assert duge kich khdi va chuong trinh thoat, dua ra mal thong bao 1éi nh truée dé. ‘Tuy nhién, néu ban bien dich trong ché di optimized (ti wu hod), assert duge bé qua va chuong trinh kiém tra xem ¢6 di ede doi sd dé xu ly hay khéng. Néu khong, cfu lénh gay 1di vén c6 thé 1am cho chuong trinh dé v6 duge bo qua. Kho vi hgi buén khi biét ring bao nbiéu chung trinh da duge dua vao thé gidi (hun khodng 20 nAm qua) chiia cde ham nbu sau: int funs{ char “s} l assert(s != NULL); strepy( myButler, s}; ’ Ilam nay e6 muc dich sao chép mét chudi déu vae vao mgt bo dem (buffer) von duoe cung eép bdi nha inh. BO dém dé cé mOt kich o® mht dinh, nhung chung ta khong kiém tra tim sé ky ty toi da co thé cho phép trong chudi déu vao. Néu sé ky ty di vao lén hon sd ky i trong mang myBuller, né sé gay ra cde van dé. Nhu ban oé thé tuéng tugng, diéu nay géy ra nhiéu van dé trong thue té béi vi bd nhé von kkhéng thudc vé ung dung duve str dung va duoe gan ede gid tri. Cde Asserts rat héiu dung cho viée dinh nghia urviing hgp test, bay cae 1di ngowi 1¢ ma ban biét c6 the xdy ra va tim nhimng véin sy od ma bun that s¥ khéng mong doi xdy ra. Diéu tha vi phat vé cde assert 14 sau khi ban tim théy sy cd mA nd xde dinh, ban thuing ¢6 thé su dung trinh go rdi (debugger) dé biét chinh xé diéu gi da gay ra sul va phuong phap tét nbat la si dyng co che slack-Lrace, Ky thuat 62 sé hudng din ban each dua mét ed ché nh vay vao ung dyng dé ban ¢6 thé tim thay ede sy c6 nbu sy ed nay trong thoi gian chay Kg thudt 8: Sit dung const thay vi #define__ ‘Tet kiém thdi gian bang cdch m™ So sanh cde cau lénh #define vdi cdc cau |énh const m@ Si dung cau lénh const Phain tl: Lam vige vdi bé tién xt ly 55 ut Tim hiéu cae Idi do cau lanh #define gay ra @ Gidi auyét cac Idi Qua sudt sdch nay, ching ta si dung cdu Iénh #define dé tao ede macro va gid tri hang dé sif dung trong cdc chuong trinh, N6 1a mot phuong phap hitu dung - Tuy nhién, nhém tidu chudin C++ da chon tao cach mdi dé dinh nghia cdc hang trong ting dung: cau ténh const. lénh const duge sti dyn theo ede sau day: const int MaxValues = 100, Néu cau lénh nay tréng quen thude, né giéng nhiéu nby each cau lénh #define duge stt dung: #define MAX_VALUES 100 Su kkhiic bigt 1A edu trde const duge dinh nghia tai cp trinh bién dich thay vi tai cp bd tién xi ly. Voi const, trinh bién dich c6 thé téi tu ho cde gid tri Wt hon va cé thé thue hién vige kiém tra an Loan kigu (type-safe. Sau day 12 mot vi dy. Trude lam vig én, day 1a c&ch phuong thie #define . Gid sti ching ta viét mét dinh nghia nhu sau: define NoValues 0 Va sau do viet mot cau lénh C++ nhu sau: char *sValues = NoValues; u lénh nay sé bién dich (mae dit mét sé trinh bién dich c6 thé dua ra mdt cdinh bao su chuyén déi khdng an toan) béi vi phdn khai bao NoValues bing voi mét gid tri chudi 1A NULL. Cho dén git rat tot - nhung hay git su bay gid chung ta thay déi gid tri dé bling h dinh nghia edu lénh sau day (chi ¥ ring bat ky gid tri khong rong minh hoa vén dé nay theo cing mét edch): #Geline NoValues -99 anh vi cla phép gan sValues khdng thé dy dodn trude duce. Mot 86 irinh bién dich sé cho phép né, gin mot ky ty rat la (bat ky -99 nao trong tap hgp ky ty ma ban dang si dung) vio chudi, Nhing trinh bién dich khée sé khong cho phép né va sé than phién, dua ra cic Idi khae ta dé hidu va sda chia. Theo mét trong hai cach, ket qua gay kho chiu Bay gid déi véi phuong thie const. Néu ban viét const char *NoValues = -99 56 Phan I: Lam viée voi b6 tin xi ty i ban s@ thay ngay trinh bién dich phdn tng (bang cach tao ra m@t léi bién dich) lac ban dinh nghia hing nhy thé nao. Cau trac const an Loin kiéu (type-safe) - ban cho né mét kiéu va ban gan né chi yao nhing thi cling kigu hoae c6 cde kidu tueng thich; né sé khong ac, do dé tinh nhat quan eda né khong bi Chudin C44 eung cap mot phugng tc dé xi ly ede sy ed gay ra béi eau lénh #define trong bé tién au Ly. Cau lénh nay 14 edu 1énh const duge x ly béi trinh bién dich, khong phai b6 tién wit Ly va do dé 1am cho ma dé hidu va dé go r6} hon. 1 ong code editor mA ban chon, tao mot file méi dé chia ma cho file nguén cia ky thuat. ‘Prong vi dy nay file duge dgt tén 1a eh08.cpp mae di ban c6 thé su dung bat ky tén nao ban chon, 2. G6 nh4p mA trong Listing 8.1 vao file. Chi ¥ trong listing nay, ban ¢6 thé thay higu dng cia phién ban feline eda cau lénh va phién ban const cua cu lénh. Trinh biéa dich sé hidu chang ich khite nhau nhu ching ta sé thay ngay sau day. Listing 8.1: Sit dung cdc hing Finclude const int NiaxVelues = 100. define MAX VALUES 100. 31 int main(int ange, char * *aray) ‘ int myArray MaxValues |: int myOtherArray| MAX_VALUES J, for { int i=0; icMaxValues; ++i ) myArrayfi] = | for ( int i=Q; icMAX_VALNES; +41 ) myOtherArray(i] return 0; t x a. Bién dich ting dung, sit dyng trinh bién dich va thich trén ho diéu hanh ua thich. Phan am viée voi b6 tién xi ly 57 Bién dich chuong trinh nay trong binh thudng nay, ban sé chan due ce thong béo li sau day $ geo chO8 cpp chO8.cpp: in function ‘int rmain(iat char *y chO8.cpp'9: error: syntax error before ° token chO8.cop:13: error: syntax error before y token ch08.009.14. error: ‘mmyOtherArray’ unde clared ttirst use this function) chO8.cop'14: error: (Each undeciared iden tifier is reportes only once for each function it appears in.) Phan ké tiép mé td cdch sta chia nhang 1di nay. Nhan dang cac |6i Xem ee dang ma cae 1di xudit hién trén dé, hodn toan khéng bit rd su cé cé thé la gi. Tham chidu dong dau tién duoc dinh dau bang ky higu > 1, Chie chin dong nay trong gidng nhu mot dong ma hgp Id - sy cd ¢6 thé la gi? Cau tra loi la khong phai trinh bién dich ma 1a b6 tidn xu ly. May nhé bé tién xit ly lay moi thé theo sau token ma ban dinh nghia (irén dong #define) va trung thanh dan né vdo ma bal ed noi nio né tim thiy token sau do. 'Trong trudng hgp nay sau khi viée din {paste} xady ra, bin than ding nay duye ehuyén déi thanh int myOtherArray[ 100; }) Cha y déu cham phdy du thita é gi khong bgp 16 trong C++ vA s& ga dong gay ldi “that sy" von la #defin (inh bién djch dua ra mgt Idi gay béi r ve LOL. inh nghia mang. Diéu 46 Nhung thay vi tré vio mét dau cham phay 6 cudi, vé mot ding ma no trong cé Dinh nghia #define c6 thé gay ra cde 3i, nhung dinh nghia const cia MaxValues khong c6 mot van dé nhu vay. NhGng gi n6 cung cip don gidn la mot dinh nghia cia mt gid tri - va sau dé ban cd thé sit dung gid tri dé bat ett nai ndo trong chueng trinh ma mét gid tri true kién hode hing #define 6 thé duge st dung. 58 Phan tt: Lam vide véi bé tién xc ly Siia chiia cdc toi Lam thé nao chung ta stia chia nhding su cd @6 trong trinh bién dich sao cho ma thye hién nhting gi ma chung ta muén? Hay xem mét @ cach ching ta cd thé iam cho ma bién dich va thye hién nhing gi chang ta di dv dinh thay vi dé trinh bién dich don khong dang nhdng gi ching ta mun. 1. Mo lai file nguén trong code editor ua thich. khi file mé ra, ehinh sia chuong trinh hién ¢6 dé sua cde Jéi bién dich nhv sau. Cha y ma nay thay thé vao listing ma do. listing ma truée, né khéng duge them int main(int args. char **argv) ‘ int xVal = 10; int myarray[ x¥al J; for (int i=0; iexval; +4i ) myArrayli} return 0; 1 C6 mot mdi nguy hiém véi vie si dung phuong phdp nay. Xem xét dong sau day: int x¥al; int myArrayl xVal ): Hay ludn khéi tao tat ca nghi ban s@ cn dén ching. ‘Trong phién ban Ihéng duge tdi uu hod cia ma, xVal duge gin mot gia Lri la 0 - yén cho phép ban tao mot mang 0 phan ti. Didu true trae bat ddu khi ban chay phién bin duve iéi uu hod: gid tri xVal khong xde dinh va ma nay ¢6 thé sé khién cho mét chuong trinh dé vo. Cé diing lam nhting digu nhu vay. Cach tét nhat dé gidi quyét moi thir nhu vay 1a xde 4p mde cinh bdo trinh bién dich sang mite cao nhat dé phat hign cdc bién khdng khdi tao von duge sit dung. én trong ma tham ch{ néu ban khong Phan U: Lam viée voi b6 tien xd 59 KG thudt 9: Cdce macro va tai sao Khéng st ‘Tiét kigm théi gian bang cach: @ Tim hiéu nhiing khuyst diém cia cac macro Si dung cac ham thay vi cdc macro Tranh cae van dé voi cae macro chudi Xae dinh cac 16i khi si dung cdc macro Si dung cdc macro mét cach thich hop Bo tién xi ly vA eae macro 1A nhding thé hou dung nhung khong qua nhiét tinh trong céng dung eua ching. Ngoai tham hoa eé thé cé ré rang (b6 tién xu ly trd nén dién dai va thay thé bat ky ma trong ung dung bang bat cut nhdng gi nam trong macro), cdc macro thubng 6 nhiing te dung phy khong ro rang khi ehong duae goi ra. khang giéng nhy ede ham - cé nhiing hé théng phy c6 thé duge phat hian trong trinh g@ roi - mét macro khéng cé chit nding g6 roi (debug). BL vi b@ tién xu ly "sao chép” ma cda macro vao dng dung, trinh go rdi (debugger) that su khéng hidu macro boat déng nhu thé nado. VA mie du cde macro cho phép ban tranh hao phi ddy dit ligu Ién trén stack (ngiin xép) va day né ra ngoai dé goi ra mot ham, macro téing ‘ich ct file bing cach sao chép cling mot khéi ma mdi lan né duge st dung. Di nhién, chinh nhiing ly do nay khong di dé Him cho ede nha kip trinh muén trénh st dung ede macro. C6 nhiing ly do t6t hon nhiéu. Vi dy, xem xét macro min (thay thé cho "minimum") ma nhiéu chung trink dink nghia nhy sau: #define mim(x, Y) ((X) < (¥} 2 OX): YY) Gia sit ban sit dung macro min véi mét déi sé von thye hién mot digu khae nao dé - nbu sau - next = min (x #y), func (2)); Maera mé rong nhu sau: riext = ((x + yp < (func {29} 2 (x + y) + (tune (2)):) ‘Trong d6 x + y thay thé x va func (z) thay thé y. Bay gid diéu nay cé thé duping nhu Ichéng giéng nhu mot digu te hai. Nhung néu ham func co mot tée dung phy ndo dé xay ra Ichi né duge goi nhiéu lan thi phai lam sao? Tae dyng phy s@ khéng nhin ro nyay te thi néu dye ma vdn cho thay ham duge goi hai ln, Nhung 60 Phan Il: Lam vidc voi bé tién xi ly mot nha lap trinh g@ réi chuong trink cla ban c6 thé bj béi réi néu (vi dy) mot ham func xudt hign trong gidny nhu vay bdi vi nd c6 nghia la i tr} du vao da duge thay d6i khong phil mot lin nhu nd xudt hign ma 1a hai lan: int functint &x) [ xt=2 return x, 1 Béi vi déi sé duge chuyén theo tham chiéu, déi sé goe duue thay Két qua nay c6 thé 1a nhtmg gi da duoe dn dinh, nhutng né cing c6 thé way ra cde van dé nhu trong truding hyp eda macro min. Thay vi lam cho ham tra vé hai lan gia tri va so sinh n6, ching ta that sy xem né so v6i bén lan déi sd. TU phién ban md rong cia macro, bun 6 thé thay ring z sé duge chuyén vao ham hai lAn va vi ham léy déi s6 cia né theo tham chiéu, né sé duge chinh sua trong chuong trinh chinh. Pay rat c6 thé khdng phai IA nhang gi ma nha lap trinh da mudn Ide dau. Khdi tao mot ham vi mgt macro chudi ¢ vain dé tré nén tinh vi hon khi ban edp phat va sao chep cde chudi (strings) - ma c4e nha lap Urinh luén thue hign trong C++. Sau day 1A tink hudng thing thudng: ban cé mét chudéi déu vao, ban muén ao chép né va luu tr két gua trong mot chudi khie. Mat ham thy vin duge goi IN strdup thye hign chinh xéc digu nay, Nhung gid sit ban muén sao chép chi mot sé byte nhat dinh cla chudi gée vao chudi moi. Ban Khong thé sd dyng strdup boi vi né luda nhén dai chudi hean toan, Hun nia gid su dé bao lon bé nhé, ban muén loai ba chudi ge sau khi sao chép. Diéu nay 6 thé duge thye hién 06 1 dé rut gon m@t chudi hoge dé bdo dim mét thd gi dé luén nim vita trong modt trudng co sé dit ligu ey thé. Cae buée sau day huéng din ban etch ade vy tign Igi nay - thyc thi nd duéi dang mat “0 va sau dé duéi dang mot him dé xem ce van dé voi méi adi tugng nay ¢6 thé 1a gi 1. Trong code editor mA ban chon, tao mt file méi dé cha ma cho file ngudn ita ky th ‘Trong vi du nay file duge dat tén 18 chO9.cpp, mae dai ban e6 thé sur dung bat ky tén nto ban chon 2. Go nhap ma trong Listing 9.1 vio file. Phan Hh Lam viée vai bé tién xi ly 61 Listing 9.1: File macro Finciude #include 11 This will be cur macro version #define COPY_AND_TRUNCins. $} \ if { strlen(s) > 20 + ty 8s = new charf 20}: \ memset{ ns, 0, 20): \ strnepy( ns, s, 20-1 ); 8 WN else \ tN ng = new char| strlen(s) j: \ memset( ns, 0, strlants) }: S strepy( ns, 8); \ VN delete s, int maingint arge, char **argu } { char *s = new char[80]; strepy( s, "This is a really long string to test something"); char *ns = NULL: COPY_AND_TRUNC( ns, s } printf(New string: [%s}\n", ns); char *s2 = new char[80}: stropy( $2, “This is 2 really long sliing to test something’): COPY AND TAUNG, 52, 82 jc printl(’New string: [Yes]'n", ns ); return 0; 62 Phan Il: Lam viée vidi 96 tién xu ly 0 mot macro da dong (multiple line) bang cach sir dung ky ty d&a gach chéo ngvoe ("\") 6 cudi dong truéc, Diéu nay sé md réng macro cho dén khi né héu nhu 1A mot ham hoan chinh. 4, Chay chuong trinh trén hé diéu banh ua thich. Néu ban dA iam wt moi thd thi ban s8 thy két qua sau day: 8 Jaexe New string: [This is a really Io} New string: ((nu!}] Didu gi da xiy ra G day? Két qua cia lenh goi ham cudi cing ¢6 le nén giéng véi lénh goi ham dau tién. Day 1A mot van dé nghiém trong duge tray nguyén 1a tae dung phy cda macro. BGi vi thd tuc da khang kiém tra xem ddu vao va dau ra cé nhu nbau hay khong, ban khéng thé an toan xoa bO dém character-pointer m& ban da khong cap phat. Tuy nhién, bling céch lam theo cdc buée duge trinh bay 6 day, ban 6 thé viét lai macro nay dudi dang mgt ham tuong dugng nhung an toan hon. 1. MG lai file nguén trong code editor: 2, Thye hién ede Uhay déi ddi vei ma nguén nhu duge minh hog trong Listing 9.2. Chi ¥ rang ede dong en chinh sita duge minh hog tai ->1 va D2. Cac khdi ma duge minh hoa & day sé duge bo sung. Listing 9.2: File macro cap hat finciude include J/ This will be our macro version #deling COPY_AND_TRUNC(ns. s} § it ( strlen(s) > 20) iy as = new char{ 20 ],\ memset( ns, 0, 20 }; strmepy( ns, 8. 20-1): % iN else Phin Il: Lam viéc voi bd tién xl ly 63 By ns = new char| strlen(s) |: \ memset ns. 0. strlents} ); 4 strepy{ 9s. $ ) BN delete ss 8 = NULL. char “copy_and_truncate( char *& s } 31 1 t shar “temp = NULL; if { strlen(s} > 20 } \ temp = new chart 20 }: memset{ temp, 0, 20 }; strnopy( temp, 8, 20-1): t alse i temp = new char{ strlen(s) |: memset{ temp, 0, strlen{s} ); stropy( temo, s ); t delete 5; s = NULL; return temp; iat main(int argo, char **argy } t char “s = new cher|80}: strepy( 8, "This is a really long string to test something”); char *ns = NULL: COPY_AND_TRUNC( ns. s }; print{(’Nevy string: [Yes]\n". ns ): char *s2 = new char[80}; 64 Phan I: Lam viée véi b6 tién xi ly strepyl $2, “This is a really tong slring to test something”) COPY_AND_TRUNG( s2, s2 }; printff'New string: [%esfin". $2 ) char “53 = new char[80) strepy( s8, "This is a really tong string to test something”) $3 = copy_and_truncate( $3 }: >2 printf-New string: [2es}in’, $8.4: 1 3. Luu ma nguén trong bd soan thav ma ngudn va chon ting dung soan thio ma nguén. 4, Bién dich chuong (rink bang cach st dung trinh bién dich ua thich trén hé diéu hanh ua thich. Néu ban da lam tét moi thd, lan nay ban sé thay két qua sau day trong cia sé console: $ Jaexe New string: {This is a really lo] New string: [(null)) New string: [This is a really fo} Cha ¥ rang ln nay ham da lim ehinh xée nhiing gi ban mong dg’ Ban khong chi khong xo pointer ma ban cdn khong gay ra rd rib nhé mi phién ban truée da gay ra. Hay tuéng tugng ban phai can thigp vao cée macro nhu vay lap di lap lai nhidu lan dé hoan thanh cong vige cua ban. Dé trénh sy phién phic dé, ban nén chon cae ham cho bat eit thet gf ngoui trir ede macro don giin nbat. Ham duge trinh bay trong ma duge chinh sita khong gay ra ede vén dé trong khi macro trong listing ban dau thi e6. Digu nay minh hoa nhiing van dé duge gay ra vo ¥ bdi cde macro. Vay thi cic macro c6 lyi cho mye dich gi? Hay nhé mét macro chi In doi tugng ei phdp thé vj. No dé dang véi qué nhiéu diéu tét. Sir dung mét ding macro cé thé lam cho viée doc ma cba ban dé dang hen, nhung ban khéng bae gid nén chinh sia bin thin ma voi mot macro. Vi dy, n@u ban cd mat biéu thue dae bigt phic tap chang han nhu Citer).C_StrG - vn ed thé xiy ra khi ban sit dung Standard Yomplato Library (STL) trong C++, ban cé thé tgo mt macro ah sau Phan Ul: Lam viée véi b@ tién xt ly 65 #define PTR ix) (*x) Sau dé, ban c6 thé viét PTR (o.C_Str( ) va thudag khi ban viét =4, dinh nghia s@ nbét quan. Bay khong phai 1a mot vi dy phe tap, nhung né cho ban biét khi nao sit dung va khong nén sit dung cae macro trong nhiig tng dung C++. Macro don gidn, khéng cé cée tac dung phu va lam cho ma dé dec hon sau nay. Day 1A tat c& ly do tét dé su dung mgt macro. KG_shudt 10: Ti kiém thoi gian bling caieh i Sit dung ham sizeo! Khao sat va tim hiéu nhiing kich c& byte cla cdc kiéu khac nhau § Sirdung sizeol vai cdc pointer ti sizeof vé mat ky thuat khong phdi 14 mét phan ctia bé tién hung né nén duge xem 1A mGt. Nhu véi tén goi, todn ttt sizeof tra vé kich ¢@ tinh bing byte cia mot mau théng tin nao dé trong ting dung. Né ¢6 thé duge su dung trén ede kiéu co ban chang han nhu int, long, Moat, double, hoe chur * va cling trén cdc déi tugng, lép va khdi due cap phat. Thue té moi thi von la mét kiéu hop 1é 6 thé duge chuyén dén ham sizeof. Ha uc ky hitu dung. Vi dy, néu ban mun cdp phat mot khéi bd ahd dé chita chinh xde mOt kicu dé ligu riéng bidt, ban ¢6 thé su dung ham sizeof dé quyét dinh ban edn bao nhiéu byte dé cap phat nut sau: int bytes = sizeof(biock); char ‘newBleck = new char[bytes); memopy( newBtock, block, bytes }; ‘Vinh nang nay cing hu dung khi ban luu mt déi tuong vio bé hhé trong Ichi thye thi mét chic nang undo toan eye. Ban hvu trang thai cia déi tugng mdi lin né st thay déi vA sau dé trd né vé trang thai duyc luu do bing cach don gin sao chép khéi ma dé lén né. Di nhién, cé nhitng cach khac dé lam taée vu nay, nhung t4e vu nay don gian va rit md rong. Cac phan tiép theo sé cho ban th&y nhitng gi sizeof c6 thé va khong thé thue hitn. 66 Phan tt: Lam vide vai bé tién xtrly Sit dung ham sizeot Ham sizeof ¢6 thé c6 gid tri trong vide xe dinh nhdng edu hinh hé théng, kich c cia cde lp va minh hoa nhiéu chi tiét bén trong cia hé th6ng C++. CA bude sau day huéng dan ban céch sit dung ham sizeof va né c6 thé cho ban biét mét diéu gi dé vé nhiing chi tiét bén trong cia ma eda chinh ban nhu thé nao: 1. Trong code editor ma bin chon, tao mot file méi dé chua ma cho file nguén eda ky thu: Yrong vi dy nay, file duge dat tén 1a ch10.cpp mac da ban cé thé sit dung bat ky tén nao ban chon, 2, Go nhap ma ti Listing 10.1 vao file, Listing 10.1: Chung trinh sizeot #include include class Foo t public: Foot) tl; Foot) tk i class Bar 1 public: Barl} 0, virtual ~Bar(} (h; i class Full t int x; double y; public, Full() t 1 virtual ~Full{) Phan I Lam viéc vi bé tién xt ly 1 ] kK class Derived : public Foo t ublic Derived() th; ~Derived(} 11; y int main(} 1 int x = 0; long y = 0, float z = 0; double d = 0.0; std:string s = “hello”. Uf Basic types printf(’size of char: %d\n", sizeof{char}); printf(’size of char *: %adin”, sizeof(char *}): printf(‘size of int: %d\n", sizeof(x)); printfe"size of long: %din", sizeotty}); printf(*size of float: %din”, sizeof(z)}, printt(*size of double: %d\n", sizeof(d}); printt(*size of string: d\n", sizeot{s) ‘ printf("size of Foo: Sdn’, sizeot(Foo)); printf("size of Bar: %d\n", sizeot(Bar)} printf('size of Full: %¢hn". sizeof(Full)); 67 68 Phain Il: Lam vide véi bo tién xi ty printt(’size of Derived: Yedin", sizeof(Derived)): b 3. Lat ma nguén dudi dang mét file trong code editor va sau dé dong tng dung editor. 4. Bién dich chuong trinh, si duag trinh bién dich ua thich trén hé diéu hn ua thich 5. Chay chuung trinh. Néu ban da lam tt moi tht, ban sé thay két qua sau day trong cita sé console, $ faexe size of char: 1 size of char *: 4 size of int 4 size of long: 4 size of float: 4 size of double: & size of string: 4 size of Foo: 1 size of Bar: 4 size of Full: 16 size of Derived: 1 Tw két qua, ban 6 thé thay ring sé byte ma méi phan tif in ra chiém trong bd nhé cho chuung trinh nay. Khéng co nhing diéu ngac nhién that su d day ngoai tri kich co ciia cdc lép. Hay xem nbiing két qua nay co y nghia gi. Banh gid két qua C6 mot sO ket ludn thd vi cén dua ra tir két qua ndy. Vi du, mot 86 ixét qua khong gay ngac nhién gi cd (vi du, kich c@ eda mot truong ky tu 1a 1 byte), mét sé diéu ngac nhién xuat hién - vf dy kich cé ca mot pointer ky ty gidng nhu bat ky pointer khéc vén hod ra la kich cd eta mot long. Didu dé cé nghia sd byte tdi da cho phép ma bar ¢6 thé edip phat stt dung ede pointer chudn cé gia tri 4 byte - 32 bit (dé la ly do tai sao Microsoft Windows la m@t h¢ digu hanh 32 bit. Nhung ban da biét digu 46). Diéu ngac nhién ké tiép dn gida ede ddi tugng trong danh sdch: kich c@ eda mot chudi dutge thé ign dudi dang 4 byte vn khong Phan Il: Lam vie voi b6 tién xiily 69 thé dung - chudi ma né luu tra dai hun thé. Diéu dé nhu thé nao? Cau tra Idi 1a ham sizeof tra vé trye 80 byte dugc c&p phat béi déi tuong - nghia 18 sé byte duge chiém bdi cde bién private vA public trong déi tugng, vdi mot vai byte cho ede ham do (virtual) (chang han nhut cde ham ao Foo va Bari. Chu ¥ ring mac di lép bar khéng e6 cde bién thanh vién, nhung né van chidm 4 byte béi vi né cdn bang ham iio (hode v-table) duve thdo ludn trong kj thuat 2. Bay gid tai sao lép Foo chiém 1 byte khi né khéng co cde phuong the dq va khdng c6 cae bién thanh vién? Cau tra Idi la ham sizeof bat bude trd vé 1 byte cho moi lép. Bao dam dia chi ctia mot doi tuong sé khong bao gid gidng nhu dia chi cua mOt déi tugng kh4c. Néu C++ cho phép cde déi tugng ¢6 zero kich cd, trinh bién dich s@ khong bi phai buge gén cho nhiing dai bang 46 mét dia chi méi trong bé nhd. Dé minh hoa, néu ching trinh bién dich sé ty do 1am cho ca hai déi tugng nay tré vao cing mét vi tri trong bé nhé. Diéu nay khong dude mong mudn tham chi néu ef hai d6i tuong khéng duve cap phiit bd nhd. Co hai déi tuong 06 cung mot vj Lei sé pha vo qua nhiéu ham thu vién chudn. Bat kp ham so sinh nguén va dich (vi dy) sé bi phd va, tham chi néu su phd vo dé khong gay hai that su. Ly do cho diéu nay 1a so sénh viée thye hign bang cich xem cae dia chi ma hai pointer chiém trong bé nhé. Néu hai dia chi ging nhau, diéu gia dinh la nhiing gi ching tré vao gidng nhau. Néu hai di tugng khong c6 dif ligu trong dé, nhung chiém cing sgt vi tri trong bd ohé, chting khong gidng nhau, tham chi dudng nh va Lép Bar cing khéng chtia cde thanh vién, nhung chtta mot mét ham do, va do do day so byte duye edip phat sang 4. Cach jam vide dé goi y ring cé mét diéu gi dé mang tinh rat vat ly vé c4c ham do va ring ban phai chiu mét chi phi bé nho dé st dung tinh nang a6. Lp Full chda mét sé bién thanh vién - mt double chiém 8 byte va mot sO nguyén (integer) chiém 4 - vA n6 cé 16 byte duge cap phat. 14 byte kia dén tir dau? Ban da dodn diéu dé: tt bang do (virtual table) von duye tao bét virtual destructor dé, Diéu nay cho chang ta biét gi? Th4m chi néu ban khong ¢6 mOt phuong the do “binh thudng”, viée cO mét virtual destructor van tao ra mgt muc v-table - va diéu dé cd nghia la thém 4 byte trong phan céip phat. Lép Derived gay béi réi - dugng nhu né phai ngén nhiéu kich hon binh thudng. Tuy nhién, hi ban xem edn than Iép nay, ban nhan ra rang né khéng chia ham do va Iép co sé ma né dan xudt tu do 70 Phan Il: Lam viée vai bé tién xi ly cing vay. Do dé, mét lan nda day 1a mét vi dy vé mét lép tréng von chiém 1 byte. Sif dung sizeof véi ‘dc pointer Viée thdo luan ham sizeof st khéng hoan chinh néu khong xem mét sai s6t ma cae nha lap trinh C++ thuting pham phdi khi ching st dung ham nay. Xem xét chugng trinh nho sau day: Ficlude include const char arr[} = “hello”; const char *cp = arr, main{)t printt(“Size of array %dhn", sizeof(arn)); printt('Size of pointer %dn", sizeot(cp}), return(Q); } Béi vi mét’cdu lénh xudt kich cd cia mot mang va edu lénh khée xuat kich ed cla m6t pointer sang mang dé, ban nghia rang hai cau lanh printf trong chudng trinh nhé nay sé hién thi céc gid tri gidng nhau. Nhung ching khong lam nhv vay. That ra, néu ban xem két qua, né trong nhu sau: Sizeo! array 6 Size of pointer 4 Kich of cia m§t mang (array) duge biét vio thdi gian bién dich va 6 thé duge hién thj béi ham sizeof. Mat kh4c mét pointer ludn 1a kich cd cia mét pointer bat ké no tré vao nhting gi. Hon nia, néu ban 6 tra vé kich c& clia mot mang bing cdch dua vao cfu lénh sizeof (*ep} trong dé ep 1a mang, ban sé thay cau tra loi (dn nda Ichong phai 1a 6 ma ja 1. Tai sao nhu vay? Boi vi biéu thie *ep ivong gid sang mot ky ty va kich co ela mot ky ty don luda la 1 byte. Hay rit edn than néu ban cd sir dyng ham sizeof trén cdc pointer - dic biét néu ban mudn st dung két qua dé thé hign kich cd cla nhifng gi dang duve tré vao. Phén Ill: Cac kiéu di idu n Chan wt Cac kiéu dé liéu KG thudt 11: Tao cdc kiéu co bdn riéng cla Tiét kiém thdi gian bing edch ™ Loai bd ma duge sao chép vdi cdc kidu co ban ty tao ™ Kiém tra cde day (range) trong cdc gia tri sé nguyén m Test cc kiéu co ban ty tao Trong C++, cdc kiéu (type) duge phan chia thanh hai ving: cd ban va do nguéi dang dinh nghia. Cae kiéu eo ban 1a ede kiéu duge dinh nghia boi ngén ngu, thutimg duge md phéng theo cdc kiéu duge hé tro true tiép béi phén eting méy tinh. Nhéng kiéu nay bao gém cae 36 nguyén, 36 dau déng va ky ty, Cac kiéu nang cao, chang han nhu c4c chuéi (string), edu trie (structure), va lép (class) roi vao ving do nguéi ding dinh nghia. Ky thudt nay sé xem xét ving dau tién, kiéu ev bin. Cae kiéu nang cao sé duge dé cap trong kf thuat ké tiép. Bao nhiéu ln ban da viet mot chuong trinh dai héi mdt bién sé nguyén ed ban bj rang bude trong mot day nde dé? Rét cudc ban sao chép cimg mét ma lap di l4p lai nhigu lén qua sudt ing dung, trong cde khdi nhu sai int value = get_a_value(); it ( value < 0 II value > 10) 4 printi{"invalid input, try againin”); return false; 72, Phan Ill; Cac kigu da ligu Di nhién sau khi ban da dua 14t cd khéi nay vao mA, ong chi cia ban xuat hién va cho ban biét ring nhiing ngudi 6 trong bd phan ké todn a4 quyét dinh 10 khéng cdn IA sé ma thuat nda - bay gid n6 1a 12. Do 46 ban chinh sila tat ca 'ma, hoc mét diéu nao dé trong tién trinh - dé 1A tét hon ban nén sii dung cdc hing trong tinh hudng nay hon la cde bién. Cac chinh sia ciia ban trong ny sau: const int maxValue = 12: int value = get_a_value(}, if ( value < 0 Il value > maxValue ) 1 printf("invalid input, try again\a"); return false; 1 Ban kiém tra ma trong noi luu trit ma nguén va dé chide ch&n 6ng chi di vao lai van phong cua ban, Cac ké todn da yéu cdu mt thay déi hdc. ‘Trong Ichi gia tri téi da ¢6 thé cho phép van 1 12. Cae sé 0 (zero) khéng duge cho phép trong hé théng ké todn. Gis tri nhé nhat ma ban duge cho phép nhdp 1A 1, Cau nhau, ban viét lai ma mét lan nia (tan dung ahiing gi ban da hoe trong hai cude thir nghigm ddu tién) dé tao mét thi gi dé chung (hon): const int minValue > 1; const int maxValue = 12; int value = get_a_value(), it ( value < minValue MI value > maxValue ) printi(“invatid input, try again\n”), return false; ' Tle hi dp Range Ky thudt nay sé hung din ban mét eéeh khéi quét hon dé gidi quyét véin dé nay - bling cdch sit dyng mot lép C++. Y¥ tudng la chi vide mé rong kidu cd ban int dé cho phép céc gid tri toi thidu va tdi da, Di nhién van dé 1A ching ta vin mudn cé khé nang sti dung cdc kidu khée (chang han nhw integer} cho cée phép so sénh va phép gn va nhiing thit tuong ty. Lép duve tao trong cc bude sau day xu ly cde gid tri ti thiéu va ti da va gidi han trong ahing gid tri dé. Phan Iii: Cac kidu ai lieu 73 4. Trong code editor ma ban chon, tao mét file mdi dé chtta ma cho phan thue thi cia file nguén ‘Trong vi dy nay, file duge dat tén la chlLepp me di ban ¢6 thé sd dung bat ky tén nao ban chon. 2. G6 nhap ma w Listing 11.1 vao file ea ban, Listing 11.1: Lép Range include Finckide include class intRange { private: int (Min; int iMax; int Value virtual void SetValue( int value ) ( if ( value < GetMin() } value = GetMin(); else if ( value > GetMax(} } value = GelMax(); iValue = value: } public: IntRange(void) { iMin = 0; iMax = INT_MAX; Value = iM } IntRange(int min, int max) t if ( min <= max } 1 74 Phan Ul: Cc kiéu di ligu iMin = mis: iMax = max: } else { iMin = max: iMax = min: 1 Value = iMin; ' IntRanget int min, int max, int value ) t if { min <= max } [ iMin = nin; iMax = max, 1 else { iMin = max; iMax = min; } Selvalua( value ); 1 IntRanget const IntRange& aCopy } ‘ iMin = aCopy.iMin; iMax = aCopy.iMax; Value = aCopy. Valve; J virtual ~IntRange() { } virlual int GetMin{void) 4 Phan Wl: Cac kigu di tigu 7s retura Min; t virtual int GetMax(void) ‘ return iMax t fi Detine a few operators latRange& operator=(int value) t SetValue ( value ); return “this; ] Intange& operator=(double valye) i SetValue (int)value ); return “this; ' virlual int GetValue(void) const ( return Value; Néu ban kiém tra ma nay ban sé thay ring né kiém ching gid tri cia m@t bién sé nguyén nim trong m@t day nhét dink. Ban c6 thé dinh nghia cée gid tri nhd nbdt va lén nhdt riéng ctia ban cho day va Iép sé bdo dim rang bat ky gid tri duge gan vao bién dé nam bén trong day dé. Phan thd vi cua lép nay 1a phn cudi cing gdm ede dong bén dudi chi gidi Define a few operators. Day lA noi cho thay kha nang mo rng cia C++, Chting ta da dinh nghia ede todn ti gan dé lép eta ching ta co thé duge st dung véi cdc kiéu cdi san int va double. Ra rang, ching ta cé thé bé sung thém cde kiéu 6 day ké cd cde chudi vA nhing thi iuong ty, nhung bay gid diéu nay thi di. Vdi Ikha nding nay bay gid ching ta cé thé su dung lép InRange dé luu tri di liéu, hay chae chan ring gid tri trong doi tugng sé luén hgp 1é. Do 1a ngudn an Ui VA né 6 nghia rang khOng con c6 bat ky ly do nao dé viet ma nh sau: 76 Phan il: Cac kigu di ligu int x = get_a_value(); if (x < min I x > max} do_some_errar(); Thay vao dé, chiing ta 6 thé don gidn vist IntRange myRangeObj(min, max); myRangeObj = val; int x = myRangeQbj GetValue(>; Ching ta khéng edn phi kiém tra gid tri tra vé bdi vi ma dai héi né chinh xde. Tuy nhién, c6 mot diéu khde mA ching ta cé thé thye hién véi lop nay va dé 1A dinh nghia cae toan tir ngoai cho né. Kha nang dinh nghia mot todn wh ngodi eve ky c6 Igi béi vi nd cho phép nhang nguéi ding khéng truy c4p ma ngudn cha lép tao nhdng cach moi dé sir dung lép. Day 1a diéu hon todn duy nhat déi vdi C++; khong c6 ngon ngé nao trube dé ¢6 bat et diéu gi nhu né. N&u khong truy cép ma nguén cho Iép nay va ching ta c6 thé ghi dé cde phép ton co bin (chang han nhu nhé hon, lén hon hode bang véi) trong ma riéng cia ching ta. Kha nang thém cde todn tit ngoai lam cho ching ta eé thé thém nhiing tht ma oha lap trinh ban déu da khong nghi cho cde phép todn lép. 3. Thém ma tif Listing 11.2 vao file ma nguén. Ma nay c6 thé dé dang duge thém vao mét ngiy sau dé, trong mot file riéng biét bdi mét nha lap trinh ring biét. Listing 14.2: Cac todn ti lép Range bool operator<(const intRange& aRange, int aValue ) return aRange.GetValue() < aValue; ] bool operator==(const IntRange& aRange, int avalue ) relurn aRange.GetValue() == aValue; \ 4, Luts file m& nguén va dong code editor. Phan ili: Cac kidu di liéu 77 Test Iép Range Sau khi tao mt lip range, ban nén tao mét driver thi nghiém dé khong chi dé bao dim mé cla ban chinh xée mA con hung dan ngudi ta cdch sit dung ma cila ban. ” Sau day 14 cich tao mét driver thit nghiém vén hiéu lve hoa cae logi ddu vao khde nhau ti ngudi dang vA minh hoa lép Range nhu duge dinh nghia trong phan truéc duge su dyng nhu thé nao. 1. Trong code editor ma ban chon, mé file hién cé dé chtta ma cho chudng trinh thit nghiém. Trong vi du nay, chudng trinh thé nghiém duge dat tén 1a ch11_l.epp. 2. Gd nhap ma tif Listing 11.3 vao file. ‘You hon, hay suo chép ma ty file peudn trong thu mue chil eda Web site di kim cia sich nay. Listing 11.3 Driver thir nghiém tép Range int main(int argo, char **argy) 4 IntRange i20(0,20}; for (int ist; icarge: +41 ) { i20 = atoifargu{il); printf(“Setting value to %s, value is now %din”, argyfil, 120. GetValue() j; I 120 = 13: i 20< 19) printf("The value is under 19\n"); else printf("The value is over 19\n"); it (i20< 10) printé("The value is under 10\n"); else printi(’The value i§ over 10.0"); # (120 == 13) 78, Phan Ill: Cac kidu ai ligu orintf("The value is 13\n") else printf("The value is NOT 13\0"); return 0: 1 3. Bién dich va chay dng dung trong hé diéu hank ma ban chon . Néu ban da lam dung moi thi, ban sé thay két quad sau day trong cifa sé shell trong hé diéu hanh: $ faexe 12-130 Setting value to 1, value is now 1 Setting value to 2. value is now 2 Setting value to -1, value is now 0 Setting value to 30, value is now 20 The value is under 19 The value is over 10 The value is 13 Nhu ban e6 thé thay lép Range khéng cho phép ec gid tr} duge gan bén ngoai cde muc nh4p hgp 1é ma ching ta da dinh nghia trong ma nguén. Cho ¢ lép Range ¢6 thé duge sit dung nhu thé nao nhu thé né 1a mot kiéu eo ban vén la mot phan cua ngon ngit ngay ti déu. Ky thudt manh mé dang ngac nhién nay cho ban lam héu nhu bat cf diéu gi ma ban muén (dé 14 bing ma). Tham chi né cho phép chuyén déi truc “p ete kidu dit tidu riéng cla ban thanh kiéu co s6 ma ban mé rong dé chuyén ching true tiép dén cde ham vén mong doi kigu eo ban. Kg. thudt 12: Tao cde kiéu riéng cla ban ‘Tiel kigm thdi gian bing each ut Tao cdc kiéu ma nhiing nguéi ding sé muén sé dung] & Tac mot lop matrix M Thém cde ma tran (matrix) 4 Nhan mat ma tran véi mot gid tri vo husNg us Test Idp matrix Di nhién, m§e du tao cie phin mé rong cia cde kigu cdi sfin thi tL, nhung myc dich thyc sy cia lap trinh trong C++ la tao cae kidu Phan Itt: Cac kidu dd ligu 79 mdi ma nkdng nha thiét ké ngén ngi khong bao gié nght . Vi du, hay tuéng tugng ban can lam viée véi mot ma tran (matrix) trong chuong trinh. Mot ma tran (matrix) den gidn la mét mang gia tri hai chiéu. Ky thuat nay sé hudng dan ban tao mét kiéu moi, mat lop Matrix dé sit dung trong cac phép tinh dé hoa. Dé lam diéu nay, ban nén ghi nhé ring nhing ngudi ding khdng that su phdi hiéu moi thé hoat dong nhu thé.nio trong hau canb; nu ho ¢6 thé sit dung nhdng kigu mdi do nhu thé chung Ja mot phin ty nhiea cia ngén ngd, kha nang nhiéu hon nevéi dang sé suv dung déi tugng va quay trd lp di lp lai nhiéu lin. Déi véi hé thong lép C++, digu d6 c6 nghta 1a myc dich cin ching ta la lam cho déi tugng thanh mot thi gi a6 vén ¢6 dign mao va cach hoxt dong nhu mét kiéu co ban chang han nhu integer hod float. Ilay bat déu véi nhing diém co bin vé yiée tao mét Ip Matrix, Lép nay sé cho phép ban (cudi cing) thuc hién dai sé ma tran co ban - chang han rhu cong hai ma tran, cOng hoac nhan mot hing véi mot ma tran va nhing phép tinh tuung ty. Cu phap tot nhét cho lép Matrix 14 mOt ci phap md phéng gn ging véi cde ma tran thyc té - dé la mét diéu gi dé nhw sau: Matrix m¢ 10, 10); M(5] [5] = 20. 0; Ma nay dink nghia mOt ma tran 10 x 10 va c&p phat khong gian cho né. Phan tt tai 5,5 sau dé duge xdc lap sang gid tri 20.0 va tat cd phan ti khac duge xzic lap sang gid tri 0.0 (von 1a mae dinh). Vi du, chiing ta ed thé tao mot Idp din xuat von thue thi mt ma tran don vi trong d6 cde gid tri duéng chéo eda ma tran Li trdi sang phai duve xe lap sang 1.0 va tat ed gid tri khie duge xdc lap sang 0.0. ‘Tuy nhién, ngay lap tue chung ta gap phéi mét van dé rat nghiém trong. Mae di co thé - that ra Icha dé dang - ghi dé toxin tt [ ] cho m yp, nhung khong thé ghi dé todn ww 1[] (hode (1 [] [), hay bat ky s ip gin Lip khée cho cde mang). Voi gidi han nay, lam thé nao chung ta tao mét Idp von "trong" gidng nhu né cé mot mang hai chia dé - va ban co thé truy edp? Cau tra Ii la mot digu ky 1 C44. Dé xem diéu nay duge thye hién nhu thé nao, hay bat ddu xay dyng ldp Matrix bling cach thye thi khé nding xem Ot ming hai chiéu nhu thé né 1a mot déi tung don. Phan ké tidp sé budng dan ban each lam, Tao ldp Matrix Lp Matrix cho phép ching te xem mt mang hai chiéu nhu thé né 1a mol doi tugng don. DSi voi nyuisi ding lép nay trong nhu thé né 1a mot ming gid tri hai chiéu, nhung no thye hign viée kiém tra Idi va 80. Phan Ill: Cac kiéu di ligu cho phép ngudi dang truy van Idp dé tim nhing thuge tinh ca ban, chang han nhv chiéu réng va chiéu cao cia ma tran. Dé lam diéu nay, cae buée sau day huéng din ban cdch tgo hai lép riéng biét, mot lép vén déng gi mét hang don cla ma tran va mét ldp von chia cdc mang cia cdc hang d6 dé thue thi ma tran hon chinh. 1. Trong code editor ma ban chon, tao mét file méi dé chia ma cho phan thye thi cia file nguén. ‘Trong vi dy nay file duye dét tén la ch12.cpp, mae di ban cd thé sut dung bat ky tén nao ma ban chon. 2. Go nhap ma tir Listing 12.1 vao file. Tot hon hay sao chép ma wi file ngudn trén Web site di kém eiia sdch nay. 3. Luu file nguén. Listing 12.1 Lop Matrix include include #include include class Row [ rivate std::vector< double > Columns; public: Row{ void ) 1 1 Row( int size ) { 4 Initialize the column for ( int i=0: icsize; ++i ) Columns.insert( Columns.end(), 0.0}; } Row( const Row& aCopy } { Phan Ill: Cac kidu od tiéu at std::vector< double >'-const_iterator iter: for { iter = aCopy.Columns. begin iter ‘2 " aCopy.Columns.end{); +siter ) \ double d = ("ter}: Columns insert( Columns. end), dy; } I int size() ' return Columns size(); 4 double’ operator{){int index) it { index < 0 Il index > Columns. size() ) throw “Array Index out of Baunds”; retarn Columns{ index |; if class Malrix t private sté:wwector< Row > Rows; public: Matrix { int rows, int cols ) C for ( int t Row r( cals }; Rows insert Rows.end(), ¢ ): icrows; +41 ) 82 Phan Ul: Cac kiéu di ligu i Row& operator[|(int index) { if ( index < 0 II index > Rows. size(} ) throw “Array Index out of Bounds”, return Rows| index ] | void Print) 1 for ( int r=9; reRows.size(); +41) { for ( int c=0; c 1 trong ma driver thu nghiém. Dong duge dinh d&u > 2 trinh bay vige cong hai ma tran ma sau dé duge hién thi duéi dang Matrix 8. Tuong ty ma duge dinh dau > 3 biéu thi viée nhan mét ma tran véi mét gid tri vo huéng von duge hién thi trong két qua duéi dang Matrix 4, Néu ban lam phép todn, ban sé thay tat ed két qua chinh xde biéu thi rang lép Matrix va ede phuong thie xi ly cia nd lam viée tot. Tiel kiém thdi gian bang cdch mm Binh nghia cac kiéu liét ke Thyc thi lép Enumeration @ Test lép Enumeration Enumeration (kiéu 1iét ké) 1a mot kiéu ngon ngit duge gidi thiéu trong ngon nga C da di trd bdu nhu nguyén ven vao agon ngit C++. ‘ae kidu ligt ké khong phai 1a cdc kidu thyc, nhu cdc Iép. Ban khong inh nghia cde todn th cho cde kiéu liét ké, ban cing khong thé thay déi cach lam vide cia chang. Nhu vdi ede lénh tién xi ly, l@nh enumeration that su 1a mét thd mang tinh cu phdép hon, thay thé ede gia tri hing bang cdc tén dé doe hon, Né eho ban kh& nang doc hoi t6t hon, nhung nd khong kim gi dé thay déi eéch lam vige cha ma. Cae kigu liét _ké cho phép ban su dung nhiing tén ¢6 ¥ nghia cho cdc gid tri va cho phép trinh bién dich thue hién vige kiém tra kiéu tot hon. Khuyét diém eda mOt kiéu lit ké 1A bdi vi né chi 1a mét su thay S ea phap cho mot tri div ligu, ban cé thé dé dang danh lita trinh bién dich bing cach ysin cde gid tr] khong hop 1@ vao kigu ligt ke. Phan Mk: Cac kiéu di liu ot Dang cd ban cia mét kidu ligt ké nhu sau: enum { value 1|=number), value2, values, valuen } EnumerationTypeName: Trong dé truéng la kiéu liét ké ma ching ta tao, cdc tham sd value la nhing gid tri riéng 18 duge dinh nghia trong kiéu liét ké vA number 1A diém khdi dau tuy chon dé bit dau danh sO cde gid tri ligt ké. Vi du, hay xem kiéu ligt ké sau day: enum color { Red = 1 White = 2 Blue } Colortype; ‘Trong vi dy nay, mdi ldn trinh bién dich gap phai Color TypexRed trong ting dung, né higu gid tri la 1, White 1a 2 va Blue 14 3 (bdi vi cdc 86 lién tye trit phi ban xée dinh theo edch khée). Néu etic kiéu ligt ké that su khang thay déi 16 gfe cia ma, tai sao phai ban tam dén chting? Ly do chinh cho cac kiéu liét ké 1a cai thién kha nang doc m&. Dé minh hoa diéu nay ban sé xem mot kF thudt dgn gian lién quan dén cdc kiéu ligt ké ma ban cé thé stk dung dé lam cho ma cla ban hai si dung an toan hon va dé higu hen nhiéu. Ban sé thay cdc kiéu liét ké la mét dang don gidn hon cia lép hiéu lye hod Range duge phat trién trong ky thu: Cée kiéu list ké duge thi hanh bdi trinh bién dich, khéng phdi bdi m& cia ban va doi héi it céng ste hon nhiéu dé thye thi so voi mot lép kiém tra Range. Déng thdi ching khéng manh bang. Cée kidu list ké duge si dung cho ede méi quan tam vé kha nang doc va sy bdo tri hon 1a cho sy hidu lye hoa. Listing 13.1: Chung trinh Enumeration include typedef enum t Red = 0, Yellow. 92 Phén Itt: Cac kigu du ligu Green } TrafficLightGotor, int ChangeLight( int cotor ) ‘ swateh ( color } t case 1: / Red printi(’Changing light to RED. Stop! Nw” break; case 2: 1/ Yellaw printf("Changing light to YELLOW. Slow cown\a"), break; case 3: / Green printt’Changing ight to GREEN. Go for itn"); break; detault: peinti("invaiid light state, Crashing\n"); return “15 , J relurn 0; ' int ChangeLightEnum( TrafficLightColor color ) { switch ( color ) 1 case Red: // Red printf(’Changing light te RED. Stop!!\n"}; break, case Yeliow: // Yellow printi("Changing light to YELLOW. Slow down\n”); break; case Green: // Greea prinif(“Changing light to GREEN. Go for it\n”): break; Phéin Ill: Cac kiéu di idu 93 return 0; ' Thuc thi lép Enumeration Mat k liét ké (enumeration) khi déi tugng thuc té ma né md phong ¢6 nhitng gid tri rit dun gidn, rat ri€ng biét. Vi dy dau tién ndy ra trong ¥ nghi ngay Ue thai 1A mot dén giao théng co ba trang thai: d6, ving va xanh la cay. ‘Trong ede butde sau day, hy tao mot vi du dun gidn sit dung phép dn dy dén giao théng dé minh hoa cach cac kiéu ligt k@ lam viée va cé thé duge st dung trong ting dung cia ban nhu thé nao, 1. Trong code editor ma ban chon, tao mét file méi dé chéa ma cho phan thue thi cua file nguén. Trong vi du nay, file duge dat tén Ja Ch13.cpp, mac di ban ¢6 thé su dung bat ky tén nao ma ban chon. 2. Go nhap ma tir Lisdting 1: 1 vao file. ‘Tét hon, hay sao chép mA ma ban tim thay trén Web site di kom eda sich nay va thay déi tén cia cde hing va bién khi ban chon. 3. Luu file ma nguén. Test tép Enumeration 1. Thém mé vide tot. Ma nay ¢6 thé dé dang duge di chuyén dén mét file riéng biet. No duge dat trong mét file dé tién Igi, Ma minh hog tai sao cde ki ké an toan kiéu (type-safe) hon nhing sO nguyén co ban va tai sao ban c6 thé mudn str dung ede kigu Hit k6 so véi ede kiéu eg ban. int maintint argc, char **arqy) t iu day dé test kiéu lit ké va xde nhdn rang né lam int clr = ChangeLight{ clr }: TralficLightColor ¢ = Red! Changet.ight€numt ¢ ); return 0; t 2. Luu file ma nguén va dong code editor. 94 Phan Ill: Cac kiéu di liu 3. Bién dich va chay Ung dung bang trinh bién dich va thich trén hé digu hanh ua thich. Néu ban da lam ding moi thi, ban sé thay két qua sau day trén eva sé shell. S /a.exe Invalid light state, Crashing Changing light to RED. Stop! ‘Tit ki@m thi gian bang cach: ™ Dinh nghia cdc cau tric ™ Tim higu nhiing uu diém ctia cac cau tric so vdi cdc Iép m Thue thi cae cau tric 4 SU dung cdc cau true dan xual w Hiéu két qua cla Idp cau truc MOL trong nhiing cu trae tha vi nhét duge tao cho ngén ngit lap irinh C la structure (céiu tric). Bai vi né dé cho phép nha phat trién nhém mét cum dif lidu lién quan lai véi nhau va chuyén dir liéu dé dén cae ham khie nhau, ciu urée C++ structure da Ia sy khéi dau cia su dong goi (encapsulation) cho ngén ngit. Khi ngon ngd C++ da duye thiét ké, edu trée 1a thanh phan chink - that ra cde iép C++ don gin 1a nhing phan mé rong cia céu tric. Cée “tinh bién dich" C++ ban dau that sy da 1a nhing chuong trinh hién dich von lay m& C++ va vidt né lai thanh C, sau dé ma nay duge bién dich bing cach st dung trinh bién dich chudn cho ngén ngit dé. Diu nay yéu cdu tat ed phan quan ly cda cde Iép phi duge thye thi trong cre cdu trac. Cau trae C++ struct that ra 1a mét lép ma trong do tat cd thanh vién 1A public Cate cu trée van hién hou trong C++. Thue té, mot cau trae chi 1a mot dp vdn lam cho tél ed thanh vién di liéu cia né tré nén public theo mae dinh. So sanh diéu dé véi mét I6p chudn vdn c6 tét ci thanh vién duge chi dinh 1A private theo mac dinh. Tht ra khong cd sy khvie biét gitte struct foo | int x: int y; Phan tu: Cac kigu du lieu 95 va class foo 1 public: int x: int y 4, lam nhiéu vdi ce edu trac ¢ lam trong C. Cae c&u trie co thé chita nhéng constructor {phuvng thie tao) vA accessor (phuong thie truy c4p). Tham chi ching od thé chia nhiing phuong thie von khong thao Lic trén du liu cua chinh lép. Ngay cd ban ¢é thé co due nhitne iu trdée duve dan xuat tir nhdng cdu true khde. Mac da ede trinh bién dich C++ ban dau da chuyén déi cde lép thanh nhing cau tric, ahung cdc trink bién dich moi hon phan biét gida hai déi tung nay. Mot lép (class) van JA mét struct, nhyng edch hidy thi khdc nhau. Mét struct C++ khong con hodn toan tuong thich nguge véi C nia. Ban khong thé lam diéu gi vdi cae cdiu trie? M@t mat, ban khong thé c6 ede phuung thie iu (virtual). Cée edu trée khéng ehiia table din dinh sin, do dé ching khéng thé ehcta mot ham do. Ro rang, diéu nay cé nghia ring ban khong thé ghi dé cdc phuong thie trong ‘cu trac co sd" cho mét cu trdc dan xuat. Diéu nay cing c6 nghia 1a ching khong thé ¢6 ede virtual destructor (phuong thie buy tao do). Thye thi cdc cau trac Phin nay sé khai thé thi nhing edu trie trong C++ ing nhu nhing gi ban c6 thé thye hidn va khéng thé thye hién véi ching. Ky thudt nay so xem xét edu trae kigu C gée, edu trae C14 edi lidn voi sy Iehdi tuo vA mOL eu Urde C++ hoan chinh hon vén chia nhiing phudng thuc. 1. Trong code editor ma ban chon, tao mot file mdi dé chia ma cho phan thue thi cia file nguén. ¢ dit tén 14 chi4.epp mae di ban cd ‘ma ban chon. ‘Trong vi dy nay, file dui thé sit dung bat ky ten ‘0 nhap ma bén dudi vao file cia ban. typedef struct classic_c_ structure { int x, int y, 96 Phan I: Cac kiéu aii tigu } POINT; Pay sé la cfu tric “chudin" vi né duge thye thi trong C. Bay gid hay thu dicu nay trong C++ voi mét cdi tién nhé dé tan dung nhimg gi ma nyon ngt mang lai. 3. Thém dinh nghia cdu tric sau déy vao file ma nguén cia ban, su dung code editor ua thich. lypedet struct c_plus_plus_structure t int x; inty: ¢_plus_plus_steucture(} 4 CPP_POINT; Cau trae duge list ké trong ma & trén gidng voi céu tric trude, nhung n6 chita mt constructor ty déng khéi tao e4e gid tri trong cdu trac, mot so sudt thudng thay trong sd cde aha ‘4p trinh. 4, 'Thém dinh nghia c&u trie sau day vao file ma nguén, sif dung code editor ua thich: lypedet struct c_plus_plus_enhanced t int x, int y; ¢_plus_plus_enhanced{) void orint() ‘ printt("x = din", x printt("y = Seda", ¥ ); j } CPP_POINTE; Phan Wl: Cac kigu dit liéu 97 ‘Trong trudmg hgp nay, chung ta don gidn mé rong edu tric C++ dé cé mét phuong thide khdc cho phép két xudt nhdng gid tri di ligu cla lip. 5. Thém mét edu tric dan xudt vao file. Nh@p ma sau day vao code editor. Ma nay s@ cho ban thay vige din xudt duge xt ly nhu thé nao trong C++ cho céc c&u tric: typedef struct new_struct » oublic CPP _POINTE int version; new_struct() D2 void print) 1 CPP_POINTE::print(); printf{"version = %din", version }; I } NEW_POINT; 6. Luu file ma nguén. Hiéu két qua Sau khi ban cé ma that sy cho c&u trae duge thye thi, ban nén test dé minh hoa n6 duge sit dung nh thé nao va dé xac thye né 1am vide ret, 1. Thém mai tif Listing 14.1 vao file ma nguén ngay bén duéi cdc dinh nghia edu tréc, Listing 14.1; Test cfu tnic void print_point{ CPP_POINTE8 p) 1 p.printt): } int main(int arge, char **argy} Phan ti: Cac kidu di ligu POINT p: CPP_POINT pt; CPP_POINTE 2: NEW_POINT p3} printf(*POINTAN"); printt("X: "d\n", px); printi("'¥: %d\n", py}: printf(*POINT 1:\n"); printf("X: %din”, 1.x}; printf Sodin", pty); printf("POINT 2:\n"); print_point(p2); printi(“POINT 3:\n"), print_point(p3); J Ma nay don gidn thi hanh nhiing cfu tric khdc nhau a4 duge dinh nghia trong file nguén. Ban st ¢6 thé thay didu gi xdy ra khi tién trinh khdi tao hoan tat va khi né khéng hoan tat. 2. Luu file ma nguén va déng ceode editor. 3. Bién dich va chay chuong trinh, sit dyng trinh bién dich ua thich trén hé diéu hanh ua thich. Néu ban da Jam dung moi thd, ban sé thay két qua sau day trén cita sé shell. $ /aexe POINT: X, 2289768 71 ¥: 1627507534 POINT 1 x0 ¥: 0 POINT 2: x20 ye POINT 3: Ph&n Ill: Cac kiéu di iu 99 Cé vai digu edn chi ¥ 6 day, Déu tién, ban cé thé thay tai sao khong khdi tao cae gid tri di ligu cia mot cdu trde 1a mot diéu khong nén lam (xem cdc dong duge biéu thi bdi > 1). Diém dau tién, céu irde kiéu C dac trung chia ma linh tinh vén cé thé dé dang gay ra nhing van dé nghiém trong trong mat ting dung. Hay tudng tugng moi thi’ sé té hai hon nhu thé nao néu cau trae chia cdc pointer: cic pointer von khong duve khéi tao dé tré vao mot thi nao dé sé tré vao mét phan bo nhé khong hgp 1é hoc té hon, tro vao mat phan bo nhé ma khong nén dude chinh sia. Chi ¥ ring khi mét constructor duge thém vao eau trac, phién ban cai tién ty dong goi constructor (> 2) cho Iép nhu ban mong dgi. Theo cach dé, cdc phan ju truc da duge khdi tao ma khéng ddi hdi bat ky cong viée tY ngudi ding. Hién nhién, ban ciing c6 thé c6 cde constructor doi hoi cée déi sé. That tién loi khi c6 thé két xuat cdc gid tri do ligu cho mét edu trie mét edch nhanh chong va dé ding ma khong lam bé bon chuong trinh bang cae cau lénh printf - nhu bién thé tht ba eda cau trée minh hoa ham thanh vién print( ) cia né. Di nhidn ching ta c6 thé dé dang viéL mét ham chép nhan mét cau true c6é kidu thich hop dé in né ra (nhu ching ta da lam voi kiéu thi hai), nhung sau d6 né phdi xuat hin & moi noi cu trde da duge si dung. Voi cfiu trée dan xudt (new_struct), cé mot sf diéu thd vi cén htu y. ‘Prude tin, béi vi ching ta khong thé ghi dé ham print trong lép co sd, cdu trac khéng in ra dif ligu von chi nam trong ép dan xudt. Pay 1a do gidi han khéng c6 cée virtual table (bang do) trong ede edu trie. Tuy nhién, chung ta cé thé chuyén cdu trie nay dén bat cit ngi nao von chap nhan lép cg sd cia n6 - tuong ty nhu ching ta cé thé vdi mat lép binh thutng. Theo cach nay, edu trée "ed chic nang” nhu mét lp. ‘Dist kigm thai gian bAng cach: w Khai thac nhiing cong dung cila céc hang ™@ Dinh nghia cac hang ™@ Thuc thi cdc hang a Sit dyng tis khod const 100 Phan I: Cac kigu dit ligu Bang cach sit dung cdu trac hang (hoac cau lénh constant) trong ma, cde ting dung ¢6 thé am cho an toan hon, dé doc hon va higu qua hon. Tuy nhién, cdc nha lip trinh thudag rat chodng nggp truée sd cach khde nhau dang ngac nhién ma ho cé thé sit dung cde hing (constant) dén ndi ho den gidn tranh hoan toan edu tric, cho phép trinh bién dich chon lya nhiing gi c6 thé thay déi va khong thé thay déi trong tmg dung. Mat diéu edn luu ¥: cho phép trinh bién dich thyc hién nhémg lya chon cho ban rat hiém khi 1A mét y hay. Ky thuat nay sé khai thac nhiing kha nang khée nhau dé lam vige véi cde hang trong C++ va y nghia cla ching d6i véi ban voi ur each 1A mét oha phat trign cng dung. bé hiéu ré nhat cdc hing lam viée nhu thé nao va cdch ban c6 thé tan dung ching trong ting dung, cdc bude sau day sé trinh bay cho ban mot vi dy dun gian vé viée dinh nghia céc loai hing khde nhau. Chiing ta sé tao mdt file chita cdc hang dé sit dyng lam céc s6 nguyén, 86 dau dong va chudi ky tu. Ban sé thay cach mét hang cé thé true tiép thay thé mdt gid tri #define citing nhu each trinh bién dich cé thé duge sit dung dé kiém tra an toan kiéu e4e phép gan hing nhu thé nao. 1. Trong code editor ina ban chon, tao mét file méi dé chia ma cho phan thyc thi cua file nguén. ‘Trong vi dy nay, file duyc dat ten 1a ch15.epp mac di ban 6 thé si dung bat ky tén ndo ma ban chon. w . Go nhap ma tit Listing 15.1 vao file eda ban. Listing 15.1: Cae hing va dinh nghTa cia ching #include finclude #4 This is a constant value that can be used #/ in place of a #define value const int MaxValues = 100; A Unlike the #define, you can use a const #/ for typesata constants const char *StringName = “Matt Telles”, const double Cost = 100.35; const long MaxLong = 1000000; Phan Il: Cac kigu da liéu 101 Ban c6 thé dinh nghia ce hing hdu nhu cé bat ky hinh dang hoac kieh ¢@. Cée hing 6 thé la cdv sd, chudi, ky ty hoac float. Quan trong hon trinh bién dich sé kiém tra tinh an toan kiéu khi ban gan mot hing vao mét gid tri khae. Vi du, ban duge phép gan cdc gid tri chudi (string) vao céc hing chudi nhu sau: string myString = SteingName: ‘Tuy nhién, ban khéng duge phép gén cdc gid tri MaxLong vao céc sO nguyén (integer) nhu sau: int ial = MaxLong; // The compiler will complain 3. Luu file ma nguon, Di nhién tat ca nhing gi ma viée thém cde hing da thye sy thuc hign la cho ching ta mOt cach khde dé thay thé-cdu lénh #define trong ting dung. Diém chinh thye su cia hing C++ la cung cap cdc chi i@nh bién dich trong cdc ham va Idp nhy ban sé thay ¢ phan ké tiép. Thyc thi cac bién hang Cau lénh const eiing e6 thé duge str dung dé cho trinh bién dich biét mét diéu nao dé khéng duge phép thay déi nhu ching ta sé thay trong ky thudt don gidn nay yon phy thude vao mot Ikhfa canh khéc cia tu Khoa const. Lam theo cde buée sau day dé thay tat ed diéu nay nhut thé nao: 1. Thém mi tir Listing 15.2 vao file ma nguén cil ban. Listing 19.2: M6t ham vdi mGt d6i sO bat kha biéa. #{ Functions can take constant arguments, allowing them // {0 guarantee that values don't change, int func{ const int& x ) { 7 We can do this intz= x #7 We cannot do this. Compile Error: Hix = 19; 31 return x; 1 Ham nay chép nhan mét déi sé cla tham chigu kigu const int. Modifier const cho trinh bién dich biét ring déi sé déu vao khéng thé duge chinh sua. Néu ban khong chd gidi dong duge dénh dau 1a 31, 102 Phan tii: Cac kigu dot teu i cho ban biét rang ban khéng thé ban thay trinh bién dich tao mot chinh sda mét tham chiéu hang. Vi du nay xem xét mét ham yén chép nhan mot déi sd mot sé nguyén, hang x. Chung ta bao cho ed ngudi dimg ham va trinh bién dich biét ring ham nay khong bao gié thay déi gid trj cia adi 86 dé tham chi néu né duge chuyén vao theo tham chiéu. Théng tin nay rat quan trong déi vdi trinh bién dich; voi thong tin nay né ¢6 thé t0i uu hod ham dé né khong edn phai day tré lai gid tri ra khdi ngan xép (stack) va bdo dam ring vi tri bo nhd ma no st dung sé khong thay déi. Diéu nay c6 thé béi vi dir liéu cé thé duge loai bé sau khi ham duge hoan tat. Sau cing, c6 thé né da khong thay déi. Hon nifa, béi vi ching ta biét ring ddu vao 18 mét hang, ching ta 6 thé chuyén vao cde gid tri vén khong déi. Vi du, néu tham chiéu da khong phai [a mgt hing, ban phdi viét dong sau day: int x = 3, int myVal = tune( x ); béi vi trinh bién dich khéng cho phép ban viét dong sau day: int myVal = func (3); Tuy nhién, khi ban dinh nghia di sé dau vao 1a mét hing, trinh bién dich bay gid biét ring vi tri bo nhd that sy dang chia gid tri cia ban (trong tru@ng hgp nay 1A > 3) sé khéng thay déi va né cho ban chuyén vao gid tri sd nguyén mA truéc tién khong gan né vao bat cit gia tri nao: Céch sip xép nay tiét kiém mét vai chu ky CPU va mot sé bé nhé - va ban khéng cdn phdi viét mét sé ma ngé ngdn von khong that sy lam bat ct diéu gi. 2. Su dung code editor, thém ma ti Listing 15.3 vao file ma nguén eda ban. Ky thuat nay minh hoa cach ban cé thé sii dung tir khod const trong mét lép s8 hoan thanh nhimg diéu wong ty ma né thye hign bén ngoai mét class listing. Listing 15.3: Cac hang trong cdc 6p / Classes can have constants in them const int MaxEntries = 10; class Foo t int entries[ Max€ntries ]; public: 47 You can pass in constant references to arguments Phan til: Cac kiéu dif ligu 103 Foot) 1 I Foo{ const Foo& aCopy ) 1 for { int i=0: icMaxEntries; ++i } entriestil = aCopy-entriesti]; t 44 You can relurn constant references trom methods sonst int * getEntries() 1 return &entries|O] ' 11 You can indicate that a method will NOT change #7 anything in the object int getEntry int index ) const { return entries|incex|; } 1 The two can be combined to say that the return value #/ cannot be changed and the object will not change const int& getAConstEntry( int index ) const 1 return entries{index}; k 3. Luu file ma nguén va déng code editor. Nhu ban 6 thé thay cdu trdc const rat linh hoat. N6 e6 thé duge sud trong ma. Né 6 thé duge sit dung dé lung dé bidu thi mt gid tri von duge sit dung dé thay thé mot sé iéu thi mot gid tri trd va von khong thé duge thay déi. No cd thé bidu thi mot phuong thie class chap nhan mat déi 86 ma no khong thay ddi, chang han nhu construc- tor Copy. Ban cé thé tudng tong viét mét constructor Copy d& thay ddi doi tugng ma né sao chép hay khéng? Gid sit ban viét mot ding nado dé nhu sau: Foo 1 =f

You might also like