Professional Documents
Culture Documents
Chng trnh trn y l chng trnh u tin m hu ht nhng ngi hc ngh lp trnh vit u tin v kt qu ca n l vit cu "Hello, World" ln mn hnh. y l mt trong nhng chng trnh n gin nht c th vit bng C++ nhng n bao gm nhng phn c bn m mi chng trnh C++ c. Hy cng xem xt tng dng mt :
// my first program in C++
y l dng ch thch. Tt c cc dng bt u bng hai du s (//) c coi l cht thch m chng khng c bt k mt nh hng no n hot ng ca chng trnh. Chng c th c cc lp trnh vin dng gii thch hay bnh phm bn trong m ngun ca chng trnh. Trong trng hp ny, dng ch thch l mt gii thch ngn gn nhng g m chng trnh chng ta lm.
#include <iostream.h>
Cc cu bt u bng du (#) c dng cho preprocessor (ai dch h ti t ny vi). Chng khng phi l nhng dng m thc hin nhng c dng bo hiu cho trnh dch. y cu lnh #include <iostream.h> bo cho trnh dch bit cn phi "include" th vin iostream. y l mt th vin vo ra c bn trong C++ v n phi c "include" v n s c dng trong chng trnh. y l cch c in s dng th vin iostream
int main ()
Dng ny tng ng vi phn bt u khai bo hm main. Hm main l im m tt c cc chng trnh C++ bt u thc hin. N khng ph thuc vo v tr ca hm ny ( u, cui hay gia ca m ngun) m ni dung ca n lun c thc hin u tin khi chng trnh bt u. Thm vo , do nguyn nhn ni trn, mi chng trnh C++ u phi tn ti mt hm main. Theo sau main l mt cp ngoc n bi v n l mt hm. Trong C++, tt c cc hm m sau l mt cp ngoc n () th c ngha l n c th c hoc khng c tham s (khng bt buc). Ni dung ca hm main tip ngay sau phn khai bo chnh thc c bao trong cc ngoc nhn ( { } ) nh trong v d ca chng ta
cout << "Hello World";
Dng lnh ny lm vic quan trng nht ca chng trnh. cout l mt dng (stream) output chun trong C+ + c nh ngha trong th vin iostream v nhng g m dng lnh ny lm l gi chui k t "Hello World" ra mn hnh. Ch rng dng ny kt thc bng du chm phy ( ; ). K t ny c dng kt thc mt lnh v bt buc phi c sau mi lnh trong chng trnh C++ ca bn (mt trong nhng li ph bin nht ca nhng lp trnh vin C++ l qun mt du chm phy).
return 0;
Lnh return kt thc hm main v tr v m i sau n, trong trng hp ny l 0. y l mt kt thc bnh thng ca mt chng trnh khng c mt li no trong qu trnh thc hin. Nh bn s thy trong cc v d tip theo, y l mt cch ph bin nht kt thc mt chng trnh C++. Chng trnh c cu trc thnh nhng dng khc nhau n tr nn d c hn nhng hon ton khng phi bt buc phi lm vy. V d, thay v vit
int main () { cout << " Hello World "; return 0; }
ta c th vit
int main () { cout << " Hello World "; return 0; }
cng cho mt kt qu chnh xc nh nhau. Trong C++, cc dng lnh c phn cch bng du chm phy ( ;). Vic chia chng trnh thnh cc dng ch nhm cho n d c hn m thi.
Cc ch thch.
Cc ch thch c cc lp trnh vin s dng ghi ch hay m t trong cc phn ca chng trnh. Trong C++ c hai cch ch thch
// Ch thch theo dng /* Ch thch theo khi */
Ch thch theo dng bt u t cp du x (//) cho n cui dng. Ch thch theo khi bt u bng /* v kt thc bng */ v c th bao gm nhiu dng. Chng ta s thm cc ch thch cho chng trnh :
/* my second program in C++ with more comments */ #include <iostream.h> int main () { cout << "Hello World! "; says Hello World! Hello World! I'm a C++ program
//
cout << "I'm a C++ program"; // says I'm a C++ program return 0; }
Nu bn vit cc ch thch trong chng trnh m khng s dng cc du //, /* hay */, trnh dch s coi chng nh l cc lnh C++ v s hin th cc li.
Thm vo , mt s biu din khc ca cc ton t (operator) cng khng c dng lm tn v chng l nhng t c dnh ring trong mt s trng hp.
and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq
Trnh dch ca bn c th thm mt t dnh ring c trng khc. V d, rt nhiu trnh dch 16 bit (nh cc trnh dch cho DOS) cn c th cc t kho far, huge v near. Ch : Ngn ng C++ l "case sensitive" c ngha l phn bit ch hoa ch thng. Do vy bin RESULT khc vi result cng nh Result.
Cc kiu d liu
Khi lp trnh, chng ta lu tr cc bin trong b nh ca my tnh nhng my tnh phi bit chng ta mun lu tr g trong chng v cc kiu d liu khc nhau s cn lng b nh khc nhau. 3
B nh ca my tnh chng ta c t chc thnh cc byte. Mt byte l lng b nh nh nht m chng ta c th qun l. Mt byte c th dng lu tr mt loi d liu nh nh l kiu s nguyn t 0 n 255 hay mt k t. Nhng my tnh c th x l cc kiu d liu phc tp hn bng cch gp nhiu byte li vi nhau, nh s nguyn di hay s thp phn. Tip theo bn s c mt danh sch cc kiu d liu c bn trong C++ cng nh min gi tr m chng c th biu din Tn char short long S byte M t 1 2 4 Min gi tr c du: -128 to 127 K t hay kiu s nguyn 8-bit khng du: 0 to 255 c du: -32763 to 32762 kiu s nguyn 16-bit khng du: 0 to 65535 c du:-2147483648 to kiu s nguyn 32-bit 2147483647 khng du: 0 to 4294967295 S nguyn. di ca n ph thuc vo h thng, nh trong MS-DOS n l 16-bit, trnXem short, long Windows 9x/2000/NT l 32 bit... Dng du phy ng 3.4e + / - 38 (7 digits) Dng du phy ng vi chnh xc gp 1.7e + / - 308 (15 digits) i Dng du phy ng vi chnh xc hn 1.2e + / - 4932 (19 digits) na Gi tr logic. N mi c thm vo chun ANSI-C++. Bi vy khng phi tt c cctrue hoc false trnh dch u h tr n.
int float
* 4
Ngoi cc kiu d liu c bn ni trn cn tn ti cc con tr v cc tham s khng kiu (void) m chng ta s xem xt sau.
Khai bo mt bin
c th s dng mt bin trong C++, u tin chng ta phi khai bo n, ghi r n l kiu d liu no. Chng ta ch cn vit tn kiu (nh int, short, float...) tip theo sau l mt tn bin hp l. V d
int float mynumber; a;
Dng u tin khai bo mt bin kiu int vi tn l a. Dng th hai khai bo mt bin kiu float vi tn mynumber. Sau khi c khai bo, cc bin trn c th c dng trong phm vi ca chng trong chng trnh. Nu bn mun khai bo mt vi bin c cng mt kiu v bn mun tit kim cng sc vit bn c th khai bo chng trn mt dng, ngn cch cc tn bng du phy. V d
int a, b, c;
Cc kiu s nguyn (char, short, long and int) c th l s c du hay khng du tu theo min gi tr m chng ta cn biu din. V vy khi xc nh mt kiu s nguyn chng ta t t kho signed hoc unsigned trc tn kiu d liu. V d:
unsigned signed int MyAccountBalance; short NumberOfSons;
Nu ta khng ch r signed or unsigned n s c coi l c du, v vy trong khai bo th hai chng ta c th vit :
int MyAccountBalance
cng hon ton tng ng vi dng khai bo trn. Trong thc t, rt t khi ngi ta dng n t kho signed. Ngoi l duy nht ca lut ny kiu char. Trong chun ANSI-C++ n l kiu d liu khc vi signed char v unsigned char. c th thy r hn vic khai bo trong chng trnh, chng ta s xem xt mt on m C++ v d nh sau:
// operating with variables #include <iostream.h> int main () { // declaring variables: int a, b; int result; // process: a = 5; b = 2; a = a + 1; result = a - b; // print out the result: cout << result; // terminate the program: return 0; 4
ng lo lng nu nh vic khai bo c v hi l lng vi bn. Bn s thy phn chi tit cn li trong phn tip theo
Khi to cc bin
5
Khi khai bo mt bin, gi tr ca n mc nhin l khng xc nh. Nhng c th bn s mun n mang mt gi tr xc nh khi c khai bo. lm iu , bn ch cn vit du bng v gi tr bn mun bin s mang:
type identifier = initial_value ;
V d, nu chng ta mun khai bo mt bin int l a cha gi tr 0 ngay t khi khi to, chng ta s vit :
int a = 0;
B xung vo cch khi to kiu C ny, C++ cn c thm mt cch mi khi to bin bng cch bc mt cp ngoc n sau gi tr khi to. V d :
int a (0);
Cc hng s
Mt hng s l bt k mt biu thc no mang mt gi tr c nh, nh: Cc s nguyn 6
chng l cc hng mang gi tr s. Ch rng khi biu din mt hng kiu s chng ta khng cn vit du ngoc kp hay bt k du hiu no khc. Thm vo nhng s h c s 10 ( ci m tt c chng ta u bit) C++ cn cho php s dng cc hng s c s 8 v 16. biu din mt s h c s 8 chng ta t trc n k t 0, biu din s h c s 16 chng ta t trc n hai k t 0x. V d:
75 0113 0x4b // C s 10 // c s 8 // c s 16
Chng biu din cc s vi phn thp phn v/hoc s m. Chng c th bao gm phn thp phn, k t e (biu din 10 m...).
3.14159 // 3.14159 6.02e23 // 6.02 x 1023 1.6e-19 // 1.6 x 10-19 3.0 // 3.0
K t v xu k t
Trong C++ cn tn ti cc hng khng phi kiu s nh:
world"
Hai biu thc u tin biu din cc k t n, cc k t c t trong du nhy n ('), hai biu thc tip theo biu thc cc xu k t c t trong du nhy kp ("). Khi vit cc k t n hay cc xu k t cn phi chng trong cc du nhy phn bit vi cc tn bin hay cc t kho. Ch :
x 'x'
x tr n bin x trong khi 'x' l k t hng 'x'. Cc k t n v cc xu k t c mt tnh cht ring bit l cc m iu khin. Chng l nhng k t c bit m khng th c vit bt k u khc trong chng trnh nh l m xung dng (\n) hay tab (\t). Tt c u bt u bng du x ngc (\). Sau y l danh sch cc m iu khin :
\n
xung dng 7
\r \t \v \b \f \a \' \" \ \\
li v u dng k t tab cn thng theo chiu dc backspace sang trang Ku bp du nhy n du nhy kp du hi k t x ngc
V d:
'\n' '\t' "Left "one\ntwo\nthree"
\t
Right"
Thm vo , biu din mt m ASCII bn cn s dng k t x ngc (\) tip theo l m ASCII vit trong h c s 8 hay c s 16. Trong trng hp u m ASCII c vit ngay sau du s ngc, trong trng hp th hai, s dng s trong h c s 16 bn cn vit k t x trc s (v d \x20 hay \x4A). Cc hng chui k t c th c vit trn nhiu dng nu mi dng c kt thc bng mt du s ngc (\):
"string two lines" expressed in \
Bn c th ni mt vi hng xu k t ngn cch bng mt hay vi du trng, k t tab, xung dng hay bt k k t trng no khc. "we form" "a unique" "string" "of characters"
V d:
#define #define #define WIDTH 100 PI NEWLINE 3.14159265 '\n'
chng nh ngha ba hng s mi. Sau khi khai bo bn c th s dng chng nh bt k cc hng s no khc, v d
circle = cout << NEWLINE; 2 * PI * r;
Trong thc t vic duy nht m trnh dch lm khi n tm thy mt ch th #define l thay th cc tn hng ti bt k ch no chng xut hin (nh trong v d trc, PI, NEWLINE hay WIDTH) bng gi tr m chng c nh ngha. V vy cc hng s #define c coi l cc hng s macro Ch th #define khng phi l mt lnh thc thi, n l ch th tin x l (preprocessor), l l do trnh dch coi c dng l mt ch th v dng khng cn kt thc bng du chm phy. Nu bn thm du chm phy vo cui dng, n s c coi l mt phn ca gi tr nh ngha hng.
Trong trng hp kiu khng c ch r (nh trong v d cui) trnh dch s coi n l kiu int.
Bi 1.3: Cc ton t
Qua bi trc chng ta bit n s tn ti ca cc bin v cc hng. Trong C++, thao tc vi chng ta s dng cc ton t, l cc t kho v cc du khng c trong bng ch ci nhng li c trn hu ht cc bn phm trn th gii. Hiu bit v chng l rt quan trng v y l mt trong nhng thnh phn c bn ca ngn ng C++. Ton t gn (=). Ton t gn dng gn mt gi tr no cho mt bin
a = 5;
gn gi tr nguyn 5 cho bin a. V tri bt buc phi l mt bin cn v phi c th l bt k hng, bin hay kt qu ca mt biu thc. Cn phi nhn mnh rng ton t gn lun c thc hin t tri sang phi v khng bao gi o ngc
a = b;
gn gi tr ca bin a bng gi tr ang cha trong bin b. Ch rng chng ta ch gn gi tr ca b cho a v s thay i ca b sau s khng nh hng n gi tr ca a. Mt thuc tnh ca ton t gn trong C++ gp phn gip n vt ln cc ngn ng lp trnh khc l vic cho php v phi c th cha cc php gn khc. V d: 9
a = 2 + (b = 5);
tng ng vi
b a = 2 + b; = 5;
V vy biu thc sau cng hp l trong C++ a = b = c = 5; gn gi tr 5 cho c ba bin a, b v c Cc ton t s hc ( +, -, *, /, % ) Nm ton t s hc c h tr bi ngn ng l: + cng - tr * nhn / chia % ly phn d (trong php chia) Th t thc hin cc ton t ny cng ging nh chng c thc hin trong ton hc. iu duy nht c v hi l i vi bn l php ly phn d, k hiu bng du phn trm (%). y chnh l php ton ly phn d trong php chia hai s nguyn vi nhau. V d, nu a = 11 % 3;, bin a s mang gi tr 2 v 11 = 3*3 +2. Cc ton t gn phc hp (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=) Mt c tnh ca ngn ng C++ lm cho n ni ting l mt ngn ng sc tch chnh l cc ton t gn phc hp cho php chnh sa gi tr ca mt bin vi mt trong nhng ton t c bn sau:
value += increase; tng ng vi value = value + a -= 5; tng ng vi a = a a /= b; tng ng vi a = a price *= units + 1; tng ng vi price = price * (units + 1); increase; 5; / b;
v tng t cho tt c cc ton t khc. Tng v gim. Mt v d khc ca vic tit kim khi vit m lnh l ton t tng (++) v gim (--). Chng tng hoc gim gi tr cha trong mt bin i 1. Chng tng ng vi +=1 hoc -=1. V vy, cc dng sau l tng ng:
a++; a+=1; a=a+1;
Mt tnh cht ca ton t ny l n c th l tin t hoc hu t, c ngha l c th vit trc tn bin (++a) hoc sau (a++) v mc d trong hai biu thc rt n gin n c cng ngha nhng trong cc thao tc khc khi m kt qu ca vic tng hay gim c s dng trong mt biu thc th 10
chng c th c mt khc bit quan trng v ngha: Trong trng hp ton t c s dng nh l mt tin t (++a) gi tr c tng trc khi biu thc c tnh v gi tr tng c s dng trong biu thc; trong trng hp ngc li (a++) gi tr trong bin a c tng sau khi tnh ton. Hy ch s khc bit : V d 1
B=3; A=++B; // A is 4, B is 4
V d 2
B=3; A=B++; // A is 3, B is 4
Cc ton t quan h ( ==, !=, >, <, >=, <= ) c th so snh hai biu thc vi nhau chng ta c th s dng cc ton t quan h. Theo chun ANSI-C++ th gi tr ca thao tc quan h ch c th l gi tr logic - chng ch c th c gi tr true hoc false, tu theo biu thc kt qu l ng hay sai. Sau y l cc ton t quan h bn c th s dng trong C++ == Bng != Khc > Ln hn < Nh hn > = Ln hn hoc bng < = Nh hn hoc bng V d: s tr gi tr false s tr gi tr true tt nhin thay v s dng cc s, chng ta c th s dng bt c biu thc no. Cho a=2, b=3 v c=6 (a*b >= c) s tr gi tr true. (b+4 < a*c) s tr gi tr false
(7 == 5) (6 >= 6)
Cn ch rng = (mt du bng) lf hon ton khc vi == (hai du bng). Du u tin l mt ton t gn ( gn gi tr ca biu thc bn phi cho bin bn tri) v du cn li (==) l mt ton t quan h nhm so snh xem hai biu thc c bng nhau hay khng. Trong nhiu trnh dch c trc chun ANSI-C++ cng nh trong ngn ng C, cc ton t quan h khng tr v gi tr logic true hoc false m tr v gi tr int vi 0 tng ng vi false cn gi tr khc 0 (thng l 1) th tng ng vi true. Cc ton t logic ( !, &&, || ). Ton t ! tng ng vi ton t logic NOT, n ch c mt i s pha bn phi v vic duy nht m n lm l i ngc gi tr ca i s t true sang false hoc ngc li. V d: !(5 == 5) tr v false v biu thc bn phi (5 == 5) c gi trtrue. !(6 <= 4) tr v true v (6 <= 4)c gi tr false. !true tr v false. !false tr v true. 11
Ton t logic && v || c s dng khi tnh ton hai biu thc ly ra mt kt qu duy nht. Chng tng ng vi cc ton t logic AND v OR. Kt qu ca chng ph thuc vo mi quan h ca hai i s: i s th nht i s th haiKt quKt qu a && b a || b a b true true true true true false false true false true false true false false false false V d:
( (5 == 5) && (3 > 6) ) tr v false ( true ( (5 == 5) || (3 > 6)) tr v true ( true || false ). && false ).
Ton t iu kin ( ? ). Ton t iu kin tnh ton mt biu thc v tr v mt gi tr khc tu thuc vo biu thc l ng hay sai. Cu trc ca n nh sau:
condition ? result1 : result2
Nu condition l true th gi tr tr v s l result1, nu khng gi tr tr v l result2. 7==5 ? 4 : 3 tr v 3 v 7 khng bng 5. 7==5+2 ? 4 : 3 tr v 4 v 7 bng 5+2. 5>3 ? a : b tr v a, v 5 ln hn 3. a>b ? a : b tr v gi tr ln hn, a hoc b. Cc ton t thao tc bit ( &, |, ^, ~, <<, >> ). Cc ton t thao tc bit thay i cc bit biu din mt bin, c ngha l thay i biu din nh phn ca chng ton t asm M t & AND Logical AND | OR Logical OR ^ XOR Logical exclusive OR ~ NOT o ngc bit << SHL Dch bit sang tri >> SHR Dch bit sang phi Cc ton t chuyn i kiu Cc ton t chuyn i kiu cho php bn chuyn i d liu t kiu ny sang kiu khc. C vi cch lm vic ny trong C++, cch c bn nht c tha k t ngn ng C l t trc biu thc cn chuyn i tn kiu d liu c bc trong cp ngoc n (), v d:
int float i = (int) f; f = i; 3.14;
12
on m trn chuyn s thp phn 3.14 sang mt s nguyn (3). y, ton t chuyn i kiu l (int). Mt cch khc lm iu ny trong C++ l s dng cc constructors ( mt s sch thut ng ny c dch l cu t nhng ti thy n c v khng xui tai lm) thay v dng cc ton t : t trc biu thc cn chuyn i kiu tn kiu mi v bao bc biu thc gia mt cp ngoc n.
i = int ( f );
C hai cch chuyn i kiu u hp l trong C++. Thm vo ANSI-C++ cn c nhng ton t chuyn i kiu mi c trng cho lp trnh hng i tng. sizeof() Ton t ny c mt tham s, c th l mt kiu d liu hay l mt bin v tr v kch c bng byte ca kiu hay i tng .
a = sizeof (char);
a s mang gi tr 1 v kiu char lun c kch c 1 byte trn mi h thng. Gi tr tr v ca sizeof l mt hng s v vy n lun lun c tnh trc khi chng trnh thc hin. Cc ton t khc Trong C++ cn c mt s cc ton t khc, nh cc ton t lin quan n con tr hay lp trnh hng i tng. Chng s c ni n c th trong cc phn tng ng.
Th t u tin ca cc ton t
Khi vit cc biu thc phc tp vi nhiu ton hng cc bn c th t hi ton hng no c tnh trc, ton hng no c tnh sau. V d nh trong biu thc sau:
a = 5 + 7 % 2
vi
kt
qu
6,
hoc
Cu tr li ng l biu thc u tin. V nguyn nhn ni trn, ngn ng C++ thit lp mt th t u tin gia cc ton t, khng ch ring cc ton t s hc m tt c cc ton t c th xut hin trong C++. Th t u tin ca chng c lit k trong bng sau theo th t t cao xung thp. Th t Ton t M t :: 1 scope () [ ] -> . sizeof 2 ++ -3 tng/gim ~ o ngc bit ! NOT & * Ton t con tr 13 Associativity Tri Tri Phi
(type) + -
4 5 6 7 8 9 10 11 12 13
Chuyn i kiu Dng hoc m Ton t s hc Ton t s hc Dch bit Ton t quan h Ton t quan h Ton t thao tc bit Ton t logic Ton t iu kin gn
Tri Tri Tri Tri Tri Tri Tri Phi Phi Tri
Du phy
Associativity nh ngha trong trng hp c mt vi ton t c cng th t u tin th ci no s c tnh trc, ton t pha xa nht bn phi hay l xa nht bn tri. Nu bn mun vit mt biu thc phc tp m li khng chc lm v th t u tin ca cc ton t th nn s dng cc ngoc n. Cc bn nn thc hin iu ny v n s gip chng trnh d c hn.
14
Ton t << c gi l ton t chn v n chn d liu i sau n vo dng d liu ng trc. Trong v d trn n chn chui "Output sentence", hng s 120 v bin x vo dng d liu ra cout.Ch rng dng u tin chng ta s dng du ngoc kp v l mt chui k t. Khi chng ta mun s dng cc hng xu k t ta phi t chng trong cp du ngoc kp chng c th c phn bit vi cc bin. V d, hai lnh sau y l hon ton khc nhau:
cout << "Hello"; cout << Hello; // Hin th Hello ln mn hnh // Hin th ni dung ca bin Hello ln mn hnh
Cu lnh trn s in thng bo Hello, I am a C++ sentence ln mn hnh. S tin li ca vic s dng lp li ton t chn (<<) th hin r khi chng ta mun hin th nhiu bin v hng hn l ch mt bin:
cout << "Hello, I am " << age << " years old and my email address is " << email_add; Cn phi nhn mnh rng cout khng nhy xung dng sau khi xut d liu, v vy hai cu lnh sau : cout << "This cout << "This is another sentence."; is a sentence.";
Bi vy khi mun xung dng chng ta phi s dng k t xung dng, trong C++ l \n:
cout << "First cout << "Second sentence.\nThird sentence."; sentence.\n ";
15
sentence. sentence.
s in ra mn hnh:
First Second sentence. sentence.
Tham s endl c mt tc dng c bit khi n c dng vi cc dng d liu s dng b m: cc b m s c flushed ( chuyn ton b thng tin t b m ra dng d liu). Tuy nhin, theo mc nh cout khng s dng b m.
khai bo bin age c kiu int v i nhp d liu t cin (bn phm) lu tr n trong bin kiu nguyn ny. ch bt u s l d liu nhp t bn phm sau khi phm Enter c g. V vy d bn ch nhp mt k t th cin vn s kin nhn ch cho n khi bn g phm Enter.
cin // i/o example #include <iostream.h> int main () { int i; cout << "Please enter an integer value: "; cin >> i; cout << "The value you entered is " << i; cout << " and its double is " << i*2 << ".\n"; return 0; } Please enter an integer value: The value you entered is 702 and double is 1404. 702 its
Ngi s dng chng trnh c th l mt trong nhng nguyn nhn gy ra li trong mt chng trnh n gin s dng cin (nh chng trnh trn). Trong khi bn mun nhn mt s nguyn th ngi s dng li nhp vo tn ca h (l mt xu k t). Kt qu l chng trnh s chy sai v khng phi l nhng g m chng trnh mong i t ngi dng. Bi vy khi bn s dng d liu nhp vo t cin bn phi tin chc 16
rng ngi dng s hon ton hp tc v rng anh ta s khng nhp tn ca mnh khi chng trnh yu cu nhp s nguyn. Sau ny, khi nghin cu vic s dng cc xu k t chng ta s xem xt cc gii php kh thi gii quyt cc li loi ny. Bn c th dng cin nhp mt lc nhiu d liu t ngi dng:
cin >> a >> b;
tng ng vi
cin cin >> b; >> a;
Trong c hai trng hp ngi s dng phi cung cp hai d liu, mt cho bin a v mt cho bin b v c ngn cch bi mt du trng hp l: mt du cch, du tab hay k t xung dng. Trong trng hp kiu khng c ch r (nh trong v d cui) trnh dch s coi n l kiu int.
17
trong condition l biu thc s c tnh ton. Nu iu kin l true, statement c thc hin. Nu khng statement b b qua (khng thc hin) v chng trnh tip tc thc hin lnh tip sau cu trc iu kin. V d, on m sau y s vit x is 100 ch khi bin x cha gi tr 100:
if (x == 100) cout << "x is 100";
Nu chng ta mun c hn mt lnh c thc hin trong trng hp condition l true chng ta c th ch nh mt khi lnh bng cch s dng mt cp ngoc nhn { }:
if (x == 100) {
Chng ta cng c th ch nh iu g s xy ra nu iu kin khng c tho mn bng cch su dng t kho else. N c s dng cng vi if nh sau:
if (condition) statement1 else statement2
18
V d:
if (x == 100) cout else cout << "x is not 100"; << "x is 100";
Cu trc if + else c th c mc ni kim tra nhiu gi tr. V d sau y s kim tra xem gi tr cha trong bin x l dng, m hay bng khng.
if (x > 0) cout << "x is positive"; else if (x < 0) cout << "x is negative"; else cout << "x is 0";
Cc cu trc lp
Mc ch ca cc vng lp l lp li mt thao tc vi mt s ln nht nh hoc trong khi mt iu kin no cn tho mn. Vng lp while . Dng ca n nh sau:
while (expression) statement
v chc nng ca n n gin ch l lp li statement khi iu kin expression cn tho mn. V d, chng ta s vit mt chng trnh m ngc s dng vo lp while:
// custom countdown using while Enter the starting number #include <iostream.h> 8, 7, 6, 5, 4, 3, 2, 1, FIRE! int main () { int n; cout << "Enter the starting number > "; cin >> n; while (n>0) { cout << n << ", "; --n; } cout << "FIRE!"; return 0; } > 8
19
Khi chng trnh chy ngi s dng c yu cu nhp vo mt s m ngc. Sau , khi vng lp while bt u nu s m ngi dng nhp vo tho mn iu kin iu kin n>0 khi lnh s c thc hin mt s ln khng xc nh chng no iu kin (n>0) cn c tho mn. Chng ta cn phi nh rng vng lp phi kt thc mt im no , v vy bn trong vng lp chng ta phi cung cp mt phng thc no buc condition tr thnh sai nu khng th n s lp li mi mi. Trong v d trn vng lp phi c lnh --n; lm cho condition tr thnh sai sau mt s ln lp. Vng lp do-while Dng thc:
do statement while (condition);
Chc nng ca n l hon ton ging vng lp while ch tr c mt iu l iu kin iu khin vng lp c tnh ton sau khi statement c thc hin, v vy statement s c thc hin t nht mt ln ngay c khi condition khng bao gi c tho mn. V d, chng trnh di y s vit ra bt k s no m bn nhp vo cho n khi bn nhp s 0.
// number echoer #include <iostream.h> int main () { unsigned long n; do { cout << "Enter number (0 to end): "; cin >> n; cout << "You entered: " << n << "\n"; } while (n != 0); return 0; } Enter number (0 to end): 12345 You entered: 12345 Enter number (0 to end): 160277 You entered: 160277 Enter number (0 to end): 0 You entered: 0
Vng lp do-while thng c dng khi iu kin kt thc vng lp nm trong vng lp, nh trong v d trn, s m ngi dng nhp vo l iu kin kim tra kt thc vng lp. Nu bn khng nhp s 0 trong v d trn th vng lp s khng bao gi chm dt. Vng lp for . Dng thc:
for (initialization; condition; increase) statement;
v chc nng chnh ca n l lp li statement chng no condition cn mang gi tr ng, nh trong vng lp while. Nhng thm vo , for cung cp ch dnh cho lnh khi to v lnh tng. V vy vng lp ny c thit k c bit lp li mt hnh ng vi mt s ln xc nh. Cch thc hot ng ca n nh sau: 1, initialization c thc hin. Ni chung n t mt gi kh ban u cho bin iu khin. Lnh ny c thc hin ch mt ln. 2, condition c kim tra, nu n l ng vng lp tip tc cn nu khng vng lp kt thc v statement c b qua. 20
3, statement c thc hin. N c th l mt lnh n hoc l mt khi lnh c bao trong mt cp ngoc nhn. 4, Cui cng, increase c thc hin tng bin iu khin v vng lp quay tr li bc 2. Sau y l mt v d m ngc s dng vng for.
// countdown using a for loop #include <iostream.h> int main () { for (int n=10; n>0; n--) { cout << n << ", "; } cout << "FIRE!"; return 0; } 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE!
Phn khi to v lnh tng khng bt buc phi c. Chng c th c b qua nhng vn phi c du chm phy ngn cch gia cc phn. V vy, chng ta c th vit for (;n<10;) hoc for (;n<10;n++). Bng cch s dng du phy, chng ta c th dng nhiu lnh trong bt k trng no trong vng for, nh l trong phn khi to. V d chng ta c th khi to mt lc nhiu bin trong vng lp:
for ( n=0, i=100 ; n!=i ; n++, i-- ) { // ci g y cng c... }
21
} } return 0; }
Lnh continue. Lnh continue lm cho chng trnh b qua phn cn li ca vng lp v nhy sang ln lp tip theo. V d chng ta s b qua s 5 trong phn m ngc:
// break loop example #include <iostream.h> int main () { for (int n=10; n>0; n--) { if (n==5) continue; cout << n << ", "; } cout << "FIRE!"; return 0; } 10, 9, 8, 7, 6, 4, 3, 2, 1, FIRE!
Lnh goto. Lnh ny cho php nhy v iu kin ti bt k im no trong chng trnh. Ni chung bn nn trnh dng n trong chng trnh C++. Tuy nhin chng ta vn c mt v d dng lnh goto m ngc:
// goto loop example #include <iostream.h> int main () { int n=10; loop: ; cout << n << ", "; n--; if (n>0) goto loop; cout << "FIRE!"; return 0; } 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE!
c dng bi mt s h iu hnh hoc c th c dng bi cc chng trnh gi. Theo quy c, m tr v 0 c ngha l chng trnh kt thc bnh thng cn cc gi tr khc 0 c ngha l c li.
exit code
22
block of instructions 1 break; case constant2: block of instructions 2 break; . . . default: default block of instructions }
N hot ng theo cch sau: switch tnh biu thc v kim tra xem n c bng constant1 hay khng, nu ng th n thc hin block of instructions 1 cho n khi tm thy t kho break, sau nhy n phn cui ca cu trc la chn switch. Cn nu khng, switch s kim tra xem biu thc c bng constant2 hay khng. Nu ng n s thc hin block of instructions 2 cho n khi tm thy t kho break. Cui cng, nu gi tr biu thc khng bng bt k hng no c ch nh trn (bn c th ch nh bao nhiu cu lnh case tu thch), chng trnh s thc hin cc lnh trong phn default: nu n tn ti v phn ny khng bt buc phi c. Hai on m sau l tng ng:
v d switch
switch (x) { case 1: cout << "x is 1"; break; case 2: cout << "x is 2"; break; default: cout << "value of x unknown"; }
if-else tng ng
if (x == 1) { cout << "x is 1"; } else if (x == 2) { cout << "x is 2"; } else { cout << "value of x unknown"; }
Ti ni trn rng cu trc ca lnh switch hi c bit. Ch s tn ti ca lnh break cui mi khi lnh. iu ny l cn thit v nu khng th sau khi thc hin block of instructions 1 chng trnh s khng nhy n cui ca lnh switch m s thc hin cc khi lnh tip theo cho n khi n tm thy lnh break u tin. iu ny khin cho vic t cp ngoc nhn { } trong mi trng hp l khng cn thit v c th c dng khi bn mun thc hin mt khi lnh cho nhiu trng hp khc nhau, v d:
switch (x) { case 1: case 2: case 3: cout << "x is 1, 2 or 3"; break; default: cout << "x is not 1, 2 nor 3"; }
23
Ch rng lnh switch ch c th c dng so snh mt biu thc vi cc hng. V vy chng ta khng th t cc bin (case (n*2):) hay cc khong (case (1..3):) v chng khng phi l cc hng hp l. Nu bn cn kim tra cc khong hay nhiu gi tr khng phi l hng s hy kt hp cc lnh if v else if.
Bi 2.2 Hm (I)
Hm l mt khi lnh c thc hin khi n c gi t mt im khc ca chng trnh. Dng thc ca n nh sau:
type name ( argument1, argument2, ...) statement
trong : type l kiu d liu c tr v ca hm name l tn gi ca hm. arguments l cc tham s (c nhiu bao nhiu cng c tu theo nhu cu). Mt tham s bao gm tn kiu d liu sau l tn ca tham s ging nh khi khai bo bin (v d int x) v ng vai tr bn trong hm nh bt k bin no khc. Chng dng truyn tham s cho hm khi n c gi. Cc tham s khc nhau c ngn cch bi cc du phy. statement l thn ca hm. N c th l mt lnh n hay mt khi lnh. Di y l v d u tin v hm:
// function example #include <iostream.h> int addition (int a, int b) { int r; r=a+b; return (r); } int main () { int z; z = addition (5,3); cout << "The result is " << z; return 0; } The result is 8
c th hiu c on m ny, trc ht hy nh li nhng iu ni bi u tin: mt chng trnh C++ lun bt u thc hin t hm main. V vy chng ta bt u t y. Chng ta c th thy hm main bt u bng vic khai bo bin z kiu int. Ngay sau l mt li gi ti hm addition. Nu chng ta s thy s tng t gia cu trc ca li gi hm vi khai bo ca hm:
24
Cc tham s c vai tr tht r rng. Bn trong hm main chng ta gi hm addition v truyn hai gi tr: 5 v 3 tng ng vi hai tham s int a v int b c khai bo cho hm addition. Vo thi im hm c gi t main, quyn iu khin c chuyn sang cho hm addition. Gi tr ca c hai tham s (5 v 3) c copy sang hai bin cc b int a v int b bn trong hm. Dng lnh sau:
return (r);
kt thc hm addition, v tr li quyn iu khin cho hm no gi n (main) v tip tc chng trnh ci im m n b ngt bi li gi n addition. Nhng thm vo , gi tr c dng vi lnh return (r) chnh l gi tr c tr v ca hm.\
Gi tr tr v bi mt hm chnh l gi tr ca hm khi n c tnh ton. V vy bin z s c c gi tr c tr v bi addition (5, 3), l 8. Phm vi hot ng ca cc bin [nhc li] Bn cn nh rng phm vi hot ng ca cc bin khai bo trong mt hm hay bt k mt khi lnh no khc ch l hm hay khi lnh v khng th s dng bn ngoi chng. V d, trong chng trnh v d trn, bn khng th s dng trc tip cc bin a, b hay r trong hm main v chng l cc bin cc b ca hm addition. Thm vo bn cng khng th s dng bin z trc tip bn trong hm addition v n lm bin cc b ca hm main. Tuy nhin bn c th khai bo cc bin ton cc c th s dng chng bt k u, bn trong hay bn ngoi bt k hm no. lm vic ny bn cn khai bo chng bn ngoi mi hm hay cc khi lnh, c ngha l ngay trong thn chng trnh. y l mt v d khc v hm:
// function example #include <iostream.h> int subtraction (int a, int b) { int r; r=a-b; return (r); } The first The second The third The fourth result is result result result 6 is is is 5 5 2
25
int main () { int x=5, y=3, z; z = subtraction (7,2); cout << "The first result is " << '\n'; cout << "The second result is subtraction (7,2) << '\n'; cout << "The third result is subtraction (x,y) << '\n'; z= 4 + subtraction (x,y); cout << "The fourth result is " << '\n'; return 0; }
z <<
Trong trng hp ny chng ta to ra hm subtraction. Chc nng ca hm ny l ly hiu ca hai tham s ri tr v kt qu. Tuy nhin, nu phn tch hm main cc bn s thy chng trnh vi ln gi n hm subtraction. Ti s dng vi cch gi khc nhau cc bn thy cc cch khc nhau m mt hm c th c gi. c hiu cn k v d ny bn cn nh rng mt li gi n mt hm c th hon ton c thay th bi gi tr ca n. V d trong lnh gi hm u tin :
z = cout << "The first result is " << z; subtraction (7,2);
Tng t nh vy
cout << "The second result is " << subtraction (7,2);
cng cho kt qu ging nh hai dng lnh trn nhng trong trng hp ny chng ta gi hm subtraction trc tip nh l mt tham s ca cout. Chng ta cng c th vit:
cout << "The second result is " << 5;
iu mi m duy nht y l cc tham s ca subtraction l cc bin thay v cc hng. iu ny l hon ton hp l. Trong trng hp ny gi tr c truyn cho hm subtraction l gi tr ca x and y. Trng hp th t cng hon ton tng t. Thay v vit 26
z = 4 + subtraction (x,y);
chng ta c th vit:
z = subtraction (x,y) + 4;
cng hon ton cho kt qu tng ng. Ch rng du chm phy c t cui biu thc ch khng cn thit phi t ngay sau li gi hm.
bn s thy r rng rng n bt u vi mt tn kiu, l kiu d liu s c hm tr v bi lnh return. Nhng nu chng ta khng mun tr v gi tr no th sao ? Hy tng tng rng chng ta mun to ra mt hm ch hin th mt thng bo ln mn hnh. N khng cn tr v mt gi tr no c, hn na cng khng cn nhn tham s no ht. V vy ngi ta ngh ra kiu d liu void trong ngn ng C. Hy xem xt chng trnh sau:
// void function example #include <iostream.h> void dummyfunction (void) { cout << "I'm a function!"; } int main () { dummyfunction (); return 0; } I'm a function!
T kho void trong phn danh sch tham s c ngha l hm ny khng nhn mt tham s no. Tuy nhin trong C++ khng cn thit phi s dng void lm iu ny. Bn ch n gin s dng cp ngoc n ( ) l xong. Bi v hm ca chng ta khng c mt tham s no, v vy li gi hm dummyfunction s l :
dummyfunction ();
Hai du ngoc n l cn thit cho trnh dch hiu l mt li gi hm ch khng phi l mt tn bin hay bt k du hiu no khc.
Bi 2.3
Hm (II)
27
Trong trng hp ny khi chng ta gi hm addition th cc gi tr 5 and 3 c truyn cho hm, khng phi l bn thn cc bin.
n y cc bn c th hi ti: Nh vy th sao, c nh hng g u ? iu ng ni y l khi cc bn thay i gi tr ca cc bin a hay b bn trong hm th cc bin x v y vn khng thay i v chng u c c truyn cho hm ch c gi tr ca chng c truyn m thi. Hy xt trng hp bn cn thao tc vi mt bin ngoi bn trong mt hm. V vy bn s phi truyn tham s di dng tham s bin nh trong hm duplicate trong v d di y:
// passing parameters by reference #include <iostream.h> void duplicate (int& a, int& b, int& c) { a*=2; b*=2; c*=2; } int main () { int x=1, y=3, z=7; duplicate (x, y, z); cout << "x=" << x << ", y=" << y << ", z=" << z; return 0; } x=2, y=6, z=14
iu u tin lm bn ch l trong khai bo ca duplicate theo sau tn kiu ca mi tham s u l du v (&), bo hiu rng cc tham s ny c truyn theo tham s bin ch khng phi tham s gi tr. Khi truyn tham s di dng tham s bin chng ta ang truyn bn thn bin v bt k s thay i no m chng ta thc hin vi tham s bn trong hm s nh hng trc tip n bin .
28
Trong v d trn, chng ta lin kt a, b v c vi cc tham s khi gi hm (x, y v z) v mi s thay i vi a bn trong hm s nh hng n gi tr ca x v hon ton tng t vi b v y, c v z. Kiu khai bo tham s theo dng tham s bin s dng du v (&) ch c trong C++. Trong ngn ng C chng ta phi s dng con tr lm vic tng t nh th. Truyn tham s di dng tham s bin cho php mt hm tr v nhiu hn mt gi tr. V d, y l mt hm tr v s lin trc v lin sau ca tham s u tin.
// more than one returning value #include <iostream.h> void prevnext next) { prev = x-1; next = x+1; } (int x, int& prev, int& Previous=99, Next=101
int main () { int x=100, y, z; prevnext (x, y, z); cout << "Previous=" << y << ", Next=" << z; return 0; }
Gi tr mc nh ca tham s.
Khi nh ngha mt hm chng ta c th ch nh nhng gi tr mc nh s c truyn cho cc i s trong trng hp chng b b qua khi hm c gi. lm vic ny n gin ch cn gn mt gi tr cho i s khi khai bo hm. Nu gi tr ca tham s vn c ch nh khi gi hm th gi tr mc nh s b b qua. V d:
// default values in functions #include <iostream.h> int divide (int a, int b=2) { int r; r=a/b; return (r); } int main () { cout << divide (12); cout << endl; 6 5
29
Nhng chng ta thy trong thn chng trnh, c hai li gi hm divide. Trong lnh u tin:
divide (12)
chng ta ch dng mt tham s nhng hm divide cho php n hai. Bi vy hm divide s t cho tham s th hai gi tr bng 2 v l gi tr mc nh ca n (ch phn khai bo hm c kt thc bi int b=2). V vy kt qu s l 6 (12/2). Trong lnh th hai:
divide (20,4)
Qu ti cc hm.
Hai hm c th c cng tn nu khai bo tham s ca chng khc nhau, iu ny c ngha l bn c th t cng mt tn cho nhiu hm nu chng c s tham s khc nhau hay kiu d liu ca cc tham s khc nhau (hay thm ch l kiu d liu tr v khc nhau). V d:
// overloaded function #include <iostream.h> int divide (int a, int b) { return (a/b); } float divide (float a, float b) { return (a/b); } int main () { int x=5,y=2; float n=5.0,m=2.0; cout << divide (x,y); cout << "\n"; cout << divide (n,m); return 0; } 2 2.5
Trong v d ny chng ta nh ngha hai hm c cng tn nhng mt hm dng hai tham s kiu int v hm cn li dng kiu float. Trnh bin dch s bit cn phi gi hm no bng cch phn tch kiu tham s khi hm c gi. n gin ti vit c hai hm u c m lnh nh nhau nhng iu ny khng bt buc. Bn c th xy dng hai hm c cng tn nhng hot ng hon ton khc nhau. 30
Cc hm inline.
Ch th inline c th c t trc khao bo ca mt hm ch r rng li gi hm s c thay th bng m lnh ca hm khi chng trnh c dch. Vic ny tng ng vi vic khai bo mt macro, li ch ca n ch th hin vi cc hm rt ngn, tc chy chng trnh s c ci thin v n khng phi gi mt th tc con. Cu trc ca n nh sau:
inline type name ( arguments ... ) { instructions ... }
li gi hm cng nh bt k mt hm no khc. Khng cn thit phi t t kho inline trong lnh gi, ch cn trong li khai bo hm l .
qui.
Cc hm c th gi chnh n. iu ny c th c ch vi mt s tc v nh l mt s phng php sp xp hay tnh giai tha ca mt s. V d, tnh giai tha ca mt s (n), cng thc ton hc ca n nh sau:
n! = n * (n-1) * (n-2) * (n-3) ... * 1
Ch trong hm factorial chng ta c th lnh gi chnh n nhng ch khi tham s ln hn 1, nu khng th hm s thc hin mt vng lp v hn v sau khi n 0 n s tip tc nhn c nhng s m. Hm ny c mt hn ch l kiu d liu m n dng (long) khng cho php tnh giai tha qu 12!.
y nhng th t hm main trc bt k mt hm c gi t n, bn gn nh chc chn s nhn c thng bo li. Nguyn nhn l mt hm phi c khai bo trc khi n c gi nh nhng g chng ta lm trong tt c cc v d. Nhng c mt cch khc trnh phi vit tt c m chng trnh trc khi chng c th c dng trong main hay bt k mt hm no khc. chnh l khai bo mu cho hm. Cch ny bao gm vic khai bo hm mt cch ngn gn nhng cho trnh dch c th bit cc tham s v kiu d liu tr v ca hm. Dng ca n nh sau:
type name ( argument_type1, argument_type2, ...);
N khng c bt k lnh no cho hm. iu ny c ngha l n khng bao gm thn hm vi tt c cc lnh thng c bc trong cp ngoc nhn { }. N kt thc bng du chm phy (;). Trong phn lit k cc tham s ch cn vit kiu ca chng l . Vic vit tn ca cc tham s trong phn khai bo mu l khng bt buc.
V d:
// prototyping #include <iostream.h> void odd (int a); void even (int a); int main () { int i; do { cout << "Type a number: (0 to exit)"; cin >> i; odd (i); } while (i!=0); return 0; } void odd (int a) { if ((a%2)!=0) odd.\n"; else even (a); } void even (int a) { if ((a%2)==0) even.\n"; else odd (a); } Type Number Type Number Type Number Type Number a a a number number number (0 to exit): 9 is odd. (0 to exit): 6 is even. (0 to exit): 1030 is even. (0 to exit): 0
a number is even.
cout
<<
"Number
is
cout
<<
"Number
is
32
V d ny r rng khng phi l mt v d v s hiu qu. Ti chc chn rng cc bn c th nhn c kt qu nh trn ch vi mt na s dng lnh. Tuy nhin n gip cho chng ta thy c vic khai bo mu cc hm l nh th no. Hn na, trong v d ny vic khai bo mu t nht mt hm l bt buc. u tin chng ta thy khai bo mu ca hai hm odd v even:
void void even (int a); odd (int a);
cho php hai hm ny c th c s dng trc khi chng c nh ngha hon chnh. Tuy nhin l do c bit gii thch ti sao chng trnh ny li cn t nht mt hm phi c khi bo mu l trong odd c mt li gi n even v trong even c mt li gi n odd. V vy nu khng c hm no c khai bo trc th li chc chn s xy ra. Rt nhiu lp trnh vin kinh nghim khuyn rng tt c cc hm nn c khai bo mu. cng l li khuyn ca ti, nht l trong trng hp c nhiu hm hoc chng rt di, khi vic khai bo tt c cc hm cng mt ch cho php chng ta bit phi gi cc hm nh th no, v vy tit kim c thi gian.
Bi 3.1
Mng
Mng l mt dy cc phn t c cng kiu c t lin tip trong b nh v c th truy xut n tng phn t bng cch thm mt ch s vo sau tn ca mng. iu ny c ngha l, v d, chng ta c th lu 5 gi tr kiu int m khng cn phi khai bo 5 bin khc nhau.V d, mt mng cha 5 gi tr nguyn kiu int c tn l billy c th c biu din nh sau:
trong mi mt trng biu din mt phn t ca mng, trong trng hp ny l cc gi tr nguyn kiu int. Chng c nh s t 0 n 4 v phn t u tin ca mng lun l 0 bt k di ca n l bao nhiu. Nh bt k bin no khc, mt mng phi c khai bo trc khi c th s dng. Mt khai bo in hnh cho mt mng trong C++ nh sau:
type name [elements];
trong type l mt kiu d liu hp l (int, float...), name l mt tn bin hp l v trng elements ch nh mng s cha bao nhiu phn t V vy, khai bo billy nh trnh by trn chng ta ch cn mt dng n gin nh sau:
int billy [5];
Ch : Trng elements bn trong cp ngoc [] phi l mt gi tr hng khi khai bo mt mng, v mng l mt khi nh tnh c kch c xc nh v trnh bin dch phi c kh nng xc nh xem cn bao nhiu b 33
Khi to mt mng.
Khi khai bo mt mng vi tm hot ng a phng (trong mt hm), theo mc nh n s khng c khi to, v vy ni dung ca n l khng xc nh cho n khi chng ra lu cc gi tr ln . Nu chng ta khai bo mt mng ton cc (bn ngoi tt c cc hm) n s c khi to v tt c cc phn t c t bng 0. V vy nu chng ta khai bo mng ton cc:
Nhng thm vo , khi chng ta khai bo mt mng, chng ta c th gn cc gi tr khi to cho tng phn t ca n. V d:
int billy [5] = { 16, 2, 77, 40, 12071 };
S phn t trong mng m chng ta khi to vi cp ngoc nhn { } phi bng s phn t ca mng c khai bo vi cp ngoc vung [ ]. Bi v iu ny c th c coi l mt s lp li khng cn thit nn C++ cho php trng gia cp ngoc vung, kch thc ca mng c xc nh bng s gi tr gia cp ngoc nhn.
34
Nh trong v d trc ta c mng billy gm 5 phn t c kiu int, chng ta c th truy xut n tng phn t ca mng nh sau:
V vy, xt v mi phng din, biu thc billy[2] ging nh bt k mt bin kiu int. Ch rng phn t th ba ca billy l billy[2], v mng bt u t ch s 0. V vy, phn t cui cng s l billy[4]. V vy nu chng ta vit billy[5], chng ta s truy xut n phn t th 6 ca mng v vt qu gii hn ca mng. Trong C++, vic vt qu gii hn ch s ca mng l hon ton hp l, tuy nhin n c th gy ra nhng vn thc s kh pht hin bi v chng khng to ra nhng li trong qu trnh dch nhng chng c th to ra nhng kt qu khng mong mun trong qu trnh thc hin. Nguyn nhn ca vic ny s c ni n k hn khi chng ta bt u s dng con tr. Cn phi nhn mnh rng chng ta s dng cp ngoc vung cho hai tc v: u tin l t kch thc cho mng khi khai bo chng v th hai, ch nh ch s cho mt phn t c th ca mng khi xem xt n n.
int billy[5]; billy[2] = 75; // khai bo mt mng mi. // truy xut n mt phn t ca mng.
12206
35
return 0; }
jimmy
biu din mt mng hai chiu kch thc 3x5 c kiu int. Cch khai bo mng ny nh sau:
int jimmy [3][5];
v, v d, cch truy xut n phn t th hai theo chiu dc v th t theo chiu ngang trong mt biu thc nh sau:
jimmy[1][3]
(hy nh rng ch s ca mng lun bt u t 0). Mng nhiu chiu khng b gii hn bi hai ch s (hai chiu), Chng c th cha bao nhiu ch s ty thch mc d t kh cn phi dng n mng ln hn 3 chiu. Hy th xem xt lng b nh m mt mng c nhiu ch s cn n. V d:
char century [100][365][24][60][60];
gn mt gi tr char cho mi giy trong mt th k, phi cn n hn 3 t gi tr chars! Chng ta s phi cn khong 3GB RAM khai bo n. Mng nhiu chiu thc ra l mt khi nim tru tng v chng ta c th c kt qu tng t vi mng mt chiu bng mt thao tc n gin gia cc ch s ca n:
int jimmy [3][5]; int jimmy [15]; (3 * 5 = 15)
tng
ng
vi
Di y l hai v d vi cng mt kt qu nh nhau, mt s dng mng hai chiu v mt s dng mng mt chiu:
// multidimensional array // pseudo-multidimensional array
36
#include <iostream.h> #define WIDTH 5 #define HEIGHT 3 int jimmy [HEIGHT][WIDTH]; int n,m; int main () { for (n=0;n<HEIGHT;n++) for (m=0;m<WIDTH;m++) { jimmy[n][m]=(n+1)*(m+1); } return 0; }
#include <iostream.h> #define WIDTH 5 #define HEIGHT 3 int jimmy [HEIGHT * WIDTH]; int n,m; int main () { for (n=0;n<HEIGHT;n++) for (m=0;m<WIDTH;m++) { jimmy[n * WIDTH + m]=(n+1)*(m+1); } return 0; }
khng mt chng trnh no vit g ra mn hnh nhng c hai u gn gi tr vo khi nh c tn jimmy theo cch sau:
Chng ta nh ngha hng (#define) n gin ha nhng chnh sa sau ny ca chng trnh, v d, trong trng hp chng ta quyt nh tng kch thc ca mng vi chiu cao l 4 thay v l 3, chng ta ch cn thay i dng:
#define HEIGHT 3
thnh
#define HEIGHT 4
37
nhn vo mt tham s c kiu "mng ca char" v c tn arg. truyn tham s cho hm ny mt mng c khai bo:
int myarray [40];
ch cn gi hm nh sau:
procedure (myarray);
Di y l mt v d c th
// arrays as parameters #include <iostream.h> void printarray (int arg[], int length) { for (int n=0; n<length; n++) cout << arg[n] << " "; cout << "\n"; } int main () { int firstarray[] = {5, 10, 15}; int secondarray[] = {2, 4, 6, 8, 10}; printarray (firstarray,3); printarray (secondarray,5); return 0; } 5 2 4 6 8 10 10 15
Nh bn c th thy, tham s u tin (int arg[]) chp nhn mi mng c kiu c bn l int, bt k di ca n l bao nhiu, v vy cn thit phi c tham s th hai bo cho hm ny bit di ca mng m chng ta truyn cho n. Trong phn khai bo hm chng ta cng c th dng tham s l cc mng nhiu chiu. Cu trc ca mng 3 chiu nh sau:
base_type[][depth][depth]
ch rng cp ngoc vung u tin trng nhng cc cp ngoc sau th khng. Bn lun lun phi lm vy v trnh bin dch C++ phi c kh nng xc nh ln ca cc chiu thm vo ca mng. Mng, c mt chiu v nhiu chiu, khi truyn cho hm nh l mt tham s thng l nguyn nhn gy li cho nhng lp trnh vin thiu kinh nghim. Cc bn nn c bi 3.3. Con tr c th hiu r hn mng hot ng nh th no.
38
Bi 3.2 Xu k t
Trong tt c cc chng trnh chng ta thy cho n gi, chng ta ch s dng cc bin kiu s, ch dng biu din cc s. Nhng bn cnh cc bin kiu s cn c cc xu k t, chng cho php chng ta biu din cc chui k t nh l cc t, cu, on vn bn... Cho n gi chng ta mi ch dng chng di dng hng ch cha quan tm n cc bin c th cha chng. Trong C++ khng c kiu d liu c bn lu cc xu k t. c th tha mn nhu cu ny, ngi ta s dng mng c kiu char. Hy nh rng kiu d liu ny (char) ch c th lu tr mt k t n, bi vy n c dng to ra xu ca cc k t n. V d, mng sau (hay l xu k t):
char jenny [20];
Kch thc cc i ny khng cn phi lun lun dng n. V d, jenny c th lu xu "Hello" hay "Merry christmas". V cc mng k t c th lu cc xu k t ngn hn di ca n, trong C++ c mt quy c kt thc mt ni dung ca mt xu k t bng mt k t null, c th c vit l '\0'. Chng ta c th biu din jenny (mt mng c 20 phn t kiu char) khi lu tr xu k t "Hello" v "Merry Christmas" theo cch sau:
Ch rng sau ni dung ca xu, mt k t null ('\0') c dng bo hiu kt thc xu. Nhng mu xm biu din nhng gi tr khng xc nh.
Khi to cc xu k t.
V nhng xu k t l nhng mng bnh thng nn chng cng nh cc mng khc. V d, nu chng ta mun khi to mt xu k t vi nhng gi tr xc nh chng ta c th lm iu tng t nh vi cc mng khc:
char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
Tuy nhin, chng ta c th khi to gi tr cho mt xu k t bng cch khc: s dng cc hng xu k t. Trong cc biu thc chng ta s dng trong cc v d trong cc chng trc cc hng xu k t xut hin vi ln. Chng c biu din trong cp ngoc kp ("), v d: 39
l mt hng xu k t chng ta s dng mt s ch. Khng ging nh du nhy n (') cho php biu din hng k t, cp ngoc kp ( ") l hng biu din mt chui k t lin tip, v cui chui mt k t null ('\0') lun c t ng thm vo. V vy chng ta c th khi to xu mystring theo mt trong hai cch sau y:
char mystring [] = { char mystring [] = "Hello"; 'H', 'e', 'l', 'l', 'o', '\0' };
Trong c hai trng hp mng (hay xu k t) mystring c khai bo vi kch thc 6 k t: 5 k t biu din Hello cng vi mt k t null. Trc khi tip tc, ti cn phi nhc nh bn rng vic gn nhiu hng nh vic s dng du ngoc kp ( ") ch hp l khi khi to mng, tc l lc khai bo mng. Cc biu thc trong chng trnh nh:
mystring mystring[] = "Hello"; = "Hello";
Vy hy nh: Chng ta ch c th "gn" nhiu hng cho mt mng vo lc khi to n. Nguyn nhn l mt thao tc gn (=) khng th nhn v tri l c mt mng m ch c th nhn mt trong nhng phn t ca n. Vo thi im khi to mng l mt trng hp c bit, v n khng thc s l mt lnh gn mc d n s dng du bng (=).
Gn gi tr cho xu k t
V v tri ca mt lnh gn ch c th l mt phn t ca mng ch khng th l c mng, chng ta c th gn mt xu k t cho mt mng kiu char s dng mt phng php nh sau:
mystring[0] mystring[1] mystring[2] mystring[3] mystring[4] mystring[5] = '\0'; = = = = = 'H'; 'e'; 'l'; 'l'; 'o';
Nhng r rng y khng phi l mt phng php thc t. gn gi tr cho mt xu k t, chng ta c th s dng lot hm kiu strcpy (string copy), hm ny c nh ngha trong string.h v c th c gi nh sau:
strcpy (string1, string2);
Lnh ny copy ni dung ca string2 sang string1. string2 c th l mt mng, con tr hay mt hng xu k t, bi vy lnh sau y l mt cch ng gn xu hng "Hello" cho mystring: 40
V d:
// setting value to string #include <iostream.h> #include <string.h> int main () { char szMyName [20]; strcpy (szMyName,"J. Soulie"); cout << szMyName; return 0; } J. Soulie
rng chng ta phi include file <string.h> c th s dng hm strcpy. Mc d chng ta lun c th vit mt hm n gin nh hm setstring di y thc hin mt thao tc ging nh strcpy:
// setting value to string #include <iostream.h> void setstring (char szOut [], char szIn []) { int n=0; do { szOut[n] = szIn[n]; n++; } while (szIn[n] != 0); } int main () { char szMyName [20]; setstring (szMyName,"J. Soulie"); cout << szMyName; return 0; } J. Soulie
Mt phng thc thng dng khc gn gi tr cho mt mng l s dng trc tip dng nhp d liu (cin). Trong trng hp ny gi tr ca xu k t c gn bi ngi dng trong qu trnh chng trnh thc hin. Khi cin c s dng vi cc xu k t n thng c dng vi phng thc getline ca n, phng thc ny c th c gi nh sau:
cin.getline ( char buffer[], int length, char delimiter = ' \n');
trong buffer (b m) l a ch ni s lu tr d liu vo (nh l mt mng chng hn), length l di cc i ca b m (kch thc ca mng) v delimiter l k t c dng kt thc vic nhp, mc nh - nu chng ta khng dng tham s ny - s l k t xung dng ('\n'). 41
V d sau y lp li tt c nhng g bn g trn bn phm. N rt n gin nhng l mt v d cho thy bn c th s dng cin.getline vi cc xu k t nh th no:
// cin with strings #include <iostream.h> int main () { char mybuffer [100]; cout << "What's your name? "; cin.getline (mybuffer,100); cout << "Hello " << mybuffer << ".\n"; cout << "Which is your favourite team? "; cin.getline (mybuffer,100); cout << "I like " << mybuffer << " too.\n"; return 0; } What's your name? Juan Hello Juan. Which is your favourite team? Inter Milan I like Inter Milan too.
Ch trong c hai li gi cin.getline chng ta s dng cng mt bin xu (mybuffer). Nhng g chng trnh lm trong li gi th hai n gin l thay th ni dung ca buffer trong li gi c bng ni dung mi. Nu bn cn nh phn ni v giao tip vi, bn s nh rng chng ta s dng ton t >> nhn d liu trc tip t u vo chun. Phng thc ny c th c dng vi cc xu k t thay cho cin.getline. V d, trong chn trnh ca chng ta, khi chng ta mun nhn d liu t ngi dng chng ta c th vit:
cin >> mybuffer;
N ch c th nhn nhng t n (khng nhn c c cu) v phng thc ny s dng k t trng(bao gm c du cch, du tab v du xung dng) lm du hiu kt thc.. N khng cho php ch nh kch thc cho b m. Chng trnh ca bn c th chy khng n nh nu d liu vo ln hn kch c ca mng cha n.
V nhng nguyn nhn trn, khi mun nhp vo cc xu k t bn nn s dng cin.getline thay v cin >>.
atoi: chuyn xu thnh kiu int. atol: chuyn xu thnh kiu long. atof: chuyn xu thnh kiu float. 42
Tt c cc hm ny nhn mt tham s v tr v gi tr s (int, long hoc float). Cc hm ny khi kt hp vi phng thc getline ca cin l mt cch ng tin cy hn phng thc cin>> c in khi yu cu ngi s dng nhp vo mt s:
// cin and ato* functions #include <iostream.h> #include <stdlib.h> int main () { char mybuffer [100]; float price; int quantity; cout << "Enter price: "; cin.getline (mybuffer,100); price = atof (mybuffer); cout << "Enter quantity: "; cin.getline (mybuffer,100); quantity = atoi (mybuffer); cout << "Total price: price*quantity; return 0; } Enter price: Enter quantity: Total price: 57.75 2.75 21
"
<<
Bi 3.3
Con tr
Chng ta bit cc bin chnh l cc nh m chng ta c th truy xut di cc tn. Cc bin ny c lu tr ti nhng ch c th trong b nh. i vi chng trnh ca chng ta, b nh my tnh ch l mt dy gm cc nh 1 byte, mi c mt a ch xc nh. Mt s m hnh tt i vi b nh my tnh chnh l mt ph trong mt thnh ph. Trn mt ph tt c cc ngi nh u c nh s tun t vi mt ci tn duy nht nn nu chng ta ni n s 27 ph Trn Hng o th chng ta c th tm c ni m khng lm ln v ch c mt ngi nh vi s nh vy. 43
Cng vi cch t chc tng t nh vic nh s cc ngi nh, h iu hnh t chc b nh thnh nhng s n nht, tun t, nn nu chng ta ni n v tr 1776 trong b nh chng ta bit chnh xc nh v ch c mt v tr vi a ch nh vy.
Ton t ly a ch (&).
Vo thi im m chng ta khai bo mt bin th n phi c lu tr trong mt v tr c th trong b nh. Ni chung chng ta khng quyt nh ni no bin c t - tht may mn rng iu c lm t ng bi trnh bin dch v h iu hnh, nhng mt khi h iu hnh gn mt a ch cho bin th chng ta c th mun bit bin c lu tr u. iu ny c th c thc hin bng cch t trc tn bin mt du v (&), c ngha l "a ch ca". V d:
ted = &andy;
s gn cho bin ted a ch ca bin andy, v khi t trc tn bin andy du v (&) chng ta khng cn ni n ni dung ca bin m ch ni n a ch ca n trong b nh. Gi s rng bin andy c t nh c a ch 1776 v chng ta vit nh sau:
andy fred ted = &andy; = = 25; andy;
kt qu s ging nh trong s di y:
Chng ta gn cho fred ni dung ca bin andy nh chng ta lm rt ln nhiu khc trong nhng phn trc nhng vi bin ted chng ta gn a ch m h iu hnh lu gi tr ca bin andy, chng ta va gi s n l 1776. Nhng bin lu tr a ch ca mt bin khc (nh ted trong v d trc) c gi l con tr. Trong C++ con tr c rt nhiu u im v chng c s dng rt thng xuyn, Tip theo chng ta s thy cc bin kiu ny c khai bo nh th no.
beth = *ted;
(chng ta c th c n l: "beth bng gi tr c tr bi ted" beth s mang gi tr 25, v ted bng 1776 v gi tr tr bi 1776 l 25.
Bn phi phn bit c rng ted c gi tr 1776, nhng *ted (vi mt du sao ng trc) tr ti gi tr c lu tr trong a ch 1776, l 25. Hy ch s khc bit gia vic c hay khng c du sao tham chiu.
beth = ted; beth = *ted; // beth bng ted ( 1776 ) // beth bng gi tr c tr bi( 25 )
Ton t ly a ch (&) N c dng nh l mt tin t ca bin v c th c dch l "a ch ca", v vy &variable1 c th c c l "a ch ca variable1". Ton t tham chiu (*) N ch ra rng ci cn c tnh ton l ni dung c tr bi biu thc c coi nh l mt a ch. N c th c dch l "gi tr c tr bi".. *mypointer c c l "gi tr c tr bi mypointer". Vo lc ny, vi nhng v d vit trn
andy ted = &andy; = 25;
trong type l kiu d liu c tr ti, khng phi l kiu ca bn thn con tr. V d: 45
l ba khai bo ca con tr. Mi bin u tr ti mt kiu d liu khc nhau nhng c ba u l con tr v chng u chim mt lng b nh nh nhau (kch thc ca mt bin con tr ty thuc vo h iu hnh). nhng d liu m chng tr ti khng chim lng b nh nh nhau, mt kiu int, mt kiu char v ci cn li kiu float. Ti phi nhn mnh li rng du sao (*) m chng ta t khi khai bo mt con tr ch c ngha rng: l mt con tr v hon ton khng lin quan n ton t tham chiu m chng ta xem xt trc . n gin ch l hai tc v khc nhau c biu din bi cng mt du.
// my first pointer #include <iostream.h> int main () { int value1 = 5, value2 = 15; int * mypointer; mypointer = &value1; *mypointer = 10; mypointer = &value2; *mypointer = 20; cout << "value1==" value2==" << value2; return 0; } value1==10 / value2==20
<<
value1
<<
"/
Ch rng gi tr ca value1 v value2 c thay i mt cch gin tip. u tin chng ta gn cho mypointer a ch ca value1 dng ton t ly a ch (&) v sau chng ta gn 10 cho gi tr c tr bi mypointer, l gi tr c tr bi value1 v vy chng ta sa bin value1 mt cch gin tip bn c th thy rng mt con tr c th mang mt vi gi tr trong cng mt chng trnh chng ta s lp li qu trnh vi value2 v vi cng mt con tr. y l mt v d phc tp hn mt cht:
// more pointers #include <iostream.h> int main () { int value1 = 5, value2 = 15; int *p1, *p2; p1 = &value1; // p1 value1 p2 = &value2; // p2 value2 *p1 = 10; // gi = 10 *p2 = *p1; // gi = gi tr tr bi p1 = a ch ca = a ch ca tr tr bi p1 tr tr bi p2 value1==10 / value2==20
46
Mt dng c th gy s ch ca bn l:
int *p1, *p2;
dng ny khai bo hai con tr bng cch t du sao (*) trc mi con tr. Nguyn nhn l kiu d liu khai bo cho c dng l int v v theo th t t phi sang tri, du sao c tnh trc tn kiu.
Con tr v mng.
Trong thc t, tn ca mt mng tng ng vi a ch phn t u tin ca n, ging nh mt con tr tng ng vi a ch ca phn t u tin m n tr ti, v vy thc t chng hon ton nh nhau. V d, cho hai khai bo sau:
int numbers [20]; int * p;
lnh sau s hp l:
p = numbers;
y p v numbers l tng ng v chng c cng thuc tnh, s khc bit duy nht l chng ta c th gn mt gi tr khc cho con tr p trong khi numbers lun tr n phn t u tin trong s 20 phn t kiu int m n c nh ngha vi. V vy, khng ging nh p - l mt bin con tr bnh thng, numbers l mt con tr hng. Lnh gn sau y l khng hp l:
numbers = p;
bi v numbers l mt mng (con tr hng) v khng c gi tr no c th c gn cho cc hng. V con tr cng c mi tnh cht ca mt bin nn tt c cc biu thc c con tr trong v d di y l hon ton hp l:
// more pointers #include <iostream.h> int main () { int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; 10, 20, 30, 40, 50,
47
p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0;
Trong bi "mng" chng ta dng du ngoc vung ch ra phn t ca mng m chng ta mun tr n. Cp ngoc vung ny c coi nh l ton t offset v ngha ca chng khng i khi c dng vi bin con tr. V d, hai biu thc sau y:
a[5] = 0; *(a+5) = 0; // a [offset of 5] = 0 // pointed by (a+5) = 0 tng ng v hp l bt k a l mng hay l mt con tr.
l hon ton
Khi to con tr
Khi khai bo con tr c th chng ta s mun ch nh r rng chng s tr ti bin no,
int number; int *tommy = &number;
l tng ng vi:
int number; int *tommy; tommy = &number;
Trong mt php gn con tr chng ta phi lun lun gn a ch m n tr ti ch khng phi l gi tr m n tr ti. Bn cn phi nh rng khi khai bo mt bin con tr, du sao (*) c dng ch ra n l mt con tr, v hon ton khc vi ton t tham chiu. l hai ton t khc nhau mc d chng c vit vi cng mt du. V vy, cc cu lnh sau l khng hp l:
int number; int *tommy; *tommy = &number;
Nh i vi mng, trnh bin dch cho php chng ta khi to gi tr m con tr tr ti bng gi tr hng vo thi im khai bo bin con tr:
char * terry = "hello";
trong trng hp ny mt khi nh tnh c dnh cha "hello" v mt con tr tr ti k t u tin ca khi nh ny ( l k t h') c gn cho terry. Nu "hello" c lu ti a ch 1702, lnh khai bo trn c th c hnh dung nh th ny:
48
cn phi nhc li rng terry mang gi tr 1702 ch khng phi l 'h' hay "hello". Bin con tr terry tr ti mt xu k t v n c th c s dng nh l i vi mt mng (hy nh rng mt mng ch n thun l mt con tr hng). V d, nu chng ta mun thay k t 'o' bng mt du chm than, chng ta c th thc hin vic bng hai cch:
terry[4] *(terry+4) = '!'; = '!';
hy nh rng vit terry[4] l hon ton ging vi vit *(terry+4) mc d biu thc thng dng nht l ci u tin. Vi mt trong hai lnh trn xu do terry tr n s c gi tr nh sau:
49
- nh bn mong i - s mang gi tr 1001. Tuy nhin myshort s mang gi tr 2002 v mylong mang gi tr 3004. Nguyn nhn l khi cng thm 1 vo mt con tr th n s tr ti phn t tip theo c cng kiu m n c nh ngha, v vy kch thc tnh bng byte ca kiu d liu n tr ti s c cng thm vo bin con tr.
mychar
iu ny ng vi c hai php ton cng v tr i vi con tr. Chng ta cng hon ton thu c kt qu nh trn nu vit:
mychar = mychar + 1; myshort = myshort + 1; mylong = mylong + 1;
Cn phi cnh bo bn rng c hai ton t tng (++) v gim (--) u c quyn u tin ln hn ton t tham chiu (*), v vy biu thc sau y c th dn ti kt qu sai:
*p++; *p++ = *q++;
Lnh u tin tng ng vi *(p++) iu m n thc hin l tng p (a ch nh m n tr ti ch khng phi l gi tr tr ti). Lnh th hai, c hai ton t tng (++) u c thc hin sau khi gi tr ca *q c gn cho *p v sau c q v p u tng ln 1. Lnh ny tng ng vi:
*p p++; q++; = *q;
Nh ni trong cc bi trc, ti khuyn cc bn nn dng cc cp ngoc n trnh nhng kt qu khng mong mun.
Con tr tr ti con tr
C++ cho php s dng cc con tr tr ti cc con tr khc ging nh l tr ti d liu. lm vic chng ta ch cn thm mt du sao (*) cho mi mc tham chiu. 50
im mi trong v d ny l bin c, chng ta c th ni v n theo 3 cch khc nhau, mi cch s tng ng vi mt gi tr khc nhau:
c l mt bin c kiu (char **) *c l mt bin c kiu (char*) **c l mt bin c kiu (char) mang gi tr 'z' mang mang gi gi tr tr 8092 7230
51
increase (&b,sizeof(b)); increase (&c,sizeof(c)); cout << (int) a << ", " << b << ", " << c; } return 0;
l mt ton t ca ngn ng C++, n tr v mt gi tr hng l kch thc tnh bng byte ca tham s truyn cho n, v d sizeof(char) bng 1 v kch thc ca char l 1 byte.
sizeof
Con tr hm
C++ cho php thao tc vi cc con tr hm. Tin ch tuyt vi ny cho php truyn mt hm nh l mt tham s n mt hm khc. c th khai bo mt con tr tr ti mt hm chng ta phi khai bo n nh l khai bo mu ca mt hm nhng phi bao trong mt cp ngoc n () tn ca hm v chn du sao (*) ng trc.
// pointer to functions #include <iostream.h> int addition (int a, int b) { return (a+b); } int subtraction (int a, int b) { return (a-b); } int (*minus)(int,int) = subtraction; int operation (int x, (*functocall)(int,int)) { int g; g = (*functocall)(x,y); return (g); } int y, int 8
int main () { int m,n; m = operation (7, 5, &addition); n = operation (20, m, minus); cout <<n; return 0; }
Trong v d ny, minus l mt con tr ton cc tr ti mt hm c hai tham s kiu int, con tr ny c gm tr ti hm subtraction, tt c u trn mt dng:
int (* minus)(int,int) = subtraction;
Bi 3.4
B nh ng
Cho n nay, trong cc chng trnh ca chng ta, tt c nhng phn b nh chng ta c th s dng l cc bin cc mng v cc i tng khc m chng ta khai bo. Kch c ca chng l c nh v khng th thay i trong thi gian chng trnh chy. Nhng nu chng ta cn mt lng b nh m kch c ca n 52
ch c th c xc nh khi chng trnh chy, v d nh trong trng hp chng ta nhn thng tin t ngi dng xc nh lng b nh cn thit. Gii php y chnh l b nh ng, C++ tch hp hai ton t new v delete thc hin vic ny Hai ton t new v delete ch c trong C++. phn sau ca bi chng ta s bit nhng thao tc tng ng vi cc ton t ny trong C. Ton t new v new[ ] c th c c b nh ng chng ta c th dng ton t new. Theo sau ton t ny l tn kiu d liu v c th l s phn t cn thit c t trong cp ngoc vung. N tr v mt con tr tr ti u ca khi nh va c cp pht. Dng thc ca ton t ny nh sau:
pointer = new type
hoc
pointer = new type [elements]
Biu thc u tien c dng cp pht b nh cha mt phn t c kiu type. Lnh th hai c dng cp pht mt khi nh (mt mng) gm cc phn t kiu type. V d:
int * bobby; bobby = new int [5];
trong trng hp ny, h iu hnh dnh ch cho 5 phn t kiu int trong b nh v tr v mt con tr tr n u ca khi nh. V vy lc ny bobby tr n mt khi nh hp l gm 5 phn t int.
Bn c th hi ti l c g khc nhau gia vic khai bo mt mng vi vic cp pht b nh cho mt con tr nh chng ta va lm. iu quan trng nht l kch thc ca mt mng phi l mt hng, iu ny gii hn kch thc ca mng n kch thc m chng ta chn khi thit k chng trnh trong khi cp pht b nh ng cho php cp pht b nh trong qu trnh chy vi kch thc bt k. B nh ng ni chung c qun l bi h iu hnh v trong cc mi trng a nhim c th chy mt lc vi chng trnh c mt kh nng c th xy ra l ht b nh cp pht. Nu iu ny xy ra v h iu hnh khng th cp pht b nh nh chng ta yu cu vi ton t new, mt con tr null (zero) s c tr v. V vy cc bn nn kim tra xem con tr tr v bi ton t new c bng null hay khng:
int * bobby; bobby = new int [5]; if (bobby == NULL) {
53
Ton t delete. V b nh ng ch cn thit trong mt khong thi gian nht nh, khi n khng cn dng n na th n s c gii phng c th cp pht cho cc nhu cu khc trong tng lai. thc hin vic ny ta dng ton t delete, dng thc ca n nh sau:
delete pointer;
hoc
delete [] pointer;
Biu thc u tin nn c dng gii phng b nh c cp pht cho mt phn t v lnh th hai dng gii phng mt khi nh gm nhiu phn t (mng). Trong hu ht cc trnh dch c hai biu thc l tng ng mc d chng l r rng l hai ton t khc nhau.
// rememb-o-matic #include <iostream.h> #include <stdlib.h> int main () { char input [100]; int i,n; long * l, total = 0; cout << "How many numbers do you want to type in? "; cin.getline (input,100); i=atoi (input); l= new long[i]; if (l == NULL) exit (1); for (n=0; n<i; n++) { cout << "Enter number: "; cin.getline (input,100); l[n]=atol (input); } cout << "You have entered: "; for (n=0; n<i; n++) cout << l[n] << ", "; delete[] l; return 0; } NULL How many numbers do you want to type in? 5 Enter number : 75 Enter number : 436 Enter number : 1067 Enter number : 8 Enter number : 32 You have entered: 75, 436, 1067, 8, 32,
l mt hng s c nh ngha trong th vin C++ dng biu th con tr null. Trong trng hp hng s ny cha nh ngha bn c th t nh ngha n:
#define NULL 0
Dng 0 hay NULL khi kim tra con tr l nh nhau nhng vic dng NULL vi con tr c s dng rt rng ri v iu ny c khuyn khch gip cho chng trnh d c hn.
B nh ng trong ANSI-C
54
Ton t new v delete l c quyn C++ v chng khng c trong ngn ng C. Trong ngn ng C, c th s dng b nh ng chng ta phi s dng th vin stdlib.h. Chng ta s xem xt cch ny v n cng hp l trong C++ v n vn cn c s dng trong mt s chng trnh. Hm malloc y l mt hm tng qut cp pht b nh ng cho con tr. Cu trc ca n nh sau:
void * malloc (size_t nbytes);
trong nbytes l s byte chng ta mun gn cho con tr. Hm ny tr v mt con tr kiu void*, v vy chng ta phi chuyn i kiu sang kiu ca con tr ch, v d:
char * ronny; ronny = (char *) malloc (10);
on m ny cp pht cho con tr ronny mt khi nh 10 byte. Khi chng ta mun cp pht mt khi d liu c kiu khc char (ln hn 1 byte) chng ta phi nhn s phn t mong mun vi kch thc ca chng. Tht may mn l chng ta c ton t sizeof, ton t ny tr v kch thc ca mt kiu d liu c th.
int * bobby; bobby = (int *) malloc (5 * sizeof(int));
on m ny cp pht cho bobby mt khi nh gm 5 s nguyn kiu int, kch c ca kiu d liu ny c th bng 2, 4 hay hn ty thuc vo h thng m chng trnh c dch. Hm calloc. calloc hot ng rt ging vi malloc, s khc nhau ch yu l khai bo mu ca n:
void * calloc (size_t nelements, size_t size);
n s dng hai tham s thay v mt. Hai tham s ny c nhn vi nhau c c kch thc tng cng ca khi nh cn cp pht. Thng thng tham s u tin (nelements) l s phn t v tham s thc hai (size) l kch thc ca mi phn t. V d, chng ta c th nh ngha bobby vi calloc nh sau:
int * bobby; bobby = (int *) calloc (5, sizeof(int));
Mt im khc nhau na gia malloc v calloc l calloc khi to tt c cc phn t ca n v 0. Hm realloc. N thay i kch thc ca khi nh c cp pht cho mt con tr.
void * realloc (void * pointer, size_t size);
tham s pointer nhn vo mt con tr c cp pht b nh hay mt con tr null, v size ch nh kch thc ca khi nh mi. Hm ny s cp pht size byte b nh cho con tr. N c th phi thay i v v tr ca khi nh c th ch cho kch thc mi ca khi nh, trong trng hp ny ni dung hin thi ca khi nh c copy ti v tr mi m bo d liu khng b mt. Con tr mi tr ti khi nh c hm tr v. Nu khng th thay i kch thc ca khi nh th hm s tr v mt con tr null nhng tham s pointer v ni dung ca n s khng b thay i. 55
Bi 3.5
Cc cu trc
Cc cu trc d liu.
Mt cu trc d liu l mt tp hp ca nhng kiu d liu khc nhau c gp li vi mt ci tn duy nht. Dng thc ca n nh sau:
struct model_name { type1 element1; type2 element2; type3 element3; . . } object_name; trong model_name l tn ca mu
kiu d liu v tham s ty chn object_name mt tn hp l cho i tng. Bn trong cp ngoc nhn l tn cc phn t ca cu trc v kiu ca chng. Nu nh ngha ca cu trc bao gm tham s model_name (tu chn), tham s ny tr thnh mt tn kiu hp l tng ng vi cu trc. V d:
struct products { char name [30]; float price; } ; products apple; products orange, melon; ta nh ngha cu trc products
Chng vi hai trng: name v price, mi trng c mt kiu khc nhau. Chng ta cng s dng tn ca kiu cu trc (products) khai bo ba i tng c kiu : apple, orange v melon. Sau khi c khai bo, products tr thnh mt tn kiu hp l ging cc kiu c bn nh int, char hay short. Trng tu chn object_name c th nm cui ca phn khai bo cu trc dng khai bo trc tip i tng c kiu cu trc. V d, khai bo cc i tng apple, orange v melon nh lm phn trc chng ta cng c th lm theo cch sau:
struct products { char name [30]; float price; } apple, orange, melon;
Hn na, trong trng hp ny tham s model_name tr thnh tu chn. Mc d nu model_name khng c s dng th chng ta s khng th khai bo thm cc i tng c kiu mu ny. 56
Mt iu quan trng l cn phn bit r rng u l kiu mu cu trc, u l i tng cu trc. Nu dng cc thut ng chng ta s dng vi cc bin, kiu mu l tn kiu d liu cn i tng l cc bin. Sau khi khai bo ba i tng c kiu l mt mu cu trc xc nh ( apple, orange and melon) chng ta c th thao tc vi cc trng to nn chng. lm vic ny chng ta s dng mt du chm ( .) chn gia tn i tng v tn trng. V d, chng ta c th thao tc vi bt k phn t no ca cu trc nh l i vi cc bin chun :
apple.name apple.price orange.name orange.price melon.name melon.price
mi trng c kiu d liu tng ng: apple.name, orange.name v melon.name c kiu char[30], v apple.price, orange.price v melon.price c kiu float. Chng ta tm bit apples, oranges v melons n vi mt v d v cc b phim:
// example about structures #include <iostream.h> #include <string.h> #include <stdlib.h> struct movies_t { char title [50]; int year; } mine, yours; void printmovie (movies_t movie); int main () { char buffer [50]; strcpy (mine.title, Odyssey"); mine.year = 1968; "2001 A Space Enter Enter title: year: movie Odyssey Alien 1979 is: (1968) yours:
cout << "Enter title: "; cin.getline (yours.title,50); cout << "Enter year: "; cin.getline (buffer,50); yours.year = atoi (buffer); cout << "My favourite movie is:\n "; printmovie (mine); cout << "And yours:\n "; printmovie (yours); return 0; } void printmovie (movies_t movie) { cout << movie.title;
57
V d ny cho chng ta thy cch s dng cc phn t ca mt cu trc v bn thn cu trc nh l cc bin thng thng. V d, yours.year l mt bin hp l c kiu int cng nh mine.title l mt mng hp l vi 50 phn t kiu chars. Ch rng c mine and yours u c coi l cc bin hp l kiu movie_t khi c truyn cho hm printmovie().Hn na mt li th quan trng ca cu trc l chng ta c th xt cc phn t ca chng mt cch ring bit hoc ton b cu trc nh l mt khi. Cc cu trc c s dng rt nhiu xy dng c s d liu c bit nu chng ta xt n kh nng xy dng cc mng ca chng.
// array of structures #include <iostream.h> #include <stdlib.h> #define N_MOVIES 5 struct movies_t { char title [50]; int year; } films [N_MOVIES]; void printmovie (movies_t movie); int main () { char buffer [50]; int n; for (n=0; n<N_MOVIES; n++) { cout << "Enter title: "; cin.getline (films[n].title,50); cout << "Enter year: "; cin.getline (buffer,50); films[n].year = atoi (buffer); } cout << "\nYou have entered movies:\n"; for (n=0; n<N_MOVIES; n++) printmovie (films[n]); return 0; } Enter Enter Enter Enter Enter Enter Enter Enter Enter Enter title: year: title: Blade year: title: year: title: Rear year: title: Taxi year: these Alien 1979 Runner 1982 Matrix 1999 Window 1954 Driver 1975 movies: (1979) (1982) (1999) (1954)
You have entered Alien Blade Runner Matrix Rear Window Taxi Driver (1975)
these
void printmovie (movies_t movie) { cout << movie.title; cout << " (" << movie.year << ")\n"; }
Con tr tr n cu trc
58
Nh bt k cc kiu d liu no khc, cc cu trc c th c tr n bi con tr. Quy tc hon ton ging nh i vi bt k kiu d liu c bn no:
struct movies_t { char title [50]; int year; }; movies_t amovie; movies_t * pmovie; amovie l mt i tng
y c kiu movies_t v pmovie l mt con tr tr ti i tng movies_t. OK, by gi chng ta s n vi mt v d khc, n s gii thiu mt ton t mi:
// pointers to structures #include <iostream.h> #include <stdlib.h> struct movies_t { char title [50]; int year; }; int main () { char buffer[50]; movies_t amovie; movies_t * pmovie; pmovie = & amovie; cout << "Enter title: "; cin.getline (pmovie->title,50); cout << "Enter year: "; cin.getline (buffer,50); pmovie->year = atoi (buffer); cout << "\nYou have entered:\n"; cout << pmovie->title; cout << " (" << pmovie->year << ")\n"; } return 0; Enter Enter You Matrix (1999) title: year: have Matrix 1999 entered:
on m trn gii thiu mt iu quan trng: ton t ->. y l mt ton t tham chiu ch dng tr ti cc cu trc v cc lp (class). N cho php chng ta khng phi dng ngoc mi khi tham chiu n mt phn t ca cu trc. Trong v d ny chng ta s dng:
movies->title
n c th c dch thnh:
(*movies).title
c hai biu thc movies->title v (*movies).title u hp l v chng u dng tham chiu n phn t title ca cu trc c tr bi movies. Bn cn phn bit r rng vi: 59
*movies.title
n tng ng vi
*(movies.title)
lnh ny dng tnh ton gi tr c tr bi phn t title ca cu trc movies, trong trng hp ny (title khng phi l mt con tr) n chng c ngha g nhiu. Bn di y tng kt tt c cc kt hp c th c gia con tr v cu trc: Biu thc M t Tng ng vi
movies.title movies->title *movies.title
V vy, sau phn khai bo trn chng ta c th s dng cc biu thc sau:
charlie.name maria.favourite_movie.title charlie.favourite_movie.year pfriends->favourite_movie.year
(trong hai biu thc cui cng l tng ng). Cc khi nim c bn v cu trc c cp n trong phn ny l hon ton ging vi ngn ng C, tuy nhin trong C++, cu trc c m rng thm cc chc nng ca mt lp vi tnh cht c trng l tt c cc phn t ca n u l cng cng (public).
Bi 3.6
Trong bi trc chng ta xem xt mt loi d liu c nh ngha bi ngi dng (ngi lp trnh): cu trc. Nhng c cn nhiu kiu d liu t nh ngha khc:
trong existing_type l mt kiu d liu c bn hay bt k mt kiu d liu nh ngha v new_type_name l tn ca kiu d liu mi. V d
typedef typedef unsigned typedef char typedef char field [50]; char * int C; WORD; string_t;
Trong trng hp ny chng ta nh ngha bn kiu d liu mi: C, WORD, string_t v field kiu char, unsigned int, char* kiu char[50], chng ta hon ton c th s dng chng nh l cc kiu d liu hp l:
C WORD string_t field name; typedef achar, anotherchar, *ptchar1; myword; ptchar2;
c th hu dng khi bn mun nh ngha mt kiu d liu c dng lp i lp li trong chng trnh hoc kiu d liu bn mun dng c tn qu di v bn mun n c tn ngn hn.
Union
Union cho php mt phn b nh c th c truy xut di dng nhiu kiu d liu khc nhau mc d tt c chng u nm cng mt v tr trong b nh. Phn khai bo v s dng n tng t vi cu trc nhng chc nng th khc hon ton:
union model_name { type1 element1; type2 element2; type3 element3; . . } object_name;
Tt c cc phn t ca union u chim cng mt ch trong b nh. Kch thc ca n l kch thc ca phn t ln nht. V d:
union mytypes_t { char c; int i; float f; } mytypes;
nh ngha ba phn t 61
mi phn t c mt kiu d liu khc nhau. Nhng v tt c chng u nm cng mt ch trong b nh nn bt k s thay i no i vi mt phn t s nh hng ti tt c cc thnh phn cn li. Mt trong nhng cng dng ca union l dng kt hp mt kiu d liu c bn vi mt mng hay cc cu trc gm cc phn t nh hn. V d:
union mix_t{ long l; struct { short hi; short lo; } s; char c[4]; } mix;
nh ngha ba phn t cho php chng ta truy xut n cng mt nhm 4 byte: mix.l, mix.s v mix.c m chng ta c th s dng tu theo vic chng ta mun truy xut n nhm 4 byte ny nh th no. Ti dng nhiu kiu d liu khc nhau, mng v cu trc trong union bn c th thy cc cch khc nhau m chng
Cc unions v danh
Trong C++ chng ta c th s dng cc unions v danh. Nu chng ta t mt union trong mt cu trc m khng tn (phn i sau cp ngoc nhn { }) union s tr thnh v danh v chng ta c th truy xut trc tip n cc phn t ca n m khng cn n tn ca union (c cn cng khng c). V d, hy xem xt s khc bit gia hai phn khai bo sau y: union union v danh
struct { char title[50]; char author[50]; union { float dollars; int yens; } price; } book; struct { char title[50]; char author[50]; union { float dollars; int yens; }; } book;
S khc bit duy nht gia hai on m ny l trong on m u tin chng ta t tn cho union ( price) cn trong ci th hai th khng. Khi truy nhp vo cc phn t dollars v yens, trong trng hp th nht chng ta vit:
book.price.dollars book.price.yens
62
Mt ln na ti nhc li rng v n l mt union, hai trng dollars v yens u chim cng mt ch trong b nh nn chng khng th gi hai gi tr khc nhau.
Ch rng chng ta khng s dng bt k mt kiu d liu c bn no trong phn khai bo. Chng ta to ra mt kiu d liu mi m khng da trn bt k kiu d liu no c sn: kiu color_t, nhng gi tr c th ca kiu color_t c vit trong cp ngoc nhn {}. V d, sau khi khai bo kiu lit k, biu thc sau s l hp l:
colors_t mycolor = if (mycolor == green) mycolor = red; mycolor; blue;
Trn thc t kiu d liu lit k c dch l mt s nguyn v cc gi tr ca n l cc hng s nguyn c ch nh. Nu iu ny khng oc ch nh, gi tr nguyn tng ng vi phn t u tin l 0 v cc gi tr tip theo c th tng ln 1, V vy, trong kiu d liu colors_t m chng ta nh ngha trn, white tng ng vi 0, blue tng ng vi 1, green tng ng vi 2 v c tip tc nh th. Nu chng ta ch nh mt gi tr nguyn cho mt gi tr no ca kiu d liu lit k (trong v d ny l phn t u tin) cc gi tr tip theo s l cc gi tr nguyn tip theo, v d:
enum months_t { january=1, february, march, april, may, june, july, august, september, october, november, december} y2k; trong trng hp ny, bin y2k c kiu d liu lit k months_t c th cha mt trong 12 gi tr t january n december v tng ng vi cc gi tr nguyn t 1 n 12, khng phi 0 n 11 v chng ta t january bng 1.
Bi 4.1
Cc lp
63
Lp l mt phng thc logic t chc d liu v cc hm trong cng mt cu trc. Chng c khai bo s dng t kho class, t ny c chc nng tng t vi t kho ca C struct nhng c kh nng gp thm cc hm thnh vin. Dng thc ca n nh sau:
class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name; trong class_name l tn ca lp ( kiu ngi dng t nh ngha) v trng mc nh object_name l mt
hay mt vi tn i tng hp l. Phn thn ca khai bo cha cc thnh vin ca lp, c th l d liu hay cc hm v c th l cc nhn cho php ( permission labels) l mt trong nhng t kho sau y: private:, public: hoc protected:.
Cc thnh vin private ca mt lp ch c th c truy xut t cc thnh vin khc ca lp hoc t cc lp "bn b". Cc thnh vin protected c th c truy xut t cc thnh vin trong cng mt lp v cc lp bn b, thm vo l t cc thnh vin ca cc lp tha k Cui cng, cc thnh vin public c th c truy xut t bt k ch no m lp nhn thy.
Nu chng ta khai bo cc thnh vin ca mt lp trc khi thm vo cc nhn cho php th cc thnh vin c coi l private. V d:
class CRectangle { int x, y; public: void set_values (int,int); int area (void); } rect; Khai bo lp CRectangle v mt i tng c tn rect c kiu l lp CRectangle. Lp ny cha bn thnh vin: hai vin c kiu int (x v y) trong phn private (v private l s cho php mc nh) v hai hm trong phn public: set_values() v area(), y chng ta ch mi khai bo mu.
Hy ch s khc bit gia tn lp v tn i i tng: Trong v d trc, CRectangle l tn lp cn rect l tn mt i tng c kiu CRectangle. Trong cc phn tip theo ca chng trnh chng ta c th truy xut n cc thnh vin public ca i tng rect nh l i vi cc hm hay cc bin thng thng bng cch t tn ca i tng ri sau l mt du chm v tn thnh vin ca lp (nh chng ta lm vi cc cu trc ca C). V d:
(3,4);
nhng chng ta khng c kh nng truy xut n x hay y v chng l cc thnh vin private ca lp v chng ch c th c truy xut t cc thnh vin ca cng mt lp. Bi ri? y l v d y v lp CRectangle:
area: 12
64
public: void set_values (int,int); int area (void) {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b; } int main () { CRectangle rect; rect.set_values (3,4); cout << "area: " << rect.area(); }
Mt iu mi trong on m ny l ton t phm vi :: c dng trong khai bo set_values(). N c s dng khai bo bn ngoi cc thnh vin ca mt lp. Ch rng chng ta nh ngha y hm area() ngay bn trong lp trong khi hm set_values() mi ch c khai bo mu cn nh ngha ca n nm ngoi lp. Trong phn khai bo ngoi ny chng ta bt buc phi dng ton t ::. S khc bit duy nht gia vic khai bo y mt hm bn trong lp v vic ch khai bo mu l trong trng hp th nht hm s c t ng coi l inline bi trnh dch, cn trong trng hp th hai n s l mt hm thnh vin bnh thng. L do khin chng ta khai bo x v y l cc thnh vin private v chng ta nh ngha mt hm thtc vi chng (set_values()) v khng c l do g truy nhp trc tip n cc bin ny. C l trong v d rt n gin ny bn khng thy c mt tin ch ln khi bo v hai bin ny nhng trong cc d n ln hn n c th l rt quan trng khi m bo c rng cc gi tr khng b thay i mt cch khng mong mun. Mt ch li na ca lp l chng ta c th khai bo mt vi i tng khc nhau t n. V d, tip sau y l v d trc v lp CRectangle, ti ch thm phn khai bo thm i tng rectb.
// class example #include <iostream.h> class CRectangle { int x, y; public: void set_values (int,int); int area (void) {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b; } int main () { CRectangle rect, rectb; rect.set_values (3,4); rectb.set_values (5,6); cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area()
area:
12
65
<< endl; }
Ch rng li gi n rect.area() khng cho cng kt qu vi rectb.area() v mi i tng ca lp CRectangle c cc bin v cc hm ca ring n Trn y l nhng khi nim c bn v i tng v lp trnh hng i tng. Trong i tng cc d liu v cc hm l cc thuc tnh thay v trc y i tng l cc tham s ca hm trong lp trnh cu trc. Trong bi ny cc phn tip sau chng ta s ni n nhng li ch ca phng thc ny.
Constructors v destructors
Ni chung cc i tng cn phi khi to cc bin hoc cp pht b nh ng trong qu trnh to ra chng c th hot ng tt v trnh c vic tr v cc gi tr khng mong mun. V d, iu g s xy ra nu chng ta gi hm area() trc khi gi hm set_values?C l kt qu s l mt gi tr khng xc nh v cc thnh vin x v y cha c gn mt gi tr c th no. trnh iu ny, mt lp cn c mt hm c bit: mt constructor, hm ny c th c khai bo bng cch t tn trng vi tn ca lp. N s c gi t ng khi mt khai bo mt i tng mi hoc cp pht mt i tng c kiu l lp . Chng ta thm mt constructor vo lp CRectangle:
// classes example #include <iostream.h> class CRectangle { int width, height; public: CRectangle (int,int); int area (void) (width*height);} };
area:
12
{return
CRectangle::CRectangle (int a, int b) { width = a; height = b; } int main () { CRectangle rect (3,4); CRectangle rectb (5,6); cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl; }
Nh bn c th thy, kt qu ca v d ny ging vi v d trc. Trong trng hp ny chng ta ch thay th hm set_values bng mt hm constructor. Hy ch cch m cc tham s c truyn cho constructor khi mt i tng c to ra:
rect
(3,4);
Bn c th thy rng constructor khng c gi tr tr v, ngay c kiu void cng khng. iu ny lun lun phi nh vy.
66
Destructor lm cc chc nng ngc li. N s c t ng gi khi mt i tng c gii phng khi b nh hay phm vi tn ti ca n kt thc (v d nh nu n c nh ngha l mt i tng cc b bn trong mt hm v khi hm kt thc th phm vi tn ti ca n cng ht) hoc n l mt i tng i tng c cp pht ng v s gii phng bi ton t delete. Destructor phi c cng tn vi tn lp vi du (~) ng trc v n khng c tr v gi tr no. Destructor c bit ph hp khi m mt i tng cp pht b nh ng trong qu trnh tn ti ca n v trong thi im b hu b chng ta mun gii phng b nh m n s dng.
// example on constructors and destructors #include <iostream.h> class CRectangle { int *width, *height; public: CRectangle (int,int); ~CRectangle (); int area (void) {return (*width * *height);} }; CRectangle::CRectangle (int a, int b) { width = new int; height = new int; *width = a; *height = b; } CRectangle::~CRectangle () { delete width; delete height; } int main () { CRectangle rect (3,4), rectb (5,6); cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl; return 0; }
area:
12
Qu ti cc Constructors
Nh bt k hm no khc, mt constructor c th c qu ti bi mt vi hm c cng tn nhng khc kiu hay khc s tham s. Nh rng mt thi im trnh dch ch thc hin mt hm ph hp (xem phn 2.3, Hm-II). Do vy ch mt hm constructor ph hp c gi vo thi im mt i tng lp c khai bo. Trong thc t, khi khai bo mt lp m chng ta khng ch nh mt hm constructor no th trnh dch s t ng to ra hai constructor qu ti ("constructor mc nh" v "copy constructor"). V d, i vi lp:
class CExample { public: int a,b,c; void multiply (int n, int m) { a=n; b=m; c=a*b; }; };
67
rng
CExample::CExample () { };
Copy constructor y l mt constructor c mt tham s cng kiu vi lp. N thc hin mt vic l gn tt c cc bin thnh vin khng tnh (nonstatic) ca lp gi tr ca bin tng ng ca i tng tham s.
Cn phi nhn mnh rng cc constructor mc nh ny ch tn ti nu khng c constructor c khai bo. Tt nhin l bn c th qu ti constructor ca n cung cp cc constructor khc nhau cho cc mc ch khc nhau:
// overloading class constructors #include <iostream.h> class CRectangle { int width, height; public: CRectangle (); CRectangle (int,int); int area (void) (width*height);} }; CRectangle::CRectangle () { width = 5; height = 5; } CRectangle::CRectangle (int a, int b) { width = a; height = b; } int main () { CRectangle rect (3,4); CRectangle rectb; cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl; }
area:
12
{return
Trong trng hp ny rectb c khai bo khng dng tham s, v vy n c khi to vi constructor khng c tham s, constructor ny t width v height bng 5. Ch rng nu chng ta khai bo mt i tng mi v khng mun truyn tham s cho n th khng cn phi cp ngoc n ():
CRectangle rectb;
// ng
68
Con tr ti lp
To con tr tr ti cc lp l hon ton hp l, c th lm vic ny chng ta hiu rng mt khi c khai bo, lp tr thnh mt kiu d liu hp l, v vy chng ta c dng tn lp l kiu cho con tr. V d:
CRectangle * prect;
l mt con tr tr ti mt i tng ca lp CRectangle. Tng t vi cu trc, tham chiu trc tip ti mt thnh vin ca mt i tng c tr bi mt con tr bn nn dng ton t ->. y l mt v d:
// pointer to classes example #include <iostream.h> class CRectangle { int width, height; public: void set_values (int, int); int area (void) {return height);} };
2 12 2 30
void CRectangle::set_values (int a, int b) { width = a; height = b; } int main () { CRectangle a, *b, *c; CRectangle * d = new CRectangle[2]; b= new CRectangle; c= &a; a.set_values (1,2); b->set_values (3,4); d->set_values (5,6); d[1].set_values (7,8); cout << "a area: " << a.area() << endl; cout << "*b area: " << b->area() << endl; cout << "*c area: " << c->area() << endl; cout << "d[0] area: " << d[0].area() << endl; cout << "d[1] area: " << d[1].area() << endl; return 0; }
Di y l l bng tm tt v cc chc nng ca cc ton t lp (*, &, ., ->, [ ]) v cc con tr lp xut hin trong v d trn:
*x
c th c l:
tr bi x
69
&x c th c l: a ch ca x x.y c th c l: thnh vin y ca i tng x (*x).y c th c l: thn vin y ca i tng c tr bi x x->y c th c c l: thnh vin y ca i tng c tr bi x(tng ng vi dng trn) x[0] c th c l: i tng u tin c tr bi x x[1] c th c l: i tng th hai c tr bi x x[n] c th c c l: i tng th (n+1)c tr bi x
struct
Ngn ng C++ m rng t kho struct ca C lm cho n cng c cc chc nng nh t kho class ngoi tr mt iu l cc thnh vin ca n mc nh l public thay v private. Tuy nhin, mc d c class v struct gn nh l tng ng trong C++, struct thng ch dng cc cu trc d liu cn class th dng cho cc lp c c cc th tc v hm thnh vin.
Bi 4.2
int a, b, c; a = b + c;
Qu ti cc ton t
C++ cho php s dng cc ton t chun ca ngn ng gia cc lp ging nh vi cc kiu d liu c bn. V d:
l hon ton hp l v cc bin y u c kiu l cc kiu d liu c bn. Tuy nhin, vic chng ta c th thc hin thao tc sau y c v khng hin nhin lm (thc t l n khng hp l):
4,3
70
CVector () {}; CVector (int,int); CVector operator + (CVector); }; CVector::CVector (int a, int b) { x = a; y = b; } CVector CVector::operator+ (CVector param) { CVector temp; temp.x = x + param.x; temp.y = y + param.y; return (temp); } int main () { CVector a (3,1); CVector b (1,2); CVector c; c = a + b; cout << c.x << "," << c.y; return 0; }
Nu bn thy qu nhiu CVector hy rng mt s trong chng tham chiu n tn lp CVector cn s cn li l tn cc hm (constructor v destructor). ng ln ln CVector (int, int); // Hm c tn Vector (constructor) CVector operator+ (CVector); // Hm operator+ tr v kiu CVector Hm operator+ ca lp CVector c dng qu ti ton t s hc +. Hm ny c th c gi bng mt trong cc cch:
c = c = a.operator+ (b);
b;
Hy ch rng chng ta thm vo constructor rng (khng c tham s) v chng ta nh ngha n vi mt khi lnh cng rng nt:
CVector () { };
iu ny l cn thit v cn c mt constructor khc,
CVector c;
D th no chng na, ti cn phi cnh bo rng mt khi lnh rng khng nn to mt constructor v n khng tho mn chc nng ti thiu m mt constructor nn c, l vic khi to tt c cc bin trong lp. Trong trng hp ca chng ta constructor ny cc bin x v y l khng xc nh. V vy mt khai bo thch
71
hp hn s l mt ci g ging nh th ny:
@a a@ a@b
+ - * & ! ~ ++ A::operator@() -++ -A::operator@(int) + - * / % ^ & | < > == != <= >= A::operator@(B) << >> && || , = += -= *= /= %= ^= &= |= <<= A::operator@(B) >>= [ ] () -> A::operator()(B, C...) A::operator->()
* trong a l mt i tng ca lp A, b l mt i tng ca lp B v c l mt i tng ca lp C. Nh bn c th thy trong bng ny, c hai cch qu ti cc ton t ca lp: nh l mt hm thnh vin v nh l mt hm ton cc. Khc nhau gia chng khng r rng tuy nhin ti cn phi nhc li rng cc hm khng phi l thnh vin ca mt lp khng th truy xut n cc thnh vin l private hoc protected ca lp tr phi hm ton cc l bn ca lp (thut ng ny s c cp n bi sau).
T kho
this
T kho this bn trong mt lp i din cho i tng ca lp ang c thc hin trong b nh. N l mt con tr lun c gi tr l a ch ca i tng. N c th c dng kim tra xem tham s c truyn cho mt hm thnh vin c phi chnh bn thn i tng hay khng. V d:
yes, &a is b
72
class CDummy { public: int isitme (CDummy& param); }; int CDummy::isitme (CDummy& param) { if (¶m == this) return 1; else return 0; } int main () { CDummy a; CDummy* b = &a; if ( b->isitme(a) ) cout << "yes, &a is b"; return 0; }
N cng thng c dng trong hm thnh vin operator= m tr v a ch i tng (trnh vic s dng i tng tm thi). Tip theo v d v vector u bi chng ta c th vit mt hm operator= nh sau:
// static members in classes #include <iostream.h> class CDummy { public: static int n; CDummy () { n++; }; ~CDummy () { n--; }; }; int CDummy::n=0; int main () { CDummy a; CDummy b[5]; CDummy * c = new CDummy; cout << a.n << endl;
7 6
73
Bi 4.3
Quan h gia cc lp
friend
Cc hm bn b (t kho
Trong bi trc chng ta c bit rng c ba mc bo v khc nhau i vi cc thnh vin trong mt lp: public, protected v private. i vi cc thnh vin protected v private, chng khng th c truy xut bn ngoi lp m chng c khai bo. Tuy nhin ci g cng c ngoi l, bng cch s dng t kho friend trong mt lp chng ta c th cho php mt hm bn ngoi truy xut vo cc thnh vin protected v private trong mt lp. c th cho php mt hm bn ngoi truy xut vo cc thnh vin private v protected ca mt lp chng ta phi khai bo mu hm vi t kho friend bn trong phn khai bo ca lp. Trong v d sau chng ta khai bo hm bn b duplicate:
// friend functions #include <iostream.h> class CRectangle { int width, height; public: void set_values (int, int); int area (void) {return (width * height);} friend CRectangle duplicate (CRectangle); };
24
74
void CRectangle::set_values (int a, int b) { width = a; height = b; } CRectangle duplicate (CRectangle rectparam) { CRectangle rectres; rectres.width = rectparam.width*2; rectres.height = rectparam.height*2; return (rectres); } int main () { CRectangle rect, rectb; rect.set_values (2,3); rectb = duplicate (rect); cout << rectb.area(); }
bn trong hm duplicate, chng ta c th truy xut vo cc thnh vin width v height ca cc i tng khc nhau thuc lp CRectangle. Hy ch rng duplicate() khng phi l thnh vin ca lp CRectangle. Ni chung vic s dng cc hm bn b khng nm trong phng thc lp trnh hng i tng, v vy tt hn l hy s dng cc thnh vin ca lp bt c khi no c th. Nh trong v d trc, chng ta hon ton c th tch hp duplicate() vo bn trong lp.
Cc lp bn b (friend)
Ngoi vic c th khai bo cc hm bn b, chng ta cng c th nh ngha mt lp l bn ca mt lp khc. Vic ny s cho php lp th hai c th truy xut vo cc thnh vin protected and private ca lp th nht:
// friend class #include <iostream.h> class CSquare; class CRectangle { int width, height; public: int area (void) {return (width * height);} void convert (CSquare a); }; class CSquare { private: int side; public: void set_side (int a) {side=a;} friend class CRectangle; }; void CRectangle::convert (CSquare a) {
16
75
int main () { CSquare sqr; CRectangle rect; sqr.set_side(4); rect.convert(sqr); cout << rect.area(); return 0; }
Trong v d ny chng ta khai bo CRectangle l bn ca CSquare nn CRectangle c th truy xut vo cc thnh vin protected and private ca CSquare, c th hn l CSquare::side, bin nh ngha kch thc ca hnh vung. Bn c th thy mt iu mi l trong chng trnh, l phn khai bo mu rng ca lp CSquare, iu ny l cn thit v bn trong phn khai bo ca CRectangle chng ta tham chiu n CSquare (nh l mt tham s trong convert()). Phn nh ngha y ca CSquare c vit sau. Ch rng tnh bn gia hai lp c th khng nh nhau nu chng ta khng ch nh. Trong v d ny CRectangle c coi l bn ca CSquare nhng i vi CRectangle th khng. Bi vy CRectangle c th truy xut vo cc thnh vin protected v private ca CSquare nhng iu ngc li l khng ng. Tuy nhin chng c g cm on chng ta khai bo CSquare l bn ca CRectangle.
S tha k gia cc lp
Mt trong nhng tnh nng quan trng ca lp l s tha k. N cho php chng ta to mt i tng xut php t mt i tng khc. V d, gi s chng ta mun khai bo mt lot cc lp m t cc a gic nh l CRectangle hay CTriangle. C hai u c nhng c tnh chung, v d nh l chiu cao v y. iu ny c th c biu din bng lp CPolygon m t chng ta c th tha k hai lp, l CRectangle v CTriangle.
Lp CPolygon s cha cc thnh vin chung i vi mi a gic. Trong trng hp ca chng ta: chiu rng v chiu cao. Cc lp xut pht t cc lp khc c tha hng tt c cc thnh vin nhn thy c ca lp. iu ny c ngha l mt lp c s c thnh vin A v chng ta to thm mt lp xut pht t n vi mt thnh vin mi l B, lp c tha k s c c A v B. c th tha k mt lp t mt lp khc, chng ta s dng ton t : (du hai chm ) trong phn khai bo ca lp con:
76
// derived classes #include <iostream.h> class CPolygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b;} }; class CRectangle: public CPolygon { public: int area (void) { return (width * height); } }; class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; rect.set_values (4,5); trgl.set_values (4,5); cout << rect.area() << endl; cout << trgl.area() << endl; return 0; }
20 10
Nh bn c th thy, cc i tng ca lp CRectangle v CTriangle cha tt c cc thnh vin ca CPolygon, l width, height v set_values(). T kho protected tng t vi private, s khc bit duy nht ch xy ra khi tha k cc lp. Khi chng ta tha k mt lp, cc thnh vin protected ca lp c s c th c dng bi cc thnh vin khc ca lp c tha k cn cc thnh vin private th khng. V chng ta mun rng width v height c th c tnh ton bi cc thnh vin ca cc lp c tha k CRectangle v CTriangle ch khng ch bi cc thnh vin ca CPolygon, chng ta s dng t kho protected thay v private. Chng ta c th tng kt li cc kiu truy xut khc nhau tu theo ai truy xut chng: Truy xut Cc thnh vin trong cng lp Khng phi l thnh vin
trong "khng phi l thnh vin" i din cho bt k s tham chiu no t bn ngoi lp, v d nh l t main(), t mt lp khc hay t bt k hm no.
77
Trong v d ca chng ta, cc thnh vin c tha k bi CRectangle v CTriangle cng tun theo cc quyn truy xut nh i vi lp c s CPolygon:
Nhng g c tha k t lp c s?
V nguyn tc tt c cc thnh vin ca lp u c tha k tr:
Mc d constructor v destructor ca lp c s khng c tha k, constructor mc nh (constructor khng c tham s) v destructor ca lp c s lun lun c gi khi mt i tng ca lp c tha k c to lp hay ph hu. Nu lp c s khng c constructor mc nh hay bn mun mt constructor qu ti c gi khi mt i tng mi ca lp c tha k c to lp, bn c th ch nh n mi nh ngha ca constructor trong lp c tha k:
mother: daughter:
no int
class mother { mother: int public: son: int parameter mother () { cout << "mother: no parameters\n"; }
78
} };
class daughter : public mother { public: daughter (int a) { cout << "daughter: parameter\n\n"; } }; class son : public mother { public: son (int a) : mother (a) { cout << parameter\n\n"; } }; int main () { daughter cynthia (1); son daniel(1); } return 0;
int
"son:
int
Hy quan st s khc bit gia vic constructor ca mother c gi khi khi mt i tng daughter mi c to lp v khi mt i tng son c to lp. S d c s khc bit ny l do phn khai bo constructor ca daughter v son:
a tha k
Trong C++ chng ta c th to lp mt lp tha k cc trng v cc phng thc t nhiu hn mt lp. iu ny c th thc hin bng cch tch cc lp c s khc nhau bng du phy trong phn khai bo ca lp c tha k. V d, nu chng ta c mt lp dng in ra mn hnh ( COutput) v chng ta mun cc lp ca chng ta CRectangle v CTriangle cng tha k cc thnh vin ca n cng vi cc thnh vin ca CPolygon, chng ta c th vit:
class CRectangle: public CPolygon, public COutput { class CTriangle: public CPolygon, public COutput {
y l v d y :
// a tha k #include <iostream.h> class CPolygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b;}
20 10
79
}; class COutput { public: void output (int i); }; void COutput::output (int i) { cout << i << endl; } class CRectangle: public CPolygon, public COutput { public: int area (void) { return (width * height); } }; class CTriangle: public CPolygon, public COutput { public: int area (void) { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; rect.set_values (4,5); trgl.set_values (4,5); rect.output (rect.area()); trgl.output (trgl.area()); return 0; }
int a::b(c) {}; // Cc lp (Bi 4.1) a->b // Con tr v i tng (Bi 4.2) class a: public b; // Quan h gia cc lp(Bi 4.3)
Con tr ti lp c s
Mt trong nhng li th ln ca vic tha k cc lp l mt con tr tr ti mt lp c tha k l tng thch v kiu vi mt con tr tr ti lp c s ca n. Bi ny s cp y n vic tn dng tnh nng mnh m ny ca C++. V d, chng ta s vit li chng trnh ca chng ta v hnh ch nht v hnh tam gic trong chng trc xem xt tnh nng ny:
20 10
80
int width, height; public: void set_values (int a, int b) { width=a; height=b; } }; class CRectangle: public CPolygon { public: int area (void) { return (width * height); } }; class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; CPolygon * ppoly1 = ▭ CPolygon * ppoly2 = &trgl; ppoly1->set_values (4,5); ppoly2->set_values (4,5); cout << rect.area() << endl; cout << sqre.area() << endl; return 0; }
Hm main to hai con tr tr ti hai i tng ca lp CPolygon, l *ppoly1 v *ppoly2. Chng c gn cho a ch ca rect v trgl, y l cc i tng thuc lp tha k t CPolygon nn l nhng php gn hp l. S hn ch duy nht khi s dng *ppoly1 v *ppoly2 thay v rect v trgl l c *ppoly1 v *ppoly2 u c kiu l CPolygon* v v vy chng ta ch c th tham chiu n cc thnh vin m CRectangle v CTriangle c tha k t CPolygon. V nguyn nhn chng ta khng th gi n thnh vin area() khi dng *ppoly1 v *ppoly2. cc con tr c th truy xut n area() nh l mt thnh vin hp l, cn phi khai bo thnh vin ny trong lp c s ch khng ch trong cc lp tha k.
Cc thnh vin o
Nu mun khai bo mt phn t trong mt lp m chng ta mun nh ngha li n trong cc lp tha k th chng ta phi t trc n t kho virtual vic s dng con tr ti cc i tng thuc lp ny l thch hp. Hy xem v d sau:
// cc thnh vin o #include <iostream.h> class CPolygon { protected: int width, height; public:
20 10 0
81
};
void set_values (int a, int b) { width=a; height=b; } virtual int area (void) { return (0); }
class CRectangle: public CPolygon { public: int area (void) { return (width * height); } }; class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; CPolygon poly; CPolygon * ppoly1 = ▭ CPolygon * ppoly2 = &trgl; CPolygon * ppoly3 = &poly; ppoly1->set_values (4,5); ppoly2->set_values (4,5); ppoly3->set_values (4,5); cout << ppoly1->area() << endl; cout << ppoly2->area() << endl; cout << ppoly3->area() << endl; return 0; }
By gi c ba lp (CPolygon, CRectangle v CTriangle) u c cng cc thnh vin: width, height, set_values() v area().
area() c nh ngha l virtual v n s c nh ngha li trong cc lp tha k. Bn c th kim tra li rng nu bn b t kho v thc hin chng trnh th kt qu s l 0 cho c 3 a gic thay v 20,10,0. Nguyn nhn l do thay v gi hm area() tng ng vi mi i tng (CRectangle::area(), CTriangle::area() v CPolygon::area()), CPolygon::area() s c gi cho tt c thng qua mt con tr ti CPolygon.
Tru tng ho lp c s
Cc lp tru trng l mt ci g rt ging vi lp lp CPolygon trong v d trc ca chng ta. S khc bit duy nht l trong v d chng ta nh ngha hm area() cho cc i tng thuc lp CPolygon (ging nh i tng poly), trong khi trong mt lp tru tng c s chng ta c th b qua vic nh ngha hm ny bng cch thm =0(bng khng) vo phn khai bo hm. Lp CPolygon c th c nh ngha nh sau:
82
public: void set_values (int a, int b) { width=a; height=b; } virtual int area (void) =0; }; Hy ch cch chng ta thm =0 vo virtual int area (void) thay v nh ngha y cho hm. Kiu
hm ny c tn l l pure virtual function (hm o thun tu) v tt c cc lp cha bt k mt hm o thun tu no u c coi l lp tru tng c s. S khc bit ln ca mt lp tru tng c s l khng th to c cc i tng thuc lp. Nhng chng ta c th to cc con tr tr n chng. V vy mt khai bo nh sau:
CPolygon poly;
s l khng hp l cho lp tru tng c s c khai bo trn. Tuy nhin con tr:
ppoly1;
l hon ton hp l. C iu ny v hm tru tng thun tu m n c khng c nh ngha v khng th to c mt i tng nu nh cha nh ngha tt c cc thnh vin ca n. Tuy nhin mt con tr tr ti mt i tng thuc lp tha k m hm ny c nh ngha l hon ton hp l. Di y chng ta c mt v d y :
// cc thnh vin o. #include <iostream.h> class CPolygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; } virtual int area (void) =0; }; class CRectangle: public CPolygon { public: int area (void) { return (width * height); } }; class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; CPolygon * ppoly1 = ▭ CPolygon * ppoly2 = &trgl; ppoly1->set_values (4,5); ppoly2->set_values (4,5); cout << ppoly1->area() << endl; cout << ppoly2->area() << endl;
20 10
83
return 0; }
Nu bn xem li chng trnh bn s thy rng chng ta tham chiu n cc i tng thuc cc lp khc nhau nhng ch s dng mt kiu con tr duy nht. iu ny l cc k hu dng, by gi chng ta c th to mt hm thnh vin ca CPolygon c kh nng in ra mn hnh kt qu ca hm area() m khng ph thuc vo lp c tha k l lp no.
// ejemplo miembros virtuales #include <iostream.h> class CPolygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; } virtual int area (void) =0; void printarea (void) { cout << this->area() << endl; } }; class CRectangle: public CPolygon { public: int area (void) { return (width * height); } }; class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; CPolygon * ppoly1 = ▭ CPolygon * ppoly2 = &trgl; ppoly1->set_values (4,5); ppoly2->set_values (4,5); ppoly1->printarea(); ppoly2->printarea(); return 0; }
20 10
Hy nh rng this biu din mt con tr tr n i tng ang c thc hin. Cc lp tru tng v cc thnh vin o cung cp cho C++ tnh nng a hnh khin cho vic lp trnh hng i tng tr thnh mt cng c hu dng. Tt nhin chng ta thy cch n gin nht s dng nhng tnh nng ny, nhng hy tng tng nu nhng tnh nng ny c p dng cho cc mng cc i tng hay cc i tng c cp pht thng qua b nh ng.
84
85
Bi 5.1
Templates
Cc mu hm
Cc mu cho php to cc hm c th chp nhn bt k kiu d liu no lm tham s v tr v gi tr m khng phi lm qu ti hm vi tt c cc kiu d liu c th. Khai bo mu ca n c th l mt trong hai kiu sau:
dng u tin, chng ta to mt mu cho mt kiu d liu tng qut vi tn GenericType. V vy trong hm sau , GenericType tr thnh mt kiu d liu hp l v n c s dng nh l mt kiu d liu cho hai tham s a, b v gi tr tr v ca hm GetMax.
GenericType thc s khng biu din mt kiu d liu c th no, chng ta c th gi hm vi bt k kiu d liu hp l no. Kiu d liu ny s p ng nh l pattern(mu) v s thay th GenericType bn trong hm.
Cch thc gi mt lp mu vi mt kiu d liu mu nh sau:
// mu hm #include <iostream.h> template <class T> T GetMax (T a, T b) { T result; result = (a>b)? a : b; return (result); } int main () { int i=5, j=6, k; long l=10, m=5, n;
6 10
86
k=GetMax<int>(i,j); n=GetMax<long>(l,m); cout << k << endl; cout << n << endl; return 0; }
(Trong trng hp ny chng ta gi kiu d liu tng qut l T thay v GenericType v n ngn hn, thm vo n l mt trong nhng tn ph bin nht c dng cho mu mc d chng ta c th s dng bt c tn hp l no). v d trn chng ta s dng cng mt hm GetMax() vi cc tham s kiu int v long ch vi mt phin bn duy nht ca hm. Nh vy c th ni chng ta vit mt mu hm v gi n bng hai kiu khc nhau. Nh bn c th thy, bn trong mu hm GetMax() kiu T c th c dng khai bo cc i tng mi:
T result;
Trong trng hp c th ny kiu d liu tng qut T c s dng nh l tham s chao hm GetMax, trnh bin dch c th t ng tm thy kiu d liu no phi truyn cho n m khng cn bn phi ch nh <int> hay <long>. Bi vy chng ta c th vit:
i,j;
// mu hm II #include <iostream.h> template <class T> T GetMax (T a, T b) { return (a>b?a:b); } int main () { int i=5, j=6, k; long l=10, m=5, n; k=GetMax(i,j); n=GetMax(l,m); cout << z << endl; cout << n << endl; return 0; }
6 10
Ch trong trng hp ny, bn trong hm main() chng ta gi hm mu GetMax() m khng ch nh r kiu d liu gia hai ngoc nhn <>. Trnh bin dch s t ng xc nh kiu d liu no l cn thit ch mi li gi. V hm mu ca chng ta ch dng mt kiu d liu ( class T) v c hai tham s ca n u c cng mt kiu, chng ta khng th gi hm mu vi tham s l hai i tng c kiu khc nhau:
87
template <class T, class U> T GetMin (T a, U b) { return (a<b?a:b); } Trong trng hp ny, hm mu GetMin() chp nhn hai tham s c kiu khc nhau v tr v mt i tng c cng kiu vi tham s u tin (T). V d, sau khi khai bo nh trn chng ta c th gi hm nh sau: int i,j; long l; i = GetMin<int,long> (j,l);
hoc thm ch:
i = GetMin (j,l);
Cc lp mu
Chng ta cng c th vit cc lp mu, mt lp m c cc thnh vin da trn cc kiu d liu tng qut khng cn phi c nh ngha thi im to lp. V d
template <class T> class pair { T values [2]; public: pair (T first, T second) { values[0]=first; values[1]=second; } };
Lp m chng ta va nh ngha dng lu tr hai phn t c kiu bt k. V d, nu chng ta mun khai bo mt i tng thuc lp ny lu tr hai gi tr nguyn kiu int c gi tr l 115 and 36 chng ta c th vit:
// mu lp #include <iostream.h> template <class T> class pair { T value1, value2; public: pair (T first, T second) {value1=first; value2=second;} T getmax (); }; template <class T> T pair<T>::getmax () { T retval; retval = value1>value2? value1 : value2; return retval; }
100
88
int main () { pair <int> myobject (100, 75); cout << myobject.getmax(); return 0; }
ch cch bt u nh ngha hm getmax :
Chuyn mn ho mu
Vic chuyn mn ho mu cho php mt mu to ra nhng bn thc thi c bit khi lm vic vi mt loi d liu xc nh no . V d, gi s rng lp mu pair c mt hm dng tr v phn d trong php chia gia hai trng trong, nhng chng ta ch mun n lm vic khi kiu d liu l int cn nhng kiu cn li th hm lun tr v 0. N c th c lm theo cch sau:
// Chuyn mn ho mu #include <iostream.h> template <class T> class pair { T value1, value2; public: pair (T first, T second) {value1=first; value2=second;} T module () {return 0;} }; template <> class pair <int> { int value1, value2; public: pair (int first, int second) {value1=first; value2=second;} int module (); }; template <> int pair<int>::module() { return value1%value2; } int main () { pair <int> myints (100,75); pair <float> myfloats (100.0,75.0); cout << myints.module() << '\n'; cout << myfloats.module() << '\n'; return 0; }
25 0
89
S chuyn mn ho ny l mt phn ca mt mu, v vy chng ta phi bt u phn khai bo vi template <>. V r rng rng l s chuyn mn ho cho mt kiu d liu c th nn chng ta khng th dng mt kiu d liu tng qut, cp ngoc nhn <> cng phi trng. Sau phn tn lp chng ta phi vit thm tn kiu d liu mun dng gia cp ngoc nhn <>. Khi chng ta chuyn bit ho mt kiu d liu cho mt mu chng ta cng phi nh ngha tt c cc thnh vin tng xng vi s chuyn mn ho (nu bn thy cha r lm, hy xem li v d trn trong chng ta phi vit li constructor cho chnh n mc d ci ny hon ton ging nh constructor trong lp tng qut. Nguyn nhn l do khng c thnh vin no c "tha k" t lp tng qut cho lp chuyn mn ho.
Cc gi tr tham s cho mu
Bn cnh cc tham s ca mu l kiu d liu (c ng trc bi t kho class hay typename), cc hm mu v cc lp mu cn c th c cc tham s khc khng phi l kiu m chng c th l cc gi tr hng. Trong v d di y lp mu c dng lu tr mng:
// array template #include <iostream.h> template <class T, int N> class array { T memblock [N]; public: setmember (int x, T value); T getmember (int x); }; template <class T, int N> array<T,N>::setmember (int x, T value) { memblock[x]=value; } template <class T, int N> T array<T,N>::getmember (int x) { return memblock[x]; } int main () { array <int,5> myints; array <float,5> myfloats; myints.setmember (0,100); myfloats.setmember (3.0,3.1416); cout << myints.getmember(0) << '\n'; cout << myfloats.getmember(3) << '\n'; return 0; }
100 3.1416
Chng ta cng c th thit lp cc gi tr mc nh cho bt k tham s mu no ging nh vi cc tham s ca hm bnh thng. V d: template template template template template <class T> <class T, class U> <class T, int N> <class T = char> <int Tfunc (int)> // // // // // Trng hp ph bin nht: mt tham s lp. Hai tham s lp. Mt lp v mt gi tr nguyn. Mt tham s lp vi gi tr mc nh. Tham s l mt hm.
90
Mu v cc d n
Theo quan im ca trnh bin dch, cc mu khng phi l cc hm hay lp thng thng. Chng c dch theo nhu cu. iu c ngha l m ca mt hm mu khng c dch cho n khi cn dng n. Vi cc trnh dch thi im thc hin bi vit, trnh dch s to ra t mu mt hm c th cho kiu d liu c yu cu. Khi cc d n pht trin ln, n thng chi m ca mt chng trnh thnh nhiu file khc nhau. Trong nhng trng hp , ni chng phn giao tip v phn thc hin l tch bit. Ly v d mt th vin hm no , phn giao tip thng gm tt c nhng khai bo mu ca cc hm c th c gi, chng thng c khai bo trong mt "header file"vi phn m rng .h, v phn thc hin (phn nh ngha c cc hm ) c t trong cc file m C++ ring. i vi mu, chng ta c mt iu bt buc khi thc hin cc d n nhiu file: phn thc hin (phn nh ngha) ca mt lp mu hay hm mu phi nm trong cng mt file vi phn khai bo. iu ny c ngha l chng ta khng th tch phn giao tip thnh mt file ring m phi gp c phn giao tip v phn thc thi vo bt k fiel no s dng mu. Tr li vi trng hp th vin hm, nu chng ta mun to mt th vin hm mu, thay v vic to mt header file (.h) chng ta nn to mt "template file" cha c phn giao tip v phn thc thi ca cc hm mu (khng c mt quy nh no v phn m rng ca nhng file ny, bn thch dng th no cng c hoc c l .h cho tin). Mt iu cui cng na l vic mt "template file" c dng nhiu ln trong mt d n s khng gy ra li lin kt v chng c dch theo nhu cu v nhng trnh bin dch h tr templates s bit phi lm th no khng sinh m lp trong cc trng hp .
Bi 5.1
Namespaces
Namespaces cho php chng ta gp mt nhm cc lp, cc i tng ton cc v cc hm di mt ci tn. Ni mt cch c th hn, chng dng chia phm vi ton c thnh nhng phm vi nh hn vi tn gi namespaces. Khung mu s dng namespaces l:
namespace general { int a, b; } Trong trng hp ny, a v b l nhng bin bnh thng c tch hp bn trong namespace general. c th truy xut vo cc bin ny t bn ngoi namespace chng ta phi s dng ton t ::. V d, truy xut vo cc
bin chng ta vit:
general::a general::b
Namespace c bit hu dng trong trng hp c th c mt i tng ton cc hoc mt hm c cng tn vi mt ci khc, gy ra li nh ngha li. V d:
5 3.1416
91
namespace first { int var = 5; } namespace second { double var = 3.1416; } int main () { cout << first::var << endl; cout << second::var << endl; return 0; }
Trong v d ny c hai bin ton cc cng c tn var, mt c nh ngha trong namespace first v ci cn li nm trong second. Chng trnh vn chy ngon, cm n namespaces.
using namespace
Ch th using theo sau l namespace dng kt hp mc truy xut hin thi vi mt namespace c th cc i tng v hm thuc namespace c th c truy xut trc tip nh th chng c khai bo ton cc. Cch s dng nh sau:
// using namespace example #include <iostream.h> namespace first { int var = 5; } namespace second { double var = 3.1416; } int main () { using namespace second; cout << var << endl; cout << (var*2) << endl; return 0; }
3.1416 6.2832
Trong trng hp ny chng ta c th s dng var m khng phi t trc n bt k ton t phm vi no. Bn phi mt iu rng cu lnh using namespace ch c tc dng trong khi lnh m n c khai bo hoc trong ton b chng trnh nu n c dng trong phm vi ton cc. V d, nu chng ta nh u tin s dng mt i tng thuc mt namespace v sau s dng mt i tng thuc mt namespace khc chng ta c th lm nh sau:
5 3.1416
92
namespace first { int var = 5; } namespace second { double var = 3.1416; } int main () { { using namespace first; cout << var << endl; } { using namespace second; cout << var << endl; } return 0; }
nh ngha b danh
Chng ta cng c th nh ngha nhng tn thay th cho cc namespaces c khai bo. Cch thc lm vic ny nh sau:
Namespace std
Mt trong nhng v d tt nht m chng ta c th tm thy v namespaces chnh l bn thn th vin chun ca C++. Theo chun ANSI C++, tt c nh ngha ca cc lp, i tng v hm ca th vin chun u c nh ngha trong namespace std. Bn c th thy rng chng ta b qua lut ny trong sut tutorial ny. Ti quyt nh lm vy v lut ny cng mi nh chun ANSI (1997) v nhiu trnh bin dch c khng tng thch vi n. Hu ht cc trnh bin dch, thm ch c nhng ci tun theo chun ANSI, cho php s dng cc file header truyn thng (nh l iostream.h, stdlib.h), nhng ci m chng ta trong sut tutorial ny. Tuy nhin, chun ANSI hon ton thit k li nhng th vin ny tn dng li th ca tnh nng templates v tun theo lut phi khai bo tt c cc hm v bin trong namespace std. Chun ANSI ch nh nhng tn mi cho nhng file "header" ny, c bn l dng cng tn vi cc file ca chun C++ nhng khng c phn m rng .h. V d, iostream.h tr thnh iostream. Nu chng ta s dng cc file include ca chun ANSI-C++ chng ta phi lun nh rng tt c cc hm, lp v i tng s c khai bo trong std. V d:
93
<<
"Hello
world
in
ANSI-C+
Mc d vy chng ta nn s dng using namespace khi phi vit ton t :: khi tam chiu n cc i tng chun:
// ANSI-C++ compliant hello world (II) #include <iostream> using namespace std; int main () { cout << "Hello world in ANSI-C++\n"; return 0; }
Bi 5.1
Exception handling
Trong sut qu trnh pht trin mt chng trnh, c th c mt s trng hp m mt s on m chy sai do truy xut n nhng ti nguyn khng tn ti hay vt ra ngoi khong mong mun... Nhng loi tnh hung bt thng ny c nm trong ci c gi l exceptions v C++ va tch hp ba ton t mi x l nhng tnh hung ny: try, throw v catch. Dng thc s dng nh sau:
Nguyn tc hot ng: - on m nm trong khi try c thc hin mt cch bnh thng. Trong trng hp c li xy ra, on m ny phi s dng t kho throw v mt tham s bo li. Kiu tham s ny m t chi tit ho li v c th l bt k kiu hp l no. - Nu c li xy ra, nu lnh throw c thc hin bn trong khi try, khi catch s c thc hin v nhn tham s c truyn bi throw. V d:
try { // on m cn th throw exception; } catch (type exception) { // on c thc hin trong trng hp c li }
94
{ for (int n=0; n<=10; n++) { if (n>9) throw "Out of range"; myarray[n]='z'; }
} catch (char * str) { cout << "Exception: " << str << endl; } return 0;
Trong v d ny, nu bn trong vng lp m n ln hn 9 th mt li s c thng bo v myarray[n] trong trng hp c th tr n a ch nh khng tin cy. Khi throw c thc hin, khi try ngay lp tc kt thc v mi i tng c to bn trong khi try b ph hu. Sau , quyn iu khin c chuyn cho khi catch tng ng (ch c thc hin trong nhng tnh hung nh th ny). Cui cng chng trnh tip tc ngay sau khi, trong trng hp ny: return 0;. C php c s dng bi throw tng t vi return: Ch c mt tham s v khng cn t n nm trong cp ngoc n. Khi catch phi nm ngay sau khi try m khng c c on m no nm gia chng. Tham s m catch chp nhn c th l bt k kiu d liu hp l no. Hn na, catch c th c qu ti c th chp nhn nhiu kiu d liu khc nhau. Trong trng hp ny khi catch c thc hin l khi ph hp vi kiu ca tham s c gi n bi throw:
// exceptions: multiple catch blocks #include <iostream.h> int main () { try { char * mystring; mystring = new char [10]; if (mystring == NULL) throw "Allocation failure"; for (int n=0; n<=100; n++) { if (n>9) throw n; mystring[n]='z'; } } catch (int i) { cout << "Exception: "; cout << "index " << i << " is out of range" << endl; } catch (char * str) { cout << "Exception: " << str << endl; } return 0; }
95
1. 2.
Khi d liu 10 k t khng th c cp pht (gn nh l chng bao gi xy ra nhng khng c ngha l khng th): li ny s b chn bi catch (to char * str). Ch s cc i ca mystring b vt qu: li ny s b chn bi catch (int i), since parameter is an integer number.
Chng ta c th nh ngha mt khi catch chn tt c cc exceptions m khng ph thuc vo kiu c dng gi throw. lm vic ny chng ta phi vit du ba chm thay v kiu v tn s tham s:
try { try { // code here } catch (int n) { throw; } } catch (...) { cout << "Exception occurred"; }
void terminate();
(gi bi new) (gi bi dynamic_cast khi tht bi vi mt kiu tham chiu) (c gi khi mt exception khng ph hp vi lnh catch no) (gi bi typeid)
96
logic_error domain_error invalid_argument length_error out_of_range runtime_error overflow_error range_error underflow_error ios_base::failure (gi bi ios::clear)
Bi v y l mt h thng phn lp c th bc, nu bn s dng mt khi catch chn bt k mt exception no nm trong h thng ny bng cch s dng tham s bin (thm mt du & vo pha trc tn ca tham s) bn s chn c tt c cc exception tha k (lut tha k trong C++) V d di y chn mt exception c kiu bad_typeid (c tha k t exception), li ny c to ra khi mun bit kiu ca mt con tr null.
// Nhng exception chun #include <iostream.h> #include <exception> #include <typeinfo> class A {virtual f() {}; }; int main () { try { A * a = NULL; typeid (*a); } catch (std::exception& e) { cout << "Exception: " << e.what(); } return 0; }
Exception: pointer
Attempted
typeid
of
NULL
Bn c th s dng cc lp ca h thng phn cp cc exception chun ny bo nhng li ca mnh hoc tha k nhng lp mi t chng.
Bi 5.4
Cho n nay, c th chuyn i kiu mt i tng n gin sang kiu khc chng ta s dng ton t chuyn i kiu truyn thng. V d, chuyn mt s du phy ng c kiu double sang dng s nguyn c kiu int chng ta s dng:
i; d;
i = int (d);
97
iu ny lm vic tt i vi cc kiu c bn c nh ngha cc cacchs chuyn i c bn, tuy nhin nhng ton t ny cng c th c p dng ba bi vi cc lp v con tr ti cc lp. Bi vy, hon ton hp l khi vit nh sau:
// class type-casting #include <iostream.h> class CDummy { int i; }; class CAddition { int x,y; public: CAddition (int a, int b) { y=b; } int result() { return x+y;} }; int main () { CDummy d; CAddition * padd; padd = (CAddition*) &d; cout << padd->result(); return 0; }
Mc d chng trnh trn l hp l trong C++ (thc t l n s c dch m khng c bt k mt li hay warning no i vi hu ht cc trnh dch) nhng n l mt on m khng tt lm v chng ta s dng hm result, l mt thnh vin ca CAddition, padd khng phi l mt i tng, n ch l mt con tr c chng ta gn cho a ch ca mt i tng khng c quan h. Khi truy xut n thnh vin result, chng trnh s to ra li run-time hoc ch l mt kt qu khng mong mun. c th iu khin vic chuyn i kiu gia cc lp, chun ANSI-C++ nh ngha bn ton t chuyn i kiu mi: reinterpret_cast, static_cast, dynamic_cast v const_cast. Tt c chng u c cng dng thc khi s dng:
x=a;
phi c chuyn i thnh. to ra s tng t d hiu vi cc ton t chuyn i truyn thng cc biu thc ny c ngha l:
expression
reinterpret_cast
reinterpret_cast chuyn i mt con tr sang bt k kiu con tr no khc. N cng cho php chuyn i t
con tr sang dng s nguyn v ngc li. Ton t ny c th chuyn i con tr gia cc lp khng c quan h vi nhau. Kt qu ca ton t ny l mt bn copy gi tr ca con tr ny sang con tr kia. D liu c tr n khng h c kim tra hay chuyn i. Trong trng hp chuyn i gia con tr v s nguyn, cch chuyn ni dung ca n ph thuc vo h thng.
98
A B = new
{}; {}; A;
static_cast
static_cast cho php thc hin bt k php chuyn i no static_cast allows to perform any casting that can be implicitly performed as well as also the inverse cast
(even if this is not allowed implicitly). Applied to pointers to classes, that is to say that it allows to cast a pointer of a derived class to its base class (this is a valid conversion that can be implicitly performed) and can also perform the inverse: cast a base class to its derivated class. In this last case the base class that is being casted is not checked to determine wether this is a complete class of the destination type or not.
Base new
static_cast, aside from manipulating pointers to classes, can also be used to perform conversions explicitly
defined in classes, as well as to perform standard conversions between fundamental types:
d=3.14159265;
dynamic_cast
dynamic_cast is exclusively used with pointers and references to objects. It allows any type-casting that can be
implicitly performed as well as the inverse one when used with polymorphic classes, however, unlike static_cast, dynamic_cast checks, in this last case, if the operation is valid. That is to say, it checks if the casting is going to return a valid complete object of the requested type. Checking is performed during run-time execution. If the pointer being casted is not a pointer to a valid complete object of the requested type, the value returned is a NULL pointer.
class class
Base Derived
{ :
virtual public
dummy(){}; Base {
}; };
Base* b1 = new Derived; Base* b2 = new Base; Derived* d1 = dynamic_cast<Derived*>(b1); // succeeds Derived* d2 = dynamic_cast<Derived*>(b2); // fails: returns NULL
If the type-casting is performed to a reference type and this casting is not possible an exception of type bad_cast is thrown:
99
class class
Base Derived
virtual public
dummy(){}; Base {
}; };
Base* b1 = new Derived; Base* b2 = new Base; Derived d1 = dynamic_cast<Derived&*>(b1); // succeeds Derived d2 = dynamic_cast<Derived&*>(b2); // fails: exception thrown
const_cast
This type of casting manipulates the const attribute of the passed object, either to be set or removed:
C a
new
{}; C;
Neither of the other three new cast operators can modify the constness of an object.
typeid
ANSI-C++ also defines a new operator called typeid that allows to check the type of an expression:
typeid (expression)
this operator returns a refernece to a constant object of type type_info that is defined in standard header file <typeinfo>. This returned value can be compared with another using operators == and != or can serve to obtain a string of characters representing the data type or class name by using its name() method.
// typeid, typeinfo #include <iostream.h> #include <typeinfo> class CDummy { }; int main () { CDummy* a,b; if (typeid(a) != typeid(b)) { cout << "a and b are of different types:\n"; cout << "a is: " << typeid(a).name() << '\n'; cout << "b is: " << typeid(b).name() << '\n'; } return 0; }
100
Bi 1.1: Cu trc ca mt chng trnh C++.....................................................................................................1 Cc ch thch....................................................................................................................................................2 Bi 1.2: Cc bin, kiu v hng s.......................................................................................................................3 Identifiers.........................................................................................................................................................3 Cc kiu d liu...............................................................................................................................................3 Khai bo mt bin............................................................................................................................................4 Khi to cc bin.............................................................................................................................................5 Phm vi hot ng ca cc bin......................................................................................................................6 Cc hng s......................................................................................................................................................6 nh ngha cc hng (#define).........................................................................................................................8 Khai bo cc hng (const)................................................................................................................................9 Bi 1.3: Cc ton t.............................................................................................................................................9 Th t u tin ca cc ton t.......................................................................................................................13 Bi 1.4: Giao tip vi console..........................................................................................................................15 Xut d liu (cout).........................................................................................................................................15 Nhp d liu (cin)..........................................................................................................................................16 Bi 2.1 Cc cu trc iu khin........................................................................................................................18 Cu trc iu kin: if v else........................................................................................................................18 Cc cu trc lp..............................................................................................................................................19 Cc lnh r nhnh v lnh nhy.....................................................................................................................21 Cu trc la chn: switch..............................................................................................................................22 Bi 2.2 Hm (I)..................................................................................................................................................24 Cc hm khng kiu. Cch s dng void......................................................................................................27 Bi 2.3 Hm (II)................................................................................................................................................27 Truyn tham s theo tham s gi tr hay tham s bin..................................................................................28 Gi tr mc nh ca tham s.........................................................................................................................29 Qu ti cc hm..............................................................................................................................................30 Cc hm inline................................................................................................................................................31 qui.............................................................................................................................................................31 Khai bo mu cho hm..................................................................................................................................31 Bi 3.1 Mng.....................................................................................................................................................33 Khi to mt mng........................................................................................................................................34 Truy xut n cc phn t ca mng.............................................................................................................34 Mng nhiu chiu...........................................................................................................................................36 Dng mng lm tham s................................................................................................................................37 Bi 3.2 Xu k t..............................................................................................................................................39 Khi to cc xu k t....................................................................................................................................39 Gn gi tr cho xu k t................................................................................................................................40 Chuyn i xu k t sang cc kiu khc......................................................................................................42 Cc hm thao tc trn chui......................................................................................................................43 Bi 3.3 Con tr.................................................................................................................................................43 Ton t ly a ch (&)...................................................................................................................................44 Ton t tham chiu (*)...................................................................................................................................44 Khai bo bin kiu con tr.............................................................................................................................45 Con tr v mng.............................................................................................................................................47 Khi to con tr.............................................................................................................................................48 Cc php tnh s hc vi pointer...................................................................................................................49 Con tr tr ti con tr....................................................................................................................................50 Con tr khng kiu.........................................................................................................................................51 101
Con tr hm....................................................................................................................................................52 Bi 3.4 B nh ng........................................................................................................................................52 B nh ng trong ANSI-C...........................................................................................................................54 Bi 3.5 Cc cu trc..........................................................................................................................................56 Cc cu trc d liu.......................................................................................................................................56 Con tr tr n cu trc.................................................................................................................................58 Cc cu trc lng nhau...................................................................................................................................60 Bi 3.6 Cc kiu d liu t nh ngha.............................................................................................................60 T nh ngha cc kiu d liu (typedef)......................................................................................................61 Union..............................................................................................................................................................61 Cc unions v danh........................................................................................................................................62 Kiu lit k (enum)........................................................................................................................................63 Bi 4.1 Cc lp..................................................................................................................................................63 Constructors v destructors............................................................................................................................66 Qu ti cc Constructors................................................................................................................................67 Con tr ti lp................................................................................................................................................69 Cc lp c nh ngha bng t kho struct................................................................................................70 Bi 4.2 Qu ti cc ton t..............................................................................................................................70 T kho this....................................................................................................................................................72 Cc thnh vin tnh........................................................................................................................................73 Bi 4.3 Quan h gia cc lp............................................................................................................................74 Cc hm bn b (t kho friend)...................................................................................................................74 Cc lp bn b (friend)..................................................................................................................................75 S tha k gia cc lp..................................................................................................................................76 Nhng g c tha k t lp c s?............................................................................................................78 a tha k......................................................................................................................................................79 Bi 4.4 Cc thnh vin o. a hnh..................................................................................................................80 Con tr ti lp c s......................................................................................................................................80 Cc thnh vin o...........................................................................................................................................81 Tru tng ho lp c s..............................................................................................................................82 Bi 5.1 Templates............................................................................................................................................86 Cc mu hm..................................................................................................................................................86 Cc lp mu...................................................................................................................................................88 Chuyn mn ho mu....................................................................................................................................89 Cc gi tr tham s cho mu...........................................................................................................................90 Mu v cc d n...........................................................................................................................................91 Bi 5.1 Namespaces..........................................................................................................................................91 using namespace.............................................................................................................................................92 nh ngha b danh.........................................................................................................................................93 Namespace std................................................................................................................................................93 Bi 5.1 Exception handling..............................................................................................................................94 Exception khng b chn................................................................................................................................96 Nhng exceptions chun................................................................................................................................96 Bi 5.4 Chuyn i kiu nng cao...................................................................................................................97 reinterpret_cast...............................................................................................................................................98 static_cast.......................................................................................................................................................99 dynamic_cast..................................................................................................................................................99 const_cast.....................................................................................................................................................100 typeid............................................................................................................................................................100 102
103