You are on page 1of 320

08/10/2013

Suy ngh trong C + +, Vol 1

Suy ngh trong C + +, t p 1, 2nd Edition


Hon thnh ngy 13 thng 1 nm 2000

Bruce Eckel, ch t ch, MindView, Inc

Hnh tinh PDF mang n cho b n Portable Document nh d ng (PDF) phin b n c a tduy trong C + + T p 1 (2 nd Edition). Hnh tinh PDF l trang web PDFrelated hng u trn web. C tin t c, ph n m m, gi y tr ng, cc cu c ph ng v n, nh gi s n ph m, lin k t web, m u m, m t di n n, v cc bi vi t th ng xuyn c a nhi u chuyn gia PDF n i b t nh t v c tn tr ng trn th gi i. Gh thm trang web c a chng ti xem chi ti t h n:
http://www.planetpdf.com/ http://www.codecuts.com/ http://www.pdfforum.com/ http://www.pdfstore.com/

B m vo y mua cc phin b n gi y Ng i c h i nt h n g , T pc h P h tt r i np h n m m c a 1 9 9 6g i i t h n gJ o l tc h os c hh a yn h tc an m
" C u ns c hn yl m t t h n ht ut ol n . B nn c h oc h n hm n h c m t b ns a ot r ng i s c hc a b n . C h n gv i o s t r e a ms l i ut r t o nd i nn h t v d h i ur n gc h c a t i n h nt h yc h o nn a y . "

A l S t e v e n s B i nt pv i n , b cs Do b b sT pc h

" C u ns c hE c k e l l n g i d u yn h t g i i t h c hr r n gl mt h n o s u yn g h l i v x yd n gc h n g t r n hh n g i t n g . R n gc u ns c hc n gl m t h n gd nt u y t v i t r nc c i n s a n do u t s c a C++l m t t i nt h n gt h m. "

A n d r e wB i n s t o c k B i nt p , U n i xg i

" B r u c e t i pt c n g c n h i nv i t i v i c i n h ns us c c a m n hv oC++ , v t d u y t r o n g C++l b s u t pt t n h t c a t n gc a m n h c n ur a . N ub nmu nc ut r l i r r n gc h oc uh i k h v C++ , mu a c u ns c hn yn i b t . "

G a r yE n t s mi n g e r T cg i , T h eT a oc a i t n gs
1/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

" S u y n g h t r o n g C++k i nn h nv c p h n gp h pt mh i uc c v n k h i n ov l mt h n o s d n g i n l i n e s , t i l i ut h a mk h o , i uh n hq u t i , t h a k v c c i t n gn n g n g , c n gn h c c c h n n gc a on h s d n g n gm u , t r n gh pn g o i l v a k t h a . T o nb n l c c d t b n gc c l o i v i b a og mt r i t l r i n gc a E c k e l c a i t n gv t h i t k c h n gt r n h . Ap h i c h om i C++k s c hc a n h p h t t r i n , t d u y t r o n g C++l m t t r o n gn h n gc u ns c hC++ , b np h i c n ub n a n gl mp h t t r i nn g h i mt r n gv i C++ . "

k i n t cg i :

R i c h a r d Ha l eS h a w B i nt pv i n , m yt n h Ma g a z i n i nt

C u ns c ht u y t v i . . . C n g c t u y t v i ! Andrew Schulman, Bc s Dobbs Tp ch M t t u y t i , k h n g t i uc h u np h i . M t t r o n gn h n g s d n g n h i un h t , h uh t c c s c h n gt i nc yt r ng i c a t i . " TUG dng y l c n g c m t l pt r n hv i nt h c s c t h s d n g . IEEE my tnh M t k h i h n hl m m i . PJ Plauger, tp ch H thng nhng lp trnh . . . E c k e l t h n hc n g . . . n r t c t h c c . Unix Th gii C h c c h np h i mu a ut i nc a b n . C Cng bo M t t i l i ut h a mk h o t u y t v i c h o C++ ! Michael Brandt, Chuyn vin Phn tch / Lp trnh, Sydney, c D nc a c h n g t i t i h t h n g HR Bc h n g t a g i l s c hc a b n" C ut r l i B o o k " .N l c a c h n g t i C++K i n hT h n hc h o d n .Curt Snyder, HRB H thng C u ns c hc a b nl t h c s t u y t v i , v t i k h n g t h c m n l mc h o n c s nmi np h t r nwe b . l m t t r o n g n h n g t i l i ut h a mk h o k l n g v h u c hn h t c h o C++T i n h nt h y . Russell Davis . . . c u ns c hc h r a r n g c t h mc h ng nl t h c s c t h c c k h i c g n g t mh i uc c d y g i n g c a C++( v n h n g i u c b nc a l pt r n hh n g i t n g t t n i c h u n g ) . Gunther Schulz, KawaiiSoft T i y uc c v d t r o n g c u ns c hc ab n .C n h n gt h m t i s k h n gb a o g i n g h n( v m t s n h n g i umt i k h n g b i t b nc t h l m) ! giu Herrick, Ph k s phn mm cao cp, Lockheed-Martin Lin bang Systems, Owego, NY y l m t c u ns c ht u y t v i .t h c m c c a t i c t i t h a mk h o c u ns c ht r c t u y nn y . g i pt r o n gm i t r n gh p . T i c h ng i nl h n hp h c k h i c t i pc nv i m t c u ns c ht mc n y . Wes Kells, Comp Eng. Sinh vin, SLC Kingston. B nl m t n g u nt i n g u y nv g i v t i n hg i r t c a o c u ns c hc ab n , d a n hs c he ma i l v v. . C v n h m i d nt i l mv i c t r n t h n hc n g v n h n g h i ub i t c a b n . Justin Voshell y l c u ns c ht i c t mk i mt r nC++ . Thomas A. Fink, Gim c iu hnh, Trepp, LLC S c hc a b np h i c t h mq u y nn h n g d c . c c n g n g h i pc a t i , t i g i c h o b n K&Rc a C++. nh du Orlassino, k s thit k cao cp, Harmon Industries, Inc, Hauppauge, NY K h i t i b t uh c C++ , c u ns c hc ab n" t d u yt r o n g C++ " c h i u n hs n g h n gd nc a t i t r o n g m t n gh mt i e n .N c n l c c at i c i t h i nc at i C++k n n g b t c k h i n oc t h , v v v i c , " S u yn g h t r o n gC++ " c h o t i n nt n g v n g c h c c h oc i t i nl i nt c c a t i . Peter Trn, h thng phn tch cao cp (IM), Compaq Computer Corporation C u ns c hn y l t i l i ut h a mk h o t t n h t n i c h u n g t r o n g v i c t mk i mt r n g o i n g c a t i l mc h C++ . H uh t c c s c h g i i t h c hm t s c h t r i t n h n g l t h i un h n g n g i k h c . " S u y n g h t r o n g C++ " 2 /Ek h n g v t q u a b u c k m t c u n s c hk h c . K h i t i c t h c m c n c c ut r l i . Thomas Michel T i c m t n g nn i t o nb s s c h , k h n g a i t r o n g s h c n g h a v c n g k h n g t h g i i t h c hn h n g i u n g . T i c h t c h o m t m ut t v S T Lc u ns c h . S a u , t i q u y t n h c t i l i uc a b nv t i r t n g c n h i n . Nh n g g b n c h i nt h n h t h n o v i t C++v i c c m uv S T Lm k h n g b c h mt c v i c c c h i t i t . Nh n g g b n l m c n h n g g t i mo n g i c a C++c n g n g , t h h t i pt h e o c a C++t c g i . Nh m t t c g i t i r t nt n g t i v nb nc a b nv c c k n n g g i i t h c h . B nb o h i mc h m k h n g a i c n g p h t r c . P h n g p h pt i pc nc a b nl m t t r o n g n h n g t m t n g i t h c s n g i x u n g v i q u a v t l i uc h i t i t . V s a u b n t c uh i v s t n ht o c a t n hh n hv n h n g g s l v n k h uv c . T r nk s c hc a t i , n c h c c h ns l m t t r o n g n h n g s s c hc nt h i t , n g a y b nc n hP e t z o l d . Christian Gross, chuyn gia t vn / c vn cgross@eusoft.com T i n g h r n g c u ns c hc a b nl r t , r t , r t t t . T i s o s n hn v i n h n g n g i k h c t r o n g c c c a h n g s c h , v t m t h y c u ns c hc a b nt h c s d y t i c b nC++n g u y nt c c b nt r o n g k h i t i h c S T L. . . m t k i n hn g h i mr t t t p t m h i uv c h a i c n g m t l c , t a y t r o n g t a y . T i n g h r n g c u ns c hc a b n c t r a r t t t , v g i i t h c h n h n g t h t r o n g m t d h i ut h i t r a n g . Jeff Meininger, pht trin phn mm, boxybutgood.com C u ns c hc a b nl t t n h t c h o nn a y c a b t k t i n h nt h y . H y l mc h o n n g t t c c h n g t a c t h c m t c n g v i c t u y t v i v t i l i ut h a mk h o " n g t i nc y " ! V x i nv u i l n g v i v n g ! C h n g t i a n g t u y t v n g c h o m t t c p h mc h t l n g n y ! Steve Strickland, Minds Live (mt doanh nghip Puzzle) ( T r nU s e n e t ) K h n g g i n g n h h uh t c c C++t c g i , E c k e l c m t s n g h i pg i n g d y C++v J a v a c c l ph c c h .A n h y c l i c hc a r t n h i up h nh i m i l mq u e n , v n h n g c u ns c hp h n n h i u . C u ns c hc a n g k h n g c h l v c c hv i t b n g C++/J a v a , n h n g s h i ub i t m c c hc a n g nn g v t d u y m i v i s u y n g h t r o n g h . E c k e l c n g l n h v nk t h u t t t n h t m t i c t J e f f D u n t e ma n n . R t r r n g v d c .K h n g c a r a b i c c r r n g k c ht h c l nc a c u ns c hc a n g .Ho c c t h c c t r o n g * t * h n2 1 n g y . : } Randy Crawford, MRJ gii php cng ngh, Fairfax VA C n g v i c c a b n c n hg i c a o v c m nc c b n g i pt i h i uc C++v J a v a t t h n . Barry Wallin, Ton / Khoa hc my tnh gio vin, Trng Trung Hc Rosemount, Rosemount, MN T i mu nc m nb nc h o c u ns c hc a b n" t d u y t r o n g C++ " , l , k h n g c n g h i n g ,c u ns c ht t n h t mt i t n g c v c h n y . Riccardo Tarli - SW Engineer - R & D TXT Ingegneria Informatica - T i c c c h a i c u ns c hc a b n , t d u y V o J a v a v t d u y V o C++ .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 2/320

08/10/2013

Suy ngh trong C + +, Vol 1

V i c c s c hl c c hd d n g n h t t r o n g t h l o i c a n . Ratnakarprasad H. Tiwari, Mumbai, n . . . C c " D e b u g g i n g g i " p h nl r t c g i t r , t i b c md i nn v g i n v i t i m i l c .T i n g h r n g p h nn y n nl m t p h nb t b u c c a b t k l ph c g i i t h i us a uk h i n g i ut i nh o c h a i v n l pt r n h . Fred Ballard, Synectics Inc C u ns c hc a b nt h c s l m t k h o t n g c a C++k i nt h c . T i c mt h y n h b n a r a m t c i n h nt n g q u a nt t v s a u g i i t h c hc c l o i h t v b ul n g . Raymond Pickles, Antenna mc, Radar Phng, Phng th nghim Nghin cu Hi qun M, Washington DC L m t c h u y ng i a y h c n i k h o a v k h o a h c m y t n ht i d n hr t n h i ut h i g i a nc g n g t r c hx u t t h n g t i nt s c hv t pc h . K i n hn g h i mc a t i l m t t c g i t t l m t t r o n g n h n g n g i l mc h o k h i n i mk h k h nt r u y c p , m t t r o n g n h n g t u y t v i l mc h o n t r n g g nn h d d n g . T r ns i mn y b nc c h c c h nm t t r o n g b a n g i n g un h v nk t h u t c a t i . G i t h n ht t c n g v i c . Tin s Declan O'Kane, Leicester, Anh C h o t h h a i c pC++k h a h c c a t i , " S u yn g h t r o n g C++ " l t i l i ut h a mk h o l i nt c c a t i v n gh n h , v t i y uc u s i n hv i nc at i t h a mk h o k i nn t h n g x u y n . T i t h a mk h oc c c h n gv i uh n hq u t i l i nt c . C c v d /c o d e m t m n hl g i t r c h i p h c a c u ns c hn h i ul n . V v y , n h i us c hv m i t r n g p h t t r i n c x c n ht r ng i n hr n g c c n g d n g c h c h o m t n g nn g l pt r n hl m t m i t r n gWi n d o ws , l t u y t v i t mv s d n g m t c u ns c ht r o n g t pt r u n gv oC++ , v v yc h n gt i c t h c h u nb h c s i n hc h on g h n g h i pt r o n gc c l n hv c n h h t h n gn h n g, m n g , v v , i h i c h i us ut h c s c a s h i ub i t . Robert Chase, Gio s, Sweet Briar Cao ng T i n g h r n g l m t g i i t h i ut u y t v i v i C++ , c b i t l c h o d a b b l e r s l un mn h t i t i t h n g b i t " l mt h n o " , n h n g h i mk h i " t i s a o " v T I C 2 l n g o i s c t n g t n g . Tony Likhite, qun tr h thng / qun tr vin, cng nhau Networks S a uk h i c 8 0t r a n g ut i nc ac u ns c hn y , t i c m t s h i ub i t t t h nv o o ps a u t i n h nr ak h i t nc ac u n s c ht i t c hl y c v c h n y .T h a n k s . . . Rick Schneewind

S u yn g h
T r o n gC+ +
P h i nb nt h h a i B r u c e E c k e l T n gt h n g , Mi n d V i e wI n c
P r e n t i c e Ha l l h t t p : / / www. p r e n h a l l . c o m

S a d d l e R i v e r t r n , Ne wJ e r s e y0 7 4 5 8

Nh x u t b n : A l a nA p t S nx u t b i n t p : S c o t t D i s a n n o i uh n hq u n l b i n t p : V i n c e O ' B r i e n P h C h t c h k i mT n g B i n t p : Ma r c i a Ho r t o n P h c h t c hs n x u t v s n x u t : D a v i dW. R i c c a r d i Qu nl d n : A n aT e r r y T h i t k s c h , t h i t k b a v b a d n g n g h t h u t :
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 3/320

08/10/2013

Suy ngh trong C + +, Vol 1

Da n i e l Wi l l H a r r i s , d a n i e l @ wi l l h a r r i s . c o m B a o g m m u n c : B r u c e E c k e l B ns a o b i nt p : S t e p h a n i e T i n g A n h i up h i s n x u t : L o r i B u l wi n T r l b i nt p : T o n i H o l m Q u n l t i p t h : J e n n i e B u r g e r , B r y a nG a mb r e l

2 0 0 0 b i B r u c e E c k e l , Mi n d V i e w, I n c c x u t b nb i P r e n t i c e Ha l l I n c P e a r s o nG i o d c i h c U p p e r S a d d l e R i v e r , Ne wJ e r s e y 0 7 . 6 3 2
C c t h n gt i nt r o n gc u ns c hn y c p h np h i t r nm t " n h l " c s , k h n gc b oh n h . T r o n gk h i t t c c c b i np h pp h n gn g a c t h c h i nt r o n gv i c c h u nb c a c u ns c hn y , k h n gp h i l t c g i h a yn h x u t b np h i c t r c hn h i mt r c b t k n g i n oh o c e n t i t l e i v i b t k t r c hn h i mp h pl , t nt h t h o c t h i t h i g yr a h o c b c ob u c l n g u y nn h nt r c t i ph a yg i nt i ph n gd n c t r o n gv i c u ns c hn yh o c c c p h nm m m yt n hh o c c c s np h mp h nc n g c mt t r o n gt i l i un y . T t c c c q u y n . K h n gc p h nn oc a c u ns c hn yc t h c s a oc h pd i m i h n ht h c h o c b n gb t k p h n gt i n i nt h o c c k h b a og ml ut r t h n gt i nv h t h n gt h uh i m k h n gc s c h op h pb n gv nb nc a n h x u t b nh o c t c g i , n g o i t r m t n g i x e ma i c t h t r c hd nn h n g o nn g nt r o n gm t x e mx t . B t k t n c s d n gt r o n gc c v d v v nb nc a c u ns c hn yl h c u , b t k m i q u a nh v i n g i s n gh a y c h t h o c n h nv t h c ut r o n gc c c n gt r n hk h c l h o nt o nn g un h i n .

I nt i Ho a K 1 0 9 8 7 6 5 4 3 2 1 I S B N0 1 3 9 7 9 8 0 9 9
P r e n t i c e Ha l l q u c t ( V n gq u c A n h ) L i mi t e d , L o n d o n P r e n t i c e Ha l l o f A u s t r a l i a P t yL i mi t e d , S y d n e y P r e n t i c e Ha l l C a n a d a , T o r o n t o P r e n t i c e Ha l l Hi s p a n o a me r i c a n a , S A , Me x i c o P r e n t i c e Ha l l c a n P r i v a t e L i mi t e d , N e wD e l h i P r e n t i c e Ha l l c a Nh t B n , I n c , T o k y o P e a r s o nE d u c a t i o nA s i a L t d , S i n g a p o r e E d i t o r a P r e n t i c e Ha l l d oB r a s i l , L t d a . , R i o d e J a n e i r o

C n g C + + H i t h o

Kim tra www. B r u c e E c k e l . c o m bit chi tit chuyn su v ngy v a im tip theo: Ha n d s On C + + H i t h o D a t r nc u ns c hn y C c m t n nt n gv n gc h c t r o n gt i uc h u nC++c b n B a og mc c b i t pl pt r n ht r o n gl p s c h c a c n h nt r o n gc c b i t p T r u n gg i a n C + + H i t h o D a t r nt p2 c a c u ns c hn y( t i v t i www. B r u c e E c k e l . c o m) b oh i mc h u y ns uc a t i uc h u nC++T h v i n D y , c o n t a i n e r , v n gl p , c c t h u t t o n m uc h u y ns uv x l n g o i l N n gc a oC + + c h C nc v oc h n n gc a ot r o n gt p2 c a c u ns c hn y T h i t k m u X yd n gh t h n gm n hm T ot h n g h i mv g l i c c k h u nk h T h e od i c cb nt i n mi np h s ct n gt h n gb o c ah i t h o s pt i

C n gg h t h m www. B r u c E c k e l . c o mc h o :
"! D c hv t v n Eg i i p h px e r c i s ec h ob o on yk
4/320

"!

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

H i t h o o n C DR OM
N ub nt h c h T hinking trong C H i t h o o n C D n gg i v i c u n s c hn y , s a u b nc n gs t h c h:

B r u c eE c k e l c a Ha n d s On C + + H i t h o a p h n gt i n C DR OM N ging nh n vi tho! C sn ti

s l i d e t r nc a ov n gb h a mt h a n hg h i l i b i B r u c e E c k e l T t c c c b i g i n gt Ha n d s OnC++H i t h o D a t r nc u ns c hn y C c m t n nt n gv n gc h c t r o n gt i uc h u nC++c b n C h c nc h i n x e mv n g h e c c b i g i n g ! C c b i g i n g c l pc h m c , d o b nc t h n h a n hc h n g x c n hv t r c c c u c t h ol u nv c h b t k C c c h i t i t v b i g i n gm uc t h c t mt h yt r nc c t r a n g we b

www. B r u c e E c k e l . c o m

Cc Trung cp C + + Hi tho nng cao C + + ch

X e m www. B r u c e E c k e l . c o m c cH i t h o o n C DR OM

c h o

C n gh i n
V i c h a m t i , c h t i , v a n ht r a i c a t i

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

5/320

08/10/2013

Suy ngh trong C + +, Vol 1

Nh n gg b nt r o n g. . .
Li ni u 1 1: Gii thiu v i tng
C g mi trong n bn th hai .... 2
C g trong Tp 2 ca cun sch ny ......................... 3 Lm th no c c Tp 2 ............ 3

23

iu kin tin quyt ............ 4 Hc C + + .......... 4 Mc tiu ...................... 6 Chng .................. 7 Bi tp ............... 13 M ngun ........... 13 Ngn ng

tiu chun .............. 15

C c gii php tp th dc ............... 13 H tr ngn ng ............... 16

Ca cun sch CD ROM ................ 16 a CD ROM, hi tho v t vn ........ 17 li .................... 17 Thng tin v cc trang ba ...... 18 thit k Sch v sn xut ............. 19 Li cm n. 20 Tin tru tng ............. 25 Mt i tng c giao din ................. 27 Vic thc hin n ....... 30 Dng li vic thc hin ....... 32 tha k: ti s dng giao din .... ....... 34
on 0: Thc hin mt k hoch .......... 51 Giai on 1: l chng ti lm ....................... 52? Giai on 2: Lm th no s ? chng ta xyGiai dng n .............. .......... 56 Giai on 3: Xy dng ct li ....... 61 Giai on g Giai on 5: Evolution .............. 63 4: lp K hoch tr ht ...................... 65 cc trng hp s dng ..................... 62 Vit bi kim tra u tin ................... 66 Lp trnh cp ............... 68

i tng hon i cho nhau vi a hnh ......... 40 To v tiu dit i tng ... 45 ngoi l x l: x l cc li ... 46 Phn tch v thit k .............. 48 Cc k lp trnh ......... 66

L-mt vs l-nh-mt

mi quan h ...................... 38

Ti sao C + + thnh cng ............... 70

Chin lc cho qu trnh chuyn i ............... 74 Tm tt thng tin .............. 79


Hng dn .......................... 75 Qun l chng ngi vt ........ 77

Mt tt hn C . ......................... 71 Bn trn ng cong hc tp ............ ... 71 hiu qu ........................... 71 h thng c d dng hn th hin v hiu ....... 72 tn dng ti a vi cc th vin ...................... 73 Ngun ti s dng m vi cc mu ................... 0,73 Li x l .................... 73 Lp trnh trong ln ..... 74

2: Lm & S dng i tng

Qu trnh ngn ng

83

Cng c bin dch ring bit ............ 89 u tin ca bn C + + chng trnh ......... 99 Thng tin thm v
T khai so vi nh ngha ... 90 Lin kt .............................. 96 S dng th vin .................... 97

Phin dch ....................... 85 Trnh bin dch .......................... 86 Qu trnh bin dch ....... 87

dch ............. 84

S dng lp iostreams ..... 99 Khng gian tn ..................... 100 nguyn tc c bn ca cho, th gii!" .................. 103 chy trnh bin dch ........ 105 Nhn vt mng ni .................. 106 u vo c ................... 107 Ku gi cc chng trnh khc ...... 107

cu trc chng trnh ............. 102 "Xin

iostreams ............. 105

Gii thiu chui ................. 108 c v vit cc tp tin ........... 110 Gii thiu vector .................. 112 Tm tt ............. 118 Bi tp .............. 119

3: C trong C + + 121
To Kim sot
Gi tr chc nng tr li ....... 125 S dng C 127

chc nng .............. 122

th vin chc nng ................. 126 To ring ca bn

th vin vi cc th vin ..

ng v sai .................. 128 nu-khc Ph v v tip tc t kha ............ 132 chuyn i ............................. 134 S dng v lm dng goto .... 136 quy ........................ 137

thc hin ............. 128

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

6/320

08/10/2013
u tin ...................... 138 t ng tng

Suy ngh trong C + +, Vol 1

Gii thiu v cc nh khai thc ............. 138 Gii thiu v cc loi d liu ............ 140

v gim bt ................. 139

Phm vi ................ 155


Xc nh cc bin

C bn c xy dng trong cc loi ........... 140 bool, ng, v sai ............. 142 Specifiers ............ ............ 143 Gii thiu v con tr ..... 145 Sa i i tng bn ngoi ................... 149 Gii thiu v C + + ti liu tham kho ................ 151 C on tr v ti liu tham kho nh b ..................... 153 trn bay ......................... 156

Quy nh c th cp pht b nh .............. 159 Khai thc v


Phn cng ...................... 168

Bin ton cu ................ 159 bin a phng .................. 161 tnh ......... ...................... 161 extern .......................... 163 ... hng ........................ 165 bin ng ................... ......... 167

s dng ca h ............... 168

Loi tng hp to ................ 188 G li gi .... 208 Chc nng

Nh khai thc ton hc ..... 169 nh khai thc quan h .......... 171 Khai thc hp l .............. 171 Bitwise nh khai thc .............. 172 Nh khai thc thay i ................. 173 nh khai thc Unary ................ 176 Nh iu hnh bc ba ........ 0,177 C c nh iu hnh du phy ......... 178 cm by thng thng khi s dng cc nh khai thc ........ 179 nh khai thc c .............. 179 C + + din vin r rng ............. 181 sizeof - mt nh iu hnh t ........................... 186 C c t kha asm .............. 187 Khai thc r rng .............. 187

Tn rng ca vi typedef ..................... 188 bin Kt hp ........................ 192 b nh tit kim vi on ........................ 195 Mng ............................. 196

vi cu trc .................... 189 ... Lm r cc chng trnh

vi enum

G li c ................ 208 C huyn bin v biu thc thnh chui ..... 211 C khng nh () v m ........ 212 Xc nh mt con tr hm ................ 213 T khai phc tp v nh ngha ..................... 214 S dng mt con tr hm .... 215 Mng cc con tr

a ch ............. 213

Thc hin: qun l ring bit Tm tt ............. 226 Bi tp .............. 226 Mt C nh ging nh
Nng ng,

Thc hin cc hot ng ................. 219 Makefiles trong cun sch ny ........ 222 Mt v d makefile ......... 223

bin son ........... 217

chc nng ..................... 216

4: S liu tru tng 233


Cc i tng c bn nhng g vy? ...... 246 .... 247 l g mt i tng? .. 255 Tm tt d liu nh my ........... 256 chi tit i tng ........ 257 Tiu tp tin nghi thc .............. 259
Tm quan trng ca tp tin tiu ...................... 260 Vn nhiu khai .................... ...... 262 C c ch th tin x l # define, # ifdef, v # endif ....................... 263 Mt tiu chun cho tiu files.264 Khng gian tn trong tiu .... 0,265 S dng tiu trong d n .. 266 phn gii phm vi ton cu ..... 271 cp pht b nh ............. 239 Bad on .................... 244

th vin .................. 235

Cu trc lng nhau .. 266

Tm tt ............. 271 bi tp .............. 272

5: n Thc hin

277
bo v ......................... 281

Thit lp gii hn ......... 278 C + + truy cp kim sot ................. 279 Bn b ................. 281 i tng b cc ........ 288 Lp .............. 289 Cc lp x l ....... 294 Tm tt ............. 298
Sa i Stash s dng Bn b lng nhau .................. 284 N l tinh khit? ........................ 287

kim sot truy cp ................... 292 stack Sa i s dng

kim sot truy cp .................. 0,293

C he du s thc hin ................ 295 Gim bin dch li ...... 295

bi tp .............. 299

6: Khi to & Dn dp

301
destructor ............. 305

m bo khi to vi cc nh xy dng ........... 303 m bo dn dp vi Xo b cc khi nh ngha ...... 308 cho cc vng. ......................... 310
C p pht b nh ............. 311

Stash vi nh xy dng v hm hy ........... 313 Stack vi xy dng V hy ........ 316 tng hp khi .......... 320 Mc nh xy dng .......... 323 Tm tt ............. 324
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 7/320

08/10/2013

Suy ngh trong C + +, Vol 1

Bi tp .............. 325

7: Chc nng qu ti & Mc nh i s 327

Hn tn trang tr ............ 329 Qu ti


i s gi ch ...... 342

Qu ti trn gi tr tr li ................... 331 Lin kt kiu an ............. 331

v d ............... 333 on .................. 336 Mc nh

i s .......... 340 ..

La chn qu ti so vi mc nh Bi tp .............. 349

i s ............ 342 Tm tt ............. 348

8: Cc hng s 353

Gi tr thay th .. 354

Con tr ................ 360 Chc nng lp lun

Un ...................... 358 Khc bit vi C ............ 358

const trong tp tin tiu .......... 355 consts an ton ................... 356

C on tr n const ................ 361 const con tr .................... 362 chuyn nhng v i ngang qua gi tr const ...... 365 Tr v gi tr const ... 366 i qua v quay tr li a ch ........................ 369

v gi tr tr li ........ 364

vic kim tra kiu ... ................ 363

Cc lp hc ................. 373 386 Tm tt ............. 388 Bi tp .............. 388

const trong lp ................ 374 bin dch thi gian hng s trong cc lp hc ......................... 377 const i tng & chc nng thnh vin ............. 380

d bay hi .. ...............

9: Chc nng ni tuyn 393


Tin x l cm by .................. 394 Chc nng ni tuyn ..... 399 Stash v sp xp
Macro v truy cp ............ 398 Inlines trong lp hc ......... 400 Truy cp cc chc nng ............... 401

Gim ln xn .... 417 thm tin x l tnh nng ................ 418


M thng bo dn ................... 419

Hn ch ....................... 413 C huyn ti liu tham kho ........... 414 hot ng n trong xy dng v

vi inlines ........... 408 inlines v

trnh bin dch .......... 412


hm hy ....................... 415

Ci thin kim tra li ............... 420 Tm tt ............. 423 Bi tp .............. 424

10: Tn iu khin 427


Cc yu t tnh Khng gian tn ......... 437 Cc thnh vin tnh
Xc nh lu tr cho cc bin tnh trong chc nng ................ 428 Kim sot lin kt ............ 434 khc lu tr

t C. ................. 428

lp specifiers .......... ....... 436

To ra mt khng gian tn ....... 437 S dng mt khng gian tn ........... 440 Vic s dng cc khng gian tn ..... 445

trong C + + ................. 446

thuc khi to tnh .......... 455


Phi lm g ...................... 457

thnh vin d liu tnh ......... 446 lp lng nhau v a phng .... 451 hm thnh vin tnh .... 452

ph

Thng s k thut lin kt thay th ........ 465 Tm tt ............. 466 Bi tp .............. 467

11: Ti liu tham kho v Copy-Constructor 473

cc
trong C + + ................. 475

Con tr trong C + + ..... 474 ti liu tham kho Bn sao-xy dng ........... 479 Gi
C hc nng ......................... 501 Ti liu tham kho trong chc nng ..... 476 i s-qua hng dn ........................ 479

i qua v tr v gi tr .......................... 480 C opy-xy dng ............. 487 Sao chp mc nh, xy dng ... 493 gii php thay th copyconstruction ..................... 496

cho cc thnh vin .......... 498

12: iu hnh Qu ti
Cnh bo v

Tm tt ............. 504 bi tp .............. 505

511
bo m .......... 512 C php ................. 513 Overloadable khai thc
8/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

.............. 515
Khai thc nguyn phn ................ 515 Nh iu hnh nh phn ............... 520 i s & tr v gi tr .................... 531 nh khai thc bnh thng ............. 535 nh khai thc bn 544 khng th lm qu ti ..... ..............

Khng thnh vin khai thc .............. 545

Qu ti giao ........... 548

Hng dn c bn ................ 547 Hnh vi ca cc nh iu hnh = ....... 549

T ng chuyn i loi hnh ............ 561 Tm tt ............. 570


Nh xy dng chuyn i ...... 561 iu hnh chuyn i .......... 563 Loi v d chuyn i ... 566 cm by trong t ng chuyn i loi hnh ................ 567

bi tp .............. 570

13: ng i tng Sng to

575

To i tng ...... 577

V d ban u c thit k li ............ 583 mi v xa Ht


xa void * l 586 Lm cho mt con tr

C ch tip cn C vo ng ... 578 nh iu hnh mi .................... 580 nh iu hnh xa ................ 0,581 Mt v d n gin .............. 581 qun l b nh trn khng ......................... 582 c th l mt li ................. 584 C leanup trch nhim vi con tr .................... 585 stash cho con tr .............

cho mng ............. 592

dung lng lu tr ............. 594 qu ti

ging nh mt mng ............ 593

mi v xa ......... 595
mi v xa cho mng ..... 603

Tm tt ............. 609 bi tp .............. 610

Qu ti ton cu mi v xa .................... 597 qu ti mi v xa cho mt lp hc .... 599 qu ti cuc gi xy dng ............... 605 v tr mi v xa .... 607

14: Tha k & Thnh phn

Thnh phn c php .................. 614 k tha danh sch khi to ......... 618

613

c php .................. 616 Cc nh xy dng


danh sch khi to ................... 0,620

Kt hp cc thnh phn v tha k ........ 621 Tn n ......... 625 chc nng m


K tha v tnh Trnh t xy dng v hy cuc gi ................. 623 chc nng thnh vin ............. 635

i tng thnh vin khi ..................... 619 Tch hp cc loi trong

khng t ng

k tha .................. 630

La chn thnh phn so vi k tha ...... 635 Subtyping ........................ 637 tha k tin ............ 640 bo v ........ ...... 641 bo v di sn ......... 643 iu hnh qu ti & Tha k ......... 643 Nhiu tha k ............ 645 gia tng pht trin ......... 645 Upcasting .......... ... 647 Tm tt ............. 654 Bi tp .............. 655
L do ti sao "upcasting?" .............. 648 Upcasting v sao chp xy dng ............... 649 Thnh phn, so vi tha k (xem xt li). ...... 652 Pointer & tham kho upcasting ......................... 653 Mt cuc khng hong ........... ................. 654

15: a hnh & Chc nng o 659

S pht trin ca C + + lp trnh ........ 660 Upcasting ............. 662 Vn ......... 663 C hc nng gi rng buc .......... 663 chc nng o .... 664 Lm th no C + + c cui rng buc ........... 669 Ti sao o 679
M rng ..................... 666 Lu tr cc loi thng tin .... 670 hnh dung chc nng o ... 672 Di mui xe ................. 674 C i t vpointer ....... 676 i tng khc nhau ......... 676

chc nng? ............. 677 lp c s tru tng v chc nng thun o ..............

Tha k v

Tinh khit nh ngha o ...... 684 i tng ct ................... 688

cc vtable ........... 685

Qu ti v trng ............. 691 chc nng o v xy dng .......... 695 Hy v o destructors.699


Bin th kiu tr v ........... 693 Th t ca cc cuc gi xy dng .. 696 hnh vi ca chc nng o trong xy dng ............ 697 Nguyn cht hm hy o ..... 701 Virtuals trong hm hy ....... 704 To ra mt h thng phn cp i tng da trn ...... 705

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

9/320

08/10/2013

Suy ngh trong C + +, Vol 1

Nh iu hnh qu ti ........... 709 downcasting ......... 712 Tm tt ............. 716 bi tp ......... ..... 717

16: Gii thiu v

723
cc mu ......... 727

Container ............ 724 Tng quan v C php mu .... 732 Ngn xp v stash
C c gii php mu ........ 730

S cn thit i vi cc container ..... 726

Khng ni tuyn nh ngha chc nng ........... 734 IntStack nh mt khun mu ...... 735 Hng s trong mu ...... 738

nh mu ......... 739

Chuyn quyn s hu v tt ............. 748 Gi i tng ........... 754 .... Ti sao vng lp? ....... 774

Stash con tr Templatized 0,742

theo gi tr ............... 751 Gii thiu

vng lp

Stack vi vng lp ........... 764 PStash vi vng lp ......... 768 C hc nng mu ............ 778

Tm tt ............. 779 bi tp .............. 780

A: m phong cch 785 B: Lp trnh Hng dn C: c 797 815

C. ........................ 816 Chung C + + ......... 816 su v gc ti ......... 818 Phn tch v thit k ... 819

Danh sch ring ca ti v cun sch .......... 817

Ch s

823

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

10/320

08/10/2013

Suy ngh trong C + +, Vol 1

B nk h n gt h c h n h nv oC++n h l m t t ph pc c t n hn n g , m t s t n hn n gk h n gc n g h a t r o n gs c l p . B nc h c t h s d n gs t i nc a c c b p h nn ub n a n gs u yn g h v t h i t k , k h n gc h ng i nl m h a . V h i uC++t h e oc c hn y , b np h i h i un h n gv n v i Cv l pt r n hn i c h u n g . C u ns c h n yt h ol u nv c c v n l pt r n h , l d ot i s a oh l n h n gv n , v c c ht i pc nC++ t h c h i n g i i q u y t v n n h v y . D o , c c t h i t l pt n hn n gt i g i i t h c ht r o n gm i c h n gs c d a t r nc c h m t i n h nt h ym t l o i h n hc t h c a v n c g i i q u y t v i n g nn g . B n gc c hn y , t i h yv n gs d i c h u y nb n , m t c h t t i m t t h i i m, t s h i ub i t C n i m m C++ , s u yn g h t r t h n ht i n gm c a b n .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 11/320

08/10/2013

Suy ngh trong C + +, Vol 1

T r o n gs u t , t i s c t h a mg i a n h n gt h i m b nmu nx yd n gm t mh n ht r o n g uc a b n , c h o p h pb nh i u c n g nn g t t c c c c o n n gx u n gt r nk i ml o i , n ub ng pm t c u , b ns c t h l mt h c nc h omh n hc a b nv s u yr a c ut r l i . T i s c g n gt r u y n t c h ob nn h n gh i ub i t s p x pl i b n oc a t i l mc h ot i b t u" s u yn g h t r o n gC++ . "

C g m i t r o n gp h i nb nt h h a i

C u ns c hn y c v i t l i t o nd i nc a c c nb n ut i n p h n n ht t c c c t h a y i c g i i t h i u t r o n gC++h o nt h i nC++t i uc h u n , v c n g p h n n hn h n gg t i h c c t v nb nc h o nb n ut i n . T o nb h i nt i v nb nt r o n g nb n ut i n c k i mt r a v v i t l i , i k h i l o i b v d c , t h n gx u y nt h a y i v d h i nc v b s u n gt h mn h n gc i m i , v t h mn h i ub i t pm i . S px pl i n gk v l i t h n gc a v t l i u d i nr a p h n n hs s nc c a c c c n gc t t h nv c i t h i ns h i ub i t c a t i v c c hm i n g i t mh i uC++ . M t c h n gm i c t h mv o l m t n h a n hc h n gg i i t h i uc c k h i n i mc b n Cv C++ , t n hn n gc h on h n gn g i k h n gc n nt n gC g i i q u y t p h nc nl i c a c u ns c h . C DR OM b r n gb u c v om t s a uc a c u ns c hc m t c u c h i t h ol g i i t h i ut h mc h n h n h n g c c k h i n i mC c nt h i t h i uC++( h o c J a v a ) . N c t or a b i C h u c kA l l i s o nc h oc n gt yc a t i ( Mi n d V i e w, I n c ) , v n c g i l " t d u yt r o n gC : N nt n gJ a v a v C++ . " Ng i i t h i u nb nc c k h a c n hc a C l c nt h i t b nc t h c h u y ns a n gC++h o c j a v a , l i r a c c b i t k h c h um c c l pt r n hv i nCp h i i p h v i t r nm t c s n g y t o n g yn h n gm C++v c c n g nn g J a v a h n gb n i t ( h o c t h mc h l o i b , t r o n g t r n gh pc a J a v a ) .
n d? V v y , c ut r l i n g nc h oc uh i " n h n gg k h c n h a ut r o n g2 p h i nb n" l : n h n gg k h n gp h i l t h n gh i um i c v i t l i , i k h i nm c b ns k h n gn h nr a c c v d b a n uv v t c h t .

C g t r o n gt p2 c ac u ns c hn y
Ho nt h n hC++S t a n d a r dc n g t h m m t s t h v i nm i q u a nt r n g , c h n gh nn h c h u i v c c c o n t a i n e r v c c t h u t t o nt r o n gc c t i uc h u nC++T h v i n , c n gn h p h c t pm i t r o n gc c m u . N yv c c c h n n gc a oh n b l o i r a t p2 c a c u ns c hn y , b a og mc c v n n h a k t h a , x l n g o i l , c c m ut h i t k , v c c c h v v i c x yd n gv s a l i h t h n g n n h .

L m t h n o c cT p2

C n gg i n gn h c c c u ns c hm b nh i n a n gn mg i , t d u y t r o n g C++ , T p 2 c t i v t o nb t t r a n g we bc a t i t i w w w . B r u c e E c k e l . c o m. B nc t h t mt h n gt i nt r nc c t r a n gwe bv n g yt h n gi nd k i nc a T p2 . C c t r a n gwe bc n gc c h a m n g u nc h oc h a i c u ns c h , c n gv i b nc pn h t v t h n gt i nv h i t h ok h c R OMo n C Dm Mi n d V i e w, I n c c u n gc p , h i t h oc n gc n g , v ot ot i c h , t v n , c v n , v wa l k t h r o u g h s . T r o n g nb n ut i nc a c u ns c hn y , t i q u y t n hr n gn g i k h c d yb nCv r n gb nc t n h t m t t r n h c t h o i m i v i n . T pt r u n gc h n hc a t i l v ng i nh a n h n gg t i t h yk h k h n : n g nn g C++ . T r o n gb i v i t n yt i t h m m t c h n g l m t g i i t h i un h a n hc h n g nC , c n gv i t d u y t r o n g Ch i t h o o n C D , n h n gt i v ng i n hr n gb n c m t s l o i k i n hn g h i ml pt r n h . Ng o i r a , c n g g i n gn h b nh c h i c n h i ut m i t r c q u a nb n gc c hn h nt h yc h n gt r o n gb i c n ht r o n gm t c u n t i ut h u y t , n c t h h c h i r t n h i uv Ct b i c n ht r o n g n c s d n gt r o n gp h nc nl i c a c u n s c h .

i uk i nt i nq u y t

H cC + +

T i v u t c c hc a t i v oC++t c h n hx c c n gm t v t r t i mo n g i n h i u c g i c a c u ns c hn yl t r o n g : n h m t l pt r n hv i nv i m t r t k h n gv n g h a , t h i , c c l o i h t v b ul n g , v l pt r n h . T h n n a , n nt n gv k i n hn g h i mc a t i t r o n gp h nc n gc pl pt r n hn h n g , t r o n g Ct h n g c c o i l m t n g nn g c pc a ov m t q u m c c nt h i t k h n gh i uq u yb i t x u n gq u a n h . T i c b i t r n gt i t h m c h k h n gm t l pt r n hCr t t t , c h e g i us t h i uh i ub i t c a t i v c ut r c , ma l l o c ( ) v f r e e ( ) , s e t j mp( ) v l o n g j mp( ) , v c c k h i n i m" t i n hv i " , p h t h n g i t r o n gx uh k h i i t n g a r a t r o n gc u c t r c h u y n t h a yv t i pc nv i k i nt h c m i . K h i t i b t uc u c ut r a n hc a t i h i uC++ , c u ns c hc h p h o n gn h a l t x n gB j a r n e S t r o u s t r u pc a [ 1 ] " h n gd nc a c h u y ng i a , " v v yt i l i ng i nh a c c k h i n i mc b nt r nc a r i n gt i . i u [ 2 ] n yd n n ut i nc a t i C++c u ns c h , m v c b nl m t b i c h a n oc a k i n hn g h i mc a t i . c t h i t k n h h n gd nc a n g i c ma n gl i c c l pt r n hv i nv oCv C++c n gm t l c . C h a i p h i n

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

12/320

08/10/2013

Suy ngh trong C + +, Vol 1

[ 3 ] b n c a c u ns c ht h uh t c h n g n gn h i t t n h . V ok h o n gt h i g i a nt n gt n h s d n g C++ i r a , t i b t ud yn g nn g t r o n gc c c u c h i t h ov t h u y t t r n h . G i n gd yC++( v s a u , J a v a ) t r t h n hn g h n g h i pc a t i , t i n h nt h yg t u , k h u n m t t r n g , v n t b i r i t r o n gk h ng i t r nt o nt h g i i t n m1 9 8 9 . K h i t i b t u a r a t r o n gn h ot o c h oc c n h mn h h nc a n g i d n , t i p h t h i nr a m t c i g t r o n gc c b i t p . Ng a yc n h n gn g i m m c i v g t un h ml nv n h i uv n . T i p h t h i nr a , b n gc c ht or a v c h t r C++v J a v a t h e od i t i H i n g h p h t t r i np h nm mt r o n gn h i un m, m t i v l o a k h c c x uh n gc u n gc pc h ok h ng i i n h n hq u n h i uc h , q u n h a n h . V v y , c u i c n g , t h n gq u a c h a i k h c n h a ut r o n gm c k h ng i v c c hm t i t r n hb yc c t i l i u , t i s k t t h c m t i m t s p h nc a c c i t n g . C t h n i h i q u n h i u , n h n gv t i l m t t r o n gn h n gn g i k h n gv i g i n gd yt r u y nt h n g( v h uh t m i n g i , t i t i n r n g , k t q u k h n gn h v yt s n h mc h n ) , t i mu nc g n gg i c h ot t c m i n g i l n nt c . T r o n gm t t h i g i a n , t i t or a m t s b i t h u y t t r n hk h c n h a ut r o n gt h i g i a nt n g i n g n . V v y , t i k t t h c v i c h c b n gt h c n g h i mv l p i l pl i ( m t k t h u t m c n gh o t n gt t t r o n gC++t h i t k c h n gt r n h ) . C u i c n gt i p h t t r i nm t k h a h c s d n gt t c m i t h t i h c c t k i n hn g h i m g i n gd yc a t i . N k h c p h c n h n gv n t r o n gh c t pr i r c , d t i uh a v c c b c c h om t t a yv o h i t h o( t n hh n hh c t pl t n g ) c n h n gb i t ps a um i b i t h u y t t r n h . B nc t h t mh i uv h i t h o c n gc n gc a t i t i w w w . B r u c e E c k e l . c o m, v b nc n gc t h t mh i uv c c h i t h om t i t r t h n h a C DR OM. nb n ut i nc a c u ns c hn y c p h t t r i nt r o n gq u t r n hh a i n m, v c c t i l i ut r o n gc u ns c hn y c t h n g h i m n gt r o n gn h i uh n ht h c t r o n gn h i uc u c h i t h ok h c n h a u . C c t h n gt i np h nh i m t i n h n c t m i c u c h i t h o g i pt i t h a y i v t pt r u n gl i c c t i l i uc h o nk h i t i c m t h yn h o t n gt t n h m t p h n gt i ng i n gd y . Nh n gn k h n gc h l m t B nt i nh i t h o , t i c g n g n gg i c n gn h i ut h n gt i nn h t c t h t r o n gc c t r a n gn y , v c ut r c t h uh t b nt h n gq u a v ov n t i pt h e o . H nb t c i ug , c u ns c h c t h i t k p h c v n g i c n c n g i a n gp h i v t l nv i m t n g nn g l pt r n hm i .

M ct i u
1. 2.

M c t i uc a t i t r o n gc u ns c hn yl : T r n hb yc c t i l i um t b c t i m t t h i i m, v v yn g i c c t h d d n gt i uh a m i k h i n i m t r c k h i c h u y n . S d n gv d l ng i nv n g nn h t c t h . i un yt h n gn g nc nt i t g i i q u y t " t h g i i t h c " v n , n h n gt i t h yr n gn g i m i b t ut h n gh n hp h c h nk h i h c t h h i u c t n gc h i t i t c a m t v d t h a yv b nt n gb i p h mv i c a v n n g i i q u y t . Ng o i r a , c m t g i i h n n g h i mt r n g ns l n gm c t h c h pt h t r o n gm t t n hh u n gt r o n gl ph c . i v i i un y t i i k h i n h n c c h t r c hv s d n g" v d c h i " , n h n gt i s ns n gc h pn h n i u c l i c h o s nx u t m t c i g h u c hs p h m. C nt h nt r n ht t r n hb yc c t n hn n g b nk h n gn h nt h ym t c i g b n k h n g c t i px c v i . T t n h i n , yk h n gp h i l l u nl u nc t h , t r o n gn h n gt n hh u n g , mt n g ng ng i i t h i us c a r a . C u n gc pc h ob nn h n gg t i n g h q u a nt r n gl b np h i h i uv n g nn g , c h k h n gp h i l t t c m i t h m t i b i t . T i t i nr n gc m t " h t h n gp h nc pt mq u a nt r n gt h n gt i n " , v c m t s s k i nm 9 5 p h nt r mc a c c l pt r n hv i ns k h n gb a og i c np h i b i t v c t h s g yn h ml nc h oh v t h mv on h nt h c c a h v s p h c t pc a n g nn g . l ym t v d t C , n ub ng h i n h c c n h i uh n h ut i nb n g( t i k h n gb a og i l m) , b nc t h v i t m t h n gmi n h . Nh n g n ub np h i s u yn g h v n , n s g yn h ml nc h on g i c /d u yt r c a m . V v y , q u n i ut i n , v s d n gd un g o c nk h i m i v i c k h n gr r n g . T h i n yt n gt s c t h c h i nv i m t s t h n gt i nt r o n gc c n g nn g C++ , m t i n g h l q u a nt r n gh nc h oc c n h v nb i nd c hh nc h oc c l pt r n h . G i m i p h nt pt r u n g t h i g i a ng i n gv t h i g i a ng i a t h i g i a nt pt h d c l h pl . i un y k h n gc h g i c h ot mt r c a k h ng i c h n gh nv c l i nq u a nt r o n gq u t r n ht h c h n hh i t h o , n ma n gl i c h on g i c m t c mg i c l nh nh o nt h n h . C u n gc p c g i v i m t n nt n gv n gc h c h c t h h i u c v n c n g c h u y ns a n gh c v s c hk h k h nh n( c b i t , t p2 c a c u ns c hn y ) . T i c g n gk h n gs d n gp h i nb nb t k n h c u n gc pc t h c a C++b i v , c h ov i c h c n g nn g , t i k h n gn g h r n gc c c h i t i t c a m t t h c h i nc t h l q u a nt r n gn h n g nn g r i n gc a m n h . T i


13/320

3.

4.

.5

6. 7.

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

l i uc c n h c u n gc p' l i nq u a n nc h i t i t c t h t h c h i nr i n gc a h l .

C h n g

C++l m t n g nn g m c c t n hn n gm i v k h c n h a u c x yd n gt r n ut r a n gc a m t c p h ph i n c . ( B i v i un y , n c g i l m t l a i h n g i t n gn g nn g l pt r n h ) . c n gc n h i un g i i q u a n gc o n gh c t p , c h n gt i b t u c c m t c mg i c v c c hl pt r n hd i c h u y nq u a c c g i a i o nc a ++t n hn n gn g nn g C . B i v n d n gn h l s t i nt r i nt n h i nc a t mp r o c e d u r a l l y c ot o , t i q u y t n h h i uv t h e oc n gc o n n gn yv t n gt c q u t r n hb n gc c h t r a v t r l i c c c uh i m nv i t i n h t i h c c n g n n g v n h n gc uh i nt k h ng i n h t i d yn g nn g . K h a h c n y c t h i t k v i m t i ut r o n gt mt r : s px pq u t r n hh c t pC++ . T h n gt i np h nh i k h ng i g i pt i h i u c p h nn og pn h i uk h k h nv c nt h i t t h mc h i us n g . T r o n gc c l n hv c m t i c t h a mv n gv c q u n h i ut n hn n gc n gm t l c , t i b i t t h n gq u a q u t r n ht r n hb yc c t i l i ur n gn ub nb a og mr t n h i ut n hn n gm i , b np h i g i i t h c ht t c , v c a s i n hv i ns n h ml nc t h d d n gh p . K t q u l , t i l yr t n h i uk h k h n g i i t h i uc c t n hn n gn h v i t i m t t h i i m n h t c t h , l t n g , c h c m t k h i n i ml nt i m t t h i i m m i c h n g . M c t i u , s a u , l m i c h n g d ym t k h i n i md u yn h t , h o c m t n h mn h c c k h i n i ml i nq u a n , t r o n gm t c c hm k h n gc t n hn n gb s u n g c d a v o . C c hb nc t h t i uh a m i p h nt r o n gb i c n h c a k i n t h c h i nt i c a b nt r c k h i d i c h u y nt r n . t h c h i n i un y , t i l i m t s t n hn n gCt i c h t r o n gt h i g i a nd i h nt i mu n . L i c hl b ns k h n gb n h ml nk h i n h nt h yt t c c c C++ , t n h n n gs d n gt r c k h i c g i i t h c h , d o g i i t h i uc a b nv i n g nn g s c n h n h n gv s p h n n h c c hb ns n gh a c c t n hn n gn ut r i v i c c t h i t b c a r i n gb n . yl m t mt n g ng nv c c c h n gt r o n gc u ns c hn y : C h n g1 : Gi i t h i uv o b j e c . K h i d n t r t h n hq u l nt s v p h c t p d d n gd u yt r , " c u c k h n g h o n gp h nm m" r a i , v i c c l pt r n hv i nn i r n g , " C h n gt i k h n gt h c c c c d nt h c h i n , v n uc h n gt a c t h , c h n gq u t ! " n yk t t a m t s p h n n g , s c t h ol u nt r o n gc h n gn yc n g v i n h n gt n gc a l pt r n hh n g i t n g( OOP ) v l mt h n on c g n g g i i q u y t c u c k h n g h o n gp h nm m. C h n gb n i q u a c c k h i n i mc b nv c c t n hn n gc a OOPv c n gg i i t h i uc c p h nt c hv q u t r n ht h i t k . Ng o i r a , b ns t mh i uv n h n gl i c hv m i q u a nt mc a v i c pd n gc c n g nn g v g pc h ov i c d i c h u y nv ot h g i i c a C++ . C h n g2 : L pv S d n go b j e c . C h n gn yg i i t h c hc c t s q u t r n hx yd n gc h n gt r n hs d n gc c t r n hb i nd c hv t h v i n . Ng i i t h i ul n ut i nc h n gt r n hC+t r o n gc u ns c hv c h ot h yc c c h n g t r n h c x yd n gv b i ns o n . S a u , m t s c c t h v i nc b nc a c c i t n gc s nt r o n gt i uc h u nC ++ c g i i t h i u . nk h i k t t h c c h n gn y , b ns c m t n mb t t t v n h n gg n c n g h a l v i t m t c h n gt r n hC+s d n go f f t h e s h e l f t h v i n i t n g . C h n g3 : Ct r o n gC+. C h n gn yl m t c i n h nt n gq u a nd y c c a +c c t n hn n gt r o n gC c s d n gt r o n gC++ , c n gn h m t s t n hn n gc b nm c h c t r o n gC++ . Nc n gg i i t h i uc c " l mc h o " t i n c h l p h b i nt r o n gt h g i i p h t t r i np h nm mv c s d n g x yd n gt t c c c v d t r o n gc u n s c hn y( m n g u nc h oc u ns c h , t r o n g c s nt i w w w . B r u c e E c k e l . c o m, c h a ma k e f i l e s c h om i c h n g) . C h n g3 g i n hr n gb nc m t n nt n gv n gc h c t r o n gm t s n g nn g l pt r n ht h t c n h P a s c a l , C , h o c t h mc h m t s h n gv c a c b n( mi nl b n v i t r t n h i um t r o n gn g nn g , c b i t l c h c n n g ) . N ub nt mt h yc h n gn ym t c h t q u n h i u , t r c t i nb np h i i q u a c c t d u y t r o n g Ch i t h o t r n a C D l r n gb u c v i c u ns c hn y( v c n gc s nt i w w w . B r u c e E c k e l . c o m) . C h n g4 : S l i uA b s t r a c t i o. H uh t c c t n hn n gt r o n gC++x o a yq u a n hnk h n n gt or a c c k i ud l i u m i . i un yk h n gc h c u n gc pm t c h c c pt r n , n h n gn t n nt n gc h ok h n n gh n g i t n g m n hm h n . B ns t h yl ms a ot n gn y c t h c yb i c c h n h n g ng i nc a v i c a c h c n n gb nt r o n gc c c ut r c , c c c h i t i t l mt h n o l m i u , v n h n gg l o i m n t or a . B nc n gs t mh i uc c ht t n h t t c h c m c a b nv ot pt i nt i u v c c t pt i nt h c h i n . C h n g5 : nI mp l e me n t a t i o. nB nc t h q u y t n hr n gm t s d l i uv c h c n n gt r o n gc ut r c c a b n k h n gc s nc h on g i s d n gc a c c l o i m i b n gc c hl mc h oh t i n. i un yc n g h a r n gb nc t h t c hv i c t h c h i nc b nt g i a od i nm c c l pt r n hv i nk h c hh n gn h nt h y , v d o c h op h p i u t h c h i n c d d n gt h a y i m k h n g n hh n g nm k h c hh n g . C c t k h a l pc n g c g i i t h i u n h l m t c c hf a n c i e r mt m t k i ud l i um i , v n g h a c a t " i t n g " c d e my s t i f i e d( l m t b i n a t h c h ) . C h n g6 : K h i t ov C l e a n u. pM t t r o n gn h n gl i p h b i nn h t Ck t q u t c c b i nc h a c k h i t o . C c n h x y d n g t r o n gC++c h op h pb n mb or n gc c b i nc a k i ud l i um i c a b n( " i t n g c a l ph c c a b n " ) s l u nl u n c k h i t o n gc c h . N u i t n gc a b nc n gy uc um t s l o i d n d p , b nc t h mb or n gd nd pn ys l u nl u nx yr a v i C++h y .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

14/320

08/10/2013

Suy ngh trong C + +, Vol 1

C h n g7 : C h c n n gq u t i v De f a u l t A r g u me . nC++t s d n g g i pb nx yd n gl n , c c d np h c t p . T r o n gk h i l m i un y , b nc t h ma n gl i n h i ut h v i nc s d n gc c t nc h c n n gt n gt , v b n c n gc t h c h n s d n gc n gt nv i n g h ak h c n h a ut r o n gm t t h v i n . C++l mc h o i un yd d n gv i c h c n n g q u t i , c h op h pb ns d n gl i c c t nc h c n n gt n gt n h mi nl c c d a n hs c h i s k h c n h a u . i s m c n hc h op h pb ng i c c c h c n n gt n gt t r o n gn h i uc c hk h c n h a ub n gc c h t n gc u n gc pc c g i t r m c n hc h om t s l pl u nc a b n . C h n g8 : l i nt c . s c h n gn yb a og mc c c o n s t v d b a yh i t k h a , t r o n g c n g h a b s u n gt r o n g C++ , c b i t l t r o n gc c l ph c . B ns t mh i un h n gg n c n g h a l pd n gc o n s t n hn g h a c o nt r . C h n gn yc n gc h ot h yn g h a c a c o n s t t h a y i k h i c s d n gt r o n gv n g o i l ph c v l mt h n o t or a h n gc o mp i l e t i me b nt r o n gc c l ph c . C h n g9 : C h c n n gn i t u y n. Ma c r ot i nx l l o i b s c h c n n gg i i nt r nc a o , n h n gt i nx l c n g g i pl o i b g i t r C++k i mt r a k i u . C h c n n gn i t u y nc u n gc pc h ob nt t c n h n gl i c hc a m t v m t i nx l c n gv i t t c c c l i c hc am t c u c g i c h c n n gt h c s . C h n gn yn g h i nc uk l n gt h c h i nv s d n gc c c h c n n gn i t u y n . C h n g1 0 : T nC o n t r o. l T ot nl m t h o t n gc b nt r o n gl pt r n h , v k h i m t d n c l n , s l n g c c t nc t h c p o . C++c h op h pb nr t n h i uq u y nk i ms o t t nv s n gt oc a h , k h n n gh i n t h , v t r l ut r , v l i nk t . C h n gn yc h ot h yt n c i uk h i nt r o n gC++s d n gh a i k t h u t . u t i n , c c t n ht k h a c s d n g i uk h i nv l i nk t , v n g h a c b i t c a n v i c c l ph c c k h mp h . M t h u c hh nr t n h i uk t h u t k i ms o t t n p h mv i t o nc ul C++' s k h n gg i a nt n t n hn n g , c h op h pb np h v k h n gg i a nt nt o nc uv ok h uv c r i n gb i t . C h n g1 1 : T i l i ut h a mk h ov C o p y p h x yd n g. C++c o nt r t o r l mv i c n h c o nt r Cv i l i c hb s u n gm n hh nC++k i mt r ak i u . C++c n gc u n gc pt h m m t c c h x l a c h : t A l g o l v P a s c a l , C ++n n gc c t i l i ut h a mk h o , c h op h pt r n hb i nd c hx l c c t h a ot c ac h t r o n gk h i b ns d n gk h i u t h n gt h n g . B nc n gs g pc cb ns a o x yd n g , k i ms o t c c h i t n g cc h u y nv ov r ak h i c h c n n gt h e og i t r . C u i c n g , C++c o nt r nt h n hv i n c c h i us n g . C h n g1 2 : i uh n hOv e r l o a d i n. T n hn n gn y i k h i g c g i l " c p h p n g , " n c h op h pb n l mn g t c c c p h pc h ov i c s d n gk i uc a b nb n gc c hc h op h pc c n h k h a i t h c c n gn h c c c u c g i c h c n n g . T r o n gc h n gn yb ns h c c r n g i uh n hq u t i c h l m t l o i k h c n h a uc a c u c g i c h c n n gv b ns h c c c hv i t r i n gc a b n , i p h v i v i c s d n g i k h i k h h i u , c c i s , k i ut r v , v q u y t n hv v i c l i u t h c h i nm t i uh n hm t t h n hv i nh o c b nb . C h n g1 3 : N n g n g , i t n gc r e a t i o. M t s b a on h i um yb a ynh t h n gk h n gl uc n q u nl ? B a on h i uh n hd n gm t h t h n gC A Ds y uc u ? T r o n gc c v n l pt r n hc h u n g , b nk h n gt h b i t c s l n g , t u i t h , h o c l o i i t n gc nt h i t c h oc h n gt r n hc a b nc h y . T r o n gc h n gn y , b ns h c c c hC++' s mi v x a t h a n hl c hg i i q u y t v n n yb n gc c ht or a m t c c ha nt o n i t n gt r nh e a p . B nc n gs t h yc c hmi v x a c t h c q u t i t r o n gn h i uc c hk h c n h a u b nc t h k i ms o t l ut r c p h nb v p h t h n h . C h n g1 4 : T h ak v C o mp o s i t i o. T r ut n gd l i uc h op h pnb n t or ac c l o i m i t u , n h n g v i t h n hp h nv t h ak , b nc t h t or a c c l o i m i t c c l o i h i nc . V i t h n hp h n , b nl pr pm t l o i m i s d n gc c l o i k h c n h mi n g , v v i d i s n , b nt or a m t p h i nb nc t h c am t l o i h i nc . T r o n g c h n gn y , b ns h c c c p h p , l mt h n o x c n hl i c h c n n g , v t mq u a nt r n gc a x yd n gv p h h yc h oc c t h a k v t h n hp h n . C h n g1 5 : ah n hv f u n c t i oo. Ng yc ar i n gb n , n s b nc t h m t c h nt h n g k h mp h v h i u c n nt n gn yc a OOP . T h n gq u a , v d ng i n , n h , b ns t h yl mt h n o t or a m t g i a n hc a c c l o i v i t h ak v t h a ot c c c i t n gt r o n gg i a n ht h n gq u ac c l pc s c h u n gc ah . C c ot k h a c h op h pb nx l t t c c c i t n gt r o n gg i a n hn yt n gq u t , c n g h a l p h nl nc c mc a b n k h n gp h t h u cv ol o i t h n gt i nc t h . i un yl mc h oc h n gt r n hc ab nmr n g , v v yv i cx y d n gc c c h n gt r n hv b ot r m l d d n gh nv r h n . C h n g1 6 : Gi i t h i uv T e mp l a t . e t h ak v s t h n hp h nc h op h pb ns d n gl i m i t n g , n h n g i u k h n gg i i q u y t t t c c cn h uc ut i s d n gc ab n . M uc h op h pb ns d n gl i n g u n a n g b n gc c hc u n gc pc c t r n hb i nd c hm t c c h t h a yt h l o i t nt r o n gc t h c am t l ph o c c h c n n g . i un yh t r v i c s d n gc c t h n g c h a l p h c t h v i n , l n h n gc n gc q u a nt r n gc h ov i c p h t t r i nm n hm n h a n hc h n gc a c c c h n gt r n h h n g i t n g( t i uc h u nC++T h v i nb a og m m t t h v i nq u a nt r n gc a l pc o n t a i n e r ) . C h n gn y c u n gc pc h ob nm t n nt n gv n gc h c t r o n gc c c h q u a nt r n gn y . C h b s u n g( v c c i t n gc a oc ph n ) c s nt r o n gt p2 c a c u ns c hn y , c t h c t i v t t r a n g we bw w w . B r u c e E c k e l . c o m. T i p h t h i nr a r n gc c b i t pl c b i t h u c ht r o n gm t c u c h i t h o h o nt h n hs h i ub i t c a
15/320

B i t p

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

h c s i n h , d o , b ns t mt h ym t t ph p c u i m i c h n g . S l n gb i t p c t n gl nr t n h i us o v i c o ns t r o n gp h i nb n ut i n . Nh i un g i t r o n gs c c b i t pk h ng i n h c t h c h o nt h n ht r o n gm t k h o n gt h i g i a nh pl t r o n gm t t n hh u n gl ph c h o c p h n gt h n g h i mp h nt r o n gk h i n g i h n gd nq u a ns t , mb ot t c h c s i n h c h pt h v t l i u . M t s b i t pc m t c h t k h k h nh n g i c h oh c s i n ht i nt i ng i i t r . P h nl nc c b i t p c t h i t k c g i i q u y t t r o n gm t t h i g i a nn g nv c h n h m m c c hk i mt r a v n hb n gk i n t h c c a b nh nl n h n gt h c ht h c l nh i nn a y( c l , b ns t mt h yn h n gn g yc a r i n g b nh o c n h i uk h n n g , h s t mt h yb n) .

C cg i i p h pt pt h d c
C c g i i p h p l a c h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u y t r o n g C++H n g d nG i i p h p c h t h c h , s ns n gc h om t k h o np h n h t w w w . B r u c e E c k e l . c o m.

Mn g u n

M n g u nc a c u ns c hn yl b nq u y np h nm m mi np h , p h np h i t h n gq u a c c t r a n gwe b w w w . B r u c e E c k e l . c o m. B nq u y nn g nc nb nt t i b nm t r o n gp h n gt i nt r u y nt h n gi n nm k h n g c p h p , n h n gb n c c pq u y ns d n gn t r o n gn h i ut n hh u n gk h c ( x e mb nd i ) . M c s nt r o n gm t t pt i nn n , c t h i t k t r c hx u t c h ob t k n nt n gm c m t " z i p " t i n c h( h uh t , b nc t h t mk i mt r nI n t e r n e t t mp h i nb nd n hc h on nt n gc a b nn ub nk h n g c m t c i t ) . T r o n gt h m c b t un i b ng i i n nm b ns t mt h yc c t h n gb ob nq u y ns a u y :

// ::C o p y r i g h t . t x t

B nq u y n( c )2 0 0 0 ,B r u c eE c k e l T pt i nm n g u nt c u ns c h" T d u yt r o n gC++ "T tc c cq u y nT R n h c h op h pc cc us a u y :B nc t h t d os d n gt pt i nn yc h oc n gv i cr i n gc ab n( c n h nh o ct h n gm i ) , b a og mc s a iv p h np h ic h t r o n gh n ht h ct h ct h i .B nc q u y ns d n gt pt i nn y t r o n gc cl ph c ,b a og mc v i cs d n gn t r o n gt il i ut r n hb y ,m i nl c u ns c h" S u yn g h t r o n gC++ " ct r c hd nn h l n g u n . N g o it r t r o n gc ct n hh u n gt r o n gl ph c ,b nk h n g t h s a oc h pv p h np h ic cm n y ,t h a yv o ,c c i mp h np h i cq u y nl h t t p : / / w w w . B r u c e E c k e l . c o m ( v c ct r a n gw e bg n gc h n ht h c ) ,n in c s nm i np h .B nk h n g t h l o ib b nq u y nn yv t h n gb o .B nk h n gc t h p h np h ic cp h i nb ns a ic am n g u nt r o n gg in y .B nk h n gt h s d n gt pt i nn yt r o n gp h n gt i nt r u y nt h n gi n nm k h n gc s n gc at cg i .B r u c eE c k e lk h n gc h ut r c hn h i mv s p h h pc ap h nm mn y v im c c hn o .N cc u n gc p" n h l "k h n gr r n gh a yn g b oh n hc ab tc l o in o , b a og mb tk s b o mn ov k h n n gb n ,p h h pc h om tm c c hc t h ,h o ck h n gv ip h m . T o nb r ir ov c h tl n gv h i us u tc ap h nm ml v ib n .B r u c eE c k e lv c cn h x u tb n k h n gc h ut r c hn h i mc h ob tk t h i th ip h ic h u n gb ib nh o cb tk b nt h b an h l k tq u c av i cs d n gh o cp h np h ip h nm mn y .K h n gc t r n gh p s B r u c eE c k e lh o cn h x u tb nc h ut r c hn h i mv b tk t h un h pb m t ,l in h u n ,h o cd l i u ,h o ct r ct i p , g i nt i p ,t h i th i cb i t ,h uq u ,n g un h i n ,h o ct r n gp h t ,t u yn h i ng yr av k h n gp h t h u cv ol t h u y tv t r c hn h i mp h pl ,p h ts i n ht v i cs d n gh o ck h n gc k h n n gs d n gc cp h nm m ,n g a yc k h iB r u c eE c k e lv n h x u tb n ct h n gb ov k h n n gt h i th i . N np h nm mc h n gm i n hl i ,b nc h or n gc h ip h c at tc c cd c hv c nt h i t ,s ac h ah o c s ac h a .N ub nn g h r n gb n t mt h ym tl i ,h yg i i uc h n hb n gc c hs d n gh n ht h c m b ns t mt h yw w w . B r u c e E c k e l . c o m .( V u il n gs d n gc ch n ht h ct n gt c h oc cl ip h i m ct mt h yt r o n gc u ns c h . ) /// :~

B nc t h s d n gm t r o n gd nc a b nv t r o n gl ph c mi nl t h n gb ob nq u y n c g i l i .

T i uc h u nn g nn g

T r o n gs u t c u ns c hn y , k h i c p ns p h h pv i t i uc h u nI S OC , t i s t h n gc h c nn i ' C . ' C h k h i l c nt h i t p h nb i t g i a c c t i uc h u nCt r l n , c c p h i nb nt r c t i uc h u nc a Ct i s l mc h o m t s k h c b i t . T i v nb nn yC++U b a nT i uc h u n c h o nt t c n gv i c c a n g nn g . D o , t i s s d n gt h u t n g t i uc h u nC++ t h a mk h oc c n g nn g c h u n . N ut i c h c nt h a mk h oC++b nn nc h ot i c n g h a l " t i uc h u nC++ . " C m t s n h ml nt r o n gt nt h c t c a C++U b a nT i uc h u nv t nc a t i uc h u nr i n gc a m n h . S t e v e C l a ma g e , c h t c h yb a n , l mr i un y : C h a i C++y b a nt i uc h u nh a : C c N C I T S( t r c y l X 3 ) J 1 6 b a nv c c y b a nI S OJ T C 1 / S C 2 2 / WG 1 4 . A N S I i ul N C I T S t o r a c c y b a nk t h u t p h t t r i nc c t i uc h u nq u c g i a M.

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

16/320

08/10/2013

Suy ngh trong C + +, Vol 1

J 1 6 c i ul t r o n g n m1 9 8 9 t o r a m t t i uc h u nM c h o C++ . T r o n g k h o n g 1 9 9 1 WG 1 4 c i u l t o r a m t t i uc h u nq u c t . D nJ 1 6 c c h u y n i t h n h m t " l o i I " ( q u c t ) v d nt r c t h u c c c n l c t i uc h u nI S O . H a i y b a ng p n h a ut i c n g m t l c t i c n g m t a i m , v b p h i uJ 1 6 c ut h n h b p h i uM t r nWG 1 4 . WG 1 4 i b i ul mv i c k t h u t J 1 6 . WG 1 4 p h i uv c n g t c k t h u t c a J 1 6 . C++t i uc h u nb a n u c t o r a n h l m t t i uc h u nI S O . A N S I s a ub n h c h n( t h e o k h u y nc o c a J 1 6 ) p d n g c c t i uc h u nI S OC++t i uc h u nn h t i uc h u nM c h o C++ . Nh v y , " I S O" l c c hc h n hx c c h C++S t a n d a r d .

H t r n g nn g
T r n hb i nd c hc a b nc t h k h n gh t r t t c c c t n hn n gt h ol u nt r o n gc u ns c hn y , c b i t l n u b nk h n gc p h i nb nm i n h t c a t r n hb i nd c h . T h c h i nm t n g nn g n h C++l m t n h i mv h t s c n n gn , v b nc t h mo n g i r n gc c t n hn n gs x u t h i nt r o n gp h nc h k h n gp h i t t c c n gm t l c . Nh n gn ub nc g n gm t t r o n gn h n gv d t r o n gc u ns c hv n h n c r t n h i ul i t c c t r n hb i nd c h , n k h n gn h t t h i t p h i l m t l i t r o n gm h o c t r n hb i nd c h , n c t h c h ng i nl k h n g c t h c h i n t r o n gt r n hb i nd c hc t h c a b n c n ur a .

C ac u ns c hC DR OM

N i d u n gc h n hc a c c a C DR OM n gg i m t s a uc a c u ns c hn yl m t " h i t h ov C DR OM" c t a t d u y t r o n g C : C s c h o J a v a v C++b i C h u c kA l l i s o n( c x u t b nb i Mi n d V i e w, I n c , v c n gc s n v i s l n gt i w w wB r u c e E c k e l . c o m . ) . N yc n h i ug i b i g i n gv t r n hb y , v c t h x e mt r nh uh t c c m yt n hn ub nc m t m yn g h e n h c C DR OM v m t h t h n g mt h a n h . M c t i uc a t d u y t r o n g Cl a b nm t c c hc nt h nt h n gq u a c c n g u y nt c c b nc a n g nn g C . N t pt r u n gv on h n gk i nt h c c nt h i t c h ob n c t h c h u y ns a n gC++h o c c c n g nn g J a v a t h a yv c g n g l mc h ob nm t c h u y ng i a t r o n gt t c c c g c t i c a C . ( M t t r o n gn h n gl d oc h ov i c s d n gm t n g nn g c pc a oh nn h C++h o c J a v a c c h n hx c c h n gt i c t h t r n h c r t n h i un h n gg c t i . ) Nc n gc h a c c b i t pv c c g i i p h ph n gd n . H yn h r n gb i v c h n g3 c a c u ns c hn yv t q u t d u y t r o n g CC D , a C Dk h n gp h i l m t t h a yt h c h oc h n g , n h n gn n c s d n gt h a yv o l m t s c h u nb c h oc u ns c hn y . X i nl ur n gc c a C DR OM l d a t r nt r n hd u y t , v v yb nc np h i c m t t r n hd u y t we b c c i t t r nm yt n hc a b nt r c k h i s d n gn . C c c c u c h i t h o o n C D R OM l nk h o c h t r a n gt r i T p1 v t p2 c a c u ns c hn y . Nh n gb a og m n h i ug i b i g i n gc a t i i k mv i c c s l i d e b a og mc c t i l i u c l a c h nt m i c h n gt r o n gc u n s c h . H c t h c x e mt r nh uh t c c m yt n hn ub nc m t m yn g h e n h c C DR OM v m t h t h n g mt h a n h . C c a C Dc t h c mu a t i w w w . B r u c e E c k e l . c o m, n i b ns t mt h mt h n gt i nv c c b i g i n g m u . C n gt yc a t i , Mi n d V i e w, I n c , c u n gc pt h c h n hc n gh i t h o ot od a t r nc c t i l i ut r o n gc u ns c h n yv c n gv c c c h n n gc a o . C c t i l i u c l a c h nt m i c h n g i d i nc h om t b i h c , t i pt h e o l m t k h o n gt h i g i a nt pt h d c t h e od i m i h c s i n hn h n c s c h c a c n h n . C h n gt i c n g c u n gc p ot o , t v n , t v n , t h i t k v a n gwa l k t h r o u g h s t i c h . T h n gt i nv n gk h n ht h c c h oh i t h os pt i v c c t h n gt i nk h c c t h c t mt h yt i w w w . B r u c e E c k e l . c o m. T i i k h i s ns n gc h ot v nt h i t k , t h m n hd nv wa l k t h r o u g h s m . K h i t i l n ut i nb t uv i t v m yt n h , n gl c c h n hc a t i l t n gc n gh o t n gt v nc a t i , b i v t i t h yt v n c t h t h c h , g i od c , v m t t r o n gn h n gt r i n g h i mt h v n h t c a t i , c h u y nn g h i p . V v y , t i s c g n gh t s c m n h p h h pv i b nv ol c ht r n hc a t i , h o c c u n gc pc h ob nm t l i nk t c a t i ( l n g i d nm t i b i t r v t i nt n g , v t h n gn h n gn g i c n gp h t t r i nv d yc h oc c c u c h i t h ov i t i ) .

C DR OM, h i t h ov t v n

L i

V t r a n gb a

K h n gc v n b a on h i ut h o nm t n h v ns d n g p h t h i nl i , m t s l u nl u nl e ov ov c h n g t h n gn h yr a k h i t r a n g m t n g i c t i . N ub np h t h i nb t c i ug m b nt i nl m t l i , x i nv u i l n gs d n gc c h n ht h c s a c h a , b ns t mt h y w w w . B r u c e E c k e l . c o m. G i p c a b n c n hg i c a o . nb n ut i nc a c u ns c hn y c m t t r nt r a n gb a , n h n gb a n ut i mu nc m t t r a n gb a c h o n b nt h h a i l n h i uh nm t t c p h mn g h t h u t n h c c t d u y t r o n g J a v a b a . i v i m t s l d o , C++ , d n gn h t i n g h A r t D e c ov i n h n g n gc o n g ng i nc a n v c h r o me b n g . T i c t r o n g u
17/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

m t c i g g i n gn h n h n g pp h c hc a t uv m yb a yv i c c c q u a ns ur n gd i . B nc a t i , D a n i e l Wi l l Ha r r i s , ( w w w . Wi l l H a r r i s . c o m) n g i ut i nt i g pt r o n gc s l pd nh px n g t r n gt r u n gh c , t r t h n hm t n h t h i t k wo r l d c l a s s v n h v n . n g t h c h i nh un h t t c c c t h i t k c a t i , b a og mc t r a n gb a c h o nb n ut i nc a c u ns c hn y . T r o n gq u t r n ht h i t k b a , D a n i e l , k h n gh i l n gv i s t i nb c h n gt i l m, c h i " L mt h n o i un yl i nq u a n nm yt n hn g i ? " C h n gt i b m c k t . T r nm t t h c h , k h n gc k t q u c t h t r o n gt mt r , a n hy uc ut i t k h u nm t c a t i t r nm yq u t . D a n i e l c m t t r o n gc c c h n gt r n h h a c a m n h( C o r e l X a r a , y ut h c hc a m n h ) " a u t o t r a c e " q u t k h u nm t c a t i . Nh n gmi ut l " A u t o t r a c i n gl c c hc a m yt n h b i nm t h n h n hv oc c l o i n gv c c n gc o n gn t h c s t h c h . " S a u , a n h c h i v i n c h o nk h i n g c m t c i g t r n gg i n gn h m t b n a h n hc a k h u nm t c a t i , m t h n h n hm c t h l c c hm t m yt n hc t h n h nt h ym i n g i . T i l yh n h n hn yv c h pn l ng i ym un c ( m t s m yp h o t o c o p ym uc t h x l c p h i ud y ) , v s a u b t ut or a r t n h i ut h n g h i mb n gc c ht h m m un c c h oh n h n h . C h n gt i l a c h nn h n g n g i c h n gt i t h c hn h t , s a u D a n i e l q u t c h n gt r l i v s px pc h n gv ot r a n gb a , t h mv nb nv c c y ut t h i t k k h c . T o nb q u t r n hx yr a t r o n gv i t h n g , c h y ul v t h i g i a nn c h ot i l m m un c . Nh n gt i c b i t t h c hn v t i t h a mg i a v on g h t h u t t r nt r a n gb a , v b i v n c h ot i n gl c l mn h i uh nm un c ( n h n gg h n i v t h c h n ht h c s l n g ) . T h i t k n i t h t c a c u ns c h c t or a b i D a n i e l Wi l l Ha r r i s , n g i t n gc h i v i c h t r nc h c i t r o n g t r n gt r u n gh c c s t r o n gk h i n gc h i s p h t mi n hr a m yt n hv x u t b nm yt n h b n . T u yn h i n , t i a r a t r a n gm y n hs ns n gb nt h nm n h , v v yc c l i s pc h l c a t i . Mi c r o s o f t Wo r dc h o Wi n d o ws p h i nb n8 v 9 c s d n g v i t c u ns c hv t or a c c t r a n gc a me r a r e a d y , b a og mt or a c c b n gn i d u n gv c h m c . ( T i t or a m t m yc h C OM t n gh a t r o n gP y t h o n , c g i l t Wo r dV B A , h t r t i t r o n gc h s n hd u . ) P y t h o n( x e mw w w . P y t h o n . o r g ) c s d n g t or a m t s c n gc k i mt r a m , v s l s d n gc h oc c c n gc k h a i t h c a n gc t i p h t h i nr a n t r c . T i t or a c c s s d n gV i s i o n h T n gc n gt yV i s i oc h ov i c t or a m t c n gc h u c h . C c k i uc h c t h l G e o r g i a v t i u l t r o n gV e r d a n a . P h i nb nc u i c n gm y n h s ns n g c s n A x u t t r o n gA d o b e c r o b a t 4 v a t r c t i pc h ob oc h t t pt i n c m nr t n h i uc h oA d o b e t or a m t c n gc c h op h pc c t i l i um y n h s ns n gg i t h i nt , v n c h op h pn h i us a i c t h c h i nt r o n gm t n g yh nl d a t r nm yi nl a s e r c a t i v c c d c hv p h t n h a n hq u a m. ( C h n gt i c g n g ut i nc a q u t r n hA c r o b a t v i t d u y t r o n g J a v a , v t i c t h t i l nc c p h i nb nc u i c n gc a c u ns c h v om yi nt r o n g M t Na mP h i . ) P h i nb nHT ML c t or a b n gc c hx u t k h uc c t i l i uWo r ds a n gR T F , s a u s d n gR T F 2 HT ML ( x e mh t t p : / / w w w . s u n p a c k . c o m / R T F / ) l mh uh t c n gv i c c a c c c h u y n i HT ML . ( Nh C h r i s He c t o r l mn h v yh u c h , v c b i t l n gt i nc y , c n gc . ) C c t pt i nk t q u c l ms c hb n gc c hs d n gm t c h n gt r n hP y t h o nt yc h n hm t i t nc n gv i n h a u , v WMF s c c h u y n i s a n gG I Fs d n gJ A S C P a i n t S h o pP r o6 v h n gl o t c a n c n gc c h u y n i ( n h J A S C g i i q u y t r t n h i uv n c h ot i v i t u y t v i c a h s np h m) . V i c l mn i b t c p h pm us c c t h mv ot h n gq u a m t k c hb nP e r l v u i l n g n gg p c a Z a f i r A n j u m.

T h i t k v s nx u t c u ns c h

L i c m n

ut i n , n h t t c m i n g i t r nI n t e r n e t n pc h n hv g i , b n r t h u c ht r o n gv i c c i t h i nc h t l n gc a c u ns c hn y , v t i k h n gt h l m c i u m k h n gc b n . c b i t c m nJ o h nC o o k . Nh n gt n gv s h i ub i t t r o n gc u ns c hn y nt n h i un g u n : b nb n h C h u c kA l l i s o n , A n d r e a P r o v a g l i o , D a nS a k s , S c o t t Me y e r s , C h a r l e s P e t z o l d , v Mi c h a e l Wi l k , n g i t i np h o n gc a n g nn g n h B j a r n e S t r o u s t r u p , A n d r e wK o e n i g , v R o bMu r r a y , c c t h n hv i nc a C++U b a nT i uc h u nn h Na t h a n My e r s ( n g i c b i t h u c hv h op h n gv i n h n gh i ub i t c a m n h ) , B i l l P l a u g e r , R e gC h a r n e y , T o m P e n e l l o , T o m Ma i , S a mD r u k e r , v U we S t e i n mu e l l e r , n g i n i t r o n gt i C++t h e od i t i H i n g h p h t t r i np h nm m, v t h n gh c s i n h t r o n gc c b u i h i t h oc a t i , n g i h i n h n gc uh i t i c np h i n g h e l mc h ov t l i ur r n gh n . M t l nc m nb nc h ob nb c a t i G e nK i y o o k a , c c n gt yD i g i g a mi c u n gc pc h ot i v i m t m yc h we b .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

18/320

08/10/2013

Suy ngh trong C + +, Vol 1

B nt i R i c h a r dHa l e S h a wv t i d yC++v i n h a u , h i ub i t v h t r c a R i c h a r d r t h u c h( v K i m, q u ) . C n gx i nc m nK o A n nV i k o r e n , E r i c v n n gF a u r o t , J e n n i f e r J e s s u p , T a r a A r r o wo o d , Ma r c oP a r d i , Ni c o l e F r e e ma n , B a r b a r a Ha n s c o me , R e g i n a R i d l e y , A l e x D u n n e , v p h nc nl i c a c c d i nv i nv p h i h n h o nt i MF I . M t l i c m n c b i t nt t c c c t h yc v t t c c c s i n hv i nc a t i ( n h n gn g i t h yc a t i l t t ) . V c h oc c n h v ny ut h c h , n hg i s us c c a t i v t h n gc mc h on h n gn l c c a b n : J o h nI r v i n g , Ne a l S t e p h e n s o n , R o b e r t s o nD a v i e s ( c h n gt a s n h e m) , T o mR o b b i n s , Wi l l i a mG i b s o n , R i c h a r dB a c h , C a r l o s C a s t a n e d a , v G e n e Wo l f e . G u i d ov a nR o s s u m, p h t mi n hP y t h o nv c h on v v l i v i t h g i i . B n l mp h o n gp h c u c s n gc a t i c h ok h o n n gg pc a b n . Nh c n h n gn g i P r e n t i c e Ha l l : A l a nA p t , A n a T e r r y , S c o t t D i s a n n o , T o n i Ho l m, v b ns a ob i nt pv i n S t e p h a n i e i nt t i n gA n hc a t i . T r o n gt i pt h , B r y a nG a mb r e l v J e n n i e B u r g e r . S o n d a D o n o v a ng i pv i v i c s nx u tc c a C DR o m. D a n i e l Wi l l Ha r r i s ( t t n h i n ) t or a c c t h i t k l a l t r n a r i n gc a m n h . C h ot t c c c f o l k s l nt r o n gC r e s t e dB u t t e , n h l mc h on m t n i h u y nd i u , c b i t l A l S mi t h( n g i s n gt or a t u y t v i C a mp 4 c p h G a r d e n ) , h n gx mc a t i D a v e &E r i k a , Ma r s h a t i P l a c e HE Gc a h i u s c h , P a t &J o h nt i T a ma l e T e o c a l l i , S a mt i B a k e r yC a f , v T i l l e r s g i p c a m n hv i n g h i nc u m t h a n h . V t t c n h n gn g i t u y t v i m i c h i C a mp 4 t r o n gv l mc h ob u i s n gc a t i t h v . C c d i nv i nc a b nb b a og m, n h n gk h n gg i i h n , Z a c k U r l o c k e r , A n d r e wB i n s t o c k , Ne i l R u b e n k i n g , K r a i gB r o c k s c h mi d t , S t e v e S i n o f s k y , J DHi l d e b r a n d t , B r i a nMc E l h i n n e y , B r i n k l e yB a r r , L a r r yO' B r i e n , B i l l G a t e s t i Mi d n i g h t T p c h K t h u t , L a r r y C o n s t a n t i n e , L u c yL o c k wo o d , T o mK e f f e r , D a nP u t t e r ma n , G e n e Wa n g , D a v e Ma y e r , D a v i dI n t e r s i mo n e , C l a i r e S a wy e r s , n g i ( A n d r e a P r o v a g l i o , R o s s e l l a G i o i a , L a u r a F a l l a i , Ma r c o&L e l l a C a n t u , C o r r a d o , I l s a v C h r i s t i n a G i u s t o z z i ) , C h r i s v L a u r a S t r a n d( v P a r k e r ) , c c A l mq u i s t s , B r a dJ e r b i c , Ma r i l y nC v i t a n i c , c c Ma b r y s , c c Ha f l i n g e r s , c c P o l l o c k s , P e t e r V i n c i , R o b b i n s , c c Mo e l t e r s , D a v e S t o n e r , L a u r i e A d a ms , C r a n s t o n s , L a r r yF o g g , Mi k e v K a r e nS e q u e i r a , G a r yE n t s mi n g e r v A l l i s o n B r o d y , K e v i n , S o n d a , v E l l a D o n o v a n , C h e s t e r v S h a n n o n A n d e r s e n , J o e L o r d i , D a v e v B r e n d a B a r t l e t t , c c R e n t s c h l e r s , L y n nv T o d d , v g i a n hc a h . V t t n h i n , m v c h a .

Nh n gm yt n hk h n gp h i q u n h i um ym c n h h l n h n gc n gc k h u c h i t m( " x e pc h ot mt r , " n h S t e v e J o b s l t h c hn i ) v m t l o i k h c n h a uc a c c p h n gt i nb i uc m. K t q u l , c c c n gc c b t ub t g i n gm yv n h i uh nn h m t p h nc a t mt r c a c h n gt i , v c n gn h c c p h n gt i nb i uc mk h c n h v n b n , h i h a , i uk h c , h n h n h n g , v l mp h i m. L pt r n hh n g i t n gl m t p h nc a p h o n gt r on y t r o n gv i c s d n gm yt n hn h m t p h n gt i nb i uc m. C h n gn ys g i i t h i uv i b nn h n gk h i n i mc b nc al pt r n ho b j e c t o r i e n t e d( OOP ) , b a og m m t t n g q u a nv c cp h n gp h pp h t t r i nh n g i t n g . C h n gn y , v c u ns c hn y , g i s r n gb n c k i n h n g h i mt r o n gm t n g nn g l pt r n ht h t c , m c d k h n gn h t t h i t p h i C . N ub nn g h r n gb nc nc h u nb n h i uh nt r o n gl pt r n hv c p h pc a Ct r c k h i g i i q u y t c u ns c hn y , b nn nl mv i c t h n gq u a " t d u y t r o n gC : C s c h oC ++ v J a v a" ot oC DR OM, b r n gb u ct r o n gc u ns c hn yv c n gc s nt i w w w . B r u c e E c k e l . c o m. C h n gn yl n nt n gv t i l i ub s u n g . Nh i un g i k h n gc mt h yt h o i m i l i v ol pt r n hh n g i t n g m k h n gh i un h n gb c t r a n h ut i n . D o , c r t n h i uk h i n i m c g i i t h i u y c u n gc pc h ob n m t c i n h nt n gq u a nv n gc h c c a OOP . T u yn h i n , n h i un g i k h c k h n gc c n h n gk h i n i mh n h n h l nc h o nk h i h n h nt h ym t s c c c c h ut i n , n h n gn g i c t h t r t h n hs a l yv b m t m k h n g c m t s m c c b nt a yc a h t r n . N ub nl m t p h nc a n h ms a uc n gn yv a n gmo n gmu nc c c c c h i t i t c t h c a n g nn g , c mt h yt d o n h yq u a c h n gn yb q u a n v ot h i i mn ys k h n g n g nc nb nv i t c h n gt r n hh o c h c n g nn g . T u yn h i n , b ns mu nq u a yt r l i yc u i c n g i nv o k i n t h c c a b n b nc t h h i ut i s a oc c i t n gl q u a nt r n gv l mt h n o t h i t k v i h .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 19/320

08/10/2013

Suy ngh trong C + +, Vol 1

T i n t r ut n g

T t c c c n g nn g l pt r n hc u n gc pc c k h i n i mt r ut n g . C t h l pl u nr n gs p h c t pc a v n b n c t h g i i q u y t c l i nq u a nt r c t i p nc c l o i v c h t l n gc a s t r ut n g . B i " l o i " t i l , " n l g m b n a n gt r ut n gh a ? " Ng nn g h i l m t k h i n i mt r ut n gn h c a m yn mb nd i . Nh i uc i g i l " B t b u c " n g nn g t h e os a u( n h F o r t r a n , B A S I C , v C ) l k h i n i mt r ut n gc a n g nn g l pr p . C c n g nn g n yl c i t i nl ns ov i n g nn g l pr p , n h n gt r ut n gc h n hc a h v n i h i b np h i s u y n g h v c ut r c c a m yt n hh nl c ut r c c a v n b n a n gc g n g g i i q u y t . C c l pt r n hv i np h i t h i t l pm i l i nh g i a c c mh n hm yt n h( t r o n g" k h n gg i a ng i i p h p " , m l n i m b n a n gmh n h h a v n , c h n gh nn h m t m yt n h ) v mh n hc a v n l t h c s c g i i q u y t ( t r o n g" k h n g g i a nv n " , m l n i m c c v n t nt i ) . C c n l c c nt h i t t h c h i nl pb n n y , v t h c t l n l b nn g o i c c n g nn g l pt r n h , s nx u t c c c h n gt r n hm k h c t h v i t v t nk m d u yt r , v n h m t t c d n gp h t or a t o nb " p h n gp h pl pt r n h " n g n hc n gn g h i p . V i c t h a yt h c h omh n hm yt n hl mh n hc c v n b n a n gc g n g g i i q u y t . Ng nn g s m n h L I S Pv A P L c h nq u a n c b i t c a t h g i i ( " T t c v n l c u i c n gd a n hs c h " h o c " T t c n h n g v n n yl t h u t t o n " ) . P R OL OGp h i t t c c c v n t h n hc h u i c c q u y t n h . Ng nn g c t or a c h oc c c h n gt r n hc o n s t r a i n t b a s e dv c h ol pt r n hr i n gb n gc c ht h a ot c b i ut n g h a . ( S a un y c c h n gmi n hl q u h nc h . ) M i p h n gp h pt i pc nl m t g i i p h pt t c h ol ph c c b i t c a v n c h n g c t h i t k g i i q u y t , n h n gk h i b nb c r a n g o i c a mi nm h t r n nk h x . P h n gp h pt i pc nh n g i t n g i m t b c x a h nb n gc c hc u n gc pc c c n gc c h oc c l pt r n h i d i nc h oy ut t r o n gk h n gg i a nv n . i d i nn yl c h u n gm c c l pt r n hv i nk h n gb r n gb u c v i b t k l o i h n hc t h c a v n . C h n gt i c p nc c y ut t r o n gc c v n k h n gg i a nv c c i d i nc a h t r o n gk h n gg i a ng i i p h pl " i t n g " . ( T t n h i n , b nc n gc nc c c i t n gk h c m k h n g c v n t n gt k h n gg i a n . ) t n gl c h n gt r n h c c h op h p t h c hn g h i v i n h n gb i t n g c a v n b n gc c ht h mc c l o i m i c a c c i t n g , v v yk h i b n c m mt g i i p h p , b n a n g c n h n g l i c n gt h h i nv n . yl m t k h i n i mt r ut n gn g nn g l i n hh o t h nv m n hm h ns ov i n h n gg c h n gt i c t r c y . D o , OOPc h op h pb nmt c c v n v c c v n , c h k h n gp h i l t r o n g i uk i nc a m yt n hm c c g i i p h ps c h y . V nc m t k t n i t r l i m yt n h , m c d . M i i t n gt r n gk h g i n gn h m t m yt n hn h , n c m t n h n c , v n c h o t n gm b nc t h y uc un t h c h i n . T u yn h i n , i un yk h n gc v n h m t t n gt x u nc c i t n gt r o n gt h g i i t h c , t t c uc c i mv h n hv i . M t s n h t h i t k n g nn g q u y t n hr n gl pt r n hh n g i t n gc a c h n hn l k h n g d d n g g i i q u y t t t c c c v n l pt r n h , v n gh s k t h pc a p h n gp h pt i pc nk h c n h a uv o [ 4 ] m u l t i p a r a d i g mn g nn g l pt r n h . A l a nK a yt mt t n m c t r n gc b nc a S ma l l t a l k , n g nn g h n g i t n gt h n hc n g ut i nv m t t r o n gn h n gn g nn g k h i C++d a . Nh n g c i mn y i d i nc h om t c c ht i pc nt i n hk h i t l p t r n hh n g i t n g : .1 T t c m i t h l m t i t n gs u yn g h c a m t i t n gn h m t a t h c h. b i n , n l ut r d l i u , n h n gb nc t h " t h c h i ny uc u " i t n g , y uc un t h c h i nc c h o t n gt r nc h n h n . V l t h u y t , b nc t h i b t c t h n hp h nk h i n i mt r o n gc c v n b n a n gc g n g g i i q u y t ( c h , c c t a n h , d c hv , v v ) v i d i nc h on n h m t i t n gt r o n gc h n gt r n hc a b n . M t c h n gt r n hl m t l o t c c i t n gn i v i n h a un h n gg l mb n gc c h g i t i nn h n. t h c h i nm t st h e oy uc uc a m t i t n g , b n" g i m t t h n g i p " n i t n g . C t h h n , b nc t h n g h r a m t t i nn h nn h m t y uc u g i m t c h c n n gm t h u c v m t i t n gc t h . M i i t n gc b n h r i n gc an t ot h n h c c i t n gk h c. N i c c hk h c , b nt or a m t l o i m i c a i t n gb n gc c hl mc h om t g i c c h a i t n gh i nc . V v y , b nc t h x yd n gp h c t pt r o n gm t c h n gt r n ht r o n gk h i g i u s a us ng i nc a i t n g . M i i t n gc m t t y p. B n gc c hs d n gc c hn i , m i i t n g i nt l m t v d c a m t l p h c , t r o n g " l ph c " l n gn g h a v i " l o i . " c i mp h nb i t q u a nt r n gn h t c a m t l pl " n h n gt h n g i pb nc t h g i c h on ? " T t c c c i t n gc am t l o i h n hc t h c t h n h n cn h n gt h n g i p t n gt . i un yt h c s l m t t u y nb c n p , n h b ns t h ys a un y . B i v m t i t n gc a l o i " v n gt r n " c n gl m t i t n gc a l o i " h n hd n g " , m t v n gt r n c mb o n h nc c t i n n h nh n h . i un yc n g h a l b nc t h v i t m m n i c h u y nv i c c h n hd n gv t n gx l b t c i ug p h h pv i mt c a m t h n hd n g . i un yk h n n g t h a y t h l m t t r o n gn h n gk h i n i m m n hm n h t t r o n gOOP .
20/320

2.

3.

4. 5.

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

M t i t n gc m t g i a od i n

A r i s t o t l e c l l n g i ut i n b t um t n g h i nc uc nt h nc a c c k h i n i mv l o i , n g n i v t n gr n gt t c c c i t n g , t r o n gk h i l d u yn h t , c n gl m t p h nc a m t l ph c c a c c i t n g" c c l ph c c a c c l o i c v c c l ph c c a c c l o i c h i m. " c n h n g c i mv h n hv i t r o n gc h u n g c s d n gt r c t i pt r o n gc c n g nn g h n g i t n g ut i n , S i mu l a 6 7 , v i t k h a c b nc a l pg i i t h i u m t l o i m i v om t c h n gt r n h . [ 5 ] S i mu l a , n h t ng i c a n , c t or a p h t t r i nmp h n gn h c i n" n g nh n gr t t i nv n . " T r o n gn y , b nc m t l o t c c g i a od c hv i n , k h c hh n g , t i k h o n , c c g i a od c h , v c c nv t i nr t n h i u " c c i t n g . " C c i t n gg i n gh t n h a un g o i t r n h n c c a h t r o n gt h i g i a nt h c h i nc a m t c h n gt r n h c n h ml i v i n h a ut h n h " l ph c c a c c i t n g" v l n i m c c t k h a l p nt u . T or a c c k i ud l i ut r ut n g( l p ) l m t k h i n i mc b nt r o n gl pt r n ho b j e c t o r i e n t e d . C c k i ud l i ut r ut n gl mv i c g nn h c h n hx c n h c x yd n gt r o n gc c l o i : B nc t h t or a c c b i nc a m t l o i ( g i l i t n g h o c t r n g h p t r o n gc c hn i h n g i t n g ) v t h a ot c c c b i n( c g i l g i t i n n h nh o c c c y uc u, b ng i m t t i nn h nv n h n gc o ns i t n gr a k h i p h i l mg v i n ) . C c t h n h v i n( y ut ) c a t n gl o i c h i a s m t s p h b i n : m i t i k h o nc s d , t t c c c n h nv i ng i a od c hc t h c h pn h nt i ng i , n gt h i , m i t h n hv i nc n h n c r i n gc a m n h , m i t i k h o nc s d k h c n h a u , m i n h nv i ng i a od c hc t n . D o , c c g i a od c hv i n , k h c hh n g , t i k h o n , g i a od c h , v v , c t h t n g c i d i nv i m t t h c t h d u yn h t t r o n gc c c h n gt r n hm yt n h . T h c t h n yl c c i t n g , v m i i t n gt h u c v m t l ph c c b i t x c n h c i mv h n hv i c a n . V v y , m c d n h n gg c h n gt a t h c s t r o n gl pt r n hh n g i t n gl t or a c c k i ud l i um i , h u n h t t c c c n g nn g l pt r n hh n g i t n gs d n gc c " l ph c " t k h a . K h i b nn h nt h yt " l o i " n g h [ 6 ] r n g" l ph c " v n g c l i . T m t l pmt m t t pc c i t n gc c i mg i n gn h a u( c c y ut d l i u ) v h n hv i ( c h c n n g ) , m t l ph c t h c s l m t k i ud l i ud om t s i mn i , v d , c n gc m t t ph pc c c i mv h n hv i . S k h c b i t l m t l pt r n hv i n n hn g h a m t l p p h h pv i m t v n c h k h n gp h i l b b u c p h i s d n gm t l o i d l i uh i nc c t h i t k i d i nc h om t nv l ut r t r o n gm t m y . B nm r n g n g nn g l pt r n hb n gc c ht h mv oc c k i ud l i uc t h c h on h uc uc a b n . H t h n gl pt r n hc h o n c c l pm i v c u n gc pc h oh t t c s c h ms c v l o i k i mt r a m n ma n gl i c h oc c l o i t c hh ps n . P h n gp h pt i pc nh n g i t n gk h n gg i i h nx yd n gmp h n g . Ha yk h n g , b n n gr n gb t k c h n gt r n hl m t mp h n gc a h t h n gb n a n gt h i t k , v i c s d n gc c k t h u t h n g i t n gc t h d d n gg i m m t s l n gl nc a c c v n nm t g i i p h p ng i n . M t k h i m t l ph c c t h i t l p , b nc t h l mc h on h i u i t n gc a l p n h b nmu n , v s a u t h a o t c c c i t n gn h t h c h n gl n h n gy ut t nt i t r o n gv n b n a n gc g n g g i i q u y t . T h t v y , m t t r o n gn h n gt h c ht h c c a l pt r n hh n g i t n gl t or a m t n hx m t m t g i a c c y ut t r o n gc c v n k h n gg i a nv c c i t n gt r o n gk h n gg i a ng i i p h p . Nh n gl mt h n o b nn h n c m t i t n g l mc n gv i c h u c hc h ob n ? C p h i l m t c c h t h c h i nm t y uc uc a i t n g n s l m i ug , c h n gh nn h h o nt h n hm t g i a od c h , r t r a m t c i g t r nm nh n hh o c b t c n gt c . V m i i t n gc h c t h p n gy uc un h t n h . C c y u c ub nc t h t h c h i nc a m t i t n g c n hn g h a b i n g i a o d i n, v c c l o i l n h n gg x c n hg i a od i n . M t ng i n V d c t h l m t i d i nc a m t b n g n :

n hs n gl t ;

l t . o n( ) ;

G i a od i nt h i t l pn h n g g y uc ub nc t h l mc h om t i t n gc t h . T u yn h i n , c p h i l a n g u p n gy uc u . i un y , c n gv i c c d l i u n , b a og mc c t h c h i n. T m t q u a n i ml p t r n ht h t c , n k h n gp h i l p h c t p . M t l o i c c h c n n gk t h pv i m i y uc uc t h , v k h i b nt h c h i nm t y uc uc t h c h om t i t n g , c h c n n g c g i l . Qu t r n hn yt h n g c t mt t b n g c c hn i r n gb n" g i t i nn h n " ( t om t y uc u ) nm t i t n g , v i t n gh i ur a n h n gg l mv i t h n g i p( n t h c t h i m ) . y , t nc a c c l o i /l pl n hs n g, t nn y c b i t n h i t n gl l t , v c c y uc um b nc t h l m c h om t n hs n g i t n gl c h u y nn v o , t t n i , l mc h on s n gh nh o c l mc h on m . B nt or a m t n hs n g i t n gb n gc c ht u y nb m t t n( l t ) c h o i t n g . g i m t t h n g i pt i c c i t n g , b nc h ob i t t nc a i t n gv k t n i n v i c c y uc ut i nn h nv i m t k h o n gt h i g i a n( d uc h m) . T q u a n i mc a n g i s d n gc a m t l p c x c n ht r c , l k h n h i ut t c c l pt r n hv i c c i t n g . B i u h i nt h t r nt h e o n hd n gc a U n i f i e d Mo d e l i n g L a n g u a g e ( U ML ) . M i l ph c c i d i nb i m t h p , v i l o i t n p h nt r nc a h p , b t k t h n hv i nd l i um b nq u a nt m mt t r o n gp h ng i a c a
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 21/320

08/10/2013

Suy ngh trong C + +, Vol 1

h p , v h mt h n h v i n( c c c h c n n gt h u c v i t n gn y , n h n c b t k t i nn h nb ng i n i t n g ) t r o n gp h nd i c n gc a h p . T h n gt h n g , c h c t nc a l pv c c h mt h n hv i nn o c t h h i nt r o n gs t h i t k U ML , v d o , p h ng i a k h n g c h i nt h . N ub nc h q u a nt m nt nl p , s a u p h nd i k h n gc np h i c h i nt h , m t t r o n gh a i .

V i ct h ch i n n

Nl h u c h c h i a t a ys nc h i v on g i s n g t o l p ( n h n gn g i t or a c c k i ud l i um i ) v l p t r n h [7] k h c h h n g ( n g i t i ud n gl pn g i s d n gc c k i ud l i ut r o n g n gd n gc a h ) . M c t i uc a c c l p t r n hv i nk h c hh n gl t h ut h pm t h pc n gc y c c l ph c s d n g p h t t r i n n gd n gn h a n h c h n g . M c t i uc a t c g i l pl x yd n gm t l ph c m c h c h ot h yn h n gg c nt h i t c c l pt r n hv i n c a k h c hh n gv g i c h om i t h k h c n . T i s a o ? B i v n un n , c c l pt r n hv i nk h c hh n gk h n gt h s d n gn , c n g h a l n g i t or a l pc t h t h a y i c c p h n nt h e ot h c hm k h n gl ol n gv t c n g nb t c a i k h c . C c p h n nt h n g i d i nc h oc c b nt r o n g ut h uc a m t i t n gc t h d d n gb h n gb i m t l pt r n hk h c hh n gb t c nh o c k h n gh i ur , c h e g i uv i c t h c h i nc h n gt r n hg i ml i . C c k h i n i mv nt h c h i nk h n gt h n h nm n h . T r o n gb t k m i q u a nh l q u a nt r n g c r a n hg i i c t nt r n gb i t t c c c b nl i nq u a n . K h i b n t or a m t t h v i n , b nt h i t l pm t m i q u a nh v i k h c hh n gl pt r n h , c n gl m t l pt r n hv i n , n h n g m t t r o n gn h n gn g i c t c n gm t n gd n gb n gc c hs d n gt h v i nc a b n , c t h x yd n gm t t h v i nl nh n . N ut t c c c t h n hv i nc a m t l pc s nc h ot t c m i n g i , s a u c c l pt r n hk h c hh n gc t h l mb t c i ug v i l p v k h n gc c c hn o t h c t h i c c q u yt c . Ng a yc k h i b nt h c s c t h t h c hc c l p t r n hv i nk h c hh n gk h n gt r c t i pt h a ot c m t s c c t h n hv i nc a l ph c c a b n , m k h n gk i ms o t t r u yc pk h n gc c c hn o n g nc h nn . M i t h ut r nt r u n gv i t h g i i . V v y , l d o ut i n k i ms o t t r u yc pl g i b nt a yl pt r n hc a k h c hh n gr a p h nh k h n gn n c h mv oc c b p h n l c nt h i t c h on i b m u c a k i ud l i un h n gk h n gm t p h nc a g i a od i n m n g i d n gc n g i i q u y t c c v n c t h c a m n h. i un yt h c s l m t d c hv c h on g i s d n g v c h n gc t h d d n gn h nt h yn h n gg q u a nt r n gv i h v n h n gg h c t h b q u a . L d ot h h a i k i ms o t t r u yc pl c h op h pc c n h t h i t k t h v i n t h a y i c c h o t n gn i b c a l pm k h n gl ol n gv n n h t h n os n hh n g nc c l pt r n hv i nk h c hh n g . V d , b nc t h t h c h i nm t l ph c c b i t t r o n gm t t h i t r a n g ng i n d d n gp h t t r i n , v s a u p h t h i nr a r n gb n c np h i v i t l i n l mc h on c h yn h a n hh n . N ug i a od i nv t h c h i n c p h nc c hr r n gv c b ov , b nc t h t h c h i n i un yd d n gv c h y uc um t r e l i n kb i n g i s d n g . C++s d n gb a t k h a r r n g t h i t l pr a n hg i i t r o n gm t l p : c n gc n g, r i n gt , v b ov . S d n g v n g h a c a c h n gl k h ng i n . Nh n gs p e c i f i e r s t r u y c p x c n hn h n gn g i c t h s d n gc c n h n g h a s a u y . c n gc n g h a l c c n hn g h a s a u yc s nc h om i n g i . C c t i nt k h a , m t k h c , c n g h a l k h n ga i c t h t r u yc pv oc c n hn g h a n g o i t r b n , n g i s n gt or a c c l o i , b nt r o n gh m t h n hv i nc a l o i . t i nl m t b c t n gg c hg i a b nv c c l pt r n hv i nk h c hh n g . N ua i c g n g t r u yc pv om t t i nt h n hv i n , h s n h n c m t l i t h i g i a nb i nd c h . b ov h n h n gg i n gn h t i n, v i n g o i l l m t l pk t h a c q u y nt r u yc p b ov c c t h n hv i n , n h n gk h n gt i nc c t h n hv i n . T h a k s c g i i t h i ut r o n gt h i g i a nn g n .

T i s d n gt h ch i n

M t k h i m t l ph c c t or a v t h n g h i m, n n n( t t n h t l ) i d i nc h om t nv h u c hc a m . Nc h r a r n gc t h d n gl i n yl g nn h k h n gd d n g t c n h n h i un g i h yv n g , n c k i n h n g h i mv h i ub i t s nx u t m t t h i t k t t . Nh n gm t k h i b nc m t t h i t k n h v y , c ux i n c t i s d n g . M t i s d n gl m t t r o n gn h n gl i t h l nn h t l n g nn g l pt r n hh n g i t n gc u n gc p . C c h ng i nn h t t i s d n gm t l pl c h c ns d n gm t i t n gc a l pt r c t i p , n h n gb nc n gc t h t m t i t n gc a l p t r o n gm t l pm i . C h n gt i g i yl " t or a m t i t n gt h n hv i n . " L p m i c a b nc t h c t ot h n ht b t k s l n gv k i uc a c c i t n gk h c , t r o n gb t k s k t h pm b nc n t c c c c h c n n gmo n gmu nt r o n gl pm i c a b n . B i v b n a n gs o nm t l pm i t c c l ph c h i nc , k h i n i mn y c g i l t h n h p h n( h a yr n gh n , t p h p ) . T h n hp h nt h n g c g i l " c m t " m i q u a nh , n h t r o n g" m t c h i c x e c n gc . " ( C c s U MLt r nc h ot h yt h n hp h nv i k i mc n gl p y , t r o n g n i c m t x e t i t h n gs s d n g [ 8 ] m t h n ht h c ng i n : . . C h l m t n g , k h n gc k i mc n g , c h r a m i l i nq u a n )

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

22/320

08/10/2013

Suy ngh trong C + +, Vol 1

T h n hp h n i k mv i r t n h i ut n hl i n hh o t . C c i t n gt h n hv i nc a l pm i c a b nt h n gl t n h n , l mc h oh k h n gt h t i pc n c c l pt r n hk h c hh n g a n gs d n gc c l ph c . i un yc h op h pb n t h a y i c c t h n hv i nm k h n gl mp h i nm s k h c hh n gh i nc . B nc n gc t h t h a y i c c i t n g t h n hv i nt r o n gt h i g i a nc h y , t n gt h a y i h n hv i c a c h n gt r n hc a b n . T h a k , c mt t i p t h e o , k h n gc s l i n hh o t n yk t k h i t r n hb i nd c hp h i t g i i h nt h i g i a nb i nd c hv oc c l ph c c t or a v i d i s n . V t h a k l r t q u a nt r n gt r o n gl pt r n hh n g i t n gn t h n g c n h nm n h , v c c l pt r n hv i n m i c t h n h n c c c k i n c h or n gt h a k n n c s d n g k h pm i n i . i un yc t h d n n t h i t k v n gv v q u p h c t p . T h a yv o , ut i nb nn nt m nt h n hp h nk h i t ol pm i , v n l ng i nv l i n hh o t h n . N ub nc c c ht i pc nn y , t h i t k c a b ns l i s c hh n . M t k h i b n c m t s k i n hn g h i m, n s l h pl r r n gk h i b nc nt h a k .

T h ak : t i s d n gg i a od i n

B i c h n hn , t n gv m t i t n gl m t c n gc t i nl i . Nc h op h pb n n gg i d l i uv c h c n n g v i n h a ub n gk h i n i m, v v yb nc t h i d i nc h om t t n gv n k h n gg i a nt h c hh ph nl b u c p h i s d n gt h n hn g c a m yn mb nd i . Nh n gk h i n i mn y c t h h i nn h c c nv c b nt r o n g n g nn g l pt r n hb n gc c hs d n gc c l pt k h a . C v n h m t i u n gt i c , t u yn h i n , i nt t c n h n gr c r i t or a m t l pv s a u b b u c p h i t or a m t t h n gh i um i m c t h c c h c n n gt n gt . N ph nn uc h n gt a c t h l yl ph c h i nc , s a oc h pn , v s a u t h c h i nb s u n gv s a i c c b ns a o . yl m t c c hh i uq u n h n gg b nn h n c v i t h a k , v i n g o i l l n uc c l pb a n u( g i l c s h o c s i uh o c c h a m l p ) c t h a y i , " n h n b n " s a i ( g i l c n g u ng c h o c c t h a k h o c p h h o c t r l p ) c n gp h n n hn h n gt h a y i .
C s

Ngun gc

( M i t nt r o n gs U ML i mt r nt l pd nx u t nl pc s . Nh b ns t h y , c t h c n h i uh nm t l p d nx u t . ) M t l o i k h n gc g n h i uh ns ov i mt n h n gh nc h t r nm t t pc c i t n g , n c n gc m t m i q u a n h v i c c l o i k h c . Ha i l o i c t h c n h n g c i mv h n hv i t r o n gp h b i n , n h n gm t l o i c t h c h a c c c t n hh nk h c v c n gc t h x l n h i ut i nn h n( h o c x l k h c n h a u ) . T h a k t h h i ns t n g n gn yg i a c c l o i h n hs d n gc c k h i n i mv c c l o i c b nv c c l o i c n g u ng c t . M t l o i h n h c b nb a og mt t c c c c i mv h n hv i c c h i a s g i a c c l o i c n g u ng c t n . B nt or a m t l o i c s i d i nc h oc t l i c a t n gc a b nv m t s i t n gt r o n gh t h n gc a b n . T k i uc s , b n l y c c c l o i k h c t h h i nc c hk h c n h a um c t l i n yc t h c t h c h i n . V d , m t t h n gr c t i c h m yc c l o i m ur c . K i uc s l " t h n gr c " , v m i p h nc a t h n gr c c t r n g l n g , g i t r , v n h v y , v c t h c b mn h , t a nc h y , h o c b p h nh y . T , c c l o i c t h h nc c c h t t h i c n g u ng c c t h c n h n g c t n hb s u n g( m t c h a i c m u ) h o c h n hv i ( b n gn h mc t h c t h c n g h i nn t , m t t h pc t h l t ) . Ng o i r a , m t s h n hv i c t h k h c n h a u( g i t r c a g i yp h t h u c v o l o i v i uk i nc a m n h ) . S d n gt h a k , b nc t h x yd n gm t h t h n gp h nc pk i ut h h i nc c v n b n a n gc g n g g i i q u y t v c h n gl o i c a n . V d t h h a i l c i n" h n hd n g " V d , c t h c s d n gt r o n gm t t h i t k h t h n gm yt n hh t r h o c t r c h i mp h n g . K i uc s l " h n hd n g " , v m i h n hc k c ht h c , m us c , v t r , v n h v y . M i m t h n hd n gc t h c r t r a , x a , d i c h u y n , m u , v vT y , l o i h n hc t h c a h n hd n gc n g u ng c ( c t h a k ) : v n gt r n , v u n g , t a mg i c , v n h v y , m i t r o n gs c t h c n h n g c t n hb s u n gv h n hv i . M t s h n hd n gc t h c l n , v d . M t s h n hv i c t h k h c n h a u , c h n gh nn h k h i b nmu nt n ht o n d i nt c hc a m t h n hd n g . H t h n gp h nc pk i ut h h i nc n h n g i mt n g n gv k h c b i t g i a c c h n hk h i . c c c g i i p h pt r o n gc c i uk h o nt n gt n h v n l r t c l i v b nk h n gc np h i c r t n h i um h n ht r u n gg i a n c c t m t mt c a v n mt v c c g i i p h p . V i c c i t n g , h t h n gp h n c pl o i l mh n hc h n h , d o b n i t r c t i pt mt c a h t h n gt r o n gt h g i i t h c mt c c h t h n g t r o n gm . T h t v y , m t t r o n gn h n gk h k h nn g i c v i t h i t k h n g i t n gl n q u ng i n c c t u nc u i . M t t m ot o t mk i mc c g i i p h pp h c t pt h n gb i r i b i s ng i nn y l n ut i n .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 23/320

08/10/2013

Suy ngh trong C + +, Vol 1

K h i k t h a t m t l o i h i nt i , b nt or a m t l o i m i . L o i m i n yk h n gc h c h a t t c c c t h n hv i nc a c c l o i h i nc ( m c d t i nn h n gn g i c n i v k h n gt h t r u yc p ) , n h n gq u a nt r n gn h nb ns a o g i a od i nc a l pc s . C n g h a l , t t c c c t i nn h nb nc t h g i nc c i t n gc a l pc s b nc n gc t h g i nc c i t n gc a l pd nx u t . V c h n gt a b i t l o i c a m t l pv i c c t h n gb oc h n gt i c t h g i c h on , i un yc n g h a r n gc c l ph c c n g u ng c l c c n g k i uv i l p c s . T r o n gv d t r c , " m t v n gt r nl m t h n hd n g . " L o i n yt n g n gt h n gq u a t h a k l m t t r o n gn h n gc n gc b nt r o n g v i c t mh i un g h a c a l pt r n hh n g i t n g . V c h a i l pc s v l pd nx u t c c n gm t g i a od i n , p h i c m t s t h c h i n i c n gv i g i a od i n . l , p h i c m t s m t h c t h i k h i m t i t n gn h n c m t t h n g i pc t h . N ub nc h ng i nl t h a k m t l pv k h n gl mb t c i ug k h c , c c p h n gp h pt g i a od i nl pc s np h i c n gv o l pd nx u t . i u c n g h a c c i t n gc a l pd nx u t k h n gc h c c n gl o i , h c n gc h n hv i t n g t , m k h n gp h i l c b i t t h v . B nc h a i c c h p h nb i t n gc pm i c n g u ng c t c c l pc s b a n u . ut i nl k h ng i n : B n c h c nt h mc h c n n gt h n gh i um i c h ol pd nx u t . C c t n hn n gm i k h n gn mt r o n gg i a od i nl pc s . i un yc n g h a r n gc c l pc s c h ng i nl k h n gl mn h i un h b nmu nn , v v yb nc t h m n h i uc h c n n gh n . N ys d n g ng i nv s k h a i c h oc c t h a k l , v on h n gt h i i m, g i i p h ph o n h oc h ov n c a b n . T u yn h i n , b nn nx e mx t c h t c h k h n n gl pc s c a b nc n gc t h c nn h n g c h c n n gb s u n g . Qu t r n hn yp h t h i nv l p i l pl i c a t h i t k c a b ns x yr a t h n gx u y nt r o n g c h n gt r n ho b j e c t o r i e n t e d . M c d t h a k i k h i c t h n g r n gb ns b s u n gt h mc h c n n gm i c h og i a od i n , l k h n gn h t t h i t p h i n g . C c ht h h a i v q u a nt r n gh n p h nb i t n gc pm i c a b nl t h a y i h n hv i c a m t c h c n n gc b n l ph c h i nc . i un y c g i l t r n g c h c n n g . g h i l nm t c h c n n g , b nc h ng i nl t or a m t n hn g h a m i c h oc c c h c n n gt r o n gc c l pd n x u t . B n a n gn i , " T i a n gs d n gc c c h c n n gg i a od i nt n gt y , n h n gt i mu nl m m t c i g k h c n h a uc h ol o i m i c a t i . "

L m tv sl n h m tm i q u a nh
C m t c u c t r a n hl u nc h c c h nr n gc t h x yr a v t h a k : n ng h i l nt h a k c h c c h c n n gc s n gc p( v k h n gt h mc h c n n gt h n hv i nm i m k h n gp h i l t r o n gl pc s ) ? i un yc n g h a r n g c c l o i c n g u ng c l c h n h x c c n gl o i n h l pc s v n c c h n hx c c n gm t g i a od i n . K t q u l , b n b i t c h n hx c c t h t h a yt h m t i t n gc a l pd nx u t c h om t i t n gc a l pc s . i un yc t h c c o i l s t h a y t h t i n h k h i t , v n t h n g c g i l c c n g u y nt c t h a y t h . T r o n gm t n g h a n o , y l c c hl t n g i ut r t h a k . C h n gt a t h n g c p nm i q u a nh g i a c c l pc s v c c l ph c c n g u ng c t r o n gt r n gh pn yn h m t l m t m i q u a nh , b i v b nc t h n i " m t v n gt r nl m t h n h d n g . " M t t h n g h i mc h oc c t h a k l x c n hx e mb nc t h n u c m t m i q u a nh v c c l ph c v n c n g h a . C n h n gl c b np h i t h mc c y ut g i a od i nm i c h om t l o i c n g u ng c , d o m r n gg i a od i nv t or a m t l o i m i . L o i m i v nc t h t h a yt h c h oc c l o i h n hc s , n h n gt h a yt h l k h n gh o nh ob i v c c c h c n n gm i c a b nk h n gt h t r u yc pt k i uc s . i un yc t h c mt n h m t l n h m t m i q u a nh , l o i m i c g i a od i nc a c c l o i c , n h n gn c n gc h a c c c h c n n gk h c , v v yb nc t h k h n g t h c s n i l c h n hx c n h n h a u . V d , h yx e mx t m t i uh a k h n gk h . G i s n g i n h c a b n c n i v i t t c c c i uk h i n l m m t , c n g h a l , n c m t g i a od i nc h op h pb nk i ms o t l m m t . H y t n gt n gr n g i uh a k h n gk h b p h v v b nt h a yt h n b n gm t m yb mn h i t , c t h c h a i n n g v m t m . C c m yb mn h i t l n h m t i uh a k h n gk h , n h n gn c t h l mn h i uh nn a . B i v h t h n gk i ms o t n h c a b nc h c t h i t k k i ms o t l m m t , n b h nc h g i a ot i pv i p h nl m m t c a c c i t n gm i . G i a od i nc a i t n gm i c m r n g , v c c h t h n gh i nt i k h n gb i t v b t c i ug n g o i t r g i a od i nb a n u . l p" h t h n gl m m t " l k h n g n i c h u n g , v c n c i t nt h n h" h t h n gk i ms o t n h i t " , v v y m n c n gc t h b a og mn n gl c n yc c n g u y nt c t h a yt h s l mv i c . T u yn h i n , s t r nl m t v d v n h n gg c t h x yr a t r o n gt h i t k v t r o n gt h g i i t h c . K h i b nn h nt h yc c n g u y nt c t h a yt h r t d d n g c mt h yn h c c ht i pc nn y( t h a yt h t i n hk h i t ) l c c hd u yn h t l mv i c , v t r o n gt h c t , n l t t pn ut h i t k c a b nh o t n gr a t h e oc c h . Nh n g b ns t h yr n gc n h n gl c n ur r n gr n gb np h i b s u n gt h mc h c n n gm i c h og i a od i nc a m t l pd nx u t . V i k i mt r a c h a i t r n gh pc n c h pl r r n g .

i t n gh o n i c h on h a u v i ah n h
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 24/320

08/10/2013

Suy ngh trong C + +, Vol 1

K h i g i a od c hv i c c l o i h t h n gp h nc p , b nt h n gmu n i ut r m t i t n gk h n gp h i l c c l o i h n hc t h r n g l n h n gt h a yv o l l o i h n hc b nc a n . i un yc h op h pb nv i t m m k h n g p h t h u c v ol o i h n hc t h . T r o n gv d h n hd n g , c h c n n gt h a ot c h n hd n gc h u n gc h u n gm k h n g l i nq u a n nc h od h a n gt r n , h n hv u n g , h n ht a mg i c , v n h v y . T t c c c h n hd n gc t h c r t r a , x a , d i c h u y n , d o c c c h c n n gn yc h c ng i m t t i nn h n nm t i t n gh n hd n g , h k h n gl o l n gv c c ht h c p h n n g i t n gv i t h n g i p . M n h v yl k h n gb n hh n gb i v i c b s u n gc c l o i m i , v b s u n gt h mc c l o i m i l c c hp h b i n n h t m r n gm t c h n gt r n hh n g i t n g x l n h n gt n hh u n gm i . V d , b nc t h l y c m t s u b t y p e m i c a h n hd n g c g i l n g g i c m k h n gs a i c c c h c n n gm c h i p h v i h n h d n gc h u n g . K h n n gn y m r n gm t c h n gt r n hd d n gb n gc c hb t n g u np h nn h m m i l q u a n t r n gb i v n c i t h i n n gk t h i t k t r o n gk h i g i mc h i p h b ot r p h nm m. C m t v n , t u yn h i n , v i c g n g i ut r i t n gc n g u ng c t l o i n h c c l o i c s c h u n gc a h ( v n gt r nn h h n hd n g , x e pn h x e c , c h i mc c n h c h i m, v v . ) N um t c h c n n gs c h om t h n hd n g c h u n g v r i n gc a m n h , h o c m t c h i c x e c h u n g c h o , h o c m t c o nc h i mc h u n g d i c h u y n , t r n h b i nd c hk h n gt h b i t t i t h i g i a nb i nd c hc h n hx c n h n gg o nm s c t h c t h i . l t o nb i m k h i t i nn h n c g i i , c c l pt r n hv i nk h n gm u nb i t n h n gg o nm s c t h c t h i , c c c h c n n g v c t h c pd n gn h n h a u i v i m t v n gt r n , h n hv u n g , h o c m t h n ht a mg i c , v c c i t n g s t h c h i nm t h c hh pt yt h u c v ol o i h n hc t h c a n . N ub nk h n gc np h i b i t n h n gg o nm s c t h c h i n , s a u k h i b nt h m m t s u b t y p e m i , m n t h c h i nc t h k h c n h a um k h n gc nt h a y i c c c h c n n gg i . D o , t r n hb i nd c hk h n gt h b i t c h n hx c n h n gg o nm c t h c t h i , v v y n h n gg n l mg ? V d , t r o n gb i u d i yc c B i r d C o n t r o l l e r i t n gc h h o t n gv i c h u n gB i r d i t n g , v k h n gb i t n h n gg l o i c h n hx c h a n gc . yl t h u nt i nt B i r d C o n t r o l l e r ' q u a n i m, b i v n k h n gp h i v i t m c b i t x c n hc h n hx c l o i c h i mn l mv i c v i , h o c c h i mh n hv i c a . V yl mt h n on x yr a , k h i d i c h u y n( ) c g i t r o n gk h i b q u a c c l o i h n hc t h c a c h i m, h n hv i n gs x yr a ( m t Go o s e c h y , b a y , h o c b i l i , v c h i mc n hc t c h yh o c T r n hb i nd c hk h n gt h t h c h i nc u c g i c h c n n gt r o n gn g h a t r u y nt h n g . C h c n n gg i c t or a b i m t n g u y nn h nt r n hb i nd c hk h n gOOPn h n gg c g i l ur n g b u c , m t t h u t n g b nc t h k h n gc n g h e n i t r c b i v b nc h a b a og i n g h v n b t k c c hn ok h c . Nc n g h a l t r n hb i nd c h t or a m t c u c g i nm t t nc h c n n gc t h , v c c m i l i nk t g i i q u y t c u c g i n y n a c h t u y t i c a c c m c t h c t h i . T r o n gOOP , c h n gt r n hk h n gt h x c n h a c h c a m c h o nk h i t h i g i a nc h y , v v ym t s c h n gt r n hk h c l c nt h i t k h i t i nn h n c g i nm t i t n gc h u n g . g i i q u y t v n , n g nn g h n g i t n gs d n gk h i n i mc u i r n g b u c . K h i b ng i m t t i nn h n n m t i t n g , m l g i l k h n g c x c n hc h o nk h i t h i g i a nc h y . T r n hb i nd c hk h n g mb or n gc c c h c n n gt nt i v t h c h i nk i mt r a t r nc c i s v g i t r t r v ( m t n g nn g m i un yl k h n g n gs t h t c g i l k i ug y u) , n h n gn k h n gb i t m c h n hx c t h c h i n . T h c h i nv oc u i r n gb u c , C++ , t r n hb i nd c hc h nm t c h t c b i t c a m t h a yc h oc u c g i t u y t i . M n yt n ht o n a c h c a c c c q u a nc h c n n g , s d n gt h n gt i n c l ut r t r o n gc c i t n g( q u t r n hn y c b a op h r t c h i t i t t r o n gc h n g1 5 ) . Nh v y , m i i t n gc t h h n hx k h c n h a ut h e oc c n i d u n gc a b i t c b i t c a m . K h i b ng i m t t h n g i pt i m t i t n g , i t n gt h c s k h n gt mr a n h n gg l mv i t h n g i p . n gt u y nb r n gb nmu nc m t c h c n n g c s l i n hh o t c a c c t h u c t n hl a t e b i n d i n gs d n gt k h a o. B nk h n gc np h i h i u c c c h c a o s d n gn , n h n gk h n gc n b nk h n gt h l ml p t r n hh n g i t n gt r o n gC++ . T r o n gC++ , b np h i n h t h m ot k h a b i v , t h e om c n h , c h c n n gt h n hv i n c k h n g t n gb r n gb u c . C h c n n g oc h op h pb nt h h i ns k h c b i t t r o n gh n h v i c a c c l ph c t r o n gc n gm t g i a n h . Nh n gk h c b i t l n h n gg g yr a h n hv i a h n h . X e mx t v d h n hd n g . C c g i a n hc a c c l ph c ( t t c ud a t r ng i a od i nt h n gn h t n h n h a u ) c d i a g r a mme d c h n gt r c . c h n gmi n ht n h a h n h , c h n gt i mu nv i t m t m n hd u yn h t c a m m b q u a c c c h i t i t c t h c a l o i v c c c u c mp h nc h c c l pc s . M c t c h r i n g t l o i t h n gt i n c t h , v d o l ng i n v i t v d h i uh n . V , n um t l o i m i m t h n hl c g i c , v d c t h m v ot h n gq u a k t h a , o nc o d e b nv i t s c h l mv i c t t c h oc c l o i m i c a h n hn h n l mt r nc c l o i h i nc . V v y , c h n gt r n hn yl m r n g . N ub nv i t m t h mt r o n gC++( n h b ns s mt mh i uc c hl m) :
k h o n gt r n gd o S t u f f( S h a p e&s ){ s . e r a s e( ) ; //. . . s . d r a w( ) ; }

C h c n n gn yn i c h u y nv i b t k h n hd n g, v v yn k h n gp h t h u c v ol o i h n hc t h c a i t n g m n c v v x a ( c c ' &' c n g h a l " i t h e o a c h c a i t n g c t r u y nc h od o S t u f f ( ) , " n h n g n k h n gq u a nt r n gl b nh i uc c c h i t i t v i u n g a yb yg i ) . N ut r o n gm t s p h nk h c c a c h n g


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 25/320

08/10/2013

Suy ngh trong C + +, Vol 1

t r n hc h n gt i s d n gd o S t u f f ( ) c h c n n g :
V n gt r nc ; Tt a mg i c ,t u y nl ;d o S t u f f( c ) ;d o S t u f f( t ) ;d o S t u f f ( l ) ;

C c c u c g i nd o S t u f f ( ) t n gl mv i c n g a y , k h n gp h t h u c v ol o i c h n hx c c a i t n g . i un yt h c s l m t t h t h u t k h t u y t v i . X e mx t c c d n g : d o S t u f f( c ) ; Nh n gg a n gx yr a yl m t mi a n g c t h n gq u a v om t c h c n n g l c h i m t S h a p e . K t k h i m t mi l m t h n hn c t h c c o i n h m t b n gd o S t u f f ( ) . C n g h a l , b t k t h n g i pr n g d o S t u f f ( ) c t h g i c h om t S h a p e , m t mi c t h c h pn h n . V v y , n l m t i uh o nt o na nt o nv h pl l m. C h n gt i g i q u t r n hn y i ut r m t l o i c n g u ng c n h t h l l o i h n hc b nc a n u p c a s t i n g . T n d i nv i n c s d n gt r o n gc c c mg i c c t h n hm t k h u nv l nx u t p h t t c c hs t h a k t h n g c s px p , v i c c l o i c s p h a t r nv c c l ph c c n g u ng c t q u t r a x u n g . D o , c m t l o i c s c d i c h u y nl nc c s t h a k : " u p c a s t i n g . " M t c h n gt r n hh n g i t n gc c h a m t s u p c a s t i n gn i n o , b i v l c c hb nt c hm n hk h i h i ub i t v c c l o i c h n hx c b n a n gl mv i c v i . Nh nv oc c m t r o n gd o S t u f f ( ) :
s . e r a s e( ) ; s . d r a w( ) ; //. . .

C h r n gn k h n gn i " N ub nl m t mi , l m i un y , n ub nl m t q u n gt r n g, l m i u , v v " N ub nv i t r n gl o i m , t r o n g k i mt r a c h ot t c c c l o i c t h l m t h n ht h t h c s c , l l n x nv b nc np h i t h a y i n m i k h i b nt h m m t l o i m i c a S h a p e . T i y , b nc h c nn i " B nl m t h n hd n g , t i b i t b nc t h x a ( ) v v ( ) c h n hm n h , l m i u , v c h ms c c a c c c h i t i t c h n hx c . " Nh n gg l nt n gv c c m t r o n gd o S t u f f ( ) c n g h a l , b n gc c hn o , n gx yr a . K ug i h a ( ) c h o c c mi g yr a c c m k h c n h a u c t h c h i nh nk h i g i h a ( ) c h om t t r n gh o c m t D n g, n h n gk h i v ( ) t i nn h n c g i nm t v d a n h H n hd n g, h n hv i c h n hx c x yr a d a t r nc c l o i t h c t c a S h a p e . i un yl t u y t v i b i v , n h c pt r c , k h i C++t r n hb i nd c hl b i nd c hm c h od o S t u f f ( ) , n k h n gt h b i t c h n hx c n h n gg l o i n c x l . V v y , t h n gt h n g , b nmo n gmu nn k t t h c g i p h i nb nx a ( ) v v ( ) c h oS h a p e , v k h n gc h oc c c t r n, v u n g, h o c d n g. Nh n g n gx yr a v a h n h . T r n hb i nd c hv t h i g i a nc h yh t h n gx l c c c h i t i t , t t c b nc nb i t l n x yr a v q u a nt r n gh nl l mt h n o t h i t k v i n . N u m t h mt h n hv i nl o, s a u k h i b ng i t i nn h n nm t i t n g , i t n gs l m i u n g , n g a yc k h i u p c a s t i n gc l i nq u a n .

T or av p h h y i t n g

V m t k t h u t , l n hv c OOPl n hm yt r ut n gd l i u , t h a k , v a h n h , n h n gc c v n k h c c t h c t n h t l q u a nt r n g . P h nn yc u n gc pc h om t t n gq u a nv n h n gv n n y . c b i t q u a nt r n gl c c h i t n g c t or a v b p h h y . M l d l i uc h om t i t n gv l mt h n o l c u c i c a i t n g c k i ms o t ? Ng nn g l pt r n hk h c n h a us d n gt r i t l k h c n h a u y . C++ pd n gb i np h pk i ms o t h i uq u l v n q u a nt r n gn h t , v v yn ma n gl i c h oc c l pt r n hv i nm t s l a c h n . C h ot c c h yt i a , l ut r v t u i t h c t h c x c n ht r o n gk h i c h n gt r n h a n g c v i t , b n gc c h t c c i t n gt r ns t a c kh a yt r o n gl ut r t n h . S t a c kl m t k h uv c t r o n gb n h c s d n gt r c t i pb i b v i x l l ut r d l i ut r o n gq u t r n ht h c h i nc h n gt r n h . C c b i nt r ns t a c k i k h i c g i t n g h o c s c o p e d b i n . K h uv c l ut r t n hc h ng i nl m t b nv c n hb n h c c p p h t t r c k h i c h n gt r n hb t uc h y . S d n gs t a c kh o c k h uv c l ut r t n h t ut i nv ot c p h nb l ut r v p h t h n h , t r o n g c t h c g i t r t r o n gm t s t r n gh p . T u yn h i n , b nh ys i n hs l i n hh o t b i v b np h i b i t c h n hx c s l n g , t h i g i a ns n g , v l o i i t n gt r o n g k h i b n a n gv i t c h n gt r n h . N u b n a n gc g n g g i i q u y t m t v n t n gq u t h n , c h n gh nn h t h i t k m yt n hh t r , q u nl k h o , h o c k i ms o t k h n gl u , i un yl q u h nc h . P h n gp h pt h h a i l t or a i t n gt n gt r o n gm t h b i c a b n h c g i l n g . T r o n gp h n g p h pn y , b nk h n gb i t c h o nk h i t h i g i a nc h yb a on h i u i t n gm b nc n , n h n gg c u c i c a h l , h o c n h n gl o i c h n hx c c a h . Nh n gq u y t n hn y c t h c h i nt i c c k c ht h c hc a t h i i mn y t r o n gk h i c h n gt r n h a n gc h y . N ub nc nm t i t n gm i , b nc h ng i nl l mc h on t r n n gk h i b nc nn , b n gc c hs d n gmi t k h a . K h i b n h o nt t v i v i c l ut r , b np h i p h t h n hn b n g

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

26/320

08/10/2013

Suy ngh trong C + +, Vol 1

c c hs d n gx a t k h a . B i v l ut r c q u nl t n gt r o n gt h i g i a nc h y , s l n gt h i g i a nc nt h i t p h nb l ut r t r n h e a pl l uh n n gk s ov i t h i g i a n t or a l ut r t r ns t a c k . ( T ol ut r t r ns t a c kt h n gl m t h n g d nb v i x l d u yn h t d i c h u y nc o nt r n g nx px u n g , v m t d i c h u y nn t r l i . ) C c ht i pc n n n g n gl mc h oc c g i n ht h n gh pl c h oc c i t n gc x uh n gp h c t p , d o c h i p h t h mc a v i c t mk i ml ut r v p h t h n hl ut r s k h n gc t c n gq u a nt r n gv ov i c t or a m t i t n g . Ng o i r a , s l i n hh o t l nh nl c nt h i t g i i q u y t v n l pt r n hc h u n g . C m t v n k h c , t u yn h i n , v l t h i g i a ns n gc a m t i t n g . N ub nt om t i t n gt r ns t a c k h a yt r o n gl ut r t n h , t r n hb i nd c hx c n h i t n gk od i b a ol uv c t h t n gt i ud i t n . T u y n h i n , n ub nt or a n t r n n g , t r n hb i nd c hk h n gc k i nt h c v c u c i c a n . T r o n gC++ , l pt r n h v i np h i x c n hl pt r n hk h i t i ud i t c c i t n g , v s a u t h c h i nt i uh u b n gc c hs d n gx a t k h a . Nh m t s t h a yt h , m i t r n gc t h c u n gc pm t t n hn n g c g i l m t n g i t h ug o mr c c t h t n gp h t h i nk h i m t i t n gk h n gc n c s d n gv p h h yn . T t n h i n , v i t c h n gt r n hs d n g m t b t h ur c l t h u nt i nh nn h i u , n h n gn i h i r n gt t c c c n gd n gp h i c k h n n gc h u n gs t nt i c a n g i t h ug o mr c v c c c h i p h t h ug o mr c t h i . i un yk h n g p n gc c y uc ut h i t k c a C ++v v v yn k h n g c b a og m, m c d t h ug o mr c c a b nt h b a t nt i c h oC++ .

X l n g o i l : x l c cl i

K t k h i b t uc a n g nn g l pt r n h , x l l i l m t t r o n gn h n gv n k h k h nn h t . B i v n r t k h t h i t k m t c h n gt r n hx l l i t t , n h i un g nn g ng i nl b q u a v n n y , i q u a c c v n t r n t h i t k t h v i nn g i a r a c c b i np h pn a c h n gc t h l mv i c t r o n gn h i ut n hh u n g , n h n gc t h d d n gb p h v , t h n gb n gc c hb q u a c h n g. M t v n l nv i h uh t c c c h n gt r n hx l l i l h d a v ol pt r n hc n hg i c t r o n gs a um t h i n g h a g r e e d u p o nm k h n g c t h c t h i b i n g nn g . N uc c l p t r n hv i nk h n gc n hg i c , t h n gx yr a k h i h a n g t r o n gm t v i v n g , c c c h n gt r n hc t h d d n gb l n gq u n . X l n g o i l d yx l l i t r c t i pv oc c n g nn g l pt r n hv i k h i t h mc h c h i uh n h . M t n g o i l l m t i t n g c " n m" t c c t r a n gwe bc a c c l i v c t h c " b t " b i m t t h c hh px l n g o i l c t h i t k x l c c l o i h n hc t h c a l i . l n ux l n g o i l l m t k h c n h a u , c o n n gs o n g s o n gt h c h i nc t h c t h c h i nk h i c c h u y nx yr a . V b i v n s d n gm t c o n n gt h c h i nr i n g b i t , n k h n gc np h i c a nt h i pv om t h n gt h i h n hc a b n . i un yl mc h om ng i n v i t k t k h i b nk h n gt h n gx u y nb u c p h i k i mt r a l i . Ng o i r a , m t n g o i l n ml k h n gg i n gn h m t g i t r l i l t r v t m t c h c n n gh o c m t l c c t b i m t c h c n n g c h r a m t i uk i nl i yc t h c b q u a . M t n g o i l k h n gt h b q u a n mb op h i c x l t i m t s i m. C u i c n g , t r n gh pn g o i l c u n gc pm t c c h p h c h i n gt i nc yt m t t n hh u n gx u . T h a yv c h c nt h o t k h i c h n gt r n h , b nt h n gc t h t h i t l pn h n g i u n gv k h i p h c l i t h c h i nc h n gt r n h , t r o n g s nx u t n h i uh nn a c c h t h n gm n hm . N n gc h l x l n g o i l k h n gp h i l m t t n hn n gh n g i t n g , m c d t r o n gn g nn g h n g i t n gn g o i l t h n g c t r n hb yv i m t i t n g . X l n g o i l t nt i t r c k h i n g nn g h n g i t n g . X l n g o i l c h n h n h n gg i i t h i uv s d n gt r o n gK h i l n gn y , T p2 ( c s nt w w w . B r u c e E c k e l . c o m) c b oh i mt o nd i nx l n g o i l . Mh n hh n g i t n gl m t c c hm i v k h c n h a us u yn g h v l pt r n hv n h i uf o l k s g pk h k h nl c ub i t l mt h n o t i pc nm t d nOOP . M t k h i b nb i t r n gt t c m i t h c c o i l m t i t n g , v k h i b nh c s u yn g h n h i uh nt r o n gm t p h o n gc c hh n g i t n g , b nc t h b t u t or a " t t " t h i t k t nd n gl i t h c a t t c n h n gl i c hm OOP c u n gc p . M t p h n g p h p ( t h n g c g i l p h n g p h p ) l m t t ph pc c q u yt r n hv c n gn g h t n g c s d n g p h v s p h c t pc a v n l pt r n h . Nh i up h n gp h ph n g i t n g c x yd n gt b u i b n hmi n hc a l pt r n hh n g i t n g . P h nn ys c u n gc pc h ob nm t c mg i c v n h n gg b n a n g c g n g t h c h i nk h i s d n gm t p h n gp h p . c b i t l t r o n gOOP , p h n gp h pl u nl m t l n hv c r t n h i ut h n g h i m, v v y i uq u a nt r n gl p h i h i un h n gg v n p h n gp h p a n gc g n g g i i q u y t t r c k h i b nx e mx t v i c pd n gm t . i u n y c b i t n gv i C++ , t r o n g n g nn g l pt r n h c t h i t k g i ms p h c t p( s ov i C ) l i nq u a n nv i c t h h i nm t c h n gt r n h . i un yc t h t r o n gt h c t l mg i mb t n h uc uv p h n gp h ph nb a o g i h t p h c t p . T h a yv o , n h n gc i ng i nc t h t r o n gC++c h om t l ph c l nh nn h i uv n h nb nc t h x l b n gp h n gp h p ng i nv i n g nn g t h t c . Nc n gq u a nt r n g n h nr a r n gt h u t n g " p h n gp h p " t h n gl q u l nv h a h nq u n h i u . D b n l mg b yg i k h i b nt h i t k v v i t m t c h n gt r n hl m t p h n gp h p . Nc t h l p h n gp h pr i n g

P h nt c hv t h i t k

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

27/320

08/10/2013

Suy ngh trong C + +, Vol 1

c a b n , v b nc t h k h n gc t h c l mv i c , n h n gn l m t q u t r n hb n i q u a n h b nt or a . N un l m t q u t r n hc h i uq u , n c t h c h c nm t i uc h n h u pn h l mv i c v i C++ . N ub nk h n gh i l n gv i s np h mc a b nv c c hc h n gt r n hc a b nb t r a , b nc t h mu nx e mx t v i c pd n gm t p h n gp h pc h n ht h c , h o c l a c h nc c p h nc a m t t r o n gn h n gp h n gp h pc h n ht h c n h i u . T r o n gk h i b n a n gt r i q u a q u t r n hp h t t r i n , v n q u a nt r n gn h t l : n g m t . T h t d d n g l m. H uh t c c p h n gp h pp h nt c hv t h i t k n h mg i i q u y t c c v n l nn h t . H yn h r n gh uh t c c d nk h n gp h h pv i t h l o i n y , v v yb nt h n gc t h p h nt c ht h n hc n gv t h i t k v i m t t ph p [ 9 ] t n g i n h c a n h n gg m t p h n gp h pk h u y nc o . Nh n gm t s l o i q u yt r n h , k h n gc v n h nc h , t h n gs g i pb nt r nc o n n gc a b nt r o n gm t c c ht t h nn h i us ov i c h ng i nl b t u m . Nc n gd d n g g pk h k h n , r i v o" t l i t p h nt c h , " n i m b nc mt h yn h b nk h n gt h d i c h u y n v p h a t r c b i v b n k h n g n g i n hx u n gt n gc h i t i t n h t r o n gg i a i o nh i nn a y . H yn h r n g , k h n gc v n b a on h i up h nt c hb nl mt h , c m t s i uv m t h t h n gm s k h n gt i t l b nt h n c h o nk h i t h i g i a nt h i t k , v n h i uh nn a n h n g i u s k h n gt i t l b nt h nc h o nk h i b n a n g m h a , h o c t h mc h k h n gc h o nk h i c h n gt r n hl nv c h y . B i v i un y , n r t q u a nt r n g d i c h u y nk h n h a n hc h n gt h n gq u a p h nt c hv t h i t k , v t h c h i nm t t h n g h i mc a h t h n g c x u t . i mn yl g i t r n h nm n h . V l c hs c h n gt a c v i n g nn g t h t c , l k h e nn g i r n gm t i s mu nt i nh n hm t c c hc nt h nv h i ur t n gc h i t i t p h t t r c k h i c h u y ns a n gt h i t k v t h c h i n . C h c c h n , k h i t or a m t h q u nt r C S D L , n t r t i n t mh i un h uc uc a k h c hh n gh o nt o n . Nh n gm t D B MS l t r o n gm t l ph c c a c c v n l r t we l l p o s e dv c h i ur , t r o n gn h i uc h n gt r n hn h v y , c ut r c c s d l i ul v n p h i c g i i q u y t . C c l ph c c a v n l pt r n ht h ol u nt r o n g c h n gn yl c a " wi l d c a r d " ( t h u t n g c a t i ) a d n g , t r o n g g i i p h p c k h n gc h ng i nt i t o t h n hm t g i i p h pn i t i n g , n h n gt h a yv l i nq u a n nm t h o c n h i u" wi l d c a r dy ut " y ut m [ 1 0 ] k h n gc g i i p h pt r c y c h i ur , c n gc h o n g h i nc ul c nt h i t . C g n g p h nt c hk l n gm t v n wi l d c a r dt r c k h i c h u y ns a n gt h i t k v k t q u t h c h i nt r o n gp h nt c ht l i t b i v b n k h n gc t h n gt i n g i i q u y t l o i v n t r o n gg i a i o np h nt c h . G i i q u y t m t v n n h v y i h i l p i l pl i t h n gq u a t o nb c h uk , v i h i p h i c h n hv i c h pn h nr i r o( c n g h a , b i v b n a n gc g n g l m m t c i g m i v n h n gp h nt h n gt i mn n gc a oh n ) . Nc v n h n g u yc c k t h pb i " x " v ot h c h i ns b , n h n gn t h a yv c t h l mg i mn g u yc t r o n gm t d nwi l d c a r d b i v b n a n gt mk i mn h n g ul i um t c c ht i pc n c b i t nv n l k h t h i . P h t t r i ns np h ml q u nl r i r o . Nt h n g n g h b n" x yd n gm t v t b . " V i OOP , b nv nc t h n mm t p h nc a n i , n h n gv a n g c n gg i v oc c l ph c , t r o n gp h i n ut i nm b nc h c c h ns s nx u t m t s t h i t k l ph c h u c hv p h t t r i nm t s t n g n gg i v t h i t k h t h n gm k h n gc np h i b i . Nh v y , q u a n h a n h u t i nt i m t v n k h n gc h s nx u t t h n gt i nq u a nt r n gc h oc c p h nt c ht i pt h e o , t h i t k v t h c h i nl p i l pl i , n c n gt or a m t n nt n gm c h ol p i l pl i . i u n i r n g , n ub n a n gt mk i m m t p h n gp h pc c h a c c c h i t i t r t l nv c h ot h yn h i ub c v c c v nb n , n v nc nk h b i t k h i n od n gl i . H yg h i n h n h n gg b n a n gc g n g k h mp h : 1. 2. c c i t n gl g ? ( L mt h n o b np h nv n gd nc a b nt h n hc c b p h nc a n ? ) g i a od i nc a h l g ? ( G i t h n g i pg b nc n c t h g i c h ot n g i t n g ? )

N ub n a r a k h n gc g h nc c i t n gv g i a od i nc a c h n g , s a u b nc t h v i t m t c h n gt r n h . V n h n gl d ok h c n h a um b nc t h c nn h i umt v t i l i uh nn y , n h n gb nk h n gt h c c i v i b t k t . Qu t r n hn yc t h c t h c h i nt r o n gn mg i a i o n , v m t g i a i o n0 c h l c a mk t b a n u s d n gm t s l o i c ut r c .

G i a i o n0 : T h ch i n m tk h o c h

T r c t i nb np h i q u y t n hn h n gg c c b c b ns c t r o n gq u t r n hc a b n . Ng h e c v ng i n( t r n t h c t , t t c n h n g i un yn g h e c v ng i n ) n h n gn g i t a t h n gk h n gt h c h i nq u y t n hn yt r c k h i h b t um h a . N uk h o c hc a b nl " c h n gt a h yn h yv ov b t uv i t m , " t t . ( i k h i l t h c hh pk h i b nc m t v n c h i ur . ) t n h t n gr n g yl k h o c h . B nc n gc t h q u y t n h g i a i o nn ym m t s c ut r c q u t r n hb s u n gl c nt h i t , n h n gk h n gp h i l c h nb i c . D h i u , m t s l pt r n hv i nmu nl mv i c t r o n g" c h n g h " , t r o n g k h n gc c ut r c c t r n hb yt r o n gq u t r n hp h t t r i nc n gv i c c a h ; " . Ns c t h c h i nk h i h o nt h n hc n gv i c " n y c t h c h pd nc h om t l c , n h n gt i t h yr n gc m t v i s k i nq u a nt r n gt r n n g i g i pt p t r u n gv k c h n gn h n gn l c c a b nx u n gq u a n hn h n gs k i nq u a nt r n gt h a yv b m c k t v i b nt h n g d u yn h t c a " h o nt h n hd n . " Ng o i r a , n p h nc h i a d nt h n hn h i umi n gc k c ht h c v l mc h on

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

28/320

08/10/2013

Suy ngh trong C + +, Vol 1

c v t e d a ( c n gv i c c s k i nq u a nt r n gc u n gc pn h i uc h i h nc h ol k n i m) . K h i t i b t un g h i nc uc ut r c c uc h u y n( v v ym t i m t n g yn o s v i t m t c u nt i ut h u y t ) l c uk h n gv i t n gv c ut r c , c mg i c r n gk h i t i v i t t i c h ng i nl c h on c h yl nt r a n g . Nh n g s a u t i n h nr a r n gk h i t i v i t v m yv i t n hc ut r c r r n g t i k h n gn g h n h i uv n . Nh n gt i v nc ut r c c n gv i c c a t i , m c d c h b nc t h c t r o n g ut i . V v y , n g a yc k h i b nn g h r n gk h o c hc a b nl c h c nb t um h a , b nv nb n gc c hn o i q u a c c g i a i o nt i pt h e ot r o n gk h i h i v t r l i c uh i n h t n h . T u y nb s m n h B t k h t h n gb nx yd n g , k h n gc v n p h c t p , c m t m c c hc b n , c c d o a n hn g h i pm n t r o n g , n h uc uc b nm n p n g . N ub nc t h n h nq u a g i a od i nn g i d n g , c c v n h i us u t p h n c n gh o c c c c h i t i t h t h n gc t h , c c t h u t t o nm h a v , b nc u i c n gs t mr a c t l i c a n l , n g i nv d h i u . Nh c i g i l k h i n i mc a o t m t b p h i m Ho l l y wo o d , b nc t h mt n t r o n gm t h o c h a i c u . Mt t i n hk h i t n yl i mk h i u . K h i n i mc a ol k h q u a nt r n gv n x c l pc c g i a i i uc h od nc a b n , l m t t u y nb n h i mv . B n s k h n gn h t t h i t p h i c c n n g a yl n ut i n( b nc t h g i a i o ns a uc a d nt r c k h i n t r n n h o nt o nr r n g ) , n h n gt i pt c c g n gc h o nk h i n c mt h y n g . V d , t r o n gh t h n gk i ms o t k h n gl u , b nc t h b t uv i m t k h i n i mc a ot pt r u n gv oc c h t h n gm b n a n gx yd n g : " C h n gt r n ht h pt h e od i c a m yb a y . " T u yn h i n , x e mx t n h n gg s x yr a k h i b nt h un h h t h n g m t s nb a yr t n h , c l c h c m t b i uk h i nc a c o nn g i h a yk h n gc g c . M t mh n hh u c hh n s k h n gl i nq u a n nc c g i i p h pb n a n gt or a n h i un h n mt v n : " . M yb a y nn i , c t h n g , d c hv v t i l i , v i "

G i a i o n1 : C h n gt a a n gl m g ?

T r o n gc c t h h t r c c a t h i t k c h n gt r n h( g i l t h i t k t h t c ) , i un y c g i l " t or a c c y uc u p h nt c h v c i mk t h u t h t h n g . " y , t t n h i n , l n h n gn i b m t ; i n t i mi d a t i n g l yt nt i l i uc t h t r t h n hd nl n b np h i c a r i n gc a h . M c c hc a h l t t , t u y n h i n . C c y uc up h nt c hn i " T om t d a n hs c hc c h n gd n , c h n gt i s s d n g b i t k h i c n gv i c c t h c h i nv k h c hh n gh i l n g . " C c c i mk t h u t h t h n gc h ob i t " yl m t mt v n h n g g c h n gt r n hs l m( k h n gc c h ) p n gy uc u. " P h nt c hc c y uc ut h c s l m t h p n gg i a b n v k h c hh n g( t h mc h n uk h c hh n gl mv i c t r o n gc n gt yc a b nh o c l m t s i t n gh o c h t h n g k h c ) . C c c i mk t h u t h t h n gl m t t h md c pc a ov oc c v n v t r o n gm t s n g h a m t p h t h i nc h od c t h c t h c h i nv b a ol un s m t . V c h a i h o t n g i h i s n gt h u ng i a m i n g i ( v b i v h t h n gs t h a y i t h e ot h i g i a n ) , t i n g h r n g l t t n h t g i c h n gn h l t r nc n g t t l t n g , v od a n hs c hv s c b n t i t k i mt h i g i a n . B nc t h c n h n gh nc h k h c m y u c ub np h i m r n gc h n gv ot i l i ul nh n , n h n gb n gc c hg i c c t i l i ub a n un h v n g ng n , n c t h c t or a t r o n gm t v i p h i nn h m n gn ov i m t n h l n h ot n gt or a c c mt . i un y k h n gc h g g m uv ot t t c m i n g i , n c n gt h c yb a n umu a v ov t h a t h u nc a t t c m i n g i t r o n gn h m. C l q u a nt r n gn h t , n c t h k h i n gm t d nv i r t n h i us n h i t t n h . l c nt h i t t pt r u n gv ot r u n gt mc a n h n gg b n a n gc g n g t h c h i nt r o n gg i a i o nn y : x c n hh t h n gl p h i l m. C c c n gc c g i t r n h t c h o i un yl m t b s ut pc a n h n gg c g i l " t r n gh ps d n g . " T r n gh ps d n gx c n hc c t n hn n gq u a nt r n gt r o n gh t h n gm s t i t l m t s [ 1 1 ] c c l pc b nb ns c s d n g . yl n h n gc ut r l i v c b nmt c h oc c c uh i n h : " A i s s d n gh t h n gn y ? " " Nh n gg c t h n h n gd i nv i nl mv i h t h n g ? " " L mt h n o d i nv i nn yl m i u v i h t h n gn y ? " " L mt h n ok h c i un yc t h l mv i c n ua i l m i un y , h o c n uc c d i nv i nc n gc m t m c t i uk h c n h a u ? " ( T i t l c c b i nt h ) " Nh n gv n c t h x yr a t r o n gk h i l m i un yv i h t h n g ? " ( T i t l t r n gh pn g o i l ) N ub n a n gt h i t k m t t n gr t t i n , v d , c c t r n gh ps d n gc h om t k h a c n hc t h c a c c c h c n n gc a h t h n gc t h mt n h n gg t n gr t t i nk h n gt r o n gm i t n hh u n gc t h . M i m t t r o n gc c " t n hh u n g " c g i l m t k c h b n, v m t t r n gh ps d n gc t h c c o i l m t b s ut pc a k c hb n . B nc t h n g h r a m t k c hb nn h m t c uh i b t uv i : " h t h n gl mg n u. . . " V d , " T h n ol t n g r t t i nl mg n um t k h c hh n gv a g i m t k i mt r a t r o n gv n g2 4 g i v k h n gc t r o n g? t i k h o nm k h n gk i mt r a c u n gc pt h uh i mo n gmu n" s d n gs t r n gh pc t n h ng i n n g nc h nb n k h i b s a l yv oc h i t i t t h c h i nh t h n gs m:

M i n g i t h a n h i d i nc h om t " d i nv i n " , m t h n gl m t c o nn g i h o c m t s l o i k h c c a i l mi n p h . ( Nh n gt h mc h c t h c h t h n gm yt n hk h c , n h l t r n gh pv i " A T M. " ) H p i d i nc h or a n h


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 29/320

08/10/2013

Suy ngh trong C + +, Vol 1

g i i c a h t h n gc a b n . E l i p i d i nc h oc c t r n gh ps d n g , l n h n gmt c n gv i c c g i t r m c t h c t h c h i nv i h t h n g . R a n hg i i g i a c c d i nv i nv c c t r n gh ps d n g i d i nc h os t n g t c . Nk h n gq u a nt r n gn h t h n oh t h n g c t h c s t h c h i n , mi nl n t r n gn h t h n yc h on g i s d n g . M t t r n gh ps d n gk h n gc np h i c t e r r i b l yp h c t p , n g a yc k h i h t h n gc b nl p h c t p . Nc h l n h m h i nt h h t h n gn h n x u t h i nc h on g i d n g . V d : C c t r n gh ps d n gs nx u t c c c h i t i t k t h u t y uc ub n gc c hx c n ht t c c c t n gt c m n g i d n gc t h c v i h t h n g . B nc g n g k h mp h r a m t b y c c t r n gh ps d n gc h oh t h n gc a b n , v m t k h i b n l m i u b nc c t l i c a n h n gg h t h n gl p h i l m. Nh n g i ut t pv t p t r u n gv ot r n gh ps d n gl h l u nl u nma n gl i c h ob nt r l i c nt h i t v g i c h ob nk h i t r i r a v o c c v n m k h n gp h i l q u a nt r n g c c c n gv i c l m. C n g h a l , n ub nc m t b y c c t r n gh ps d n gb nc t h mt h t h n gc a b nv c h u y ns a n gg i a i o nt i pt h e o . C t h b ns k h n g n h n c t t c t mr a m t c c hh o nh ol nt h ut i n , n h n g l OK . T t c m i t h s t i t l c h n hn t r o n gt h i g i a n , v n ub ny uc um t c i mk t h u t h t h n gh o nh ov ot h i i mn y , b ns g pk h k h n . N ub ng pk h k h n , b nc t h k h i n gg i a i o nn yb n gc c hs d n gm t c n gc x px t h : mt h t h n gt r o n gm t v i o nv nv s a u t md a n ht v n gt . C c d a n ht c t h n g h c c d i nv i n , b i c n hc a t r n gh ps d n g( v d n h " h n hl a n g " ) , h o c h i nv t t h a ot c t r o n gt r n gh ps d n g . n gt c t h n g h t n gt c g i a d i nv i nv c c t r n gh ps d n g , v x c n hc c b c t r o n gc c t r n gh ps d n g . B nc n gs k h mp h r a r n gd a n ht v n gt s nx u t c c i t n gv t h n g i pt r o n gg i a i o n t h i t k ( v l ur n gt r n gh ps d n gmt t n gt c g i a c c h t h n gc o n , v v yk t h u t " d a n ht v [ 1 2 ] n gt " c h c t h c s d n gn h m t c n gc t d u yn h n k h n gt or a s d n gt r n gh p ) . R a n hg i i g i a m t t r n gh ps d n gv l m t d i nv i nc t h c h r a s t nt i c a m t g i a od i nn g i d n g , n h n gn k h n g n hn g h a m t g i a od i nn g i d n g . i v i m t q u t r n hx c n hv t or a g i a od i nn g i d n g , x e m P h nm mc h o s d n g b i L a r r yC o n s t a n t i n e v L u c yL o c k wo o d , ( A d d i s o nWe s l e yL o n g ma n , 1 9 9 9 ) h o c v o w w w . F o r U s e . c o m. M c d l m t n g h t h u t e n , v ot h i i mn ym t s l o i l c ht r n hc b nl r t q u a nt r n g . B yg i b n c m t c i n h nt n gq u a nv n h n gg b n a n gx yd n gn nc t h b ns c t h n h n c m t s t n gc a b a ol un s m t . R t n h i uy ut i v oc h i y . N ub n c t n hm t l c ht r n hd i s a u c c c n gt yc t h q u y t n hk h n gx yd n gn ( v d o s d n gn g u nl c c a m n hv om t c i g h pl h n l m t t t i u ) . Ho c m t n g i q u nl c t h q u y t n hb a ol ud nn nc v s c g n g g y n h h n g c t n hc a b n . Nh n gn l t t n h t c m t l c ht r n ht r u n gt h c n g a yt uv i p h v i c c q u y t n hk h k h nb a n u . c r t n h i un l c nv i k t h u t l pl c ht r n hc h n hx c ( n h k t h u t d o nt h t r n gc h n gk h o n ) , n h n gc l l c c ht i pc nt t n h t l d a t r nk i n hn g h i mv t r c g i c c a b n . C c m t c mg i c r u t t r o n gb a ol un t h c s s m t , s a u g p i v t h m1 0 p h nt r m. C m g i c r u t c a b nc l l n g , b nc t h c c m t c i g l mv i c t r o n gt h i g i a n . C c " t n gg p i " s b i nc h n gt h n hm t c i g p h o n gn h a , v 1 0 p h nt r ms i p h v i n hb n gc u i c n gv c h i t i t [ 1 3 ] . T u yn h i nb nmu ng i i t h c hn , v k h n gp h t h u c v on h n gt i n gr nr v t h a ot c i u x yr a k h i b nt i t l m t k h o c hn h v y , n c h c v l mv i c r a t h e oc c h .

G i a i o n2 : L m t h n oc h n gt i s x yd n gn ?
T r o n gg i a i o nn y , b np h i a r a m t t h i t k mt n h n gg c c l ph c n h t h n ov l mt h n oc h n g s t n gt c . M t k t h u t t u y t v i t r o n gv i c x c n hc c l ph c v t n gt c l C l a s s R e s p o n s i b i l i t y H p t c ( C R C ) t h . M t p h ng i t r c a c n gc n yl n r t c n gn g h t h p : b nb t uv i m t b t r n g3 " 5 " t h , v b nv i t v h . M i t h i d i nc h om t l pd u yn h t , v t r nt h b nv i t : 1. 2. T nc a l p . i uq u a nt r n gl t nn yn mb t c b nc h t c a n h n gg l pn o , d o , n c n g h a t r o n gn h ym t . C c " t r c hn h i m" c a l p : n h n gg n p h i l m. i un yt h n gc t h c t mt t b n gc c hc h r t n c a c c h mt h n hv i n( k t k h i n h n gt nn n c mt t r o n gm t t h i t k t t ) , n h n gn k h n gl o i t r c c g h i c h k h c . N ub nc np h i h t g i n gq u t r n hn y , x e mx t v n t q u a n i mc a m t l p t r n hv i nl i b i n g : C h u y ng i t n gb nmu nk d i ux u t h i n g i i q u y t v n c a b n ? C c " h pt c " c a l p : l pn ok h c n t n gt c v i ? " T n gt c " l m t t h u t n g r n gc , n c t h c n g h a l t ph ph o c c h ng i nl m t s i t n gk h c t nt i m s t h c h i nd c hv c h om t i t n gc a l p . H pt c c n gn nx e mx t c c i t n gc h ol pn y . V d , n ub nt om t l pp h o, a i s
30/320

3.

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

l n g i q u a ns t n , m t n h h a h c h o c m t K h ng i ? T r c ys mu nb i t n h n gl o i h a c h t i v ox yd n g , v s a un ys p h n n gv i c c m us c v h n hd n gp h t h n hk h i n p h t n . B nc t h c mt h yn h c c t h n nl nv t t c c c t h n gt i nm b nmu n c c t r nh , n h n gh c n h , k h n gc h g i c h ol ph c c a b nn h n h n gc n g g i c h ob nn h n c v oc h i t i t q u n h i uq u s m. N ub nk h n gt h p h h pv i t t c c c b nc nb i t v m t l ph c t r nm t t h n h , l l pq u p h c t p( h o c l b n a n gn h n c q u c h i t i t , h o c b nn nt or a n h i uh nm t l p ) . C c l ph c l t n gn n c h i ut r o n gn h ym t . t n gc a C R Ct h l h t r b nt h c h i nc c b c c t g i m ut i nc a t h i t k b nc t h c c b c t r a n hl nv s a u t i n hc h n ht h i t k c a b n . M t t r o n gn h n gl i c ht ol nc a t h C R Cl t r o n gg i a ot i p . T t n h t l t h c h i nt h i g i a nt h c , t r o n gm t n h m, m k h n gc nm yt n h . M i n g i c h ut r c hn h i mc h om t s l ph c ( m l c uk h n gc t nh o c c c t h n gt i nk h c ) . B nc h ym t mp h n gt r c t i pb n gc c hg i i q u y t m t k c hb nt i m t t h i i m, q u y t n hc c t i nn h n c g i nc c i t n gk h c n h a u p n gc c k c hb n . K h i b n i q u a q u t r n hn y , b np h t h i nr a c c l ph c m b nc nc n gv i t r c hn h i mv h pt c c a h , v b n i nv oc c t h n h b n l m i un y . K h i b n c h u y nq u a t t c c c t r n gh ps d n g , b nn nc m t c t g i m ut i nk h y c c t h i t k c a b n . T r c k h i t i b t us d n gt h C R C , k i n hn g h i mt v nt h n hc n gn h t m t i c k h i nv i m t t h i t k b t ub n gv i c n gt r c m t i b n g , n h n gn g i k h n g c x yd n gm t d nOOPt r c , v c c i t n gv t r nm t t mb n g . C h n gt i n i c h u y nv c c hc c i t n gc ng i a ot i pv i n h a u , v x a m t s n g i t r o n gs h v t h a yt h c h n gv i c c i t n gk h c . C h i uq u , t i q u nl t t c c c " t h C R C " t r nb n g . Nh m( n g i b i t n h n gg d n p h i l m) t h c s t or a c c t h i t k , h " s h u " c c t h i t k t h a yv n c t r a oc h oh . T t c t i l m c h n gd nq u yt r n hb n gc c hh i n h n gc uh i n g , c g n gr a c c g i n h , v l yt h n gt i np h nh i t n h m s a i n h n gg i n h . V pt h c s c a q u t r n hn yl c c i h c c c c h l mt h i t k h n g i t n gk h n gb n gc c hx e mx t v d t r ut n g , n h n gb n gc c hl mv i c t r nt h i t k m t t r o n gn h n gt h v n h t i v i h v ot h i i m : h . M t k h i b n a r a m t t ph pc c t h C R C , b nc t h mu nt or a m t mt c h n ht h c h nc a t h i t k c a [ 1 4 ] b ns d n gU ML . B nk h n gc np h i s d n gU ML , n h n gn c t h h u c h , c b i t l n ub nmu n a r a m t s t r nt n g m i n g i s u yn g m, l m t t n gt t . M t t h a yt h c h oU MLl m t mt [ 1 5 ] v nb nc a c c i t n gv g i a od i nc a c h n g , h o c , t yt h u c v on g nn g l pt r n h , m c h n hn . U MLc n gc u n gc pm t k h i ub i u k h c mt c c mh n hn n g n gc a h t h n gc a b n . N yl h u c ht r o n gc c t n hh u n gt r o n g q u t r n hc h u y n i t r n gt h i c a m t h t h n gh o c h t h n gp h c h i p h i m h c ns r i n gc a h ( c h n gh nn h t r o n gm t h t h n g i uk h i n ) . B nc n gc t h c n mt c c c ut r c d l i u , c h oc c h t h n gh o c h t h n gc o nt r o n g d l i ul m t y ut c h i p h i ( n h m t c s d l i u ) . B ns b i t b n a n gt h c h i nv i g i a i o n2 k h i b n mt c c i t n gv g i a od i nc a c h n g . V n g , h u h t t r o n gs h t h n gc m t s t p h i ut h n gq u a c c v t n t v k h n gl mc h om n h c b i t nc h o n k h i g i a i o n3 . Nh n g l OK . T t c c c b n a n gq u a nt ml b nc u i c n g p h t h i nr a t t c c c i t n gc a b n . Nr t h a y p h t h i nr a c h n g g i a i o ns mn h n gOOPc u n gc p c c u n k h n g q u t n ub np h t h i nr a c h n gs a un y . T r o n gt h c t , t h i t k c a m t i t n gc x uh n gx yr a t r o n g n mg i a i o n , t r o n gs u t q u t r n hp h t t r i nc h n gt r n h . N mg i a i o nc at h i t k i t n g i s n gt h i t k c a m t i t n gk h n gg i i h nt h i g i a nk h i b n a n gv i t c h n gt r n h . T h a yv o , t h i t k c a m t i t n gx u t h i nt r nm t c h u i c c g i a i o n . Nr t h u c h c q u a n i mn yb i v b n d n gl i mo n g i s h o nh on g a yl pt c , t h a yv o , b nn h nr a r n gs h i ub i t v n h n gg m t i t n gn ov n h n gg n s g i n gn h t h x yr a t h e ot h i g i a n . Qu a n i mn yc n g c pd n g t h i t k c c l o i k h c n h a uc a c c c h n gt r n h , c c mh n hc h om t l o i h n hc t h c a c h n gt r n hx u t h i nt h n g q u a ut r a n hm t l nn a v m t l nn a v i v n ( C c m ut h i t k c g i i t h i ut r o n gt p2 ) . i t n g , c n gc mh n hc a h x u t h i nt h n gq u a s h i ub i t , s d n gv t i s d n g . 1 . i t n gp h t h i n. G i a i o nn yx yr a t r o n gt h i g i a np h nt c hb a n uc a m t c h n gt r n h . i t n gc t h c p h t h i nb n gc c ht mk i mc c y ut b nn g o i v r a n hg i i , n h nb nc a c c y ut t r o n gh t h n g , v c c nv k h i n i mn h n h t . M t s i t n gl h i nn h i nn ub n c m t t ph pc c t h v i nl p . S t n g n gg i a c c l ph c c h ot h yc c l ph c c s v t h a k c t h x u t h i nn g a yl pt c , h o c s a u t r o n gq u t r n ht h i t k . 2 . l pr p i t n g. K h i b n a n gx yd n gm t i t n gb ns k h mp h r a s c nt h i t c h oc c t h n hv i nm i k h n gx u t h i nt r o n gq u t r n hk h mp h . Nh uc un i b c a i t n gc t h y uc uc c l pk h c h t r n . 3 . x yd n gh t h n gm t l nn a , y uc un h i uh nc h o. m t i t n gc t h x u t h i n g i a i o n s a un y . K h i b nt mh i u , b np h t t r i n i t n gc a b n . Nh uc ut h n gt i nl i nl c v k t n i v i c c i t n gk h c t r o n gh t h n gc t h t h a y i n h uc uc a c c l ph c c a b nh o c y uc uc c l ph c m i . V d ,
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 31/320

08/10/2013

Suy ngh trong C + +, Vol 1

b nc t h k h mp h r a s c nt h i t p h i h t r g i ph o c c c l ph c , c h n gh nn h m t d a n hs c hl i nk t , c c h a t h o c k h n gc t h n gt i nt r n gt h i v c h ng i nl g i pc c c h c n n gl ph c . 4 . mr n gh t h n g. K h i b nt h mc c t n hn n gm i c h oh t h n gb nc t h k h mp h r a r n gt h i t k t r c yc a b nk h n gh t r m r n gh t h n gd d n g . V i t h n gt i nm i n y , b nc t h s px pl i c c b p h nc a h t h n g , c t h b s u n gt h mc c l ph c m i h o c p h nc pl p . 5 . i t n gt i s d n g. yl b i k i mt r a c n gt h n gt h c s c h om t l ph c . N ua i c g n g t i s d n gn t r o n gm t t n hh n hh o nt o nm i , c l h s k h mp h r a m t s t h i us t . K h i b nt h a y i m t l ph c t h c h n gv i c c c h n gt r n hm i h n , c c n g u y nt c c h u n gc a c c l ph c s t r n nr r n g h n , c h o nk h i b nc m t k i ut h c s t i s d n g . T u yn h i n , t i k h n gmo n g i n h t c c i t n gt m t t h i t k h t h n g c t h t i s d n gn l h o nt o nc h pn h n c i v i p h nl nc c i t n gc a b ns c s y s t e ms p e c i f i c . L o i s d n gl i c x uh n g t p h b i nh n , v h p h i g i i q u y t v n t n gq u t h n c t h t i s d n g . H n gd nc h op h t t r i n i t n g C c g i a i o n x u t m t s h n gd nk h i s u yn g h v v i c p h t t r i nc c l ph c c a b n : 1. 2. .3 .4 H y m t v n c t h t or a m t l p , s a u c h op h pc c l pp h t t r i nv t r n gt h n ht r o n gc c g i i p h pc a c c v n k h c . H yn h r n g , p h t h i nc c l ph c b nc n( v g i a od i nc a h ) l p h nl nc c t h i t k h t h n g . N ub n c n h n gl ph c , i un ys l m t d nd d n g . n g pb u c m n hp h i b i t t t c m i t h n g a yt u , h c h i n h b n i . i un ys x yr a a n y wa y . B t uc h n gt r n hn y , m t c i g l mv i c b nc t h c h n gmi n hh a yb c b t h i t k c a b n . K h n gs r n gb ns k t t h c v i t h t c k i um s p a g h e t t i p h nv n gl pv n v g i pk i ms o t t n h t r n gh nl o nv d l i un g un h i n . C c l ph c x uk h n gp h v c c l ph c t t . L u nl u ng i c h on ng i n . t i t n gs c hs v i t i n c hr r n gl t t h ns ov i g i a od i nl np h c t p . K h i i mq u y t n h a r a , s d n gp h n gp h pR a z o r c a m t Oc c a m: X e mx t c c l a c h nv c h nm t t r o n g l ng i n , b i v c c l ph c ng i nl h un h l u nl u nt t n h t . B t un h v ng i n , v b nc t h m r n gg i a od i nl ph c k h i b nh i un t t h n , n h n gt r o n gt h i g i a nt i , l k h k h n l o i b c c y ut t m t l ph c .

5.

G i a i o n3 : X yd n gc tl i
yl c h u y n i b a n ut t h i t k t h t h n hm t c t h b i nd c hv t h c h i nc c o nm c t h c k i m t r a , v c b i t l s c h n gmi n hh a yb c b k i n t r c c a b n . yk h n gp h i l m t q u t r n hm t v t q u a , m l k h i uc a m t l o t c c b c l p i l pl i s x yd n gh t h n g , n h b ns t h yt r o n gg i a i o n4 . M c t i uc a b nl t mr a c t l i c a k i n t r c h t h n gc a b nm c np h i c t h c h i n t or a m t h t h n g a n gc h y , d k h n g y h t h n g l t r o n g n gc h u y nb a n un y . B n a n gt or a m t k h u n k h m b nc t h x yd n gd a t r nl p i l pl i v i t h m. B nc n gt h c h i n ut i nc a n h i ut c hh ph t h n gv c c b i k i mt r a , v a r a c c k i n p h nh i c c b nl i nq u a nv n h n gg h t h n gc a h s n h t h n ov l mt h n on a n gt i nt r i n . T t n h t , b nc n g c p h i b ym t s r i r oq u a nt r n g . B ns c t h c n gp h t h i nr a n h n gt h a y i v c i t i nc t h c t h c h i n k i n t r c b a n uc a b nn h n gt h b n s k h n gh c c m k h n gt h c h i nh t h n g . P h nx yd n gh t h n gl k i mt r a t h c t m b nn h n c t t h n g h i mc h n gl i p h nt c hy uc uc a b n v c i mk t h u t h t h n g( t r o n gb t c h n ht h c c h n gt nt i ) . H yc h c c h nr n gb nk i mt r a x c mi n h c c y uc uv t r n gh ps d n g . K h i c t l i c a h t h n g n n h , b n s ns n g d i c h u y nt r nv t h m n h i uc h c n n gh n .

G i a i o n4 : L pl i c ct r n gh ps d n g

M t k h i k h u n gc t l i a n gc h y , m i t n hn n gt h i t l pb nt h ml m t d nn h c a r i n gm n h . B nt h m m t t n hn n gt h i t l pt r o n gq u t r n hl p i l p l i , m t t h i g i a nn g nh pl c a s p h t t r i n . L mt h n ol nl m t s l pl i ? L t n gn h t , m i l nl pk od i 1 3 t u n( i un yc t h k h c n h a ud a t r nn g nn g t h c h i n ) . V oc u i g i a i o nn y , b nc m t h t h n gt h n g h i mt c hh pv i n h i uc h c n n g h ns ov i t r c y . Nh n g i u c b i t t h v l c s c h ov i c l p i l pl i : m t t r n gh ps d n gd u y n h t . M i t r n gh ps d n gl m t g i c c c h c n n gl i nq u a nm b nx yd n gv oh t h n gc n gm t l c , t r o n gm t l nl p . i un yk h n gc h c u n gc pc h ob nm t t n gt t h nv n h n gg p h mv i c a m t t r n g h ps d n gn n c , n h n gn c n gc u n gc px c n h nh nv i t n gc a m t t r n gh ps d n g , k t k h i k h i n i mn yk h n gb l o i b s a uk h i p h nt c hv t h i t k , n h n gt h a yv o l m t nv c b nc a s p h t t r i nt r o n gs u t q u t r n hs o f t wa r e b u i l d i n g . B nd n gl i l pl i k h i b n t c c h c n n gm c t i uh o c m t t h i h nb nn g o i nv k h c hh n gc t h

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

32/320

08/10/2013

Suy ngh trong C + +, Vol 1

h i l n gv i p h i nb nh i nt i . ( . H yn h r n g , p h nm ml m t d o a n hn g h i p n gk ) B i v q u t r n hn y c l p i l pl i , b nc n h i uc h i p h t h n hm t s np h mt h a yv m t t h i t b uc u i n , c c d n m n g u nm l mv i c r i n gt r o n gm t l p i l pl i , m i t r n gc a ot h n gt i np h nh i , c h n hx c l n h n g g l mc h oh t h n hc n g . M t l p i l pl i q u t r n hp h t t r i nl c g i t r v n h i ul d o . B nc t h t i t l v g i i q u y t c c r i r oq u a n t r n g ut i n , k h c hh n gc n h i uc h i t h a y i s u yn g h c a h , l pt r n hs h i l n gc a oh n , v d n c t h c c h ov i c h n hx c h n . Nh n gm t l i c hb s u n gq u a nt r n gl t h n gt i np h nh i c c b n l i nq u a n , n h n gn g i c t h n h nt h yb n gh i nt r n gc a s np h mc h n hx c n i t t c m i t h n m. i u n yc t h g i mh o c l o i b s c nt h i t c h oc c c u c h pt n ht r n gmi n d n u mb i n gv t n gs t t i nv s h t r c a c c b nl i nq u a n .

G i a i o n5 : E v o l u t i o n

yl i mt r o n gc h uk p h t t r i nm t r c c g i l " b ot r " , m t n h nt t c h nc t h c n g h a l t t c m i t h t " n h n c n l mv i c t h e oc c hn t h c s p h i n i ut i n " " b s u n gt h mt n h n n gm c c k h c hh n gq u n c p n" v i t r u y nt h n g " s a c h a c c l i m h i nt h " v " t h mc c t n h n n gm i n h c n h uc u . " V v y , n h i uq u a nn i ms a i l m c pd n gc h oc c t h u t n g " b od n g" n ma n gm t c h t l n gm t c h t l a d i , m t p h nv n c h ot h yr n gb n t h c s x yd n gm t c h n g t r n hn g u y ns v t t c c c b nc nl ml t h a y i p h t n g , d u , v g i c h on k h i b r s t . C l c m t t h u t n g t t h n mt n h n gg a n gx yr a . T i s s d n gt h u t n g t i nh a 1 3. l , " B ns k h n gc c n n g a yl n ut i n , d o c u n gc pc h o m n hc c v t mh i uv q u a yt r l i v t h a y i . " B nc t h c np h i t h c h i nr t n h i ut h a y i k h i b n h c v h i u c v n s us c h n . S s a n gt r n gb ns

1 3

s nx u t n ub np h t t r i nc h o nk h i b nn h n c n n gs t r h t , c t r o n gn g nh nv d i h n . T i nh a l n i c h n gt r n hc a b n i t t t nv i , v t i c c v n m b nk h n gt h c s h i ut r o n g ut i n v t q u a t r n nr r n g . yc n gl n i c c l ph c c a b nc t h p h t t r i nt nd ns d n gc c n g u n t i n g u y nt i s d n g . Nh n gg n c n g h a l " l m n g " k h n gc h l c h n gt r n hh o t n gt h e oy uc uv c c t r n gh ps d n g . Nc n gc n g h a l c ut r c n i b c a m n g h a v i b n , v c mt h yn h n p h h pv i n h a ut t , k h n gc c p h pv n gv , c c i t n gq u k h , h o c b i t t i px c v d u y nm . Ng o i r a , b np h i c m t n g h a r n gc ut r c c h n gt r n hs t nt i n h n gt h a y i m n c h c c h ns i q u a t r o n gs u t c u c i c a m n h , v r n gn h n gt h a y i c t h c t h c h i nd d n gv s c h . i un yl k h n gn h . B nk h n gn h n g p h i h i un h n gg b n a n gx yd n g , n h n gc nl mt h n oc h n gt r n hs p h t t r i n( m t i g i l v e c t o r c a s t h a y i 1 4) . Ma ym nt h a y , n g nn g l pt r n hh n g i t n g c b i t g i i t r o n gv i c h t r h n ht h c n yt h a y i l i nt c r a n hg i i c t or a b i c c i t n gl n h n gg c x uh n gg i c ut r c p h nh y . H c n gc h op h pb nt h a y i n h n gn g i m d n gn h m n hm t r o n gm t c h n gt r n ht h t c m k h n g g yr a n g t t r o n gc m c a b n . T r o n gt h c t , h t r c h os p h t t r i nc t h l l i c hq u a nt r n gn h t c a OOP . V i s p h t t r i n , b nt or a m t c i g m t n h t x px n h n gg b nn g h r n gb n a n gx yd n g , v s a u b nk i c kc c l px e , s os n hn v i y uc uc a b nv n h nt h yn i n t h t b i . S a u , b nc t h q u a y 5. t r l i v s a c h a n b n gc c ht h i t k v t r i nk h a i l i c c p h nc a c h n gt r n hm k h n gl mv i c n g1 E mc t h

t n h t m t k h a c n hc a q u t r n ht i nh a c c pt r o n gc u ns c hc a Ma r t i nF o wl e r T i c ut r c : c i t h i nt h i t k c a m h i nt i ( A d d i s o n We s l e y , 1 9 9 9 ) . c c n hb ot r c r n gc u ns c hn ys d n gJ a v a v d c q u y n .

1 4 1 5

T h u t n g n y c k h mp h t r o n gc c m ut h i t k t r o n gc h n gK h i l n g2 .

t h c s c np h i g i i q u y t v n , h o c m t k h a c n hc a v n , n h i ul nt r c k h i b nn h nv oc c g i i p h p n g . ( M t n g h i nc uc a C c m ut h i t k , c mt t r o n gt p2 , t h n gl h u c h y . ) T i nh a c n gx yr a k h i b nx yd n gm t h t h n g , t h yr n gn p h h pv i y uc uc a b n , v s a u p h t h i nr a n k h n gp h i l t h c s n h n gg b nmu n . K h i b nn h nt h yh t h n gh o t n g , b nt h yr n gb n t h c s mu ng i i q u y t v n k h c n h a u . N ub nn g h r n gl o i t i nh a s x yr a , s a u b nn c h oc h n h m n h x yd n gp h i nb n ut i nc a b nc n gn h a n hc n gt t b nc t h t mr a n un t h c s l n h n g g b nmu n . C l i uq u a nt r n gn h t c nn h l m c n ht h e o n hn g h a , t h c s n ub ns a i m t l ps a u n
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 33/320

yl m t c i g n h " t om un h a n h , " n i b n d n hx yd n gm t p h i nb nn h a n hc h n gv d b n b nc t h t mh i u v h t h n g , v s a u v t b n g u y nm uc a b nv x yd n gn n g . Nh n gr c r i v i m un h a n hl m i n g i k h n gv t n g u y nm u , n h n gt h a yv x yd n gt r nn . K t h pv i v i c t h i uc ut r c t r o n gl pt r n ht h t c , i un yt h n g c s nx u t h t h n gl nx nm l t nk m d u yt r .

08/10/2013

Suy ngh trong C + +, Vol 1

s i uv l pc o nv ns h o t n g . B nk h n gc np h i s a i s h i ( c b i t l n ub nc m t x yd n gt r o n g c c b i k i mt r a nv x c mi n ht n hc h n hx c c a s a i c a b n ) . S a i s k h n gn h t t h i t p h i p h v c c c h n gt r n h , v b t k t h a y i t r o n gk t q u s c g i i h n l pc o nv /h o c c n gt c v i n c b i t c a l pb nt h a y i .

K h o c ht r h t

T t n h i nb ns k h n gx yd n gm t n g i n h m k h n gc n h i uk h o c hc a r e f u l l y d r a wn . N ub nx yd n g m t t n gh o c n h c o nc h , k h o c hc a b ns k h n g c n h v yp h c t pn h n gc t h b ns v nb t u v i m t s l o i p h c t h o h n gd nb nt r nc o n n gc a b n . P h t t r i np h nm m i nt h i c c . T r o n gm t t h i g i a nd i , n g i d nk h n gc n h i uc ut r c t r o n gp h t t r i nc a h , n h n gs a u d nl nb t ut h t b i . T r o n gp h n n g , c h n gt i k t t h c v i c c p h n gp h pm c m t s l n g n gs c a c u t r c v c h i t i t , c h y ud n hc h on h n gd nl n . Nh n gp h n gp h pq u n gs s d n gn t r n g g i n gn h b nmu nd n ht t c t h i g i a n v i t c c t i l i uv k h n gc l pt r n ht h i g i a n . ( . i un yt h n g x yr a ) t i h yv n gr n gn h n gg t i c h oc c b n yc h ot h yc o n n gt r u n g om t q u ymt r t . S d n gm t c c ht i pc np h h pv i n h uc uc a b n( v c t n hc a b n ) . K h n gc v n n h t h n ot i t h i u b nc h n l mc h on , m t s l o i k h o c hs t h c h i nm t c i t i nl nt r o n gd nc a b nn h t r i n g c v i k h n gc k h o c hn oc . H yn h r n g , h uh t c c c t n h , h n5 0 p h nt r mc c d nt h t b i ( m t s c t n hl n n7 0 p h nt r m! ) . B n gc c hl mt h e om t k h o c ht t n h t l ng i nv n g ng nv nv i c ut r c t h i t k t r c k h i m h a , b ns k h mp h r a r n gn h n gt h r i c n gx a d d n gh nn ub nn h yv ov b t ut nc n g , v b n c n gs n h nr a m t t u y t v i t h a t h u nc a s h i l n g . l k i n hn g h i mc a t i nv i m t g i i p h pt h a n h l c hl t h a m ns us c m t m c h o nt o nk h c n h a u , n c mt h yg nh nv i n g h t h u t h nl c n g n g h . V s a n gt r n gl u nl u nt r t i n i , n k h n gp h i l m t s t h e o u i p h p h i m. Nk h n gc h c u n gc p c h ob nm t c h n gt r n hd d n gh n x yd n gv g l i , n h n gn c n gd d n gh n h i uv d u yt r , v l n i m c c g i t r t i c h n hn m.

L pt r n hc c o a n

T i n g h i nc up h nt c hv t h i t k k t h u t , v t t , k t k h i t i c t r n g i h c . C c k h i n i mv t r n h c c ( X P ) l c b nn h t , v t h v , m t i n h nt h y . B nc t h t mt h yn g h i c h pt r o n gt r n h c c G i i t h c h b i K e n t B e c k( A d d i s o n We s l e y2 0 0 0 ) v t r nt r a n gWe bt i w w w . x p r o g r a m m i n g . c o m. X Pl c m t t r i t l v c n gv i c l pt r n hv m t t ph pc c h n gd n l m i u . M t s t r o n gn h n g n g u y nt c n y c p h n n ht r o n gc c p h n gp h pk h c g n y , n h n gh a i n gg pq u a nt r n gn h t v k h c b i t , t h e ok i n c a t i , l " v i t b i k i mt r a ut i n " v " l pt r n hc p . " M c d n gl pl u nm n hm c h o t o nb q u t r n h , B e c kc h r a r n gn ub n pd n gc h h a i t h c h n hc c b nr t n h i us n n gc a on n gs u t v t i nc yc a b n .

V i tb i k i m t r a ut i n

K i mt r a t r u y nt h n g c c h u y nx u n gp h nc u i c n gc a m t d n , s a uk h i b n " n h n c t t c m i t h l mv i c , n h n gc h mb o . " Nm c n h i n c m t ut i nt h p , v n h n gn g i c h u y nv n k h n g c a r a r t n h i ut n ht r n gv t h n gt h mc h c n c p h o n gt a t r o n gm t t n gh m, i t " l p t r n hv i nt h c s . " i k i mt r a p h n n gb n gh i nv t , i x a n h v y m c q u n om u e nv c a c k l i n g v i n i mv u i s n gb t c k h i n oh p h v m t c i g ( p h i t r u n gt h c , t i c c mg i c n yb nt h n m n hk h i p h v c c t r n hb i nd c hC++ ) . X Ph o nt o nc c hm n gh a c c k h i n i mv t h n g h i mb n gc c hc h on b n g( h o c l nh n ) ut i nh ns o v i m . T r o n gt h c t , b nv i t c c b i k i mt r a t r c k h i b nv i t o nc o d e l c t h n g h i m, v k i mt r a l i v i c c m m i m i . C c b i k i mt r a p h i c t h c h i nt h n hc n gm i k h i b nl m m t h i n h pc a d n ( l t h n gx u y n , i k h i n h i uh nm t l nm t n g y ) . K i mt r a v nb n ut i nc h a i t c d n gv c n gq u a nt r n g . ut i n , n b u c m t n hn g h a r r n gv g i a od i nc a m t l p . T i t h n gc h or n gn h n gn g i " t n g t n gc c l ph c h o nh o g i i q u y t m t v n c t h " n h m t c n gc k h i c g n g t h i t k h t h n g . C c c h i nl c t h n g h i mX P i x a h nt h n x c n hc h n hx c n h n gg c c l ph c p h i n h t h n o , n g i t i ud n gc a l p , v c h n hx c n h t h n ol pp h i c x . T r o n g i uk i nk h n gc k h n gc h c c h n . B nc t h v i t t t c c c v nx u i , h o c t or a t t c c c s m b nmu nmt c c hm t l pn nc x v n h n gg n t r n gn h t h n o , n h n gk h n gc g l t h c s l m t t ph pc c b i k i mt r a . T r c yl m t d a n hs c hmo n gmu n , n h n gc c b i k i mt r a l m t h p n g c t h c t h i b i t r n hb i nd c hv c c c h n gt r n h a n gc h y . T h t k h t n gt n gm t mt c t h h nv m t l ph c h nc c b i k i mt r a . T r o n gk h i t or a c c b i k i mt r a , b nb u c p h i h o nt o ns u yn g h r a k h i l pv t h n gs k h mp h r a c h c n n gc nt h i t m c t h b b s t t r o n gc c t h n g h i ms u yn g h c a s U ML , C R Ct h , t r n gh ps d n g , v v

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

34/320

08/10/2013

Suy ngh trong C + +, Vol 1

n hh n gq u a nt r n gt h h a i c a v i c v i t c c b i k i mt r a ut i n nt c h yt h n g h i m m i k h i b nl m m t x yd n gp h nm mc a b n . Ho t n gn yc u n gc pc h ob nm t n a c nl i c a c u c t h n g h i m c t h c h i nb i t r n hb i nd c h . N ub nn h nv os p h t t r i nc a n g nn g l pt r n ht q u a n i mn y , b ns t h yr n gn h n gc i t i nt h c s t r o n gc n gn g h t h c s x o a yq u a n ht h n g h i m. Ng nn g l pr pk i mt r a c h c h oc p h p , n h n gC p t m t s h nc h n g n g h a , v n h n gn g nc nb nl m m t s l o i s a i l m. Ng nn g OOP p t n h n gh nc h n g a yc n g n g h a , m n ub nn g h v n t h c s l h n ht h c k i mt r a . " L k i ud l i un y c s d n g n gc c h ? c c h c n n gn y c g i l n g ? " L c c l o i x t n g h i m a n g c t h c h i nb i t r n hb i nd c hh o c h t h n gt h i g i a nc h y . C h n gt i n h nt h yk t q u c a v i c c c c x t n g h i mn y c x yd n gt r o n gn g nn g : n g i c t h v i t c c h t h n gp h c t ph n , v l mc h o h l mv i c , v i r t t t h i g i a nv c n gs c . T i b i r i h nl d ot i s a o i un y , n h n gb yg i t i n h nr a l c c b i k i mt r a : b nl m i ug s a i , v m n gl i a nt o nc a c c b i k i mt r a t c hh pc h ob nc m t v n v i mb n n u . Nh n g c x yd n gt r o n gt h n g h i mt on nb i n h n gt h i t k c a n g nn g c h c t h i c h o nn a y . T i m t s i m, b np h i b c v ov t h mp h nc nl i c a c c b i k i mt r a s nx u t m t b y ( t r o n gh pt c v i c c h t h n gb i nd c hv c h yt h e ot h i g i a n ) x c mi n hr n gt t c c c c h n gt r n hc a b n . V , g i n gn h c m t t r n hb i nd c hx e mq u a v a i c a b n , p h i k h n gb nmu nc c x t n g h i mn yg i pb nn g a yt u ? l l d ot i s a ob nv i t c h oh ut i n , v c h ym t c c ht n gv i t t c x yd n gh t h n gc a b n . X t n g h i m c a b nt r t h n hm t p h nm r n gc a m n gl i a nt o n c c u n gc pb i c c n g nn g . M t t r o n gn h n g i um t i p h t h i nr a v v i c s d n gn h i uh nv m n hh nn g nn g l pt r n hl t i k h u y nk h c ht h n g h i mt r n gt r nh n , b i v t i b i t r n gn g nn g s g i t i t l n gp h t h i g i a ns n u i l i c a t i . C h n gt r n ht h n g h i mX Pl m i ut n gt c h ot o nb d nc a b n . B i v b nb i t x t n g h i m c a b ns l u nl u nb t b t k v n m b ng i i t h i u( v b nt h n gx u y nt h mb t k x t n g h i m m i n h b nn g h v h ) , b nc t h t h c h i nt h a y i l nk h i b nc nm k h n gl ol n gr n gb ns n mt o nb d n v ot n ht r n gh nl o nh o nt o n. i un yl v c n gm n hm .

L pt r n hc p

L pt r n hc p i n g c l i v i c h n g h a c n h nm c h n gt i c t r u y nb v ot u , t h n gq u a t r n g h c ( n i c h n gt i t h n hc n gh a yt h t b i t r nc a c h n gt a , v l mv i c v i c c n c l n gg i n gc a c h n gt i c c o i l " g i a nl n " ) v p h n gt i nt r u y nt h n g , c b i t l b p h i m Ho l l y wo o d , t r o n g a n hh n gt h n g [ 1 6 ] c h i n uc h n gl i p h h pmi n d l e s s . L pt r n hv i n , c n g c c o i l p a r a g o n s c a c n h n" l pt r n h v i nc a ob i " n h L a r r yC o n s t a n t i n e t h c hn i . Nh n gX P , c b nt h nc h i n uc h n gl i s u yn g h t h n g t h n g , n i m n n c v i t v i h a i n g i t r nm yt r m. V i un yn n c t h c h i nt r o n gm t k h uv c v i m t n h mc c m yt r m, k h n gc r oc nm c c c s t h i t k n g i r t t h c h . T r o n gt h c t , B e c kn i r n g n h i mv ut i nc h u y n i t h n hX Pl nv i t u a v t v c l A l l e nv t h ot t c m i t h m c t h e o [ 1 7 ] c c hn y . ( i un y i h i m t n g i q u nl n h n gn g i c t h l mc h c hh n gs g i nd c a c c b p h nc s v t c h t . ) G i t r c a c h n gt r n h i l m t t r o n gn h n gn g i a n gt h c s l m m h a t r o n gk h i n g i k i a a n gn g h v n . Nh t t n gg i h n h n hl nt r o n gt mt r , k h n gc h l h n h n hc a v n b nt a y , n h n gh n gd n c a X P . N uh a i n g i a n gl mv i c , n t c k h n n gl m t t r o n gs h s n h n c n g a yv i n i , " T i k h n gmu nv i t c c b i k i mt r a ut i n , " c h n gh n . V n uc c c o d e r b m c k t , h c t h t r a o i a i m. N uc h a i n g i t r o n gs h g pk h k h n , s u yt n gc a h c t h c n g h e b i n g i k h c t r o n gk h uv c l mv i c n h n gn g i c t h n gg p . L mv i c t h e oc pg i n h n g i uc h yv i n gh n g . C l q u a n t r n gh n , n l mc h oc h n gt r n hr t n h i ut n hx h i h nv v u i v . T i b t us d n gc h n gt r n h i t r o n gt h i g i a nt pt h d c t r o n gm t s h i t h oc a t i v c v n h c i t h i n n gk k i n hn g h i mc a m i n g i .

T i s a oC + + t h n hc n g

M t p h nl d oC++ r t t h n hc n gl m c t i uk h n gc h b i nCt h n hm t n g nn g h n g i t n g ( m c d n b t ut h e oc c h ) , n h n gc n g g i i q u y t n h i uv n k h c p h i i m t v i c c n h p h t t r i nn g yh mn a y , c b i t l n h n gn g i c ut l nt r o n gC. T h e ot r u y nt h n g , n g nn g OOP b t h i m b nn nt b t t c m i t h b nb i t v b t ut uv i m t t pm i c a c c k h i n i mv m t c p h pm i , c h or n gn t t h nt r o n gt h i g i a nd i m t t t c h n hl c m i k mv i t h t c n g nn g . i u n yc t h n g , t r o n gt h i g i a nd i . Nh n gt r o n gn g nh n , r t n h i uh n hl l c g i t r . C c y ut c g i t r n h t c t h k h n g c c c c s m h i nc ( t r o n g , a r a c c c n gc t h c hh p , c t h c d c h ) , n h n g t h a yv h i nt i c s t mt r . N ub nl m t l pt r n hc h c n n gCv p h i t h t t c m i t h b nb i t v C t h n gq u a m t n g nn g m i , b nn g a yl pt c t r n nk mh i uq u t r o n gn h i ut h n g , c h o nk h i t mt r c a b np h h pv i x u n gq u a n hc c mh n hm i . T r o n gk h i , n ub nc t h t nd n gl i t h c a k i nt h c C h i nt i c a b nv m r n gt r nn , b nc t h t i pt c c s nx u t v i n h n gg b n b i t t r o n gk h i d i c h u y nv ot h g i i c a l pt r n hh n g i t n g . Nh m i n g i uc mh n hr i n gc a t i n ht h nc a m n h v l pt r n h , n gt h i n yl l nx nv n l k h n gc c h i p h t h mb t uv i m t mh n hn g nn g m i t m t h n hv u n g . V v y , l d oc h os t h n hc n gc a C++ , t r o n gT ml i , l k i n ht : Nv nc nc h i p h


35/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

[ 1 8 ] d i c h u y n nOOP , n h n gC++c t h c h i p h t h n . M c t i uc a C++ c c i t h i nn n gs u t . N n gs u t n y c l yb n gn h i uc c h , n h n gn g nn g c t h i t k g i pb nc n gn h i uc n gt t , t r o n gk h i c nt r b nc n g t c n gt t v i c c q u yt c t yh o c b t k y uc um b ns d n gm t t ph pc c t n hn n g . C++ c t h i t k c t h c t ; C++q u y t n ht h i t k n g nn g d a v ov i c c u n gc pn h n gl i c ht i a c h oc c l pt r n hv i n( t n h t l t t h g i i q u a nc a C ) .

M tC t th n

B ns c c m t c h i nt h n gn g a yl pt c n g a yc k h i b nt i pt c v i t m Cv C++ n gc a n h i ul h n gt r o n gc c n g nn g Cv c u n gc pc h ok i mt r a k i ut t h nv p h nt c ht h i g i a nb i nd c h . B n a n g b u c p h i t u y nb c h c n n g t r n hb i nd c hc t h k i mt r a v i c s d n gc h n g . S c nt h i t c a t i nx l g nn h c l o i b t h a yt h g i t r v ma c r o , t r o n g l o i b m t t ph pc c k h k h n t mt h yl i . C++c m t t n hn n g c g i l t i l i ut h a mk h o c h op h px l t h u nt i nh nc c a c h c h oc c i s c h c n n gv g i t r t r l i . V i c x l t n c c i t h i nt h n gq u a m t t n hn n gg i l c h c n n g q u t i , c h op h p b ns d n gc n gt nc h oc c c h c n n gk h c n h a u . M t t n hn n g c g i l k h n g g i a nt nc n gg i pc i t h i n s k i ms o t c a t n . C r t n h i ut n hn n gn h h n c i t h i ns a nt o nc a C .

B n t r n n gc o n gh ct p
V n v i v i c h c m t n g nn g m i l n n gs u t . C n gt yk h n gc k h n n g t n h i nm t m t k s p h n m ms nx u t b i v n g i a n gh c m t n g nn g m i . C++l m t m r n gC , k h n gp h i l m t c p h p h o nt o nm i v mh n hl pt r n h . Nc h op h pb nt i pt c t or a m h u c h , pd n gc c t n hn n gd nd n k h i b nh c v h i uc h n g . i un yc t h l m t t r o n gn h n gl d oq u a nt r n gn h t c h os t h n hc n gc a C+ + . Ng o i r a , t t c c c m Ch i nt i c a b nv nc nk h t h i t r o n gC++ , n h n gv C++l p i c k i e r , b ns t h n g x u y nt mt h yl i C nk h i b i nd c hl i m t r o n gC++ .

Hi uq u

i k h i n c p h h pv i t h n gm i t c t h c h i nc h on n gs u t l pt r n h . M t mh n ht i c h n h , v d , c t h h u c hc h oc h m t t h i g i a nn g n , v v y i uq u a nt r n gh n t or a c c mh n hn h a n hc h n gh n t h c h i nn n h a n hc h n g . T u yn h i n , h uh t c c n gd n g i h i m t m c h i uq u , d o , C++l u n l u ne r r s m t b nc a h i uq u c a oh n . V c c l pt r n hCc x uh n gr t h i uq u c t h c , yc n gl m t c c h mb or n gh s k h n gt h l pl u nr n gn g nn g l q u b ov c h mc h p . M t s t n hn n gt r o n g C++ c n h c h op h pb n i uc h n hc h oh i us u t k h i c c m c t or a l k h n g h i uq u . K h n gc h l mb nc s k i ms o t m c t h pn h t r o n gC( v k h n n gt r c t i pv i t n g nn g l pr pt r o n g m t c h n gt r n hC+ ) , n h n gb n gc h n gc h ot h yt c c h n gt r n hc h om t i t n gt h e o n hh n g c h n gt r n hC++c x uh n gn mt r o n gk h o n g1 0 %c a m t c h n gt r n hv i t b n gC , v t h n gg ng i [ 1 9 ] h nn h i u . T h i t k s nx u t c h om t c h n gt r n hh n g i t n gt h c s c t h c h i uq u h nc c i t c C .

H t h n g cd d n gh n t h h i nv h i u
C c l ph c c t h i t k p h h pv i n h n gv n c x uh n gt h h i nn t t h n . i un yc n g h a r n g k h i b nv i t m , b n a n gmt g i i p h pc a b nt r o n gc c i uk h o nc a c c v n k h n gg i a n( " t g r o mme t t r o n gt h n g " ) c h k h n gp h i l c c i uk h o nc a m yt n h , m l k h n gg i a ng i i p h p( " T h i t l p c c b i t t r o n gc c c o nc h i p c n g h a l t i ps c s n g" ) . B n i p h v i k h i n i mc a oc pv c t h l m n h i uh nn a v i m t d n gm . C c l i c hk h c c a m t c c hd d n gn yc a b i ut h c l b ot r , t r o n g ( n ub oc oc t h c t i nt n g ) l ym t p h nl nc h i p h t r o n gs u t q u n g i c a c h n gt r n h . N um t c h n gt r n hd d n gh n h i u , s a u n d d n gh n d u yt r . i un yc n gc t h l mg i mc h i p h c a v i c t or a v d u yt r c c t i l i u h n gd n .

T nd n gt i av i c ct h v i n

C c hn h a n hn h t t or a m t c h n gt r n hl s d n gm v i t : t h v i n . M c t i uc h n ht r o n gC++l l mc h ot h v i ns d n gd d n gh n . N y c t h c h i nb n gc c h c c c t h v i nt h n hc c l o i d l i u m i ( l p ) , a v om t t h v i nc n g h a l t h mc c l o i m i c h on g nn g . V C++t r n hb i nd c hs c h m s c n h t h n ot h v i n c s d n g mb ok h i t ot h c hh pv d nd p , v mb or n gc c c h c n n g c g i l n gb nc t h t pt r u n gv on h n gg b nmu nt h v i n l m, k h n gl mt h n ob nc l m i u . B i v c i t nc t h c c l pc c p h nc a c h n gt r n hc a b nt h n gq u a C++k h n gg i a nt n , b nc t h s d n gn h n h i ut h v i nn h b nmu nm k h n gc c c l o i x u n g t t nb nmu nc h yv ov i C .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

36/320

08/10/2013

Suy ngh trong C + +, Vol 1

M n g u nt i s d n gv i c cm u
C m t l ph c q u a nt r n gc a c c l o i i h i p h i s a i m n g u n t i s d n gc h n gh i uq u . C c m u t n hn n gt r o n gC++t h c h i nv i c s a i m n g u nt n g , l mc h on m t c n gc c b i t m n hm c h o s d n gl i m t h v i n . M t l o i m b nt h i t k s d n gc c m us l mv i c d d n gv i n h i ul o i k h c . M u s np h m c b i t b i v h ns p h c t pc a l o i m t i s d n gt c c l pt r n hv i nk h c hh n g .

X l l i

L pt r n ht r o n gl n

X l l i t r o n gCl m t v n n i t i n g , v m t t r o n g l t h n gb b q u a n g nt a yq u a t h n gc l i n q u a n . N ub n a n gx yd n gm t c h n gt r n hl nv p h c t p , k h n gc g t i t h nv i c c m t l i c h n u k h n gc um i n h n nt uc . C++x l n g o i l ( c g i i t h i ut r o n gt pn y , v t o nd i n t r o n gt p2 , c t i v t w w w . B r u c e E c k e l . c o m) l m t c c h mb or n gm t l i c c h v c m t c i g s x yr a n h m t k t q u . Nh i un g nn g t r u y nt h n g c x yd n gt r o n gg i i h nc h oc h n gt r n hk c ht h c v p h c t p . B A S I C , v d , c t h l t u y t v i c h ok on h a ug i i p h pn h a n hc h n gc h oc c l ph c n h t n hc a c c v n , n h n gn uc h n gt r n h c n h i uh nm t v i t r a n gd i h o c l i nd o a n hr a k h i mi nv n b n ht h n gc a n g nn g , n g i n gn h c g n g b i q u a b a og i h nc h t l n gn h t . Cc n gc n h n gh nc h . V d , k h i m t c h n gt r n h c , c l n g o i 5 0 . 0 0 0 d n gm , t nv a c h mb t ut r t h n hm t v n h i uq u , b n c h yr a k h i c h c n n gv t nb i n . M t v n c b i t x ul c c l n h t r o n gn g nn g Cl i b c h nv i t r o n gm t c h n gt r n hl nc t h r t k h k h n t m. K h n gc r a n hg i i r r n gc h ob nb i t k h i n g nn g c a b nl k h n gb n , v t h mc h n uc , b nn nb q u a n . B nk h n gn i , " c h n gt r n hB A S I Ct i c h c nc q u l n ; T i s p h i v i t l i n t r o n gC " T h a yv o , b n c g n g b ot i g i ay m t v i d n g h n t h mr n g m t t r o n g n h n g t n h n n g m i . V v y , c c c h i p h p h t r i nl e ol nt r nb n . C++ c t h i t k h t r l p t r n h t r o n g l n, c n g h a l , x a n h n gr a n hg i i l e o p h c t pg i a m t c h n gt r n hn h v m t l n . B nc h c c h nk h n gc np h i s d n gOOP , c c m u , k h n gg i a nt n , v x l n g o i l k h i b n a n gv i t m t c h n gt r n ht i n c hp h o n gc c hh e l l o wo r l d , n h n gn h n gt n hn n gn yl c k h i b nc nc h n g . V t r n hb i nd c hl t c hc c v f e r r e t i n gr a l i b u g p r o d u c i n gc h oc c c h n gt r n hn h v l nn h n h a u .

C h i nl cc h oq u t r n hc h u y n i

N ub nmu a v oOOP , c uh i t i pt h e oc a b nc l l , " L mt h n ot i c t h n h n c q u nl c a t i / n gn g h i p/b p h n/ n gn g h i p b t us d n gc c i t n g ? " H ys u yn g h v c c hb nm t l p t r n hv i n c l ps i v h c t p s d n gm t n g nn g m i v m t mh n hl pt r n hm i . B n t h c h i nn t r c . ut i nl g i od c , v d , s a u nm t d nt h n g h i mc u n gc pc h ob nm t c mg i c v n h n g i uc b nm k h n gl mb t c i ug q u k h h i u . R i nm t " t h g i i t h c " d nm t h c s l m i ug h u c h . T r o n gs u t d n ut i nc a b n , b nt i pt c v i c h c c a b nb n gc c h c , c c h t c u h i c a c c c h u y ng i a , v g i g i a od c hv i b nb . yl c c ht i pc nn h i uk i n hn g h i ml pt r n h n g h c h ov i c c h u y n i t Cs a n gC++ . C h u y n i t o nb m t c n gt yc a k h a h c s g i i t h i un h mn n g n gn h t n h , n h n gn s g i pt n gb c n h m t n g i s l m i u .

H n gd n

D i yl m t s h n gd n x e mx t k h i t h c h i nv i c c h u y n i s a n gh n g i t n gv C++ : 1 . ot o B c ut i nl m t s h n ht h c g i od c . G h i ut c a c n gt yt r o n g n gb n gm C , v c g n gk h n g n mt t c m i t h v ot n ht r n gl nx nt r o n gv n gs u nc h nt h n gt r o n gk h i t t c m i n g i c u h n n h i uc c hl mv i c t h a k . C h nm t n h mn h t r u y nb , t t n h t l s n gt c c a n h n gn g i t m , l m v i c t t v i n h a u , v c t h h o t n gn h m n gl i h t r c a h t r o n gk h i h a n gh c C++ . M t p h n gp h pk h c m i k h i c n g h l g i od c c c c pc n gt yc n gm t l c , b a og mc c k h a h c t n gq u a nc h oc c n h q u nl c h i nl c c n gn h t h i t k v l pt r n hc c k h a h c c h oc c n h x yd n gd n . i un y c b i t t t c h oc c c n gt yn h h nl mt h a y i c b nt r o n gc c hh l mv i c , h o c c p p h n c h i a c a c c c n gt yl nh n . B i v c h i p h c a oh n , t u yn h i n , m t s c t h c h n b t u ot oc pd n , l m m t d nt h i m( c t h v i m t n g i c v nb nn g o i ) , v c h oc c n h md nt r t h n hg i ov i n c h op h nc nl i c a c n gt y . 2 . d nn g u yc t h p T h m t d n t r i r o ut i nv c h op h pn h n gs a i l m. M t k h i b n t c m t s k i n hn g h i m, b n c t h h o c h t g i n gd nk h c t c c t h n hv i nc a n h mn g h i nc u ut i nn yh o c s d n gc c t h n h v i nt r o n gn h mn h m t n h nv i nh t r k t h u t OOP . D n ut i nn yc t h k h n gl mv i c n g a yl n

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

37/320

08/10/2013

Suy ngh trong C + +, Vol 1

ut i n , v v yn k h n gp h i l n h i mv q u a nt r n gc h oc n gt y . Np h i l ng i n , k h pk n , v t n h h n gd n , i un yc n g h a l n p h i l i nq u a n nv i c t or a c c l ph c s c n g h a v i c c l pt r n hv i n k h c t r o n gc n gt yk h i h n h n c l nl t c a h t mh i uC++ . 3 . m ut t h n hc n g T mk i mn h n gv d v t h i t k h n g i t n gt t t r c k h i b t ul i t u . C m t x c s u t t t m a i g i i q u y t v n c a b n c , v n uh k h n gg i i q u y t n m t c c hc h n hx c b nc t h c t h p d n gn h n gg b n h c c v t r ut n g s a i m t t h i t k h i nc p h h pv i n h uc uc a b n . yl k h i n i mc h u n gc a c c m ut h i t k , b a og mt r o n gT p2 . 4 . S d n gc ct h v i nl ph ch i nc C c n gl c k i n ht c h n hc h oc h u y ns a n gOOPl v i c s d n gd d n gc a m h i nc t r o n gc c h n ht h c t h v i nl p( c b i t l t i uc h u nC++ , t h v i n , c b a op h t h e oc h i us ut r o n gK h i l n gh a i c a c u ns c h n y ) . Ng nn h t c h uk p h t t r i n n gd n gs x yr a k h i b nk h n gc np h i v i t b t c i ug n h n gc h n h( ) , t ov s d n gc c i t n gt t h v i no f f t h e s h e l f . T u yn h i n , m t s l pt r n hm i k h n gh i u i un y , k h n gb i t c c t h v i nl ph i nc , h o c t h n gq u a n i m a m m v i n g nn g , mo n gmu nv i t c c l ph c m c t h t nt i . T h n hc n gc a b nv i OOPv C++s c t i uh a n ub nt h c h i nm t n l c t m k i mv s d n gl i m c a n g i k h c ut r o n gq u t r n hc h u y n i . 5 . n gv i t l i mh i nc t r o n gC + + M c d b i nd c h m Cc a b nv i m t t r n hb i nd c hC++t h n gt or a ( i k h i r t l n ) l i c hb n gc c ht m c c v n t r o n gc c m c , n k h n gp h i l t h n gs d n gt t n h t t h i g i a nc a b n c h i nt i , m c h c n n gv v i t l i n t r o n gC++ . ( N ub np h i b i nn t h n h i t n g , b nc t h " b c " m Ct r o n gC++l p h c . ) C n h n gl i c hg i a t n g , c b i t l n um c d k i n t i s d n g . Nh n gr t c t h l b ns k h n g n h nt h ys g i a t n g n gk n n gs u t m b nh yv n gt r o n gv i d n ut i nc a b nt r k h i d n l m t c i m i . C++v OOPt a s n gt t n h t k h i t h a mg i a m t d nt t n g nt h c t . N ub nl m t n h q u nl , c n gv i c c a b nl c c c c n g u nl c c h on h mc a b n , v t q u a r o c n i v i s t h n hc n gc a i b n , v n i c h u n g c g n gt or a m i t r n gh i uq u n h t v t h v n h mc a b nc n h i uk h n n g t h c h i nn h n gp h pl m l l u nl u n c y uc uc a b n . D i c h u y n nC++r i t r o n gt t c b a t r o n gs c c l o i , v n s l t u y t v i n un k h n gc h i p h b nb t c i ug l t t . [ 2 0 ] M c d d i c h u y n nC++c t h r h nt yt h u c v oh nc h c a b n h ns ov i l a c h nt h a yt h OOPc h om t i n g l pt r n hC( v c l c h oc c l pt r n ht r o n gn g nn g t h t c k h c ) , n k h n gp h i l mi n p h , v c n h n gt r n g i , b ns c b i t t r c k h i c g n g b nc h u y ns a n gC++t r o n gc n gt yc a b nv b t t a yv oc c n gt h i c a c h n hn . C h i p h k h i n g C h i p h d i c h u y n nC++l n h i uh nc h l mu a l i c a C++t r n hb i nd c h( G NUC++ , m t t r o n gn h n g t t n h t , mi np h ) . C h i p h t r u n gh nv d i h nc a b ns c g i mt h i un ub n ut v o ot o( v c t h t v nc h od n ut i nc a b n ) v c n gc t h n ub nx c n hv mu a c c t h v i nm g i i q u y t v n c a b nh nl c g n gx yd n gn h n gt h v i nm n h . yl n h n gc h i p h h a r d mo n e yp h i l y ut t h n h m t x u t t h c t . Ng o i r a , c n h n gc h i p h nt r o n gg i mn n gs u t t r o n gk h i h c m t n g nn g m i v c t h l m t m i t r n gl pt r n hm i . ot ov t v nc h c c h nc t h g i mt h i un h n g , n h n gt h n hv i n t r o n gn h mp h i v t q u a c u c ut r a n hc a h h i u c c n gn g h m i . T r o n gq u t r n hn yh s l m c h oh ns a i l m( yl m t t n hn n g , b i v s a i l mt h a n h nl c o n n gn h a n hn h t h c t p ) v t h i u q u . T h mc h s a u , v i m t s l o i v n l pt r n h , c c l pp h i , v m i t r n gp h t t r i n n g n , n c t h c h i uq u h nt r o n gk h i b n a n gh c C++( t h mc h x e mx t r n gb n a n gl ms a i l mh nv v i t t d n gl n hh nm i n g y) h nn ub nmu n l i v i C . V n h i us u t M t c uh i t h n g c , " K h n gOOPt n gl mc h oc h n gt r n hc a t i l nh nr t n h i uv c h mh n ? " C ut r l i l , " Np h t h u c . " Ng nn g OOPt r u y nt h n gH uh t c t h i t k v i t h n g h i mv t om u n h a n ht r o n gt mt r c h k h n gp h i l h o t n gl e a n a n d t r u n gb n h . V v y , h h un h mb om t s g i a t n g n gk v k c ht h c v g i mt c . C++ , t u yn h i n , c t h i t k v i c c c h n gt r n hs nx u t t r o n g t mt r . K h i b nt pt r u n gv ot om un h a n h , b nc t h n ml i v i n h a ut h n hp h nc n gn h a n hc n gt t t r o n g k h i b q u a c c v n h i uq u . N ub n a n gs d n gb t k t h v i nc a b nt h b a , yl n h n gt h n g c t i uh a b i c c n h c u n gc pc a h , t r o n gm i t r n gh pn k h n gp h i l m t v n t r o n gk h i b n a n g t r o n gc h r a p i d d e v e l o p me n t . K h i b nc m t h t h n gm b nt h c h , n un n h v n h a n hc h n g , s a u b n a n gt h c h i n . N uk h n g , b nb t uv i m t c n gc i uc h n hh s , t mk i m ut i nc h os p e e d u p s c t h c t h c h i nv i c c n gd n g ng i n c x yd n gt r o n gC++ , t n hn n g . N u i u k h n gg i p , b nt mk i ms a i c t h c t h c h i nt r o n gv i c t h c h i nc b nn h v yk h n gc m c s d n gm t l ph c c b i t c np h i c t h a y i . N uk h n gc g k h c g i i q u y t v n b nc np h i t h a y i t h i t k . T h c t l h i us u t l r t q u a nt r n gt r o n gm t p h nc a t h i t k n yl m t c h b or n gn p h i l m t p h nc a c c t i uc h u nt h i t k b a n u . B nc l i c hc a v i c t mk i mn yr a s ms d n gp h t t r i nn h a n hc h n g . Nh c pt r c , c o ns n yt h n g c a r a c h os k h c b i t v k c ht h c v t c g i a Cv C++
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 38/320

Qu nl c h n gn g i v t

08/10/2013

Suy ngh trong C + +, Vol 1

l 1 0 %, v t h n gr t g nv i m n h . B nt h mc h c t h n h n c m t c i t i n n gk v k c ht h c v t c k h i s d n gC++h nl Cv t h i t k m b nl mc h oC++c t h l k h k h c n h a ut m t t r o n gn h n gb n mu nl mc h oC . B n gc h n gv k c ht h c v t c s os n hg i a Cv C++c x uh n g c g i a i t h o i v c t h s v nn h v y . K h n gp h t h u c v os l n gn g i c h or n gm t c n gt yc g n gc n gm t d ns d n gCv C++ , k h n gc c n gt yc t h s l n gp h t i nn h v yt r k h i l r t l nv q u a nt mt r o n gd nn g h i nc un h v y . T h mc h s a u , n c v n h t i nc t h c s d n gt t h n . H un h , c c l pt r n hv i n c h u y nt C ( h o c m t s n g nn g t h t c k h c ) v i C++( h o c m t s n g nn g OOPk h c ) c k i n hn g h i mc n h nc a m t g i a t c l nt r o n gs nx u t c h n gt r n hc a h , v l l u nc t h u y t p h c n h t m b nc t h t mt h y . L i t h i t k c h u n g K h i b t un h mc a b nv oOOPv C++ , l pt r n ht h n gt h n gs i q u a m t l o t c c l i t h i t k c h u n g . i un yt h n gx yr a v q u t t h n gt i np h nh i t c c c h u y ng i a t r o n gv i c t h i t k v t h c h i nc c d n u , b i v k h n gc c h u y ng i a c p h t t r i nt r o n gc n gt yv c t h c s c k h n gv i c h u y ng i a t v ng i l i . T h t d d n g c mt h yr n gb nh i uOOPq u s mt r o n gc h uk v i r a t r nm t t i px c x u . M t c i g h i nn h i n i v i n g i c k i n hn g h i mv i c c n g nn g c t h l m t c h c a c u c t r a n hl u n n i b r t t t c h om t n g i m i . Nh i uc h nt h n gn yc t h c b q u a b n gc c hs d n gm t c h u y ng i a b nn g o i c k i n hn g h i m ot ov t v n . M t k h c , t h c t l n r t d d n g l mc h oc c t h i t k l i i m C++' s n h c i mc h n h : k h n n gt n g t h c hc a n n g c v i C( t t n h i n , c n gl s c m n hc h n hc a n ) . t h c h i n c t h n ht c hn yl c t h b i nd c hm C , n g nn g t h c h i nm t s t h a h i p , d n nm t s " g c t i . " yl m t t h c t , v b a og mn h i u n gc o n gh c t pc h on g nn g . T r o n gc u ns c hn yv k h i l n gt i pt h e o( v t r o n gc u n s c hk h c , x e mP h l c C ) , t i c g n gt i t l h uh t n h n gc mb yb nc t h s g pp h i k h i l mv i c v i C+ + . B nn nl u nl u nt h c c r n gc m t s l h n gt r o n gm n gl i a nt o n .

T mt t

C h n gn yc g n g c u n gc pc h ob nm t c mg i c v c c v n l nc a l pt r n hh n g i t n gv C++ , b a og mc l d ot i s a oOOPl k h c n h a u , v t i s a oC++ c b i t l k h c n h a u , k h i n i mc a p h n gp h p h n g i t n g , v c u i c n gl l o i v n b ns g pp h i k h i d i c h u y nc n gt yc a r i n gb n OOPv C++ . OOPv C++c t h k h n gd n hc h ot t c m i n g i . i uq u a nt r n g n hg i n h uc ur i n gc a b nv q u y t n hx e m C++t i us p n gn h n gn h uc u , h o c n ub nc t h c t t h nv i m t h t h n g l pt r n h( b a og mc m t t r o n gn h n gb n a n gs d n g ) . N ub nb i t r n gn h uc uc a b ns c r t c h u y n n g n ht r o n gt n gl a i g nv n ub nc k h k h nc t h m c t h k h n g c h i l n gb i C++ , s a u b n [ 2 1 ] n c h oc h n hm n h i ut r a c c l a c h nt h a yt h . Ng a yc k h i b nc u i c n gc h nC++l n g nn g c a b n , b ns t n h t l h i un h n gg c c t yc h n c v c m t t mn h nr r n gv l d ot i s a ob n h n g . B nb i t n h n gg m t c h n gt r n ht h t c h n hn h : n hn g h a d l i uv c c c u c g i c h c n n g . t mt h y n g h a c a m t c h n gt r n hb np h i l mv i c m t c h t , t mk i mt h n gq u a c c c u c g i c h c n n gv c c k h i n i m m c t h p t or a m t mh n ht r o n gt mt r c a b n . yl l d oc h n gt a c nq u a n i d i nt r u n g g i a nk h i t h i t k c h n gt r n ht h t c t , c c c h n gt r n hn yc x uh n gt h g yn h ml nv c c i uk h o n c a b i uh i n c n hh n gn h i uh nv p h a m yt n hh nc h ov n b n a n gg i i q u y t . V C++c h ob i t t h mn h i uk h i n i m m i c h on g nn g C , g i n ht n h i nc a b nc t h l c h n h( ) t r o n gC ++ , c h n gt r n hs c t h mr t n h i up h c t ph ns ov i c c c h n gt r n hCt n g n g . y , b ns c n g c n h i n : M t c n gn h c c v nb nC++n i c h u n gl ng i nh nn h i uv d d n gh n h i uh n s ov i c c c h n gt r n hCt n g n g . Nh n gg b ns t h yl c c n hn g h a c a c c i t n g i d i nc h oc c k h i n i mt r o n gk h n gg i a nv n c a b n( c h k h n gp h i l v n c a c c i d i nm yt n h ) v t i nn h ng i nc c i t n g i d i nc h oc c h o t n gt r o n gk h n gg i a n . M t t r o n gn h n gt h v u i c a l pt r n hh n g i t n gl , v i m t c h n gt r n hwe l l d e s i g n e d , t h t d d n g h i u c m b n gc c h c n . T h n gc r t n h i um t h n , l t t , b i v n h i uv n c a b ns c g i i q u y t b n gc c hs d n gl i m t h v i nh i nc .

B n gc c h c c h n gn y , ut i n , b ns n h n c h n gv c b nc a n n h t h n o c h n gt r n hv i c c i t n gt r o n gC++ , v b nc n gs k h mp h r a m t s l d oc h os n h i t t n hx u n gq u a n hn g nn g
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 39/320

08/10/2013

Suy ngh trong C + +, Vol 1

n y . i un yl t h c h i nb nt h n gq u a C h n g3 , c t h l m t c h t m t m i v n c h a h uh t c c c h i t i t c a n g nn g C . C c n g i d n g n hn g h a k i ud l i u , h o c l p h c , l n h n gg p h nb i t C++t n g nn g t h t c t r u y n t h n g . M t l ph c l m t k i ud l i um i m b nh o c n g i k h c t or a g i i q u y t m t l o i c t h c a v n . M t k h i m t l p c t or a , b t c a i c t h s d n gn m k h n gb i t c c c h i t i t c t h v c c hh o t n g , h o c t h mc h n h t h n oc c l ph c c x yd n g . C h n gn yx l c c l ph c n h t h h c h l m t k i u d l i ut c hh ps n s d n gt r o n gc h n gt r n h . C c l ph c m n g i k h c t or a t h n g c n gg i v om t t h v i n . C h n gn ys d n gm t s c c t h v i nl p i k mv i t t c C++h i nt h c . M t t h v i nt i uc h u n c b i t q u a nt r n gl i o s t r e a ms , t r o n g ( t r o n gs n h n gt h k h c ) c h op h pb n c t c c t pt i nv b np h m, v v i t c c t pt i nv h i nt h . B n c n gs t h yr t t i nd n gc h u i l p , v v e c t o r c o n t a i n e r t c c t i uc h u nC++T h v i n . nc u i c h n g , b n s t h yc c hd d n gl s d n gm t t h v i n c x c n ht r c c c l ph c . t or a c h n gt r n h ut i nc a b n , b np h i h i un h n gc n gc c s d n g x yd n gc c n gd n g .

Qu t r n hd c ht h u t

T t c c c n g nn g m yt n h c c h u y nt m t c i g m c x uh n g c d d n gc h om t c o nn g i h i u( m n g u n) v om t c i g c t h c h i nt r nm t m yt n h( h n g d nc a m y ) . T h e ot r u y nt h n g , d c hc h a i l o i : t h n g d c h v b i nd c h . M t t h n gd c hv i nd c hm n g u nt h n hc c h o t n g( c t h b a og mc c n h mh n gd nc a m y ) v n g a y l pt c t h c h i nc c h o t n gn y . B A S I C , v d , l m t n g nn g g i i t h c hp h b i n . T h n gd c hB A S I Ct r u y n t h n gd c hv t h c h i nm t n gd yt i m t t h i i m, v s a u q u nr n g n g c d c h . i un y l mc h oc h n gc h m, v h p h i t i b i nd c hc c m l p i l pl i . B A S I Cc n g c b i nd c h , c h ot c . P h i nd c hh i n i h n , c h n gh nn h i v i c c n g nn g P y t h o n , d c ht o nb c h n gt r n hv om t n g n [ 2 2 ] n g t r u n gg i a nm s a u c t h c h i nb i m t t h n gd c hv i nn h a n hh nn h i u . T h n gd c hv i nc n h i ut h u nl i . V i c c h u y n i t v nb nm m t h c h i ng nn h n g a yl pt c , v m n g u nl l u nl u nc s n n g i p h i nd c hc t h c n h i uh nn a c t h k h i l i x yr a . Nh n gl i c h t h n g c t r c hd nc h op h i nd c hl m t c c hd d n gt n gt c v p h t t r i nn h a n hc h n g( n h n gk h n g n h t t h i t p h i t h c h i n ) c a c h n gt r n h . Ng nn g l pt r n ht h n gc n h n gh nc h n g h i mt r n gk h i x yd n gc c d nl n( P y t h o nc v l m t n g o i l ) . Ng i p h i nd c h( h o c m t p h i nb nt h ug n ) l u nl u np h i t r o n gb n h t h c t h i m , v t h m c h c t h n gd c hv i nn h a n hn h t c t h g i i t h i uh nc h t c k h n gt h c h pn h n . H uh t c c t h n gd c h v i ny uc ut o nb m n g u n c a v oc c t h n gd c hc n gm t l c . i un yk h n gc h g i i t h i um t g i i h nk h n gg i a n , n c n gc t h g yr a l i k h k h nh nn un g nn g k h n gc u n gc pp h n gt i n k h o a n hv n g n hh n gc a p h nk h c n h a uc a m .

P h i nd c h

T r n hb i nd c h

M t t r n hb i nd c hm n g u nt r c t i pv on g nn g l pr ph o c h n gd nc a m y . S np h mc u i c n gc u i c n gl m t t pt i nh o c c c t pt i nc c h a m m y . yl m t q u t r n ht h a mg i a , v t h n gm t m t v i b c . V i c c h u y n i t v nb nm m t h c h i nl d i h n n gk v i m t t r n hb i nd c h . T yt h u c v os n h yb nc a c c n h v nb i nd c h , c h n gt r n h c t or a b i m t t r n hb i nd c hc x u h n g i h i k h n gg i a n t h nn h i u c h y , v h c h yn h a n hh nn h i u . M c d k c ht h c v t c c l l l d ot h n g c t r c hd nn h i un h t c h ov i c s d n gm t t r n hb i nd c h , t r o n gn h i ut r n gh ph k h n gp h i l l d oq u a nt r n gn h t . M t s n g nn g ( n h C ) c t h i t k c h op h pc c p h nc a m t c h n gt r n h c b i nd c h c l p . Nh n gm n hc u i c n g c k t h pt h n hm t t r nc h u n gk t t h c t h i c h n gt r n hb n gm t c n gc c g i l m i l i nk t . Qu t r n hn y c g i l b i nd c h r i n g b i t . B i nd c hr i n gb i t c n h i ul i c h . M t c h n gt r n h , t h c h i nt t c c n gm t l c , s v t q u g i i h nc a t r n hb i nd c hv m i t r n gb i nd c hc t h c b i nd c ht r o n gmi n g . C h n gt r n hc t h c x yd n g v t h n g h i m m t p h nt i m t t h i i m. M t k h i m t p h n a n gl mv i c , n c t h c l ul i v c i u t r n h m t k h i x yd n g . B s ut pn h n gt c p h m c t h n g h i mv l mv i c c t h c k t h pv o t h v i n s d n gb i c c l pt r n hv i nk h c . Nh m i p h n c t or a , s p h c t pc a c c p h nk h c l n . [ 2 3 ] T t c c c t n hn n gn yh t r v i c t or a c c c h n gt r n hl n . T n hn n gg l i t r n hb i nd c h c c i t h i n n gk t h e ot h i g i a n . T r n hb i nd c h uc h t or a m m y , v c c l pt r n hv i n a v ob oc oi n x e mn h n gg a n gx yr a . yk h n gp h i l l u nl u nh i uq u . T r n hb i nd c hh i n i c t h c h nt h n gt i nv m n g u nv oc c c h n gt r n ht h c t h i . T h n gt i nn y c s d n gb i m n hm g r i n g u nc p h i nt h c h n hx c n h n gg a n gx yr a t r o n gm t c h n gt r n hb n gc c h

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

40/320

08/10/2013

Suy ngh trong C + +, Vol 1

t r u yt ms t i nb c a m n ht h n gq u a c c m n g u n . M t s t r n hb i nd c hg i i q u y t v n b i ns o nt c b n gc c ht h c h i nt r o n g b n h l p . H uh t c c t r n h b i nd c hl mv i c v i c c t pt i n , c v v i t c h n gt r o n gm i b c c a q u t r n hb i nd c h . T r n hb i nd c h t r o n gb n h g i c h oc c c h n gt r n hb i nd c ht r o n gb n h R A M. i v i c h n gt r n hn h , i un yc t h c v n h p n gn h m t t h n gd c hv i n .

Qu t r n hb i nd c h

c h n gt r n ht r o n gCv C++ , b nc np h i h i uc c b c v c c c n gc t r o n gq u t r n hb i nd c h . M t s n g nn g ( Cv C++ , c b i t ) b t ub i ns o nb n gc c hc h ym t t i nx l t r nc c m n g u n . T i nx l l m t c h n gt r n h ng i nt h a yt h m ut r o n gm n g u nv i c c m uk h c c c l pt r n hv i n c x c n h ( s d n gc h t h t i nx l ) . C h t h t i nx l c s d n g t i t k i mg p h mv t n gk h n n g c c a m n y . ( S a un yt r o n gc u ns c h , b ns h c c c ht h i t k c a C++c n g h a l k h u y nk h c hn h i uv v i c s d n gt i nx l , v n c t h g yr a l i v i t . ) M t i nc h b i nt h n g c v i t v om t t pt i nt r u n gg i a n . T r n hb i nd c ht h n gl mc n gv i c c a h t r o n gh a i q u a . ut i nv t q u a p h nt c h m t i nc h . T r n hb i n d c hp h v c c m n g u nt h n hc c nv n h v t c h c n t h n hm t c ut r c g i l c y . T r o n gk h i n i m" A +B" c c y ut ' Mt ' , ' +' v ' B' l l t r nc yp h nt c hc p h p . M t t i uh a t o nc u i k h i c s d n gg i a c c n gc h u y n ut i nv t h h a i s nx u t n h h n , m n h a n hh n . T r o n g ot h h a i , c c m y p h t i n a n g i q u a c yp h nt c hc p h pv t or a m t t r o n gh a i m n g nn g l p r ph o c m m yc h oc c n t c a c y . N um yp h t i nm t or a m l pr p , l pr ps a u p h i c c h y . K t q u c u i c n gt r o n gc h a i t r n gh pl m t m u n i t n g( m t t pt i nm t h n gc m t p h nm r n gc a o . h o c o b j . ) . M t up e e p h o l e i k h i c s d n gt r o n gc c n gc h u y nt h h a i t m o nm c c h a b oc ol pr pn g nn g k h n gc nt h i t . V i c s d n gc c t " i t n g " mt k h i m m yl m t v t k h n gma y . T a v os d n gt r c k h i l p t r n ho b j e c t o r i e n t e d c s d n gc h u n g . " i t n g " c s d n gt h e on g h a t n gt n h " m c t i u " k h i t h ol u nv b i ns o n , t r o n gk h i t r o n gl pt r n ho b j e c t o r i e n t e dn c n g h a l " m t i uc r a n hg i i . " C c m i l i nk t k t h pm t d a n hs c hc c mo d u l e i t n gv om t c h n gt r n ht h c t h i c t h c n pv c h yb n gh i uh n h . K h i m t c h c n n gt r o n gm t m u n i t n gl mc h om t t h a mc h i u nm t c h c n n gh o c b i nt r o n gm t m u n i t n g , m i l i nk t g i i q u y t c c t i l i ut h a mk h o , n l mc h oc h c c h nr n gt t c c c c h c n n gb nn g o i v d l i ub nt u y nb t nt i t r o n gb i ns o nv nt nt i . M i l i nk t c n gc h ob i t t h m m t m u n i t n g c b i t t h c h i nk h i n gc c h o t n g . C c m i l i nk t c t h t mk i mt h n gq u a c c t pt i n c b i t c g i l t h v i n g i i q u y t t t c c c t i l i u t h a mk h oc a n . M t t h v i nc h a m t t ph pc c m u n i t n gt r o n gm t t pt i nd u yn h t . M t t h v i n c t or a v d u yt r b i m t c h n gt r n hg i l m t t h v i n. K i mt r ak i ut n h T r n hb i nd c ht h c h i nk i mt r a k i ut r o n gt h i g i a n ut i nv t q u a . L o i k i mt r a t h n g h i mc h ov i c s d n gc a c c i s t r o n gc h c n n gv n g nn g a n h i ul o i l i l pt r n h . K t k h i k i mt r a c c l o i x yr a t r o n gq u t r n hb i nd c ht h a yv k h i c h n gt r n h a n gc h y , n c g i l k i mt r a k i ut n h . M t s n g nn g h n g i t n g( c b i t l J a v a ) t h c h i nm t s l o i k i mt r a t r o n gt h i g i a nc h y( l o i n n g n g k i mt r a ) . N uk t h pv i k i mt r a k i ut n h , k i mt r a k i u n gm n hh nk i mt r a k i ut n hm t m n h . T u yn h i n , n c n gc h ob i t t h mc h i p h t h c h i nc h n gt r n h . C++s d n gk i mt r a k i ut n hb i v n g nn g k h n gt h c h ub t k h t r t h i g i a nc h y c b i t c h oc c h o t n gx u . K i mt r a k i ut n ht h n gb oc h oc c l pt r n hv i nv l md n gc c l o i t r o n gq u t r n hb i n s o n , v d o t i a h a t c t h c h i n . K h i b nt mh i uC++ , b ns t h yr n gh uh t c c q u y t n ht h i t k n g nn g n gh c n gm t l o i t c c a ol pt r n h n hh n gs nx u t , n g nn g Cl n i t i n g . B nc t h v h i uh a k i mt r a k i ut n ht r o n gC++ . B nc n gc t h l mk i mt r a k i u n gc a r i n gb nb nc h c nv i t m .

C n gc b i nd c hr i n gb i t

B i nd c hr i n gb i t l c b i t q u a nt r n gk h i x yd n gc c d nl n . T r o n gCv C++ , m t c h n gt r n hc t h c t or a t r o n gn h , q u nl , p h nk i mt r a c l p . C c c n gc c b nn h t p h v m t c h n gt r n h t h n hc c m n hl k h n n g t or a c h n gt r n hc o n c t t nh o c c h n gt r n hc o n . T r o n gCv C++ , m t c h n gt r n hc o n c g i l m t c h c n n g , v c h c n n gl n h n gp h nc a m c t h c t t r o n gc c t pt i nk h c n h a u , c h op h pb i nd c hr i n gb i t . N i c c hk h c , c h c n n gl nv n g u y nt c a m , v b n k h n gt h c m t p h nc a m t c h c n n gt r o n gm t t pt i nv m t p h nk h c t r o n gm t t pt i nk h c n h a u , t o n


41/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

b c h c n n gp h i c t t r o n gm t t pt i nd u yn h t ( m c d t pt i nc t h v l mc h a n h i uh nm t c h c n n g ) . K h i b ng i m t h m, b nt h n gv t q u a n m t s i s , l n h n gg i t r b nmu nc c c h c n n g l m v i c v i t r o n gt h c h i n . K h i c h c n n gk t t h c , b nt h n gn h n c t r l i m t t r l i g i t r , m t g i t r c h c n n gt r a ol i c h ob nm t k t q u . Nc n gc t h v i t c c c h c n n gm k h n gc i s v t r l i k h n gc g i t r . t or a m t c h n gt r n hv i n h i ut pt i n , c c c h c n n gt r o n gm t t pt i np h i t r u yc pv oc c c h c n n gv d l i ut r o n gc c t pt i nk h c . K h i b i nd c hm t t pt i n , C , C++t r n hb i nd c hp h i b i t v c c c h c n n gv d l i ut r o n gc c t pt i nk h c , c b i t l t nc a h v s d n gp h h p . T r n hb i nd c h mb or n gc c c h c n n gv d l i u c s d n g n gc c h . Qu t r n hn y" n i v i t r n hb i nd c h " t nc a c c c h c n n gb n n g o i v d l i uv n h n gg h s g i n gn h t h c g i l k h a i . K h i b nk h a i b om t c h c n n gh o c b i n , t r n hb i nd c hb i t l mt h n o k i mt r a c h c c h nr n gn c s d n g n gc c h .

T k h a i s ov i n hn g h a
i uq u a nt r n gl h i us k h c b i t g i a t k h a i v n h n g h a b i v c c i uk h o nn ys c s d n gm t c c hc h n hx c t r o n gs u t c u ns c h . V c b nt t c Cv C++c h n gt r n hy uc uk h a i b o . T r c k h i b nc t h v i t c h n gt r n h ut i nc a b n , b nc np h i h i uc c ht h c hh p v i t m t t u y nb . M t t u y nb g i i t h i um t t nm t n hd a n ht r n hb i nd c h . Nc h ot r n hb i nd c h" c h c n n gn yh o c b i nn yt nt i u , v yl n h n gg n s g i n gn h t h . " M t n h n g h a , m t k h c , n i : " . H yc h c n n gn y y " " H yb i nn y y " h o c Np h np h i l ut r c h ot n . n g h a n yl mv i c c h od b n a n g n i v m t b i nh o c m t c h c n n g , t r o n gc h a i t r n gh p , t i t h i i mx c n ht r n hb i nd c hp h nb l u t r . C h om t b i n , t r n hb i nd c hx c n hl nn h t h n ob i n l g v g yr a k h n gg i a n c t or a t r o n g b n h c h a d l i uc h ob i n . C h om t c h c n n g , t r n hb i nd c ht or a m , m k t t h c l ut r c h i m t r o n gb n h . B nc t h k h a i b om t b i nh o c m t c h c n n g n h i un i k h c n h a u , n h n gp h i c c h c m t n hn g h a t r o n gCv C++( i un y i k h i c g i l OD R : q u y t c m t n h n g h a ) . K h i c c m i l i nk t c h pn h t t t c c c m u n i t n g , n s t h n gp h nn nn un t mt h yn h i uh nm t n hn g h a c h oc n gc h c n n gh o c b i n . M t n hn g h a c n gc t h l m t t u y nb . N ut r n hb i nd c h k h n gn h nt h yt nx t r c v b nx c n h i n t x ; , t r n hb i nd c ht h yt nn h m t t u y nb v p h np h i l ut r c h on t t c c n gm t l c . C p h pk h a i b oh m M t t u y nb c h c n n gt r o n gCv C++c u n gc pc h oc c t nc h c n n g , c c l o i i s t r u y nc h oh m, v c c g i t r t r l i c h c n n g . V d , yl m t t u y nb c h om t c h c n n g c g i l f u n c 1 ( ) m p h i m t h a i i s s n g u y n( s n g u y n c b i ut h t r o n gC/C++v i t k h a i n t ) v t r v m t s n g u y n : i n tf u n c 1
( i n t ,i n t ) ;

T k h o ut i nb nn h nt h yl g i t r t r v t t c c a c h n hn : i n t . C c i s c t t r o n gd un g o c s a u t nh mt r o n gt h t m c h n g c s d n g . D uc h mp h yc h ob i t k t t h c c a m t t u y nb , t r o n gt r n g h pn y , n c h ot r n hb i nd c h" l t t c k h n gc n hn g h a c h c n n g y ! " Cv C++k h a i b oc g n g b t c h c c c h n ht h c s d n gc a s np h m. V d , n umt s n g u y nl m t c h c n n gt r nc t h c s d n gt h e oc c hn y : a=f u n c 1( 2 , 3 ) ; T f u n c 1 ( ) t r v m t s n g u y n , C , C++t r n hb i nd c hs k i mt r a v i c s d n gc c f u n c 1 ( ) mb or n g mt c t h c h pn h ng i t r t r v v c c i s l t h c hh p . i s t r o n gc c h mc t h c t n . T r n hb i nd c hb q u an h n gc i t nn h n gh c t h h u c hn h c c t h i t b g h i n h c h on g i s d n g . V d , c h n gt a c t h k h a i b o f u n c 1 ( ) t r o n gm t t h i t r a n gk h c n h a uc c n gm t n g h a : i n tf u n c 1( i n tc h i ud i ,c h i ur n gi n t ) ; M t Go t c h a C m t s k h c b i t n gk g i a Cv C++c h oc c c h c n n gv i d a n hs c h i s r n g . T r o n gC , t k h a i : i n t


F u n c 2( ) ;

c n g h a l " m t c h c n n gv i b t k s l n gv k i uc a c c i s . " i un yn g nc h nc c l o i k i mt r a , v v yt r o n gC++ , n c n g h a l " m t c h c n n gk h n gc i s . " n hn g h ah m n hn g h ac h c n n gg i n gn h c c h mn g o i t r v i c h c c q u a n . M t c t h l m t t ph pc c b oc ok m t h e ot r o n gd un g o c . Ni n gr n gb i ut h s b t uv k t t h c c am t k h i m . c u n gc pc h of u n c 1( ) n h


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 42/320

08/10/2013

Suy ngh trong C + +, Vol 1

n g h a l m t c t h t r n gr n g( m t c t h c h ak h n gc m ) , v i t : i n tf u n c 1( i n tc h i ud i ,c h i ur n g
i n t ){ }

C h r n gt r o n g n hn g h a c h c n n g , c c d un g o c t h a yt h d uc h mp h y . K t k h i n i n gr n gb a oq u a n h m t t u y nb h o c m t n h mb oc o , b nk h n gc nm t d uc h mp h y . C n gt h n gb or n gc c i s t r o n g n hn g h a c h c n n gp h i c t nn ub nmu ns d n gc c i s t r o n gc c c q u a nc h c n n g( v c h n g k h n gb a og i c s d n g y , h l t yc h n ) . C p h pk h a i b ob i n n g h a g nc h oc mt " k h a i b ob i n " l c hs k h h i uv m ut h u n , v i uq u a nt r n gl b nh i u c n hn g h a c h n hx c , d o b nc t h c m n g . M t k h a i b ob i nc h ot r n hb i nd c hn h n gg m t b i n n h t h n o . Nn i , " T i b i t b nk h n gn h nt h yt nn yt r c y , n h n gt i h a v i n t nt i m t n i n o , v l m t b i nk i uX " . T r o n gm t t u y nb c h c n n g , b nc h om t k i u( g i t r t r v ) , t nh m, d a n hs c h i s , v d uc h mp h y . l c h oc c t r n hb i nd c h t mr ar n g l m t t u y nb v n h n gg c c c h c n n gn h t h n o . B i s u y l u n , m t k h a i b ob i nc t h l m t l o i t i pt h e ol m t t n . V d : i n ta ; c t h k h a i b ob i nmt l m t s n g u y n , s d n gl o g i c t r n . D i yl c u c x u n g t : c t h n gt i nt r o n g o nm t r nc h oc c t r n hb i nd c h t or a k h n gg i a nc h om t s n g u y n c g i l mt , v l n h n g g s x yr a . g i i q u y t t n ht r n gk h x n y , m t t k h a l c nt h i t c h oCv C++n i : " yc h l m t t u y nb , n c n hn g h a n i k h c . " C c t k h a l e x t e r n. Nc t h c n g h a l n hn g h a l e x t e r na l v ot pt i n , h o c l n hn g h a x yr a s a ut r o n gt pt i n . K h a i b om t b i nmk h n gc n n hn g h an c n g h al s d n ge x t e r nt k h o t r ck h i m t mt c a b i n , n h t h n y : e x t e r ni n ta ; e x t e r nc n gc t h pd n gc h oc c t k h a i c h c n n g . C h of u n c 1 ( ) , n t r n gn h t h n y :
e x t e r ni n tf u n c 1( i n tc h i ud i ,c h i ur n gi n t ) ;

T u y nb n yl t n g n gv i d n gf u n c 1 ( ) k h a i b o . V k h n gc c q u a nc h c n n g , t r n hb i nd c hp h i i x v i n n h l m t c h c n n gk h a i b oc h k h n gp h i l m t n hn g h a c h c n n g . C c e x t e r nd o t k h a l c nt h i t v b t b u c i v i c c t k h a i c h c n n g . Nc l l i uk h n gma yl c c n h t h i t k c a C k h n gy uc us d n ge x t e r nc h oc c t k h a i c h c n n g , n s l p h h ph nv t g yn h ml n( n h n gs i h i n h i uh n n hm y , m c t h g i i t h c hc c q u y t n h ) . D i yl m t s v d c a v i c k k h a i :
// :C 0 2 :D e c l a r e . c p p //T u y nb v n hn g h av d e x t e r ni n ti ;//T u y nb m k h n gc n n hn g h ae x t e r n f l o a tf( f l o a t ) ;k h a i//C h cn n g n ib ; //T u y nb v n hn g h af l o a tf( f l o a ta ){ // n hn g h a l i m t+1 . 0 ; } i n ti ;// n hn g h ai n th( i n tx ){ //T u y nb v n hn g h a l ix+1 ; } i n tm a i n( ){ b=1 , 0 ; i=2 ; f( b ) ; h( i ) ; }/// :~

T r o n gt k h a i c h c n n g , c c n hd a n h i s t yc h n . T r o n gc c n hn g h a , h c y uc u( c c n hd a n h d u yn h t c y uc ut r o n gC , k h n gp h i C++ ) . B a og mc t i u H uh t c c t h v i nc h a s l n gl nc c c h c n n gv c c b i n . l uc n gv i c v mb ot n hn h t q u n k h i l mt k h a i b nn g o i c h oc c m t h n gn y , Cv C++s d n gm t t h i t b c g i l t p t i nt i u . M t t pt i nt i u l m t t pt i nc h a c c k h a i b ob nn g o i m t t h v i n , n t h n gt h n gc m t p h nm r n g t nt pt i nc a ' h ' , c h n gh nn h h e a d e r f i l e . h. ( B nc n gc t h t h ym t s m c s d n gp h nm r n gk h c n h a u , c h n gh nn h h x x . h o c . h p p, n h n g i un y a n gt r t h n hh i m. ) C c l pt r n hv i nt or a t h v i nc u n gc pc c t pt i nt i u . k h a i b oc c c h c n n gv c c b i nb nn g o i t r o n gt h v i n , n g i s d n gc h ng i nb a og mc c t pt i nt i u . B a og m m t t pt i nt i u , s d n g# b a og m c h t h t i nx l . i un yc h ot i nx l m t pt i nt i u t nv c h nn i d u n gc a n , n i c c # b a og m t u y nb x u t h i n . M t #b a og m c t h t t nc h om t t pt i nt r o n gh a i c c h : t r o n gd un g o c n h n ( < >) h o c t r o n gd un g o c k p . T nt pt i nt r o n gd un g o c n h n , c h n gh nn h :


#B a og m< h e a d e r >
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 43/320

08/10/2013

Suy ngh trong C + +, Vol 1

l mc h ot i nx l t mk i mc c t pt i nt r o n gm t c c hm l c b i t t h c h i nc a b n , n h n gt h n gc m t s l o i " b a og m n gd nt mk i m" m b nc h n ht r o n gm i t r n gc a b nh o c t r nd n gl n ht r n h b i nd c h . C c h t h i t l pc c n gd nt mk i mk h c n h a ug i a c c m y , h i uh n h , v C++h i nt h c , v c t h y uc um t s i ut r a t p h a b n .


#B a og m" l o c a l . h "

T nt pt i nt r o n gd un g o c k p , c h n gh nn h : c h ot i nx l t mk i mc c t pt i nt r o n g( t h e o c i mk t h u t ) m t " c c ht h c h i nx c n h . " i un y t h n gc n g h a l t mk i mc c t pt i nl i nq u a n nt h m c h i nh n h . N uc c t pt i nk h n gt mt h y , s a u b a og mc c c h c t i c h n h n un c d un g o c n h nt h a yv d un g o c k p . B a og mc c t pt i nh e a d e r : i o s t r e a m, b nv i t :

#I n c l u d e

T i nx l s t mt h yc c t pt i nt i u i o s t r e a m( t h n gt r o n gm t t h m c c o ng i l " b a og m" ) v c h nn . T i uc h u nC + + b a og m n hd n g Nh C++p h t t r i n , c c n h c u n gc pt r n hb i nd c hk h c n h a u c h np h nm r n gk h c n h a uc h ot nt p t i n . Ng o i r a , c c h i uh n hk h c n h a uc n h n gh nc h k h c n h a ut r nt nt pt i n , c b i t l v c h i ud i t n . Nh n gv n n yg yr a m n g u nc a v n t n hd i n g . m nt r nc c c n ht h , t i uc h u ns d n g m t n hd n gc h op h pt nt pt i nd i h nn i t i n gt mk t v l o i b p h nm r n g . V d , t h a yv p h o n g c c hc c a b a og mi o s t r e a m. h, t r n gn h t h n y :


#B a og m< i o s t r e a m . h >

b yg i b nc t h v i t :
#I n c l u d e

Ng i p h i nd c hc t h t h c h i nb a og mc c c ut r o n gm t c c hp h h pv i n h uc uc a t r n hb i nd c hn i r i n gv h i uh n h , n uc nt h i t c t b t nv t h m m t p h nm r n g . T t n h i n , b nc n gc t h s a oc h p c c t i u c h ob nb i n h c u n gc pt r n hb i nd c hc a b nv i n h n gn g i m k h n gc nm r n gn ub n mu ns d n gp h o n gc c hn yt r c k h i m t n h c u n gc p c u n gc ph t r c h on . C c t h v i n c k t h a t Cv nc s nv i t r u y nt h n g' . h' m r n g . T u yn h i n , b nc n gc t h s d n g c h n gv i h i n i h nC++b a og mp h o n gc c ht h mv ot r c b i m t " c " t r c t n . Nh s a u :


#I n c l u d e #B a og m< s t d l i b . h >

t r t h n h :
#B a og m< c s t d i o > #B a og m< c s t d l i b >

V n h v y , i v i t t c c c t i u Cc h u n . i un yc u n gc pm t s p h nb i t t t p n g i c c h k h i b n a n gs d n gCs ov i C++ , t h v i n . Hi uq u c a c c n hd n gb a og m m i l k h n gg i n gv i c c t u i : b n gc c hs d n gh . c u n gc pc h ob nl n t u i , k h n gm up h i nb n , v b q u a h . c u n gc pc h ob np h i nb nt e mp l a t i z e dm i . B nt h n gs c v n n ub nc g n gI n t e r mi x h a i h n ht h c t r o n gm t c h n gt r n hd u yn h t .

L i nk t
M i l i nk t t h ut h pc c m u n i t n g( m t h n gs d n gp h nm r n gt nt pt i nn h t h . oh o c o b j . ) , c t or a b i t r n hb i nd c h , t h n hm t c h n gt r n ht h c t h i h i uh n hc t h t i v c h y . yl g i a i o n c u i c n gc a q u t r n hb i nd c h . M i l i nk t c i mk h c n h a ut h t h n g h t h n g . N i c h u n g , b nc h c nn i v i c c m i l i nk t t nc a c c m u nv t h v i n i t n gb nmu nl i nk t v i n h a u , v t nc a f i l e t h c t h i , v n i l mv i c . M t s h t h n gy uc ub np h i g i m i l i nk t c h n hm n h . V i h uh t c c C++g i b ng i m i l i nk t t h n g q u a c c t r n hb i nd c hC++ . T r o n gn h i ut r n gh p , m i l i nk t c g i c h ob nv h n h . C c m i l i nk t m t s c h ns k h n gt mk i m i t n gt pt i nv t h v i nn h i uh nm t l n , v h t m k i mt h n gq u a d a n hs c hb nc u n gc pc h oh t t r i s a n gp h i . i un yc n g h a l t h t c a i t n gt p t i nv t h v i nc t h l q u a nt r n g . N ub nc m t v n b nm k h n gh i nt h c h o nk h i t h i g i a nl i n k t , m t k h n n gl t h t m c c t pt i n c t r a oc h oc c m i l i nk t .

S d n gt h v i n
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 44/320

08/10/2013

Suy ngh trong C + +, Vol 1

B yg i b nb i t c c t h u t n g c b n , b nc t h h i ul mt h n o s d n gm t t h v i n . S d n gt h v i n : 1. 2. 3. B a og mc c t pt i nt i u c a t h v i n . S d n gc c c h c n n gv c c b i nt r o n gt h v i n . L i nk t t h v i nv oc h n gt r n ht h c t h i .

Nh n gb c n yc n g c pd n gk h i c c m u n i t n gk h n g c k t h pt h n hm t t h v i n . B a o g m m t t pt i nt i u v l i nk t c c m u n i t n gl c c b c c b n b i nd c hr i n gb i t t r o n gc Cv C++ . L mt h n oc cm i l i nk t t mk i m m t t h v i n K h i b nt h c h i nm t t i l i ut h a mk h ob nn g o i m t c h c n n gh o c b i nt r o n gC , C++ , c c m i l i nk t , k h i g pp h i t h n gt i nn y , c t h l m m t t r o n gh a i i u . N un k h n g g pp h i n hn g h a c h oc c c h c n n gh a yt h a y i , n c h ob i t t h m n hd a n hv od a n hs c hc c " t i l i ut h a mk h oc h a c g i i q u y t . " N um i l i nk t g pp h i n h n g n hn g h a , t i l i ut h a mk h o c g i i q u y t . N um i l i nk t k h n gt h t mt h y n hn g h a t r o n gd a n hs c hc c m u n i t n g , n t mk i mc c t h v i n . T h v i nc m t s l o i c h m c m i l i nk t k h n gc np h i x e mx t t h n gq u a t t c c c m u n i t n gt r o n gt h v i nn c h c nn h nv oc c c h s . K h i c c m i l i nk t t mt h ym t n hn g h a t r o n gt h v i n , c c m u n i t n gt o nb , k h n gc h n hn g h a c h c n n g , c l i nk t v oc c c h n gt r n ht h c t h i . L u r n gt o nb t h v i nk h n gl i nq u a n , c h l m u n i t n gt r o n gt h v i nc c h a c c n hn g h a m b n mu n( n uk h n gc h n gt r n hs l nk h n gc nt h i t ) . N ub nmu ng i mt h i uk c ht h c c h n gt r n ht h c t h i , b nc t h x e mx t v i c t m t c h c n n gd u yn h t t r o n gm i t pt i nm n g u nk h i b nx yd n gt h v i n [ 2 4 ] r i n gc a b n . i un y i h i n h i uc h n hs a , n h n gn c t h h u c hc h on g i d n g . B i v c c t pt i nt mk i m m i l i nk t t h e ot h t b nc u n gc pc h oh , b nc t h n g nc h nt r c v i c s d n g m t c h c n n gt h v i nb n gc c hc h nm t t pt i nv i c h c n n gr i n gc a b n , b n gc c hs d n gt nc n g c h c n n g , v od a n hs c ht r c k h i c c t nt h v i nx u t h i n . K t k h i m i l i nk t s g i i q u y t b t k t i l i u t h a mk h o c h c n n gn yb n gc c hs d n gc h c n n gc a b nt r c k h i n t mk i mc c t h v i n , c h c n n g c a b n c s d n gt h a yv c h c n n gt h v i n . L ur n g i un yc n gc t h l m t l i , v l i um C+ +k h n gg i a nt nn g nc h n . B s u n gb m t K h i m t Ch o c C++c h n gt r n ht h c t h i c t or a , m t s m t h n g a n gb m t l i nk t i nM t t r o n gs n yl c c m u nk h i n g , t r o n g c n h n gk h i t op h i c c h yb t k l c n om t Ch o c C++ , c h n gt r n hb t ut h c h i n . Nh n gt h i q u e nt h i t l pn g nx pv k h i t oc c b i nn h t n ht r o n gc h n g t r n h . M i l i nk t l u nl u nt mk i mc c t h v i nc h u nc h oc c p h i nb nb i nd c hc a b t k " c h u n " c h c n n g c g i l t r o n gc h n gt r n h . B i v c c t h v i nc h u nl u nt mk i m, b nc t h s d n gb t c i ug t r o n g t h v i nb n gc c h ng i nb a og mc c t pt i nt i u t h c hh pt r o n gc h n gt r n hc a b n , b nk h n gc n p h i n i c h on t mk i mc c t h v i nc h u n . C c c h c n n gi o s t r e a m, v d , l t r o n gt i uc h u nC++ . s d n gc h n g , b nc h b a og mc c < i o s t r e a m>t i u t pt i n . N ub n a n gs d n gm t t h v i nt i n c hn y , b np h i t h m m t c c hr r n gt nt h v i nv od a n hs c hc c t pt i ng i a oc h oc c m i l i nk t . S d n gt h v i nC n gb n g C h v b n a n gv i t c o d e t r o n gC++ , b nk h n gc ms d n gc h c n n gt h v i nC . T r o n gt h c t , t o nb t h v i nC c c i v ot i uc h u nC++ . Hi n c m t l n gl nc n gv i c t h c h i nc h ob nt r o n gc c c h c n n g n y , h c t h g i pb nt i t k i mr t n h i ut h i g i a n . C u ns c hn ys s d n gt i uc h u nC++( v d o c n gc h u nC ) c h c n n gt h v i nk h i t h u nt i n , n h n g c h c t i uc h u nc h c n n gt h v i ns c s d n g , mb ot n hd i n gc a c h n gt r n h . T r o n gm t v i t r n gh pt r o n g c c c h c n n gt h v i np h i c s d n gm k h n gp h i l t r o n gc h u nC++ , t t c c c n l c s c t h c h i n s d n gc h c n n gP OS I Xt u nt h . P OS I Xl m t t i uc h u nd a t r nm t t i uc h u nn l c U n i x b a og mc c c h c n n gm i v t r a n g o i p h mv i c a C++ . B nt h n gc t h mo n g i t mt h y c h c n n gP OS I Xt r n( c b i t , L i n u x ) c c n nt n gU n i x , v t h n gd i h i uh n hD OS /Wi n d o ws . V d , n ub n a n gs d n g a l u n gb n c t t h nb n gc c hs d n gt h v i nc h P OS I Xv m c a b ns a u s c d d n gh n h i u , c n gv d u yt r ( v c c t h v i nc h P OS I Xs t h n gc h c ns d n gc c c s c h c b nc a h i uh n h , n uc h n g c c u n gc p ) .

+ ut i nc h n gt r n hC+
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

B yg i b nb i t g nn h c a n h n g i uc b n t or a v b i nd c hc h n gt r n h . C h n gt r n hs s d n g
45/320

08/10/2013

Suy ngh trong C + +, Vol 1

c h u nC++l pi o s t r e a m. Nh n g c v g h i c c t pt i nv " t i uc h u n " uv ov ur a ( m t h n gx u t p h t t v i v og i a od i n i uk h i n , n h n gc t h c c h u y nh n g nc c t pt i nh o c t h i t b ) . T r o n gc h n g t r n h ng i nn y , m t d n g i t n gs c s d n g i nm t t h n gb ot r nm nh n h .

S d n gl pi o s t r e a ms
#I n c l u d e

k h a i b oc c c h c n n gv d l i ub nn g o i t r o n gl pi o s t r e a ms , b a og mc c t pt i nt i u v i t u y nb C h n gt r n h ut i ns d n gc c k h i n i mv ur a t i uc h u n , c n g h a l " m t n i c m c c hc h u n g g i k t q u . " B ns t h yv d k h c s d n g ur a t i uc h u nt h e on h n gc c hk h c n h a u , n h n g yn s c h c nv og i a od i n i uk h i n . G i i o s t r e a mt n gx c n hm t b i n( m t i t n g ) c g i l t a n c h pn h nt t c c c d l i ub r n gb u c c h o ur a t i uc h u n .

g i d l i u n ur at i uc h u n , b nd n gt o nt < <. L pt r n hC b i t i uh n hn yl " p h pt o n c h u y nt r i " , ms c mt t r o n gc h n gk t i p . N n i r n gm t s t h a y i t r i p h pt o nk h n gc g l mv i ur a . T u yn h i n , C ++c h op h pc c n h k h a i t h c c q u t i . K h i b nq u t i m t n h i u h n h , b nc u n gc pc h on m t n g h am i k h i n h i uh n h c s d n gv i m t i t n gc am t k i uc t h . V i c c i t n gi o s t r e a m, c c n h i uh n h< <n g h a l " g i n . " V d : c o u t< <" !h o w d y " ; g i c h u i " h o wd y ! " c c i t n g c g i l t a n( l v i t t t c a " g i a od i n i uk h i n ur a " ) . l i uh n hq u t i g i pb nb t u . C h n g1 2 b a og m i uh n hq u t i c h i t i t .

K h n gg i a nt n

Nh c pt r o n gC h n g1 , m t t r o n gn h n gv n g pp h i t r o n gn g nn g Cl b n" h t t n " c h oc c c h c n n gv n hd a n hk h i c h n gt r n hc a b n t nm t k c ht h c n h t n h . T t n h i n , b nk h n gt h c s c h y r a k h i t n ; n , t u yn h i n , t r t h n hk h k h nh n n g h v n h n gc i m i s a um t t h i g i a n . Qu a nt r n gh n , k h i m t c h n gt r n h t nm t k c ht h c n h t n hn t h n g c c h i a t h n ht n gm n h , m i t r o n gs c x yd n gv d u yt r b i m t n g i h a ym t n h mk h c n h a u . T Cc h i uq u c m t ut r n gd u y n h t m t t c c c n hd a n hv t nc h c n n gs n g , i un yc n g h a r n gt t c c c n h p h t t r i np h i c n t h nk h n g v t n hs d n gt nt r o n gc n gm t t n hh u n gm h c t h x u n g t . i un yn h a n hc h n gt r n nt n h t , t h i g i a nl n gp h , v , c u i c n g , t nk m. T i uc h u nC++c m t c c h n g nc h nv a c h mn y : c c k h n gg i a nt nt k h a . M i b C++ n h n g h a t r o n gm t t h v i nh o c c h n gt r n hl " g i " t r o n gm t k h n gg i a nt n , v n um t s n hn g h a k h c c t ng i n gh t n h a u , n h n gl t r o n gm t k h n gg i a nt nk h c n h a u , s a u k h n gc v a c h m. K h n gg i a nt nl m t c n gc t i nl i v h u c h , n h n gs h i nd i nc a h c n g h a l b np h i c n h nt h c c a h t r c k h i b nc t h v i t b t k c h n gt r n h . N ub nc h ng i nb a og m m t t pt i nt i u v s d n g m t s c h c n n gh o c c c i t n gt t i u , c t h b ns n h n c l i s t r a n g e s o u n d i n gk h i b nc g n g b i nd c hc h n gt r n h , c n ur n gc c t r n hb i nd c hk h n gt h t mt h yb t k t k h a i c h oc c m c m b nc h b a og mt r o n gc c t pt i nt i u ! S a uk h i b nt h yt h n gb on ym t v i l nb ns t r n nq u e nt h u c v i n g h a c a n ( m l " B nb a og mc c t pt i nt i u n h n gt t c c c t u y nb n yt r o n gm t k h n gg i a nt nv b n k h n gn i v i t r n hb i nd c hm b nmu ns d n gt k h a i t r o n g k h n gg i a nt n" ) .

C m t t k h a c h op h pb nn i " t i mu ns d n gt k h a i v /h o c n hn g h a t r o n gk h n gg i a nt nn y . " T k h an y , t h c hh p , c s d n g. T t c c c t i uc h u nC++ , t h v i n c b a ob c t r o n gm t k h n gg i a n t nd u yn h t , l t i uc h u n( i v i " t i uc h u n " ) . Nh c u ns c hn ys d n gc ct h v i nc h u ng nn h h o nt o n , b ns t h ys a u ys d n g c h t h t r o n gh uh t c c c h n gt r n h : s d n gt nm i nk h n gg i a nt i u


c h u n ;

i un yc n g h a r n gb nmu n l t t c c c y ut t k h n gg i a nt ng i l t i uc h u n. S a uk h i t u y nb n y , b nk h n gp h i l ol n gr n gt h n hp h nt h v i nc t h c a b nl t r o n gm t k h n gg i a nt n , k t k h i s d n gc h l mc h ok h n gg i a nt nc s nt r o n gc c t pt i nm s d n gc h t h c v i t . P h i b yt t c c c y ut t m t k h n gg i a nt ns a uk h i m t n g i n o i nn h n gr c r i nc h n g c v h i p h nt c d n g , v t r o n gt h c t , b nn nc nt h nk h i k h n gs u yn g h l m i un y( n h b ns h c t r o n gc u ns c hn y ) . T u yn h i n , s d n gc h t h c h ot h yc h c n h n gc i t nc h ot pt i nh i nt i , v v yn k h n gp h i l k h m n hm n h n mt h a n h ut i n . ( T u yn h i n , s u yn g h h a i l nv l mv i c t r o n gm t t pt i nt i u l l i ul n h . ) C m t m i q u a nh g i a k h n gg i a nt nv c c ht h c t pt i nt i u c b a og m. T r c k h i a t pt i nt i u h i n i c c h u nh a ( k h n gc d u' . h' , n h t r o n g< i o s t r e a m>) , c c h i nh n hb a og m m t t pt i n t i u l v i ' h . ' , c h n gh nn h < i o s t r e a m. h >. T i t h i i m , k h n gg i a nt nk h n gp h i m t p h nc a n g nn g h o c . V v y , c u n gc pk h n n gt n gt h c hn g c v i m h i nc , n ub nn i


#B a og m< i o s t r e a m . h >
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 46/320

08/10/2013

Suy ngh trong C + +, Vol 1

n c n g h a l
#I n c l u d eu s i n gn a m e s p a c es t d ;

T u yn h i n , t r o n gc u ns c hn yb a og mc c t i uc h u n n hd n gs c s d n g( k h n gc ' . h' ) v d o , s d n gc h t h p h i r r n g . C h ob yg i , l t t c c c b nc nb i t v k h n gg i a nt n , n h n gt r o n gC h n g1 0 c h c c pn h i uk h n .

Ng u y nt cc b nc ac ut r cc h n gt r n h

A Ch o c C++ , c h n gt r n hl m t t ph pc a c c b i n , n hn g h a c h c n n g , v c c c u c g i c h c n n g . K h i c h n gt r n hb t u , n t h c t h i m k h i t ov g i m t c h c n n g c b i t , " c h n h( ) . " B n t m c h n hc h o c c c h n gt r n h y . Nh c pt r c , m t n hn g h a c h c n n gb a og m m t k i ut r v ( Nh n gp h i g h i r t r o n gC++ ) , m t t nc h c n n g , m t c u c t r a n hc i d a n hs c ht r o n gd un g o c n , v m c h c n n gc h a t r o n gd un g o c . yl m t n hn g h a c h c n n gm u :

i n tf u n c t i o n( ){ //C h cn n gm y( yl m tl in h nx t ) }

H mt r nc m t d a n hs c h i s r n gv m t c t h c h c h a m t b n hl u n . C t h c n h i ub n i n gr n gt r o n gm t n hn g h a c h c n n g , n h n gk h n gp h i l u nl u nc t n h t m t t p h px u n gq u a n hc c c q u a nc h c n n g . K t k h i c h n h( ) l m t c h c n n g , n p h i t u nt h e oc c q u yt c n y . T r o n gC++ , ma i n( ) l u nl u nc k i ut r v c a i n t . Cv C++l n g nn g h n ht h c mi np h . V i v i n g o i l , c c t r n hb i nd c hb q u a d n gm i v k h n gg i a n m ut r n g , v v yn p h i c m t s c c h k t t h c c a m t t u y nb . B oc o c g i i h nb i d uc h m p h y . Ck i nb t uv i / * v k t t h c b n g* / . H c t h b a og mc c d n gm i . C++s d n gk i nC p h o n g c c hv c m t l o i b s u n gc a b n hl u n : / / . C c / / b t um t n h nx t r n gk t t h c v i m t d n gm i . N l t h u nt i nh n/ * * / l yk i nm t d n g , v c s d n gr n gr i t r o n gc u ns c hn y .

" X i nc h o , t h g i i ! "
V b yg i , c u i c n g , c h n gt r n h ut i n :
// :C 0 2 :h e l l o . c p p //N iX i nc h ov iC++ #B a og mt k h a i< i o s t r e a m >//S t r e a ms d n gt nm i nk h n gg i a nt i uc h u n ; i n tm a i n( ){ c o u t< <" H e l l o ,W o r l dt i ! " < <8< <" n g a yh mn a y ! "< <E n d l ; }/// :~

C c t a n i t n g c g i a om t l o t c c i s q u a ' < <' n h k h a i t h c . Ni nr a n h n gl pl u n t r i s a n g p h i . c b i t i o s t r e a mc h c n n ge n d l k t q u ur a n gv m t d n gm i . V i i o s t r e a ms , b nc t h c h u i l i v i n h a um t l o t c c l pl u nn h t h n y , m l mc h ol pd s d n g . T r o n gC , v nb nb nt r o n gd un g o c k p c t r u y nt h n gg i l " c h u i " . T u yn h i n , c c t i uc h u nC++ , t h v i nc m t l ph c m n hm c g i l c h u i t h a ot c v nb n , v v v yt i s s d n gc h n hx c h n h nm n g k t c h ov nb nb nt r o n gd un g o c k p . T r n hb i nd c ht or a l ut r c h om n gk t v c c c a h n gt n g n gv i A S C I I c h om i n h nv t t r o n gl u t r n y . T r n hb i nd c ht n gc h md t m n gn yc a c c n h nv t v i m t m n ht h md u n gl n gl ut r c c h a c c g i t r 0 b oh i uk t t h c c a m n gk t . B nt r o n gm t m n gk t , b nc t h c h nc c k t c b i t b n gc c hs d n gt r n h t t h o t r a . Nh n gb a og m m t d ug c hc h on g c ( \) t i pt h e ol m t m s c b i t . V d \nc n g h a l d n gm i . D nb i nd c hc a b nh o c a p h n gh n gd nCc u n gc p c h om t b y c c t r n ht t h o t r a , n h n gn g i k h c b a og m \t ( t a b ) , \\( d ug c hc h on g c ) , v \b ( b a c k s p a c e ) . Nh nt h yr n gc c t u y nb c t h t i pt c t r nn h i ud n g , v r n gt o nb t u y nb k t t h c b n gd uc h m p h y


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 47/320

08/10/2013

Suy ngh trong C + +, Vol 1

i s m n gk t v s i nt h o i l i nt c c p h a t r nv i n h a u t r nt a nt u y nb . B i v c c n h i u h n h< <q u t i v i n h i un g h a k h i c s d n gv i t a n, b nc t h g i t a nn h i ut h a ms k h c n h a u v n s " t mr a n h n gg l mv i c c t i nn h n . " T r o n gs u t c u ns c hn y , b ns n h nt h yr n gn h n gd n g ut i nc a m i t pt i ns l m t b n hl u nb t uv i c c k t b t um t b n hl u n( t h n g/ / ) , t i pt h e ol d uh a i c h m, v d n gc u i c n gc a d a n h s c hs k t t h c v i m t l i n h nx t t i pt h e ol ' / : ~' . yl m t k t h u t t i s d n g c h op h pd d n g k h a i t h c t h n gt i nt c c t pt i nm ( c h n gt r n h l m i un yc t h c t mt h yt r o n gt ph a i c a c u ns c hn y , t i w w w . B r u c e E c k e l . c o m) . D n g ut i nc n gc t nv v t r c a c c t pt i n , v v yn c t h c c pt r o n gv n b nv t r o n gc c t pt i nk h c , v d o b nc t h d d n gx c n hv t r n t r o n gm n g u nc a c u ns c hn y ( c t i v t w w w . B r u c e E c k e l . c o m) .

C h yt r n hb i nd c h

S a uk h i t i v v g i i n nm n g u nc a c u ns c h , t mc h n gt r n ht r o n gt h m c c o nC O2 . G i t r n hb i nd c h v i h e l l o . c p pn h l i s . ng i n , c h n gt r n hm t t pt i nn h t h n y , h uh t c c t r n hb i nd c hs a b nt t c c c c c ht h c t h n gq u a q u t r n hn y . V d , s d n gG NUC++( c s nmi np h t r nI n t e r n e t ) , b n v i t : g++h e l l o . c p p T r n hb i nd c hk h c s c m t c p h pt n gt , t h a mk h ot i l i ut r n hb i nd c hc a b n b i t c h i t i t .

T h n gt i nt h mv i o s t r e a ms

V v y , nn a yb n t h yc h c c c k h a c n ht h s n h t c a l pi o s t r e a ms . C c n hd n g ur a c s nv i i o s t r e a ms c n gb a og mc c t n hn n gn h n hd n gs t r o n gs t h pp h n , b t p h nv t h pl c p h n . yl m t v d v v i c s d n gi o s t r e a ms :

// :C 0 2 :S t r e a m 2 . c p p //T h md n gt n hn n g#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ //X c n hc c n hd n gv ic ct h a ot c : c o u t< <" m ts t r o n gs t h pp h n : " < <T h n gM iH a i< <1 5< <e n d l ; c o u t < <" t r o n gb tp h n : "< <T h n gM i< <1 5< <e n d l ; c o u t< <" t r o n gh e x : "< <h e x<< 1 5 < <e n d l ; c o u t< <" m ts i mn i : " < <3 . 1 4 1 5 9< <e n d l ; c o u t< <" k h n gi nc h a r( t h o t ) : " < <C h a r( 2 7 )< <e n d l ; }/// :~

V d n yc h ot h yi o s t r e a ms s i nl pt r o n gs t h pp h n , b t p h n , t h pl c p h nv s d n gi o s t r e a mt h a o t c ( k h n gi nb t c i ug , n h n gt h a y i t r n gt h i c a d n g ur a ) . C c n hd n gc a s d uc h m n g c x c n ht n gb i t r n hb i nd c h . Ng o i r a , b t k n h nv t c t h c g i nm t d n g i t n gs d n g m t d nd i nv i nc h om t c h a r ( m t c h a r l m t l o i d l i uc h a k t d u yn h t ) . i un yd i nv i nt r n gg i n g n h m t c u c g i c h c n n g : c h a r ( ) , c n gv i g i t r A S C I I c a n h nv t . T r o n gc h n gt r n ht r n , c h a r ( 2 7 ) s g i m t " l i t h o t " c o u t .

Nh nv tm n gn i
M t t n hn n gq u a nt r n gc a t i nx l Cl n h nv t m n g n i . T n hn n gn y c s d n gt r o n gm t s v d t r o n gc u ns c hn y . N uh a i m n gk t t r c hd nt i pg i p , v k h n gc d uc h mc ul g i a c h n g , t r n h b i nd c hs d nc c m n gk t l i v i n h a ut h n hm t m n gk t d u yn h t . i un y c b i t h u c hk h i d a n hs c h a n gc n h n gh nc h c h i ur n g :
// :C 0 2 :C o n c a t . c p p //N h nv tm n gN i #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ c o u t< <" V nc nr tl u av om t " t h cc h i at a yv i " " K h n gc t c n gx u\n a sm i nl k h n gc " " D uc h mc ut c hn h nv tl i nk " " M n g\n . " ; }/// :~

" d n gd u yn h tn h n gn c

L c u , c c m t r nc t h x e mn h m t l i b i v k h n gc d uc h mp h yq u e nt h u c c u i m i d n g . H y n h r n gCv C++l n g nn g d n gt d o , v m c d b nt h n gs t h ym t d uc h mp h y c u i m i d n g , y uc ut h c t l c h om t d uc h mp h y c u i m i c u , v n c t h c h om t t u y nb t i pt c t r nm t v i d n g .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 48/320

08/10/2013

Suy ngh trong C + +, Vol 1

c uv o
C c l pi o s t r e a ms c u n gc pk h n n g c d l i uv o . i t n gs d n gc h o uv og i a c c k i nc i n( i v i " g i a od i n i uk h i n uv o " ) . c i nt h n gt h n gc h uv ot b n i uk h i n , n h n g uv on yc t h c c h u y nh n gt c c n g u nk h c . M t v d v c h u y nh n g c h i nt h s a ut r o n gc h n gn y . C c n h i uh n hi o s t r e a ms s d n gv i c i nl > >. T o nt n yc h i c h oc n gm t l o i uv on h i s c a n . V d , n ub nc u n gc pc h on m t i s s n g u y n , n c h i c h om t s n g u y nt b n i uk h i n . yl m t v d :
// :C 0 2 :N u m c o n v . c p p //C h u y n is t h pp h n b tp h nv h e x #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n ts ; c o u t< <" N h ps t h pp h n : " ; c i n> >s ; c o u t < <" g i t r t r o n gb tp h n=0 " < <T h n gM i< <s < <e n d l ; c o u t< < " g i t r t r o n gh e x=0 x" < <H e x< <s < <e n d l ; }/// :~

C h n gt r n hn yc h u y n i m t s g v ob i n g i s d n gv ob t p h nv c c i d i nt h pl c p h n .

K ug i c cc h n gt r n hk h c
T r o n gk h i c c h i nh n h s d n gm t c h n gt r n h c t uv ot i uc h u nv g h i v o ur a t i uc h u n l t r o n gm t k c hb ns h e l l U n i x h a yh n gl o t t pt i nh i uh n hD OS , b t k c h n gt r n hc t h c g i t b nt r o n gm t Ch o c C++c h n gt r n hb n gc c hs d n gCt i uc h u nh t h n g( ) c h c n n g , c k h a i b o t r o n gt pt i nt i u < c s t d l i b >:
// :C 0 2 :C a l l H e l l o . c p p //G im tc h n gt r n hk h c #B a og m< c s t d l i b >//K h a ib o" h t h n g( ) "s d n gt nm i nk h n gg i a nt i uc h u n ; i n tm a i n( ){ h t h n g( " H e l l o " ) ; }/// :~

s d n gh t h n g( ) c h c n n g , b nc h on m t n h nv t m n gm b ns t h n gg v oh i uh n hd u n h c l n h . i un yc n gc t h b a og mc c i s d n gl n h , v c c m n gk t c t h l m t t r o n gn h n gb n c h t ot i t h i g i a nc h y( t h a yv c h s d n gm t m n gk t t n hn h t r n ) . L n ht h c h i nv t r v k i ms o t c h oc h n gt r n h . C h n gt r n hn yc h c h ob nc c hd d n gl s d n g n gb n gc h c n n gt h v i nCt r o n gC++ , c h c n b a og mc c t pt i nv g i h m. K h n n gt n gt h c hn y i l nt Cs a n gC++l m t l i t h l nn ub n a n g h c n g nn g b t ut m t n nt n gt r o n gC .

D yg i i t h i u

T r o n gk h i m t m n gk t c t h k h h u c h , n l k h h nc h . Nc h ng i nl m t n h mc c n h nv t t r o n gb n h , n h n gn ub nmu nl mb t c i ug v i n , b np h i q u nl t t c c c c h i t i t n h . V d , k c h t h c c a m t m n gk t t r c hd n c c n ht i t h i g i a nb i nd c h . N ub nc m t m n gk t v b n mu nt h mc c k t m t s c h i t i t v i n , b ns c np h i h i uk h n h i u( b a og mq u nl n n g n g , b n h , n h nv t m n gs a oc h p , v n i ) t r c k h i b nc t h t c mo n gmu nc a b n . yc h n hl i uc h n gt a mu nc m t i t n gl mc h oc h n gt a . T i uc h u nC++c h u i l ph c c t h i t k c h ms c ( v n ) t t c c c t h a ot c c pt h pc a m n gk t m t r c c y uc uc a c c l pt r n hC . C c t h a ot c c c m t n g u nl i nt c c a t h i g i a nl n gp h v s a i s t k t k h i uc a n g nn g C . V v y , m c d m t c h n g c d n hc h oc c c h u i l pt r o n gt p2 c a c u ns c hn y , c c c h u i l r t q u a nt r n gv n l mc h oc u c s n gd d n gh nn h i um n s c g i i t h i u yv c s d n gt r o n gn h i up h n uc a c u ns c h . S d n gc h u i s b nb a og m C++p h n ut pt i n< s t r i n g >. C c c h u i l pl t r o n gk h n gg i a nt ns t dd o , m t s d n gc h t h l c nt h i t . B i v c c n h i uh n hq u t i , c p h pc h ov i c s d n gc h u i s l k h t r c q u a n :

// :C 0 2 :H e l l o S t r i n g s . c p p //C s c at i uc h u nC++c h u il p #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ c h u is 1 ,s 2 ;//r n gc h u i s t r i n gs 3=" H e l l o ,W o r l d . " ;//k h i t o c h u is 4( " t i " ) ;//N g o ir ak h i s 2=" H mn a y " ;//P h nc n gm tc h u i s 1=s 3+" "+s 4 ;//K th pc cc h u i s 1+=" 8 " ;//G nt h mv om tc h u i ! c o u t< <s 1+s 2+" "< <E n d l ; }/// :~
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 49/320

08/10/2013

Suy ngh trong C + +, Vol 1

L n ut i nh a i c h u i s , s 1 v s 2 , b t ut r n gr n g , t r o n gk h i s 3 v s 4 c h ot h yh a i c c ht n g n g k h i t oc h u i c c i t n gt m n gk t ( b nc t h c h l m t c c hd d n gk h i t oc h u i i t n gt c c c h u i c c i t n g ) . B nc t h g nc h ob t k c h u i i t n gs d n g' =' . N yt h a yt h n i d u n gt r c c a c h u i v i b t c t h g p h a b np h i , v b nk h n gp h i l ol n gv n h n gg s x yr a v i c c n i d u n gt r c l x l t n g c h ob n . K t h pc h u i s b nc h c ns d n g' +' n h i uh n h , m c nc h op h pb nk t h pc c m n gk t v i c h u i s . N ub nmu nt h mh o c l m t c h u i h o c m t m n gk t k h c c h u i , b nc t h s d n gt o nt ' +=' . C u i c n g , l ur n gi o s t r e a ms b i t p h i l mg v i c h u i s , v v yb nc h c t h g i m t c h u i ( h o c m t b i ut h c t or a m t c h u i , t r o n g x yr a v i s 1 +s 2 +" ! " ) t r c t i p nc o u t i nn .

cv v i t c ct pt i n

T r o n gC , q u t r n hm c a v t h a ot c t pt i n i h i r t n h i un nn g nn g c h u nb c h os p h c t pc a c c h o t n g . T u yn h i n , C++i o s t r e a mt h v i nc u n gc pm t c c h ng i n t h a ot c t pt i n , v c h c n n g n yc t h c g i i t h i ut r c n h i uh nn s l t r o n gC . m t pt i n c v v i t , b np h i b a og m< f s t r e a m>. M c d i un ys t n gb a og m< i o s t r e a m>, n t h n gt h nt r n g b a og m m t c c hr r n g< i o s t r e a m>n ub n a n gl pk h o c h s d n gc i n, c o u t , v v m m t t pt i n c , b nt or a m t i f s t r e a m i t n g , s a u h o t n gn h c i n. m m t t pt i n v i t , b nt or a m t o f s t r e a m i t n g , s a u h o t n gn h t a n. M t k h i b n m c c t pt i n , b nc t h c t h a yv i t t h c h on c n gg i n gn h b nl mv i b t k i t n gi o s t r e a mk h c . Nl ng i n( l , t t n h i n , t o nb c c i m) . M t t r o n gn h n gc h c n n gh u c hn h t t r o n gt h v i ni o s t r e a ml g e t l i n e ( ) , c h op h pb n c m t d n g [ 2 5 ] ( k t t h c b n gm t d n gm i ) v om t c h u i i t n g . i s ut i nl i f s t r e a m i t n gb n a n g c t v i s t h h a i l c h u i i t n g . K h i c u c g i c h c n n gk t t h c , c c c h u i i t n gs c c c d n g . D i yl m t v d ng i n , m c c b ns a on i d u n gc a m t t pt i nv om t :

// :C 0 2 :S c o p y . c p p //S a oc h pm tt pt i nk h c ,m td n gt im tt h i i m #I n c l u d e#i n c l u d e< f s t r e a m >s d n gt nm i nk h n gg i a nt i u c h u n ; i n tm a i n( ){ i f s t r e a mt r o n g( " S c o p y . c p p " ) ;//m c o f s t r e a mr a( " S c o p y 2 . c p p " ) ; //m v i t s t r i n gs ; t r o n gk h i( g e t l i n e( t r o n g ,s ) )//H u x u n gd n gc h a r r a< <s< <" \n " ;//. . .p h it h mn t r l i }/// :~

m c c t pt i n , b nc h c n a c c i f s t r e a mv o f s t r e a m i t n gt nt pt i nb nmu nt or a , n h t h y t r n . C m t k h i n i m m i c g i i t h i u y , l t r o n gk h i v n gl p . M c d i un ys c g i i t h c hc h i t i t t r o n gc h n gt i pt h e o , t n gc b nl s b i uh i nt r o n gd un g o c ns a uk h i k i ms o t v i c t h c h i n b oc ok t q u t i pt h e o( m c n gc t h c n h i ub oc o , b c b nt r o n gd un g o c n h n ) . Mi nl c c b i u h i nt r o n gd un g o c n( t r o n gt r n gh pn y , g e t l i n e ( t r o n g , s ) t or a m t k t q u " t h c s " , s a u b oc o k t q u k i ms o t b i t r o n gk h i s t i pt c t h c h i n . Nc h r a r n gg e t l i n e ( ) s t r v m t g i t r m c t h c h i ul " s t h t " n ud n gk h c c c t h n hc n g , v " s a i " k h i t nc u i uv o . V v y , t r nt r o n g k h i v n gl p c t t c c c d n gt r o n gt pt i n uv ov g i m i d n gv ot pt i n ur a . g e t l i n e ( ) c t r o n gc c n h nv t c a m i d n gc h o nk h i n p h t h i nr a m t d n gm i ( c c k t k t t h c c t h c t h a y i , n h n g i u s k h n gl m t v n c h o nk h i c h n gi o s t r e a ms t r o n gT p2 ) . T u y n h i n , n l o i b c c d n gm i v k h n gl ut r n t r o n gc c k t q u c h u i i t n g . V v y , n uc h n gt a mu nc c t pt i ns a oc h pv ot r n gg i n gn h c c t pt i nn g u n , c h n gt a p h i t h mt r l i x u n gd n gt r o n g , n h c h i nt h . M t v d t h v l s a oc h pt o nb t pt i nt r nv om t c h u i i t n g :


// :C 0 2 :F i l l S t r i n g . c p p // ct o nb m tt pt i nv om tc h u id u yn h t #I n c l u d e #I n c l u d e#i n c l u d e< f s t r e a m >s d n gt nm i nk h n gg i a nt i u c h u n ; i n tm a i n( ){ i f s t r e a mt r o n g( " F i l l S t r i n g . c p p " ) ; s t r i n gs ,d n g , t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) s+=d n g+" \n " ; c o u t< <s ; }/ // :~
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 50/320

08/10/2013

Suy ngh trong C + +, Vol 1

V b nc h t n n g n gc a c h u i s , b nk h n gp h i l ol n gv b a on h i ul ut r c pp h t c h om t c h u i , b n c h c t h t i pt c b s u n g i uv c h u i s t i pt c m r n g g i b t c i ug b n a v on . M t t r o n gn h n g i ut t pv v i c a t o nb m t t pt i nv om t c h u i l c h u i l pc n h i uc h c n n g t mk i mv t h a ot c m s a u s c h op h pb nc h n hs a c c t pt i nn h l m t c h u i d u yn h t . T u yn h i n , i un yc n h n gh nc h c a n . i v i m t i u , n t h n gl t h u nt i n i ut r m t t pt i nn h l m t t ph pc c d n gt h a yv c h l m t ml nc a v nb n . V d , n ub nmu nt h md n gs l d d n gh n n h i un ub nc m i d n gn h m t r i n gb i t c h u i i t n g . t h c h i n i un y , c h n gt i s c nc c ht i p c nk h c .

G i i t h i uv e c t or

V i c h u i , c h n gt a c t h i nv om t c h u i i t n gm k h n gb i t b a on h i ul ut r c h n gt a s c n . V n v i c d n gt m t t pt i nc n h nv oc h u i i t n gl b nk h n gb i t t r c c b a on h i uc h u i s b ns c nb nc h b i t s a uk h i b n c t o nb t pt i n . g i i q u y t v n n y , c h n gt i c nm t s l o i c a c h s t n gm r n g c h a n h i uc h u i c c i t n gn h c h n gt i q u a nt m a v on . T r o n gt h c t , l d ot i s a og i i h nm n h g i c h u i c c i t n g ? Nc h r a r n gc c l o i v n k h n gb i t b a on h i uc a m t c i g b nc t r o n gk h i b n a n gv i t m t c h n gt r n hs x yr a r t n h i u . V " c o n t a i n e r " n y i t n g mt h a n hn h n s h u c hh nn un s g i b t k l o i i t n g t t c ! Ma ym nt h a y , c c t i u c h u nC++T h v i nc m t g i i p h pl ms n : c c l pc o n t a i n e r t i uc h u n . C c l pc o n t a i n e r l m t t r o n g n h n gc n gq u c t h c s c a c h u nC++ . T h n gc m t c h t n h ml ng i a c c c o n t a i n e r v c c t h u t t o nt r o n gc c t i uc h u nC++T h v i n , v c c t h c t h c g i l S T L . S t a n d a r dT e mp l a t e L i b r a r yl t nA l e x S t e p a n o v( n g i a n gl mv i c t i He wl e t t P a c k a r dv ot h i i m ) c s d n gk h i n gt r n hb yt h v i nc a m n hv i C++ yb a nt i c u c h p S a nD i e g o , C a l i f o r n i a v om a x u nn m1 9 9 4 t i uc h u n . T nb m c k t , c b i t l s a uk h i HP q u y t n h l mc h on c s n t i c n gc n g . T r o n gk h i , yb a nt c hh pn v oc c t i uc h u nC++T h v i n , l m c h om t s l n gl nc c t h a y i . P h t t r i nc a S T Lt i pt c S i l i c o nG r a p h i c s ( S G I , x e m h t t p : / / w w w . s g i . c o m / T e c h n o l o g y / S T L) . S G I S T Lp h nk t c c t i uc h u nC++T h v i nt r nn h i u i mt i n ht . V v y , m c d l m t q u a nn i ms a i l mp h b i n , C++t i uc h u nk h n g" b a og m" S T L . Nc t h l m t c h t b i r i v c c c o n t a i n e r v c c t h u t t o nt r o n gc c t i uc h u nC++T h v i nc c n gm t g c ( v t h n gl c n gt n ) n h S G I S T L . T r o n gc u ns c hn y , t i s n i r n g : " C c t i uc h u nC++T h v i n " h a y" t h n gt h v i nc h u n , " h o c m t c i g t n gt v s t r n ht h u t n g " S T L . " M c d v i c t h c h i nc c t i uc h u nC++c o n t a i n e r T h v i nv t h u t t o ns d n gm t s k h i n i mt i nt i n v b oh i m y c h a i c h n gl nt r o n gt p2 c a c u ns c hn y , t h v i nn yc n gc t h l m n hm k h n g b i t n h i uv n . Nr t h u c hm c b nn h t c a c c c o n t a i n e r t i uc h u n , c c v e c t o r , c g i i t h i ut r o n g c h n g un yv s d n gt r o n gs u t c u ns c h . B ns t h yr n gb nc t h l m m t l n gl nc h b n gc c hs d n gn h n g i uc b nc a v c t v k h n gl o l n gv v i c t h c h i nc b n( m t l nn a , m t m c t i uq u a nt r n gc a OOP ) . V b ns h c c n h i uh nv i un yv c c c o n t a i n e r k h c k h i b n t nc c c h n gt h v i nc h u nt r o n gt p2 , c v n h t h a t h n u c h n gt r n hs d n gv e c t o r t r o n gp h n uc a c u ns c hl k h n gc h n hx c n h n gg m t k i n hn g h i m C++ l pt r n hv i ns l m. B ns t h yr n gt r o n gn h i ut r n gh p , v i c s d n gh i nt h yl . C c v e c t o r l ph c l m t m u, c n g h a l n c t h c pd n gc h i uq u v i c c l o i k h c n h a u . C n g h a l , c h n gt a c t h t or a m t v e c t o r c a h n hs , m t v c t c a c o nm os , m t v e c t o r c a c h u i s , v vV c b n , v i m t m ub nc t h t or a m t " l ph c c a b t c i ug . " c h ot r n hb i nd c h c r n gl ps l mv i c v i ( t r o n gt r n gh pn y , n h n gg c c v e c t o r s t c h c ) , b n t t nc a c c l o i mo n gmu nt r o n g" n g o c v u n gg c , " c n g h a l ' < ' v ' > ' . V v y , m t v e c t o r c a c h u i s c n hn g h a v e c t o r < s t r i n g >. K h i b nl m i un y , b nk t t h c v i m t v e c t o r t yb i nm s g i c h c h u i c c i t n g , v b ns n h n c m t t h n g b ol i t c c t r n hb i nd c hn ub nc g n g t b t c t h g v on . T v e c t o r t h h i nk h i n i mv m t " c o n t a i n e r " , c p h i l m t c c h a m i t h v ot r o n gt h n gc h a v c i ut r l i r a k h i c o n t a i n e r . t h m m t y ut h o nt o nm i v oc u i c a m t v e c t , b ns d n gc h c n n gt h n hv i np u s h _ b a c k( ) ( H yn h r n g , k t k h i n l m t . c h c n n gt h n hv i n , b ns d n gm t ' . ' g i n c h om t i t n gc t h . ) L d ot nc a c h c n n gt h n hv i nn yc t h l m t t i t c h t p u s h _ b a c k( ) t h a yv m t c i g ng i nn h " t " l v c c h a k h c v h mt h n hv i nk h c c h ov i c a y ut m i v oc o n t a i n e r . V d , c m t c h n( ) c h c n n gt h n hv i n t m t c i g g i a m t c o n t a i n e r . v e c t o r h t r n yn h n gv i c s d n gn l p h c t ph nv c h n gt i s k h n gc np h i t mh i un c h o nk h i t p2 c a c u ns c h . Ng o i r a c nc m t p u s h _ f r o n t (( k h n gt h u c ) v e c t o r ) a m i t h n g a yt u . C r t n h i uc h c n n gt h n hv i nt r o n gv e c t o r v n h i uh nn a c c t h n gc h a t r o n gc c t i uc h u nC++T h v i n , n h n gb ns n g c n h i nt r c b a on h i ub nc t h l mc h c nb i t v m t v i t n hn n g ng i n . V v y , b nc t h t y ut m i v om t v e c t o r v i p u s h _ b a c k( ) , n h n gl mt h n o b nc c n h n g y ut n ys a ol i k h n g ? G i i p h pn yl t h n gmi n hh nv t h a n hl c hn h i uh n hq u t i c s d n g

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

51/320

08/10/2013

Suy ngh trong C + +, Vol 1

l mc h ov e c t o r t r n gg i n gn h m t m n g . M n g( s c mt h n y t r o n gc h n gk t i p ) l m t l o i d l i uc s nt r o n gh un h t t c c c n g nn g l pt r n h , d o b n n n c p h nn oq u e nt h u c v i n . M n gl t p h p , m c n g h a l h b a og m m t s y ut k t t v i n h a u . c i mp h nb i t c a m t m n gl n h n gy ut n yc c n gk c ht h c v c b t r l m t t r o n g n h n gq u y ns a uk h i k h c . Qu a nt r n gn h t , c c y ut n yc t h c l a c h nb n gc c h" l pc h m c " , c n g h a l b nc t h n i " t i mu ny ut s n " v y ut s c s nx u t , t h n gt h n gm t c c hn h a n h c h n g . M c d c n h n gn g o i l t r o n gn g nn g l pt r n h , c c c h m c c b n ht h n g t c s d n gd u n g o c v u n g , v v yn ub nc m t m n gmt v b nmu nt or a y ut n m, b nn i mt [ 4 ] ( l ur n gc h m c l u nl u nb t ut s k h n g ) . i un yr t n h g nv m n hm c h m c k h i u c k t h pv oc c v e c t o r s d n gt o nt q u t i , g i n g n h ' < <" v " > >" c a v oi o s t r e a ms . M t l nn a , b nk h n gc np h i b i t l mt h n oq u t i c t h c h i n l l ul i c h om t c h n gs a un h n gn r t h u c hn ub nb i t r n gc m t p h pt h u t x yr a t r o n gc h n l mc h o] [ l mv i c v i v e c t o r . V i n g h , b nc t h t h ym t c h n gt r n hs d n gv e c t o r . S d n gv e c t o r , b nb a og mc c t pt i nt i u < v e c t o r >:
// :C 0 2 :F i l l v e c t o r . c p p //S a oc h pt o nb m tt pt i nv om tv e c t o rc ac h u i #I n c l u d e #I n c l u d e #B a og m< f s t r e a m >#b a og m< v e c t o r >s d n gt nm i nk h n g g i a nt i uc h u n ; i n tm a i n( ){ v e c t o r< s t r i n g >v ; i f s t r e a m t r o n g( " F i l l v e c t o r . c p p " ) ; n gd y , t r o n gk h i( g e t l i n e ( t r o n g ,d n g ) ) v . p u s h _ b a c k( l i n e ) ;//T h md n g k tt h c //T h ms d n g : f o r( i n ti=0 ;i< v . s i z e( ) ;i++ ) c o u t< <i< <" : "< <v[ i ]< <e n d l ; }/ // :~

Nh i uc h n gt r n hn yc n gt n gt n h t r c , m t t pt i n c m v d n g c c v oc h u i i t n g c n gm t l c . T u yn h i n , c c c h u i i t n g c yv om t s a uc a v e c t o r v. M t k h i t r o n gk h i v n gl p h o nt h n h , t o nb t pt i n c c t r t r o n gb n h , t r o n gv. C ul n ht i pt h e ot r o n gc h n gt r n h c g i l c h ov n gl p . Nt n gt n h m t t r o n gk h i v n gl pn g o i t r v i c n c h ob i t t h m m t s k i ms o t t h m. S a uk h i c h o, c m t " k i ms o t b i uh i n " b nt r o n gd un g o c n , g i n gn h t r o n gk h i v n gl p . T u yn h i n , b i uh i nn yl k i ms o t t r o n gb a p h n : m t p h nk h i t o , m t t r o n gn h n gb i k i mt r a x e mn uc h n gt a n nt h o t k h i v n gl p , v m t t r o n g t h a y i m t c i g , t h n g b c q u a m t c h u i c c m t h n g . C h n gt r n hn yc h ot h yc h ov n gl pt r o n gc c hb ns t h y n t h n g c s d n gn h t : p h nk h i t oi n t i =0 t or a m t s n g u y ni s d n gn h m t b mv n gl p v c u n gc pc h on m t g i t r b a n ub n gk h n g . P h nk i mt r a n i r n g l i t r o n gv n gl p , t i n n c t h ns p h nt t r o n gv e c t o r v. ( i un y c s nx u t b n gc c hs d n gt h n hv i nc h c n n gk c ht h c ( ) , m t i c h l l o i t r t y , n h n gb np h i t h a n h nn c m t n g h a k h r r n g . ) P h nc u i c n gs d n g m t c c hv i t t t c h oCv C++ , c c " t n gt h n gd " n h i uh n h , t h m m t g i t r c a t i . Hi uq u , i + +n i " c c g i t r c a t i , t h m m t nn , v a k t q u v ot i . Nh v y , h i uq u t n gc a c h ov n g l pl c m t b i ni v d i uh n hq u a c c g i t r t s k h n g nm t n h h nk c ht h c c a v e c t o r . i v i m i g i t r c a t i , c c t a nt u y nb c t h c h i nv i un yx yd n gm t d n gb a og mg i t r c a t i ( k d i uc h u y n i s a n gm t m n gk t c a t a n) , d uh a i c h mv m t k h n gg i a n , c c d n gt t pt i n , v m t d n gm i c u n gc pb i e n d l . K h i b nb i nd c hv c h yn , b ns t h yh i uq u l t h ms d n gv ot p t i n . V c c hm c c ' > >' n h i uh n hl mv i c v i i o s t r e a ms , b nc t h d d n gt h a y i c h n gt r n ht r n n p h v c c uv ot k h o n gt r n gc c hn h a ut h a yv d n g :
// :C 0 2 :G e t W o r d s . c p p //P h v m tt pt i nv ol ik h o n gt r n gp h nc c h #I n c l u d e #I n c l u d e #B a og m< f s t r e a m >#b a og m< v e c t o r >s d n gt nm i nk h n g g i a nt i uc h u n ; i n tm a i n( ){ t v e c t o r< s t r i n g > ; i f s t r e a mt r o n g( " G e t W o r d s . c p p " ) ; c h u i t , t r o n gk h i( t r o n g> >t ) w o r d s . p u s h _ b a c k( w o r d ) ; f o r( i n ti=0 ;i < w o r d s . s i z e( ) ;i++ ) c o u t< <t [ i ]< <e n d l ; }/// :~

B i ut h c t r o n gk h i( t r o n g> >t ) l n h n gg c uv om t " t " t i m t t h i i m, v k h i b i uh i nn y n hg i l " f a l s e " n c n g h a l s


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 52/320

08/10/2013

Suy ngh trong C + +, Vol 1

k t t h c c a t pt i n t t i . T t n h i n , p h nc h i a r a n hg i i t b n gk h o n gt r n gl k h t h , n h n gn l mc h o m t v d ng i n . T r o n gc u ns c hn yb ns t h yv d p h c t ph n , c h op h pb nc h i a t a y uv oc h l v b t k c c hn ob nmu n . c h n gmi n hc c hd d n gl s d n gm t v e c t o r v i b t k l o i , yl m t v d t or a m t < i n t >v e c t o r :


// :C 0 2 :I n t v e c t o r . c p p //T om tv e c t o rc h as n g u y n #I n c l u d e #B a og m< v e c t o r >s d n gt nm i nk h n gg i a nt i uc h u n ; i n tm a i n( ){ v e c t o rv ; f o r( i n ti=0 ;i< 1 0 ;i++ ) v . p u s h _ b a c k( i ) ; f o r( i n ti=0 ;i< v . s i z e( ) ;i++ ) c o u t< <v[ i ] < <" " ; c o u t< <e n d l ; f o r( i n ti=0 ;i< v . s i z e( ) ;i++ ) v[ i ]=v [ i ]*1 0//P h n f o r( i n ti=0 ;i< v . s i z e( ) ;i++ ) c o u t< <v[ i ] < <" , " ; c o u t< <e n d l ; }/// :~

t or a m t v e c t o r c h a m t l o i k h c n h a u , b nc h c n t l o i m t r o n gn h l i s m u( i s t r o n gd u n g o c n h n ) . M uv c t h i t k t h v i nm u a n gd n h c c h n hx c n yd s d n g . V d n yt i pt c t h h i nm t t n hn n gt h i t y uc a v e c t o r . T r o n gb i ut h c v[ i ]=v[ i ]*1 0 ; b nc t h t h yr n gc c v e c t o r k h n gg i i h nc h a m i t h v ov n h n c n h n g i ut r n . B nc n gc k h n n gg n( v d o t h a y i ) c h ob t k y ut c a m t v c t , c n gt h n gq u a v i c s d n gc c d un g o c v u n gn h i uh n hl pc h m c . i un yc n g h a l v c t l m t m c c hc h u n g , l i n hh o t " m" l m v i c v i c c b s ut pc a c c i t n g , v c h n gt i c h c c h ns s d n gn t r o n gc h n gt i .

T mt t

M c c hc a c h n gn yl c h c h ob nc c hd d n gl pt r n hh n g i t n gc t h c n un g i k h c i nv i c x c n hc c i t n gc h ob n . T r o n gt r n gh p , b nb a og m m t t pt i nt i u , t oc c i t n g , v g i t i nn h nc h oh . N uc c l o i b n a n gs d n gl m n hm v t h i t k t t , s a u b ns k h n g p h i l mn h i uc n gv i c v c h n gt r n hk t q u c a b nc n gs c m n hm . T r o n gq u t r n ht h h i ns d d n gc a OOPk h i s d n gc c l ph c t h v i n , c h n gn yc n gg i i t h i um t s l o i c b nv h u c hn h t t r o n gc c t i uc h u nC++t h v i n : c c g i a n hc a i o s t r e a ms ( c b i t l n h n g n g i c t v g h i v og i a od i n i uk h i nv t pt i n ) , c c c h u i l p , v v e c t o r m u . B n t h yc c h n g i nn l s d n gn h n g i un yv b yg i c t h c t h t n gt n gr t n h i u i ub nc t h t h c h i nv i [ 2 6 ] h , n h n gc t h c s l r t n h i un h i uh nl h a n gc k h n n g . M c d c h n gt i s c h c s d n g m t t ph ph nc h c c c h c n n gc a n h n gc n gc n yt r o n gp h n uc a c u ns c h , h v nc u n gc pm t b c t i nl nl nt p r i mi t i v e n e s s c a v i c h c m t n g nn g c pt h pn h C . v t r o n gk h i h c t pt h pk h a c n h c pCl g i od c , n c n gt nt h i g i a n . C u i c n g , b ns c n h i uh nn a h i uq u n ub n c i t n g q u nl c c v n m c t h p . S a uk h i t t c , t o nb i mc a OOPl nc c c h i t i t b nc t h " v b n gb nc h i l nh n . " T u yn h i n , n h c pc a on h OOPc g n g c , c m t s k h a c n hc b nc a Cm b nk h n gt h t r n h c b i t , v c h n gs c b a og mt r o n gc c c h n gt i pt h e o .

B i t p
1. 2.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t h t t p : / / www. B r u c e E c k e l . c o m

S a i h e l l o . c p p n i nr a t nv t u i c a b n( h o c k c hc g i y , h a yt u i t c c a c o nc h , n um l mc h ob nc mt h yt t h n ) . B i nd c hv c h yc h n gt r n h . S d n gS t r e a m2 . c p pv Nu mc o n v . c p pn h h n gd n , t or a m t c h n gt r n hm y uc ub nk n h c a m t v n gt r nv i nr a c c k h uv c v n gt r n . B nc h c t h s d n g" * " v nh n hb n h p h n gb nk n h . n gc g n g i nr a c c g i t r n h b t p h nh o c h e x ( n h n gc h l mv i c v i c c l o i t c hr i ) . T om t c h n gt r n hm m t t pt i nv mt k h o n gt r n gc c hn h a ut r o n gt pt i n . T om t c h n gt r n h ms x u t h i nc a m t t n o t r o n gm t t pt i n( s d n gc h u i l p' i u h n h ' = =' t mc c t ) . T h a y i F i l l v e c t o r . c p p n i nd n g( n g c ) t c u i c n g l n ut i n . T h a y i F i l l v e c t o r . c p p n m c n i t t c c c t h n hp h nt r o n gv e c t o r t h n hm t c h u i d u yn h t t r c k h i i nn r a , n h n gk h n gc g n gt h ms d n g . h i nt h m t t pt i nm t d n gt i m t t h i g i a n , c h i n g i d n gn h np h m" E n t e r " s a um i d n g . T om t < f l o a t >v e c t o r v t 2 5 s d uc h m n gv on b n gc c hs d n gc h ov n gl p . Hi nt h


53/320

3. 4. 5. 6. 7. 8.

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

9. 10.

c c v e c t o r . T ob a < f l o a t >v e c t o r i t n gv i nv oc c ut i nh a i n h t r o n gb i t pt r c . V i t c h ov n g l pc h ob i t t h mr n gm i p h nt t n g n gt r o n gl n ut i nh a i v e c t o r s v t k t q u t r o n gc c y ut t n g n gc a b a v e c t o r . Hi nt h t t c b a v e c t o r s . T om t < f l o a t >v e c t o r v a 2 5 c o ns n yv on n h t r o n gc c b i t pt r c . B yg i v u n gm i s v t k t q u v oc n gm t v t r t r o n gc c v e c t o r . Hi nt h c c v c t t r c v s a uk h i n h n .

N ub nc h a b a og i t h yCt r c , c h n gn ys c u n gc pc h ob nm t n nt n gp h o n gn h a t r o n gp h o n gc c h c a C c s d n gt r o n gC++ . N ub n q u e nt h u c v i p h o n gc c hc a C c mt t r o n g nb n ut i n c a K e r n i g h a nv R i t c h i e ( t h n g c g i l K&RC ) , b ns t mt h ym t s t n hn n gm i v k h c n h a u t r o n gC++c n gn h t r o n gt i uc h u nC . N ub n q u e nt h u c v i t i uc h u nC , b nn n c l t q u a c h n g n yt mk i mc c t n hn n g c b i t l C++ . L ur n gc m t s n nt n gC++ , t n hn n gg i i t h i u y , l n h n gt n gc b nl t n gt n h c c t n hn n gt r o n gCh o c t h n gx u y nt h a y i c c hm Cl mn h n g v i c . T i n hv i h nC++ , t n hn n gn ys k h n g c g i i t h i u nc c c h n gs a u . C h n gn yl m t v n gp h s n gk h n h a n hc a Cc ut r c v g i i t h i um t s c b nC++x yd n g , v i s h i ub i t r n gb n c m t s k i n hn g h i ml pt r n hb n gn g nn g k h c . M t g i i t h i un h n h n gh n C c t mt h yt r o n gc c a C DR OM n gg i m t s a uc a c u ns c hn y , c t a t d u y t r o n g C : C s J a v a v C++b i C h u c kA l l i s o n( c x u t b nb i Mi n d V i e w, I n c , v c n gc s nt i www. Mi n d V i e w. n e t ) . yl m t h i t h ot r nm t a C DR OM v i m c t i uc a b ns u yx t t h nt r n gt h n gq u a c c n g u y nt c c b nc a n g nn g C . Nt pt r u n gv on h n gk i nt h c c nt h i t c h ob n c t h c h u y ns a n gC++h o c c c n g nn g J a v a h nl c g n g l mc h ob nm t c h u y ng i a t r o n gt t c n h n gg c t i c a C( m t t r o n gn h n gl d oc h ov i c s d n gm t n g nn g c pc a oh nn h C++h a yJ a v a l c h n hx c c h n gt i c t h t r n h c r t n h i un h n gg c t i ) . Nc n gc h a c c b i t pv c c g i i p h p h n gd n . H yn h r n gb i v c h n gn yv t q u t d u y t r o n g CC D , a C Dk h n gp h i l m t t h a yt h c h o c h n gn y , n h n gn n c s d n gt h a yv c h u nb c h oc h n gn yv c h oc u ns c h .

T oc h cn n g

T r o n gc ( t r c t i uc h u n ) C , b nc t h g i m t h mv i b t k s l n gc a k i ut h a ms v t r n hb i nd c hs k h n gp h nn n . T t c m i t h d n gn h t t c h o nk h i b nc h yc h n gt r n h . B nn h n c k t q u b n( h o c t h n , c c c h n gt r n hb r i ) k h n gc g i l t i s a o . T h i us g i p v i l pl u n i q u a v c c l i b nm k t q u c t h l m t l d ot i s a oC c m n hd a n hl m t " h i n gn g nn g c pc a o . " L pt r n hCt r c t i uc h u nc h t h c hn g h i v i n . T i uc h u nCv C++s d n gm t t n hn n gg i l c h c n n g t o m u. V i c h c n n gt om u , b np h i s d n gm t mt c a c c l o i i s k h i k h a i b ov x c n hm t c h c n n g . Mt yl " n g u y nm u " . K h i h m c g i , t r n hb i nd c hs d n gc c m ut h n g h i m mb or n gc c i s t h c hh p c t h n gq u a t i v g i t r t r v c x l m t c c hc h n hx c . N uc c l pt r n hv i nl mc h om t s a i l mk h i g i c h c n n g , t r n hb i nd c hb t l i .

V c b n , b n h c v c h c n n gt om u( k h n g t t nn h v y ) t r o n gc c c h n gt r c , k t k h i h n ht h c k h a i b oh mt r o n gC++ i h i m ut h c hh p . T r o n gm t m ut h n g h i mc h c n n g , d a n hs c h i s c c h a c c l o i i s p h i c t h n gq u av i c h c n n gv ( t yc h nc h ov i c k k h a i ) n hd a n hc h oc c i s . T r n h t , k i uc ac c i s p h i p h h pt r o n gk h a i b o , n hn g h a , v g i c h c n n g . D i yl m t v d v m t n g u y nm uc h c n n gt r o n gm t t u y nb : i n td c h( f l o a tx ,f l o a ty ,f l o a tz ) ; B nk h n gs d n gc c h n ht h c t n gt k h i k h a i b ob i nt r o n gn g u y nm uc h c n n gn h b nl mt r o n g n h n g h ab i nb n ht h n g . C n g h al , b nk h n gt h n i : n i x , y , z. B np h i c h r al o i t n g i s . T r o n gm t t u y nb c h c n n g , c c h n ht h c s a u yc n gl c h pn h n c : i n td c h( p h a o ,p h a o ,p h a o ) ; K t k h i t r n hb i nd c hk h n gl mb t c i ug n h n gk i mt r a c c l o i k h i h m c g i , c c n hd a n hc h b a og mc h or r n gk h i m t n g i n o c m . T r o n g n hn g h a c h c n n g , t n c y uc ub i v c c i s c t h a mc h i ut r o n gc c c h c n n g :
i n td c h( f l o a tx ,f l o a ty ,f l o a tz ){
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

x=y=z ;

//. . .
54/320

08/10/2013

Suy ngh trong C + +, Vol 1

Nq u a yr a q u y n hn yc h pd n gc h oC . T r o n gC++ , m t c u c t r a n hl u nc t h c h a c t t nt r o n g d a n hs c h i s c a n hn g h a h m. V n l v d a n h , b nk h n gt h s d n gn t r o n gc c c q u a nc h c n n g , t t n h i n . L pl u nv d a n h c p h pc u n gc pc h oc c l pt r n hv i nm t c c h " k h n gg i a nd t r t r o n g d a n hs c h i s . " B t c a i s d n gc c c h c n n gv np h i g i h mv i c c i s t h c hh p . T u yn h i n , n h n g n g i t or a c c c h c n n gs a u c t h d n gt h a ms t r o n gt n gl a i m k h n gb u c s a i m m c c c u c g i c h c n n g . T yc h nn yb q u a m t i s t r o n gd a n hs c hn yc n gc t h n ub n l i t nt r o n g , n h n g b ns n h n c m t t h n gb ol i g yp h i nn h i uv g i t r c h a s d n gm i k h i b nb i nd c hc c c h c n n g . L i c n hb o c l o i b n ub nl o i b t n . Cv C++c h a i c c hk h c k h a i b om t d a n hs c h i s . N ub nc m t d a n hs c h i s r n g , b nc t h k h a i b on n h c h c n n g( ) t r o n gC++ , m n i v i t r n hb i nd c hc n h n gl pl u nc h n hx c k h n g . B n n nb i t r n g i un yc h c n g h a l m t d a n hs c h i s r n gt r o n gC++ . T r o n gCn c n g h a l " m t s l n gk h n gx c n hc c t h a ms ( m l m t " l h n g" t r o n gCv n v h i uh a v i c k i mt r a t r o n gt r n gh p l o i ) . T r o n gc Cv C++ , v i c k k h a i c h c n n g( v o i d ) c n g h a l m t i s r n g; d a n hs c h . C c k h o n gt r n gt k h a c n g h a l " k h n gc g " t r o n gt r n gh pn y( n c n gc t h c n g h a l " k h n gc l o i " t r o n gt r n gh pc a c o nt r , n h b ns t h ys a ut r o n gc h n gn y ) . C c t yc h nk h c c h od a n hs c h i s x yr a k h i b nk h n gb i t b a on h i u i s h o c k i uc a c c i s b n s c , i un y c g i l d a n h s c h i s b i n. N y" d a n hs c h i s k h n gc h c c h n " c i d i nb i e l i p( . . . ) . X c n hm t c h c n n gv i m t d a n hs c h i s b i nl n h i uh n n gk p h c t ph nv i c x c n hm t c h c n n gt h n gx u y n . B nc t h s d n gm t d a n hs c h i s b i nc h om t h mc m t t pc n hc a c c i s n u( v l d on o ) b nmu nv h i uh a v i c k i mt r a l i c a c h c n n gt om u . B i v i un y , b n n nh nc h v i c s d n gd a n hs c h i s b i nCv t r n hc h oh t r o n gC++( t r o n g , n h b ns h c , c l a c h nt h a yt h t t h nn h i u ) . X l d a n hs c h i s b i n c mt t r o n gp h nt h v i nc a h n gd nCt i a p h n g .

G i t r t r l i c h cn n g

M t h m C++n g u y nm up h i x c n hc c l o i g i t r t r v c a h m( t r o n gC , n ub nb r a c c l o i g i t r t r v n m c n hl i n t ) . c t k i ut r v i t r c t nh m. x c n hr n gk h n gc g i t r c t r v , s d n g c c k h o n gt r n gt k h a . i un ys t or a m t l i n ub nc g n g t r v m t g i t r t h m. D i yl m t s n g u y nm uc h c n n gh o nc h n h :

i n tf 1( v o i d ) ;//T r v m ts n g u y n ,k h n gc is i n tf 2( ) ;//G i n gn h f 1( )t r o n gC+ +n h n gk h n gt r o n gt i uc h u nC !f 3n i( f l o a t ,i n t ,c h a r ,d o u b l e ) ;//T r v m tp h a ot r n gf 4 ( v o i d ) ;// ak h n gc is ,l in h u nk h n gc g

t r v m t g i t r t m t h m, b ns d n gt r l i t u y nb . t r l i t h o t r a k h i c h c n n gq u a yt r l i i m n g a ys a uk h i c c c u c g i c h c n n g . N ut r l i c m t c u c t r a n hl u n , l pl u nr n gt r t h n hg i t r t r v c a h m. N um t c h c n n gn i r n gn s t r v m t l o i h n hc t h , s a u m i t r l i t u y nb p h i t r v k i u . B nc t h c n h i uh nm t t r l i t u y nb t r o n gm t n hn g h a c h c n n g :
// :C 0 3 :R e t u r n . c p p //S d n g" t r l i "#i n c l u d eu s i n gn a m e s p a c es t d ; c h a rc f u n c( i n ti ){ i f( i= =0 ) t r v ' m t ' ; i f ( i= =1 ) t r l i' g ' ; i f( i= =5 ) t r l i' z ' ; t r l i' c ' ; } i n tm a i n( ){ c o u t< <" l o im ts n g u y n : " ; i n tv a l ; v a l ; c o u t< <c f u n c( v a l )< <e n d l ; }/// :~

c i n> >

T r o n gc f u n c ( ) , l n g i ut i nn u n hg i t h c s t h o t r a k h i c h c n n gt h n gq u a t r l i t u y n b . C h r n gm t c h c n n gk h a i b ol k h n gc nt h i t b i v n hn g h a c h c n n gx u t h i nt r c k h i n c s d n gt r o n gma i n( ) , n nt r n hb i nd c hb i t v n t n hn g h a c h c n n g .

B n gc c hs d n gc h cn n gt h v i nC
T t c c c c h c n n gt r o n gt h v i nCc h c n n g a p h n gc a b nc s nt r o n gk h i b n a n gl pt r n ht r o n gC ++ . B nn nn h nc n g t h v i nc h c n n gt r c k h i x c n hc h c n n gc a r i n gb nc m t c h i t t m a i g i i q u y t v n c a b nc h ob n , v c l c h on r t n h i us u yn g h v g l i . M t l i c n hb o , m c d : n h i ut r n hb i nd c hb a og m m t s c h c n n gb s u n gm l mc h oc u c s n gd d n gh nv h pd n s d n g , n h n gk h n gp h i l m t p h nc a t h v i nCc h u n . N ub nc h c c h nb ns k h n gb a og i mu nd i c h u y nc c n gd n gs a n gn nt n gk h c ( v n h n gn g i c h c c h nv i u ? ) , i t r c s d n gn h n gc h c n n gv l mc h oc u c s n gc a b nd d n gh n . N ub nmu n n gd n gc a b n c c mt a y , b nn ng i i h nm n hv oc c c h c n n gt h v i nc h u n . N ub np h i t h c h i nc c h o t n g n nt n gc t h , c g n gc l pm t r o n gc n gm t c h n c t h c t h a y i d d n gk h i p o r t i n gs a n gn n t n gk h c . T r o n gC++ , c c h o t n gn nt n gc t h t h n g c n gg i t r o n gm t l ph c , l g i i p h p l t n g .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 55/320

08/10/2013

Suy ngh trong C + +, Vol 1

C n gt h c s d n gm t t h v i nc h c n n gn h s a u : ut i n , t mt h yc h c n n gt r o n gt i l i ut h a mk h o c h n gt r n hc a b n( n h i ut i l i ut h a mk h oc h n gt r n hs c h s c h c n n gt h e ot h l o i c n gn h t h e ob n g c h c i ) . C c mt v c h c n n gn nb a og m m t p h nt h h i nc p h pc a m . T r nc n gc a p h nn y t h n gc t n h t m t #b a og m d n g , h i nt h c h ob nc c t pt i nt i u c c h a c c m ut h n g h i mc h c n n g . B ns a on y#b a og m d n gt r o n gt pt i nc a b n c c h m c k h a i b o n g . B yg i b nc t h g i c h c n n gt r o n gc n gm t c c hn x u t h i nt r o n gp h nc p h p . N ub nl ml i , t r n hb i nd c hs p h t h i n r a n b n gc c hs os n hc u c g i c h c n n gc a b n c c m ut h n g h i mc h c n n gt r o n gt i u v c h ob n b i t v l i c a b n . M i l i nk t t mk i mc c t h v i nt i uc h u nt h e om c n h , v v y l t t c c c b nc n l m: b a og mc c t pt i nv g i h m.

T oc ct h v i nr i n gc ab nv i c ct h v i n

K i ms o t t h ch i n

B nc t h t h ut h pc c c h c n n gc a r i n gb nv i n h a ut h n hm t t h v i n . H uh t c c g i l pt r n h i k m v i m t t h v i n q u nl n h mc a m u n i t n g . M i t h v i nc l n hc a r i n gn , n h n gt n g c h u n gl : n ub nmu nt or a m t t h v i n , t om t t pt i nt i u c c h a c c n g u y nm uc h c n n gc h ot t c c c c h c n n gt r o n gt h v i nc a b n . t t pt i nt i u n y u t r o n g n gd nt mk i mc a t i nx l , h o c l t r o n gt h m c a p h n g( n c t h c t mt h yb n g#i n c l u d e " T i u " ) h o c t r o n gc c t h m c b a og m( v v yn c t h c t mt h yb n gc c h#b a og m < h e a d e r >) . B yg i l yt t c c c m u n i t n gv g i a oc h oc nb t h v i nc n gv i m t t nc h ot h v i nt h n h( h uh t c nb t h v i ny uc um t p h nm r n gp h b i n , c h n gh nn h l i b . h o c mt . ) . t c c t h v i nt h n hn i t h v i nk h c c t r m i l i nk t c t h t mt h yn . K h i b ns d n gt h v i nc a b n , b ns c t h m m t c i g c c d n gl n h m i l i nk t b i t t mk i mt h v i nc h oc c c h c n n gb ng i . B np h i t mt h yt t c c c c h i t i t t r o n gs c hh n gd n a p h n gc a b n , v h k h c n h a ut h t h n g h t h n g . P h nn yb a og mc c b oc ok i ms o t t h c h i nt r o n gC++ . B np h i l mq u e nv i c c b oc ot r c k h i b n c t h c v v i t Ch o c C++ . C++s d n gt t c c c b oc ok i ms o t t h c h i nC . C h n gb a og mi f e l s e , t r o n gk h i , l m, t r o n gk h i , c h o, v m t t u y nb l a c h n c g i l c h u y n i . C++c n gc h op h pn g i n i t i n gg o t o, s t r n h c t r o n gc u ns c hn y .

n gv s a i
T t c c c b oc oc i uk i ns d n gs t h t h a yd i t r c a m t b i ut h c i uk i n x c n hc o n n g t h c h i n . M t v d c a m t b i ut h c i uk i nl A= =Bn ys d n gc c n h i uh n hc i uk i n . = = x e mc c b i nMt t n g n gv i b i nB . C c b i uh i ns nx u t m t B o o l e a n n gh a ys a i ( yl n h n gt k h a c h t r o n gC++ , t r o n gCm t b i ut h c l " t r u e " n un n hg i m t g i t r k h c ) . C c n h k h a i t h c c i uk i nk h c >, <, >=, v vb oc oc i uk i n c b oh i m y h ns a ut r o n gc h n gn y .

n u k h c

C c n u k h c t u y nb c t h t nt i t r o n gh a i h n ht h c : c h o c k h n gc k h c . Ha i h n ht h c l :
t u y nb

i f(b i uh i n)

h o c
i f(b i uh i n) t u y nb k h c t u y nb

C c " b i uh i n " n hg i n gh o c s a i . C c " t u y nb " c n g h a l m t t u y nb ng i nk t t h c b n gm t d uc h mp h yh o c m t t u y nb h pc h t , m l m t n h mc c c ul n h ng i nk mt h e ot r o n gd un g o c . B t c l c n ot " t u y nb " c s d n g , n l u nl u nh m r n gt u y nb l ng i nh a yp h c h p . L u r n gt u y nb n yc n gc t h l m t n u, h c t h c k t h pv i n h a u .


// :C 0 3 :I f t h e n . c p p //C h n gm i n hn uv i uk i ni f e l s e #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n ti ; c o u t< <" l o im ts v ' E n t e r ' "< <e n d l ; c i n> >i ; i f ( i >5 ) c o u t< <" N l nh n5 "< <e n d l ; k h c n u( i< 5 ) c o u t< <" l th n5 "< <e n d l ; k h c c o u t< <" l b n g5 "< <e n d l ; c o u t< <" l o im ts v ' E n t e r ' "< <e n d l ; c i n> >i ; i f( i< 1 0 ) i f( i >5 ) / /" n u "c h l m tt u y nb c o u t< <" 5< i<1 0" < <e n d l ; k h c c o u t< <" i < =5 "< <e n d l ; e l s e//q u c ct r n u" n u( i< 1 0 ) " c o u t< <" i >=1 0 "< <e n d l ; } /// :~

l t h n gt h n g t h t v oc t h c a m t t u y nb k i ms o t d n gc h y n g i c c t h d d n gx c [ 2 7 ] n hn i n b t uv k t t h c .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 56/320

08/10/2013

Suy ngh trong C + +, Vol 1

t r o n gk h i
t r o n gk h i , l m, t r o n gk h i , v k i ms o t v n gl p . M t t u y nb l p i l pl i c h o nk h i b i ut h c k i m s o t n hg i s a i . D i h n ht h c m t t r o n gk h i v n gl pl
t r o n gk h i(b i uh i n) t u y nb

B i ut h c c n hg i m t l nv o uv n gl pv m t l nn a t r c k h i m i l nl pt i pt c b oc ok t q u . V d n yv nt nt i t r o n gc t h c a t r o n gk h i v n gl pc h o nk h i b nn h ps b m t h o c b oc h k i ms o t C .
// :C 0 3 :G u e s s . c p p // o nm ts ( t h h i n" t r o n gk h i " ) #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n tb m t=1 5 ; i n t o n=0 ; //" = "L " k h n gb n h n g "c i uk i n : t r o n gk h i( ! o nb m t= ){ //H pc h tt u y nb o n ; } c o u t< <" B n o nn ! "< <E n d l ; }/// :~

c o u t< <" o ns : " ;

c i n> >

C c t r o n gk h i a n gb i ut h c i uk i nl k h n gg i i h nt r o n gm t t h n g h i m ng i nn h t r o n gv d t r n , n c t h p h c t pn h b nt h c hmi nl n t or a m t s t h t h o c s a i k t q u . T h mc h b ns t h ym n i v n gl pk h n gc c t h , c h l m t d uc h mp h yt r n :
t r o n gk h i( /*D or tn h i u y*/ ) ;

d o wh i l e
l m

T r o n gn h n gt r n gh pn y , c c l pt r n hv i n v i t n h n gb i ut h c i uk i nk h n gc h t h c h i nc c t h n g h i mn h n gc n g l mv i c . H n ht h c l mt r o n gk h i l
b oc ot r o n gk h i(b i uh i n) ;

C c d o t r o n gk h i k h c v i t h i g i a nv c c t u y nb l u nl u nt h c h i n t n h t m t l n , n g a yc k h i b i ut h c c l n gs a i l n ut i n . T r o n gm t t h n gx u y nt r o n gk h i , n u i uk i nl s a i l n ut i nt u y nb k h n g b a og i t h c h i n . N um t d o t r o n gk h i c s d n gt r o n gGu e s s . c p p, b i n o nk h n gc nm t g i t r g i b a n u , k t k h i n c k h i t ob i c i nt u y nb t r c k h i n c k i mt r a :
// :C 0 3 :G u e s s 2 . c p p //C h n gt r n h o ns d n gt r o n gk h il m #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n tb m t=1 5 ; i n t o n ;//K h n gc k h i uc nt h i t y k h n g{ c o u t< <" o ns : " ; c i n> > o n ;//K h ix yr a } t r o n gk h i( o n=b m t ! ) ; c o u t< <" B n n h nn "< <E n d l ; }// / :~

i v i m t s l d o , h uh t c c l pt r n hv i nc x uh n gt r n hl mt r o n gk h i v c h l mv i c v i t h i g i a n.

c h o
M t c h ov n gl pt h c h i nk h i t ot r c k h i p h i n ut i n . S a u n t h c h i nk i mt r a i uk i n , v oc u i m i l nl p , m t s h n ht h c H n ht h c c a " b c i . " c h ov n gl pl : f o r(k h it o,c i uk i n;b c)
t u y nb

B t k c a c c b i ut h c k h i t o , c i uk i n , h o c b c c t h t r n g . C c k h i t o m t h c t h i m t l nn g a yt u . C c i uk i n c k i mt r a t r c m i l nl p( n un n hg i s a i n g a yt u , t u y nb k h n gb a og i t h c h i n ) . c u i m i v n gl p , c c b c t h c h i n . c h ov n gt h n g c s d n g " m" n h i mv :
// :C 0 3 :C h a r l i s t . c p p //H i nt h t tc c ck t A S C I I //T h h i n" c h o "#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ f o r( i n ti=0 ;i< 1 2 8 ;i=i+1 ) m nh n h c o u t< <" g i t r : "< <i < <" N h nv t : "
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

n u( i=2 6 )

//A N S Ig aC l e a r

57/320

08/10/2013

Suy ngh trong C + +, Vol 1

< <C h a r( i )//L o ic h u y n i < <E n d l ; }/// :~

B nc t h n h nt h yr n gc c b i ni c x c n hv ot h i i m m n c s d n g , t h a yv uc a k h i k h i um x o nc p' { ' . i un yt r i n g c v i c c n g nn g t h t c t r u y nt h n g( b a og mc C ) , t r o n g y u c ut t c c c b i nt h c x c n hv ol c b t uc a k h i . i un ys c t h ol u ns a ut r o n gc h n gn y .

S p h v v t i pt ct k h a
B nt r o n gc t h c a b t k c a c c c ut r c v n gl pt r o n gk h i , l m, t r o n gk h i , h o c c h o, b nc t h k i ms o t d n gc h yc a c c v n gl ps d n gp h v v t i pt c . p h b v n gl pm k h n gt h c h i np h nc nl i c a c u l n ht r o n gv n gl p . t i pt c d n gv i c t h c h i nc a p h i nh i nt i v q u a yt r l i uv n gl p b t um t c h uk m i . Nh m t v d v p h v v t i pt c , c h n gt r n hn yl m t h t h n gme n ur t ng i n :
// :C 0 3 :M e n u . c p p //C h n gt r n h n ng i nc h n gm i n h //S d n g" p h v "v " t i pt c " #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ c h a rc ;// g i p h n n g w h i l e( t r u e ){ c o u t< <" M E N U C H N H : "< <e n d l ; c o u t< <" l :t r i ,r :p h i ,q :b t h u cl > " ; c i n> >c ; i f( c= =' q ' ) b r e a k ;//T r o n gs " t r o n gk h i( 1 ) " n u( c= =' l ' ){ c o u t< <" t r iM E N U : "< <e n d l ; c o u t< <" c h nm th o cb : " ; c i n> >c ; i f( c= =' a ' ){ c o u t< <" b n c h n' a ' "< <e n d l ; t i pt c ;//Q u a y l im e n uc h n h } i f( c= =' b ' ){ c o u t< <" b n c h n' b ' "< <e n d l ; t i pt c ;//Q u a yl im e n uc h n h } e l s e{ c o u t< <" b n k h n gc h nm th o cb ! " < <E n d l ; t i pt c ;//Q u a yl im e n uc h n h } } i f( c= =' r ' ){ c o u t< <" Q U Y NM E N U : "< <e n d l ; c o u t< <" c h nc ,d : " ; c i n> >c ; i f( c= =' c ' ){ c o u t< <" b n c h n' c ' "< <e n d l ; t i pt c ;//Q u a yl im e n uc h n h } i f( c= =' d ' ){ c o u t< <" b n c h n ' d ' "< <e n d l ; t i pt c ;//Q u a yl im e n uc h n h } e l s e{ c o u t< <" b n k h n gc h nc ,d ! " < <E n d l ; t i pt c ;//Q u a yl im e n uc h n h } } c o u t< <" b np h ig lh o crh o cq ! "< <E n d l ; } c o u t< <" b n. . . "< <E n d l ; }/// :~

N un g i s d n gc h n' q ' t r o n gme n uc h n h , n g h t k h a c s d n g b t h u c l , n uk h n gc h n gt r n h c h t i pt c t h c h i nv t h i h n . S a um i l a c h nt r n h np h , c c c o n t i n u e t k h a c s d n g b t t r l i l n n uv n gl pwh i l e . C c t r o n gk h i ( n g ) t u y nb l t n g n gv i n i " l mv n gl pn ym i m i . " C c n g h t u y nb c h op h p b n t h o t r a k h i v n gl pv h nt r o n gk h i k h i n g i d n gm t " q " .

c h u y n i

M t c h u y n i t u y nb l a c h nt r o n gs c c o nm d a t r ng i t r c a m t b i ut h c t c hp h n . H n ht h c c a n l :

s w i t c h ( s e l e c t o r ){ c a s ei n t e g r a l v a l u e 1:s t a t e m e n t ;b r e a k ; c a s ei n t e g r a l v a l u e 2:s t a t e m e n t ;b r e a k ; c a s ei n t e g r a l v a l u e 3:s t a t e m e n t ;b r e a k ; c a s e i n t e g r a l v a l u e 4:s t a t e m e n t ;b r e a k ; c a s ei n t e g r a l v a l u e 5:s t a t e m e n t ;b r e a k ; ( . . . )m c n h :t u y nb ;}

C h nl m t b i ut h c t or a m t g i t r t c hp h n . C c c h u y n i s os n hk t q u c a c h nc h om i g i t r t h i u. N un t mt h ym t t r n u , b oc ok t q u t n g n g( ng i nh o c h pc h t ) t h c h i n . N uk h n gc t r n ux yr a , mc n ht u y nb t h c h i n . B ns n h nt h yt r o n g n hn g h a t r nm i t r n gh pk t t h c v i m t p h v , g yr a t h c h i n c h u y n n p h nc u i c a c h u y n i c t h ( c c d un g o c n gm h o nt h n hc h u y n i ) . yl c c ht h n gt h n g x yd n gm t c h u y n i t u y nb , n h n gn g h n g i l t yc h n . N uk h n gc , b nt r n gh p" g i mt h n g q u a " c h om t s a uk h i n . l , m s a ut r n gh pb oc ot h c h i nc h o nk h i n g h l g pp h i . M c d b n t h n gk h n gmu nl o i h n hv i n y , n c t h h u c hc h om t l pt r n hv i nc k i n hn g h i m. C c c h u y n i t u y nb l m t c c hs c h t h c h i nl a c h n a c h i u( v d , c c hc h nt t r o n gs c c c o n n gt h c h i nk h c n h a u ) , n h n gn i h i m t c h n n hg i m t g i t r t h t h i ut i t h i g i a nb i n d c h . N ub nmu ns d n g , v d , m t c h u i i t n gn h m t c h n , n s k h n gl mv i c t r o n gm t c h u y n


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 58/320

08/10/2013

Suy ngh trong C + +, Vol 1

i t u y nb . i v i m t c h u i c h n , t h a yv o b np h i s d n gm t l o t c c n ub oc ov s os n hc c c h u i t r o n gc c i uk i n . V d t h c nh i nt h t r nl m t v d c b i t t t pc a m t c h u y n i :
// :C 0 3 :M e n u 2 . c p p /M tm e n u/s d n gm tt u y nb c h u y n #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ b o o lb =f a l s e ; //G nb t r o n gk h i( b = =f a l s e ){ c o u t< <" S e l e c ta ,b ,c ,q t h o t : " ; p n gc h a r ; c i n> >p h n n g , c h u y n i( p h n n g ){ t r n gh p' a ' :c o u t< <" b n c h n' a ' "< <e n d l ; p h v ; t r n gh p' b ' :c o u t< <" b n c h n' b ' "< <e n d l ; b r e a k ; t r n gh p' c ' :c o u t< <" b n c h n' c ' "< <e n d l ; b r e a k ; t r n g h p' q ' :c o u t< <" b m e n u "< <e n d l ; b =t r u e ; b r e a k ; m c n h :c o u t< <" X i nv u il n gs d n ga ,b ,c ,q " < <E n d l ; } } }/// :~

C c b t h u c l c l m t b o o l , v i t t t c a " B o o l e a n " , m l m t l o i b ns t mt h yc h t r o n gC++ . Nc h c t h c c c g i t r t k h a n gh o c s a i . L a c h n' q ' t b t h u c l c n g. T r o n gt h i g i a nt i c h n c n h g i , b = =f a l s e t r s a i c t h c a t r o n gk h i k h n gt h c h i n .

S d n gv l m d n gg o t o
C c g o t ot k h a c h t r t r o n gC++ , v n t nt i t r o n gC . S d n gg o t ot h n g c c o i l p h o n gc c hl p t r n hn g i n g h o , v h uh t t h i g i a nn c . B t c l c n ob ns d n gg o t o, n h nv om c a b nv x e m n uc m t c c hk h c l m i u . i k h i , b nc t h k h mp h g o t oc t h g i i q u y t m t v n m k h n g t h c g i i q u y t b n gc c hk h c n h n gv nc n , h yx e mx t n m t c c hc nt h n . D i yl m t v d m c t h l mc h om t n gc v i n n gt i nc y :
// :C 0 3 :g o t o K e y w o r d . c p p //C cg o t on it i n g ch t r t r o n gC++ #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ d iv a l=0 ; f o r( i n ti=1 ;i< 1 0 0 0 ;i++ ){ j=1 ;j< 1 0 0 ;j=1 0 ){ v a l=i*j ; i f( v a l>4 7 0 0 0 ) g o t od i ; //B r e a ks c h i nb nn g o i' c h o ' } } d i ://N h n c o u t< <v a l< <e n d l ; }/// :~

f o r( i n t

V i c t h a yt h s l t h i t l pm t B o o l e a n c t h n g h i mb nn g o i c h ov n gl p , v s a u l mp h v t b n t r o n gv n gl p . T u yn h i n , n ub nc n h i uc p c h oh a yt r o n gk h i i un yc t h c k h x .

q u y

q u yl m t k t h u t l pt r n ht h v v h u c hm i k h i b ng i c h c n n gm b n a n gi nT t n h i n , n u i un yl t t c c c b nl mt h , b ns t i pt c k ug i c c c h c n n gb n a n g t r o n gc h o nk h i b nc h yr a k h i b n h , d o , p h i c m t s c c h " c h m y " c u c g i q u y . T r o n gv d s a u , i un y" c h m y " [ 2 8 ] c t h c h i nb n gc c h ng i nn i r n g q u ys c h i c h o nk h i c o nm ov t q u ' Z ' :

// :C 0 3 :C a t s I n H a t s . c p p //C u cb i ut n h ng i nc a q u y #I n c l u d eu s i n gn a m e s p a c es t d ; k h o n gt r n gr e m o v e H a t( c h a rm o ){ f o r( c h a rc=' A ' ;c< m o ;c ) c o u t< <" " ; i f( m o< =' Z ' ){ c o u t< <" m o "< <m o< <e n d l; r e m o v e H a t( m o+ 1 ) ;// q u yg i }E l s e c o u t< <" V O O M ! "< <E n d l ; } i n tm a i n( ){ r e m o v e H a t( ' A ' ) ; }/// :~

T r o n gr e mo v e Ha t ( ) , b nc t h t h yr n gmi nl c o nm on h h n' Z ' , r e mo v e Ha t ( ) s c g i t t r o n g r e mo v e Ha t ( ) , d o n hh n g nc c q u y . M i l nr e mo v e Ha t ( ) c g i , n i s l m t t r o n gl nh nh i nt i c o nm o t r a n hl u nt i pt c t n g .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 59/320

08/10/2013

Suy ngh trong C + +, Vol 1

q u yt h n g c s d n gk h i n hg i m t s l o i v n t p h c t p , k t k h i b nk h n gb g i i h nm t " k c ht h c " c b i t c h oc c g i i p h pc c c h c n n gc h c t h g i r e c u r s i n gc h o nk h i n t nk t t h c c a v n .

G i i t h i uv c cn h k h a i t h c

B nc t h n g h r n gc c n h k h a i t h c n h m t l o i c b i t c a c h c n n g( b ns b i t r n gC++n h i uh n h q u t i i x v i c c n h k h a i t h c c h n hx c n h v y ) . M t n h i uh n hc m t h o c n h i u i s v t or a m t g i t r m i . C c i s l t r o n gm t h n ht h c k h c n h a uh ns ov i c c c u c g i c h c n n gb n ht h n g , n h n gh i uq u l n h n h a u . T k i n hn g h i ml pt r n ht r c c a b n , b nc n c h pl t h o i m i v i c c n h k h a i t h c c s d n g c h o nn a y . C c k h i n i mv c n g( +) , t r v n g u y np h nt r ( ) , n h n( * ) , c h i a ( / ) , v c h u y nn h n g( =) t t c uc c n gm t n g h a c b nt r o n gb t k n g nn g l pt r n h . T ph p y c a c c n h k h a i t h c c l i t k s a ut r o n gc h n gn y .

u t i n
T h t ut i nx c n ht h t m m t b i uh i n n hg i k h i m t s n h k h a i t h c k h c n h a uc m t . Cv C++ c n h n gq u y n hc t h x c n ht r n ht n hg i . D n h l n h nv c h i a x yr a t r c k h i c n gv t r . S a u , n um t b i uh i nk h n gmi n hb c hv i b nn c t h s k h n g c c h ob t c a i c m , v v yb nn ns d n gd un g o c n l mc h ot n hg i r r n g . V d :
A=X+Y-2 / 2+Z ;

c m t n g h a r t k h c n h a ut c n gm t t u y nb v i m t n h mc t h c a d un g o c n :
A=X+( Y-2 )/( 2+Z ) ;

( H yt h n hg i k t q u v i X=1 , Y=2 , v Z=3 ) .

T n gt n gv g i m b t

C , v d o C++ , c y c c p h mt t . C c p h mt t c t h l mc h om d d n gh n g , v i k h i k h c . C l c c n h t h i t k n g nn g Cn g h r n gn s c d d n gh n h i u c m t p h nk h k h nc a m n u i m t c a b nk h n gc np h i q u t l nd i nt c hi n . M t t r o n gn h n gp h mt t ph nl t n gt n gv c c n h k h a i t h c a u t o d e c r e me n t . B nt h n gs d n g c h n g t h a y i c c b i nv n gl p , i uk h i ns l nm t v n gl pt h c h i n . C c n h i uh n ht n gl n gg i ml ' ' c n g h a l " g i mb i m t nv . " C c n h i uh n ht n gt h n g d l " ++" c n g h a l " t n gm t nv . " N uAl m t i n t , v d , k h i n i m ++Mt l t n g n g( A=A+ 1 ) . T n gt n gv t n gl n gg i mk h a i t h c s nx u t g i t r c a c c b i nn h m t k t q u . N uc c n h i uh n hx u t h i nt r c k h i b i n , ( t c l , ++A) , h o t n g ut i n c t h c h i nv g i t r k t q u c s n x u t . N uc c n h i uh n hx u t h i ns a uk h i b i n( t c l A++) , g i t r h i nt i c s nx u t , v s a u c c h o t n g c t h c h i n . V d :

// :C 0 3 :A u t o I n c r e m e n t . c p p//t r n hd i ns d n gt n gt n g //V v nh n ht n gg i m . #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n ti=0 ; i n tj=0 ; c o u t< <++i< <e n d l ;//P r e t n g c o u t< <j< <e n d l ;//s a ut n g c o u t< <-i<< e n d l ;//P r e d e c r e m e n t c o u t < <j-< <e n d l ;// n gl n gg i m }/// :~

N ub n t h i v c i t n" C++ " , b yg i b nh i u . i u n g " m t b c x a h nC . "

G i i t h i uv c cl o i d l i u

C c k i ud l i ux c n hc c hb ns d n gl ut r ( b n h ) t r o n gc c c h n gt r n hb nv i t . B n gc c hx c n h m t k i ud l i u , b nn i v i t r n hb i nd c hn h t h n o t or a m t o nc t h c a l ut r , v c nl mt h n o t h a ot c l ut r . C c k i ud l i uc t h c x yd n gt r o n gh o c t r ut n g . M t k i ud l i u c x yd n gt r o n gl m t t r o n gn h n gt r n hb i nd c hb nc h t h i u , m t t r o n g l c d yt r c t i pv ot r n hb i nd c h . C c l o i d l i u c x yd n gt r o n gg nn h g i n gh t t r o n gCv C++ . Ng c l i , m t n g i d n g n hn g h a k i ud l i ul m t t r o n gn h n gb nh o c l pt r n hk h c t or a n h m t l ph c . yl n h n gt h n g c g i l c c k i ud l i ut r ut n g . T r n hb i nd c hb i t c c hx l c x yd n gt r o n gc c l o i k h i n b t ul n , n " b i t " l mt h n o x l c c l o i d l i ut r ut n gb n gc c h c t pt i nt i u c c h a k h a i b ol p( b ns t mh i uv i un yt r o n gc h n gs a u ) .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

60/320

08/10/2013

Suy ngh trong C + +, Vol 1

L o i t c hh pc b n
C c i mk t h u t t i uc h u n i v i c c l o i t c hh p( t r o n g C++t h a k ) k h n gb i t c b a on h i ub i t t n g c x yd n gt r o n gc c l o i p h i c . T h a yv o , q u y n hc c g i t r t i t h i uv t i a m c c l o i t c h h pp h i c k h n n gt c h c . K h i m t m yt n hd a t r nh n h p h n , g i t r t i a n yc t h c t r c t i pd c h r a m t s l n gt i t h i uc a c c b i t c nt h i t g i g i t r . T u yn h i n , n um t m yt n hs d n g , v d , s t h pp h nm n h p h n( B C D ) b i ud i ns , s a u s l n gk h n gg i a nt r o n gm y g i c c o ns t i a c h ot n gl o i d l i us k h c n h a u . C c g i t r t i t h i uv t i a c t h c l ut r t r o n gc c l o i d l i uk h c n h a u c x c n ht r o n gh t h n gt pt i nt i u l i mi t s . hv f l o a t . h( t r o n gC++ , b ns t h n g#b a og m < c l i mi t s >v < c f l o a t >t h a yt h ) . Cv C++c b nc b n c x yd n gt r o n gc c l o i d l i u , mt yc h oc c m yn h p h nt r n . M t c h a r l l ut r n h nv t v s d n gt i t h i u8 b i t ( m t b y t e ) d u n gl n gl ut r , m c d n c t h l nh n . M t i n t l ut r m t s n g u y nv s d n gt i t h i ul h a i b y t e d u n gl n gl ut r . C c p h a ov i l o i l ut r c c s d uc h m n g , t h n g n hd n gd uc h m n gI E E E . f l o a t l i mn i s i n g l e p r e c i s i o nv h a i l c h od u c h m n gc h n hx c g p i . Nh c pt r c , b nc t h x c n hc c b i nb t c n i n ot r o n gm t p h mv i , v b nc t h x c n hv k h i t oc h oh c n gm t l c . yl c c h x c n hc c b i ns d n gb nl o i d l i uc b n :
// :C 0 3 :B a s i c . c p p //X c n hb nd l i uc b n //L o it r o n gCv C++ i n tm a i n( ){ // n hn g h am k h n gc nk h it o : p r o t e i nc h a r ; c a r b o h y d r a t ei n t ; n is i ; ic h tb o ; // n gt h i n hn g h av k h it o : c h a rb n hp i z z a=' A ' ,c as p o p=' Z ' ; i n td o n g d i n g s=1 0 0 ,s n gl n=1 5 0 , h e e h o s=2 0 0 ; n is c l a=3 . 1 4 1 5 9 ; //m k h i u : f u d g e _ r i p p l e i=6 e 4 ; }/// :~

P h n ut i nc a c h n gt r n hx c n hc c b i nt r o n gb nl o i d l i uc b nm k h n gc nk h i t oc h n g . N ub nk h n gk h i t om t b i n , c c t i uc h u nn i r n gn i d u n gc a n l k h n gx c n h( t h n g , i un y c n g h a l c h n gc h a r c ) . P h nt h h a i c a c h n gt r n h n hn g h a v k h i t oc c b i nc n gl c ( n l u n l u nt t n h t , n uc t h , c u n gc pm t g i t r k h i t ot i t h i i m n hn g h a ) . Nh nt h yv i c s d n gc c k h i ut h e oc ps n h nt r o n gc c h n gs 6 e 4 , c n g h a l " 6 l nt 1 0 nq u y nl c t h t t r i . "

b o o l , n g , v s a i
T r c k h i b o o l t r t h n hm t p h nc a c h u nC++ , t t c m i n g i c x uh n gs d n gc c k t h u t k h c n h a u t or a h n hv i B o o l e a n n h . Nh n gv n v s nx u t d i n gv c t h g i i t h i uc c l i v i t . T i uc h u nC++b o o l l o i c t h c h a i t r n gt h i t h h i nb n gc c h n gs t c hh pt r o n g n g( m c h u y n nm t t h i um t ) v s a i ( m c h u y n nm t t h i us k h n g ) . T t c b a t nl c c t k h a . Ng o i r a , m t s y ut n g nn g c i uc h n h : Y ut s d n gv i b o o l && || !H y i s b o o l v s nx u t b o o l k t q u . < >=>==<= ! =

S nx u t b o o l k t q u .

n u, c h o, b i ut h c i uk i nt r o n gk h i , l mc h u y n i b o o l g i t r . ? :t o nh n g ut i nc h u y n i b o o l g i t r . B i v c r t n h i um h i nc s d n gm t i n t i d i nc h om t l c , t r n hb i nd c hs m c n h i nc h u y n i t m t i n t m t b o o l ( g i t r k h c k h n gs s nx u t n gt r o n gk h i k h n gg i t r s nx u t s a i ) . L t n gn h t , t r n hb i nd c hs c u n gc pc h ob nm t c n hb on h m t g i s a c h a t n hh n h . M t t h n hn g t h u c " p h o n gc c hl pt r n hn g i n g h o " l v i c s d n g++ t h i t l pm t l c n gs t h t . N yv n c c h op h p , n h n gp h n i , c n g h a l v om t t h i i mt r o n gt n gl a i n s c t h c h i nb t h pp h p . V n l b n a n gl mc h om t l o i c h u y n i t i m nt b o o l i n t , c c ht n gg i t r ( c t h v t r a n g o i p h mv i b n ht h n gb o o l g i t r b n gk h n gv m t ) , v s a u m c n h i nc h u y n i n t r l i m t l nn a . C o nt r ( s c g i i t h i us a ut r o n gc h n gn y ) c n gs c t n gc h u y n i s a n gb o o l k h i c nt h i t .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 61/320

08/10/2013

Suy ngh trong C + +, Vol 1

S p e c i f i e r s
S p e c i f i e r s t h a y i n g h a c a v i c x yd n gt r o n gl o i c b nv m r n gc h n gv om t t ph pl nh n n h i u . C b ns p e c i f i e r s : d i , n g n, k , v k h n gd u. d i v n g ns a i c c g i t r t i a v t i t h i um t k i ud l i us t c h c . M t n gb n gi n t p h i c t n h t l k c ht h c c a m t n g n. H t h n gp h nc pk c ht h c c h oc c l o i t c hr i l : n g ni n t , i n t , d i i n t . T t c c c k c ht h c h n hd u n gc t h l n h n h a u , mi nl h p n gc c y uc ug i t r t i t h i u/t i a . T r nm t m yt n hv i m t t 6 4 b i t , v d , t t c c c l o i d l i uc t h l 6 4 b i t . H t h n gp h nc pk c ht h c c h os d uc h m n gl : n i , i v d i g p i . " P h a od i " k h n gp h i l m t l o i q u yp h mp h pl u t . K h n gc n g ns d uc h m n g . C c k v u n s i g n e ds p e c i f i e r s c h ot r n hb i nd c hc c hs d n gb i t d uv i c c l o i t c hr i v k t ( s d u c h m n gl u nl u nc h a m t d uh i u ) . M t d us k h n gt h e od i c c d uh i uv d o c t h m m t c h t c s n , v v yn c t h l ut r c c s d n gg p i s ov i n h n gc o ns t c hc c c t h c l ut r t r o n gm t k s . k l m c n hv c h c nt h i t v i c h a r ; c h a r c t h h o c k h n gc t h m c n h k . B n gc c hx c n h k c h a r , b nb u c c c b i t d u c s d n g . V d s a u yc h ot h yk c ht h c c a c c k i ud l i ut r o n gb y t e b n gc c hs d n gc c s i z e o f n h i uh n h , c g i i t h i ut r o n gb i n y :
// :C 0 3 :S p e c i f y . c p p //T h h i nv i cs d n gc cs p e c i f i e r #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ c h a rc ; u n s i g n e dc h a rc u ; i n ti ; i n ti u ; i n t n g n , n g nI I S ;//T n gt n h i n tn g n u n s i g n e ds h o r ti n tI S U ; u n s i g n e dn g ni i s u ; i n td ii l ; I I Ld i ; //t n gt n h l o n gi n t u n s i g n e dl o n gi n ti l u ; u n s i g n e di i l ud i ; f l o a tf ; id ; d i il d ; c o u t < <" \Nc h a r= "< <s i z e o f( c ) < <" \Nu n s i g n e dc h a r= "< <s i z e o f( c u ) < <" \Ni n t= "< <s i z e o f( i ) < <" \Ni n t= "< <s i z e o f( I U ) < <" \Nn g n= "< <s i z e o f( l ) < <" \Nu n s i g n e dn g n= "< <s i z e o f( I S U ) < <" \Nl u= "< <s i z e o f( i l ) < <" \Nu n s i g n e dl o n g= "< <s i z e o f( i l u ) < <" \Nf l o a t= "< <s i z e o f( f ) < <" \N i= "< <s i z e o f( d ) < <" \Nd ig p i= "< <s i z e o f( l d ) < <E n d l ; }/// :~

L ur n gc c k t q u b nn h n c b n gc c hc h yc h n gt r n hn yc t h k h c n h a ut m t m y/h t h n g /t r n hb i nd c h i uh n ht i pt h e o , k t ( n h c pt r c ) i ud u yn h t m p h i p h h pl m i l o i k h c n h a ug i t i t h i uv t i a c c g i t r q u y n ht r o n gt i uc h u n .

G i i t h i uv c o nt r

K h i b ns a i m t i n t v i n g nh o c d i , t k h a i n t l t yc h n , n h t r n hb y t r n . B t c k h i n ob nc h ym t c h n gt r n h , n l l n ut i nn p( t h n gt a ) v ob n h c a m yt n h . D o , t t c c c y ut c a c h n gt r n hc a b nn m u t r o n gb n h . B n h t h n g c t r a n h m t c h u i t u nt c c v t r b n h , c h n gt a t h n gn h c nc c a i mn h t mb i t b y t e n h n gt h c s l k c ht h c c a m i k h n gg i a np h t h u c v ok i nt r c c a m yt n hc t h v t h n g c g i l c a m yk c h t h c t . M i k h n gg i a nc t h c p h nb i t d u yn h t t t t c c c k h n gg i a nk h c b i n a c h . T h e om c c hc a c u c t h ol u nn y , c h n gt a s n i r n gt t c c c m ys d n gb y t e c a c h l i nt c b t ut s k h n gv i l n t u yn h i nn h i ub n h b nc t r o n gm yt n hc a b n . K t k h i c h n gt r n hc a b ns n gt r o n gb n h t r o n gk h i n a n g c c h y , m i p h nt c a c h n gt r n hc a b nc m t a c h . G i s c h n gt a b t uv i m t c h n gt r n h ng i n :

// :C 0 3 :Y o u r P e t s 1 . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; i n tc h ,m o ,c h i m ,c ; v o i df( i n tv tn u i ){ c o u t< <" v tn u is i d : "< <v tn u i< <e n d l ; } i n tm a i n( ){ i n ti ,j ,k ; }/// :~

M i p h n gt r o n gs c c y ut t r o n gc h n gt r n hn yc m t v t r t r o n gl ut r k h i c h n gt r n h a n gc h y . Ng a yc n h n gc h c n n gc h i ml ut r . Nh b ns t h y , n c h r a r n gn h n gg m t y ut v l c c hb n n h
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 62/320

08/10/2013

Suy ngh trong C + +, Vol 1

n g h a n t h n gx c n hc c k h uv c b n h k h i c c p h nt c t . C m t n h i uh n ht r o n gCv C++s c h ob nb i t a c h c a m t p h nt . yl ' &' i uh n h . T t c c c b nl ml n gt r c t n n hd a n hv i ' &' v n s t or a c c a c h c a n g i n h nd n g . Y o u r P e t s 1 . c p pc t h c s a i i nr a c c a c h c a t t c c c t h n hp h nc a n , n h t h n y :


// :C 0 3 :Y o u r P e t s 2 . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; i n tc h ,m o ,c h i m ,c ; v o i df( i n tv tn u i ){ c o u t< <" v tn u is i d : "< <v tn u i< <e n d l ; } i n tm a i n( ){ i n ti ,j ,k ; c o u t< <" f( ) : "< <( d i )&f< <e n d l ; c o u t< < " c o nc h : "< <( d i )v c o nc h < <e n d l ; c o u t< <" m o : "< <( d i )v m o< <e n d l ; c o u t< <" c h i m : "< <( d i )v c h i m< <e n d l ; c o u t< <" c : "< <( l o n g )v c < <e n d l ; c o u t< <" t i : "< <( d i )&i< <e n d l ; c o u t< <" j : "< <( d i )&j< <e n d l ; c o u t < <" k : "< <( d i )&k< <e n d l; }/// :~

C c ( d i ) l m t d i nv i n. Nn i : " n g i x n yn h t h n l l o i b n ht h n g , t h a yv i x v i n n h m t l u. " D nd i nv i nl k h n gc nt h i t , n h n gn un k h n gc , c c a c h s c i nr a t r o n gh t h p l c p h nt h a yv o , c m t d i l mc h om i t h m t c h t d c h n . K t q u c a c h n gt r n hn ys t h a y i t yt h e om yt n hc a b n , h i uh n h , v t t c c c l o i c a c c y ut k h c , n h n gn s l u nl u nc u n gc pc h ob nm t s h i ub i t t h v . i v i m t h o t n gd u yn h t t r nm y t n hc a t i , k t q u t r n gn h t h n y :
f( ) :4 . 1 9 8 . 7 3 6c o nc h :4 . 3 2 3 . 6 3 2m o :4 . 3 2 3 . 6 3 6c h i m : 4 . 3 2 3 . 6 4 0c :4 . 3 2 3 . 6 4 4t i :6 . 6 8 4 . 1 6 0 j :6 6 8 4 1 5 6k :6 6 8 4 1 5 2

B nc t h t h yc c b i n c n hn g h a b nt r o n gc h n h( ) a n g t r o n gm t k h uv c k h c v i c c b i n n h n g h a b nn g o i c a c h n h( ) , b ns h i ut i s a ok h i b nt mh i ut h mv n g nn g . Ng o i r a , f ( ) d n gn h l t r o n gk h uv c r i n gc a m n h , m t h n g c t c hr a t c c d l i ut r o n gb n h . M t i ut h v c nl ul c c b i n c x c n hm t t r o n gn h n gq u y ns a uk h i n g i k i a x u t h i n c t l i nt c k n h a ut r o n gb n h . H c p h nc c hb n gs b y t e c y uc uc a k i ud l i uc a h . y , c c k i ud l i uc h c s d n gl i n t , v c o nm ol b nb y t e t c o nc h , c h i ml b nb y t e t m o, v vV v y , c t h t h yr n g , t r nm yt n hn y , m t i n t d i b nb y t e . K h c v i t h n g h i mn yt h v c h ot h yc c hb n h c n hx r a , n h n gg b nc t h l mv i m t a c h ? i uq u a nt r n gn h t b nc t h l ml l ut r n t r o n gm t b i n s d n gs a u . Cv C++c m t l o i c b i t c a b i nc h a m t a c h . B i nn y c g i l m t c o nt r . C c n h i uh n h n hn g h a m t c o nt r t n gt n h m t t r o n gn h n gs d n gc h op h pn h n : ' * ' . T r n hb i n d c hb i t r n gn k h n gp h i l n h nv b i c n ht r o n g n c s d n g , n h b ns t h y . K h i b nx c n hm t c o nt r , b np h i x c n hk i uc a b i nn t r t i . B nb t ub n gc c hc h ot nl o i , s a u t h a yv n g a yl pt c a r a m t n hd a n hc h ob i n , b nn i " H y i , l m t c o nt r " b n gc c hc h nm t n g i s a og i ac c l o i v n hd a n h . V v y , m t c o nt r nm t i n t t r n gn h t h n y : i n t *i p / / i mi p m t


b i ni n t

i n ta ,b ,c ;

S k t h pc a ' * ' v i c c l o i h n hh pl v c d d n g , n h n gn t h c s c t h l m t c h t l a d i . n g h i n gc a b nc t h n i " i n t p o i n t e r " n h t h n l m t l o i r i n gb i t d u yn h t . T u yn h i n , v i m t i n t k i u d l i uc b nh a yk h c , n c t h n i :

t r o n gk h i v i m t c o nt r , b ns t h c h n i : i n t*i p a ,I P B ,I P C ; C p h pC( v t h a k , C++c p h p ) k h n gc h op h pb i ut h c h pl n h v y . T r o n gc c n hn g h a t r n , c h i p a l m t c o nt r , n h n gI P Bv I P Cl b n ht h n gi n t s ( b nc t h n i r n g" * l i nk t c h t c h h n n h d a n h " ) . D o , k t q u t t n h t c t h t c b n gc c hs d n gc h c m t n hn g h a t r nm i d n g , b nv n n h n c c c c p h ph pl m k h n gc s n h ml n :


i n t*i p a ;i n t*I P B ;i n t*I P C ;

T m t h n gd nc h u n gc h oC++l pt r n hl b nn nl u nl u nk h i t om t b i nt i t h i i m n hn g h a , h n ht h c n yt h c s h o t n gt t h n . V d , c c b i n t r nk h n g c k h i t ov i b t k g i t r c t h , h g i r c . Nt t h n n i i ug n h :
i n ta=4 7 ;i n t*i p a=& a ;

B yg i c h a i mt v i p a c k h i t o , v i p a g i a c h c a mt .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 63/320

08/10/2013

Suy ngh trong C + +, Vol 1

M t k h i b nc m t c o nt r c k h i t o , i uc b nn h t b nc t h l mg v i n l s d n gn c h n hs a g i t r c a n i m. t r u yc pv om t b i nt h n gq u a m t c o nt r , b nd e r e f e r e n c e c o nt r s d n gc c n h i u h n ht n gt m b ns d n g x c n hn , n h t h n y :
*I p a=1 0 0 ;

B yg i mt c h a g i t r 1 0 0 t h a yv 4 7 . yl n h n g i uc b nc a c o nt r : b nc t h g i m t a c h , v b nc t h s d n g a c h s a i c c b i nb a n u . Nh n gc uh i v nc n : t i s a ob nmu nt h a y i m t b i ns d n gm t b i nk h c n h m t p r o x y ? i v i q u a n i mn yg i i t h i uc c c o nt r , c h n gt a c t h t c c c ut r l i t h n hh a i l o i l n : 1. 2. t h a y i " i t n gb nn g o i " t b nt r o n gm t h m. yc l l s d n gc b nn h t c a c o nt r , v n s c x e mx t y . t c n h i uk t h u t l pt r n ht h n gmi n hk h c , m b ns t mh i uv t r o n gp h nc nl i c a c u n s c h .

S a i c c i t n gb nn g o i
T h n gt h n g , k h i b nv t q u a m t i s c h om t c h c n n g , m t b ns a oc a i s l t h c h i nb nt r o n g c h c n n g . i un y c g i l p a s s b y g i t r . B nc t h t h yt c d n gc a p a s s b y g i t r t r o n g c h n gt r n hs a u :
// :C 0 3 :P a s s B y V a l u e . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; v o i df( i n ta ){ c o u t< <" a= "< <a< <e n d l ; a=5 ; c o u t< <" a = "< <a< <e n d l ; } i n tm a i n( ){ i n tx=4 7 ; c o u t< <" x= "< <x< <e n d l ; f( x ) ; c o u t< <" x= "< <x< <e n d l ; }/// :~

T r o n gf ( ) , mt l m t b i n a p h n g , v v yn c h t nt i t r o n gs u t t h i g i a nc a c u c g i c h c n n g f ( ) . B i v l m t t h a ms c a h m, g i t r c a mt c k h i t ob i c c i s c t h n gq u a k h i h m c g i ; t r o n gma i n( ) i s l x , t r o n g c m t g i t r 4 7 , v v yg i t r n y c s a oc h pv omt k h i f ( ) c g i . K h i b nc h yc h n gt r n hn y , b ns t h y :
x=4 7a=4 7a=5x=4 7

B a n u , t t n h i n , x l 4 7 . K h i f ( ) c g i , k h n gg i a nt mt h i c t or a g i b i nmt t r o n gs u t t h i g i a n c a c u c g i c h c n n g , v mt c k h i t ob n gc c hs a oc h pc c g i t r c a x , c x c n hb n gc c hi nn r a . T t n h i n , b nc t h t h a y i g i t r c a mt v t h yn c t h a y i . Nh n gk h i f ( ) c h o nt h n h , k h n gg i a nt mt h i c t or a c h omt b i nm t , v c h n gt i t h yr n gk t n i d u yn h t t n gt nt i g i a mt v x x yr a k h i g i t r c a x c s a oc h pv omt . K h i b n a n g t r o n gf ( ) , x l i t n g b nn g o i ( t h u t n g c a t i ) , v t h a y i c c b i n a p h n gk h n g n h h n g nc c i t n gb nn g o i , t n h i nt h i , v c h n gl h a i a i mk h c n h a ut r o n gl ut r . Nh n gn u b nl mmu nt h a y i c c i t n gb nn g o i ? yl n i m c o nt r c c h . T r o n gm t c mg i c , m t c o nt r l m t b d a n hc h om t b i nk h c . V v y , n uc h n gt i v t q u a m t c o nt r v om t c h c n n gt h a yv m t g i t r b n ht h n g , c h n gt a a n gt h c s i q u a m t b d a n hc h oc c i t n gb nn g o i , k c hh o t c h c n n gs a i i t n gb nn g o i , n h t h n y :


// :C 0 3 :P a s s A d d r e s s . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; v o i df( i n t*p ){ c o u t< <" p= "< <p< <e n d l ; c o u t< <" *p= "< <* p< <e n d l ; *P=5 ; c o u t< <" p= "< <p< <e n d l ; } i n tm a i n( ){ i n tx=4 7 ; c o u t< <" x= "< <x < <e n d l ; c o u t< <" &x= "< <&x< <e n d l ; f( &x ) ; c o u t< <" x=" < <x< <e n d l ; }/// :~

B yg i f ( ) c m t c o nt r n h m t i s v d e r e f e r e n c e s c o nt r t r o n gc h u y nn h n g , v i un yg yr a c c i t n gb nn g o i x p h i c s a i . ur a l :
x=4 7v x=0 0 6 5 F E 0 0p=0 0 6 5 F E 0 0*p=4 7p= 0 0 6 5 F E 0 0x=5

C h r n gg i t r c h a t r o n gpl g i n gn h a c h c a x c o nt r pk h n gt h c s i m x . N u l k h n g t h u y t p h c , k h i t r a n g c d e r e f e r e n c e d g ng i t r 5 , c h n gt a t h yr n gg i t r c a x b yg i c t h a y i n5 l t t .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 64/320

08/10/2013

Suy ngh trong C + +, Vol 1

V v y , i q u a m t c o nt r v om t c h c n n gs c h op h pc h c n n g c h n hs a c c i t n gb nn g o i . B n s t h yr t n h i uc n gd n gk h c c h oc o nt r s a u , n h n g i un y c c h ol s d n gp h b i nn h t v c b nn h t c t h .

G i i t h i uv C + + t i l i ut h a m k h o
C o nt r l mv i c g ng i n gn h a ut r o n gCv C++ , n h n gC++c h ob i t t h mt h m m t c c h v t q u a m t a c h v om t c h c n n g . yl p a s s b y t i l i ut h a mk h o v n t nt i t r o n gm t s n g nn g l pt r n hk h c v v yn k h n gp h i l m t p h t mi n hC++ . Nh nt h c b a n uc a t i l i ut h a mk h oc t h l h l k h n gc nt h i t , b nc t h v i t t t c c c c h n gt r n h c a b nk h n gc t i l i ut h a mk h o . N i c h u n g , i un yl n g , n g o i t r m t v i n i q u a nt r n gl b ns t mh i uv s a ut r o n gc u ns c h . B nc n gs t mh i ut h mv t i l i ut h a mk h os a u , n h n gt n gc b nl t n gt n h c c c u c b i ut n hs d n gc o nt r t r n : b nc t h v t q u a a c h c a m t i s s d n gm t t i l i ut h a mk h o . S k h c b i t g i a c c t i l i ut h a mk h ov c o nt r l g i m t c h c n n gm c t i l i ut h a mk h o l s c hh n , c p h p , v g i m t c h c n n gm c c o nt r ( v l c h n hx c s k h c b i t c p h pn ym l m c h ot i l i ut h a mk h oc nt h i t t r o n gc c t n hh u n gn h t n h ) . N uP a s s A d d r e s s . c p p c s a i s d n g t i l i ut h a mk h o , b nc t h t h ys k h c b i t t r o n gc c c h c n n gg i t r o n gma i n( ) :
// :C 0 3 :P a s s R e f e r e n c e . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; v o i df( i n t&r ){ c o u t< <" r= "< <r< <e n d l ; c o u t< <" &r= "< <& r< <e n d l ; r=5 ; c o u t< <" r= "< <r<< e n d l ; } i n tm a i n( ){ i n tx=4 7 ; c o u t< <" x= "< <x< <e n d l ; c o u t< <" &x= " < <&x< <e n d l ; f( x ) ;//H n hn h p a s s -t h e og i t r , //t h cs i q u at h a mk h o c o u t< <" x= "< <x< <e n d l ; }/// :~

T r o n gf ( ) ' s d a n hs c h i s , t h a yv n i i n t * v t q u a m t c o nt r , b nn i i n t v v t q u a m t t h a m c h i u . T r o n gf ( ) , n ub nc h n i ' r ' ( m s t or a a c h n ur l m t c o nt r ) b ns c g i t r t r o n g c c b i nr t i l i ut h a mk h o . N ub ng nc h or , b nt h c s g nc h ob i nr t i l i ut h a mk h o . T r o n gt h c t , c c hd u yn h t c c a c h l t c h c b nt r o n gr l v i ' &' i uh n h . T r o n gma i n( ) , b nc t h n h nt h yh i uq u q u a nt r n gc a t i l i ut h a mk h ot r o n gc p h pc a c c c u c g i nf ( ) , m c h l f ( x ) . M c d i un yc v n h m t p a s s b y g i t r b n ht h n g , h i uq u c a c c t i l i u t h a mk h ol n t h c s c a c h v v t q u a n t r o n g , c h k h n gp h i l m m t b ns a oc a g i t r . ur a l :


x=4 7v x=0 0 6 5 F E 0 0r=4 7&r=0 0 6 5 F E 0 0r=5x=5

V v y , b nc t h t h yr n gp a s s b y t h a mk h oc h op h pm t c h c n n g c h n hs a c c i t n gb nn g o i , g i n gn h i q u a m t c o nt r n o( b nc n gc t h n h nt h yr n gc c t i l i ut h a mk h oc h e l pt h c t l m t a c h a n g c t h n gq u a , i un ys c k i mt r a s a un yt r o n gc u ns c h ) . Nh v y , c h og i i t h i u n g i nn y , b nc t h g i n hr n gt i l i ut h a mk h oc h l m t c c hc p h pk h c n h a u( i k h i c g i l " c p h p n g " ) t h c h i nc n gm t i ur n gc o nt r l m: c h op h pc c c h c n n gt h a y i i t n gb n n g o i .

C o nt r v t i l i ut h a m k h on h m tb i n
C h o nn a y , b n n h nt h yc c k i ud l i uc b nc h a r , i n t , f l o a t , v i , c n gv i c c s p e c i f i e r s k , d u, n g n , v d i , c t h c s d n gv i c c l o i d l i uc b nt r o n gg nn h k t h pb t k . B yg i c h n gt i t h mc o nt r v t i l i ut h a mk h ot r c g i a ov i c c k i ud l i uc b nv s p e c i f i e r s , d o c t h k t h pv a t n gg pb a l n :
// :C 0 3 :A l l D e f i n i t i o n s . c p p //T tc c ck th pc t h c ac ck i ud l i uc b n , //S p e c i f i e r s ,c o nt r v t il i ut h a mk h o #I n c l u d eu s i n gn a m e s p a c es t d ; k h o n gt r n gf 1( c h a rc ,i n ti ,f l o a tf ,g p id )v o i df 2( n g ni n ts i ,l o n gi n tl i ,d i g p il d )v o i df 3( u n s i g n e dc h a ru c ,i n tu i , u n s i g n e ds h o r ti n tU S I ,u n s i g n e dl o n gi n t u l i )v o i df 4( c h a r*c p ,i n t*i p ,f l o a t*f p , i*d p )v o i df 5( n g ni n t*n h mn h i ,l o n g i n t*m i , d ig p i*L D P ) ; k h o n gt r n gf 6( u n s i g n e dc h a r*U C P ,i n t*U I P , u n s i g n e ds h o r ti n t*u s i p , u n s i g n e d l o n gi n t*u l i p )v o i df 7( c h a r&c r ,i n t&i r ,f l o a t&f r , i&d r )v o i df 8( s h o r ti n t& t h a n g ,l ui n t&L I R , d ig p i&l d r )v o i df 9( u n s i g n e dc h a r&U C R ,i n t&U I R , u n s i g n e ds h o r ti n t&u s i r , u n s i g n e dl o n gi n t&u l i r ) ; i n tm a i n( ){ }/// :~

C o nt r v t i l i ut h a mk h oc n gl mv i c k h i i q u a c c i t n gv ov r a k h i c c c h c n n g , b ns t m h i uv i un yt r o n gm t c h n gs a u .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 65/320

08/10/2013

Suy ngh trong C + +, Vol 1

C m t l o i k h c l mv i c v i c o nt r : k h o n gt r n g. N ub nn h n c c m t c o nt r l m t v o i d* , n c n g h a l b t k l o i t t c c c a c h c t h c g nc h oc o nt r ( t r o n gk h i n ub nc m t i n t * , b nc t h c h n hc h c a c h c a m t i n t b i nc o nt r ) . V d :
// :C 0 3 :V o i d P o i n t e r . c p pi n tm a i n( ){ v o i d*v p ; c h a rc ; i n ti ; f l o a tf ; id ; // ac h c al o ih n hb tk c t h c //g nc h om tc o nt r v o i d : v p=& c ; v p=& i ; v p=& f ; v p=& D ; }/// : ~

M t k h i b ng nc h om t v o i d* b nb m t b t k t h n gt i nv n h n gg l o i n c . i un yc n g h a r n g t r c k h i b nc t h s d n gc o nt r , b np h i pn v o n gl o i :
// :C 0 3 :C a s t F r o m V o i d P o i n t e r . c p pi n tm a i n( ){ i n ti=9 9 ; v o i d*v p=& i ; //C t h k h n gt i c hc am tc o nt r v o i d : //V p=3*//b i nd c hs t h n gb ol i //P h it r l it h n hi n tt r ck h id e r e f e r e n c i n g : *( ( I n t* )v p )=3 ; }/// :~

C c d i nv i n( i n t * ) v pm t v o i d* v c h ot r n hb i nd c h x l n n h m t i n t * , v d o n c t h c d e r e f e r e n c e dt h n hc n g . B nc t h n h nt h yr n gc p h pn yl x ux , v n c , n h n gn t i t h n v o i d* g i i t h i um t l h n gt r o n gh t h n gk i uc a n g nn g . C n g h a l , n c h op h p , h o c t h mc h t h c y , v i c i ut r c a m t l o i n h l o i k h c . T r o n gv d t r n , t i i x v i m t i n t n h m t i n t b n gc c h c v p nm t i n t * , n h n gk h n gc g m n i t i k h n gt h b n v om t l c h a r * h o c i * , t r o n g s s a i m t s t i nk h c n h a uc a l ut r c p h nb c h oc c i n t , c t h l mh n gc h n gt r n h . Nh nc h u n g , k h o n gt r n gg i n nt r n h , v c h c s d n gt r o n gt r n gh p c b i t h i mh o i , m c i b ns k h n g s ns n g x e mx t c h o nk h i s a u n gk t r o n gc u ns c h . B nk h n gt h c m t k h o n gt r n gt i l i ut h a mk h o , v n h n gl d os c g i i t h c ht r o n gc h n g1 1 .

P h mv i

P h mv i q u yt c c h ob nb i t n i m t b i nc g i t r , n i n c t or a , v n i m n b p h h y( v d , i r a k h i p h mv i ) . P h mv i c a m t b i nk od i t i m m n c n hn g h a v i d un g o c n g ut i np h h p v i d un g o c m g nn h t t r c k h i b i n c x c n h . l m t p h mv i c x c n hb i c a c n gt yn y " g nn h t " c a n i n gr n g . mi n hh a :

// :C 0 3 :S c o p e . c p p//L mt h n ob i nl s c o p e di n tm a i n( ){ i n ts c p 1 ; //s c p 1c t h n h nt h y y { //S c p 1v nc t h n h nt h y y //. . . . . i n ts c p 2 ; //s c p 2c t h n h nt h y y //. . . . . { //S c p 1&s c p 2v nc t h n h nt h y y //. . //S c p 1 ,s c p 2&s c p 3c t h n h nt h y y //. . . }//< -S c p 3b p h h y y //S c p 3k h n gc s n y //S c p 1&s c p 2v nc t h n h nt h y y //. . . }//< -S c p 2b p h h y y //S c p 3&s c p 2k h n gc s n y //S c p 1v nc t h n h nt h y y //. . }//< -S c p 1b p h h y y /// :~

i n ts c p 3 ;

V d t r nc h ot h yk h i b i nc t h n h nt h yv k h i h k h n gc s n( c n g h a l , k h i h i r a k h i p h mv i ) . M t b i nc t h c s d n gc h k h i t r o n gp h mv i c a n . P h mv i c t h c l n gv on h a u , c h b i x u t h i nc p n i n gr n gb nt r o n gc pp h h pk h c c a n i n gr n g . P h n gt i nl mt m b nc t h t r u yc pv om t b i n t r o n gm t p h mv i m b a oq u a n hp h mv i b n a n gi nT r o n gv d t r n , c c b i ns c p 1 c s nt r o n gt t c c c p h mv i k h c , t r o n gk h i s c p 3 c s nc h t r o n gp h mv i t r o n gc n g .

B i nx c n ht r nb a y
Nh c pt r c t r o n gc h n gn y , c m t s k h c b i t n gk g i a Cv C++ , k h i x c n hc c b i n . C h a i n g nn g y uc uc c b i n c n hn g h a t r c k h i c h n g c s d n g , n h n gC( v n h i un g nn g
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 66/320

08/10/2013

Suy ngh trong C + +, Vol 1

t r u y nt h n gt h t c k h c ) b u c b np h i x c n ht t c c c b i n uc a m t p h mv i , k h i t r n hb i nd c h t or a m t k h i n c t h p h nb k h n gg i a nc h on h n gn g i b i n . T r o n gk h i c m C , m t k h i c c n hn g h a b i nt h n gl i u ut i nb nn h nt h yk h i b c v om t p h m v i . T u y nb t t c c c b i n uc a k h i y uc uc c l pt r n hv i n v i t m t c c h c b i t b i v c c c h i t i t t h c h i nc a n g nn g . H uh t m i n g i k h n gb i t t t c c c b i nh a n gs d n gt r c k h i h v i t m , v v yh p h i g i n h yt r l i uc a k h i c h nb i nm i , l k h k h nv n g u y nn h nl i . Nh n g n h n g h a b i nt h n gk h n gc n h i un g h a c h on g i c , v h t h c s c x uh n gg yn h ml nb i v c h n g x u t h i nn g o i c c b i c n ht r o n g c h n g c s d n g . C++( k h n gp h i C ) c h op h pb nx c n hc c b i nb t c n i n ot r o n gp h mv i , v v yb nc t h x c n h q u y nb i nt r c k h i s d n gn . Ng o i r a , b nc t h k h i t ob i nt i t h i i mb nx c n hn , n g nn g a m t l pn h t n hs a i s t . X c n hc c b i nt h e oc c hn yl mc h om d d n gh nn h i u v i t v l mg i mc c l i b nn h n c t b b u c p h i n h yq u a l i t r o n gp h mv i . Nl mc h om d h i ub i v b nn h nt h ym t b i n c n hn g h a t r o n gc c n g c n hs d n gc a n . i un y c b i t q u a nt r n gk h i b n a n gx c n hv k h i t om t b i nc n gm t l c b nc t h t h yn g h a c a g i t r k h i t ob n gc c hb i n c s d n g . B nc n gc t h x c n hc c b i nt r o n gc c b i ut h c k i ms o t i v i c c v n gl pv t r o n gk h i v n g , t r o n g i uk i nc a m t n ut u y nb , v t r o n gb oc ok t q u c h nc a m t c h u y n i . D i yl m t v d c h o t h yo n t h e f l y n hn g h a b i n :
// :C 0 3 :O n T h e F l y . c p p //O n t h e f l y n hn g h ab i n #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ //. . { //B t um tp h mv im i i n tq=0 ;//C ih ip h i n hn g h a y //. . //X c n ht h i i ms d n g : f o r( i n ti=0 ;i< 1 0 0 ;i++ ){ q++ ;//q nt m tp h mv il nh n // n hn g h ac u i p h mv i : i n tp=1 2 ; } i n tp=1 ; //Apk h cn h a u }// K tt h cp h mv ic h aq&n g o ip c o u t< <" G c ck t : "< <e n d l ; t r o n g k h i( !c h a rc=c i n . g e t( )=' q ' ){ c o u t< <c< <" p h ik h n g "< <e n d l ; n u( c h a rx=c= =' a '||c= =' b ' ) c o u t< <" B ng ah o cb "< <e n d l ; k h c c o u t<< " B ng "< <x< <e n d l ; } c o u t< <" L o iA ,B ,h o cC "< <e n d l ; c h u y n i( i n ti=c i n . g e t( ) ){ t r n gh p' A ' :c o u t< <" S n a p "< <e n d l ;b r e a k ; t r n gh p' B ':c o u t< <" C r a c k l e "< < e n d l ;b r e a k ; t r n gh p' C ' :c o u t< <" P o p "< <e n d l ;b r e a k ; m c n h :c o u t< < " N o tA ,B ,C ! "< <E n d l ; } }/// :~

T r o n gp h mv i t r o n gc n g , p c x c n hn g a yt r c k h i k t t h c p h mv i , v v yn t h c s l m t c c h v d n g( n h n gn c h ot h yb nc t h n hn g h a m t b i nb t c n i n o ) . C c t r a n gt r o n gp h mv i b nn g o i l t r o n gt n hc n ht n gt . n hn g h a c a t i t r o n gb i ut h c k i ms o t c a c h ov n gl pl m t v d c a v i c c t h n hn g h a m t b i n c h n h x c t i t h i i mb nc nn ( b nc h c t h l m i un yt r o n gC++ ) . P h mv i c a t i l p h mv i c a b i u t h c i uk h i nb i c h ov n gl p , v v yb nc t h q u a yl i v t i s d n gt i t r o n gt i pt h e oc h ov n gl p . y l m t t h n hn g t h u nt i nv t h n g c s d n gt r o n gC++ , t i l t nc i nc h om t t r u yc pv n gl pv b nk h n gc np h i g i p h t mi n hr a n h n gc i t nm i . M c d v d c n gc h ot h yb i n c n hn g h a t r o n gt r o n gk h i , n u , v c h u y n i b oc o , l o i n hn g h a l t p h b i nh ns ov i c h oc c b i ut h c , c t h b i v c p h pl r t h nc h . V d , b nk h n gt h c b t k d un g o c n . C n g h a l , b nk h n gt h n i :
t r o n gk h i( ( c h a rc=c i n . g e t( ) ) !=' q ' )

V i c b s u n gc c n g o c t h ms c v n h l m t i uv t i v h u c h l m, v b i v b nk h n gt h s d n g c h n g , k t q u l k h n gn h n gg b nc t h mu n . V n x yr a b i v " ! =' c ut i nc a oh n ' =' , v v y c h a r c k t t h c c c h a m t b o o l c h u y n i s a n gc h a r . K h i l i n , t r nn h i ut h i t b uc u i , b ns t h y m t n h nv t c i i m t . N i c h u n g , b nc t h x e mx t k h n n gx c n hc c b i nt r o n gk h i , n u , v c h u y n i b oc on h l c c h o y , n h n gn i d u yn h t b nc k h n n gs d n gl o i n hn g h a b i nl t r o n gm t c h ov n gl p( n i b ns s d n gn k h t h n gx u y n ) .

Qu y n hc t h c pp h t b n h
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

K h i t or a m t b i n , b nc m t s l a c h n x c n ht h i g i a nt nt i c a b i n , l mt h n ol ut r c p h n
67/320

08/10/2013

Suy ngh trong C + +, Vol 1

b c h oc c b i n , v l mt h n ob i n c x l b i t r n hb i nd c h .

B i nt o nc u

B i nt o nc u c n hn g h a b nn g o i t t c c c c q u a nc h c n n gv c s nc h ot t c c c p h nc a c h n g t r n h( k c m t r o n gc c f i l e k h c ) . B i nt o nc u a n gb n hh n gb i p h mv i v l u nc s n( v d , t h i g i a n s n gc a m t b i nt o nc uk od i c h o nk h i k t t h c c h n gt r n h ) . N us t nt i c a m t b i nt o nc u t r o n gm t t pt i n c k h a i b os d n ge x t e r nt k h a t r o n gm t t pt i n , d l i uc s n s d n gb i c c t p t i nt h h a i . D i yl m t v d v v i c s d n gc c b i nt o nc u :

// :C 0 3 :G l o b a l . c p p //{ L }g l o b a l 2 //T r n hd i nb i nt o nc u #I n c l u d eu s i n gn a m e s p a c es t d ; t o nc ui n t ;v o i df u n c( ) ;i n tm a i n( ){ t o nc u= 1 2 ; c o u t< <t o nc u< <e n d l ; f u n c( ) ;//S a t o nc u c o u t< <t o nc u< <e n d l ; }/// :~

yl m t t pt i nc t h t r u yc pt o nc un h m t e x t e r n:
// :C 0 3 :G l o b a l 2 . c p p{ O } //T r u yc pb nn g o it o nc ub i ne x t e r ni n tt o nc u ; //( C cm il i nk tg i iq u y tc ct il i ut h a mk h o )v o i df u n c( ){ c u=4 7 ; }/// :~

t o n

L ut r c h oc c b i nt o nt h g i i c t or a b i n hn g h a t r o n g Gl o b a l . c p p, v c n gb i n ct r u yc pb i c cmt r o n gGl o b a l 2 . c p p. K t k h i mt r o n gGl o b a l 2 . c p p c b i nd c hr i n gr v i c c mt r o n gGl o b a l . c p p, t r n hb i nd c hp h i c t h n gb or n gb i nt nt i n i k h c b n gc c hk h a i b oe x t e r ni n tt o nc u ; K h i b nc h yc h n gt r n h , b ns t h yr n gc c c u c g i nc h c n n g( ) k h n gt h c s n hh n g nc c t r n gh pt o nc ud u yn h t c a t h g i i . T r o n gGl o b a l . c p p, b nc t h x e mt h b n hl u n c b i t ( l t h i t k c a r i n gt i ) :


//{ L }g l o b a l 2

N yn i r n g t or a c c c h n gt r n hc u i c n g , c c i t n gt pt i nv i t ng l o b a l 2 p h i c l i nk t t r o n g ( k h n gc p h nm r n gb i v c c t np h nm r n gc a t pt i n i t n gk h c n h a ut m t h t h n gt i pt h e o ) . T r o n gGl o b a l 2 . c p p, d n g ut i nc m t t a gb n hl u n c b i t { O} , m n i " n gc g n g t or a m t t h c t h i r a c a t pt i nn y , n c b i nd c h n c t h c l i nk t v om t s t h c t h i k h c . " C c E x t r a c t C o d e c p p . c h n gt r n ht r o n gt p2 c a c u ns c hn y ( T i v t i w w w . B r u c e E c k e l . c o m) c c c t h v t or a t h c hh pma k e f i l e m i t h b i nd c h n g( b ns t m h i uv ma k e f i l e s v oc u i c a c h n gn y ) .

C cb i n ap h n g

C c b i n a p h n gx yr a t r o n gm t p h mv i , h l " a p h n g " nm t c h c n n g . C h n gt h n g c g i t n g b i nb i v h t n gr a i k h i p h mv i c n h pv t n gb i nm t k h i p h mv i n gc a . C c t k h a t n gl mc h or r n gn y , n h n gc c b i n a p h n gm c n h t n gv v yk h n gb a og i c n t h i t k h a i b om t c i g n h m t t n g. n gk b i n M t b i n n gk l m t l o i b i n a p h n g . C c n gk t k h a c h ot r n hb i nd c h" H yt r u yc p nc c b i nn yc n gn h a n hc n gt t . " T n gt c t r u yc pp h t h u c t h c h i n , n h n g , n h t nc h ot h y , n t h n g c t h c h i nb n gc c h t c c b i nt r o n gs n gk . K h n gc mb or n gb i ns c t t r o n gm t n gk h o c t h mc h l t c t r u yc ps t n gl n . l m t g i c h ot r n hb i nd c h . C n h n gh nc h v i c s d n g n gk b i n . B nk h n gt h l yh o c t n ht o n a c h c a m t n gk b i n . M t n gk b i nc h c t h c k h a i b ot r o n gm t k h i ( b nk h n gt h c t o nc uh o c t n h n gk b i n ) . B nc t h , t u yn h i n , s d n gm t n gk b i nn h l m t l pl u nc h n ht h c t r o n gm t c h c n n g( v d , t r o n gd a n hs c h i s ) . N i c h u n g , b nk h n gn nc g n gt h h a i o nt i uh a c a t r n hb i nd c h , v n c t h s l m m t c n gv i c t t h ns ov i b nc t h . V v y , n gk t k h a t t n h t l t r n h .

t n h
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 68/320

08/10/2013

Suy ngh trong C + +, Vol 1

C c t n ht k h a c n h i un g h a k h c n h a u . T h n gt h n g , b i n c n hn g h a a p h n g nm t c h c n n g b i nm t v oc u i p h mv i c h c n n g . K h i b ng i c h c n n gm t l nn a , l ut r c h oc c b i n c t or a t h e oc c hm i v c c g i t r c k h i t ol i . N ub nmu nc m t g i t r c c nt nt i t r o n g s u t c u c i c a m t c h n gt r n h , b nc t h n hn g h a b i nc c b c a m t c h c n n g c t n hv c h on m t g i t r b a n u . V i c k h i t o c t h c h i nm i c h l l n ut i nc h c n n g c g i , v c c d l i uv n g i c g i t r c a n g i a c c c u c g i c h c n n g . B n gc c hn y , m t c h c n n gc t h " n h " m t s p h n t h n gt i ng i a c c c u c g i c h c n n g . B nc t h t h i t i s a om t b i nt o nc uk h n g c s d n g t h a yt h . V pc a m t t n hb i nl n k h n gc s nb nn g o i p h mv i c h c n n g , v v yn k h n gt h v t n ht h a y i . N yl o c a l i z e s l i . D i yl m t v d v v i c s d n gc c t n hb i n :


// :C 0 3 :S t a t i c . c p p //S d n gm tb i nt n ht r o n gm tc h cn n g #I n c l u d eu s i n gn a m e s p a c es t d ; v o i df u n c( ){ s t a t i ci n ti=0 ; c o u t< <" i= "< <i++< <e n d l ; } i n tm a i n( ){ f o r( i n tx=0 ;x< 1 0 ;x++ ) f u n c( ) ; }/// : ~

M i c h c n n g( ) c g i t r o n gv n gl pf o r , n i nm t g i t r k h c n h a u . N ut k h a t n hk h n g c s d n g , g i t r i nr a s l u nl u nl ' 1 ' . n g h a t h h a i c a t n hl i nq u a n n ut i nt r o n g" k h n gc s nb nn g o i m t p h mv i n h t n h " c n g h a . K h i t n h c pd n gc h om t t nc h c n n gh o c m t b i n l b nn g o i c a t t c c c c h c n n g , n c n g h a l " t nn yk h n gc s nb nn g o i c a t pt i nn y . " T nc h c n n gh o c b i nl a p h n g c c t pt i n , c h n gt a n i r n gn c p h mv i t p t i n. Nh m t c u c b i ut n h , b i nd c hv l i nk t h a i t pt i ns a u y s g yr a m t l i m i l i nk t :


// :C 0 3 :F i l e S t a t i c . c p p //T pt i nt r n hd i np h mv i .B i ns o nv //L i nk tt pt i nn yv iF i l e S t a t i c 2 . c p p //S g yr am tl im il i nk t /P h mv i/t pt i nc n g h al c h c s nt r o n gt pt i nn y :s t a t i ci n tf s ; i n tm a i n( ){ f s=1 ; }/// :~

M c d b i nf s l y uc u t nt i n h m t e x t e r nt r o n gc c t pt i ns a u y , m i l i nk t s k h n gt mt h yn b i v n c t u y nb t n ht r o n gF i l e S t a t i c . c p p.
// :C 0 3 :F i l e S t a t i c 2 . c p p{ O }// a n gc g n g t h a mk h of se x t e r n i n tf s ;v o i df u n c( ){ f s=1 0 0 ; }/// :~

C c t n hs p e c i f i e r c n gc t h c s d n gb nt r o n gm t l p. L i g i i t h c hn ys b t r h o nc h o nk h i b n h c t or a c c l ph c , t r o n gc u ns c hn y .

n g o a i

C c e x t e r nt k h a c mt v c h n gmi n hm t t h i g i a nn g n . Nn i v i t r n hb i nd c hm m t b i n h o c m t c h c n n gt nt i , n g a yc k h i t r n hb i nd c hv nc h a n h nt h yn t r o n gc c t pt i nh i n a n g c b i ns o n . B i nn yh o c c h c n n gc t h c n hn g h a t r o n gm t t pt i nh o c t i pt c x u n gt r o n gt pt i n h i nt i . Nh m t v d v s a u :

// :C 0 3 :F o r w a r d . c p p //C h u y nc h cn n gv d l i uk h a ib o #I n c l u d eu s i n gn a m e s p a c es t d ; // yk h n gp h il t h cs b nn g o i ,n h n gc c //t r n hb i nd c hp h i cc h o b i tn t nt i u :e x t e r ni n ti ; e x t e r nv o i df u n c( ) ;i n tm a i n( ){ i=0 ; f u n c( ) ; }i n ti ;//C cd l i u n hn g h av o i df u n c( ){ i++ ; c o u t< <i ; }/ // :~

K h i t r n hb i nd c hg pp h i ' k h a i b oe x t e r ni n t i ' , n b i t r n g n hn g h a c h ot i p h i t nt i u n h m t b i nt o nc u . K h i t r n hb i nd c h t n hn g h a c a t i , k h n gc t u y nb k h c c t h n h nt h y , n b i t n t mt h yc n gt i t u y nb t r c t r o n gt pt i n . N ub n x c n ht i n h t n h, b ns n i v i t r n hb i n d c hm t i c x c n ht r nt o nc u( t h n gq u a e x t e r n) , n h n gn c n gc p h mv i t pt i n( t h n gq u a c c t n h) , d o t r n hb i nd c hs t or a m t l i .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 69/320

08/10/2013

Suy ngh trong C + +, Vol 1

L i nk t h i u c h n hv i c a Cv C++c h n gt r n h , b nc np h i b i t v m i l i nk t . T r o n gm t c h n gt r n ht h c h i n , m t n hd a n h c i d i nb i l ut r t r o n gb n h c h a m t b i nh o c m t c q u a nc h c n n gb i n s o n . L i nk t mt l ut r n yv n c x e mb i c c m i l i nk t . C h a i l o i l i nk t : l i nk t n i b v l i nk t b nn g o i . L i nk t n i b c n g h a l l ut r c t or a i d i nc h oc c n hd a n hd u yn h t c h oc c t pt i n c b i n s o n . C c f i l e k h c c t h s d n gt nn h nd n gc n gv i l i nk t n i b , h o c c h om t b i nt o nc u , v k h n g c x u n g t s c t mt h yb i c c m i l i nk t l ut r r i n gb i t c t or a c h om i n hd a n h . L i nk t n i b c x c n hb i c c t k h a t n ht r o n gCv C++ . L i nk t b nn g o i c n g h a l m t m n hd u yn h t c a l ut r c t or a i d i nc h on h nd n gc h ot t c c c f i l e a n g c b i ns o n . L ut r c t or a m t l n , v c c m i l i nk t p h i g i i q u y t t t c c c t i l i u t h a mk h ok h c l ut r . B i nt o nc uv t nc h c n n gc l i nk t b nn g o i . y c t r u yc pt c c t p t i nk h c b n gc c hk h a i b ov i t k h a e x t e r n. B i n c n hn g h a b nn g o i t t c c c c h c n n g( v i n g o i l c a c o n s t t r o n gC++ ) v c h c n n g n hn g h a m c n h l i nk t b nn g o i . B n c b i t c t h b u c h p h i c m i l i nk t n i b b n gc c hs d n gt n ht k h a . B nc t h n um t c c hr r n gr n gm t n hd a n h c l i nk t b nn g o i b n gc c h n hn g h a n v i e x t e r nt k h a . X c n hm t b i nh o c c h c n n gv i e x t e r n l k h n gc nt h i t t r o n gC , n h n g i k h i n l c nt h i t c h oc o n s t t r o n gC++ . T n gb i n( a p h n g ) c h t nt i t mt h i , t r n n g , t r o n gk h i m t c h c n n g a n g c g i . M i l i nk t k h n gb i t v c c b i nt n g , v d o , n h n gc k h n g l i nk t .

H n gs
T r o n gc ( t r c t i uc h u n ) C , n ub nmu nl mc h om t h n gs , b np h i s d n gt i nx l :
#D e f i n eP I3 . 1 4 1 5 9

k h pm i n i b ns d n gP I , g i t r 3 . 1 4 1 5 9 c t h a yb n gv i x l ( b nv nc t h s d n gp h n gp h p n yt r o n gCv C++ ) . K h i b ns d n gt i nx l t or a c c h n gs , b n t k i ms o t c a n h n gh n gs n mn g o i p h mv i c a t r n hb i nd c h . K h n gk i mt r a k i u c t h c h i nt r nt nP I v b nk h n gt h l y a c h c a P I ( d o b n k h n gt h v t q u a m t c o nt r h o c m t t h a mc h i u nP I ) . P I k h n gt h l m t b i nc a m t l o i n g i d n g n hn g h a . n g h a c a P I k od i t i mn c n hn g h a l s k t t h c c a t pt i n , t i nx l k h n gc n g n h nP h mv i . C++g i i t h i uc c k h i n i mv m t h n gs c t nl g i n gn h m t b i n , n g o i t r g i t r c a n k h n gt h t h a y i . S a i l nc o n s t c h ot r n hb i nd c hl m t t n i d i nc h om t h n gs . B t k l o i d l i u , t c hh p h o c n g i d n gx c n h , c t h c n hn g h a l c o n s t . N ub nx c n hm t c i g n h c o n s t v s a u c g n g s a i n , t r n hb i nd c hs t or a m t l i . B np h i x c n hk i uc a m t c o n s t , n h t h n y : i n tx=1 0 ; T r o n gt i uc h u nCv C++ , b nc t h s d n gm t t nl i nt c t r o n gm t d a n hs c h i s , t h mc h n u i s n l p yl m t c o nt r h o c m t t h a mc h i u( v d , b nc t h l y a c h c a m t c o n s t ) . M t c o n s t c m t p h mv i , g i n gn h m t b i nt h n gx u y n , v v yb nc t h " n " m t c o n s t b nt r o n gm t h mv c h c c h n r n gt nn ys k h n g n hh n g np h nc nl i c a c h n gt r n h . C c c o n s t c l yt C++v a v ot i uc h u nC , m c d k h k h c n h a u . T r o n gC , b i nd c hx l m t c o n s t g i n gn h m t b i nm c m t t h c b i t k mt h e o n i " K h n gt h a y i t i . " K h i b nx c n hm t c o n s t t r o n gC , t r n hb i nd c ht or a l ut r c h on , v v yn ub n n hn g h a n h i uh nm t c o n s t c c n gt nt r o n g h a i t pt i nk h c n h a u( h o c t n hn g h a t r o n gm t t pt i nt i u ) , m i l i nk t s t or a c c t h n gb ol i v c c c u c x u n g t . M c c hs d n gc o n s t t r o n gCl h o nt o nk h c v i m c c hs d n gc a n t r o n gC++ ( t r o n gn g nh n , n ph nt r o n gC++ ) . Gi t r k h n g i T r o n gC++ , m t c o n s t p h i l u nl u nc m t g i t r k h i t o( t r o n gC , i un yl k h n g n gs t h t ) . G i t r l i nt c c h ox yd n gt r o n gc c l o i c t h h i nl s t h pp h n , b t p h n , t h pl c p h n , h o c s d uc h m n g( t h t n gb u n , s n h p h nk h n g c c o i l q u a nt r n g ) , h o c n h k t . T r o n gt r n gh pk h n gc b t c ma n hm i k h c , t r n hb i nd c hg i n hm t g i t r k h n g i l m t s t h p p h n . S 4 7 , 0 , v 1 1 0 1 u c c o i l s t h pp h n . M t g i t r k h n g i v i m t s 0 u c x l n h m t s b t p h n( c b n8 ) . C s 8 c o ns c t h c h c h a c h s 0 7 , t r n hb i nd c hc c h s k h c n h l m t l i . M t s b t p h nh pp h pl 0 1 7 ( 1 5 t r o n g1 0 c s ) . M t g i t r k h n g i v i m t 0 x h n g u c c o i l m t s t h pl c p h n( c s 1 6 ) . C s 1 6 s c h a c c c h s
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 70/320

08/10/2013

Suy ngh trong C + +, Vol 1

0 9 v a f h o c A F . M t s h t h pl c p h nh pp h pl 0 x 1 f e ( 5 1 0 t r o n g1 0 c s ) . S d uc h m n gc t h c h a c c i mt h pp h n , q u y nh nt h e oc ps n h n( i d i nb i i nt , c n g h a l " 1 0 v i s c m n hc a " ) . C c c i mt h pp h nv i nt l t yc h n . N ub nc h n hm t h n gs c h om t b i nd uc h m n g , t r n hb i nd c hs c g i t r k h n g i v c h u y n i n v om t s d uc h m n g( q u t r n hn yl m t t r o n gn h n gh n ht h c c a n h n gg c g i l c h u y nk i uk h n g t n g ) . T u yn h i n , n l m t t n gt t s d n gh o c l m t i mt h pp h nh o c m t e n h c n h n g i c r n gb n a n gs d n g m t s d uc h m n g , m t s t r n hb i nd c hc c n gc ng i . G i t r h n gs d uc h m n gh pp h pl : 1 E 4 , 1 , 0 0 0 1 , 4 7 . 0 , 0 . 0 , v 1 . 1 5 9 e 7 7 . B nc t h t h mh ut b u c c c l o i f l o a t i n g p o i n t s : f h o c Fl c l n gm t f l o a t , Lh o c l b u c m t l u i , n uk h n gc o ns n ys l m t i . H n gs n h nv t l n h n gn h nv t c b a oq u a n hb i d un h y n , n h : ' Mt ' , ' 0 ' , ' ' . Nh nt h yc m t s k h c b i t l ng i a c c n h nv t ' 0 " ( A S C I I 9 6 ) v g i t r 0 . K t c b i t c i d i nv i c c " d ug c hc h o n g c t h o t " : ' \n' ( d n gm i ) , ' \t ' ( t a b ) , ' \\' ( d ug c hc h o ) , ' \r ' ( v nc h u y nt r l i ) , " \" ( i d un g o c k p ) , ' \' ' ( d un h y n ) , v v B nc n gc t h t h h i nh n gc h a r t r o n gb t p h n : ' \1 7 ' h o c t h pl c p h n : ' \x f f ' .

b a yh i
T r o n gk h i v n gl o i c o n s t c h ot r n hb i nd c h" n yk h n gb a og i t h a y i " ( c h op h pt r n hb i nd c h t h c h i nt i uh a t h m) , v n gl o i d b a yh i c h ot r n hb i nd c h" B nk h n gb a og i b i t k h i n o i un ys t h a y i , " v n g nc h nc c t r n hb i nd c ht h c h i nb t k t i uh a d a t r ns n n hc a b i n . S d n g t k h a n yk h i b n c m t s g i t r b nn g o i s k i ms o t c a m c a b n , c h n gh nn h n gk t r o n gm t p h nc n gg i a ot i p . M t b i n n gb i nl u nl u nl c b t c k h i n og i t r c a n l c nt h i t , n g a yc k h i n c h c n c c c d n gt r c . M t t r n gh p c b i t c a m t s l ut r l " n g o i t mk i ms o t c a m c a b n " l m t c h n gt r n h a l u n g . N ub n a n gx e m m t l c c b i t c s a i b i m t s i h o c q u t r n h , l c p h i l d b a yh i n nt r n hb i nd c hk h n gc g i n hr n gn c t h t i uh a i n h i ul n c c a l c . L ur n gb i n n gc t h k h n gc h i ul c k h i m t t r n hb i nd c hk h n gt i uh a , n h n gc t h n g n c h nl i q u a nt r n gk h i b nb t ut i uh a m ( t c l k h i t r n hb i nd c hs b t ut mk i md p h n g c ) . C c c o n s t v d b a yh i t k h a s t i pt c c c h i us n gt r o n gm t c h n gs a u .

K h a i t h cv s d n gc ah

P h nn yb a og mt t c c c n h k h a i t h c t r o n gCv C++ . T t c c c n h k h a i t h c s nx u t m t g i t r t t o nh n gc a h . G i t r n y c s nx u t m k h n gs a i c c p h pt o n , t r t r n gh p c c h u y nn h n g , t n g , v c c n h k h a i t h c g i m. S a i m t t o nh n g c g i l m t t c d n g p h . V i c s d n gp h b i nn h t c h oc c n h k h a i t h c m s a i t o nh n gc a h l t or a c c t c d n gp h , n h n gb nn nn h r n gg i t r s nx u t c s n s d n gc a b nc n gg i n gn h t r o n gc c n h k h a i t h c m k h n gc t c d n gp h .

P h nc n g

C h u y nn h n g c t h c h i nv i c c n h i uh n h=. Nc n g h a l " i t h e op h a b np h i ( t h n g c g i l r v a l u e ) v s a oc h pn v op h a b nt r i ( t h n g c g i l v t r i ) . " M t r v a l u e l b t k k h n g i , t h a y i , h o c b i uh i nc t h t or a m t g i t r , n h n gm t g i t r t r i p h i l m t k h c b i t , c t t nb i n ( c n g h a l , p h i c m t k h n gg i a nv t l , t r o n g l ut r d l i u ) . V d , b nc t h c h n hm t g i t r k h n g i c h om t b i n( A=4 ; ) , n h n gb nk h n gt h c h n hb t c i ug g i t r k h n g i n k h n g t h l m t g i t r t r i ( b nk h n gt h n i 4 =A ; ) .

Nh k h a i t h ct o nh c
C c n h k h a i t h c t o nh c c b nc n gg i n gn h n h n gc i c s nt r o n gh uh t c c n g nn g l pt r n h : c n g( +) , t r ( ) , c h i a ( / ) , n h n( * ) , v m u n( %, i un yt or a p h nc nl i t p h nc h i a s n g u y n ) . S n g u y n c h i a c t c c k t q u ( n k h n gt r n ) . C c n h i uh n hm u nk h n gt h c s d n gv i s d uc h m n g . Cv C++c n gs d n gm t k h i uv i t t t t h c h i nm t h o t n gv p h nc n gc n gm t l c . N y c k h i ul m t n h i uh n ht i pt h e ol m t d ub n g , v p h h pv i t t c c c n h k h a i t h c t r o n gc c n g n n g ( b t c k h i n on c n g h a ) . V d , t h m4 v ob i nx v g nx nk t q u , b nn i : x +=4 ; .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 71/320

08/10/2013

Suy ngh trong C + +, Vol 1

V d n yc h ot h yv i c s d n gc c t o nt t o nh c :
// :C 0 3 :M a t h o p s . c p p //K h a it h ct o nh c#i n c l u d eu s i n gn a m e s p a c es t d ; //M tv m h i nt h m tc h u iv m tg i t r . #X c n hI N( S T R ,V A R )\ c o u t< <S T R" = "< <V A R< <e n d l i n tm a i n( ){ i n ti ,j ,k ; n iu ,v ,w ; // pd n gc h ot n gg p i ,q u c o u t< <" n h pm ts n g u y n : " ; c i n> >j ; c o u t< <" n h pv om ts n g u y n : "; c i n> >k ; I N( " j " ,k ) ; I N( " k " ,k ) ; i =j + k ;I N( " j+k " ,i ) ; i=jk ;I N( " j -k " ,t i) ; i=k/j ;I N( " k/j " ,i ) ; i=k*j ;I N ( " k*j " ,i ) ; i=k %j ;I N( " k %j " ,i ) ; //C h c n gt r n hs a u yv is n g u y n : j %=k ;I N( " j %=k " ,k ) ; c o u t< <" N h p m ts i mn i : " ; c i n> >v ; c o u t< <" N h pk h cs i mn i :" ; c i n> >w ; I N( " v " ,v ) ;I N( " w " ,w ) ; u=v+w ,I N( " v+w " ,u ) ; u=v-w , I N( " v-w " ,u) ; u=v*w ,I N( " v*w " ,u ) ; u=v/w ,I N( " v/ w " ,u ) ; //C cc n gt r n hs a u yc h os n g u y n ,k t , //v t n gg p iq u : I N ( " u " ,u ) ;I N( " v " ,v ) , u+=v ;I N( " u+=v " ,u ), u-=v ;I N( " u-=v " ,u ) ; u*=v ;I N( " u*=v " ,u ) ; u/=v ;I N( " u/=v " ,u) ; }/// :~

C c r v a l u e s c a t t c c c t pt h , t t n h i n , l p h c t ph nn h i u . Gi i t h i uv ma c r ot i nx l Nh nt h yv i c s d n gc c ma c r oI N( ) t i t k i m n hm y( v l i n hm y ! ) . Ma c r ot i nx l t h e ot r u y n t h n g c t t nv i t t c c c c h c i i nh o a h n i b t b ns t mh i us a u r n gc c ma c r oc t h n h a n h c h n gt r n nn g u yh i m( v h c n gc t h r t h u c h ) . C c i s t r o n gd a n hs c ht r o n gn g o c ns a ut nv m c t h a yt h t r o n gt t c c c m s a un g o c n g . T i n x l l o i b c c t nI Nv t h a yt h c c m b t c n i n o c g i l v m , n nt r n hb i nd c hk h n gt h t or a b t k t h n gb ol i b n gc c hs d n gt nv m , v n k h n gl mb t k l o i k i mt r a t r nc c i s ( s a un y c t h c l i , n h t r o n gc c ma c r og l i p h nc u i c a c h n gn y ) . Nh k h a i t h c q u a nh t h i t l pm t m i q u a nh g i a c c g i t r c a t o nh n g . H s nx u t m t B o o l e a n( q u y n hv i b o o l t k h a t r o n gC++ ) n gn um i q u a nh l s t h t , v s a i n um i q u a nh l s a i . C c n h k h a i t h c q u a nh l : n h h n( <) , l nh n( >) , n h h nh o c b n g( < =) , l nh nh o c b n g( >=) , t n g n g( = = ) , v k h n gt n g n g( ! =) . H c t h c s d n gv i t t c c x yd n gt r o n gc c k i ud l i ut r o n gCv C++ . H c t h c n hn g h a c b i t i v i c c k i ud l i un g i d n g n hn g h a t r o n gC++( b ns t m h i uv i un yt r o n gc h n g1 2 , t r o n g b a og m i uh n hq u t i ) .

T o nt q u a nh

K h a i t h ch pl
C c t o nt l o g i c v ( && ) v h o c ( ||) t or a m t s t h t h o c s a i d a t r nc c m i q u a nh l o g i c c a l pl u n c a m n h . H yn h r n gt r o n gCv C++ , m t t u y nb l n gn un c m t g i t r k h c k h n g , v s a i n un c g i t r b n gk h n g . N ub ni nm t b o o l , b ns t h n gt h ym t ' 1 ' c h o n gv " 0 " c h os a i . V d n ys d n gc c t o nt q u a nh v h pl :
// :C 0 3 :B o o l e a n . c p p //Q u a nh v h pl c cn h k h a it h c . #I n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n ti ,j ; c o u t< <" N h pm ts n g u y n : " ; c i n> >i ; c o u t< <" N h pm ts n g u y n : " ; c i n > >j ; c o u t< <" i >jl "< <( i >j )< <e n d l ; c o u t< <" i< jl "< <( i< j )< <e n d l ; c o u t< <" i >=jl "< <( i >=j )< <e n d l ; c o u t< <" i< =jl " < <( i< =j )< < e n d l ; c o u t< <" i= =jl "< <( i= =j )< <e n d l ; c o u t< <" i=jl "< <( i !!=j ) < <e n d l ; c o u t< <" i& &jl "< <( i& &k )< <e n d l ; c o u t< <" t i||jl "< <( i| |j )< <e n d l ; c o u t< <" ( i< 1 0 )& &( j< 1 0 )l " < <( ( i< 1 0 )& &( j< 1 0 ) ) < < e n d l ; }/// :~

B nc t h t h a yt h c c n hn g h a i n t v i p h a oh o c t n gg p i t r o n gc h n gt r n ht r n . H yn h nb i t , t u y n h i n , v i c s os n hm t s d uc h m n gv i g i t r b n gk h n gl n g h i mn g t , m t s l c c p h nn h n h t k h c n h a ut m t s k h c v nc nm t s i mn i l c c b i t n h n h t " k h n gb n h n g . " t r nk h n gv nl s t h t .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 72/320

08/10/2013

Suy ngh trong C + +, Vol 1

Nh k h a i t h cB i t wi s e
C c n h k h a i t h c t r nb i t c h op h pb nt h a ot c b i t r i n gl t r o n gm t s ( k t k h i g i t r d uc h m n gs d n g m t n hd n gn i b c b i t , c c n h k h a i t h c B i t wi s e c h l mv i c v i c c l o i t c hr i : c h a r , i n t v d i ) . i u h n ht h c h i np h pt o n i s B o o l e a nt r nc c b i t t n g n gt r o n gc c i s t or a k t q u . C c p h pt o nv i uh n h( &) s nx u t m t t r o n gc c b i t ur a n uc h a i b i t uv ol m t t r o n gn h n g , n u k h n gn t or a m t s k h n g . C c p h pt o nh o c i uh n h( |) t or a m t m t t r o n gc c b i t ur a n um t t r o n gh a i b i t uv ol m t t r o n gn h n gs nx u t v m t s k h n gc h k h i c h a i b i t uv ob n gk h n g . C c p h pt o n c q u y nh o c , h o c X O R( ^) s nx u t m t t r o n gc c b i t ur a n um t h o c c c b i t uv ok h c l m t , n h n gk h n gp h i c h a i . C c p h pt o nk h n g ( ~, c n g c g i l b s u n g n h n g n g i i uh n h ) l m t n h i uh n hn g u y nn c h m t m t i s ( t t c c c n h k h a i t h c B i t wi s e k h c l c c t o nn h p h n ) . B i t wi s e k h n g s nx u t i d i nc a c c b i t uv om t n ub i t uv ol s k h n g , m t s k h n gn ub i t uv ol m t . Nh k h a i t h c B i t wi s e c t h c k t h pv i =d uh i u o nk t c c h o t n gv p h nc n g : & =, |= , v ^ =l t t c c c h o t n gh pp h p( t ~l m t t o nt nh n gn k h n gt h c k t h pv i =d uh i u ) . C c n h k h a i t h c d c hc h u y nc n gt h a ot c b i t . C c n h i uh n ht r i c a ( < <) s nx u t c c t o nh n gb nt r i c a c c n h i uh n hc h u y ns a n gc n ht r i s b i t c c h n hs a uk h i c c n h i uh n h . C c n h i uh n h p h i t h a y i ( > >) s nx u t c c t o nh n gb nt r i c a c c n h i uh n hc h u y ns a n gb np h i b n gs b i t c c h n hs a uk h i c c n h i uh n h . N ug i t r s a uk h i c c n h i uh n hd c hc h u y nl nh ns b i t t r o n gt o n h n gb nt r i , k t q u l k h n gx c n h . N ut o nh n gb nt r i l u n s i g n e d , s t h a y i p h i l m t s t h a y i h pl c c b c t r ns c l p yv i s k h n g . N ut o nh n gb nt r i c k k t , s t h a y i p h i c t h h o c k h n gt h l m t s t h a y i h pl ( c n g h a l , h n hv i n yl k h n gx c n h ) . T h a y i c t h c k t h pv i d ub n g( =< <v > >=) . V t r i c t h a yt h b i g i t r t r i c h u y nb i r v a l u e . M t v d c h n gmi n hv i c s d n gc a t t c c c n h k h a i t h c l i nq u a n nb i t n h n gg s a ul . ut i n , yl m t c h c n n gc m c c hc h u n gi nm t b y t e t r o n g n hd n gn h p h n , t or a m t c c hr i n gb i t n c t h d d n gt i s d n g . C c t pt i nt i u k h a i b ot h t c :
// :C 0 3 :p r i n t B i n a r y . h//H i nt h m tb y t et r o n gh n h p h nt r n gp r i n t B i n a r y ( c o n s tu n s i g n e dc h a rv a l ) ;/// :~

C cn h k h a i t h cd c hc h u y n

yl v i c t h c h i nc c c h c n n g :
// :C 0 3 :p r i n t B i n a r y . c p p{ O }#i n c l u d et r n gp r i n t B i n a r y( c o n s tu n s i g n e dc h a rv a l ){ f o r( i n ti=7 ;i >=0 ;i) n u( v a l&( 1< <i) ) s t d: :c o u t< <" 1 " ; k h c s t d: :c o u t< <" 0 " ; }/// :~

C c p r i n t B i n a r y(c h c n n gc m t b y t e d u yn h t v h i nt h n b i t ) b y b i t .C c b i uh i n
( 1< <i )

s nx u t m t t r o n gm i v t r b i t l i nt i p ; t r o n gh n h p h n : 0 0 0 0 0 0 0 1 , 0 0 0 0 0 0 1 0 , v vN ub i t n yl p h pt o nv e dv i v a l v k t q u l k h c k h n g , n c n g h a l c m t v t r t r o n gv a l . C u i c n g , c c c h c n n g c s d n gt r o n gc c v d c h ot h yc c n h k h a i t h c b i t ma n i p u l a t i o n :
// :C 0 3 :B i t w i s e . c p p //{ L }p r i n t B i n a r y //T r n hd i nt h a ot cb i t #B a og m" p r i n t B i n a r y . h "#i n c l u d eu s i n gn a m e s p a c es t d ; //M tm a c r o t i tk i mg :#x c n hP R( S T R ,E X P R )\ c o u t< <S T R ;p r i n t B i n a r y ( E X P R ) ;c o u t< <e n d l ; i n tm a i n( ){ i n tg e t v a l ; u n s i g n e dc h a ra ,b ; c o u t< <" N h ps t 0 n2 5 5 : " ; c i n> >g e t v a l ;a=g e t v a l ; P R( " m tt r o n gh n h p h n " ,a ) ; c o u t< <" N h ps t 0 n2 5 5 : " ; c i n> >g e t v a lb=g e t v a l ; P R( " bt r o n gh n h p h n " ,b ) ; P R( " a|b= " ,a|b ) ; P R( " a&b= " ,a&b ) ; P R( " a^b= " ,a^b ) ; P R( " ~a= " ,~a ) ; P R( " ~b= " ,~b ) ; //M tm ub i tt h v : u n s i g n e dc h a rc=0 x 5 A ; P R( " ct r o n gh n h p h n " ,c ) ; a|= c ; P R( " a|=c ;a= " ,a ) ; b&=c ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 73/320

08/10/2013

Suy ngh trong C + +, Vol 1

P R( " bv c=b= " ,b ) ; P R( " b^=a ;b= " ,b ) ; }/// :~

b^=a ;

M t l nn a , m t v mt i nx l c s d n g t i t k i mg p h m. Ni nc h u i c a s l a c h nc a b n , s a u b i ud i nn h p h nc a m t b i ut h c , s a u m t d n gm i . T r o n gma i n( ) , c c b i nk h n gd u. i un yl b i v , n i c h u n g , b nk h n gmu nd uh i uk h i b n a n gl m v i c v i b y t e . M t i n t p h i c s d n gt h a yv m t c h a r c h og e t v a l v " c i n> >" t u y nb n uk h n gs i x v i c c c h s ut i nl m t n h nv t .B n gc c hc h n hg e t v a l nmt v b, g i t r c c h u y n i t h n h m t b y t e ( b n gc t b n ) . C c < <v > >c h ob i t c h u y nh n hv i , n h n gk h i h c h u y nc c b i t r a k h i c u i c a s l n g , n h n gb i t b m t ( n t h n gn i r n gh r i v oh u y nt h o i c h t x , m t n i m b i t l o i b k t t h c , c l h c t h c t i s d n g . . . ) . K h i t h a ot c b i t , b nc n gc t h t h c h i nl u nc h u y n, c n g h a l c c b i t m r i r a k h i m t u c a t r l i uk i a , n h t h h a n g c l u nc h u y nx u n gq u a n hm t v n g . M c d h uh t c c b x l m yt n h c u n gc pm t m yc px o a yl n h( v v yb ns n h nt h yn t r o n gn g nn g l pr pc h ob v i x l ) , k h n gc h t r t r c t i pc h o" x o a y " t r o n gCh o c C++ . C l c c n h t h i t k c a Cc mt h yh pl t r o n g l i " x o a y " r a ( m c t i u , n h h n i , c h om t n g nn g t i t h i u ) b i v b nc t h x yd n gl n hr i n gx o a yc a b n . V d , y l c h c n n g t h c h i np h pq u a yt r i v b np h i :
// :C 0 3 :R o t a t i o n . c p p{ O } //T h ch i np h pq u a yt r iv b np h i u n s i g n e dc h a rr o l( u n s i g n e dc h a rv a l ){ i n th i g h b i t ; i f( v a l&0 x 8 0 )//0 x 8 0l b i tc a oc h h i g h b i t=1 ; k h c h i g h b i t=0 ; //D c hc h u y nt r i( p h ad ic h tt r t h n h0 ) : v a l< <=1 ; //X o a yc h tc a ol np h ad i : v a l|=h i g h b i t ; v a lt r l i ; } u n s i g n e dc h a rR O R( u n s i g n e dc h a rv a l ){ i n tl o w b i t ; i f( v a l&1 )//K i m t r ac cb i tt h p l o w b i t=1 ; k h c l o w b i t=0 ; v a l> >=1 ;//p h i t h a y im tv t r //R o t a t ec cb i tt h pv o u : v a l|=( l o w b i t< <7 ) ; v a lt r l i ; }/// :~

H yt h s d n gc c c h c n n gn yt r o n gB i t wi s e . c p p. C h c c n hn g h a ( h o c t n h t l t k h a i ) c a r o l ( ) v R OR( ) p h i c n h nt h yb i t r n hb i nd c ht r o n gB i t wi s e . c p pt r c k h i c c c h c n n g c s d n g . C c c h c n n gt r nb i t n i c h u n gc c k h i uq u s d n gv h d c ht r c t i pv ob oc oh i n gn g nn g . i k h i m t nCh o c C++t u y nb s t or a m t d n gm l pr p .

K h a i t h cn g u y np h n

B i t wi s e k h n g k h n gp h i l c c n h i uh n hd u yn h t m t i s d u yn h t . n gh n hc an , l h pl k h n g( ! ) , s c m t s t h t g i t r v s nx u t m t s a i g i t r . C c n g u y np h nt r ( ) v n g u y np h nc n gv i ( +) l c c t o nt g i n gn h t r n h p h nv c n g ; c c s l i ut r n hb i nd c hr as d n g c t h i t k b n gc c hn yb nv i t b i ut h c . V d , c ul n hx = a ; c m t n g h a r r n g . T r n hb i nd c hc t h t mr a : x=a* b ; n h n gn g i c c t h b l nl n , v v yn l a nt o nh n n i : x=a*( b ) ; S a uk h i t r n g u y np h nt or a t i uc c c a g i t r . Ng u y np h nc n gv i c u n gc p i x n gv i t r n g u y n p h n , m c d n k h n gt h c s l mb t c i ug . C c n h k h a i t h c t n gv g i mb t ( ++v ) c g i i t h i ut r c t r o n gc h n gn y . yl n h n gn h k h a i t h c c h k h c s ov i n h n gl i nq u a n nc h u y nn h n gc t c d n gp h . C c n h k h a i t h c t n gh o c g i m b i nb i m t nv , m c d " nv " c t h c n g h a k h c n h a ut yt h u c v ol o i d l i u i un y c b i t n gv i c o nt r . C c n h k h a i t h c n g u y np h nc u i c n gl a c h c a ( &) , t i c h( * v >) , v c c n h k h a i t h c d nd i nv i n t r o n gCv C++ , v mi v x a t r o n gC++ . a c h c a v t i c h c s d n gv i c o nt r , c mt t r o n g c h n gn y . c c mt s a ut r o n gc h n gn y , v mi v x a c g i i t h i ut r o n gc h n g4 .

Nh i uh n ht e r n a r y

C c b c b a n u k h c l b t t h n gb i v n c b a t o nh n g . Nt h c s l m t n h i uh n hv n t or a m t g i t r , k h n gg i n gn h b n ht h n gn u k h c t u y nb . Nb a og mb a b i ut h c : n ub i ut h c ut i n( t h e o s a ul m t ? ) n hg i n g, b i ut h c s a u? c n hg i v k t q u c a n t r t h n hg i t r s nx u t b i c c
74/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

n h i uh n h . N uc c b i uh i n ut i nl s a i , b i ut h c t h b a ( s a u: ) c t h c h i nv k t q u c a n t r t h n hg i t r s nx u t b i c c n h i uh n h . C c n h i uh n hc i uk i nc t h c s d n gc h oc c t c d n gp h c an h o cc h og i t r s nx u t n . D i yl m t o nm c h n gt c h a i : m t=-b ?b :( b=9 9 ) ; y , i uk i ns nx u t c c r v a l u e . mt c g nc h og i t r c a bn uk t q u c a g i mc c bl k h c k h n g . N ub t r t h n hk h n g , mt v b ug i a oc h o9 9 . bl u nl u ng i m i , n h n gn c g nc h o9 9 c h k h i l n gg i mg yr a b t r t h n h0 . M t t u y nb t n gt c t h c s d n gm k h n gc " a =" c h l t c d n gp h c a n :


-B ?b :( b=9 9 ) ;

yBt h h a i l k h n gc nt h i t , v g i t r s nx u t b i c c n h i uh n hl k h n gs d n g . M t b i ut h c c y uc ug i a ? v : . T r o n gt r n gh pn y , k h i n i m ng i nc t h l m t h n gs m c t h l mc h om c h y n h a n hh nm t c h t .

C cn h i uh n hd up h y
D up h yk h n gb g i i h nt c ht nb i nt r o n gn h i u n hn g h a , c h n gh nn h i n ti ,j ,k ; T t n h i n , n c n g c s d n gt r o n gd a n hs c h i s c h c n n g . T u yn h i n , n c n gc t h c s d n gn h m t n h i uh n h b i ut h c r i n gb i t t r o n gt r n gh pn yn t or a c h c g i t r c a b i ut h c c u i c n g . T t c c c p h nc nl i c a b i ut h c t r o n gd a n hs c hb n gd up h y c n hg i c h c t c d n gp h c a h . V d n yg i a t n gm t d a n hs c hc c b i nv s d n gc u i c n gl r v a l u e :
// :C 0 3 :C o m m a O p e r a t o r . c p p#i n c l u d eu s i n gn a m e s p a c es t d ;i n tm a i n( ){ i n ta= 0 ,b=1 ,c=2 ,d=3 ,e=4 ; a=( b++ ,C++ ,d++ ,e++ ) ; c o u t< <" a = "< <a< <e n d l ; //C cn g o cq u a nt r n g y .N uk h n gc //c h n g ,t u y nb s n hg i : ( A=b++ ) ,c ,d++ ,e++ ; c o u t< <" a= "< <a< <e n d l ; }/// :~

C m b yp h b i nk h i s d n gc cn h k h a i t h c

N i c h u n g , t t n h t l t r n hs d n gd up h yn h b t c i ug k h c h nl m t d up h nc c h , k t k h i n g i d nk h n g c s d n g n h nt h yn n h l m t n h i uh n h . Nh mi n hh a t r n , m t t r o n gn h n gc mb yk h i s d n gc c n h k h a i t h c a n gc g n g c c i k h n g c d un g o c k h i b nt h mc h c nc h t t n h t l k h n gc h c c h nv c c hm t b i us n hg i ( t h a mk h o k i n Cd n a p h n gv n h n gt n hg i b i ut h c ) . M t l i r t p h b i nn h s a u :

// :C 0 3 :P i t f a l l . c p p //S a il m i uh n h i n tm a i n( ){ i n ta=1 ,b=1 ; //. . . . } }/// :~

t r o n gk h i( a=b ){

B oc ok t q u a =bs l u nl u n n hg i n gk h i bl k h c k h n g . B i nmt c g nc h og i t r c a b, v g i t r c a bc n g c s nx u t b i c c n h i uh n h=. N i c h u n g , b nmu ns d n gc c n h i uh n h t n g n g= =t r o n gm t t u y nb c i uk i n , k h n gc h u y nn h n g . N yc nr t n h i ul pt r n hv i n( t u y n h i n , m t s t r n hb i nd c hs c h r a n h n gv n c h ob n , l h u c h ) . M t v n t n gt c n g c s d n gt o nt v v h o c t h a yv c c i t c h pl c a h . B i t wi s e v v h o c s d n gm t t r o n gn h n gn h nv t ( v h a y|) , t r o n gk h i l o g i c v v h o c s d n gh a i ( && v ||) . C n gn h v i =v = =, t h t d d n gc h c ng m t k t t h a yv h a i . M t t h i t b g h i n h h u c hl q u a ns t r n g" B i t n h h n , v v yh k h n gc np h i n h n h i un h nv t t r o n gc c n h k h a i t h c c a h . "

Nh k h a i t h c c
T d i nv i n c s d n gt r o n gn g h a c a " c v om t k h u n . " T r n hb i nd c hs t n gt h a y i m t l o i d l i uv om t n un c n g h a . V d , n ub nc h n hm t g i t r g nl i nv i m t b i nd uc h m n g , t r n h b i nd c hs b m t g i m t c h c n n g( h o c c t h h n , c h nm ) c h u y n i i n t m t p h a o. c c h op h p b nt h c h i nc h u y n i l o i h n hn yr r n g , h o c b u c n k h i n s k h n gb n ht h n gx yr a . t h c h i nm t d i nv i n , t c c k i u( b a og mt t c c c b i n ) b nt r o n gd un g o c nb nt r i c a g i t r . G i t r n yc t h l m t b i n , m t h n gs , g i t r s nx u t b i m t b i ut h c , h o c g i t r t r v c a m t h m. y
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 75/320

08/10/2013

Suy ngh trong C + +, Vol 1

l m t v d :
// :C 0 3 :S i m p l e C a s t . c p pi n tm a i n( ){ ( u n s i g n e dl o n gi n t )b ; }/// :~ i n tb=2 0 0 ; u n s i g n e dl o n ga=

c l m n hm , n h n gn c t h g y a u uv t r o n gm t s t r n gh pn b u c c c t r n hb i nd c h x l d l i un h t h n l ( v d ) l nh nt h c t , v v yn s c h i mn h i uk h n gg i a nt r o n gb n h , i un yc t h c h pl nt r nc c d l i uk h c . i un yt h n gx yr a k h i c c o nt r , k h n gp h i k h i l md i nv i n n g i nn h m t h i nt h t r n . C++c m t c p h p c t h m, m t h e oc p h pg i h m. C p h pn y t d un g o c x u n gq u a n hc c t h a m s , n h m t c u c g i c h c n n g , c h k h n gp h i l x u n gq u a n hc c k i ud l i u :
// :C 0 3 :F u n c t i o n C a l l C a s t . c p pi n tm a i n( ){ f l o a ta=f l o a t( 2 0 0 ) ; // i un yt n g n gv i : n ib=( f l o a t )2 0 0 ; }/// :~

C+ + d i nv i nr r n g

T t n h i nt r o n gt r n gh pt r nb ns k h n gt h c s c nm t d i nv i n , b nc h c t h n i 2 0 0 F( t r o n gt h c t , l n h n gg t h n gt r n hb i nd c hs l mc h os b i uh i n t r n ) . D i nv i nt h n g c s d n gt h a yv v i c c b i ns , c h k h n gp h i l h n gs . D i nv i nn n c s d n gm t c c hc nt h n , b i v n h n gg b n a n gt h c s l ml n i v i t r n hb i nd c h " H yq u n i k i mt r a k i u i x v i n n h c c l o i k h c t h a yt h " . l , b n a n gg i i t h i um t l t r o n gC +H t h n g+l o i v n g nc h nc c t r n hb i nd c ht n i v i b nr n gb n a n gl m m t c i g s a i v i m t l o i . Nh n gg t i t h n , c c t r n hb i nd c ht i nr n gb nm c n h i nv k h n gt h c h i nb t k k i mt r a k h c b t l i . M t k h i b nb t u c , b nm l n gm n hc h ot t c c c l o i v n . T r o n gt h c t , b t k c h n gt r n h s d n gr t n h i ud i nv i nn n c x e mv i s n g h i n g , k h n gc v n b a on h i ub n a n gn i v i n c h ng i nl " p h i " c t h c h i nt h e oc c h . Nh nc h u n g , d i nv i nn n t v b c l pv i c c g i i p h pc a c c v n r t c t h . M t k h i b nh i u c i un yv c t r n hb yv i m t c h n gt r n hl i , n g h i n g ut i nc a b nc t h t m k i md i nv i nl t h p h m. Nh n gl mt h n o b nx c n hv t r d i nv i nC p h o n gc c h ? H c h ng i n l g t nb nt r o n gd un g o c n , v n ub nb t us nt mn h n g i u b ns k h mp h r a r n gn t h n gk h p h nb i t v i p h nc nl i c a m c a b n . T i uc h u nC++b a og m m t c p h pd i nv i nr r n gc t h c s d n g t h a yt h h o nt o nc c d i n v i nC p h o n gc c hc ( t t n h i n , d nd i nv i nC p h o n gc c hk h n gt h n g o i v n gp h pl u t m k h n gv i p h m m , n h n gn h v nb i nd c hc t h d d n g n hd up h i t h e op h o n gc c hc c h ob n ) . C p h pd i n v i nr r n gl n h v ym b nc t h d d n gt mt h yc h n g , b nc t h t h yb n gt nc a h : s t a t i c _ c a s t C h o" c x t t " v " H pl c n gc x " d i nv i n , b a og mc n h n g i ub nb y g i c t h l m m k h n gc m t d nd i nv i n( n h m t l o i c h u y n i t n g ) . B i c o n s t v /h o c d b a yh i . c m t n g h a h o nt o n k h c n h a u . i uq u a nt r n gl b ns c np h i t r l i t h n hc c l o i b a n u s d n gn m t c c ha n t o n . L o i b b n t h n gc h c s d n gc h oc h t t wi d d l i n g h o c m t s m c c hb nk h c . i un yl n g u yh i mn h t c a t t c c c d i nv i n . C h od o wn c a s t i n gl o i a nt o n ( d i nv i nn ys c mt t r o n gc h n g1 5 ) .

c o n s t _ c a s t r e i n t e r p r e t _ c a s t

d y n a mi c _ c a s t

B a d i nv i nr r n g ut i ns c mt y h nt r o n gc c p h ns a u , t r o n gk h i n g i c u i c n gc t h c t h h i nc h s a uk h i b n h c c n h i uh n , t r o n gC h n g1 5 . s t a t i c _ c a s t
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 76/320

08/10/2013

Suy ngh trong C + +, Vol 1

M t s t a t i c _ c a s t c s d n gc h ot t c c c c h u y n i c x c n hr . C h n gb a og m" a nt o n " c h u y n i l t r n hb i nd c hs c h op h pb nl m m k h n gc m t d nd i nv i nv c h u y n i t a nt o nm d s a o we l l d e f i n e d . C c l o i c h u y n i c b a op h b i s t a t i c _ c a s t b a og mc h u y n i i nh n hc a s t l e s s , t h uh p ( t h n gt i nm g i m) c h u y n i , b u c m t c h u y n i t m t v o i d* , c h u y n i k i un g m, v c h u y nh n g t n hc a p h nc pl p( v b nk h n gn h nt h yc c l ph c , t h a k n h n g , C h c u i c n gn ys b t r h o n c h o nk h i c h n g1 5 ) :
// :C 0 3 :s t a t i c _ c a s t . c p pv o i df u n c( i n t ){ } i n tm a i n( ){ i n ti=0 x 7 F F F//M a xp o sg i t r =3 2 7 6 7 l o n gl ; //( 1 )c h u y n ic a s t l e s st i ub i u : l=i ; f=i ; //C n gl mv i c : l=s t a t i c _ c a s t< l o n g >( i ) ; f=s t a t i c _ c a s t< f l o a t >( i ) ; // ( 2 )c h u y n ih p : i=l ;//C t h m tc h s i=f ;//C t h m tt h n gt i n //N i" T ib i t , "l o ib c n hb o : i=s t a t i c _ c a s t< i n t >( l ) ; i=s t a t i c _ c a s t< i n t >( f ) ; c h a rc= s t a t i c _ c a s t< c h a r >( i ) ; //( 3 )B u cc h u y n it v o i d* : v o i d*v p=& i ; //C c c ht or am tc h u y n in g u yh i m : //C c hm il n g u yh i mk h n gk m : f p=s t a t i c _ c a s t< f l o a t * >( v p ) ; f l o a tf ;

f l o a t*f p=( f l o a t* )v p ;

//( 4 )c h u y n ik i un g m ,b n ht h n g //t h ch i nb it r n hb i nd c h : d o u b l ed=0 , 0 ; i n tx=d ;//T n gc h u y n i x=s t a t i c _ c a s t< i n t >( d ) ;// r r n gh n c h cn n g( d ) ;//T n gc h u y n i c h cn n g( s t a t i c _ c a s t< i n t > ( d ) ) ;//r r n gh n }/// :~

T r o n gm c ( 1 ) , b ns t h yc c l o i c h u y n i b n a n gs d n g l mt r o n gC , c h o c k h n gc m t d nd i n v i n . T h c yt m t i n t nm t l uh a yn i k h n gp h i l m t v n b i v s a un yl u nl u nc t h c h a t t c c c g i t r m m t i n t c t h c h a . M c d n k h n gc nt h i t , b nc t h s d n gs t a t i c _ c a s t l mn i b t n h n gc h n gt r n hk h u y nm i . C h u y n i t r l i c o n n gk h c c h i nt h t r o n g( 2 ) . y , b nc t h b m t d l i ub i v m t i n t k h n g p h i l " r n g " n h m t l uh o c n i , n s k h n gg i s c c n gk c ht h c . D o c h n g c g i l t h uh p c h u y n i . T r n hb i nd c hv ns t h c h i nc c , n h n gt h n gs c u n gc pc h ob nm t c n hb o . B nc t h l o i b c n hb on yv c h ob i t r n gb nt h c s c n g h a l n s d n gm t d nd i nv i n . G i a ot m t v o i d* k h n g c p h pm k h n gc m t d nd i nv i nt r o n gC++( k h n gg i n gn h C ) , n h t h yt r o n g( 3 ) . i un yr t n g u yh i mv y uc ul pt r n hv i nb i t n h n gg h a n gl m. C c s t a t i c _ c a s t , t n h t , l d d n gh n x c n hv t r s ov i c c d i nv i nc h u nc k h i b n a n gs nb nc h ol i . P h n( 4 ) c a c h n gt r n hc h ot h yc c l o i c h u y n i k i un g m c t h n g c t h c h i nt n gb i t r n h b i nd c h . yl t n gv k h n gc n c , n h n gm t l nn a s t a t i c _ c a s t n h nm n hc c h n h n gt r o n g t r n gh pb nmu nl mc h on r r n gn h n gg a n gx yr a h o c s nl n gn s a un y . c o n s t _ c a s t N ub nmu nc h u y n i t m t c o n s t nm t k h n gc o n s t h o c t m t b i n n g i v i n g i k h n gn n h, b ns d n gc o n s t _ c a s t . yl c h c h op h pc h u y n i v i c o n s t _ c a s t , n ub t k c h u y n i k h c c l i nq u a n nn p h i c t h c h i nb n gm t b i uh i nr i n gb i t h o c b ns n h n c m t l i t h i g i a nb i n d c h .


// :C 0 3 :c o n s t _ c a s t . c p pi n tm a i n( ){ i n ti=0 ; i n t*j=( i n t* )& i ;//P h n h n ht h c j =c o n s t _ c a s t< i n t * >( &i ) ;// at h c h //c t h ' tl m n gt h i ct h m :// !d i*l=c o n s t _ c a s t< l o n g * >( &i ) ;//L i d b a yh ii n tk=0 ; i n t*u=c o n s t _ c a s t< i n t * >( &k ) ; }/// :~

N ub nl y a c h c a m t c o n s t i t n g , b nt or a m t c o nt r nm t c o n s t , v i un yk h n gt h c g i a oc h om t t c h c p h i c o n s t c o nt r m k h n gc m t d i nv i n . C c d i nv i nt h e op h o n gc c hc s t h c h i n i un y , n h n gc c c o n s t _ c a s t l m t c i t h c hh p s d n g . i un yc n g n gc h od b a yh i . r e i n t e r p r e t _ c a s t yl a nt o nn h t t r o n gn h n gc c h c , v m t t r o n gn h i uk h n n g s nx u t l i . M t r e i n t e r p r e t _ c a s g i v r n gm t i t n gl t c h l m t m ub i t c t h c i ut r ( i v i m t s m c c ht i ) n h t h n l m t l o i h o nt o nk h c n h a uc a c c i t n g . yl c h t c pt h pt wi d d l i n gr n gCl n i t i n gv i . B ns h un h l u nl u nc np h i r e i n t e r p r e t _ c a s t r l i k i ub a n u( h o c n uk h n g i ut r t b i nn h l o i b a n u
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 77/320

08/10/2013

Suy ngh trong C + +, Vol 1

c a n ) t r c k h i l mb t c i ug k h c v i n .
// :C 0 3 :r e i n t e r p r e t _ c a s t . c p p#i n c l u d eu s i n gn a m e s p a c es t d ;i n ts z= 1 0 0 ; c ut r cX{ i n ta[ S Z ] ; } ; v o i dp r i n t( X*x ){ f o r( i n ti=0 ;i< s z ;i++ ) c o u t< <x >a[ i ]< <" " ; < <e n d l< <" --" < <e n d l ; } i n tm a i n( ){ xx ; i n( &x ) ; i n t*x p=r e i n t e r p r e t _ c a s t< i n t * >( & x ) ; f o r( i n t*i=x p ;i< x p+s z ;i++ ) *I=0 ; //K h n gt h s d n gx pn h m tX*v ot h i i mn y //t r k h ib nb n t r l i : i n( r e i n t e r p r e t _ c a s t< X * >( x p ) ) ; //T r o n gv d n y ,b nc n gc t h c h c ns d n g //n h nd n gb a n u : i n( &x ) ; }/// :~

c o u t

T r o n gv d n y ng i n , c ut r c Xc h c h a m t m n gc a i n t , n h n gk h i b nt om t t r ns t a c kn h t r o n gXx , c c g i t r c a m i i n t s l r c t h i ( i un y c t h h i nb n gc c hs d n gi n( ) c h c n n g h i nt h n i d u n gc a c ut r c ) . k h i t oc h oh , a c h c a X c t h c h i nv c m t i n t c o nt r , s a u i q u a c c m n gt h i t l pm i i n t k h n g . C h c c g i i h nt r nc h ot i c t n hb n gc c h" t h m" S Z x p, t r n hb i n d c hb i t r n gb nt h c s mu ns z l nh nv t r c o nt r x pv n h i nc o nt r s h c c h n hx c c h ob n . t n gc a r e i n t e r p r e t _ c a s l k h i b ns d n gn , n h n gg b nn h n c l t x a l m n k h n gt h c s d n gc h om c c hb a n uc a l o i t r k h i b nb n t r l i . y , c h n gt a t h yc c d i nv i nt r l i m t * X t r o n gc c c u c g i ni n , n h n gt t n h i nk t k h i b nv nc nc n h n gn h nd n gb a n ub nc n gc t h s d n g . Nh n gx pc h h ud n gn h m t i n t * , m t h c s l m t " t i d i n " c a b ng c X. M t r e i n t e r p r e t _ c a s t h n gc h r a k h n gk h nn g o a nv /h o c n o n p o r t a b l e t l pt r n h , n h n gn c s nk h i b n q u y t n hb np h i s d n gn .

s i z e o f -m tn h i uh n ht
C c s i z e o f i uh n h n gm t m n hb i v n p n gm t n h uc ub t t h n g . s i z e o f c u n gc pc h ob nt h n g t i nv s l n gb n h c p h nb c h oc c h n gm c d l i u . Nh mt t r o n gc h n gn y , s i z e o f c h ob n b i t s l n gb y t e c s d n gb i b t k b i nc t h . Nc n gc t h c u n gc pc h oc c k c ht h c c a m t k i u d l i u( k h n gc t nb i n ) :
// :C 0 3 :s i z e o f . c p p#i n c l u d eu s i n gn a m e s p a c es t d ;i n tm a i n( ){ c o u t< <" s i z e o f ( d o u b l e )= "< <s i z e o f( d o u b l e ) ; c o u t< <" ,s i z e o f( c h a r )= "< <s i z e o f( c h a r ) ; }/// :~

T h e o n hn g h a , s i z e o f b t k l o i c h a r ( k , k h n gd uh o c n gb n g ) l u nl u nl m t , b t k v i c l ut r c b nc h om t c h a r t h c s l m t b y t e . i v i t t c c c l o i k h c , k t q u l k c ht h c t h e ob y t e . L ur n gs i z e o f l m t n h i uh n h , k h n gp h i l m t c h c n n g . N ub n pd n gn v om t l o i , n p h i c s d n gd i h n ht h c t r o n gn g o c nh i nt h t r n , n h n gn ub n pd n gn v om t b i n , b n c t h s d n gn m k h n gc d un g o c n :
// :C 0 3 :s i z e o f O p e r a t o r . c p pi n tm a i n( ){ s i z e o fx ; }/// :~ i n tx ; i n ti=

s i z e o f c n gc t h c u n gc pc h ob nc c k c ht h c c a c c k i ud l i un g i d n g n hn g h a . N y c s d n gt r o n gc u ns c hn y .

C ct k h aa s m

yl m t c c h t h o t c h op h pb nv i t m l pr pc h op h nc n gc a b nt r o n gm t c h n gt r n hC+ . T h n g t h n gb nc t h t h a mk h oC++b i nt r o n gm l pr p , c n g h a l b nc t h d d n gg i a ot i pv i b nC++ v h nc h m l pr p c nt h i t c h ov i c i uc h n hh i uq u h o c s d n gh n gd nx l c b i t . C p h p c h n hx c m b np h i s d n gk h i v i t n g nn g l pr pl t r n hb i nd c hp h t h u c v c t h c p h t h i n t r o n gt i l i ut r n hb i nd c hc a b n .

K h a i t h cr r n g
yl n h n gt k h a c h oc c n h k h a i t h c B i t wi s e v h pl . L pt r n hv i nn g o i n c M m k h n gc nk t b np h mn h & , |, ^, v n h v y , b u c p h i s d n gk h n gk h i pCt r i g r a p h s , k h n gc h g yp h i n n h i u g , n h n g t n g i b i t k h i c . N y c s a c h a t r o n gC++v i t k h o b s u n g : T k h a v C n g h al && ( h pl v )
78/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

h o c k h n g n o t _ e q b i t a n d a n d _ e q b i t o r o r _ e q X OR T k h a x o r _ e q c o mp l

||( l o g i c h o c ) ! ( l o g i c K HNG ) = ! ( l o g i c k h n gt n g n g ) &( b i t wi s e v ) & =( p h pt o nv p h n c n g ) |( b i t wi s e h o c ) |=( b i t wi s e h o c p h n c n g ) ^( b i t wi s e c q u y nh a y ) C n g h al ^=( B i t wi s e c q u y n o r a s s i g n me n t ) ~( n h n gn g i b s u n g )

N ut r n hb i nd c hc a b np h h pv i t i uc h u nC++ , n s h t r c c t k h a n y .

T or al o i h nh p

C c k i ud l i uc b nv c c b i nt h c a h l r t c nt h i t , n h n gt h a yv n g u y nt h y . Cv C++c u n gc p c c c n gc c h op h pb ns o nc c k i ud l i up h c t ph nt c c k i ud l i uc b n . Nh b ns t h y , q u a n t r n gn h t t r o n gs n yl c ut r c , l n nt n gc h ol pt r o n gC++ . T u yn h i n , c c h ng i nn h t t or a c c l o i p h c t ph nc h ng i nl b d a n ht nc h ot nk h c t h n gq u a t y p e d e f .

T nr n gc av i t y p e d ef
T k h a n yh ah nn h i uh nn ma n gl i : t y p e d e f c h ot h y" n hn g h ak i u " k h i " b d a n h " c l s l m t mt c h n hx c h n , v l n h n gg n t h c s . C p h pl : t y p e d e f h i nl o i mt b d a n ht n Ng i t a t h n gs d n gt y p e d e f k h i c c l o i d l i u c h i p h c t p , c h c n n g nc h nt h pp h mt h m. yl m t t h n g c s d n gt y p e d e f : t y p e d e fu n s i g n e dl o n gu l o n g ; B yg i n ub nn i u l o n gt r n hb i nd c hb i t r n gb nc n g h a l u n s i g n e dl o n g. B nc t h n g h r n g i u n yc t h d d n g c t h c h i ns d n gt h a yt h t i nx l , n h n gc n h n gt n hh u n gq u a nt r n g , t r o n g t r n hb i nd c hp h i c n h nt h c r n gb n a n g i ut r m t t nn h t h n l m t l o i , v v yt y p e d e f l i u c nt h i t . M t n i m t y p e d e f c c hl c h oc c k i uc o nt r . Nh c pt r c y , n ub nn i : i n t*x ,y ; i un yt h c s t or a m t i n t * l x v m t i n t ( k h n gp h i l m t i n t * ) l y. l , ' * ' l i nk t v i c c b n p h i , k h n gt r i . T u yn h i n , n ub ns d n gm t t y p e d e f :
t y p e d e fi n t*I n t P t r ;I n t P t rx ,y ;

S a u , c h a i x v yc k i ui n t * . B nc t h c h or n gn r r n gh nv d o d c h n t r n ht y p e d e f s c h oc c l o i n g u y nt h y , v t h c s c h n gt r n hn h a n hc h n gt r n nk h c k h i n h i ut y p e d e f s c s d n g . T u yn h i n , t y p e d e f s t r n n c b i t q u a nt r n gt r o n gCk h i c s d n gv i c ut r c .

B i nk th pv i c ut

M t c ut r c l m t c c h t h ut h pm t n h mb i nt h n hm t c ut r c . M t k h i b nt or a m t c ut r c , s a u b nc t h l mc h on h i ut r n gh pn yl o i " m i " c a b i nb n p h t mi n hr a .V d :

// :C 0 3 :S i m p l e S t r u c t . c p pc ut r cS t r u c t u r e 1{ c h a rc ; i n t i ; f l o a tf ; id ; } ; i n tm a i n( ){ s t r u c ts 1S t r u c t u r e 1 ,s 2 ; s 1 . c=' a ' ;//C h nm ty ut b n g c c hs d n g' . ' s 1 . i=1 ; s 1 . f=3 . 1 4 ; s 1 . d=0 , 0 0 0 9 3 ; s 2.c=' a ' ; s 2 . i =1 ; s 2 . f=3 . 1 4 ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 79/320

08/10/2013

Suy ngh trong C + +, Vol 1

s 2 . d=0 , 0 0 0 9 3 ; }/// :~

C c c ut r c k h a i p h i k t t h c b n gd uc h mp h y . T r o n gma i n( ) , h a i t r n gh pc a S t r u c t u r e 1 c t or a : S 1 v S 2 . M i c p h i nb nr i n gc a r i n gc a h c , i , e , v d. V v y , s 1 v s 2 i d i nc h ok h i c c b i nh o n t o n c l p . c h nm t t r o n gc c y ut b nt r o n gs 1 h o c s 2 , b ns d n gm t ' . , c p h pb n t h yt r o n g c h n gt r c k h i s d n gC++l p i t n gt l pe s p h t t r i nt c ut r c s , yl n i m c p h px u t h i n t . M t i ub ns n h nt h yl s l n gt n gc a v i c s d n gc c S t r u c t u r e 1 ( n h n q u a yr a , yc h l y uc uc a C , k h n gp h i C++ ) . T r o n gC , b nc t h k h n gc h n i S t r u c t u r e 1 k h i b nx c n hc c b i n , b np h i n i c u t r c S t r u c t u r e 1 . yl n i m t y p e d e f t r n n c b i t t i nd n gt r o n gC :


// :C 0 3 :S i m p l e S t r u c t 2 . c p p//S d n gt y p e d e fv ic ut r cs t r u c t{ c h a rc ; i n ti ; f l o a tf ; id ; }S t r u c t u r e 2 ; i n tm a i n( ){ S t r u c t u r e 2s 1 ,s 2 ; s 1 . c=' a ' ; s 1 . i= 1 ; s 1 . f=3 . 1 4 ; s 1 . d=0 , 0 0 0 9 3 ; s 2 . c=' a ' ; s 2 . i= 1 ; s 2 . f=3 . 1 4 ; s 2 . d=0 , 0 0 0 9 3 ; }/// :~

B n gc c hs d n gt y p e d e f t r o n gc c hn y , b nc t h g i v ( t r o n gC , c g n gl o i b c c t y p e d e f c h oC++ ) m S t r u c t u r e 2 l m t b u i l t i nl o i , n h i n t h a yf l o a t , k h i b nx c n hS 1 v S 2 ( n h n gt h yn c h c d l i u c v k h n gb a og mc c h n hv i , l n h n gg c h n gt i c c v i c c i t n gt h c t r o n gC++ ) . B ns n h n t h yr n gc c c ut r c n h nd n g c r i i n g a yt u , b i v m c c hl t or a c c t y p e d e f . T u yn h i n , c n h n gl c b nc t h c np h i t h a mk h oc c c ut r c t r o n g n hn g h a c a n . T r o n gn h n gt r n gh p , b nt h c s c t h l pl i t nc a c c c ut r c n h c c c ut r c t nv l t y p e d e f :
// :C 0 3 :S e l f R e f e r e n t i a l . c p p //C h op h pm tc ut r c c h b nt h n c ut r ct y p e d e fS e l f R e f e r e n t i a l{ i n ti ; S e l f R e f e r e n t i a l*s r ;// uq u a yc h a ? }S e l f R e f e r e n t i a l ; i n tm a i n( ){ S e l f R e f e r e n t i a ls r 1 ,S R 2 , s r 1 . s r=& s r 2 ; s r 1 . i=4 7 ; s r 2 . i=1 0 2 4 ; }/// :~

s r 2 . s r=& s r 1 ;

N ub nn h nv o i un ym t t h i g i a n , b ns t h yr n gs r 1 v S R 2 i mv i n h a u , c n gn h t n gn mg i m t p h nd l i u . T r nt h c t , c ut r c t nk h n gp h i l g i n gn h t y p e d e f t n , n h n gn t h n g c t h c h i nt h e oc c hn yv n c x uh n gg i c h om i t h ng i nh n . C o nt r v c ut r c T r o n gv d t r n , t t c c c c ut r c s c c h t c n h c c i t n g . T u yn h i n , n h b t k p h nd u n gl n gl u t r , b nc t h l y a c h c a m t c ut r c i t n g( n h t r o n gS e l f R e f e r e n t i a l . c p p t r n ) . l a c h nc c y ut c a m t c t h c ut r c i t n g , b ns d n gm t ' . ' , n h t h y t r n . T u yn h i n , n ub nc m t c o nt r n m t c ut r c i t n g , b np h i c h nm t p h nt c a i t n g s d n gm t n h i uh n hk h c n h a u : ' >' . yl m t v d :


// :C 0 3 :S i m p l e S t r u c t 3 . c p p //S d n gc o nt r nc ut r cs t r u c tS t r u c t u r e 3{ c h a rc ; i n t i ; f l o a tf ; id ; }S t r u c t u r e 3 ; i n tm a i n( ){ S t r u c t u r e 3s 1 ,s 2 ; S t r u c t u r e 3*s p=& s 1 ; s p >c=' a ' ; s p >i= 1 ; s p >f=3 , 1 4 ; s p >d=0 , 0 0 0 9 3 ; s p=& s 2 ;//C h v om t it n gc ut r c k h cn h a u s p >c=' a ' ; s p >i=1 ; s p >f=3 , 1 4 ; s p >d=0 , 0 0 0 9 3 ; }/// :~

T r o n gma i n( ) , c c c ut r c c o nt r s pb a n uc h s 1 , v c c t h n hv i nc a s 1 c k h i t ob n gc c hc h n c h n gv i ' >' ( v b ns d n gc n gm t n h i uh n hn y c c c t h n hv i n ) . Nh n gs a u s p c t r ns 2 , v b i ns c k h i t ot h e oc n gm t c c h . V v y , b nc t h t h yr n gm t l i c hk h c c a c o nt r l h c t h c t n gc h u y nh n g t r n i t n gk h c n h a u , i un yc u n gc ps l i n hh o t h nt r o n g l pt r n hc a b n , n h b ns h c . C h ob yg i , l t t c c c b nc nb i t v c ut r c s , n h n gb ns t r n nt h o i m i h nv i h ( v c b i t l k m n hh nc a h , l pe s ) l c u ns c ht i nt r i n .

C h n gt r n hl m r v i e n u m
M t k i ud l i ul i t k l m t c c hg nt nc h oc o ns , d o e ml i n h i un g h a c h ob t c a i c m . C c
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 80/320

08/10/2013

Suy ngh trong C + +, Vol 1

e n u mt k h a ( t C ) t n gl i t k b t k d a n hs c hc c n hd a n hb nc h on b n gc c hg nc h oc h n gg i t r 0 , 1 , 2 , v vB nc t h k h a i b oe n u mb i n( m l u nl u nb i ud i nn h l g i t r t o nb ) . T u y nb c a m t e n u m t r n gg i n gn h m t c ut r c k h a i . M t k i ud l i ul i t k l h u c hk h i b nmu nt h e od i m t s l o i t n hn n g :
// :C 0 3 :E n u m . c p p //T h e od ic ch n hd n g e n u mS h a p e T y p e{ v n gt r n , h n hv u n g , h n hc h n h t } ; //P h ik tt h cb n gd uc h mp h yn h m tc ut r c i n tm a i n( ){ S h a p e T y p eh n h=v n gt r n ; //C ch o t n g y. . . . //B yg i l mm tc ig d at r nn h n gg h n hd n gl : c h u y n i( h n hd n g ){ t r n gh pv n gt r n : /*c v n gt r n*/b r e a k ; t r n gh pv u n g : /*c v u n g*/b r e a k ; t r n gh ph n hc h n h t : /*h n hc h n h tt h */b r e a k ; } }/// :~

h n hd n gl m t b i nc a S h a p e T y p e k i ud l i ul i t k , v g i t r c a n c s os n hv i g i t r t r o n gk i ul i t k . T h n hd n gt h c s c h l m t i n t , t u yn h i n , n c t h l b t k g i t r m t i n t c t h c h a ( b a og mc m t s m) . B nc n gc t h s os n hm t i n t b i nv i m t g i t r k i ul i t k . B nn nb i t r n gv d t r nc h u y n i v ol o i h a r a l m t c c hc v n c h oc h n gt r n h . C++c m t c c h t t h n m c c l o i i un y , s g i i t h c h p h i c h o nl i c h o ns a un yt r o n gc u ns c h . N ub nk h n gt h c hc c ht r n hb i nd c hg nc c g i t r , b nc t h t m n hl m, n h t h n y :
e n u mS h a p e T y p e{ v n gt r n=1 0 ,v u n g=2 0 ,h n hc h n h t=5 0 } ;

N ub nc u n gc pg i t r c h om t s t nv k h n gc h on g i k h c , t r n hb i nd c hs s d n gg i t r h pt i pt h e o . V d , e n u ms n a p{ c r a c k l e=2 5 ,c as p o p } ; T r n hb i nd c hc h ob t g i t r 2 6 . B nc t h x e mc b a on h i uc t h c c n h i um l k h i b ns d n gl i t k c c k i ud l i u . T u yn h i n , m t m c n yv nc nl m t n l c ( t r o n gC ) t h c h i nn h n g i um c h n gt a c t h l mv i m t l p t r o n gC++ , v v yb ns t h ye n u ms d n g t h nt r o n gC++ . L o i k i mt r al i t k L i t k Cl k h t h s , c h ng i nl k t h pc c g i t r t c hr i v i t n , n h n gh c u n gc pk h n gk i mt r a k i u . T r o n gC++ , n h b nc t h mo n g i b yg i , k h i n i mv l o i l c b n , v i un yl n gv i l i t k . K h i b nt or a m t l i t k t n , b nc h i uq u t or a m t l o i m i g i n gn h b nl mv i m t l ph c : T nc a l i t k c a b ns t r t h n hm t t d n hr i n gt r o n gs u t t h i g i a nm nv d c ht h u t . Ng o i r a , c c a k i mt r a l i t k t r o n gC++l o i c h t c h h nt r o n gC . B ns n h nt h y i un y c b i t n ub n c m t t h h i nc a m t i ut r a m us c c g i l mt . T r o n gC , b nc t h n i mt C++ , n h n gt r o n gC++ , b nc t h k h n g . i un yl d oi n c r e me n t i n gm t i ut r a c t h c h i nh a i c h u y n i l o i h n h , m t t r o n gs h p h pl t r o n gC++v m t t r o n gs h b t h pp h p . ut i n , g i t r t h u c k i ul i t k l m c n h i n c t m t m us c nm t i n t , t h g i t r c t n gl n , t h i n t c t r l i t h n hm t m u. T r o n gC++n yl k h n g c p h p , b i v m us c l m t l o i r i n gb i t v k h n gt n g n gv i i n t . i un yc n g h a , b i v l m t h n o b nb i t t n gc a m ux a n ht h mc h s c t r o n gd a n hs c hc c m us c ? N ub nmu nt n gm t m u , s a u n p h i l m t l p( v i m t h o t n gt n g ) v k h n gp h i l m t e n u m, v l pc t h c t h c h i n c h o c a nt o nh nn h i u . B t c l c n ob nv i t m , c h or n gm t c h u y n i n g m m t e n u ml o i , t r n h b i nd c hs n hd uh o t n gn yv n n g u yh i m. C n g o n( mt s a u ) c k i uk i mt r a b s u n gt n gt n h t r o n gC++ .

T i tk i m b n h v i c n g o n

i k h i m t c h n gt r n hs x l c c l o i d l i uk h c n h a ub n gc c hs d n gc n gm t b i n . T r o n gt r n gh p n y , b nc h a i l a c h n : b nc t h t or a m t c ut r c c c h a t t c c c l o i c t h k h c n h a u , b nc t h c n l ut r , h o c b nc t h s d n gm t c n g o n. M t o n n gt t c c c d l i uv om t k h n gg i a nd u yn h t , n c o ns r a s l n gk h n gg i a nc nt h i t c h oc c m c l nn h t m b n t t r o n gc c c n g o n, v l mc h o r n gk c ht h c c a c c c n g o n. S d n gm t c n g o n t i t k i mb n h .
81/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

B t c l c n ob n t m t g i t r t r o n gm t c n g o n, g i t r l u nl u nb t u c n gm t v t r uc c c n g o n, n h n gc h s d n gk h n gg i a nn h i un h l c nt h i t . V v y , b nt or a m t " s i ub i n " c k h n n gn m g i b t k c a c n g o nc c b i n . T t c c c a c h c a c c c n g o nc c b i n ug i n gn h a u( t r o n gm t l p h c h o c c ut r c , c c a c h k h c n h a u ) . D i yl m t s d n g ng i nc a m t c n g o n. C g n gl o i b y ut k h c n h a uv x e mn h n gg n c h i ul c v ok c ht h c c a c c c n g o n. Nh nt h yr n gn k h n gc n g h a k h a i b om t t h h i nc a m t k i ud l i ud u yn h t t r o n gm t c n g o n( t r k h i b nc h c nl mn s d n gm t t nk h c n h a u ) .
// :C 0 3 :U n i o n . c p p //K c ht h cv s d n g ng i nc am tc n g o n #I n c l u d eu s i n gn a m e s p a c es t d ; c n g o n n gg i{ //T u y nb t n gt n h m tl p l o n gl ; f l o a tf ;

c h a ri ;

jn g n ;

i n tk ;

t n gg p id ; //C c o ns ck c ht h cc am t // i ,v l p h nt l nn h t } ; //D uc h mp h yk tt h cm tc n g o n ,n h m t c ut r c i n tm a i n( ){ c o u t< <" s i z e o f( n gg i )= " < <s i z e o f( n g g i )< <e n d l ; n gg ix ; x i=' c ' ; c o u t< <x i< <e n d l ; x d=3 . 1 4 1 5 9 ; c o u t< <x d< <e n d l ; }/// :~

T r n hb i nd c ht h c h i nv i c c h u y nn h n g n gt h e oc c t h n hv i nc n g o nb nc h n . M t k h i b nt h c h i nm t n h i mv , t r n hb i nd c hk h n gq u a nt m nn h n gg b nl mv i c c c n g o n . T r o n gv d t r n , b nc t h g nm t g i t r d uc h m n g x :
x f=2 . 2 2 2 ;

v s a u g i c h oc c ur a n h t h n l m t i n t : c o u t< <x i ; i un ys t or a r c t h i .

M n g
M n gl m t l o i l o i t n gh pv c h n gc h op h pb nt pt r u n gl i r t n h i ub i nl i v i n h a u , m t t r o n gn h n g q u y ns a uk h i k h c , d i m t c i t n n hd a n hd u yn h t . N ub nn i : i n ta[ 1 0 ] ; B nt or a l ut r t r o n g1 0 i n t b i nc h n gc h t l nn h a u , n h n gk h n gc t n n hd a n hd u yn h t c h om i b i n . T h a yv o , c h n gs c g pd i t nmt . t r u yc pv om t t r o n gc c p h nt m n g, b ns d n gc p h ps q u a r e b r a c k e t t n gt mb ns d n g x c n hm t m n g : a[ 5 ]=4 7 ; T u yn h i n , b np h i n h r n gm c d k c h t h c c a mt l 1 0 , b nc h np h nt m n gb t ut s k h n g( i u n y i k h i c g i l k h n g l p c h m c ) , v v yb nc t h c h nc h c c p h nt m n g0 9 , n h n y :
// :C 0 3 :A r r a y s . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n ta[ 1 0 ] ; f o r( i n ti=0 ;i< 1 0 ;i++ ){ c o u t< <" m t[ "< <i< <" ]= "< <a[ i ]< <e n d l ; } }/// :~ a[ i ]=i*1 0 ;

T r u yc pm n gl c c k n h a n hc h n g . T u yn h i n , n uc h s t i pt h e oc a c u i m n g , k h n gc m n gl i a nt o n b ns b c v oc c b i ns k h c . H nc h k h c l b np h i x c n hk c ht h c c a m n gt i t h i g i a nb i nd c h , n ub nmu nt h a y i k c ht h c k h i c h yb nk h n gt h l m i u v i c p h p t r n( Ck h n gc m t c c h t or a m t m n g n g , n h n gn h n n n gk ) . C++v e c t o r , c g i i t h i ut r o n gc h n gt r c , c u n gc p m t i t n gm n gn h t n gt h a y i k c ht h c , v t h n t h n gl m t g i i p h pt t h nn h i un uk c h t h c m n gc a b nk h n gt h b i t c t i t h i g i a nb i nd c h . B nc t h l mc h om t m n gc a b t k l o i , t h mc h c a c ut r c s :
// :C 0 3 :S t r u c t A r r a y . c p p //M tl o tc cc ut r c
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 82/320

08/10/2013

Suy ngh trong C + +, Vol 1

s t r u c t{ i n ti ,j ,k ; }T h r e e D p o i n ti n tm a i n( ){ T h r e e D p o i n tp[ 1 0 ] ; f o r( i n ti=0 ;i< 1 0 ;i++ ){ .p[ i ]i=i+1 ; p[ i ]j=i+2 ; . p[ i ]k=i +3 . } }/// :~

C h c c c ut r c n h nd n gt i l c l pv i c h ov n gl pc a t i . t h yr n gm i p h nt c a m t m n gt i pg i pv i t i , b nc t h i nr a c c a c h n h t h n y :
// :C 0 3 :A r r a y A d d r e s s e s . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n ta[ 1 0 ] ; c o u t< <" s i z e o f( i n t )= "< <s i z e o f( i n t )< <e n d l ; ( i n ti=0 ;i< 1 0 ;i++ ) c o u t< <" &a[" < <i< < " ]=" < <( D i )&a[ i ]< <e n d l ; }/// :~ f o r

K h i b nc h yc h n gt r n hn y , b ns t h yr n gm i p h nt l m t i n t k c ht h c i t t r c . C n g h a l , h a n gx pc h n gl nc i k i a . C o nt r v m n g Nh nd n gc a m t m n gl k h n gg i n gn h c c n hd a n hc h oc c b i nt h n gt h n g . i v i m t i u , m t n hd a n hm n gk h n gp h i l m t g i t r t r i , b nk h n gt h g nc h on . Nt h c s c h l m t c i m c v oc p h pv u n gk h u n g , v k h i b n a r a t nc a m t m n g , k h n gc d un g o c v u n g , n h n gg b nn h n c l a c h b t uc a m n g :
// :C 0 3 :A r r a y I d e n t i f i e r . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n ta[ 1 0 ] ; c o u t< <" a= "< <a< <e n d l ; < <e n d l ; }/// :~ c o u t< <" &a[ 0 ]= "< <&a[ 0 ]

K h i b nc h yc h n gt r n hn y , b ns t h yr n gh a i a c h ( t r o n g s c i nt r o n gh t h pl c p h n , v k h n gc d i nv i n l u) ug i n gn h a u . V v y , m t c c hn h nn h nd n gm n gn h l m t c h c c o nt r n uc a m t m n g . V m c d c h n gt i k h n g t h t h a y i n hd a n hm n gc h m t n i k h c , c h n gt a c t h t or a m t c o nt r v s d n g d i c h u y nx u n g q u a n ht r o n gm n g . T r o n gt h c t , c p h pv u n gk h u n gl mv i c v i c o nt r t h n gt h n gs a u y :
// :C 0 3 :P o i n t e r s A n d B r a c k e t s . c p pi n tm a i n( ){ i n ta[ 1 0 ] ; i n t*i p =a ; f o r( i n ti=0 ;i< 1 0 ;i++ ) i p[ i ]=i*1 0 ; }/// :~

T h c t l t t nm t m n gs nx u t a c h b t uc a n h a r a l k h q u a nt r n gk h i b nmu nv t q u a m t m n gt i m t h m. N ub nk h a i b om t m n gn h l m t i s c h c n n g , n h n gg b n a n gt h c s k h a i b o m t c o nt r . V v y , t r o n gv d s a u y , f u n c 1 ( ) v F u n c 2 ( ) c h i uq u c d a n hs c h i s g i n gn h a u :
// :C 0 3 :A r r a y A r g u m e n t s . c p p #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; k h o n gt r n gf u n c 1( i n ta[ ] ,i n ts i z e ){ f o r( i n ti=0 ;i< k c h t h c ;i++ ) a[ i ]=i*i-i ; } t r n gF u n c 2( i n t*a ,i n ts i z e ){ f o r( i n ti=0 ;i< k c ht h c ;i ++ ) a[ i ]=i*i+i ; } v o i dp r i n t( i n ta[ ] ,t nc h u i ,i n ts i z e ){ f o r( i n ti=0 ;i< k c ht h c ;i+ + ) c o u t< <t n< <" [ "< <i< <" ]= " < <A[ i ]< <e n d l ; } i n tm a i n( ){ i n ta[ 5 ] ,b[ 5 ] ; //C l g i t r r c : i n( a ," m t " ,5 ) ; i n( b ," b " ,5 ) ; //K h it om n g : f u n c 1( a ,5 ) ; f u n c 1( b ,5 ) ; i n( a ," m t " ,5 ) ; i n( b , " b " ,5 ) ; //C h c cm n gl u n cs a i : F u n c 2( a ,5 ) ; F u n c 2( b ,5 ) ; i n( a ," m t " ,5 ) ; i n( b , " b " ,5 ) ; }/// :~

M c d f u n c 1 ( ) v F u n c 2 ( ) t u y nb l pl u nc a h k h c n h a u , v i c s d n gc n gg i n gb nt r o n gh m. C m t s [ 2 9 ] v n k h c v d n yc h ot h y : c c m n gk h n gc t h c t h n gq u a g i t r , c n g h a l , b nk h n gb a og i t n gn h n c m t b ns a oc a m n gm b nv t q u a v om t c h c n n g . V v y , k h i b nt h a y i m t m n g , b n l u nl u nt h a y i c c i t n gb nn g o i . i un yc t h l m t c h t b i r i l c u , n ub n a n gmo n gc c p a s s b y g i t r c c u n gc pv i c c l pl u nt h n gt h n g . B ns n h nt h yr n gi n( ) s d n gc p h pv u n gk h u n gc h oc c i s m n g . M c d c p h pc o nt r v c p h p v u n gk h u n gl c h i uq u t n gt k h i i q u a c c m n gn h l i s , c p h pv u n gk h u n gl mc h on r r n g
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 83/320

08/10/2013

Suy ngh trong C + +, Vol 1

h n n g i c r n gb nc n g h a l c h ol pl u nn yl m t m n g . C n gl ur n gk c ht h c i s c t r u y nt r o n gm i t r n gh p . C h c n i q u a a c h c a m t m n gk h n gc t h n gt i n , b np h i l u nl u nc t h b i t l mt h n ol nm n gl t r o n gc h c n n gc a b n , d o b nk h n gc h y r a k h i c u i c a m n g . M n gc t h l k i ub t k , b a og mc c m n gc ac o nt r . T r o n gt h ct , k h i b nmu nv t q u a i s d n g l n hv oc h n gt r n hc ab n , Cv C++c m t d a n hs c h c b i t i s c h o c h n h( ) , t r n gn h t h n y : i n t
m a i n( i n ta r g c ,c h a r*a r g v[ ] ){ // .. .

i s ut i nl s p h nt t r o n gm n g , l t h a ms t h h a i . i s t h h a i l u nl u nl m t m n gc a c h a r * , b i v i s c t r u y nt d n gl n hn h m n gk t ( v h yn h r n g , m t m n gc t h c t h n gq u a c h n h m t c o nt r ) . M i c mk h o n gt r n gp h nc c hc a c c n h nv t t r nd n gl n h c c h u y nt h n hm t c u c t r a n hl u n m n gr i n gb i t . C h n gt r n hs a us i nr a t t c c c i s d n gl n hc a m n hb n gc c hb c q u a m n g :
// :C 0 3 :C o m m a n d L i n e A r g s . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ c o u t< <" a r g c= "< <a r g c< <e n d l ; f o r( i n ti=0 ;i< a r g c ;i++ ) c o u t< <" a r g v[ "< <i< <" ]= " < <A r g v[ i ]< <e n d l ; }/// :~

B ns n h nt h yr n ga r g v[ 0 ] l n gd nv t nc a c h n gt r n h . i un yc h op h pc c c h n gt r n h k h mp h t h n gt i nv b nt h n . Nc n gb s u n gt h mh n nm n gc c i s c h n gt r n h , d o , m t l i p h b i nk h i l y i s d n gl n hl l ya r g v[ 0 ] k h i b nmu na r g v[ 1 ] . B nk h n gb t b u c p h i s d n ga r g c v a r g vn h c c n hd n gc h n h( ) ; n h n g n hd a n hl c h c ( n h n gn s g yn h ml nn ub nk h n gs d n gc h n g ) . Ng o i r a , c m t c c hk h c k h a i a r g v: i n tm a i n( i n ta r g c ,
c h a r* *a r g v ){ //. . .

C h a i h n ht h c l t n g n g , n h n gt i t mt h yp h i nb n c s d n gt r o n gc u ns c hn yl t r c q u a n n h t k h i c m , v n n i , t r c t i p , " yl m t l o t c c n h nv t c o nt r . " T t c c c b nn h n c t c c d n gl n hl m n gk t , n ub nmu n i ut r m t i s n h m t s l o i k h c , b nc t r c hn h i mc h u y n i n t r o n gc h n gt r n hc a b n . t o i uk i nc h ov i c c h u y n i s a n g s , c m t s c h c n n gt r g i pt r o n gt h v i nCc h u n , t u y nb t r o n g< c s t d l i b >. Nh n gn g i ng i nn h t s d n gl a t o i ( ) , a t o l ( ) , v a t o f ( ) c h u y n i m t m n gk t A S C I I v i m t i n t , d i , v i g i t r n i i m, t n g n g . yl m t v d s d n ga t o i ( ) ( h a i c h c n n gk h c c g i l c c ht n gt ) :


// :C 0 3 :A r g s T o I n t s . c p p //C h u y n i is d n gl n h i n t s #I n c l u d e#i n c l u d e< c s t d l i b >s d n gt nm i nk h n gg i a nt i u c h u n ; i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ f o r( i n ti=1 ;i< a r g c ;i++ ) c o u t< <a t o i( a r g v[ i ] )< <e n d l ; }/// :~

T r o n gc h n gt r n hn y , b nc t h t b t k s l n gc c i s t r nd n gl n h . B ns n h nt h yr n gc h o v n gl pb t ut i g i t r 1 b q u a t nc h n gt r n ht i a r g v[ 0 ] . Ng o i r a , n ub n t m t s f l o a t i n g p o i n t c h a m t i mt h pp h nt r nd n gl n h , a t o i ( ) c h m t c c c h s c h o nt h i i mt h pp h n . N ub n t n o n n u mb e r s t r nd n gl n h , n h n gt r l i t a t o i ( ) n h b n gk h n g . K h mp h n hd n gd uc h m n g C c p r i n t B i n a r y(c h c n n gg i i t h i ut r c t r o n gc h n gn yl ) t h u nt i nc h ov i c os uv oc ut r c b nt r o n gc a c c l o i d l i uk h c n h a u . T h v n h t t r o n gs n yl c c n hd n gd uc h m n gc h op h pC v C++ l ut r c c s i d i nc h oc c g i t r r t l nv r t n h t r o n gm t k h n gg i a ng i i h n . M c d c c c h i t i t k h n gh o nt o nc t h t i px c y , c c b i t b nt r o n gn i s v i s c c h i a t h n hb a k h uv c : s m , ma n t i s s a , v b i t d u , d o n l ut r c c g i t r s d n gk h i uk h o a h c . C h n gt r n hs a u yc h o p h pb nc h i x u n gq u a n hb n gc c hi nr a c c mh n hn h p h nc a s d uc h m n gk h c n h a u , d o b n c t h s u yr a c h om n hn h n gc h n gt r n h c s d n gt r o n g n hd n gd uc h m n gb i nd c hc a b n ( t h n g yl t i uc h u nI E E Ec h os d uc h m n g , n h n gt r n hb i nd c hc a b nc t h k h n gl mt h e o m ) :
// :C 0 3 :F l o a t i n g A s B i n a r y . c p p //{ L }p r i n t B i n a r y //{ T }3 . 1 4 1 5 9 #B a og m" p r i n t B i n a r y . h " #B a og m< c s t d l i b >#i n c l u d eu s i n gn a m e s p a c es t d ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 84/320

08/10/2013

Suy ngh trong C + +, Vol 1

i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ i f( a r g c=2 ){ c o u t< <" P h ic u n gc pm t s "< <e n d l ; e x i t( 1 ) ; } d o u b l ed=a t o f( a r g v[ 1 ] ); u n s i g n e dc h a r*c p= r e i n t e r p r e t _ c a s t< u n s i g n e dc h a r * >( &D ) ; f o r( i n ti=s i z e o f( d o u b l e ) ;i >0 ;i=2 ){ p r i n t B i n a r y( c p[ i 1 ] ) ; p r i n t B i n a r y( c p[i ] ) ; } }/// :~

ut i n , c h n gt r n h mb or n gb n c h on m t c u c t r a n hc i b n gc c hk i mt r a g i t r c a a r g c , l h a i n uc m t i s d u yn h t ( l m t t r o n gn uk h n gc i s , k t k h i t nc h n gt r n hl u nl u nl y ut ut i nc a a r g v) . N ut h t b i , m t t h n g i p c i nv CS t a n d a r dL i b r a r yc h c n n ge x i t ( ) c g i l k t t h c c h n gt r n h . C h n gt r n hl y i s t d n gl n hv c h u y n i c c k t m t i s d n ga t o f ( ) . S a u , i c c o i l m t m n gb y t e b n gc c hl y a c h v c n v om t u n s i g n e dc h a r * . M i m t t r o n gc c b y t e c t h n g q u a p r i n t B i n a r y() h i nt h . V d n y c t h i t l p i nc c b y t e t r o n gm t t r t t n h v ym c c b i t x u t h i n ut i nt r nm y t n hc a t i . B nc t h k h c n h a u , v v yb nc t h mu ns px pl i m i t h t h e oc c h c i n . B nc n gn n l ur n gc c n hd n gd uc h m n gk h n gn h h i u , v d , s mv n ht r t h n gk h n gb t r t r n r a n hg i i b y t e , n h n gt h a yv m t s b i t c d n hr i n gc h om i n g i v h c n gg i v ob n h k h i c h t c n gt t . t h c s n h nt h yn h n gg a n gx yr a , b nc np h i t mr a k c ht h c c a m i m t p h nc a s ( b i t d uh i ul u nl u nl m t c h t , n h n gs mv ma n t i s s a s l c c k c ht h c k h c n h a u ) v i nr a c c b i t t r o n gt n gp h nr i n gb i t . C o nt r s h c N ut t c c c b nc t h l mv i m t c o nt r t r v om t m n g c i x v i n n h t h n l m t b d a n hc h o m n g , c o nt r v om n gs k h n gt h r t t h v . T u yn h i n , c o nt r l i n hh o t h nn y , v c h n gc t h c s a i c h m t n i k h c ( n h n gh yn h , n h nd n gm n gk h n gt h c s a i c h m t n i k h c ) . C o nt r s h c c p nc c n gd n gc a m t s c c t o nt s h c c h oc o nt r . C o nt r l d os h c l m t c h r i n gb i t t s h c b n ht h n gl c o nt r p h i p h h pv i h nc h c b i t l mc h oh c x n gm c . V d , m t n h i uh n hp h b i n s d n gv i c o nt r l ++, m " t h m m t c o nt r . " i un yt h c s c n g h a l c o nt r c t h a y i c h u y ns a n g" g i t r t i pt h e o , " c n g h a l b t c i ug . yl m t v d :


// :C 0 3 :P o i n t e r I n c r e m e n t . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i n ti[ 1 0 ] ; id[ 1 0 ] ; i n t*i p=i ; i*d p=d ; c o u t< <" i p= "< <( d i )i p< <e n d l ; i p++ ; c o u t<< " i p= "< <( d i )i p < <e n d l ; c o u t< <" d p= "< <( d i )d p< <e n d l ; d p++ ; c o u t< <" d p= "< < ( d i )d p< <e n d l; }/// :~

C h om t c h yt r nm yt n hc a t i , ur a l :
i p=6 6 8 4 1 2 4i p=6 6 8 4 1 2 8d p=6 6 8 4 0 4 4d p=6 6 8 4 0 5 2

#I n c l u d eu s i n gn a m e s p a c es t d ; s t r u c t{ c h a rc ; sn g n ; i n ti ; l o n gl ; f l o a tf ; id ; d i il d ; }N g u y nt h y ; i n tm a i n( ){ n g u y nt h yp[ 1 0 ] ; n g u y nt h y*p p=p ; c o u t< < " s i z e o f( n g u y nt h y )= " < <s i z e o f( n g u y nt h y )< <e n d l ; c o u t< < " p p= "< <( d i )T r a n g< <e n d l ; T r a n g++ ; c o u t< <" p p= "< <( d i )T r a n g< < e n d l ; }/// :~

i ut h v yl m c d c c h o t n g++d n gn h l h o t n gt n gt c h oc i n t * v i * , b nc t h t h yr n gc o nt r c t h a y i c h 4 b y t e c h oi n t * n h n g8 b y t e c h o i * . K h n gp h i n g un h i n , yl c c k c ht h c c a i n t v i t r nm yt n hc a t i . V l m t m n hk h e c ac o nt r s h c : c c s l i ut r n hb i n d c hr a s t i np h i t h a y i c o nt r n t r np h nt t i pt h e ot r o n gm n g( c o nt r s h c c h c n g h a t r o n g m n g ) . i un yt h mc h l mv i c v i c c m n gc a c ut r c s : // :C 0 3 :P o i n t e r I n c r e m e n t 2 . c p p

ur a c h om t c h yt r nm yt n hc a t i l :
s i z e o f( n g u y nt h y )=4 0t r a n g=6 . 6 8 3 . 7 6 4p p=6 . 6 8 3 . 8 0 4

V v y , b nc t h t h yc c t r n hb i nd c hc n gk h n g n gc h oc o nt r ns t r u c t s ( v l pe s v o ns ) . C o nt r s h c c n gl mv i c v i c c n h k h a i t h c , + , v , n h n gh a i n h k h a i t h c s a un y c g i i h n : b nk h n gt h t h mh a i c o nt r , v n ub nt r c o nt r k t q u l s p h nt g i a h a i c o nt r . T u yn h i n , b nc t h t h mh o c t r i m t g i t r t c hr i v m t c o nt r . D i yl m t v d mi n hh o v i c s d n gc c c o nt r s h c :
// :C 0 3 :P o i n t e r A r i t h m e t i c . c p p#i n c l u d eu s i n gn a m e s p a c es t d ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 85/320

08/10/2013

Suy ngh trong C + +, Vol 1

#X c n hP( E X )c o u t< <#E X< <" : "< <E X< <e n d l ; i n tm a i n( ){ i n ta[ 1 0 ] ; f o r( i n ti=0 ;i< 1 0 ;i++ ) //C h on g i t r c h s i n t*i p=a ; P( *I P ) ; P( *++I P ) , P( *( I P+5 ) ) ; i n t*I P 2=i p+5 ; P ( *I P 2 ) ; P( *( I P 2-4 ) ) ; P( *-I P 2 ) ; P( I P 2-I P ) ;//S nl n gs y ut }/// :~

a[ i ]=i ;

Nb t uv i v mk h c , n h n g i un ys d n gm t t n hn n g c g i l t i nx l s t r i n g i z i n g ( t h c h i n v i s ' #' d uh i ut r c k h i m t b i ut h c ) m c b t k b i uh i nv b i nn t h n hm t m n gk t . i un y l k h t h u nl i , v n c h op h pc c b i ut h c c i n , t i pt h e ol d uh a i c h m, t i pt h e ol g i t r c a b i u t h c . T r o n gma i n( ) b ns n h nt h yv i t t t h u c h c s nx u t . M c d t r c v h up h i nb nc a ++v c g i t r v i c o nt r , c h c c c p h i nb nt i nt c s d n gt r o n g v d n yb i v c h n g c pd n gt r c k h i c o nt r c d e r e f e r e n c e dt r o n gn h n gb i uh i nt r n , n nh c h o p h pc h n gt a n h nt h yn h n g n hh n gc a h o t n g . L ur n gc h c g i t r t c hr i a n g c t h mv o v t r , n uh a i c o nt r c k t h pt h e oc c hn yt r n hb i nd c hs k h n gc h op h pn . yl k t q u c a c h n gt r n ht r n :


*I p :0 *++I p :1 *( I P+5 ) :6 *I P 2 :6 *( I P 2-4 ) :2 *-I P 2 :5

T r o n gm i t r n gh p , k t q u s h c c o nt r t r o n gc o nt r c i uc h n h t r n" n gc h " , d a t r nk c h t h c c a c c y ut c c h r a . N uc o nt r s h c d n gn h m t c h t p ol c u , n gl ol n g . H uh t t h i g i a nb ns c h c n t or a c c m n gv c c c h s v oc h n gv i [ ] , v c o nt r s h c t i n hv i n h t m b ns t h n gc nl ++v . C o nt r s h c t h n g c d n hc h oc c c h n gt r n ht h n gmi n hv p h c t ph n , v n h i us np h mt i c c t i u c h u nC++t h v i n nh uh t c c c h i t i t t h n gmi n h , d o b nk h n gc np h i l ol n gv c h n g .

G i g r i

T r o n gm t m i t r n gl t n g , b nc m t t r n hg l i t u y t v i c s nm t c c hd d n gl mc h oc c h n hv i c a c h n gt r n ht r o n gs u t c a b n b nc t h n h a n hc h n gp h t h i nl i . T u yn h i n , h uh t c c g r i c i m m , v c h n gs y uc ub np h i n h n g o nm t r o n gc h n gt r n hc a b n g i pb nh i un h n gg a n gx yr a . Ng o i r a , b nc t h c p h t t r i nt r o n gm t m i t r n g( c h n gh nn h m t h t h n gn h n g , l n i m t i m t n h i un mc a t i ) m k h n gc s a l i c s n , v c l p h nh i r t h nc h ( v d m t m n h n hh i nt h L E Do n e l i n e ) . T r o n gn h n gt r n gh pn yb nt r n ns n gt ot r o n gc c hb nk h mp h v h i n t h t h n gt i nv v i c t h c h i nc c c h n gt r n hc a b n . P h nn y a r a m t s c c h l m i un y .

G l i c

N ub nk h k h nd ym g l i v om t c h n gt r n h , b nc t h c h yv oc c v n . B nb t u c c q u n h i ut h n gt i n , m l mc h oc c l i k h p h nl p . K h i b nn g h r n gb n t mt h yl i b nb t ux r a m g l i , c h t h yb nc np h i t n t r l i m t l nn a . B nc t h g i i q u y t n h n gv n n yv i h a i l o i c : c g l i t i nx l v t h i g i a nc h yc g l i . C g l i t i nx l B n gv i c s d n gt i nx l #x c n hm t h o c n h i uc g l i ( t t n h t l t r o n gm t t pt i nt i u ) , b nc t h k i mt r a m t l c b n gc c hs d n g#i f d e f t u y nb v c i uk i nb a og m m g l i . K h i b nn g h g l i c a b nk t t h c , b nc t h c h ng i nl #u n d e f c ( s ) v m s t n g c g b ( v b ns g i mk c h t h c v c h i p h t h i g i a nc h yt pt i nt h c t h i c a b n ) . Nl t t n h t q u y t n ht nc h og l i c t r c k h i b nb t ux yd n gd nc a b n n h n gc i t ns c p h h p . C t i nx l t h e ot r u y nt h n g c p h nb i t v i c c b i nb n gc c hv i t c h n gt r o n gt t c c c t r n gh pt r n . M t t nl c c h u n gc h ng i nl DE B U G( n h n gp h i c nt h nb nk h n gs d n gNDE B U G , m l d n ht r o n gC ) . T r n ht c a c c b oc oc t h l :

#D e f i n eD E B U G//C l t r o n gm tt pt i nt i u //. . . #I f d e fD E B U G//K i mt r ax e ml c c n hn g h a /*G l im y*/


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 86/320

08/10/2013

Suy ngh trong C + +, Vol 1

#E n d i f//D E B U G

H uh t Cv C++h i nt h c c n gs c h op h pb n#d e f i n e v #u n d e f c t d n gl n hb i nd c h , v v yb nc t h b i nd c hl i m v c h nt h n gt i ng l i v i m t l n hd u yn h t ( t t h nt h n gq u a c c ma k e f i l e , m t c n gc m s c mt m t t h i g i a nn g n ) . K i mt r a t i l i u a p h n gc a b n b i t c h i t i t . T h i g i a nc h yg l i c T r o n gm t s t r n gh pn l t h u nt i nh n b i nc g l i v t t t r o n gq u t r n ht h c h i nc h n gt r n h , c b i t l b n gc c h t c h n gk h i c h n gt r n hb t ub n gc c hs d n gd n gl n h . C c c h n gt r n hl nl t n h t b i nd c hl i c h c h nm g l i . b t g l i m v t t t n g , t or a b o o l c :
// :C 0 3 :D y n a m i c D e b u g F l a g s . c p p #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ;c //D e b u gk h n gn h t t h i tp h it o nc u :b o o ld e b u g=f a l s e ; i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ f o r( i n ti=0 ;i< a r g c ;i++ ) i f ( s t r i n g( a r g v[ i ] )= =" -d e b u g=t r n " ) d e b u g=t r u e ; b o o l i=t r u e ; t r o n gk h i( i ){ i f( d e b u g ){ //M g l i y c o u t< <" D e b u g g e rl b yg i ! "< <E n d l ; }E l s e{ c o u t< <" D e b u g g e rl b yg i i . "< <E n d l ; } c o u t< <" B tg l i[ o n/o f f/b ] : " ; c h u it r l i ; c i n> >t r l i , n u( t r l i= =" t r n " )d e b u g=t r u e ;//B t n u( t r l i= =" t t" )d e b u g =f a l s e ;//T t n u( t r l i= =" b t h u cl " )b r e a k ;//T r o n gs ' t r o n gk h i ' } }/// :~

C h n gt r n hn yt i pt c c h op h pb nb t c g l i v t t c h o nk h i b ng " b " n i v i n , b nmu nt h o t k h i . Nh nt h yn i h i r n gn h n gl i y c g v o , k h n gc h c h c i ( b nc t h r t n g nn t h n ub nmu n ) . Ng o i r a , m t i s d n gl n ht yc h nc t h c s d n g b i ng l i t r nk h i k h i n gl pl u nn yc t h x u t h i nb t c n i n ot r o n gd n gl n h , k t k h i c c m k h i n gt r o n gc h n h( ) n h nv o t t c c c i s . V i c t h n g h i mk h ng i nv c c b i uh i n : c h u i( a r g v[ i ] ) N yc c c [ i ] a r g vm n gk t v t or a m t c h u i , s a u c t h d d n gs ov i p h a b nt a yp h i c a = =. C h n gt r n ht r nt mk i mc h ot o nb c h u i d e b u g=t r n. B nc n gc t h t mk i md e b u g=v s a u x e mn h n gg s a u , c u n gc pt h mn h i ul a c h n . T p2 ( c s nt w w w . B r u c e E c k e l . c o m) d n hm t c h n g n i v t i uc h u nC++c h u i l p . M c d m t l c g l i l m t t r o n gn h n gk h uv c t n g i t m n l mc h or t n h i un g h a s d n g m t b i nt o nc u , k h n gc g m n i n p h i l c c h l . Nh nt h yr n gc c b i n c t r o n gc h t h n g n h c n h n g i c n k h n gp h i l m t l c t i nx l .

C h u y nb i nv b i ut h cv od y
K h i v i t m g l i , n l t n h t v i t c c b i ut h c i n nb a og m m t m n gk t c h a t nb i n , t i pt h e ol c c b i n . Ma ym nt h a y , c h u nCb a og mc c s t r i n g i z e i uh n h' #' , c s d n gt r c t r o n gc h n gn y . K h i b n t m t #t r c k h i m t c u c t r a n hc i t r o n gm t v mt i nx l , t i nx l h a l l u nr n gv om t m n gk t . i un y , k t h pv i t h c t l m n gk t k h n gc d uc h mc uc a nt h i p c n i v om t m n gn h nv t d u yn h t , c h op h pb nt h c h i nm t ma c r or t t h u nt i nc h ov i c i n nc c g i t r c a c c b i n t r o n gt h i g i a ng l i :
#X c n hP R( x )c o u t< <#x" = "< <x< <" \n " ;

N ub ni nc c b i nmt b n gc c hg i v mP R( a ) , n s c t c d n gt n gt n h c c m : c o u t< <" a= "


< <a< <" \n " ;

Qu t r n hn yc n gl mv i c v i t o nb b i ut h c . C h n gt r n hs a u ys d n gm t v m t or a m t c c h v i t t t m i nc c b i uh i ns t r i n g i z e dv s a u n hg i b i ut h c v i nk t q u :
// :C 0 3 :S t r i n g i z i n g E x p r e s s i o n s . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; #X c n hP( A )c o u t< <#A< <" : "< <( A )< <e n d l ; i n tm a i n( ){ i n ta=1 ,b=2 ,c=3 ; P( a ) ,P( b ) ,P( c ) ; P( a+b ) ; P( ( c-a )/b ) ; }/// :~

B nc t h t h ym t k t h u t n h t h n yc t h n h a n hc h n gt r t h n hk h n gt h t h i u , c b i t l n ub n
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 87/320

08/10/2013

Suy ngh trong C + +, Vol 1

k h n gc t r n hg l i ( h o c p h i s d n gn h i um i t r n gp h t t r i n ) . B nc n gc t h c h nm t #i f d e f g yr a P( A ) c n hn g h a l " k h n gc g " k h i b nmu nl o i b g l i .

Ck h n g n h( )v m
T r o n gt i u t i uc h u nt pt i n< c a s s e r t >b ns t mt h yk h n g n h( ) , m l m t g l i v mt h u nt i n . K h i b ns d n gk h n g n h( ) , b nc u n gc pc h on m t c u c t r a n hc i l m t b i uh i nb n a n g" k h n g n hl n g . " C c t i nx l t or a m s k i mt r a k h n g n h . N uk h n g n hl k h n g n gs t h t , c h n g t r n hs d n gl i s a uk h i p h t h n hm t t h n gb ol i n i c h ob nb i t s k h n g n h c v r n gn k h n g t h n hc n g . D i yl m t v d n h :
// :C 0 3 :A s s e r t . c p p //S d n gc ck h n g n h( )g l iv m #b a og m< c a s s e r t > //C h av m s d n g t nm i nk h n gg i a nt i uc h u n ; i n tm a i n( ){ i n ti=1 0 0 ; k h n g n h( i=1 0 0 ) ;//K h n g }// / :~

V mc n g u ng c t r o n gt i uc h u nC , d o n c n gc s nt r o n gt pt i nt i u a s s e r t . h. K h i b n k t t h c g l i , b nc t h l o i b c c m c t or a b i c c v mb n gc c h t d n g :
#X c n hN D E B U G

t r o n gc c c h n gt r n ht r c k h i a < c a s s e r t >, h o c b n gc c h n hn g h a ND E B U Gt r nd n gl n ht r n hb i n d c h . ND E B U Gl m t l c c s d n gt r o n g< c a s s e r t > t h a y i c c hm c t or a b i c c ma c r o . S a u t r o n gc u ns c hn y , b ns t h ym t s l a c h nt h a yt h t i n hv i h n k h n g n h( ) .

ac h c h cn n g

K h i m t c h c n n g c b i nd c hv n pv om yt n h c t h c t h i , n c h i m m t o nb n h . B n h , v d o c c c h c n n g , c m t a c h . Cc h a b a og i c m t n g nn g t h a n hn h pn i n h n gn g i k h c s h i b c i . B nc t h s d n g a c h c h c n n gv i c o nt r c n gg i n gn h b nc t h s d n g a c h k h c n h a u . V i c k k h a i v s d n gc o n t r h mc v h i m l c u , n h n gn t h e o n hd n gc a p h nc nl i c a n g nn g .

X c n h m tc o nt r h m
x c n hm t c o nt r nm t c h c n n gm k h n gc i s v k h n gc g i t r t r v , b nn i : v o i d( *
f u n c P t r )( ) ;

K h i b n a n gt mk i m m t n hn g h a p h c t pn h t h n y , c c ht t n h t t nc n gl b t u g i a v l mv i c t h e oc c hc a b nr a . " B t ut t r u n gl , " c n g h a l b t ut t nb i n , l f u n c P t r . " L mv i c t h e oc c hc a b n " c n g h a l t mk i mb np h i c h om c g nn h t ( k h n gc g t r o n gt r n gh pn y , d u n g o c p h i d n gl i b nn g n ) , s a u n h ns a n gb nt r i ( m t c o nt r b i uh i nb n gc c d uh o a t h ) , s a u t mk i m b np h i ( m t d a n hs c h i s r n gc h ot h ym t c h c n n gm k h n gc i s ) , s a u n h ns a n g b nt r i ( c h i ul c , m c h r a c c c h c n n gk h n gc g i t r t r v ) . C h u y n n gp h i t r i p h i n yl mv i c v i c c t k h a i . R s o t , " b t u g i a " ( " f u n c P t r l m t . . . " ) , i b np h i ( k h n gc b n a n gb c h nl i b i c c d un g o c nb np h i ) , i s a n gb nt r i v t mt h yn h n g' * ' ( " . . . c o nt r t i m t . . . " ) , i v b np h i v t mt h yd a n h s c h i s r n g( " . . . c h c n n gk h n gc i s . . . " ) , i s a n gb nt r i v t mt h yn h n gk h o n gt r n g( " f u n c P t r l m t c o nt r nm t c h c n n gm k h n gc i s v t r v k h o n gt r n g" ) . B nc t h t h i t i s a o* f u n c P t r i h i d un g o c n . N ub nk h n gs d n gc h n g , t r n hb i nd c hs t h y : v o i d*f u n c P t r( ) ; B ns c n hn g h a m t h m( t r v m t v o i d* ) c h k h n gp h i l x c n hm t b i n . B nc t h n g h c a t r n hb i nd c hn h i q u a q u t r n ht n gt b nl mg k h i n h i ur a n h n gg t u y nb h o c n hn g h a c c o i l . Nc nn h n gd un g o c n " yl nc h n gl i " n i l i b nt r i v t mt h y' * ' , t h a yv t i pt c b np h i v t mk i mc c d a n hs c h i s r n g .

T k h a i p h ct pv n hn g h a

Nh m t s a n gm t b n , m t k h i b nt mr a c c hCv C++c p h pk h a i b oh o t n g , b nc t h t or a n h i u h nn a c c m t h n gp h c t p . V d :
88/320

// :C 0 3 :C o m p l i c a t e d D e f i n i t i o n s . c p p
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

/*1 .*/ /*2 .*/ /*3 .*/ /4 .*/

v o i d*( *( *f p 1 )( i n t ) )[ 1 0 ] ; f l o a t( *( *F P 2 )( i n t ,i n t ,f l o a t ) )( i n t ) ; it y p e d e f( *( *( *F P 3 )( ) )[ 1 0 ] )( ) ; i n t( *( *f 4( ) )[ 1 0 ] )( ) ; F P 3m t ;

i n tm a i n( ){ }/// :~

i b q u a m i m t v s d n gc c h n gd nb np h i b nt r i c o nn r a . S 1 c h ob i t " f p 1 l m t c o nt r nm t c h c n n gm p h i m t m t i s s n g u y nv t r v m t c o nt r t i m t m n gc a 1 0 t r n gc o nt r . " S 2 c h ob i t " f p 2 l m t c o nt r nm t c h c n n gm p h i m t b a i s ( i n t , i n t , v f l o a t ) v t r v m t c o n t r nm t c h c n n gm p h i m t m t i s s n g u y nv t r v m t n i . " N ub n a n gt or a r t n h i u n hn g h a p h c t p , b nc t h mu ns d n gm t t y p e d e f . S 3 c h ot h ym t t y p e d e f s l ug mt p h c t pm i l n . Nn i " M t F P 3 l m t c o nt r nm t c h c n n gm k h n gc i s v t r v m t c o nt r nm t m n g1 0 c o nt r nc h c n n gm k h n gc i s v t n gg p i t r l i . " S a u , n n i " mt l m t t r o n gn h n gF P 3 l o i . " t y p e d e f n i c h u n gl h u c hc h ov i c x yd n gg i i t h i up h c t pt n h n gc i ng i n . S 4 l m t t u y nb c h c n n gt h a yv m t n hn g h a b i n . Nn i " f 4 l m t h mt r v m t c o nt r nm t m n g1 0 c o nt r nc h c n n gm n g u y nt r l i . " B ns h i mk h i c nt k h a i p h c t pn h v yv n hn g h a t h n y . T u yn h i n , n ub n i q u a c c b i t pc a h t mr a b nt h mc h s k h n g c n h b nk h o nv i n h n gn g i h i p h c t p , b nc t h g pp h i t r o n g c u c s n gt h c .

S d n g m tc o nt r h m
M t k h i b nx c n hm t c o nt r nm t c h c n n g , b np h i g nn nm t a c h c h c n n gt r c k h i b n c t h s d n gn . C n gg i n gn h a c h c a m t m n ga r r [ 1 0 ] c s nx u t b i t nm n gk h n gc d u n g o c ( a r r ) , a c h c a m t h mf u n c ( ) c s nx u t b i c c t nc h c n n gm k h n gc d a n hs c h i s ( c h c n n g) . B nc n gc t h s d n gc p h pr r n gh nv c h c n n g( ) . g i h m, b nt i c hc a c o n t r t r o n gc n gm t c c hm b n k h a i b on ( h yn h r n gCv C++l u nl u nc g n gl mc h oc c n h n g h a g i n gn h a un h c c hc h n g c s d n g ) . V d s a u yc h ot h yc c hm t c o nt r nm t c h c n n g c x c n hv c s d n g :
// :C 0 3 :P o i n t e r T o F u n c t i o n . c p p //X c n hv s d n gm tc o nt r nm tc h cn n g #I n c l u d e s d n gt nm i nk h n gg i a nt i uc h u n ; v o i df u n c( ){ c o u t< <" f u n c( ) cg il . . . "< <E n d l ; } i n tm a i n( ){ v o i d( *f p )( ) ; // n hn g h am tc o nt r h m f p=c h c n n g ; //k h it on ( *F p )( ) ; //d e r e f e r e n c i n gg ih m v o i d( *F P 2 )( )=c h cn n g ; // n hn g h av k h it o ( *F P 2 )( ) ; }/// :~

S a uk h i c o nt r nc h c n n gf p c n hn g h a , n c g nc h o a c h c a m t h mf u n c ( ) s d n gf p= c h c n n g( t h n gb od a n hs c h i s l m t t c ht r nt nh m) . T r n gh pt h h a i c h ot h y n hn g h a v k h i t o n gt h i .

M n gc ac o nt r nc h cn n g
M t t r o n gn h n gc ut r c t h v h nb nc t h t om t m n gc a c c c o nt r nc c c h c n n g . c h nm t c h c n n g , b nc h c nc h s v om n gv t i c hc a c o nt r . i un yh t r c c k h i n i mv b n g i uk h i n a n g , t h a yv s d n g i uk i nh o c b oc ot r n gh p , b nc h nc h c n n g t h c h i nd a t r nm t b i nt r n gt h i ( h o c k t h pc c b i nt r n gt h i ) . L o i t h i t k c t h h u c hn ub nt h n gx u y nb s u n gh o c x a c h c n n gt b n g( h o c n ub nmu nt or a h o c t h a y i m t b n gt n g ) . V d s a u yt or a m t s c h c n n gg i s d n gm t v mt i nx l , s a u t or a m t m n gc a c o nt r n n h n gc h c n n gs d n gk h i t ot n gh pt n g . Nh b nt h y , n r t d d n g t h mh o c l o i b c c c h c n n gt b n g( v d o , c h c n n gc a c h n gt r n h ) b n gc c ht h a y i m t s m n h :
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 89/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 0 3 :F u n c t i o n T a b l e . c p p //S d n gm tm n gc ac cc o nt r c h cn n g #I n c l u d e s d n gt nm i nk h n gg i a nt i uc h u n ; //M tv m x c n hc h cn n gg i :#x c n hD F( N )v o i dN( ){ \ n n g "#N" cg il . . . "< <E n d l ; } c o u t< <" c h c

D F( a ) ;D F( b ) ;D F( c ) ;D F( d ) ;D F( e ) ;D F( f ) ;D F( g ) ; v o i d( *f u n c _ t a b l e[ ] )( )={ a ,b ,c ,d , ,e ,g } ; i n tm a i n( ){ w h i l e( 1 ){ c o u t< <" n h nm tp h mt ' a ' n' g ' " " H o cq t h o t "< <e n d l ; c h a rc ,c r ; c i n . g e t( c ) ;c i n . g e t( c r ) ;m t// g i yc h oC R i f( c= =' q ' ) b r e a k ;//. ..r ak h it r o n gk h i( 1 ) i f( c < ' a '||c >' g ' ) t i pt c ; ( *F u n c _ t a b l e[ c-' a ' ] )( ) ; } }/// :~

T i t h i i mn y , b nc t h c t h t n gt n gn h t h n ok t h u t n yc t h h u c hk h i t om t s l o i t h n gd c hv i nh o c c h n gt r n hx l d a n hs c h .

T h ch i n : q u nl b i nd c hr i n gb i t

K h i s d n gb i nd c h r i n gb i t ( p h mv om t s nv d c h ) , b nc nm t s c c h t n gb i nd c hm i t pt i nv n i l nm i l i nk t x yd n gt t c c c m n hc n gv i c c t h v i nt h c hh pv m k h i n gv om t t pt i nt h c t h i . H uh t c c t r n hb i nd c hc h op h pb nl m i un yv i m t t u y nb d n gl n hd u y n h t . C h oG NUC++ , v d , b nc t h n i g++S o u r c e F i l e 1 . c p pS o u r c e F i l e 2 . c p p C c v n v i p h n gp h pn yl c c t r n hb i nd c h ut i ns b i nd c hm i t pt i nc n h n , b t k t pt i n c n c x yd n gl i h a yk h n g . V i n h i ut pt i nt r o n gm t d n , n c t h t r t h n hc m b i nd c hl i t t c m i t h n ub n t h a y i c h l m t t pt i nd u yn h t . C c g i i p h pc h ov n n y , p h t t r i nt r nU n i x n h n gc s n k h pm i n i t r o n gm t s h n ht h c , l m t c h n gt r n h c g i l l m. C c ma k e t i n c hq u nl t t c c c t pt i nc n h nt r o n gm t d nb n gc c h l mt h e oc c h n gd nt r o n gm t t pt i nv nb ng i l ma k e f i l e . K h i b nc h n hs a m t s c c t pt i nt r o n g m t d nv l o i l m, c c ma k e c h n gt r n ht h e oh n gd nt r o n gma k e f i l e s os n hc c n g yt r nc c t p t i nm n g u n n h n gn g yt r nc c t pt i n c ht n g n g , v n um t m n g u nt pt i nn g yl h ng n y h nt pt i nm c t i uc a n , l mc h og i t r n hb i nd c ht r nc c t pt i nm n g u n . l mc h oc h r e c o mp i l e s c c t pt i nm n g u n c t h a y i , v b t k t pt i nm n g u nk h c b n hh n gb i c c t pt i ns a i . B n g c c hs d n gma k e , b nk h n gc np h i l pl i t t c c c f i l e t r o n gd nc a b nm i k h i b nt h c h i nm t s t h a y i , c n gk h n gl mb np h i k i mt r a t h yr n gt t c m i t h c x yd n g n gc c h . C c ma k e f i l e c c h a t t c c c l n h a d nc a b nv i n h a u . H c t p s d n gl ms g i pb nt i t k i mr t n h i u t h i g i a nv t h t v n g . B nc n gs k h mp h r a r n gma k e l c c h i nh n hm b nc i t p h nm m m i t r n m t m yL i n u x /U n i x ( m c d n h n gma k e f i l e c x ut h h nr t n h i up h c t ph ns ov i n h n gn g i c t r n hb yt r o n gc u ns c hn y , v b ns t h n gx u y nt n gt or a m t ma k e f i l e c h om yt n hc t h c a b n n h l m t p h nc a q u t r n hc i t ) . V l mc h oc s nt r o n gm t s h n ht h c c h oh un h t t c c c t r n hb i nd c hC++( v n g a yc k h i n k h n g p h i l , b nc t h s d n gt d oc s nl mc h os v i b t k t r n hb i nd c h ) , n s l c n gc s d n gt r o n gc u n s c hn y . T u yn h i n , c c n h c u n gc pt r n hb i nd c hc n g t or a c n gc x yd n gd nc a r i n gm n h . Nh n gc n gc n yy uc ub nc t pt i nn mt r o n gd nc a b nv x c n ht t c c c m i q u a nh c a m n h . Nh n gc n gc n ys d n gm t c i g t n gt n h m t ma k e f i l e , t h n g c g i l m t t p t i nd n, n h n gm i t r n gl pt r n hd u yt r t pt i nn y , d o b nk h n gc np h i l ol n gv n . C uh n hv s d n gc c t pt i nd nt h a y i t m t m i t r n gp h t t r i nk h c , v v yb np h i t mt h yn h n gt i l i ut h c hh pv c c hs d n gc h n g( m c d c n gc t pt i nd n c c u n gc pb i c c n h c u n gc pt r n hb i nd c ht h n gr t ng i n s d n gm b nc t h h c c h n gb n gc c hc h i x u n gq u a n hm u c y ut h c hc a t i v g i o d c ) . C c ma k e f i l e s c s d n gt r o n gc u ns c hn ys l mv i c n g a yc k h i b nc n g a n gs d n gc n gc d n x yd n gm t n h c u n gc pc t h .

T h ch i nc ch o t n g

K h i b ng l m( h o c b t c t nc a " t h c h i n " c h n gt r n hc a b ns x yr a ) , c c ma k e c h n gt r n hs t m t r o n gt h m c h i nh n hc h om t t pt i nt nl Ma k e f i l e , m b n t or a n u l d nc a b n . T pt i nn y l i t k p h t h u c g i a c c t pt i nm n g u n . l mc h on h nv on h n gn g yt r nc c t pt i n . N um t t pt i np h t h u c c m t n g yl nh nm t t pt i nn p h t h u c v o , l mc h ot h c h i nc c q u y n h a r a s a uk h i s p h
90/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

t h u c . T t c c c k i nt r o n gma k e f i l e s b t uv i m t #v t i pt c nc u i d n g . Nh m t v d ng i n , c c ma k e f i l e c h om t c h n gt r n hg i l " h e l l o " c t h b a og m:


#M tn h nx t h e l l o . e x e :h e l l o . c p p m y c o m p i l e rh e l l o . c p p

N yn i r n gh e l l o . e x e ( m c t i u ) p h t h u c v oh e l l o . c p p. K h i h e l l o . c p pc m t n g ym i h nh e l l o . e x e , l m c h ot h c h i n" q u yt c " my c o mp i l e r h e l l o . c p p. C t h c n h i up h t h u c v n h i uq u yt c . Nh i ul mc h oc c c h n gt r n hy uc ut t c c c q u yt c b t ub n gm t t a b . Ng o i r a , k h o n gt r n gt h n g c b q u a , d o b nc t h n hd n gc h od c . C c q u y n hl k h n gg i i h nl c c c u c g i nc c t r n hb i nd c h , b nc t h g i b t k c h n gt r n hb n mu nt b nt r o n gl mc h o. B n gc c ht or a c c n h mb p h t h u c n g u y nt c p h t h u c l nn h a u , b nc t h c h n hs a c c t pt i nm n g u nc a b n , g l mv c h c c h nr n gt t c c c t pt i nb n hh n gs c x yd n g l i m t c c hc h n hx c . Ma c r o M t ma k e f i l e c t h c h a m a c r o ( l ur n g yl h o nt o nk h c n h a ut C/C++ma c r ot i nx l ) . Ma c r o c h op h pt h a yt h c h u i t h u nt i n . C c ma k e f i l e s t r o n gc u ns c hn ys d n gm t ma c r o g i C++ . V d ,


C P P=m y c o m p i l e rh e l l o . e x e :h e l l o . c p p $( C P P )h e l l o . c p p

C c = c s d n g x c n hC P Pn h m t v m , v $ v d un g o c m r n gv m . T r o n gt r n gh pn y , v i c m r n gc n g h a l c c c u c g i ma c r o$ ( C P P ) s c t h a yt h b n gc h u i my c o mp i l e r . V i v mt r n , n ub nmu nt h a y i s a n gm t t r n hb i nd c hk h c n h a u c g i l c p p, b nc h c nt h a y i v m :
C P P=c p p

B nc n gc t h t h mc b i nd c h , v v , v m , h o c s d n gc c ma c r or i n gb i t t h mc b i nd c h . Qu y n hh ut Nt r n nt n h t n i l mt h n o g i t r n hb i nd c hc h om i nc p pt pt i nt r o n gd nc a b n , k h i b n b i t i u l q u t r n hc b ng i n gn h a um i l n . K t k h i t h c h i n c t h i t k t i t k i mt h i g i a n , n c n gc m t c c hv i t t t h n h n g , mi nl h p h t h u c v oh ut t nt pt i n . Nh n gc h v i t t t c g i l q u y t c h ut . M t n g u y nt c h ut l c c h d yl mt h n o c h u y n i m t t pt i nv i m t l o i p h nm r n g( . c p p, v d ) v om t t pt i nv i m t l o i p h nm r n g( o b j . h o c e x e . ) . M t k h i b nd yc h oc c q u yt c s nx u t m t l o i t pt i nt m t , t t c c c b np h i l ml n i l mc h oc c t pt i np h t h u c v oc c t pt i n k h c . K h i t h c h i nt mt h ym t t pt i nv i m t n g yt r c h nc c t pt i nn p h t h u c v o , n s d n gc c q u yt c t or a m t t pt i nm i . C c q u y n hh ut c h ol mc h on k h n gc np h i q u y n hr r n g x yd n gt t c m i t h , n h n gt h a y v o n c t h t mr a c c h x yd n gm i t h d a t r np h nm r n gc a f i l e . T r o n gt r n gh pn yn n i : " x yd n gm t t pt i nk t t h c b n ge x e t m t k t t h c t r o n gc p p, g i l n hs a u y . " yl n h n gg n t r n gg i n gn h c h ov d t r n :
C P P=m y c o m p i l e r H ut : . . .E x ec p pc p p . e x e . : $( C P P )$<

C c h ut . c h n i l mc h on n nx e mr a c h ob t k p h nm r n gt nt pt i ns a u yb i v h c n g h a c b i t c h oma k e f i l e c b i t n y . T i pt h e ob nt h yr u l e h ut . c p p . e x e , t r o n g n i r n g" yl c c h c h u y n i b t k t pt i nc p h nm r n gc a c p pv i m t v i m t p h nm r n gc a e x e " ( k h i c p pt pt i nm i h nc c e x e t pt i n ) . Nh t r c y , $ ( C P P ) v m c s d n g , n h n gs a u b nn h nt h ym t c i g m i : $ <. B i v i un yb t uv i m t ' $ ' l m t v m , n h n g yl m t t r o n gma k e c b i t c x yd n g t r o n gma c r o' s . C c $ <c h c t h c s d n gt r o n gc c q u y n hh ut , v n c n g h a l " b t c i ug g y r a i uk i nt i nq u y t q u yt c " ( i k h i c g i l p h t h u c ) , t r o n gt r n gh pn yd c hl " c c c p pt pt i nm c np h i c b i nd c h . " M t k h i c c q u y n hh ut c t h i t l p , b nc h c t h n i r n g , v d , " l mc h oU n i o n . e x e , " v c c q u y n hh ut s k i c kv o , m c d k h n gc c p n " L i nmi n h" b t c n i n ot r o n gma k e f i l e . M ct i um c n h S a uk h i c c ma c r ov c c q u yt c h ut , l mc h on g o i h n hc h oc c " m c t i u " ut i nt r o n gm t t pt i n , v x yd n g , t r k h i b nc h n hk h c n h a u . V v y , s a uma k e f i l e :
C P P=m y c o m p i l e r H ut : . . .E x ec p pc p p . e x e . :
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 91/320

08/10/2013

Suy ngh trong C + +, Vol 1

$( C P P )$< t a r g e t 1 . e x e :t a r g e t 2 . e x e :

N ub nc h c ng ' l m' , s a u t a r g e t 1 . e x e s c x yd n g( s d n gc c q u yt c t m c n h ) , v l m c t i u ut i nm l mc h oc u c g pg . X yd n gt a r g e t 2 . e x e b np h i r r n gn i ' l mt a r g e t 2 . e x e . i un yt r n nt n h t , v v yb ns t om t m c n h " G i " m c t i up h t h u c v ot t c c c p h nc nl i c a c c m c t i u , n h t h n y :


C P P=m y c o m p i l e r H ut : . . .E x ec p pc p p . e x e : . t a r g e t 2 . e x e $( C P P )$< t tc :t a r g e t 1 . e x e

y , ' t t c ' k h n gt nt i v k h n gc t pt i ng i l " t t c " , v v ym i k h i b ng l m, c h n gt r n ht h y' t t c ' n h l m c t i u ut i nt r o n gd a n hs c h( v d o m c t i um c n h ) , s a u n t h yr n g ' t t c ' k h n g t nt i n nn l mc h on t t h nb n gc c hk i mt r a t t c c c p h t h u c . V v y , n n h nv ot a r g e t 1 . e x e v ( b n gc c hs d n gq u yt c h ut ) t h yl i u( 1 ) t a r g e t 1 . e x e t nt i v ( 2 ) c h od t a r g e t 1 . c p pm i h nt a r g e t 1 . e x e , v n un h v yc h yc c q u y n hh ut ( n ub nc u n gc pm t q u yt c r r n gc h om t m c t i uc t h , n g u y n t c c s d n gt h a yt h ) . S a u n s c h u y ns a n g n ht i pt h e ot r o n gd a n hs c hm c t i um c n h . Nh v y , b n gc c ht or a m t d a n hs c hm c t i um c n h( t h n g c g i l ' t t c ' t h e oq u y c , n h n gb nc t h g i n l b t c i ug ) , b nc t h g yr a t t c c c t h c t h i t r o n gd nc a b n c t h c h i n ng i nb n g c c hg ' l m' . Ng o i r a , b nc t h c d a n hs c hm c t i uk h n gm c n hk h c m l mn h n g i uk h c v d , b nc t h t h i t l pn g ' l mc h og l i " x yd n gl i t t c c c t pt i nc a b nv i g d yi n

Ma k e f i l e st r o n gc u ns c hn y
S d n gc h n gt r n hE x t r a c t C o d e . c p pt t p2 c a c u ns c hn y , t t c c c d a n hs c hm t r o n gc u ns c hn y s t n g c c h i t x u t t p h i nb nv nb nA S C I I c a c u ns c hn yv c t t r o n gt h m c c o nt h e o c h n gc a h . Ng o i r a , E x t r a c t C o d e . c p pt or an h i uma k e f i l e s t r o n gm i t h m c c o n( v i t ng i k h c n h a u ) , d o b nc t h c h ng i nl d i c h u y nv ot h m c c o n v l o i ma k e f my c o mp i l e r . ma k e f i l ( t h a yt h t nc a t r n hb i nd c hc a b nc h oe ' my c o mp i l e r ' , t h e ' f ' c n i " s d n gn h n gg s a uk h i ma k e f i l e " ) . C u i c n g , E x t r a c t C o d e . c p pt or a m t " b c t h y " Ma k e f i l e t r o n gt h m c g c n i c c f i l e c a c u ns c h c m r n g , v i un yma k e f i l e x u n gv om i t h m c c o nv c c c u c g i t h c h i nv i s t h c hh p ma k e f i l e . B n gc c hn yb nc t h b i nd c ht t c c c m t r o n gc u ns c hb n gc c hg i m t nma k e l n h , v q u t r n hs d n gl i b t c k h i n ot r n hb i nd c hc a b nk h n gt h x l m t t pt i nc t h ( l ur n gm t t i uc h u nC++t h e ot h n gb i nd c hs c t h b i nd c ht t c c c t pt i nt r o n gc u ns c hn y ) . B i v h i nt h c c a l mt h a y i t h t h n g h t h n g , c h , c i mc h u n gc b nn h t c s d n gt r o n gt or a ma k e f i l e s .

M tma k e f i l ed

Nh c p , c n gc m k h a i t h c E x t r a c t C o d e . c p pt n gt or a ma k e f i l e s c h om i c h n g . B i v i u n y , c c ma k e f i l e s c h om i c h n gs k h n g c t t r o n gc u ns c h( t t c c c ma k e f i l e s c n gg i v i c c m n g u n , m b nc t h t i v t w w w . B r u c e E c k e l . c o m) . T u yn h i n , l h u c h x e m m t v d v m t ma k e f i l e . M t p h i nb nr t g nc a m t t r o n g c t n gt or a c h oc h n gn yb n gc n gc k h a i t h c c a c u ns c hl n h n gg s a u . B ns t mt h yn h i uh nm t ma k e f i l e t r o n gm i t h m c c o n( c t ng i k h c n h a u , b ng i m t c t h v i ' ma k e f ' ) . N yl d n hc h oG NUC++ :

C P P=g++ O f l a g= o C p p . ooc p pc : : .H ut . . . . $( C P P )$( C P P F L A G S ) c$< n g . : $( C P P )$( C P P F L A G S ) c$< t tc :\ Q u a yl i\ K h a i\ I f t h e n\ o n\ G u e s s 2 #P h nc nl ic ac ct pt i nc ac h n gn yk h n g ch i nt h T r l i :R e t u r n . o $( C P P )$( o f l a g )T r R e t u r n . o T u y nb :D e c l a r e . o $( C P P )$( o f l a g )K h a ib oD e c l a r e . o I f t h e n :I f t h e n . o $( C P P )$( o f l a g )I f t h e nI f t h e n . o


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 92/320

08/10/2013

Suy ngh trong C + +, Vol 1

o n :G u e s s . o $( C P P )$( o f l a g ) o nG u e s s . o G u e s s 2 :G u e s s 2 . o $( C P P )$( o f l a g )G u e s s 2G u e s s 2 . o R e t u r n . o :R e t u r n . c p p D e c l a r e . o :D e c l a r e . c p p I f t h e n . o :I f t h e n . c p p G u e s s . o :G u e s s . c p p G u e s s 2 . o :G u e s s 2 . c p p

V mC P P c t h i t l p t nc at r n hb i nd c h . S d n gm t t r n hb i nd c hk h c n h a u , b nc t h c h n hs a c c ma k e f i l e h o c t h a y i g i t r c a c c v mt r nd n gl n h , n h t h n y : l mc h oC P P=c p p L u , t u yn h i n , E x t r a c t C o d e . c p pc m t c h n gt r n ht n g t n gt oma k e f i l e s c h oc c t r n hb i n d c hb s u n g . V mt h h a i o f l a gl l c c s d n g c h r a t nc a t pt i n ur a . M c d n h i ut r n hb i nd c ht n gg i n hc c t pt i n ur a c t nc s t n gt n h c c t pt i n uv o , n h n gn g i k h c t h k h n g ( c h n gh nn h L i n u x /U n i x t r n hb i nd c h , m m c n h t or a m t t pt i ng i l a . o u t ) . B nc t h t h yr n gc h a i n g u y nt c h ut y , m t c h oc p pf i l e v m t c h oc . t pt i n( t r o n gt r n gh pb t k m n g u nCc np h i c b i nd c h ) . M c t i um c n hl t t c , v m i d n gc h om c t i un yl " t i pt c " b n gc c hs d n gc c d ug c hc h on g c l nc h o nk h i Gu e s s 2 , l n g i c u i c n gt r o n gd a n hs c hv d o k h n gc d ug c hc h on g c . C r t n h i ut c p h mt r o n gc h n gn y , n h n gc h n h n g c t h h i n yv l i c hc a n g ng n . C c q u yt c t c h ms c c a v i c t or a c c t pt i n i t n g( v i o . m r n g ) t c p pt pt i n , n h n gn i c h u n g b nc np h i n ur r n gc c q u yt c c h ov i c t or a c c t h c t h i , b i v t h n gt h n gm t t h c t h i c t or a b n gc c hk t n i n h i ut pt i n i t n gk h c n h a uv l mc h ok h n gt h o nn h n gn g i a n gc . Ng o i r a , t r o n gt r n gh pn y( L i n u x /U n i x ) k h n gc m r n gt i uc h u nc h ot h c t h i d o , m t q u yt c h ut s k h n gl mv i c c h on h n gt n hh u n g ng i n . D o , b ns t h yt t c c c q u yt c x yd n gt h c t h i t h c q u y n hr r n g . i un yma k e f i l e c c o n n ga nt o nn h t c a v i c s d n gc n g t ma k e t n hn n gn h t c t h , n c h s d n gc b nl mc h ok h i n i mv m c t i uv p h t h u c , c n gn h ma c r o . B n gc c hn y , n c h un h y n t mv l mv i c v i n h i ul mc h oc h n gt r n hc n gt t . Nc x uh n g s nx u t m t l nh nma k e f i l e , n h n g k h n gp h i l x un h v yv n t n gt or a b i E x t r a c t C o d e . c p p. C r t n h i uk h c l mc h oc c t n hn n gm c u ns c hn ys k h n gs d n g , c n gn h c c p h i nb nm i h n v t h n gmi n hv c c b i nt h c a t h c h i nv i c c p h mt t t i nt i nc t h t i t k i mr t n h i ut h i g i a n . T i l i uh n gd n a p h n gc a b nc t h mt c c t n hn n gh nn a c t h c a b nma k e , v b nc t h t m h i ut h mv l mt Q u nl d n v i H y b i Or a mv T a l b o t t ( O' R e i l l y , 1 9 9 3 ) . Ng o i r a , n un h c u n gc pt r n hb i nd c hc a b nk h n gc u n g c pm t ma k e h o c n s d n gm t p h i t i uc h u nma k e , b nc t h t mt h yG NUl mc h oh un h b t k n n t n gt r o n gs t nt i b n gc c ht mk i mt r nI n t e r n e t c h oG NUl ut r ( t r o n g c r t n h i u ) . C h n gn yl m t t o u r d ul c hk h c n gt h n gt h n gq u a t t c c c t n hn n gc b nc a C++c p h p , h uh t t r o n gs c t h a h n gt v t n g n gv i C( v k t q u t r o n gC++' s c c a t n gk h n n gt n g t h c hn g c v i C ) . M c d m t s C++ , t n hn n g c g i i t h i u y , t o u r d ul c hn yc h y ud n hc h o n h n gn g i a n gt h ot r o n gl pt r n h , v c h ng i nl c np h i c g i i t h i uv n h n g i uc b nc p h pc a Cv C++ . N ub n l m t l pt r n hC , b nc t h n h nt h yn g a yc m t h o c h a i i uv C y c k h n gq u e nt h u c , n g o i C++t n hn n gm c n h i uk h n n gm i c h ob n . T u yn h i n , n uc h n gn y v nc v h i q u , b nn n i q u a q u t r n hC DR OM S u y n g h t r o n g C : C s c h o C++v J a v a ( t r o n g c c c b i g i n g , b i t pv g i i p h ph n gd n ) , c n g t h n hc u ns c hn y , v c n gc s nt i w w w . B r u c e E c k e l . c o m.

T mt t

B i t p
1.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

T om t t pt i nt i u ( c p h nm r n g' . h' ) . T r o n gt pt i nn y , t u y nb m t n h mc c c h c n n g
93/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

2. 3.

4. 5. 6.

7. 8. 9. 10. 11. 12. 13. 14. 15.

16. 17.

18.

19. 20. 21. 22. 23. 24. 25.

b n gc c ht h a y i d a n hs c h i s v g i t r t r l i t r o n gs n h n g i us a u y : k h o n gt r n g, c h a r , i n t v f l o a t . B yg i t or a m t c p p . t pt i nc c h a t pt i nt i u c a b nv t or a n hn g h a c h ot t c c c c h c n n gn y . M i n hn g h a ng i nc h c ni nr a c c t nc h c n n g , d a n hs c h i s v k i ut r v , d o b nb i t n c g i l . T or a m t t h h a i c p p . t pt i nc c h a t pt i nt i u c a b nv x c n hi n t ma i n( ) , c c h a c c c u c g i nt t c c c c h c n n gc a b n . B i nd c hv c h y c h n gt r n hc a b n . V i t m t c h n gt r n hs d n gh a i l n gn h a uc h oc c v n gl pv c c n h i uh n hm u n( %) p h t h i nv i nc c s n g u y nt ( s t h i um k h n gc h i a h t c h ob t k c o ns k h c , n g o i t r c h ob n t h nv 1 ) . V i t c h n gt r n hs d n gm t t r o n gk h i v n gl p c t t uv ot i uc h u n( c i n) t h n hm t c h u i . yl m t " v h n " t r o n gk h i v n gl p , m b nt h o t r a k h i ( v t h o t k h i c h n gt r n h ) b n gc c hs d n gp h v t u y nb . i v i m i t c c , n hg i n b n gc c h ut i ns d n g m t c h u i c c n ub oc o " b n " m t g i t r k h n gt c hr i c a v nb n , v s a u s d n gm t c h u y n i t u y nb s d n gm g i t r t c hh pn h c h nc a n ( n h n gs v i c n yk h n gc n g h a l l p h o n gc c hl pt r n ht t , n c h p h i c u n gc pc h ob nt pt h d c v i d n g i uk h i n ) . B n t r o n gm i t r n gh p, i nm t c i g c n g h a . B np h i q u y t n hn h n gg n h n gl i " t h v " v n h n gg l n g h a . B nc n gp h i q u y t n hn h n gg t s b oh i uk t t h c c a c h n g t r n h . K i mt r a c h n gt r n hb n gc c hc h u y nh n gm t t pt i nv o uv ot i uc h u nc a c h n g t r n h( n ub nmu nt i t k i m n hm y , t pt i nn yc t h c t pt i nm n g u nc h n gt r n hc a b n ) . S a i Me n u . c p ps d n gc h u y n i b oc ot h a yv n ub oc o . V i t c h n gt r n h n hg i h a i b i ut h c t r o n gp h nc n h n" ut i n " . S a i Y o u r P e t s 2 . c p p n s d n gn h i ul o i d l i uk h c n h a u( c h a r , i n t , f l o a t , d o u b l e , v c c b i nt h c a h ) . C h yc h n gt r n hv t or a m t b n c a b t r b n h k t q u . N ub nc q u y n t r u yc pv on h i uh nm t l o i m yt n h , h i uh n h , h o c t r n hb i nd c h , h yt h t h n g h i mn y v i n h i ub i nt h n h b nc t h q u nl . T oh a i c h c n n g , m t t r o n g c m t c h u i * v m t t r o n g c m t c h u i &. M i c h c n n gn y n ns a i b nn g o i c h u i i t n gt h e oc c h c oc a r i n gm n h . T r o n gma i n( ) , t ov k h i t om t c h u i i t n g , i nn , s a u v t q u a n m t t r o n gh a i c h c n n g , i n nk t q u . V i t m t c h n gt r n hs d n gt t c c c t r i g r a p h s x e mt r n hb i nd c hc a b nh t r h . B i nd c hv c h yS t a t i c . c p p. L o i b c c t n ht k h a t m , b i nd c hv c h yn m t l nn a , v g i i t h c hn h n gg x yr a . H yt h b i nd c hv l i nk t F i l e S t a t i c . c p pv i F i l e S t a t i c 2 . c p p. K h n g c t h n gb ol i k t q u c n g h a g ? S a i B o o l e a n . c p p n h o t n gv i h a i g i t r t h a yv i n t s . S a i B o o l e a n . c p pv B i t wi s e . c p p h s d n gc c n h k h a i t h c r r n g( n ut r n hb i nd c hc a b nl n gQu yv i C++S t a n d a r dn s h t r n y ) . S a i B i t wi s e . c p ps d n gc c c h c n n gt R o t a t i o n . c p p. H yc h c c h nr n gb ns h i nt h k t q u t r o n gm t c c hm n r r n gn h n gg a n gx yr a t r o n gq u t r n hq u a y . S a i I f t h e n . c p ps d n gb a y ut n u k h c i uh n h( ? ) . T om t c ut r c c h a h a i c h u i c c i t n gv m t i n t . S d n gm t t y p e d e f c h oc ut r c t n . T o r a m t t h h i nc a c ut r c , k h i t ot t c b a g i t r t r o n gt r n gh pc a b n , v i nc h n gr a . L y a c h c a t r n g , v g nc h on m t c o nt r nc a b nc ut r c l o i . T h a y i b a g i t r t r o n gt r n g h pc a b nv i nc h n gr a , t t c b n gc c hs d n gc o nt r . T om t c h n gt r n hs d n gm t i ut r a c a m us c . T om t b i nn ye n u ml o i v i nr a t t c c c c o ns t n g n gv i c c t nm us c , s d n gc h ov n gl p . T h n g h i mv i U n i o n . c p pb n gc c hl o i b c c c n g o n c c y ut x e mh i u n gt r nk c ht h c c a k t q u c n g o n. C g n gg nc h om t y ut ( n h v y , m t l o i ) c a c c c n g o nv i nr a m t t h n gq u a m t y ut k h c n h a u( n h v y , m t l o i k h c n h a u ) x e mn h n gg s x yr a . T om t c h n gt r n h n hn g h a h a i i n t m n g , m t t r o n gn h n gq u y ns a uk h i k h c . C h s r a k h i c u i c a m n g ut i nv ot h h a i , v t h c h i nm t n h i mv . I nr a m n gt h h a i x e mn h n gt h a y i g yr a b i i un y . B yg i c g n gx c n hm t c h a r b i ng i a n hn g h a m n g ut i nv l n t h h a i , v l pl i t h n g h i m. B nc t h mu nt or a m t c h c n n gi n nm n g ng i nh a m h a c a b n . S a i A r r a y A d d r e s s e s . c p p l mv i c v i c c k i ud l i uc h a r , l o n gi n t , f l o a t , v i . pd n gc c k t h u t t r o n gA r r a y A d d r e s s e s . c p p i nr a k c ht h c c a c ut r c v a c h c a c c p h n t m n gt r o n gS t r u c t A r r a y . c p p. T om t m n gc a c h u i c c i t n gv g nm t c h u i c h om i y ut . I nr a c c m n gb n gc c hs d n gc h ov n gl p . T oh a i c h n gt r n hm i b t ut A r g s T o I n t s . c p p h s d n ga t o l ( ) v a t o f ( ) , t n g n g . S a i P o i n t e r I n c r e me n t 2 . c p p n s d n gm t c n g o nt h a yv m t c ut r c . S a i P o i n t e r A r i t h me t i c . c p p l mv i c v i l uv d i g p i . X c n hm t p h a ob i n . C a c h c a n , b a c h m t u n s i g n e dc h a r , v g nn v om t u n s i g n e dc h a r c o nt r . S d n gc o nt r n yv [ ] , c h v oc c p h a ob i nv s d n gp r i n t B i n a r y( )
94/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

26.

27. 28.

29.

30. 31.

32. 33. 34. 35.

c h c n n g c x c n ht r o n gc h n gn y i nr a m t b n c a f l o a t ( i t 0 ns i z e o f ( f l o a t ) . T h a y i g i t r c a p h a ov x e mb nc t h t mr a n h n gg a n gx yr a ( s n i c h a d l i um h a ) . X c n hm t m n gc a i n t . C a c h b t uc a m n g v s d n gs t a t i c _ c a s t c h u y n i n t h n hm t v o i d* . V i t m t c h c n n gm p h i m t m t v o i d* , m t s ( c h m t s b y t e ) , v m t g i t r ( c h r a c c g i t r m m i b y t e n n c t h i t l p ) n h c c i s . C c c h c n n gc nt h i t m i b y t e t r o n gp h mv i q u y n hv i g i t r c h n h . H yt h c c c h c n n gt r nm n gc a i n t . T om t c o n s t l o t c c i v b i n n gc a m n g i . C h s q u a t n gm n gv s d n gc o n s t _ c a s t b t n gy ut k h n gc o n s t v k h n gn n h, t n g n g , v c h n hm t g i t r c h om i y ut . T om t c h c n n gm p h i m t m t c o nt r t i m t m n gc a i v m t g i t r c h ob i t k c ht h c c a m n g . C h c n n gn ni nm i p h nt t r o n gm n g . B yg i t or a m t l o t c c i v k h i t om i p h nt k h n g , s a u s d n gc h c n n gc a b n i nm n g . S d n gt i pt h e or e i n t e r p r e t _ c a s b c c a c h b t uc a m n gc a b nt nm t u n s i g n e dc h a r * , v t h i t l pm i b y t e c a m n gt i 1 ( g i : b ns c np h i s d n gs i z e o f t n ht o ns b y t e t r o n gm t i ) . B yg i s d n gc h c n n g m n gi n nc a b n i nk t q u . T i s a ob nn g h r n gm i p h nt k h n g c t h i t l pv i g i t r 1 . 0 ? ( T h c ht h c ) S a i F l o a t i n g A s B i n a r y . c p p n i nr a t n gp h nc a i n h m t n h mr i n gb i t c a c c b i t . B ns p h i t h a yt h c c c u c g i np r i n t B i n a r y( v i ) o nm c b i t c a r i n gb n( m b nc t h l y c t p r i n t B i n a r y( ) t r o n g l m i un y , v b nc n gs p h i n g c l nn h nv h i u c n hd n gd uc h m n gc n gv i c c b y t e t h n gc h oc c t r n hb i nd c hc a b n( y l p h nk h k h n ) . T om t ma k e f i l e k h n gc h b i nd c hY o u r P e t s 1 . c p pv Y o u r P e t s 2 . c p p( i v i t r n hb i nd c hc t h c a b n ) m c nt h c h i nc h a i c h n gt r n hl m t p h nc a h n hv i m c t i um c n h . H yc h c c h nr n gb ns d n gq u yt c h ut . S a i S t r i n g i z i n g E x p r e s s i o n s . c p pP( A ) l i uk i n#i f d e f e d c h op h pc c m g l i s c t n gt c hr a b n gc c ht h i t l pm t l c d n gl n h . B ns c nt h a mk h ot i l i uh n gd n t r n hb i nd c hc a b n x e ml mt h n o x c n hv u n d e f i n e g i t r t i nx l t r nd n gl n h t r n hb i nd c h . X c n hm t c h c n n gm p h i m t m t h a i i s v t r v m t i n t . T ov k h i t om t c o nt r n c h c n n gn y , v g i h mq u a c o nt r c a b n . K h a i b om t c o nt r nm t c h c n n gl ym t i n t i s v t r v m t c o nt r nm t c h c n n gm p h i m t m t c h a r i s v t r v m t p h a o. S a i F u n c t i o n T a b l e . c p p m i c h c n n gt r v m t c h u i ( t h a yv i nr a m t t h n g i p ) v d ov y g i t r n y c i nb nt r o n gc a c h n h( ) . T om t ma k e f i l e v i m t t r o n gc c b i t pt r c ( d ob nc h n ) c h op h pb ng l mc h os nx u t x yd n gc c c h n gt r n h , v l mc h og l i c h om t x yd n gc a c h n gt r n hb a og mc t h n g t i ng l i .

232

c h u y n i t m t s n g nn g m b n b i t v c n n gs u t c a ov i m t n g nn g m i , t r o n g b ns c t h i uq u t r o n gm t t h i g i a n , c h o nk h i b nn h n c h a n gc a n ? l b i v b n b t h u y t p h c r n gb ns c c l i n h u nl nb n gc c hs d n gc n gc m i n y . N n gs u t , v l pt r n hm yt n h , c n g h a l t n g i c t h l mc h oc c c h n gt r n hp h c t ph nn h i uv nt n g t r o n gt h i g i a n t h n . C h c c h nc n h n gv n k h c k h i n i nl a c h nm t n g nn g , c h n gh nn h h i uq u ( k h n gb nc h t c a n g nn g n g u y nn h ns u yt h o i v a n gs n gl n ? ) , A nt o n( k h n gn g nn g g i pb n m b or n gc h n gt r n hc a b ns l u nl u nl mn h n gg b nc k h o c h , v x l l i m t c c h ? ) , v b ot r ( k h n g n g nn g g i pb nt or a c c m s l d h i u , s a i v m r n g ? ) . yl n h n gy ut q u a nt r n gl c h c c h n s c x e mx t t r o n gc u ns c hn y . Nh n gn n gs u t l i uc n g h a l m t c h n gt r n hm t r c y b a c a b nm t t u n v i t b yg i c m t t r o n g c c b nm t h o c h a i n g y . N n hh n g nn h i ut n gl pk i n ht . B nh i l n gb i v b ns c c c c c a o i m c a s c m n h nt x yd n gm t c i g , k h c hh n gc a b n( h o c n gc h ) l h n hp h c b i v s np h m c s nx u t n h a n hh nv v i t n g i h n , v c c k h c hh n gl h n hp h c b i v h c c s np h mv i g i r h n . C c hd u yn h t c c s g i a t n gl nv n n gs u t l t nd n gl i t h m c a n g i k h c . l , s d n gt h v i n . M t t h v i nc h ng i nl m t l o t c c m m n g i k h c v i t v n gg i c n gn h a u . T h n gt h n g , c c g i t i t h i un h t l m t t pt i nc p h nm r n gn h l i bv m t h o c n h i ut pt i nt i u n i v i t r n hb i nd c hc a b n n h n gg t r o n gt h v i n . M i l i nk t b i t c c ht mk i mt h n gq u a c c t pt i nt h v i nv t r c hx u t c c m b i nd c h t h c hh p . Nh n g c h l m t c c h c u n gc pm t t h v i n . T r nn nt n gm s p a nn h i uk i nt r c , c h n gh nn h L i n u x /U n i x , t h n gl c c hd u yn h t h pl c u n gc pm t t h v i nl v i m n g u n , v v yn c t h c c u
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 95/320

08/10/2013

Suy ngh trong C + +, Vol 1

h n hl i v d c hl i t r nc c m c t i um i . Nh v y , c c t h v i nc l l c c hq u a nt r n gn h t n n gc a on n gs u t , v m t t r o n gn h n gm c t i ut h i t k c h n hc a C++l l mc h ot h v i ns d n gd d n gh n . i un yc h ot h yc i ug k h k h nv v i c s d n gc c t h v i nt r o n gC . T mh i uy ut n ys c u n gc pc h ob nm t c i n h n ut i nv ot h i t k c a C++ , v d o h i ub i t v c c hs d n gn .

M t t h v i nC n h n h

M t t h v i nt h n gb t un h m t t ph pc c c h c n n g , n h n gn ub n s d n gt h v i nCc a b nt h b a c b i t t h n gc n h i u i uh nt h v c n h i u nc u c s n gh ns ov i h n hv i , h n h n g , v c c c h c n n g . Ng o i r a c nc c c c t n h( m ux a n h , b n gA n h , k t c u , s n g ) , c b i ud i nb i c c d l i u . V k h i b nb t u i p h v i m t t ph pc c c i mt r o n gC , n r t t h u nt i n mc h n gl i v i n h a u t h n hm t c ut r c , c b i t l n ub nmu n i d i nc h oh nm t i ut n gt t r o n gk h n gg i a nv n c a b n . S a u , b nc t h l mc h om t b i nn yc ut r c c h om i i u . V v y , h uh t c c t h v i nCc m t t ph pc c c ut r c s v m t t ph pc c c h c n n gm h n h n gt h e o n h n gc ut r c s . Nh m t v d v m t h t h n gn h v yc v n h , x e mx t m t c n gc l pt r n hh o t n g n h m t m n g , n h n gc k c ht h c c t h c t h n hl pt r o n gt h i g i a nc h y , k h i n c t or a . T i s g i n l m t C S t a s h. M c d n c v i t b n gC++ , n c p h o n gc c hc a n h n gg b nmu nv i t t r o n gC :

// :C 0 4 :C L i b . h T pt i n//t i u c h om tC n h t h v i n //M tt h ct h m n gn h t or at r o n gt h ig i a nc h y s t r u c tC S t a s h T a g{ i n ts i z e ; //K c ht h cc am ik h n gg i a n i n ts l n g ; //S c h l ut r i n tt i pt h e o ; //k h n gg i a nt r n gT i p //T n gp h nb m n gb y t e : u n s i g n e dc h a r*l ut r ; }C S t a s h ; l mm th i ul ck h it o( C S t a s h*s ,i n ts i z e ) ;t r n gd nd p( C S t a s h*s ) ;i n t a d d( C S t a s h*s ,c o n s tv o i d*p h nt ) ;v o i d*l y( C S t a s h*s ,i n ti n d e x ) ;i n t c o u n t( C S t a s h*s) ;t r n gt h ip h n g( C S t a s h*s ,i n tt n g ) ;/// :~

M t t nt h n h C S t a s h T a gt h n g c s d n gc h om t c ut r c t r o n gt r n gh pb nc np h i t h a mk h oc c c ut r c b nt r o n gc h n hn . V d , k h i t or a m t d a n h s c h l i nk t ( m i p h nt t r o n gd a n hs c hc a b nc c h a m t c o nt r nc c y ut s a u ) , b nc nm t c o nt r nt i pt h e oc ut r c b i n , v v yb nc nm t c c h x c n hl o i c o nt r t r o n gc ut r c c t h . Ng o i r a , b ns t h yh un h c c t y p e d e f n h t r nc h ot t c c c c ut r c t r o n gm t t h v i nC . N y c t h c h i n b nc t h x l c ut r c n h t h n l m t l o i h n hm i v x c n hc c b i n c ut r c n h t h n y :
C S t a s hA ,B ,C ;

C c l ut r c o nt r l m t u n s i g n e dc h a r * . M t u n s i g n e dc h a r l p h nn h n h t c a l ut r m t t r n hb i nd c h Ch t r , m c d t r nm t s m yn c t h c c n gk c ht h c n h l l nn h t . Np h t h u c v ot h c h i n , n h n gt h n gl m t b y t e d i . B nc t h n g h r n gv C S t a s h c t h i t k c h a b t k l o i c a b i n , m t v o i d* s t h c hh ph n y . T u yn h i n , m c c hl k h n g i ut r l ut r n yn h l m t k h i c a m t s l o i k h n gr , n h n g n gh nl m t k h i l i nk n h a ub y t e . C c m n g u nc h oc c t pt i nt h c t h i ( m b nc t h k h n gn h n c n ub nmu a m t t h v i nt h n gm i b nc t h c h n h n c m t b i nd c ho b j h o c l i bh o c d l l , v v ) n h s a u :
// :C 0 4 :C L i b . c p p{ O } //T h ch i nc cv d C n h t h v i n//K h a ib oc ut r cv c h cn n g : #B a og m" C L i b . h " #I n c l u d e#i n c l u d e< c a s s e r t > s d n gt nm i nk h n gg i a nt i u c h u n ;//S l n gc cy ut t h m//k h il ut r n g yc n g t n g :c o n s ti n tt n g=1 0 0 ; l mm th i ul ck h it o( C S t a s h*s ,i n tS Z ){ s >k c ht h c=s z ; s >s l n g=0 ; s >l ut r =0 ; s >t i pt h e o=0 ; } i n ta d d( C S t a s h*s ,c o n s tv o i d*y ut ){ i f( s >N e x t >=s >s l n g )// k h n gg i a n l i ? t h ip h n g( s ,t n g ) ; //S a oc h pp h nt v ol ut r , //b t ut k h n g g i a nt r n gb nc n h : i n ts t a r t B y t e s=s >t i pt h e o*s >k c ht h c ; u n s i g n e d c h a r*e=( u n s i g n e dc h a r* )y ut ; f o r( i n ti=0 ;i< s >k c ht h c ;i++ ) s >l ut r [ s t a r t B y t e s+i ]=e[ i ] ; s >t i pt h e o++ ; t r l i( s >t i pt h e o1 ) ;//C h s } v o i d*l y( C S t a s h*s ,i n ti n d e x ){ //K i mt r ar a n hg i ic h : k h n g n h( 0< =c h s ) ; i f( i n d e x >=s >t i pt h e o ) t r v 0 ;// c h ot h y c u ic n g //S nx u tc o nt r p h nt m o n gm u n : t r l i&( s >l ut r
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 96/320

08/10/2013

Suy ngh trong C + +, Vol 1

[ i n d e x*s >s i z e ] ) ; } i n tc o u n t( C S t a s h*s ){ t r l is >t i pt h e o ; //t h n hp h nt r o n g C S t a s h } k h o n gt r n gt n gl n( C S t a s h*s ,i n tt n g ){ k h n g n h( t n g >0 ) ; i n t n e w Q u a n t i t y=s >s l n g+t n g ; i n tn e w B y t e s=n e w Q u a n t i t y*s >k c ht h c ; i n t o l d B y t e s=s >s l n g*s >k c ht h c ; u n s i g n e dc h a r*b=n e wu n s i g n e dc h a r [ n e w B y t e s ] ; f o r( i n ti=0 ;i< o l d B y t e s ;i++ ) b[ i ]=s >l ut r [ i ] ;//S a oc h p c nm i x a[ ](s >l ut r ) ;//C l ut r s >l ut r =b ;// i mt ib n h m i >ss l n g=n e w Q u a n t i t y ; } t r n gd nd p( C S t a s h*s ){ i f( s >l ut r =0 ){ c o u t< <" g i i p h n gl ut r "< <e n d l ; x a[ ]s >l ut r ; } }/// :~

k h i t o(t h c h i nc c t h i t l pc nt h i t c h o) c ut r c C S t a s hb n gc c ht h i t l pc c b i nn i b c c g i t r t h c hh p . B a n u , l ut r c o nt r c t h i t l p k h n gk h n gl ut r b a n u c p h nb . C c a d d( ) c h nc h c n n gm t p h nt v oc c C S t a s h v t r k t i p . ut i n , n s k i mt r a x e mn uc b t k k h n gg i a nc s n l i . N uk h n g , n m r n gl ut r b n gc c hs d n gt n gl n( ) c h c n n g , mt s a u . B i v t r n hb i nd c hk h n gb i t l o i h n hc t h c a b i n c l ut r ( t t c c c c h c n n g c l m t v o i d* ) , b nc t h k h n gc h l m m t n h i mv , t r o n g c h c c h ns l i ut h u nt i n . T h a yv o , b np h i s a o c h pc c b i nb y t e b y b y t e . C c h ng i nn h t t h c h i nv i c s a oc h pl v i m n gl pc h m c . T h n g t h n g , c b y t e d l i ut r o n gl ut r , v i un y c c h n hb i c c g i t r t i pt h e o. b t uv i c c b y t e p h i b p , t i pt h e ol n h nv i k c ht h c c a m i p h nt ( t r o n gb y t e ) s nx u t s t a r t B y t e s . S a u , i s y ut c c v i m t u n s i g n e dc h a r * n c t h c g i i q u y t b y t e b y b y t e v s a oc h pv oc s nl ut r k h n gg i a n . t i pt h e o c t n gl n n c h ot h yp h nt i pt h e oc d u n gl n gl ut r , v " s c h s " t r o n g g i t r c l ut r g i t r c t h c l yr a s d n gs c h s n yc l y( ) . l y( ) k i mt r a t h yr n gc h s k h n gv t q u g i i h nv s a u t r v a c h c a b i nmo n gmu n , t n h t h e oc h s i s . K t k h i c h s c h ob i t s p h nt b pv oC S t a s h, n p h i c n h nv i s b y t e c h i m n gb i m i p h n s nx u t s b pt r o n gb y t e . K h i b pn y c s d n g c h m c v ol ut r s d n gl pc h m c m n g , b nk h n gn h n c a c h , n h n gt h a yv c c b y t e t i a c h . s nx u t a c h , b np h i s d n g a c h c a n h i uh n h& . t n h( ) c t h n h nm t c h t l l c uv i m t l pt r n hCd yd n . Nc v n h r t n h i ur c r i i q u a l m m t c i g m c l s d d n gh nn h i u l mb n gt a y . N ub nc m t C S t a s hc ut r c c g i l i n t S t a s h, v d , n s c v ng i nh nn h i u t mr a b a on h i uy ut n c b n gc c hn i i n t S t a s h . n e x t h a yv l m m t c u c g i c h c n n g( t r o n g c t t r nk h n g ) , c h n gh nn h t n h( &i n t S t a s h. T u yn h i n , n u b nmu n) t h a y i i d i nn i b c a C S t a s hv d o c c h m c t n ht o n , g i a od i nc u c g i c h c n n gc h op h ps l i n hh o t c nt h i t . Nh n gt h a n i , h uh t c c l pt r n hv i ns k h n gb nt m t mh i uv b n" t t h n " t h i t k c h ot h v i n . H s n h nv oc ut r c v l yt i pt h e og i t r t r c t i p , v t h mc h c t h t h a y i t i pt h e om k h n gc ns c h op h pc a b n . N uc h c m t s c c hc h oc c n h t h i t k t h v i nc q u y nk i ms o t t t h nv n h n g i un h t h n y ! ( V n g , l b ot r c . )

C pp h tb n h n g

B nk h n gb a og i b i t s t i nt i a d u n gl n gl ut r , b nc t h c nc h om t C S t a s h, v v yb n h c t r nb i l ut r c p h nb t n g . He a pl m t k h i l nc a b n h c s d n g p h nb c c p h nn h h nt r o n gt h i g i a nc h y . B ns d n gc c n gk h i b nk h n gb i t k c ht h c c a b n h b ns c nt r o n gk h i b n a n gv i t m t c h n gt r n h . l , c h t r o n gt h i g i a nc h yb ns t mr a r n gb nc nk h n gg i a n c h a 2 0 0 m yb a yb i nt h a yv 2 0 . T r o n gt i uc h u nC , c h c n n gp h nb d y n a mi c me mo r yb a og m ma l l o c ( ) , c a l l o c ( ) , r e a l l o c ( ) , v mi np h ( ) . T h a yv c c c u c g i t h v i n , t u yn h i n , C++ , c m t ( m c d ng i n s d n g ) c c ht i pc nt i n hv i h n b n h n g c t c hh pv on g nn g t h n gq u a c c t k h a mi v x a . S t h i p h n g( ) c h c n n gs d n gmi c c m t p h nl nk h n gg i a nc h oc c C S t a s h. T r o n gt r n gh p n y , c h n gt i s c h m r n gb n h v k h n gt h un h , v k h n g n h( ) s mb or n gm t s mk h n g c t h n gq u a t h i p h n g( ) l g i a t n gg i t r . S m i c a c c y ut c t h c t c h c ( s a uk h i t n gl n( ) h o nt h n h ) c t n hn h n e wQu a n t i t y, v i un y c n h nv i s b y t e c h om i p h nt s nx u t n e wB y t e s , s l s b y t e t r o n gv i c p h nb . V v ym c h n gt a b i t c b a on h i ub y t e s a oc h pl i t v t r c , o l d B y t e s c t n ht o nb n gc c hs d n gc s l n g.

V i c p h nb l ut r t h c t x yr at r o n gm i t h h i n, l c c b i uh i nl i nq u a n nv i c mi t k h a : m i
u n s i g n e dc h a r[ n e w B y t e s ] ;

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

97/320

08/10/2013

Suy ngh trong C + +, Vol 1

H n ht h c c h u n gc a c c t h h i nm i l : L o i mi ; t r o n g l o i mt k i uc ab i nmb nmu nc pp h t t r nh e a p . T r o n gt r n gh pn y , c h n gt i mu nm t m n gc a u n s i g n e dc h a r l n e wB y t e s l u , v v y l n h n gg x u t h i nn h c c l o i . B nc n gc t h p h n b m t c i g ng i nn h m t i n t b n gc c hn i : i n tm i ; v m c d i un yh i mk h i c t h c h i n , b nc t h t h yr n gc c h n ht h c p h h p . M t m i b i ut h c t r v m t c o nt r nm t i t n gc a l o i c h n hx c m b ny uc u . V v y , n ub nn i l o i mi , b ns c c t r l i m t c o nt r nm t l o i . N ub nn i i n t mi , b ns c c t r l i m t c o nt r nm t i n t . N ub nmu nc m t mi u n s i g n e dc h a r m n g , b nq u a yt r l i m t c o nt r np h nt ut i n c a m n g . T r n hb i nd c hs mb or n gb ng ng i t r t r l i c a t h h i nm i c h om t c o nt r c a c c l o i c h n hx c . T t n h i n , b t c l c n ob ny uc ub n h n c t h c h oc c y uc uk h n g , n uk h n gc n h i ub n h h n . Nh b ns t mh i u , C++ , c c c h m i v oc h i n uc c h o t n gb n h p h nb l k h n gt h n hc n g . S a uk h i l ut r m i c c pp h t , c c d l i ut r o n gl ut r c p h i c s a oc h pv ol ut r m i , i un ym t l nn a c t h c h i nv i m n gl pc h m c , s a oc h pm t b y t e t i m t t h i g i a nt r o n gv n gm t . S a uk h i d l i u c s a oc h p , l ut r c p h i c p h t h n h n c t h c s d n gb i c c p h nk h c c ac h n gt r n hn u c nl ut r m i . C c x at k h al s b s u n gc ami , v p h i c pd n g p h t h n hb t k l ut r c g i a omi ( n ub nq u ns d n gx a, l ut r mv nk h n gc s n , v n uc i g i l r r b n h x yr a , b ns c h yr ak h i b n h ) . Ng o i r a , c m t c p h p c b i t k h i b nx am t m n g . l n ub np h i n h c n h c c t r n hb i nd c hm c o nt r n yk h n gc h c h v om t i t n g , n h n g m t m n gc a c c i t n g : b n t m t t ph pc c d un g o c v u n gt r n g p h a t r c c a c o nt r b x a : x a[ ]m y A r r a y ; S a uk h i l ut r c b x a , c c c o nt r l ut r m i c t h c g i a oc h oc c l ut r c o nt r , s l n g c i uc h n h , v t n gl n( ) h o nt h n hc n gv i c c a m n h . L ur n gn g i q u nl h e a pl k h t h s . Nma n gl i c h ob nn h n gp h nb n h v a h t r l i k h i b n x a c h n g . K h n gc c s v nc c h o n g n nc h t , m n nk c ht h c n g c u n gc pmi np h n h n gp h n l nh n . N um t c h n gt r n hc pp h t v g i i p h n gl ut r n gt r o n gm t t h i g i a n , b nc t h k t t h c v i m t p h nm n h n g c r t n h i ub n h mi np h , n h n gk h n gc b t k p h n l n p h nb k c ht h c b n a n gt mk i mt i t h i i mn y . M t n n n gp h c t pm t c h n gt r n hb i v n d i c h u y nk h i b n h x u n gq u a n h , v v yc o nt r c a b ns k h n gg i l i g i t r t h c hh pc a h . M t s m i t r n gh o t n gc n gn n c x yd n gt r o n g , n h n gh y uc ub np h i s d n gb n h c b i t x l ( c t h t mt h i c h u y n t h n hc o nt r , s a uk h i k h a b n h n nn n n gk h n gt h d i c h u y nn ) t h a yv c o nt r . B nc n gc t h x y d n gc h n gt r n h n gn nc a r i n gb n , n h n g yk h n gp h i l m t n h i mv s c t h c h i nn h n h n g . K h i b nt om t b i nt r ns t a c kt i t h i g i a nb i nd c h , l ut r c h ob i n c t n gt or a v c g i i p h n gb i t r n hb i nd c h . T r n hb i nd c hb i t c h n hx c b a on h i ul ut r l c nt h i t , v n b i t c u c i c a c c b i nd oP h mv i . V i c pp h t b n h n g , t u yn h i n , t r n hb i nd c hk h n gb i t b a on h i ul ut r b ns c n , v n k h n gb i t c u c i c a l ut r . l , v i c l ut r k h n g c l ms c ht n g . V v y , b nc t r c h n h i mp h t h n hl ut r s d n gx a , m n i v i n g i q u nl n g l ut r c t h c s d n gb i c c c u c g i b nc n hmi . L c h h pl c h o i un yx yr a t r o n gt h v i nl t r o n gs c h( ) c h c n n gb i v l n i m t t c c c v s i n h n gc a l n c t h c h i n . k i mt r a t h v i n , h a i C S t a s he s c t or a . L n g i ut i nn mg i i n t s v t h h a i n mg i m n gc a 8 0 c h a r s :


// :C 0 4 :C L i b T e s t . c p p //{ L }C L i b //K i mt r ac ct h v i nC n h #B a og m" C L i b . h " #B a og m< f s t r e a m > #I n c l u d e #I n c l u d e#i n c l u d e< c a s s e r t >s d n gt nm i nk h n gg i a nt i u c h u n ; i n tm a i n( ){ //X c n hb i n u //c ak h i ,n h t r o n gC : C S t a s hi n t S t a s h , s t r i n g S t a s h ; i n ti ; c h a r*c p ; i f s t r e a mt r o n g ; d n gc h u i ; c o n s t i n tB U F S I Z E=8 0 ; //B yg i h yn h k h it oc cb i n : k h it o( &i n t S t a s h ,s i z e o f( i n t ) ) ; f o r( i=0 ;i < 1 0 0 ;i++ ) t h m( &i n t S t a s h ,&i ) ; f o r( i=0 ;i< c o u n t( &i n t S t a s h );i++ ) c o u t< < " l y( &i n t S t a s h , "< <i< <" )= " < <*( I n t* )l y( &i n t S t a s h ,i )
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 98/320

08/10/2013

Suy ngh trong C + +, Vol 1

< <E n d l ; //G i c h u i8 0k t : k h it o( &s t r i n g S t a s h ,s i z e o f( c h a r )*B U F S I Z E ) ; i n . o p e n( " C L i b T e s t . c p p " ) ; k h n g n h( t r o n g ) , t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) t h m( &s t r i n g S t a s h ,l i n e . c _ s t r( ) ) ; i=0 ; t r o n gk h i( !( c p=( c h a r* )l y( &s t r i n g S t a s h ,i++ ) )=0 ) c o u t< <" l y ( &s t r i n g S t a s h , "< <i< <" )= " < <C p< <e n d l ; d nd p( &i n t S t a s h ) ; d nd p( & s t r i n g S t a s h ) ; }/// :~

T h e om uy uc uc a C , t t c c c b i n c t or a v o up h mv i c a c h n h( ) . T t n h i n , b np h i n h k h i t oC S t a s hb i ns a ut r o n gk h i b n gc c hg i k h i t o( . M t t r o n gn h n gv n v i c c t h v i nCl b n ) m t c c hc nt h np h i t r u y n t c h on g i d n gt mq u a nt r n gc a v i c k h i t ov c h c n n gd ns c h . N u c c c h c n n gn yk h n g c g i l , s c r t n h i ur c r i . T h t k h n gma y , n g i s d n gk h n gl u nl u nt h i , n uk h i t ov d nd pl b t b u c . H b i t n h n gg h mu n t c , v c h n gk h n gp h i l q u a nt m nb nn h yl nn h yx u n gv n i : " N y , c h i , b np h i l m i un y ut i n ! " M t s n g i d n gt h m c h c n c b i t n k h i t oc c y ut c a m t c ut r c t . C c h c c h nk h n gc c c h t r o n gC n g n c h nn ( h nb ot r c ) . C c i n t S t a s h c l p yv i s n g u y n , v s t r i n g S t a s h c l m yv i m n gk t . Nh n gm n gk t c s nx u t b n gc c hm c c t pt i nm n g u n , C L i b T e s t . c p p, v c c c d n gt n t h n hm t c h u i g i l n g, v s a u t or a m t c o nt r t i c c n h nv t i d i nc a d n gb n gc c hs d n gc h c n n gt h n hv i n c _ s t r ( ) . S a um i S t a s h ct i , n ch i nt h . C c i n t S t a s h ci nb n gc c hs d n gc h ov n gl p , t r o n g s d n gt n h( ) t h i t l pg i i h nc an . C c s t r i n g S t a s h c i nv i m t t r o n gk h i , mp h v k h i l y( ) t r v s k h n g c h ob i t n v t q u g i i h n . B nc n gs n h nt h ym t d i nv i nb s u n gt r o n gc p=( c h a r* )l y( &


s t r i n g S t a s h ,i++ )

i un yl d os k i mt r a c h t c h h nt r o n gl o i C++ , m k h n gc h op h pb nc h c nc h n hm t v o i d* b t k l o i k h c ( Cc h op h p i un y ) .

o nx u

C m t v n q u a nt r n gh nb nn nh i ut r c k h i c h n gt a n h nv on h n gv n c h u n gt r o n gv i c t or a m t t h v i nC . L uC L i b . ht pt i nt i u p h i c b a og mt r o n gb t k t pt i n c p nC S t a s hv t r n hb i nd c ht h mc h k h n gt h o n c n h n gg c ut r c n h t h n o . T u yn h i n , n c t h o nn h n g g m t c h c n n gt r n gn h i un yn g h e c v n h m t t n hn n gn h n gn h a r a l m t Cl nc mb y . M c d b nn nl u nl u nt u y nb c c c h c n n gb n gc c hb a og m m t t pt i nt i u , t k h a i c h c n n g k h n gc nt h i t t r o n gC . C t h t r o n gC( n h n gk h n g t r o n gC++ ) g i m t c h c n n gm b n k h n gk h a i b o . M t t r n hb i nd c ht t s c n hb ob nr n gb nc t h p h i t u y nb m t c h c n n g ut i n , n h n gn k h n g c t h c t h i b i c c t i uc h u nn g nn g C . yl m t t h c t n g u yh i m, b i v t r n hb i nd c hCc t h g i n hr n gm t c h c n n gm b ng i v i m t i n t l pl u nc m t d a n hs c h i s c c h a i n t , n g a yc k h i n t h c s c t h c h a n i . i un yc t h s nx u t l i m r t k h t m, n h b ns t h y . M i t pt i nt h c t h i b n gCr i n gb i t ( c p h nm r n g. c ) l m t nv d c h t h u t . l , c c t r n hb i nd c h c i uh n hr i n gb i t t r nm i nv d c ht h u t , v k h i n a n gc h y l n h nt h c c a c h nv . V v y , b t k t h n gt i nm b nc u n gc pb n gc c hb a og mc c t pt i nt i u l k h q u a nt r n gv n q u y t n hc a t r n hb i nd c h s h i ub i t v p h nc nl i c a c h n gt r n hc a b n . K h a i b ot r o n gt pt i nt i u c b i t q u a nt r n g , b i v k h pm i n i t i u c b a og m, t r n hb i nd c hs b i t c h n hx c p h i l mg . N u , v d , b nc m t t u y n b t r o n gm t t pt i nt i u m n i v o i df u n c ( f l o a t ) , t r n hb i nd c hb i t r n gn ub ng i l c h c n n gv i m t i s s n g u y n , c nc h u y n i i n t m t n i n h n v t q u a c c i s ( i un y c g i l q u n g c o ) . M k h n gk h a i b o , t r n hb i nd c hCs c h ng i nc h or n gm t h mf u n c ( i n t ) t nt i , n s k h n gl m c h n gt r n hk h u y nm i , v c c d l i us a i l n gl s c t h n gq u a v oc h c n n g( ) . i v i m i nv d c ht h u t , t r n hb i nd c ht or a m t t pt i n i t n g , v i m t p h nm r n gc a . oh a y. o b j h o c m t c i g t n gt . Nh n gt pt i n i t n g , c n gv i c c m k h i n gc nt h i t , p h i c t h ut h p b i c c m i l i nk t v oc c c h n gt r n ht h c t h i . T r o n gq u t r n hl i nk t , t t c c c t i l i ut h a mk h ob n n g o i p h i c g i i q u y t . V d , t r o n gC L i b T e s t . c p p, c c c h c n n gn h k h i t o(v )l y( ) c k h a i b o ( c n g h a l , c c t r n hb i nd c h c n i n h n gg h t r n gn h t h ) v c s d n g , n h n gk h n g c x c n h . C h n g c n hn g h a n i k h c , t r o n gC L i b . c p p. D o , c c c u c g i t r o n gC L i b . c p pl t i l i ut h a m k h ob nn g o i . M i l i nk t p h i , k h i a t t c c c t pt i n i t n gv i n h a u , l yt i l i ut h a mk h ob nn g o i c h a c g i i q u y t v t mt h yn h n g a c h h t h c s t h a mk h o . Nh n g a c h c a v oc c c h n g t r n ht h c t h i t h a yt h c c t i l i ut h a mk h ob nn g o i . i uq u a nt r n gl n h nr a r n gt r o n gC , c c t i l i ut h a mk h ob nn g o i m c c t mk i m m i l i nk t c h oc h ng i nl h o t n gt n , n i c h u n gb n gm t g c ht r c m t h . V v y , t t c c c m i l i nk t l ml p h

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

99/320

08/10/2013

Suy ngh trong C + +, Vol 1

h pv i c c t nc h c n n gm n c g i l v c c c q u a nc h c n n gt r o n gc c i t n gt pt i n , v n c t h c h i n . N ub nv t n ht h c h i nm t c u c g i m c c t r n hb i nd c hh i ul f u n c ( i n t ) v c m t c q u a n c h c n n gc h oc h c n n g( f l o a t ) t r o n gm t s t pt i n i t n gk h c , m i l i nk t s t h y_ f u n c m t n i v _ f u n c t r o n gk h c , v n s n g h r n gm i t h uOK. C c c h c n n g( ) t i a i mg i i nt h o i s ym t i n t v on g nx p , v c c c h c n n g( ) c h c n n gc t h s mo n g i m t n i l t r ns t a c k . N uc h c n n gc h c c c g i t r v k h n gv i t t h c h on , n s k h n gt h i l ns t a c k . T r o n gt h c t , n i g i t r n c r a k h i s t a c k t h mc h c t h l mc h om t s l o i c mg i c . l t i t h nv n k h h n t ml i .

C c h u y ng v y ?

C h n gt i l n gk k h n n gt h c h n g , n g a yc t r o n gt n hh u n gm c l c h n gt a k h n g n nt h c hn g h i . P h o n gc c hc a C S t a s ht h v i n c m t y uc h oc c l pt r n hC , n h n gn ub nn h nv on t r o n gm t t h i g i a n , b nc t h n h nt h yr n gn k h . . . k h x . K h i b ns d n gn , b np h i v t q u a a c h c a c ut r c c h o m i c h c n n gd u yn h t t r o n gt h v i n . K h i c m , c c h c a t h v i n c p h a t r nv i n g h a c a c c c u c g i c h c n n g , m l k h h i uk h i b n a n gc g n g h i un h n gg a n gx yr a . M t t r o n gn h n gt r n g i l nn h t , t u yn h i n , s d n gt h v i nt r o n gCl v n c a c c c u c n g t n. C c m t k h n gg i a nt nd u yn h t c h oc h c n n g , l k h i c c m i l i nk t s c h om t t nc h c n n g , c v t r o n g m t d a n hs c ht n gt h d u yn h t . Ng o i r a , k h i t r n hb i nd c h a n gl mv i c t r nm t nv d c ht h u t , n c t h l mv i c c h v i m t c h c n n gd u yn h t v i m t t nc h o . B yg i g i s b nq u y t n hmu a h a i t h v i nt h a i n h c u n gc pk h c n h a u , v m i t h v i nc m t c ut r c p h i c k h i t ov l ms c h . C h a i n h c u n gc pq u y t n hk h i t o(v ) d nd p( ) l n h n gc i t nt t . N ub nb a og mc c c t pt i nt i u c a h t r o n gm t nv d c hd u yn h t , n h n gg c c t r n hb i nd c hCl m g ? Ma ym nt h a y , Cc u n gc pc h ob nm t l i , n i c h ob nc m t k h n gp h h pl o i t r o n gh a i d a n hs c h i s k h c n h a uc a c h c n n gt u y nb . Nh n gn g a yc k h i b nk h n gb a og mc h n gt r o n gc c nv d c ht h u t , c c m i l i nk t v ns c v n . M t m i l i nk t t t s p h t h i nr n gc m t c u c n g t n , n h n gm t s c c t r n hl i nk t c t nc h c n n g ut i nh t mt h y , b n gc c ht mk i mt h n gq u a d a n hs c hc c f i l e i t n gt h e ot h t b nc u n gc pc h oh t r o n gd a n hs c hl i nk t . ( i un yt h mc h c t h c d n gn h m t t n hn n gb i v n c h op h pb nt h a yt h m t c h c n n gt h v i nv i c c p h i nb nc a r i n gb n . ) T r o n gc h a i t r n gh p , b nk h n gt h s d n gh a i t h v i nCc c h a m t c h c n n gv i t ng i n gh t n h a u . g i i q u y t v n n y , c c n h c u n gc pt h v i nCs t h n gt h mv ot r c m t d yk t d u yn h t c h oc c uc a t t c c c t nc h c n n gc a h . V v y , k h i t o(v ) d nd p( ) c t h t r t h n h C S t a s h _ i n i t i a l i z e ( v ) C S t a s h _ c l e a n u p( . yl m t ) i uh pl l mb i v n " t r a n gt r " t nc a c u t r c c h c n n gh o t n gt r nv i t nc a c c c h c n n g . B yg i l l c c n h n gb c ut i nh n gt i v i c t or a c c l pt r o n gC++ . T nb i nb nt r o n gm t c u t r c k h n gx u n g t v i c c t nb i nt o nc u . V yt i s a ok h n gt nd n gl i t h n yc h oc c t nc h c n n g , k h i c c c h c n n gh o t n gt r nm t c b i t c ut r c ? l , t i s a ok h n gl mc h c n n gt h n hv i nc a c ut r c k h n g ?

C c i t n gc b n
B c m t l c h n hx c i u . C++c h c n n gc t h c t b nt r o n gc ut r c n h l " h mt h n hv i n . " y l n h n gg n t r n gg i n gn h s a uk h i c h u y n i c c p h i nb nCc a C S t a s hv i C++S t a s h:
// :C 0 4 :C p p L i b . h //C n h t h v i nc h u y n is a n gC++ c ut r cS t a s h{ i n ts i z e ; //K c ht h cc am ik h n gg i a n i n ts l n g ; //S c h l ut r i n tt i pt h e o ; //k h n gg i a nt r n gT i p m n g//T n gp h nb c cb y t e : u n s i g n e dc h a r*l ut r ; !//C h cn n g k h it o k h o n gt r n g( i n tk c ht h c ) ; t r n gd nd p( ) ; i n ta d d( c o n s tv o i d*p h nt ) ; v o i d*l y( i n ti n d e x ) ; i n tc o u n t( ) ; t r n gt h ip h n g( i n tt n g ) ; }/// :~

ut i n , t h n gb ok h n gc t y p e d e f . T h a yv y uc ub nt or a m t t y p e d e f , C++ , t r n hb i nd c hb i nt n c a c ut r c t h n hm t t nk i um i c h oc h n gt r n h( g i n gn h i n t , c h a r , f l o a t v h a i l t nl o i ) . T t c c c t h n hv i nd l i ul c h n hx c g i n gn h t r c y , n h n gb yg i c c c h c n n gt r o n gc t h c a c u t r c . Ng o i r a , n h nt h yr n gc c i s ut i nt p h i nb nCc a t h v i n c g b . T r o n gC++ , t h a y v b u c b np h i v t q u a a c h c a c ut r c n h l i s ut i nc h ot t c c c c h c n n gh o t n gt r nc u t r c , t r n hb i nd c hb m t t h c h i n i un yc h ob n . B yg i c c i s c h c h oc c c h c n n gc l i nq u a n v i n h n gg c c c h c n n g k h n g , k h n gp h i l c c h h o t n gc a c h c n n g . i uq u a nt r n gl n h nr a r n gc c m c h c n n gl c h i uq u g i n gn h n c v i p h i nb nCc a t h v i n . S l n gc c i s l n h n h a u( n g a yc k h i b nk h n gn h nt h y a c h c c u c t h n gq u a t i , n v n c n ) , v c h c m t c h c n n gc t h i v i t n gc h c n n g . l , c h v b nn i


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 100/320

08/10/2013

Suy ngh trong C + +, Vol 1

S t a s hA ,B ,C ;

k h n gc n g h a l b nc c m t k h c n h a ua d d( ) c h c n n gc h om i b i n . V v y , c c m c t or a l g nn h g i n gh t v i n h n gg b ns c v nb nc h op h i nb nCc a t h v i n . K h t h v l i un yb a og m " t nt r a n gt r " c t h b n c t h l m s nx u t S t a s h _ i n i t i a l i z e ( , ) S t a s h _ c l e a n u p( , v v . ) K h i t nc h c n n gl b nt r o n gc c c ut r c , t r n hb i nd c hc h i uq u l m i ut n g t . D o , k h i t o(b nt r o n g) c ut r c S t a s hs k h n gv a c h mv i m t c h c n n gc t nk h i t o() t r o n g b t k c ut r c k h c , h o c t h mc h l m t c h c n n gt o nc uc t nk h i t o( . H uh t t h i g i a nb nk h n g p h i l ol n gv c c ) t nc h c n n gt r a n gt r b ns d n gt nu n d e c o r a t e d . Nh n g i k h i b nc n c t h x c n hr n g i un yk h i t o() t h u c v c ut r c S t a s h, v k h n g b t k c ut r c . c b i t , k h i b nx c n h c c c h c n n gb nc np h i x c n h y m m t t r o n g l . t h c h i n y c i mk t h u t n y , C+ + m t n h i uh n h( : : ) c g i l c c n h i uh n h c p h ng i i p h mv i ( c t t nn h v yb i v t n c t h c t r o n gp h mv i k h c n h a u : p h mv i t o nc uh o c t r o n gp h mv i c a m t c ut r c ) . V d , n ub n mu nc h n hk h i t o( , t h u c ) S t a s h, b nn i S t a s h: : k h i t o( i n t s i z e ) . B nc t h t h yc c n h i u h n hc p h ng i i p h mv i c s d n gt r o n gc c n hn g h a c h c n n g :


// :C 0 4 :C p p L i b . c p p{ O }//t h v i nCs a n gC++ //K h a ib oc ut r cv c h cn n g : #B a og m" C p p L i b . h " #I n c l u d e#i n c l u d e< c a s s e r t >s d n gt nm i nk h n gg i a nt i u c h u n ; //S l n gc cy ut t h m//k h it n gl ut r :c o n s ti n tt n g=1 0 0 ; k h o n gt r n gS t a s h: :k h it o( i n tS Z ){ s i z e=s z ; s l n g=0 ; l ut r =0 ; t i pt h e o=0 ; } i n tS t a s h: :a d d( c o n s tv o i d*y ut ){ i f( s a u >=s l n g )// k h n gg i a n l i ? t n gl n( t n g ) ; //S a oc h pp h nt v ol ut r , //b t ut k h n gg i a n t r n gb nc n h : i n ts t a r t B y t e s=t i pt h e o*K c ht h c ; u n s i g n e dc h a r*e= ( u n s i g n e dc h a r* )y ut ; f o r( i n ti=0 ;i< k c ht h c ;i++ ) l ut r [ s t a r t B y t e s+i ]=e[ i ] ; t i pt h e o++ ; t r l i( t i pt h e o-1 ) ;//C h s } v o i d*s t a s h: :l y( i n ti n d e x ){ //K i mt r ar a n hg i ic h s : k h n g n h( 0< =c h s ) ; i f( i n d e x >=t i pt h e o ) t r v 0 ;// c h o t h yc u ic n g //S nx u tc o nt r np h nt m o n gm u n : t r l iv ( l u t r [ c h s k c ht h c* ] ) ; } i n tS t a s h: :c o u n t( ){ t r l it i pt h e o ;//S p h nt t r o n gC S t a s h } t r n gs t a s h: :t h ip h n g( i n tt n g ){ k h n g n h( t n g >0 ) ; i n tn e w Q u a n t i t y=s l n g+t n g ; i n tn e w B y t e s=n e w Q u a n t i t y*K c ht h c ; i n to l d B y t e s=s l n g*K c h t h c ; u n s i g n e dc h a r*b=n e wu n s i g n e dc h a r[ n e w B y t e s ]; f o r( i n ti=0 ;i< o l d B y t e s ; i++ ) b[ i ]=l ut r [ i ] ;//S a oc h pc nm i x a[ ]l ut r ;//l ut r C l ut r =b ;// i mt ib n h m i s l n g=n e w Q u a n t i t y ; } t r n gS t a s h: :c l e a n u p( ){ i f( l ut r =0 ){ c o u t< <" g i ip h n g l ut r "< <e n d l ; x a[ ]l ut r ; } }/// :~

C m t v i i uk h c l k h c n h a ug i a Cv C++ . ut i n , k h a i b ot r o n gt pt i nt i u c y uc ub i t r n hb i nd c h . T r o n gC++ , b nk h n gt h g i m t c h c n n gm k h n gc nk h a i b o ut i n . T r n hb i nd c h s p h t h n hm t t h n gb ol i k h c . yl m t c c hq u a nt r n g mb or n gc c c u c g i c h c n n gp h h pg i a c c i m m c h n g c g i l v i m m c h n g c n hn g h a . B n gc c hb u c b np h i k h a i b o c c c h c n n gt r c k h i b ng i n , C++ , t r n hb i nd c hh un h mb or n gb ns t h c h i nt u y nb n y b n gc c hb a og mc c t pt i nt i u . N ub nc n gb a og mc c t pt i nt i u t n gt t r o n gn i c c c h c n n g c x c n h , s a u t r n hb i nd c hs k i mt r a mb or n gc c t u y nb t r o n gt i u v n hn g h a c h c n n gp h h p . i un yc n g h a l c c t pt i nt i u t r t h n hm t k h ol ut r c h oc c t k h a i x c n h n c h c n n gv mb or n gc c c h c n n g c s d n gn h t q u nt r o n gt t c c c nv d c ht r o n gd n . T t n h i n , c h c n n gt o nc uv nc t h c k h a i b ob n gt a ym i n i m c h n g c n hn g h a v s d n g . ( i un yl r t t n h t m n t r n nr t k h x yr a . ) T u yn h i n , c ut r c p h i l u nl u n c k h a i b ot r c k h i c h n g c x c n hh o c c s d n g , v n h n gn i t h u nt i nn h t a r a m t n hn g h a c ut r c l t r o n g m t t pt i nt i u , n g o i t r n h n gn g i b nc c h e g i ut r o n gm t t pt i n . B nc t h t h yr n gt t c c c t h n hv i nc h c n n gn h ng nn h g i n gn h k h i h c nc h c n n gC , n g o i t r p h ng i i p h mv i v t h c t l c c i s ut i nt p h i nb nCc a t h v i nk h n gc nr r n g . Nv n c n , t t n h i n , b i v c h c n n gc c t h l mv i c t r nm t c b i t c ut r c b i n . Nh n gt h n gb o , b n t r o n gh mt h n hv i n , r n gv i c l a c h nt h n hv i nc n g b i nm t ! D o , t h a yv n i s >k c ht h c =S Z b nn i , k c ht h c =S Zv l o i b ; t n h t s >, m k h n gt h c s t h mb t c i ug nn g h a c a n h n gg b n l ma n y wa y . C++t r n hb i nd c hd n gn h a n gl m i un yc h ob n . T h t v y , n a n g " b m t " s ut i n( a c h c a c ut r c m t r c yc h n gt i i q u a t r o n gb n gt a y ) v pd n gb c h n t h n hv i nb t c k h i n ob nt h a mk h om t t r o n gc c t h n hv i nd l i uc a m t c ut r c . i un yc n g h a r n gb t c k h i n ob n a n g t r o n gc c c h c n n gt h n hv i nc a m t c ut r c , b nc t h t h a mk h ob t k


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 101/320

08/10/2013

Suy ngh trong C + +, Vol 1

t h n hv i n( t r o n g c m t c h c n n gt h n hv i n ) b n gc c h a r a t nc a n . T r n hb i nd c hs t mk i m t h n gq u a t nc c c ut r c a p h n gt r c k h i t mk i m m t p h i nb nt o nc uc a t n . B ns t h yr n g t n hn n gn yc n g h a l k h n gc h l m c a b nd d n gh n v i t , n d d n gh nr t n h i u c . Nh n gn uv m t l d o , b nm u n c t h c c b nt a yc a b nt r n a c h c a c ut r c ? T r o n gp h i nb n Cc a t h v i n l d d n gb i v s ut i nc a m i c h c n n gl m t * C S t a s hg i l s . T r o n gC++ , m i t h t h mc h c np h h ph n . C m t t c b i t , c g i l n y, t r o n g s nx u t a c h c a c ut r c . Nt n g n gv i ' s ' t r o n gp h i nb nCc a t h v i n . V v yc h n gt i c t h t r l i v i p h o n gc c hCc a i ub n gc c h n i n y >K c ht h c=k c ht h c ; C c m c t or a b i t r n hb i nd c hl g i n gh t n h a u , d o b nk h n gc np h i s d n gn yt r o n gt h i t r a n g n h v y , i k h i , b ns t h ym , n i m i n g i s d n gm t c c hr r n gn y > k h pm i n i n h n gn k h n g t h mb t c i ug nn g h a c a m n yv t h n gc h r a m t l pt r n hv i nt h i uk i n hn g h i m. T h n g t h n g , b nk h n gs d n gn yt h n gx u y n , n h n gk h i b nc nn , n ( m t s v d t r o n gc u ns c hn y s s d n gn y) . C m t m c c u i c n g c p n . T r o n gC , b nc t h g nm t v o i d* b t k c o nt r k h c n h t h n y :


i n ti=1 0 ;v o i d*v p=& i ;//O Kt r o n gc Cv C++i n t*i p=v p ;//C h c t h c h pn h n ct r o n gC

v k h n gc k h i un i c a t r n hb i nd c h . Nh n gt r o n gC++ , t u y nb n yl k h n g c p h p . T i s a o ? B i v Ck h n gp h i l q u c t h v l o i t h n gt i n , v v yn c h op h pb nc h n hm t c o nt r v i m t l o i k h n gx c n hc h om t c o nt r v i m t l o i q u y n h . K h n gn h v yv i C++ . L o i l r t q u a nt r n gt r o n gC++ , t r n h b i nd c hv d uc h nc a n k h i c b t k h n hv i v i p h mc a c c l o i t h n gt i n . i un yl u nl u nl q u a n t r n g , n h n gn c b i t q u a nt r n gt r o n gC++ , v b nc c h c n n gt h n hv i nt r o n gc ut r c s . N ub nc t h v t q u a c o nt r ns t r u c t s x u n gq u a n hk h n gb t r n gp h t t r o n gC++ , s a u b nc t h s g i m t h m t h n hv i nc h om t c ut r c m t h mc h k h n gh pl c h oc n gm t c ut r c ! M t c n gt h c t h c s c h ot h m h a . V v y , t r o n gk h i C++c h op h ps p h nc n gc a b t k l o i c o nt r t i m t v o i d* ( yl n hb a n u c a v o i d* , l c nt h i t c l n c h a m t c o nt r nb t k l o i ) , n s k h n g c h op h pb nc h n h m t l m mt h i ul c c o nt r nb t k l o i n ok h c c a c o nt r . M t d i nv i nl l u nl u nc nt h i t n i c h on g i c v b i nd c hm b nt h c s mu n i x v i n n h k i u c h . i un ys t r v m t v n t h v . M t t r o n gn h n gm c t i uq u a nt r n g i v i C++l b i nd c hn h m C n h i uh i nt i c t h c h op h pm t s c h u y nt i pd d n gv i n g nn g m i . T u yn h i n , i un yk h n gc n g h a l b t k m Cc h op h ps t n g c c h op h pt r o n gC++ . C m t s i uc a c c t r n hb i nd c hC c h op h pb nn h n c n g a yv i l n g u yh i mv d b l i . ( C h n gt i s n h nv oh n h n h n gt i nb c u ns c h . ) C++t r n hb i nd c ht or a c c c n hb ov l i c h on h n gt n hh u n gn y . i un yt h n gl n h i u h nm t l i t h h nm t t r n g i . T r o n gt h c t , c r t n h i ut n hh u n gm b n a n gc g n gc h yx u n gm t l i t r o n gCv c h c nk h n gt h t mt h yn , n h n gn g a ys a uk h i b nb i nd c hc h n gt r n hC++ , c c i mb i n d c hr a v n ! T r o n gC , b nt h n gs t h yr n gb nc t h n h n c c c c h n gt r n hb i nd c h , n h n gs a u b nc c c n l mv i c . T r o n gC++ , k h i c h n gt r n hb i nd c hm t c c hc h n hx c , n t h n gl m v i c , q u ! i un yl b i v n g nn g l r t n h i uk h t k h e h nv l o i h n h . B nc t h t h ym t s n h n g i um i t r o n gc c hl mv i c c a C++p h i nb nc a S t a s h c s d n gt r o n g c h n gt r n ht h n g h i ms a u y :
// :C 0 4 :C p p L i b T e s t . c p p//{ L }C p p L i b //K i mt r ac aC++t h v i n #B a og m" C p p L i b . h " #B a og m" . ./R e q u i r e . h " #B a og m< f s t r e a m > #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ S t a s hi n t S t a s h ; i n t S t a s h . i n i t i a l i z e( s i z e o f( i n t ) ) ; f o r( i n ti=0 ;i< 1 0 0 ;i++ ) i n t S t a s h . a d d( &i ) ; f o r( i n tj=0 ;j< i n t S t a s h . c o u n t( ) ;j++ ) c o u t< <" i n t S t a s h . f e t c h( "< <k< <" ) = " < <*( I n t* )i n t S t a s h . f e t c h( j ) < <E n d l ; //G i c h u i8 0k t : S t a s hs t r i n g S t a s h ; c o n s ti n tB U F S I Z E=8 0 ; s t r i n g S t a s h . i n i t i a l i z e( s i z e o f( c h a r )*B U F S I Z E ) ; i f s t r e a m t r o n g( " C p p L i b T e s t . c p p " ) ; mb o( t r o n g" C p p L i b T e s t . c p p " ) ; n gd y , t r o n gk h i ( g e t l i n e( t r o n g ,d n g )) s t r i n g S t a s h . a d d( l i n e . c _ s t r( ) ) ; i n tk=0 ; c h a r*c p ; !t r o n gk h i( ( c p=( c h a r* )s t r i n g S t a s h . f e t c h( k++ ) )=0 ) c o u t< < " s t r i n g S t a s h . f e t c h( "< <k< <" )= " < <C p< <e n d l ; i n t S t a s h . c l e a n u p( ) ; s t r i n g S t a s h . c l e a n u p ( ) ; }/// :~

M t i ub ns n h nt h yl c c b i n c t t c c c n hn g h a " t r nb a y " ( n h g i i t h i u c h n gt r c ) . C
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 102/320

08/10/2013

Suy ngh trong C + +, Vol 1

n g h a l , c h n g c x c n ht i b t k i mn ot r o n gp h mv i , c h k h n gp h i b h nc h n h t r o n gC n up h mv i . M n yl k h t n gt n h C L i b T e s t . c p p, n h n gk h i m t h mt h n hv i n c g i , c u c g i x yr a b n gc c h s d n gt h n hv i n i uh n hl a c h n ' . ' c t s a ut nc a b i n . yl m t c p h pt h u nt i nv n b t c h c v i c l a c h nc c t h n hv i nd l i uc a c ut r c . S k h c b i t l yl m t h mt h n hv i n , v v yn c m t d a n hs c h i s . T t n h i n , c c c u c g i m c c t r n hb i nd c ht h c s t or a t r n gr t g i n gn h c h c n n gt h v i nb a n uC . V v y , x e mx t t nt r a n gt r v v i c t h n gq u a n y, C++c h c n n gg i i n t S t a s h . i n i t i a l i z e ( s i z e o f ( i n t ) , 1 0 t r t h n hm t c i g n h 0 ) S t a s h _ i n i t i a l i z e ( &i n t S t a s h , s i z e o f ( i n t ) , 1 0 . N ub n b a og i t h i 0 ) n h n gg a n gx yr a b nd i l pc h n , h yn h r n gb ng c C++c f r o n t t A T&Ts nx u t m Cn h s nl n gc a n , s a u c b i ns o nb i c c t r n hb i nd c hCb nd i . C c ht i pc nn yc n g h a l c f r o n t c t h c n h a n hc h n gc h u y n nb t k m yt n hm c m t t r n hb i nd c hC , v n g i p n h a n hc h n gp h b i nC++ , c n gn g h t r n hb i nd c h . Nh n gv C++t r n hb i nd c hp h i t or a C , b nb i t r n gp h i c m t s c c h i d i nc h oC++c p h pt r o n gC( m t s t r n hb i nd c hv nc h op h pb nt or a m C ) . C m t s t h a y i k h c t C l i b T e s t . c p p, l s r a i c a r e q u i r e . ht pt i nt i u . yl m t t pt i nt i u m t i t or a c u ns c hn y t h c h i nv i c k i mt r a p h c t ph nm ud ol i k h n g n h( ) . Nc h a m t s c h c n n g , b a og mc s d n g y c g i l m b o( ) c s d n gc h oc c t pt i n . , c h c n n gn ys k i mt r a x e mc c t pt i n t h n hc n g c m r a , v n uk h n gn b oc ol i t i uc h u nm c c t pt i n k h n gt h m c ( d o n c nt nc a t pt i nn h l i s t h h a i ) v t h o t r a k h i c h n gt r n h . C c r e q u i r e . hc h c n n gs c s d n gt r o n gs u t c u ns c h , c b i t l mb or n gc s i s d n gl n h v t pt i n c m n gc c h . C c r e q u i r e . hc h c n n gt h a yt h l p i l pl i v m t t pt r u n gm k i mt r a l i , v h c u n gc pt h n gb ol i c b nh u c h . C c c h c n n gn ys c g i i t h c h y t r o n gc u ns c hn y .

M t i t n gl n h n gg ?

B yg i b n n h nt h ym t v d b a n u , l t h i g i a n b c t r l i v h yx e m m t s t h u t n g . H n h v i ma n gl i c h c n n gb nt r o n gc ut r c l g c r c a n h n gg C++t h mv oC , v n g i i t h i um t c c hs u y n g h m i v c ut r c : l k h i n i m. T r o n gC , m t c ut r c l m t t c ht c a d l i u , m t c c h g i d l i u b nc t h x l n t r o n gm t c m. Nh n gt h t k h n g h v n n h b t c i ug n h n gl m t t i nn g h i l p t r n h . C c c h c n n gh o t n gt r nn h n gc ut r c n y n h n gn i k h c . T u yn h i n , v i c c c h c n n gt r o n g g i p h nm m, c ut r c t r t h n hm t t ov t m i , c k h n n gmt c h a i c i m( n h Cc ut r c k h n g ) v h n hv i . C c k h i n i mv m t i t n g , m t V i t n g , t h c t h b c h nc t h n h v h n h n g , c h ot h y c h n hn . T r o n gC++ , m t i t n gc h l m t b i n , v n hn g h a t i n hk h i t n h t l " m t k h uv c l ut r " ( yl m t c c hc t h h nv n i , " m t i t n gp h i c m t n hd a n hd u yn h t " , m t r o n gt r n gh pc a C++l m t c o a c h b n h ) . l m t n i m b nc t h l ut r d l i u , v n n g r n gc n gc n h n gh o t n g c t h c t h c h i nt r nd l i un y . T h t k h n gma y , k h n gt h n gn h t h o nc h n hq u a n g nn g k h i n i nc c i uk h o nn y , m c d h a n g k h we l l a c c e p t e d . B nc n gs i k h i g pp h i b t n gv n h n gg m t n g nn g h n g i t n gl , m c d c v n h c s px ph pl c n gr a n g a yb yg i . C n h n gn g nn g m d a t r n i t n g , c n g h a l h c c c i t n gn h C++ , c ut r c , v i c h c n n gm b n n h nt h yc h o nn a y . i un y , t u yn h i n , c h l m t p h nc a h n h n hk h i n i nm t n g nn g h n g i t n g , v c c n g nn g m d n gl i c h c n n g n gg i b nt r o n gc ut r c d l i ul d a t r n i t n g , k h n gh n g i t n g .

T r ut n gd l i u n h m y

K h n n g n gg i d l i uv i c h c n n gc h op h pb nt or a m t k i ud l i um i . i un yt h n g c g i [ 3 0 ] l n g g i . M t k i ud l i uh i nt i c t h c n h i um ud l i u n gg i c n gn h a u . V d , m t n i c m t s m , m t p h n n ht r , v m t c h t d uh i u . B nc t h n i c h on l mn h n gv i c : t h mv om t p h a oh o c m t i n t , v n h v y . Nc c i mv h n hv i . n hn g h a c a S t a s ht or a m t k i ud l i um i . B nc t h t h m( ) , l y( ) , v t n gl n( ) . B nt or a m t b n g c c hn i S t a s hs , c n gg i n gn h b nt or a m t n i b n gc c hn i f l o a t f . M t S t a s hc n gc n h n g c i m v h n hv i . M c d n h o t n gn h m t t h c t , c x yd n gt r o n gk i ud l i u , c h n gt i c p nn n h m t k i ud l i ut r ut n g , c l b i v n c h op h pc h n gt a m t k h i n i mt r ut n gt c c v n k h n g g i a nv ok h n gg i a ng i i p h p . Ng o i r a , C++ , t r n hb i nd c hx l n n h m t k i ud l i um i , v n ub n n i m t c h c n n gh yv n gm t S t a s h, t r n hb i nd c h mb ob nv t q u a m t S t a s hc h oc h c n n g . V v y , c n gm t m c k i mt r a k i ux yr a v i c c l o i d l i ut r ut n g( i k h i c g i l n g i d n g n h n g h a c c l o i ) n h c x yd n gv i c c l o i .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

103/320

08/10/2013

Suy ngh trong C + +, Vol 1

B nc t h t h yn g a ys k h c b i t , t u yn h i n , t r o n gc c hb nt h c h i nc c h o t n gt r nc c i t n g . B nn i o b j e c t . me mb e r F u n c t i o n( a r g l i s . n y c " k ug i t h n hv i nt ) c h c n n gc h om t i t n g . " Nh n gt h e o c c hn i c a i t n g , i un yc n g c g i l " g i m t t h n g i pt i m t i t n g . " V v y , m t S t a s hs , b oc ok t q u s . a d d( v t i ) " g i m t t h n g i p ns " n i r n g , " a d d( ) n yc h oc h n hm n h . " T r o n gt h c t , l pt r n hh n g i t n gc t h c t mg nt r o n gm t c ud u yn h t : g i t i nn h n nc c i t n g . T h c s , l t t c c c b nl mt or a m t l o t c c i t n gv g i t i nn h nc h oh . B q u y t , t t n h i n , c h n hl t m h i u i t n gv t h n g i pc a b n c , n h n gm t k h i b nt h c h i n i un yt h c h i nt r o n gC++l n g n g c n h i n ng i n .

C cc h i t i t v i t n g

M t c uh i m t h n g i l nt r o n gh i t h ol , " L mt h n ol nl m t i t n g , v n h n gg n t r n gn h t h n o ? " C ut r l i l " v n h n gg b nmo n g i t m t Cc ut r c . " T r o n gt h c t , c c m t r n hb i nd c hCt or a m t Cc ut r c ( k h n gc C++t r a n gs c ) t h n gs x e mx t c h n h x c g i n gn h c c m c t or a b i m t t r n hb i nd c hC++ . N yl y nt mc h on h n gl pt r n hv i nCn g i p h t h u c v oc c c h i t i t c a k c ht h c v b t r t r o n gm c a h , v v m t l d ot r c t i pt r u yc pb y t e c ut r c t h a yv s d n g n hd a n h( d a t r n k c ht h c c t h v b t r c h om t c ut r c l m t h o t n gn o n p o r t a b l e ) . K c ht h c c a m t c ut r c c k c ht h c t n gh pc a t t c c c t h n hv i nc a m n h . i k h i k h i t r n hb i nd c h a r a m t c ut r c , n c h ob i t t h mt h mb y t e l mc h or a n hg i i i r a g ng n g i un yc t h l mt n g h i uq u t h c h i n . T r o n gc h n g1 5 , b ns t h yn h t h n ot r o n gm t s t r n gh p" b m t " c o nt r c t h mv oc ut r c , n h n gb nk h n gc np h i l ol n gv i u n g a yb yg i . B nc t h x c n hk c ht h c c a m t c ut r c b n gc c hs d n gs i z e o f n h i uh n h . yl m t v d n h :

// :C 0 4 :S i z e o f . c p p //K c ht h cc ac ut r c#b a og m" C L i b . h " #B a og m" C p p L i b . h "#i n c l u d eu s i n gn a m e s p a c es t d ; s t r u c tA{ i n ti[ 1 0 0 ] ; } ; s t r u c tB{ v o i df( ) ; } ; t r n gB: :f( ){ } i n tm a i n( ){ c o u t< <" s i z e o fc ut r cA= "< <s i z e o f( A ) < <" B y t e "< <e n d l ; c o u t< <" s i z e o fc ut r cB= "< <s i z e o f( B ) < <" B y t e "< <e n d l ; c o u t< <" s i z e o fC S t a s ht r o n gC= " < <s i z e o f ( C S t a s h )< <" b y t e "< <e n d l ; c o u t< <" s i z e o fS t a s ht r o n gC++= "< <s i z e o f( S t a s h )< < " b y t e "< <e n d l ; }/// :~

T r nm yt n hc a t i ( k t q u c a b nc t h t h a y i ) t u y nb b ni n ut i ns nx u t 2 0 0 b i v m i i n t c h i m h a i b y t e . c ut r c Bl m t n mb t t h n gb i v n l m t c ut r c k h n gc t h n hv i nd l i u . T r o n gC , i u n yl b t h pp h p , n h n gt r o n gC++ , c h n gt a c nl a c h nc a v i c t or a m t c ut r c c n h i mv d u yn h t l t nh mp h mv i , v v yn c c h op h p . T u yn h i n , k t q u s nx u t b i l n hp r i n t t h h a i l m t g i t r k h c k h n g c n h i n . T r o n gp h i nb n uc a n g nn g , k c ht h c l k h n g , n h n gm t t n hh u n gk h x x yr a k h i b nt oc c i t n gn h : H c c n g a c h n h i t n g c t or a t r c t i ps a uk h i h , v n h v yl k h n gr r n g . M t t r o n gn h n gn g u y nt c c b nc a c c i t n gl m i i t n gp h i c m t a c h d u yn h t , d o c ut r c k h n gc t h n hv i nd l i us l u nl u nc m t s k c ht h c k h c k h n gt i t h i u . Ha i c u i c n gs i z e o f b oc oc h ob nt h yr n gk c ht h c c a c c c ut r c t r o n gC++l g i n gn h k c ht h c c a p h i nb nt n g n gt r o n gC . C++ , c g n gk h n g t h mb t k c h i p h k h n gc nt h i t .

P h n ut pt i nn g h i t h c

K h i b nt or a m t c ut r c c c h a h mt h n hv i n , b n a n gt or a m t k i ud l i um i . N i c h u n g , b n mu nl o i d d n gt r u yc pc h oc h n hm n hv n h n gn g i k h c . Ng o i r a , b nmu nt c hr i n gg i a od i n ( t k h a i ) t v i c t h c h i n( n hn g h a c a c c h mt h n hv i n ) t h c h i nc t h c t h a y i m k h n gb u c m t t i b i nd c hc a t o nb h t h n g . B n t c m c c hn yb n gc c h t t k h a i c h ol o i h n hm i c a b nt r o n gm t t pt i nt i u . K h i t i l n ut i nh c c h n gt r n ht r o n gC , c c t pt i nt i u l m t b n i v i t i . Nh i uc u ns c hC d n gn h k h n gn h nm n hn , v t r n hb i nd c hk h n gt h c t h i c c h m n c v t yc h nh uh t t h i g i a n , t r k h i c ut r c c c n gb . T r o n gC++s d n gc c t pt i nt i u t r n nt i n ht h r r n g . H h u n h b t b u c i v i p h t t r i nc h n gt r n hd d n g , v b n a t h n gt i nr t c t h t r o n g : k h a i b o . C c t p t i nt i u c h ot r n hb i nd c hn h n gg c s nt r o n gt h v i nc a b n . B nc t h s d n gt h v i nn g a yc k h i b nc h c c c t pt i nt i u c n gv i c c i t n gt pt i nh o c t pt i nt h v i n , b nk h n gc np h i c m n g u nc h oc c c p pt pt i n . C c t pt i nt i u l n i m c c c i mk t h u t g i a od i n c l ut r . M c d n k h n g c t h c t h i b i t r n hb i nd c h , c c ht i pc nt t n h t x yd n gc c d nl nt r o n gCl s

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

104/320

08/10/2013

Suy ngh trong C + +, Vol 1

d n gt h v i n , t h ut h pc c c h c n n gl i nq u a nv oc c m u nc n gm t i t n gh o c t h v i n , v s d n g m t t pt i nt i u g i t t c c c t k h a i c h oc c c h c n n g . Nl d e r i g u e u r t r o n gC++ , b nc t h n mb t k c h c n n gv om t t h v i nC , n h n gC++k i ud l i ut r ut n gx c n hc c c h c n n gc l i nq u a nd od i n t t i pc nc h u n gv i c c d l i ut r o n gm t c ut r c . B t k c h c n n gt h n hv i np h i c k h a i b ot r o n gc c c ut r c k h a i b o , b nk h n gt h t n n h n gn i k h c . V i c s d n gc c t h v i nc h c n n g c k h u y n k h c ht r o n gCv t h c h h a t r o n gC++ .

T m q u a nt r n gc at pt i nt i u

K h i s d n gc h c n n gt m t t h v i n , Cc h op h pb nt yc h nb q u ac c t pt i nt i u v c h c nk h a i b o h mb n gt a y . T r o n gq u k h , n g i t a i k h i s l m i un y t n gt c t r n hb i nd c hc h c nm t c h t b n gc c ht r n hn h n gn h i mv mv b a og mc c c t pt i n( i un yt h n gk h n gp h i l m t v n v i c c t r n hb i nd c hh i n i ) . V d , yl m t t u y nb v c n gl i b i n gc a h m Cp r i n t f ( ) ( t < s t d i o . h >) : p r i n t f
( . . . ) ;

[31] E l i pc h n hm t d a n h s c h i s b i n , t r o n g n i r n g : p r i n t f ( ) c m t s i s , m i t r o n gs c m t l o i , n h n gb q u a i u . C h c nl yb t k i s b nn h nt h yv c h pn h nc h n g . B n gc c hs d n gh n h t h c n yt u y nb , b nt mn g n gt t c c c k i mt r a l i t r nc c i s . i un yt h c t c t h g yr a v n t n h . N ub nk h a i b oc c c h c n n gb n gt a y , t r o n gm t t pt i nb nc t h l mc h om t s a i l m. K t k h i t r n hb i nd c hc h n h nt h yb nt a yc a k k h a i t r o n gt pt i n , n c t h t h c h n gv i s a i l mc a b n . C h n gt r n hs a u s l i nk t m t c c hc h n hx c , n h n gv i c s d n gc c c h c n n gt r o n g m t t pt i ns b l i . yl m t l i k h k h n t mk i m, v c t h d d n gt r n h c b n gc c h s d n gm t t pt i nt i u . N ub n t t t c c c t k h a i c h c n n gc a b nt r o n gm t t pt i nt i u , v b a og mt i u m k h pm i n i b ns d n gc h c n n gv n i b nx c n hc h c n n g , b n mb om t t u y nb n h t q u nt r nt o nb h t h n g . B nc n g mb or n gv i c k k h a i v p h h pv i n hn g h a b n gc c hb a og mc c t i u t r o n gc c t pt i n n hn g h a . N um t c ut r c c k h a i b ot r o n gm t t pt i nt i u t r o n gC++ , b np h i b a og mc c t pt i nt i u k h pm i n i m t c ut r c c s d n gv n i m c ut r c c h c n n gt h n hv i n c x c n h . C++ , t r n h b i nd c hs a r a m t t h n gb ol i n ub nc g n g g i m t c h c n n gt h n gx u y n , h o c g i i nt h o i h o c n hn g h a m t h mt h n hv i n , k h n gk h a i b ot r c . B n gc c ht n gc n gv i c s d n gt h c hh pc c t p t i nt i u , n g nn g , mb ot n ht h n gn h t t r o n gc c t h v i n , v l mg i ml i b n gc c hb u c c n gm t g i a od i n c s d n g k h pm i n i . T i u l m t h p n gg i a b nv n g i s d n gt h v i nc a b n . H p n gmt c ut r c d l i uc a b n , v n uc c l pl u nv g i t r t r l i c h oc c c u c g i c h c n n g . Nn i , " yl n h n gg t h v i nc a t i k h n g . " Ng i s d n gc nm t s t h n gt i nn y p h t t r i nc c n gd n gv t r n hb i nd c hc nt t c c a n t or a m t h c hh p . Ng i s d n gc a c ut r c ng i nb a og mc c t pt i nt i u , t or a c c i t n g ( t r n gh p ) t r o n g c ut r c , v c c l i nk t t r o n gc c m u n i t n gh o c t h v i n( v d : c c m b i n d c h ) . T r n hb i nd c ht h c t h i h p n gb n gc c hy uc ub nk h a i b ot t c c c c ut r c v c h c n n gt r c k h i c h n g c s d n gv , t r o n gt r n gh pc a c c c h c n n gt h n hv i n , t r c k h i c h n g c n hn g h a . D o , b nb u c p h i a t k h a i t r o n gt i u v b a og mc c t i u t r o n gt pt i nn i c c h mt h n hv i n c n h n g h a v c c f i l e ( s ) , n i c h n g c s d n g . V m t t pt i nt i u d u yn h t mt t h v i nc a b n c b a o g mt r o n gh t h n g , c c t r n hb i nd c hc t h mb ot n ht h n gn h t v n g nc h nc c l i . C n h n gv n n h t n hm b np h i t h c t c h c m c a b n n gc c hv v i t c c t pt i nt i u h i u q u . V n ut i nl i nq u a n nn h n gg b nc t h a v ot pt i nt i u . Ng u y nt c c b nl " c h k h a i b o " , n g h a l , c h c t h n gt i nc h oc c t r n hb i nd c hn h n gk h n gc g m p h nb l ut r b n gc c ht or a m h o c t or a c c b i n . i un yl d oc c t pt i nt i u t h n gs c b a og mt r o n gm t s nv d c h t r o n gm t d n , v n ul ut r c h om t n hd a n h c p h nb n h i un i , c c m i l i nk t s a r a m t l i n hn g h a n h i u( i un yl C++' s m t q u y t c n h n g h a : b nc t h k h a i b on h n g i un h n h i ul nn h b nmu n , n h n gc h c t h c m t n hn g h a t h c t c h om i i u ) . Qu y n hn yl k h n gh o nt o nc n gv n h a n hc h n g . N ub nx c n hm t b i n l " t pt i nt n h " ( c k h n n gh i nt h c h t r o n gm t t pt i n ) b nt r o n gm t t pt i nt i u , s c n h i ut r n gh pc a d l i ut r nd n , [ 3 2 ] n h n gm i l i nk t s k h n gc m t v v a c h m . V c b n , b nk h n gmu nl mb t c i ug t r o n gt p t i nt i u s g yr a m t s k h n gr r n gt i t h i g i a nl i nk t .

V n n h i uk h a i
V n t i u t pt i nt h h a i l : k h i b n t m t c ut r c k h a i b ot r o n gm t t pt i nt i u , n c t h c h oc c t pt i n c b a og mn h i uh nm t l nt r o n gm t c h n gt r n hp h c t p . I o s t r e a ms l m t v d i nh n h . B t c l c n om t c ut r c n oI /O n c t h b a og m m t t r o n gc c t i u i o s t r e a m. N uc p pt pt i nb n a n g
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 105/320

08/10/2013

Suy ngh trong C + +, Vol 1

l mv i c s d n gn h i uh nm t l o i c ut r c ( t h n gb a og m m t t pt i nt i u c h om i m t ) , b nc n g u yc b a og mc < i o s t r e a m>t i u n h i uh nm t l nv i o s t r e a ms l i t u y nb . T r n hb i nd c hx e mx t k h a i b ol i m t c ut r c ( b a og mc c ut r c s v l pe s ) l m t l i , v n uk h n gt h s c h op h pb ns d n gc n gt nv i n h i ul o i k h c n h a u . n g nc h nl i n yk h i n h i ut pt i nt i u c b a og m, b nc nx yd n gm t s t h n gmi n hv oc c t pt i nt i u c a b nb n gc c hs d n gt i nx l ( t i u c h u nC++t pt i nt i u n h < i o s t r e a m> c " t h n gmi n h " n y ) . C Cv C++c h op h pb nr e d e c l a r e m t c h c n n g , mi nl t k h a i h a i t r n u , n h n gk h n gs c h op h p k h a i b ol i m t c ut r c . T r o n gC++q u yt c n yl c b i t q u a nt r n gb i v n ut r n hb i nd c hc h op h p b nr e d e c l a r e m t c ut r c v h a i t k h a i k h c n h a u , m m t t r o n g s s d n g ? V n k h a i b ol i i l nk h m t c h t t r o n gC++b i v m i l o i d l i u( c ut r c v i c h c n n g ) t h n gc t pt i nt i u r i n gc a m n h , v b np h i b a og m m t t i u t r o n gk h c n ub nmu nt om t k i ud l i u c s d n g ut i n . T r o n gb t k c p pt pt i nt r o n gd nc a b n , n c k h n n gb ns b a og m m t s c c t p t i nb a og mc c t pt i nc n gm t t i u . T r o n gm t b s ut pd u yn h t , t r n hb i nd c hc t h x e mc c t pt i n c n gm t t i u n h i ul n . T r k h i b nl m i ug v n , t r n hb i nd c hs t h yn h n gk h a i b ol i c ut r c c a b nv b oc om t l i t h i g i a nb i nd c h . g i i q u y t v n , b nc np h i b i t t h m m t c h t v t i nx l .

C cc h t h t i nx l # De f i n e , #i f d e f v # e n d i f
C c c h t h t i nx l #x c n hc t h c s d n g t or a l c c o mp i l e t i me . B nc h a i l a c h n : b nc h c t h n i v i c c t i nx l r n gl c c n hn g h a , m k h n gc h n hm t g i t r :
#X c n hC

h o c b nc t h c u n gc pc h on m t g i t r ( l c c hC i nh n h x c n hm t h n gs ) :
#D e f i n eP I3 . 1 4 1 5 9

T r o n gc h a i t r n gh p , c c n h nc t h c k i mt r a b n gv i x l x e mn un c x c n h :
#I f d e fC

i un ys ma n gl i m t k t q u t h t s , v c c m s a u#i f d e f s c b a og mt r o n gc c g i c g i n t r n hb i nd c h . B a og mn yd n gl i k h i t i nx l g pp h i b oc ok t q u
#E n d i f

h o c
#E n d i f//C

B t k k h n gb n hl u ns a uk h i #e n d i f t r nc n gm t d n gl b t h pp h p , m c d m t s t r n hb i nd c hc t h c h pn h nn . C c i f d e f #/#e n d i f c pc t h c l n gv on h a u . P h nb c a #x c n hl #u n d e f ( v i t t t c a " c h a x c n h " ) , m s l mc h om t #i f d e f t u y nb b n gc c h s d n gc n gm t b i nc h ok t q u s a i . #u n d e f c n gs l mc h ot i nx l n g n gs d n gm t v m . P h n b c a #i f d e f l #i f n d e f , m s ma n gl i m t s t h t n uc c n h nh i u k h n g c x c n h( yl m t t r o n gn h n gc h n gt a s s d n gt r o n gc c t pt i nt i u ) . C n h n gt n hn n gh u c hk h c t r o n gt i nx l C . B nn nk i mt r a t i l i uh n gd n a p h n g t ph p y .

M tt i uc h u nc h oc ct pt i nt i u
T r o n gm i t pt i nt i u c c h a m t c ut r c , ut i nb nn nk i mt r a x e mt i u n y c b a og m t r o n gn y c b i t c p pt pt i n . B nl m i un yb n gc c hk i mt r a m t l c t i nx l . N uc k h n g c t h i t l p , c c t pt i nk h n g c b a og mv b nn nt h i t l pc c c ( c c uc t h k h n g c t i k h a i b o ) v t u y nb c ut r c . N u c t h i t l ps a u l l o i c c n gb , d o b nc h n nb q u a c c m m t u y nb n . yl c c hc c t pt i nt i u n nx e mx t :
#I f n d e fH E A D E R _ F L A G #X c n hH E A D E R _ F L A G //L o it u y nb y. . . #E n d i f//H E A D E R _ F L A G

Nh b nt h y , l n ut i nc c t pt i nt i u c b a og m, c c n i d u n gc a t pt i nt i u ( b a og mc k h a i b ok i uc a b n ) s c a b n gv i x l . T t c c c l nt i pt h e o l
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 106/320

08/10/2013

Suy ngh trong C + +, Vol 1

b a og mt r o n gm t nv b i nd c hd u yn h t k h a i b ok i us b b q u a . T nHE A D E R _ F L A Gc t h c b t k t n c o , n h n gm t t i uc h u n n gt i nc y t h e ol h o a t nc a t pt i nh e a d e r v t h a yt h g i a i o n v i d ug c hd i ( h n g un h nm n h , t u yn h i n , c d n hr i n gc h ot nh t h n g ) . yl m t v d :
// :C 0 4 :S i m p l e . h //T i u ng i nc t h n g nc h nt i n hn g h a #I f n d e fS I M P L E _ H #X c n hS I M P L E _ H s t r u c t ng i n{ i n ti ,j ,k ; k h it o( ){ i=j=k=0 ; } } ; #E n d i f//S I M P L E _ H/// :~

M c d S I MP L E _ Hs a uk h i #e n d i f l n h nx t r a v d o b q u a t i nx l , n r t h u c hc h oc c t i l i u . C c b oc ot i nx l n g nc h nn h i ub a og mt h n g c g i l b a o g mb o v .

K h n gg i a nt nt r o n gt i u
B ns n h nt h yr n gs d n g c h c m t t r o n gg nn h t t c c c c p pt pt i nt r o n gc u ns c hn y , t h n gl t r o n gc c h n ht h c : s d n gt nm i nk h n gg i a nt i uc h u n ; K t k h i t i uc h u nl k h n gg i a nt nb a oq u a n ht o nb c h u nC++t h v i n , c b i t n ys d n gc h t h c h o p h pc c t nt r o n gt i uc h u nC++t h v i n c s d n gm k h n gc nt r n h c h u y nm n . T u yn h i n , b n s h un h k h n gb a og i n h nt h ym t c h t h s d n gt r o n gm t t pt i nt i u ( t n h t , k h n gb nn g o i c a m t p h mv i ) . L d ol c h t h s d n gl o i b s b ov m k h n gg i a nt nr i n g , v t c d n gk od i c h o n k h i k t t h c c c nv b i nd c hh i nt i . N ub n t m t c h t h s d n g( b nn g o i c a m t p h mv i ) t r o n gm t t pt i nt i u , n c n g h a l s m t m t n yc a" b ov k h n gg i a nt n " s x yr a v i b t k t pt i nb a og m t i u n y , t r o n g t h n gc n g h a l t pt i nt i u k h c . V v y , n ub nb t u t s d n gc h t h t r o n g t pt i nt i u , n r t d d n g k t t h c " t t " k h n gg i a nt nt h c t k h pm i n i , v d o v h i uh a t c d n gc a k h n gg i a nt n . T r o n gn g nh n : k h n g t s d n gc h t h t r o n gt pt i nt i u .

S d n gt i u t r o n gd n

K h i x yd n gm t d nt r o n gC++ , b nt h n gs t or a n b n gc c h a r t n h i ul o i k h c n h a u( c ut r c d l i uv i c h c n n gl i nq u a n ) . B nt h n gs a t k h a i c h ot n gl o i h o c n h mc c l o i l i nq u a nt r o n g m t f i l e r i n g , s a u x c n hc c c h c n n gc h ol o i t r o n gm t nv d c ht h u t . K h i b ns d n gl o i , b np h i b a og mc c t pt i nt i u t h c h i nk h a i b o n g . i k h i mh n h s c t h e os a ut r o n gc u ns c hn y , n h n gt h n gx u y nh nc c v d s r t n h , v v y t t c m i t h c c k h a i b oc ut r c , n hn g h a c h c n n g , v ma i n( ) c h c n n gc t h x u t h i nt r o n gm t t pt i nd u yn h t . T u yn h i n , h yn h r n gb ns mu ns d n gt pt i nr i n gb i t v c c t pt i nt i u t r o n g t h c t .

C ut r cl n gn h a u

S t i nl i c a t h ut h pd l i uv c h c n n gt nr a k h i k h n gg i a nt nt o nc uk od i nc ut r c . B nc t h l n gm t c ut r c b nt r o n gc ut r c k h c , v d o g i c h oc c y ut l i nq u a nv i n h a u . C p h pk h a i b ol n h n gg b nmo n g i , b nc t h t h yt r o n gc c c ut r c s a u y , m t h c h i nm t yx u n gn g nx pn h m t d a n hs c hl i nk t ng i nv n " k h n gb a og i " h t b n h :

// :C 0 4 :S t a c k . h //C ut r cl n gn h a ut r o n gd a n hs c hl i nk t #I f n d e fS T A C K _ H #X c n hS T A C K _ H c ut r cn g nx p{ c ut r cl i nk t{ v o i d*d l i u , l i nk t*t i pt h e o ; t r n gk h it o( v o i d *d a t ,*L i nk tN X T ) ; }* u , k h o n gt r n gk h it o( ) ; t r n g y( v o i d*d a t ) ; v o i d*( ) ; v o i d*p o p( ) ; t r n gd nd p( ) ; } ; #E n d i f//S T A C K _ H/// :~

L n gn h a uc ut r c c g i l l i nk t , v n c c h a m t c o nt r nt i pt h e ol i nk t t r o n gd a n hs c hv m t c o nt r nd l i u c l ut r t r o n gc c l i nk t . N ut i pt h e oc o nt r l s k h n g , n c n g h a l b n a n g c u i d a n hs c h .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 107/320

08/10/2013

Suy ngh trong C + +, Vol 1

C h r n g ut r c x c n hn g a ys a uk h i k k h a i c ut r c l i nk t , t h a yv m t n hn g h a r i n gb i t l i n k t * u. yl m t c p h p nt C , n h n gn n h nm n h nt mq u a nt r n gc a d uc h mp h ys a uk h i k h a i b oc ut r c , d uc h mp h yc h ob i t k t t h c c a d a n hs c hb n gd up h yc a c c n hn g h a c a k i uc u t r c . ( T h n gt h n gd a n hs c hl s np h mn o . ) C ut r c l n gn h a uc r i n gc a m n hk h i t o(c h c n n g , n h t t c c c ) c ut r c c t r n hb yc h o nn a y , mb ok h i t ot h c hh p . n g nx pc c m t k h i t o(v ) d nd p( ) c h c n n g , c n gn h p u s h( ) , t r o n g c m t c o nt r nd l i ub nmu nl ut r ( n g i n hn y c c pp h t t r nh e a p ) , v p o p( ) , t r v d l i uc o nt r t t r nc n gc a n g nx pv l o i b c c y ut h n g u . ( K h i b nb t ( ) l m t y ut , b n c t r c hn h i mt i ud i t c c i t n g c t r nb i c c d l i u. ) C c ( ) c h c n n gc n gt r v d l i uc o n t r t y ut h n g u , n h n gn l i c c y ut uv on g nx p. yl c c n hn g h a c h oc c c h c n n gt h n hv i n :


// :C 0 4 :S t a c k . c p p{ O } //D a n hs c hl i nk tv ic ct #B a og m" S t a c k . h "#b a og ms d n gt nm i nk h n gg i a nt i uc h u n " /r e q u i r e . h . . " ; t r n g N g nx p: :L i nk t: :k h it o( v o i d*d a t ,*L i nk tN X T ){ d a t a=d a t ; t h e o=n x t ; } t r n gs t a c k: :k h it o( ){ u=0 ; }

t i p

l mm th i ul cs t a c k: :p u s h( v o i d*d a t ){ L i n k*n e w L i n k=n e wl i n k t ; n e w L i n k >k h it o( d a t ,n g i n g u ) ; u=n e w L i n k ; } v o i d*s t a c k: :( ){ y uc u( u=0 ," s px pt r n g " ) ; u >t r l id l i u ; } v o i d*s t a c k: :p o p( ){ i f( u= =0 )r e t u r n0 ; v o i d*k t q u = u >d l i u , l i nk t*o l d H e a d= u ; u= u >t i p t h e o ; x ao l d H e a d , k tq u t r v ; } t r n gs t a c k: :c l e a n u p( ){ y uc u( u= =0 ," s px pk h n gt r n g " ) ; }// / :~

n hn g h a ut i nl c b i t t h v v n c h ot h yb nl mt h n o x c n hm t t h n hv i nc a m t c ut r c l n gn h a u . B nc h c ns d n gm t m c b s u n g p h ng i i p h mv i x c n ht nc a k mt h e oc ut r c . s t a c k: : L i nk t : : k h i t o( c n h n gl pl u nv ) g nc h n gc h oc c t h n hv i n . Ng nx p: : k h i t o( b ) uv k h n g , v v yc c i t n gb i t n c m t d a n hs c ht r n g . Ng nx p: : p u s h(c t h a ms , l m t c o nt r nb i n) b nmu nt h e od i , v yn v on g nx p. u t i n , n s d n gmi p h nb l ut r c h oc c l i nk t n s c h n ut r a n g . S a u n g i l i nk t ' s k h i t o(c h c n n g g nc c g i t r p h h pv i ) c c t h n hv i nc a l i nk t . C h r n gb nc n hc o nt r c g nc h od n g u, s a u u c g nc h oc c m i l i nk t c o nt r . i un yc h i uq u yl i nk t t r o n g t r nc n gc a d a n hs c h . Ng nx p: : p o p(n mb t ) d l i uc o nt r uh i nt i c a n g nx p, s a u n d i c h u y n uc o nt r x u n gv x a c c uc c a n g nx p, c u i c n gt r v c o nt r b t . K h i c a s p o p( ) l o i b c c y ut c u i c n g , s a u um t l nn a t r t h n hs k h n g , c n g h a l n g nx pr n g . Ng nx p: : d nd p(k h n gt h c s l mb t c d nd p . T h a yv o , n ) t h i t l pm t c h n hs c hc n gt y r n g" b n( c c l pt r n hk h c hh n gs d n gn yn g nx p i t n g ) c t r c hn h i mx u t t t c c c y ut n yr a n g nx pv x a c h n g . " C c y uc u( ) c s d n g c h r ar n gm t l i l pt r n h x yr a n uc c n g n x pl k h n gc s np h mn o . T i s a ok h n gt h n g nx ph yc h ut r c hn h i mc h ot t c c c i t n gm c c l pt r n hv i nk h c hh n g k h n gb t ( ) ? V n l c c n g nx p a n gn mg i k h o n gt r n gc o nt r , v b ns h c t r o n gc h n g1 3 l k u g i x a m t v o i d* k h n gl ms c hn h n g i u n g . L c h c a " n g i c h ut r c hn h i mc h ob n h " k h n g p h i l t h mc h l ng i n , n h c h n gt a s t h yt r o n gc c c h n gs a u . yl m t v d k i mt r a n g nx p:
// :C 0 4 :S t a c k T e s t . c p p //{ L }s t a c k //{ T }S t a c k T e s t . c p p //K i mt r ad a n hs c hl i nk tl n gn h a u #B a og m" S t a c k . h " #B a og m" . ./R e q u i r e . h " #B a og m< f s t r e a m > #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( i n ta r g c ,
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 108/320

08/10/2013

Suy ngh trong C + +, Vol 1

c h a r*a r g v[ ] ){ r e q u i r e A r g s( a r g c ,1 ) ;//t pt i nt nl t h a ms t r o n gi f s t r e a m( a r g v[ 1 ] ) ; mb o( t r o n g ,a r g v [ 1 ] ) ; s t a c kt e x t l i n e s ; t e x t l i n e s . i n i t i a l i z e( ) ; n g d y ; // ct pt i nv d n gl ut r t r o n gS t a c k : t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) t e x t l i n e s . p u s h( m ic h u i( d n g ) ) ; //P o pd n gt S t a c kv i nc h n g : c h u i*s ; t r o n gk h i( (s=( s t r i n g* )t e x t l i n e s . p o p( ) )=0 ){ ! c o u t< <*s< <e n d l ; x as ; } t e x t l i n e s . c l e a n u p( ) ; }/// :~

i un yc n gt n gt n h v d t r c , n h n gn yd n gt m t t pt i n( n h c h u i c o nt r ) v on g nx p v s a u b t c h n gr a , m k t q u t r o n gc c t pt i n c i nr a t h e ot h t n g c . L ur n gc c p o p( ) c h c n n gt h n hv i nt r v m t v o i d* v i un yp h i c t r l i t h n hm t c h u i * t r c k h i n c t h c s d n g . i nc c c h u i , c o nt r c d e r e f e r e n c e d . Nh t e x t l i n e s a n g c l p y , c c n i d u n gc a d n g c " n h nb n " c h om i p u s h( ) b n gc c hl mc h o m t c h u i mi ( d n g. G i t r t r v t ) m i t h h i nl m t c o nt r nm i c h u i c t or a v s a oc h p t h n gt i nt d n g. N ub nc h ng i nl t h n gq u a a c h c a d n g y( ) , b ns k t t h c v i m t n g n x p yc c a c h g i n gn h a u , t t c c h v od n g. B ns t mh i ut h mv i un y" n h nb n " q u t r n h t r o n gc u ns c hn y . T nt pt i n c l yt d n gl n h . mb or n gc l l t r nd n gl n h , b ns t h ym t c h c n n gt h h a i c s d n gt r e q u i r e . ht pt i nt i u : r e q u i r e A r g s ( m s os n h) a r g c c h os mo n gmu nc a i s v i nr a m t t h n gb ol i t h c hh pv t h o t r a k h i c h n gt r n hn uk h n gc l l .

p h ng i i p h m v i t o nc u
C c n h i uh n hc p h ng i i p h mv i c b nt r o n gt n hh u n gt r o n g t nc c b i nd c hs c h nt h e o m c n h( t n" g nn h t " ) k h n gp h i l n h n gg b nmu n . V d , g i s b nc m t c ut r c v i m t n hd a n h a p h n gmt , v b nmu nc h nm t n hd a n ht o nc umt t b nt r o n gm t h mt h n hv i n . T r n hb i n d c hs m c n hl a c h nc c a p h n gm t , v v yb np h i n i c h on l mk h c . K h i b nmu nc h n h m t t nt o nc us d n g p h ng i i p h mv i , b ns d n gc c n h i uh n hk h n gc g p h a t r c n . D i yl m t v d c h ot h y p h ng i i p h mv i t o nc uc h oc m t b i nv m t c h c n n g :
// :C 0 4 :S c o p e r e s . c p p// p h ng i ip h mv it o nc ui n ta ;v o i d f( ){ } s t r u c tS{ i n ta ; v o i df( ) ; } ; t r n gS: :f( ){ : :F( ) ; //s c q u yk h c ! : :a++ ; //C h nm tt o nc u //C cp h mv ic ut r ct i } i n tm a i n( ){ Ss ,f( ) ; }/// :~

m t;

N uk h n gc p h ng i i p h mv i t r o n gS: : f ( ) , t r n hb i nd c hs m c n hl a c h nc c p h i nb nt h n hv i n c a f ( ) v mt .

T mt t

T r o n gc h n gn y , b n h c c " x o n " c b nc a C++ : b nc t h t c c c h c n n gb nt r o n gc a c ut r c . i un yl o i m i c a c ut r c c g i l m t l o i t r ut n g d l i u, v c c b i nb nt os d n gc ut r c n y c g i l c c i t n g , h o c c c t r n g h p , c c l o i . G i m t h mt h n hv i nc h om t i t n g c g i l g i m t t h n g i p n i t n g . C c h n h n gc h n ht r o n gl pt r n hh n g i t n g c g i t i nn h n nc c i t n g . M c d d l i ub a ob v c h c n n gv i n h a ul m t l i c h n gk c h ot c h c m v l mc h ot h v i ns d n g d d n gh nv n n g nc h nc c c u c n g t nb n gc c hg i ut n , c r t n h i uh nb nc t h l m l m c h oc h n gt r n ha nt o nh nt r o n gC++ . T r o n gc h n gk t i p , b ns h c c c h b ov m t s c c t h n hv i n c a m t c ut r c c h c b nc t h t h a ot c c h n g . i un yt h i t l pm t r a n hg i i r r n gg i a n h n gg n g i d n gc a c ut r c c t h t h a y i v n h n gg c h c c c l pt r n hv i nc t h t h a y i .

B i t p
1.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t h t t p : / / www. B r u c e E c k e l . c o m.

T r o n gt i uc h u nt h v i nC , c h c n n g t ( ) i nm t m n gc h a r g i a od i n i uk h i n( d o b nc t h n i t ( " h e l l o " ) . V i t m t c h n gt r n hCc s d n gp u t s ( ) n h n gk h n gb a og m< s t d i o . h > h o c n uk h n gk h a i b oc c c h c n n gb i nd c hn y . c h n gt r n hv i t r n hb i nd c hCc a b n ( M t s C++l t r n hb i nd c hk h n gk h c b i t v i t r n hb i nd c hCc a h , t r o n gt r n gh pn y , b nc t h c np h i k h mp h r a m t l c d n gl n hb u c m t t r n hb i nd c hC . ) . B yg i b i nd c h n v i C++t r n hb i nd c hv l us k h c b i t .


109/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

2. 3. 4. 5. 6. 7. 8. 9.

10.

11.

12. 13.

14. 15. 16. 17. 18.

19.

20.

21. 22. 23. 24.

T om t c ut r c k h a i b om t h mt h n hv i nd u yn h t , s a u t or a m t n hn g h a c h or n gc h c n n gt h n hv i n . T or a m t i t n gc a k i ud l i um i c a b n , v g i h mt h n hv i n . T h a y i g i i p h pc a b n t pt h d c 2 n nc ut r c c k h a i b ot r o n gm t n gc c h" b ov " t pt i nt i u , v i n hn g h a t r o n gm t c p pt pt i nc a b nv ma i n( ) t r o n gm t . T om t c ut r c c h v i m t i n t t h n hv i nd l i u , v h a i c h c n n gt o nc u , m i t r o n gs c m t c o nt r v o c ut r c . C h c n n g ut i nc m t t h h a i i n t l u nv t c ut r c ' s i n t v i g i t r t h a ms , t h h a i h i nt h c c i n t t c ut r c . K i mt r a c c c h c n n g . L pl i b i t p4 n h n gd i c h u y nc c c h c n n g h c c h c n n gt h n hv i nc a c ut r c , v k i m t r a l i . T om t l p( d t h a ) t h c h i nl a c h nt h n hv i nd l i uv m t c u c g i c h c n n gt h n hv i nb n g c c hs d n gn yt k h a ( t r o n g c p n a c h c a i t n gh i nh n h ) . T h c h i nm t S t a s hc h a h a i s . i nn v i 2 5 i g i t r , s a u i nc h n gr a g i a od i n i uk h i n . L pl i b i t p7 v i n g nx p. T om t t pt i nc c h a m t h mf ( ) m p h i m t m t i n t i s v i nn v og i a od i n i uk h i nb n g c c hs d n gp r i n t f ( ) c h c n n gt r o n g< s t d i o . h >b n gc c hn i : p r i n t f ( " % d\n " , i t r o n g) m t i l i n t b nmu ni n . T or a m t t pt i nr i n gb i t c c h a ma i n( ) , v t r o n gt pt i nn yt u y nb f ( ) c m t n i t r a n hl u n . G i f ( ) t b nt r o n gc h n h( ) . C g n g b i nd c hv l i nk t c h n gt r n hc a b nv i C++v x e mn h n gg s x yr a . B yg i b i nd c hv l i nk t c c c h n gt r n hb n gc c hs d n gt r n hb i nd c hC , v x e mn h n gg s x yr a k h i n c h y . G i i t h c hh n hv i . T mh i ul mt h n o s nx u t l pr pn g nn g t Cv C++t r n hb i nd c h . V i t m t h mt r o n gC v m t c ut r c v i m t c h c n n gt h n hv i nd u yn h t t r o n gC++ . S nx u t l pr pn g nn g t m i v t mt h yc c t nc h c n n g c s nx u t t h e oc h c n n gCv C++c h c n n gt h n hv i nc a b n , v v yb nc t h n h nt h yn h n gg s px pc a t nt r a n gt r x yr a b nt r o n gc c t r n hb i nd c h . V i t c h n gt r n hv i m c i uk i nb i nd c ht r o n gma i n( ) , k h i m t g i t r t i nx l c n h n g h a m t t h n g i p c i n , n h n gm t t i nn h nk h i n k h n g c n hn g h a c i n . B i nd c h m n yt h n g h i mv i m t #x c n ht r o n gc h n gt r n h , s a u k h mp h c c hb i nd c hc a b nc n hn g h a t i nx l t r nd n gl n hv t h n g h i mv i i u . V i t c h n gt r n hs d n gk h n g n h( ) v i m t i s l l u nl u ns a i ( s k h n g ) x e mn h n g g s x yr a k h i b nc h yn . B yg i b i nd c hn v i #d e f i n e NDE B U Gv c h yn m t l nn a t h ys k h c b i t . T om t k i ud l i ut r ut n g i d i nc h om t b n gv i d e ot r o n gm t c a h n gc h ot h u b n g a . C g n gx e mx t t t c c c d l i uv c c h o t n gc t h c nt h i t c h ov i d e ol o i l mv i c t t t r o n gc c o nv i d e oh t h n gq u nl c h ot h u . B a og mi n( ) c h c n n gt h n hv i nc h i nt h t h n g t i nv v i d e o. T om t n g nx p i t n g g i v i d e oc c i t n gt t p1 3 . T or a m t s v i d e oc c i t n g , l ut r c h n gt r o n gn g nx p, s a u h i nt h c h n gb n gV i d e o: : i n( . ) V i t c h n gt r n hi nr a t t c c c k c ht h c c h oc c l o i d l i uc b nt r nm yt n hc a b ns d n g s i z e o f . S a i S t a s hs d n g< c h a r >v e c t o r n h c ut r c d l i uc b nc a n . T n gt or a n h n gmi n gl ut r t r o n gc c l o i s a u y , s d n gmi : i n t , d i , m t m n gc a 1 0 0 c h a r s , m t m n gc a 1 0 0 f l o a t s . I n a c h c a n h n g i un yv s a u t d ol ut r s d n gx a . V i t m t c h c n n gm p h i m t m t * c h a r i s . S d n gmi , t n gp h nb m t m n gc a c h a r l k c ht h c c a c h a r m n g l t h n gq u a c c c h c n n g . S d n gm n gl pc h m c , s a oc h p c c n h nv t t c c i s m n gc pp h t n g( n gq u nc c t e r mi n a t o r n u l l ) v t r l i c o nt r s a oc h p . T r o n gc a b nc h n h( ) , k i mt r a c h c n n gb n gc c h i q u a m t m n gk t t n ht r c hd n , s a u l yk t q u v v t q u a n t r l i v oc c c h c n n g . I nc h a i c h u i v c h a i c o nt r , d o b nc t h t h yh a n gl ut r k h c n h a u . S d n gx a , l ms c ht t c c c l ut r n n g n g . Hi nm t v d v m t c ut r c k h a i b ot r o n gm t c ut r c k h c ( m t c ut r c l n g n h a u) . C c c t h n h v i nd l i ut r o n g c h a i c ut r c , v k k h a i , x c n hc h c n n gt h n hv i nt r o n gc h a i c ut r c s . V i t c h n h( ) m k i mt r a c c l o i m i c a b n . L mt h n ol nl m t c ut r c ? V i t m t o nm m c c b ni nk c ht h c c a c c c ut r c k h c n h a u . T or a c c c ut r c m c h c c c t h n hv i nd l i uv n h n gn g i c t h n hv i nd l i uv c c t h n hv i nc h c n n g . S a u t or a m t c ut r c m k h n gc t h n hv i nn oc . I nr a k c ht h c c a t t c c c . G i i t h c hl d ok t q u c a c ut r c k h n gc t h n hv i nd l i u t t c . C++t n gt or a t n g n gv i m t t y p e d e f c h os t r u c t s , n h b n t h yt r o n gc h n gn y . N c n gl m i un y l i t k v c c o nt h . V i t m t c h n gt r n hn h c h n gt i un y . T om t n g nx pc h a S t a s he s . M i S t a s hs t c h c n md n gt m t t pt i n uv o . T oS t a s he s s d n gmi . c m t t pt i nc a b nv on g nx p, s a u i nl i t r o n gh n ht h c b a n uc a n b n gc c hl yn t n g nx p. S a i t p2 2 b nt or a m t c ut r c m g i g nc c n g nx pc a S t a s he s . Ng i s d n gc h c n t h mv n h n c d n gt h n gq u a c h c n n gt h n hv i n , n h n gd i s b a og mc c c ut r c x yr a s d n gm t n g nx pc a S t a s he s . T om t c ut r c c h a m t i n t v m t c o nt r nm t t h h i nc a c n gm t c ut r c . V i t m t c h c n n gm l y a c h c a m t t r o n gn h n gc ut r c s v m t i n t c h ob i t c h i ud i c a d a n hs c hm b n
110/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

25.

mu nt or a . C h c n n gn ys t h c h i nm t c h u i t o nb c c c ut r c s ( m t d a n h s c h l i nk t ) , b t ut c c i s ( ud a n hs c h ) , v i m i m t t r o n gn h n gc h k t i p . L m m i c ut r c s s d n g mi , v t s l n g( t r o n g s i t n gn yl ) t r o n gi n t . T r o n gc u i c n gc ut r c t r o n gd a n h s c h , t m t g i t r k h n gt r o n gc o nt r c h r a r n g l k t t h c . V i t m t c h c n n gt h h a i m c n g i n g ud a n hs c hv d i c h u y nc a b nt u nc u i , i nr a c h a i g i t r c o nt r v i n t g i t r c h om i m t . L pl i b i t p2 4 , n h n g t c c c h c n n gb nt r o n gm t c ut r c t h a yv s d n g" n g u y nl i u " c u t r c s v c h c n n g .

a t k h a i c h c n n gt r o n gp h mv i c a c ut r c , t h a y i c c hc c c h c n n g c g i l c h oc c c ut r c , l o i b v i c t h n gq u a a c h c ut r c n h l i s ut i n , v t h m m t t nk i um i c a c h n gt r n h( d o b n k h n gc np h i t or a m t t y p e d e f c h oc ut r c t a g ) . yl t t c t h u nt i nh g i pb nt c h c m c a b nv l mc h on d d n gh n v i t v c . T u yn h i n , c n h n gv n q u a nt r n gk h c k h i t h c h i nc c t h v i nd d n gh nt r o n gC++ , c b i t l c c v n v a nt o nv k i ms o t . C h n gn yx e mx t c c c h c a r a n hg i i t r o n gc ut r c .

X yd n g n h m c

T r o n gb t k m i q u a nh l q u a nt r n g c r a n hg i i c t nt r n gb i t t c c c b nl i nq u a n . K h i b n t or a m t t h v i n , b nt h i t l pm t m i q u a nh v i c c l p t r n h v i nk h c h h n g n g i s d n gt h v i n x y d n gm t n gd n gh o c m t t h v i n . T r o n gCc ut r c , n h v i h uh t m i t h t r o n gC , k h n gc q u y n h . L pt r n hk h c hh n gc t h l mb t c i ug h mu nv i c ut r c , v k h n gc c c hn o b u c b t k h n hv i c t h . V d , n g a yc k h i b n t h yt r o n gc h n gc u i c n gt mq u a nt r n gc a c h c n n g t t nk h i t o(v )d nd p( ) , c c l pt r n h k h c hh n gc s l a c h nk h n gg i n h n gc h c n n g . ( C h n gt i s x e mx t m t c c ht i pc nt t h nt r o n g c h n gt i pt h e o . ) V n g a yc k h i b nt h c s mu nr n gc c l pt r n hk h c hh n gk h n gt r c t i pt h a ot c m t s c c t h n hv i nc a c ut r c , t r o n gCk h n gc c c hn o n g nc h nn . M i t h ut r nt r u n gv i t h g i i . C h a i l d o k i ms o t t r u yc pc h oc c t h n hv i n . ut i nl g i c h ob nt a yc c l pt r n hv i nc a k h c hh n gr a c n gc m h k h n gn nc h mv o , c n gc c nt h i t c h on i b m u c a c c k i ud l i u , n h n gk h n gm t p h nc a g i a od i nl pt r n hk h c hh n gc np h i g i i q u y t c c v n c t h c a m n h . i u n yt h c s l m t d c hv c h ok h c hh n g l pt r n hb i v h c t h d d n gx e mn h n gg q u a nt r n gv i h v n h n gg h c t h b q u a . L d ot h h a i k i ms o t t r u yc pl c h op h pc c n h t h i t k t h v i n t h a y i c c h o t n gn i b c a c ut r c m k h n gc nl ol n gv n n h t h n os n hh n g nc c l pt r n hv i nk h c hh n g . T r o n gc c n g nx pv d t r o n gc h n gc u i c n g , b nc t h mu np h nb l ut r t r o n gk h i l n , t c , t h a yv t or a l ut r m i m i l nm t y ut c t h mv o . N ug i a od i nv t h c h i n c p h nc c hr r n gv c b o v , b nc t h t h c h i n i un yv c h y uc um t r e l i n kb i c c l pt r n hk h c hh n g .

C + +, k i ms o t t r u yc p

C++g i i t h i ub a t k h a m i t h i t l pr a n hg i i t r o n gm t c ut r c : c n gc n g, r i n gt , v b ov . S d n gv n g h a c a c h n gl k h ng i n . Nh n gs p e c i f i e r s t r u y c p c h c s d n gt r o n gm t t u y nb c u t r c , v h t h a y i r a n hg i i c h ot t c c c t k h a i m t h e oh . B t c k h i n ob ns d n gm t Nh n g c t n h , n p h i c t h e os a ub i m t d uh a i c h m. c n gc n gc n g h a l t t c c c t k h a i t h n hv i nt i pt h e oc s nc h ot t c m i n g i . c n gv i ng i n gn h c ut r c t h n hv i n . V d , s a uc ut r c t k h a i l g i n gh t n h a u :

// :C 0 5 :P u b l i c . c p p //H l g i n gn h c ut r cc aC s t r u c tA{ i n ti ; c h a rj ; f l o a tf ;v o i df u n c ( ) ; } ; t r n gA: :f u n c( ){ }


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 111/320

08/10/2013

Suy ngh trong C + +, Vol 1

c ut r cB{ p u b l i c : i n ti ; c h a rj ; f l o a tf ; } ; t r n gB: :f u n c( ){ } i n tm a i n( ){ Aa ;Bb ; a i=b i=1 ; a j=b j=' c ' ; a f=b f=3 . 1 4 1 5 9 ; a . f u n c( ) ; b . f u n c( ) ; }/// :~

v o i df u n c( ) ;

C c t i n. t k h a , m t k h c , c n g h a l k h n ga i c t h t r u yc pt h n hv i nn g o i t r b n , n g i s n gt or a c c l o i , t r o n gc c t h n hv i nc h c n n gc a l o i m t i nl m t b c t n gg c hg i a b nv c c l pt r n hv i nk h c h h n g , n ua i c g n gt r u yc pm t t i nt h n hv i n , h s n h n c m t l i t h i g i a nb i nd c h . T r o n gc ut r c Bt r o n gv d t r n , b nc t h mu nl mc h oc c p h nc a i d i n( c n g h a l , c c t h n hv i nd l i u ) n , c t h t r u yc pc h c h ob n :
// :C 0 5 :P r i v a t e . c p p //T h i tl pr a n hg i i c ut r cB{ p r i v a t e : c h a rj ; f l o a tf ;c n g : i n t i ; v o i df u n c( ) ; } ; t r n gB: :f u n c( ){ i=0 ; j=' 0' ; f= 0 . 0 ; } ; i n tm a i n( ){ Bb ; b i=1 ; !//O K ,c n g// b j=' 1' ; // ! b f=1 . 0 ; //b th pp h p ,t i n }/// :~

//b th pp h p ,t i n

M c d c h c n n g( ) c t h t r u yc pb t k t h n hv i nc a B( v c h c n n g( ) l t h n hv i nc a B, d o t n g c pn c h op h p ) , m t c h c n n gt o nc ub n ht h n gn h c h n h( ) c t h k h n g . T t n h i n , k h n gt h c h c n n gt h n hv i nc a c c c ut r c k h c . C h c c c c h c n n g c q u y n hr t r o n gk h a i b oc ut r c ( " h p n g " ) c t h c t i pc nv i t i nt h n hv i n . K h n gc l n hc nt h i t t r u yc ps p e c i f i e r s , v h c t h x u t h i nn h i uh nm t l n . C h n g n hh n g n t t c c c t h n hv i nt u y nb s a uk h i h v t r c k h i c t t r u yc pt i pt h e o .

b ov
C c c t c u i c n g c b ov . b ov h n h n gg i n gn h t i n, v i m t n g o i l m c h n gt a c t h k h n g t h c s n i v n g a yb yg i : " K t h a " c ut r c ( m k h n gt h t r u yc pt i nt h n hv i n ) c c pq u y nt r u yc p b ov c c t h n hv i n . i un ys t r n nr r n gh nt r o n gc h n g1 4 k h i t h a k c g i i t h i u . i v i m c c hh i nt i , x e mx t v i c b ov c g i n gn h t i n.

B nb

N ub nmu nc pm t c c hr r n gq u y nt r u yc pv om t c h c n n gm k h n gp h i l m t t h n hv i nc a c ut r c h i nt i ? N y c t h c h i nb n gc c ht u y nb c h c n n gm m t n g i b nt r o n g c c k h a i b oc u t r c . i uq u a nt r n gl c c b nk h a i b ox yr a b nt r o n gk h a i b oc ut r c b i v b n( v t r n hb i nd c h ) p h i c k h n n g c c c k h a i b oc ut r c v t h ym i q u yt c v k c ht h c v h n hv i c a c c k i ud l i u . V m t n g u y nt c r t q u a nt r n gt r o n gb t k m i q u a nh , " A i c t h t r u yc pt h c h i nr i n gc a t i ? " L pk i ms o t n h n gm c q u y nt r u yc pc h oc c t h n hv i n . K h n gc c c hn oma t h u t " p h v t r o n g " t b nn g o i n ub nk h n gp h i l m t n g i b n, b nk h n gt h k h a i b om t l pm i v n i : " X i nc h o , t i l m t n g i b nc a B o bv mo n g i x e m! " r i n gt v b ov c c t h n hv i nc a B o b. B nc t h k h a i b om t c h c n n gt o nc un h m t n g i b n, v b nc n gc t h k h a i b om t h mt h n h v i nc a m t c ut r c k h c , h o c t h mc h c c ut r c , n h m t n g i b n. yl m t v d :

// :C 0 5 :F r i e n d . c p p //B nc h op h pt r u yc p cb i t //T u y nb ( l o i c i mk t h u tk h n g y ) :c ut r cX ; ( X* ) ; } ; s t r u c tX{ // n hn g h at i n : i n ti ;c n gc n g :


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

c ut r cY{

v o i df

112/320

08/10/2013

Suy ngh trong C + +, Vol 1

l mm th i ul ck h it o( ) ; b nt r n gg( X* ,i n t ) ;//t o nc ub n b nt r n gY : :f( X* ) ; //C ut r ct h n hv i nb n b nc ut r cZ ;//T o nb c ut r cl m t n g ib n n g ib nv h i uh() ; } ; k h o n gt r n gX: :k h it o( ){ i=0 ; } t r n gg( x*x ,i n ti ){ x >i=i ; } t r n gY: :f( x*x ){ x >i=4 7 ; } c ut r cZ{ p r i v a t e : i n tj ;c n gc n g : l mm th i ul ck h it o( ) ; t r n gg( x*x ) ; } ; t r n gZ: :k h it o( ){ j=9 9 ; } t r n gZ: :g( x*x ){ x >i=j ; } t r n gh( ) { Xx ; x i=1 0 0 ;//t h a ot cd l i ut r ct i p } i n tm a i n( ){ xx ; Zz ; z g( &x ) ; }/// :~

c ut r c Yc m t c h c n n gt h n hv i nf ( ) m s t h a y i m t i t n gc a l o i X. yl m t c h t c a m t v n h c b a b i v C++ i h i b np h i k h a i b ot t c m i t h t r c k h i b nc t h t h a mk h on , v v y c ut r c Yp h i c k h a i b ot r c k h i t h n hv i nY: : f ( X* ) c t h c k h a i b ol m t n g i b nt r o n gc u t r c X. n h n g i v i Y: : f ( X* ) p h i c k h a i b o , c ut r c Xp h i c k h a i b o ut i n ! yl g i i p h p . Nh nt h yr n gY: : f ( X* ) l y a c h c a m t X i t n g . i un yl r t q u a nt r n gb i v t r n hb i nd c hl u nb i t c c h v t q u a m t a c h , m l c a m t k c ht h c c n hk h n gp h t h u c v o i t n g c t h n gq u a , n g a yc k h i n k h n gc t h n gt i n y v k c ht h c c a c c l o i . N ub nc g n g v t q u a t o nb i t n g , t u yn h i n , t r n hb i nd c hp h i n h nt h yt o nb n hn g h a c ut r c c a X, p h i b i t k c ht h c v l mt h n o v t q u a n , t r c k h i n c h op h pb nk h a i b om t c h c n n gn h Y: : g( X ) . B n gc c hv t q u a a c h c a m t X, t r n hb i nd c hc h op h pb nt h c h i nm t l o i c i mk t h u t y c a Xt r c k h i t u y nb Y: : f ( X* ) . yl t h c h i nt r o n gt k h a i : c ut r cX ; T u y nb n yc h ng i nl c h ot r n hb i nd c hc m t c ut r c b n gt n , v v yn l OK c p nn n h mi nl b nk h n g i h i k i nt h c n h i uh nb t k t n . B yg i , t r o n gc ut r c X, c h c n n gY: : f ( X* ) c t h c k h a i b ol m t n g i b nk h n gc v n . N u b n c g n g k h a i b ot r c k h i t r n hb i nd c h n h nt h yn h n g c i mk t h u t y c h oY, n s c h ob nm t l i . yl m t t n hn n ga nt o n mb ot n hn h t q u nv l o i b l i . C h h a i k h c b nc h c n n g . L n g i ut i nt u y nb m t c h c n n gt o nc ub n ht h n gg( ) n h m t n g i b n. Nh n gg( ) k h n g c t r c t u y nb p h mv i t o nc u ! Nc h r ar n gb nc t h s d n g c c hn y n gt h i k h a i b oc c c h c n n gv c u n gc pc h on n g i b nt n h . N yk od i nt o nb c u t r c : b nc ut r cZ ; l m t l o i c i mk t h u t y c h oZ, v n ma n gl i c h ot o nb c ut r c b nt r n gt h i .

B nb l n gn h a u
T h c h i nm t c ut r c l n gn h a uk h n gt n gc h on t r u yc pv ot i nt h n hv i n . t h c h i n i un y , b n p h i t u nt h e om t h n ht h c c b i t : t h n h t , t u y nb ( k h n gx c n h ) c c c ut r c l n gn h a u , s a u k h a i b on n h m t n g i b n, v c u i c n gl x c n hc ut r c . n hn g h a c ut r c p h i c t c hb i t v i n g i b nt u y nb , n uk h n gn s c n h nt h yb i t r n hb i nd c hn h m t t h n hv i nk h n g . yl m t v d :
// :C 0 5 :N e s t F r i e n d . c p p //B nb l n gn h a u #I n c l u d e #B a og m< c s t r i n g >//m e m s e t( )s d n gt nm i nk h n gg i a nt i uc h u n ; c o n s ti n ts z=2 0 ; c ut r cC h { p r i v a t e : i n ta[ S Z ] ,c n gc h n g : l mm th i ul ck h it o( ) ; c ut r cP o i n t e r ; b n P o i n t e r ; c ut r cc o nt r { t n h n : C h *h ; i n t*p ; c n gc n g : l mm th i ul ck h it o( C h *h ) ; //d ic h u y nx u n gq u a n ht r o n g m n g : k h o n gt r n gc n h( ) ; k h o n gt r n gt r c( ) ; t r n g u( ) ; t r n gk tt h c( ) ; g i t r //T r u yc p : i n tr e a d( ) ; t r n gt h i tl p( i n ti ) ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 113/320

08/10/2013

Suy ngh trong C + +, Vol 1

} ; } ; t r n gC h : :k h it o( ){ m e m s e t( a ,0 ,s z*s i z e o f( i n t ) ) ; } t r n gC h : :P o i n t e r: :k h it o( C h *r v ){ h=r v ; p=r v >a ; } t r n gC h : :P o i n t e r: :t i pt h e o( ){ i f( p< &( h >a[ S Z-1 ] ) ) p++ ; } t r n gC h : :P o i n t e r: :t r c( ){ i f( p >&( h >a[ 0 ] ) )p; } k h o n gt r n gC h : :P o i n t e r: : u( ){ p=&( h >a[ 0 ] ) ; } t r n gC h : :P o i n t e r: :e n d( ){ p=&( h >a[ S Z-1 ] ) ; } i n tC h : :P o i n t e r: :r e a d( ){ r e t u r n*p ; } t r n gC h : :P o i n t e r: :s e t( i n ti ){ *P=i ; } i n tm a i n( ){ C h h ; C h : :P o i n t e rm l c ,H P 2 ; i n ti ; h . i n i t i a l i z e( ) ; h p . i n i t i a l i z e( &h ) ; h p 2 . i n i t i a l i z e( &h ) ; f o r( i=0 ;i < s z ;i++ ){ h p . s e t( i ) ; h p . n e x t( ) ; } h p . t o p( ) ; h p 2 . e n d( ) ; f o r ( i=0 ;i< s z ;i++ ){ c o u t< <" h p= "< <h p . r e a d( ) < <" ,H P 2= "< < h p 2 . r e a d( )< <e n d l ; h p . n e x t( ) ; h p 2 . p r e v i o u s( ) ; } }/// :~

M t k h i c o nt r c k h a i b o , n c c pq u y nt r u yc pc h oc c t h n hv i nr i n gc aC h b n gc c h n i r n g : n g ib nP o i n t e r ; C c C h c ut r c c h a m t m n gc a i n t s v c o nt r c h op h pb nt r u yc pc h n g . B i v c o nt r l i nq u a nc h t c h v i C h , l h pl l mc h on m t c c ut h n hv i nc a C h . Nh n gv c o nt r l m t l ph c r i n g b i t t C h , b nc t h l mn h i uh nm t n g i t r o n gs h t r o n gma i n( ) v s d n gc h n g l a c h nc c p h nk h c n h a uc a m n g . P o i n t e r l m t c ut r c t h a yv m t c o nt r Cl i u , v v yb nc t h mb or n gn s l u nl u n i m m t c c ha nt o nb nt r o n gC h . C c t i uc h u nt h v i nCc h c n n gme ms e t ( ) ( t r o n g< c s t r i n g >) c s d n g t h u nt i nt r o n gc h n gt r n h t r n . N t t t c c c b n h b t ut m t a c h c t h ( i s ut i n ) m t g i t r c b i t ( i s t h h a i ) c h o nb y t e q u a a c h b t u( nl s t h b a ) . T t n h i n , b nc t h c h ng i nl s d n gm t v n gl p l pq u a t t c c c b n h , n h n gme ms e t ( ) c s n , we l l t e s t e d( v v yn t c k h n n gb ns g i i t h i um t l i ) , v c l h i uq u h nn ub nm h o n b n gt a y .

N l t i n hk h i t ?
n hn g h a l pc u n gc pc h ob nm t n gm nk i mt o n , v v yb nc t h n h nt h yt n h nv ol ph c m c h c n n gc q u y ns a i c c b p h nk nc a l p . N um t c h c n n gl m t n g i b n, c n g h a l n k h n gp h i l m t t h n hv i n , n h n gb nmu nc h op h pc h n hs a d l i uc n h nn o , v n p h i c l i t k t r o n g n hn g h a l p m i n g i c t h t h yr n g l m t t r o n gn h n gc h c n n g c q u y n . C++l m t n g nn g h n g i t n gl a i , k h n gp h i l m t t r o n gs n g , v b n c t h mv o c c x u n gq u a n hv n t h c t m c yt r n gl n . Nl t t c h r a r n g i un yl mc h oc c n g nn g t h n" t i n h k h i t " , b i v C++ c t h i t k t h c d n g , k h n gk h a ok h t m t l t n gt r ut n g . C h n g4 n i r n gm t c ut r c b n gv nb nc h om t t r n hb i nd c hCv s a u b i nd c hv i C++s k h n g t h a y i . i un yc h y u c p nc c hb t r i t n gc a c ut r c , l , n i l ut r c h oc c b i nc n h n c t t r o n gb n h p h nb c h oc c i t n g . N uC++t r n hb i nd c ht h a y i c c hb t r c a Cs t r u c t s , s a u b t k m Cb n v i t r n gi n a d v i s a b l y t nd n gk i nt h c c a c c v t r c a c c b i nt r o n gc ut r c s p h v . K h i b nb t us d n gs p e c i f i e r s t r u yc p , t u yn h i n , b n c h u y nh o nt o nv oC++l n hv c , v m i t h t h a y i m t c h t . T r o n gm t " k h i t r u yc p " c t h ( m t n h mc c t k h a i c p h n n hb n gc c ht r u yc p s p e c i f i e r s ) , c c b i n c mb o c t r a l i nt c k n h a u , n h t r o n gC . T u yn h i n , n g nc h nt r u yc p c t h k h n gx u t h i nt r o n gc c i t n gt h e ot h t m b nk h a i b o. M c d t r n hb i nd c hs t h n g t c c k h i r a c h n hx c n h b nn h nt h yc h n g , k h n gc q u y n hv i u , b i v m t k i nt r c m yt n hc t h v /h o c m i t r n gh o t n gc t h c h t r r r n gc h ot i nv b ov c t h y uc un h n gk h i c t t r o n g c b i t v t r n h . c t n g nn g k h n gmu nh nc h l o i l i t h . T r u yc ps p e c i f i e r s l m t p h nc a c ut r c v k h n g n hh n g nc c i t n g c t or a t c ut r c . T t c c c t h n gt i n c i mk t h u t t r u yc pb i nm t t r c k h i c h n gt r n h c c h y , n i c h u n g i un yx yr a
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 114/320

B t r i t n g

08/10/2013

Suy ngh trong C + +, Vol 1

t r o n gq u t r n hb i nd c h . T r o n gm t c h n gt r n h a n gc h y , c c i t n gt r t h n h" k h uv c l ut r " v k h n gc g h n . N ub nt h c s mu n , b nc t h p h v t t c c c q u yt c v t r u yc pb n h t r c t i p , n h b nc t h t r o n gC . C++k h n g c t h i t k n g nc nb nl mn h n g i uk h n gk h nn g o a n . Nc h c u n g c pc h ob nv i m t d d n gh nn h i u , t h a yt h r t mo n gmu n . N i c h u n g , n k h n gp h i l m t t n gt t p h t h u c v ob t c i ug l t h c h i nc t h k h i b n a n g v i t m t c h n gt r n h . K h i b np h i c p h t h u c t h c h i nc t h , n gg i c h n gt r o n gm t c ut r c c h ob t k t h a y i p o r t i n g c t pt r u n g m t n i .

L p

K i ms o t t r u yc pl t h n g c g i l nt h c h i n. B a og mc c c c h c n n gt r o n gc ut r c ( t h n g c g i [ 3 3 ] l n gg i ) t or a m t l o i d l i uv i c c c t n hv h n hv i , n h n gk i ms o t t r u yc p t r a n hg i i t r o n g k i ud l i u , v h a i l d oq u a nt r n g . ut i nl t h i t l pn h n gg c c l pt r n hk h c hh n gc t h v k h n gt h s d n g . B nc t h x yd n gc c c c h n i b c a b nv oc ut r c m k h n gl ol n gm c c l pt r n h k h c hh n gs n g h r n gc c c c h n yl m t p h nc a g i a od i nh n ns d n g . N y nt r c t i pv ol d ot h h a i , m l t c hp h ng i a ot i pt v i c t h c h i n .N uc ut r c c s d n g t r o n gm t t ph pc c c h n gt r n h , n h n gc c l pt r n hk h c hh n gk h n gc t h l mb t c i ug n h n gg i t i nn h nc h oc c c n gg i a od i n , s a u b nc t h t h a y i b t c i ug l t i nm k h n gc np h i s a i m c a h . n gg i v k i ms o t t r u yc p , l yn h a u , p h t mi n hr a m t c i g h nm t Cc ut r c . C h n gt a a n g t r o n gt h g i i c a l pt r n hh n g i t n g , t r o n g m t c ut r c c mt m t l ph c c a c c i t n gn h b nmt m t l ph c c a c c l o i c h o c m t l ph c c a c c l o i c h i m: B t k i t n gt h u c l pn ys c h i a s n h n g c i mv h n hv i . l n h n gg k h a i b oc ut r c t r t h n hm t mt v c c ht t c c c i t n gt h u c l o i n ys x e mx t v h n h n g . T r o n gn g nn g h n g i t n gb a n u , S i mu l a 6 7 , t k h a h c c s d n g mt m t k i ud l i u m i . i un yd n gn h l yc mh n gt S t r o u s t r u p l a c h nc n gm t t k h o c h oC++ , n h nm n h r n g yl t m i mc a t o nb n g nn g : v i c t or a c c k i ud l i um i m c n h i uh nl c h Cs t r u c t s v i c h c n n g . i un yc h c c h nc v n h y b i nmi n hc h om t t k h a m i . T u yn h i n , v i c s d n gc c l pt r o n gC++ ng n t r t h n hm t t k h a k h n gc nt h i t . Ng i n gyh t c c c ut r c t k h a t r o n gh o nt o nm i p h n gd i nn g o i t r m t : l pm c n hl r i n gt , t r o n gk h i s t r u c t m c n hl c n gk h a i . D i yl h a i c ut r c s nx u t c n gm t k t q u :

// :C 0 5 :C l a s s . c p p //T n g n gc ut r cv l p s t r u c tA{ t i n : i n ti ,j ,k ;c n g : i n tf( ) ; t r n gg( ) ; } ; i n tA: :f( ){ r e t u r ni+j+k ; } t r n gA: :g( ){ i=j=k=0 ; } /K tq u /t r n g cs nx u tv i : l o iB{ i n ti ,j ,k ;c n g : i n tf( ) ; ( ) ; } ; i n tB: :f( ){ r e t u r ni+j+k ; } t r n gB: :g( ){ i=j=k=0 ; } i n tm a i n( ){ Aa ; a .f( ) ;a g( ) ; .bf( ) ;b g( ) ; }/// :~ Bb ;

t r n gg

C c l ph c l k h i n i m OOPc b nt r o n gC++ . Nl m t t r o n gn h n gt k h a s k h n g c t h i t l pi n m t r o n gc u ns c hn yn t r n nk h c h uv i m t t l p i l pl i t h n gx u y nS t h a y i nc c l ph c l r t q u a nt r n gm t i n g h i n g s t h c hS t r o u s t r u pc a s c c n m" l p . " s t r u c t r a h o nt o n , n h n gn h u c uv k h n n gt n gt h c hn g c v i Cs k h n gc h op h p i u . Nh i un g i t h c hp h o n gc c hc a v i c t or a c c l ph c l h nc ut r c n h t r nl pn h t h , b i v b ng h i l n" m c n h t o t i n" h n hv i c a c c l ph c b n gc c hb t uv i c n gc h n gc c y ut :


c l a s sX{ c n gc n g : l mm th i ul ci n t e r f a c e _ f u n c t i o n( ) ;t n h n :
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 115/320

08/10/2013

Suy ngh trong C + +, Vol 1

k h o n gt r n gp r i v a t e _ f u n c t i o n( ) ;

i n ti n t e r n a l _ r e p r e s e n t a t i o n ; } ;

L o g i c n gs a un yl n c n g h a h nc h on g i c x e mc c t h n hv i nq u a nt m ut i n , s a u h c t h b q u a b t c i ug m n i t i n. T r nt h c t , l d od u yn h t t t c c c t h n hv i nk h c p h i c k h a i b o t r o n gl p t t c c c q u t r n hb i nd c hb i t l mt h n ol nc c i t n g a n gc v c t h p h nb m t c c h h pl , v v v yn c t h mb ot n hn h t q u n . C c v d t r o n gc u ns c hn y , t u yn h i n , s a t i nt h n hv i n ut i n , n h t h n y :
c l a s sX{ t r n gp r i v a t e _ f u n c t i o n( ) ; i n t i n t e r n a l _ r e p r e s e n t a t i o n ,c n gc h n g : l mm th i ul ci n t e r f a c e _ f u n c t i o n( ) ; } ;

M t s n g i t h mc h i nn h n gr c r i c a t r a n gt r t nr i n gc a h :
l pY{ p u b l i c : v o i df( ) ;t n h n : i n tm X ; //" T t r a n gt r "t n } ;

V mX c nt r o n gp h mv i c a Y, c c m( i v i " t h n hv i n " ) l k h n gc nt h i t . T u yn h i n , t r o n gd n c n h i ub i nt o nc u( m t c i g b nn nc g n gt r n h , n h n gm i k h i k h n gt h t r n hk h i t r o n gc c d nh i nc ) , n l h u c h c t h p h nb i t b nt r o n gm t h mt h n hv i n n hn g h a d l i um l t o n c uv l m t t h n hv i n .

S t a s hs a i s d n gk i m s o tt r u yc p

Nl mc h ot i n ht h n c c c v d t C h n g4 v t h a y i c h n g s d n gc c l ph c v k i ms o t t r u y c p . C h p h nl pt r n hk h c hh n gc a g i a od i nh i nn a y c p h nb i t r r n g , v v yk h n gc k h n n g l pt r n hk h c hh n gv t n ht h a ot c m t p h nc a l pm h k h n gn n .

// :C 0 5 :S t a s h . h //C h u y n is a n gs d n gk i ms o tt r u yc p #I f n d e fS T A S H _ H #X c n hS T A S H _ H l pS t a s h{ i n ts i z e ; //K c ht h cc am ik h n gg i a n i n ts l n g ; / /S c h l ut r i n tt i pt h e o ; //k h n gg i a nt r n gT i p //T n gp h n b m n gb y t e : u n s i g n e dc h a r*l ut r ; t r n gt h ip h n g( i n tt n g ) ,c n gc h n g : k h it ok h o n gt r n g( i n ts i z e ) ; t r n gd nd p( ) ; i n ta d d ( v o i d*p h nt ) ; v o i d*l y( i n ti n d e x ) ; i n tc o u n t( ) ; } ; #E n d i f//S T A S H _ H/// :~

S t h i p h n g( ) c h c n n g c t h c h i nr i n gt b i v n c h c s d n gb i c c a d d( ) c h c n n gv d o l m t p h nc a v i c t h c h i nc b n , k h n gp h i g i a od i n . i un yc n g h a r n g , k h n gl us a u , b nc t h t h a y i v i c t h c h i nc b n s d n gm t h t h n gk h c n h a u q u nl b n h . K h c v i t nc a t pt i nb a og m, c c t i u t r nl i ud u yn h t l c t h a y i c h ov d n y . C c t p t i nt h c t h i v k i mt r a t pt i nl g i n gn h a u .

S a i n g nx ps d n gk i m s o tt r u yc p

Nh m t v d t h h a i , yl n g nx pb i nt h n hm t l p . B yg i c c c ut r c d l i ul n gn h a ul t i n, l t t pb i v n mb or n gc c l pt r n hk h c hh n gs k h n gp h i n h nv on c n gk h n gt h p h t h u c v og i t r n i t i c a s t a c k:

// :C 0 5 :S t a c k 2 . h C ut r c//l n gn h a ut h n gq u ad a n hs c hl i nk t #I f n d e fS T A C K 2 _ H #X c n hS T A C K 2 _ H l pS t a c k{ c ut r cl i nk t{ v o i d*d l i u , t r n gk h it o( v o i d*d a t ,*L i nk tN X T ) ; }* u ,c n gc h n g : l mm th i ul ck h it o( ) ; t r n g y( v o i d*d a t ) ; *( ) ; v o i d*p o p( ) ; d nd pk h o n gt r n g( ) ; } ; #E n d i f//S T A C K 2 _ H/// :~

l i nk t*t i pt h e o ;

v o i d

Nh t r c y , v i c t h c h i nk h n gt h a y i v v v yn k h n g c n h c l i y . T h n g h i m, c n gl g i n gh t n h a u . i ud u yn h t l c t h a y i l s v n gm n hc a g i a od i nl p . G i t r t h c c a k i ms o t
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 116/320

08/10/2013

Suy ngh trong C + +, Vol 1

t r u yc pl n g nc nb nv t q u a r a n hg i i t r o n gq u t r n hp h t t r i n . T r o n gt h c t , t r n hb i nd c hl i u d u yn h t m b i t v m c b ov c a c c t h n hv i nl p . K h n gc t h n gt i nk i ms o t t r u yc pv o c s a i t nt h n hv i nma n gt h n gq u a c c m i l i nk t . T t c c c k i mt r a b ov c t h c h i nb i t r n hb i nd c h , n b i nm t b i t h i g i a nc h y . C h r n gg i a od i nt r n hb yc h oc c l pt r n hv i nl k h c hh n gb yg i t h c s l c a m t yx u n gs t a c k . Nx yr a c t h c h i nn h m t d a n hs c hl i nk t , n h n gb nc t h t h a y i i u m k h n g n hh n gg c c l pt r n ht n gt c v i k h c hh n g , h o c ( q u a nt r n gh n ) l m t d n gd u yn h t c a m s k h c hh n g .

X l c cl ph c

K i ms o t t r u yc pt r o n gC++c h op h pb nt c hb i t g i a od i nt v i c t h c h i n , n h n g nt h c h i nc h l m t p h n . T r n hb i nd c hv np h i x e mt k h a i c h ot t c c c p h nc a m t i t n g t or a v v nd n gn n g c c h . B nc t h t n gt n gm t n g nn g l pt r n hm c h y uc ug i a od i nc n gc n gc a m t i t n gv c h op h pt h c h i nt i c n , n h n gC++t h c h i nv i c k i mt r a k i ut n h( t i t h i g i a nb i nd c h ) c n gn h i u c n gt t . i un yc n g h a r n gb ns h c c n gs mc n gt t n uc m t l i . Nc n gc n g h a l c h n gt r n h c a b nh i uq u h n . T u yn h i n , b a og mc v i c t h c h i nt i nc h a i t c d n g : v i c t h c h i nc t h n h nt h y n g a yc k h i b nk h n gt h d d n gt r u yc pv on , v n c t h g yr a k h n gc nb i nd c hl i . M t s d nk h n gc k h n n gt h c h i nc a h c t h n h nt h yc c l pt r n hv i nk h c hh n g . Nc t h h i n t h t h n gt i nc h i nl c t r o n gm t t pt i nt i u t h v i nm c c c n gt yk h n gmu nc u n gc pc h o i t h c n h t r a n h . B nc t h l mv i c t r nm t h t h n gn i m a nn i n hl m t v n m t t h u t t o nm h a , c h n gh nv b nk h n gmu n l b t k ma n hm i t r o n gm t t pt i nt i u m c t h g i pm i n g i g i i m . Ho c b nc t h t t h v i nc a b nt r o n gm t " t h c h " m i t r n g , n i m c c l pt r n hv i ns t r c t i pt r u yc p c c t h n hp h nt n h nd s a o , s d n gc o nt r v c . T r o n gt t c n h n gt n hh u n gn y , l g i t r c c ut r c t h c t b i ns o nt r o n gm t t pt i nt h c h i nc h k h n gp h i l t i px c t r o n gm t t pt i nt i u .

C h ed us t h ch i n

G i m b i nd c hl i

Qu nl d nt r o n gm i t r n gl pt r n hc a b ns g yr a m t b i nd c hl i c a m t t pt i nn ut pt i n l c m n g( c n g h a l , s a i ) h o c n um t t pt i n l p h t h u c v oc n g h a l , m t t pt i nt i u b a og ml c m n g . i un yc n g h a l b t c l c n ob nt h c h i nm t s t h a y i nm t l ph c , c h od l g i a od i nc n gc n gh o c c h oc c T k h a i t h n hv i nt n h n , b ns b u c m t b i nd c hl i b t c i ug b a o g mc t pt i nt i u . i un yt h n g c g i l m o n g m a n h l p c s v n . i v i m t d nl nt r o n gg i a i o n un yc t h r t k h s d n gv v i c t h c h i nc b nc t h t h a y i t h n gx u y n , n ud nl r t l n , t h i g i a nb i nd c hc t h n g nc mq u a yv n gn h a n h . [ 3 4 ] K t h u t g i i q u y t i un y i k h i c g i l l p x l h o c " c o nm oC h e s h i r e " t t c m i t h v v i c t h c h i nb i nm t n g o i t r m t c o nt r d u yn h t , " . n c i " C o nt r l m t c ut r c c n g h a l t r o n gc c t pt i n t h c t h i c n gv i t t c c c n hn g h a h mt h n hv i n . V v y , mi nl g i a od i nk h n gt h a y i , c c t pt i nt i u l b n hh n g . V i c t h c h i nc t h t h a y i t h e omu n , v c h c t pt i nt h c t h i c np h i c b i nd c h l i v r e l i n k e dv i d n . D i yl m t v d ng i nt h h i nk t h u t n y . C c t pt i nt i u c h a c h c g i a od i nc n gc n gv m t c o nt r d u yn h t c a m t l ph c k h n g y q u y n h :

// :C 0 5 :H a n d l e . h //X l c cl ph c #I f n d e fH A N D L E _ H #X c n hH A N D L E _ H X l l p{ c ut r cC h e s h i r e ;//C l a s sk h a ic h C h e s h i r e*n c i ,c n gc h n g : l mm th i ul ck h it o( ) ; t r n gd nd p( ) ; i n t r e a d( ) ; k h o n gt r n gt h a y i( i n t ) ; } ; #E n d i f//H A N D L E _ H/// :~

yl t t c c c l pt r n hk h c hh n gc t h n h nt h y . D n gc ut r cC h e s h i r e ; l m t l o i c i mk t h u t k h n g y h o c k h a i b o l p ( M t l p h c n h n g h a b a og mc t h c a l p . ) Nn i v i t r n hb i nd c hr n gC h e s h i r e l m t t nc ut r c , n h n gn k h n g a r a b t k c h i t i t v c ut r c . yl c h t h n gt i n t or a m t c o nt r nc ut r c , b nk h n g t h t or a m t i t n gc h o nk h i c t h c ut r c c c u n gc p . T r o n gk t h u t n y , c t h c ut r c c n i t r o n gc c t pt i nt h c h i n :
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 117/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 0 5 :H a n d l e . c p p{ O } //X l t h ch i n #B a og m" H a n d l e . h " #B a og m" . ./R e q u i r e . h " //X c n ht h ch i nX l c a : c ut r cX l : :C h e s h i r e{ i n ti ; } ; k h o n gt r n gx l : :k h it o( ){ n c i=n e wC h e s h i r e , n c i >i=0 ; } t r n gX l : :c l e a n u p( ){ x an c i ; } i n tX l : :r e a d( ){ t r l in c i >i ; } t r n gX l : :t h a y i( i n tx ){ n c i >i=x ; }/// :~

C h e s h i r el m t c ut r c l n gn h a u , v v yn p h i c x c n hv i p h ng i i p h mv i : X l c ut r c
: :C h e s h i r e{

T r o n gx l : : k h i t o( , l ut r c p h nb c h om t ) C h e s h i r e c ut r c , v t r o n gX l : : d nd p(l ut r n y c p h t h n h . n y) l ut r c s d n gt h a yc h ot t c c c y ut d l i ub nt h n g a v oc c t i n p h nl p . K h i b nb i nd c hHa n d l e . c p p, n hn g h a c ut r c n y c n i t r o n gc c t pt i n i t n gm k h n ga i c t h n h nt h yn . N ub nt h a y i c c y ut c a C h e s h i r e , c c t pt i nd u yn h t m p h i c b i n d c hl i l Ha n d l e . c p pv c c t pt i nt i u l b n hh n g . V i c s d n gX l g i n gn h v i c s d n gb t k l ph c : b a og mt i u , t oc c i t n g , v g i t i nn h n .
// :C 0 5 :U s e H a n d l e . c p p //{ L }X l //S d n gl pX l #B a og m" H a n d l e . h " i n tm a i n( ){ X l u ; u . i n i t i a l i z e( ) ; u . r e a d( ) ; u . c h a n g e( 1 ) ; u . c l e a n u p( ) ; }/// :~

i ud u yn h t m c c l pt r n hk h c hh n gc t h t r u yc pl g i a od i nc n gc n g , d o , mi nl v i c t h c h i n l i ud u yn h t m t h a y i , c c t pt i nt r nk h n gb a og i c nb i nd c hl i . Nh v y , m c d i un yk h n g p h i l h o nh ot h c h i n n , l m t c i t i nl n .

T mt t

K i ms o t t r u yc pt r o n gC++c h op h pk i ms o t c g i t r c h ot c g i c a m t l p . Ng i s d n gc a l pc t h t h yr c h n hx c n h n gg h c t h s d n gv n h n gg b q u a . Qu a nt r n gh n , m c d , l k h n n g mb or n gk h n gc l pt r n hk h c hh n gt r n np h t h u c v ob t k p h nn oc a v i c t h c h i nc b nc a m t l p . N ub nb i t i un yl t c g i c a l p , b nc t h t h a y i c i t c s v i s h i ub i t r n gk h n gl p t r n hk h c hh n gs b n hh n gb i n h n gt h a y i b i v h k h n gt h t r u yc pm t p h nc a l p . K h i b nc k h n n gt h a y i v i c t h c h i nc b n , b nc t h k h n gc h c i t h i nt h i t k c a b nt i m t t h i g i a ns a u , n h n gb nc n gc q u y nt d o l mc h on h n gs a i l m. K h n gc v n n h t h n oc nt h nb n c k h o c hv t h i t k , b ns p h ms a i l m. B i t r n gn l t n g i a nt o n l mc h on h n gs a i l mn yc n g h a l b ns c t h n g h i mn h i uh n , b ns h c n h a n hh n , v b ns h o nt h n hd ns mh n . G i a od i nc n gc n g nm t l ph c l n h n gg c c l pt r n hk h c hh n gk h n g n h nt h y , v v y l p h n q u a nt r n gn h t c a l p c c " q u y n " t r o n gq u t r n hp h nt c hv t h i t k . Nh n gt h mc h c h op h pb n m t s m t n h i ut h i g i a n t h a y i . N ub nk h n gc c g i a od i nn g a yl n ut i n , b nc t h t h m n h i uc h c n n gh n , mi nl b nk h n gl o i b b t k k h c hh n g l pt r n h c s d n gt r o n gm c a h .

B i t p
1.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

T om t l ph c v i c n gc h n g, t i n, v b ov c c t h n hv i nd l i uv c c t h n hv i nc h c n n g . T om t i t n gc a l pn yv t h yl o i t h n g i pt r n hb i nd c hb nn h n c k h i b nc g n g t r u yc pt t c c c t h n hv i nl p .
118/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

2.

3. 4. 5. 6.

7. 8.

9. 10. 11. 12. 13. 14.

V i t m t c ut r c g i l L i bc c h a b a c h u i i t n gmt , bv c . T r o n gma i n( ) t or a m t L i b i t n g c g i l x v g nc h ox a , x bv x c . I nr a c c g i t r . B yg i t h a yt h mt , bv c v i m t l o t c c c h u i [ 3 ] . C h ot h ym c a b nt r o n gma i n( ) p h v n h m t k t q u c a s t h a y i . B y g i t om t l pg i l l i b c , v i t c h u i i t n gmt , bv c , v c c c h c n n gt h n hv i ns e t a ( ) , g e t a ( ) , s e t b( ) , g e t b( ) , s e t c ( ) , v g e t c ( ) t h i t l pv n h n c c c g i t r . V i t c h n h( ) n h t r c y . B yg i t h a y i t c h u i i t n gmt , bv c m t t i nm n gc a c h u i [ 3 ] . C h ot h yc c m t r o n gma i n( ) k h n gk h n g p h v n h m t k t q u c a s t h a y i . T om t l pv t o nc ub nc h c n n gt h a ot n gc c t i nd l i ut r o n gl p . V i t h a i l ph c , m i t r o n gs c m t c h c n n gt h n hv i nm p h i m t m t c o nt r nm t i t n gc a l pk h c . T or a t r n gh pc a c h a i i t n gt r o n gma i n( ) v g i h mt h n hv i nn i t r nt r o n gm i l p . T ob a l p . L ph c ut i nc t i nd l i u , v b a nc h ob n c l pt h h a i v nm t c h c n n g t h n hv i nc a l pt h b a . T r o n gma i n( ) , c h n gmi n hr n gt t c c c c n gv i c m t c c hc h n hx c . T om t He nl p . B nt r o n g , m t t Y nl p . T r o n g T , t t r n gl p . M i l pn nc m t h i nt h ( ) c h c n n gt h n hv i n . T r o n gma i n( ) , t or a m t t h h i nc a m i l pv g i h i nt h ( ) c h c n n gc h om i m t . S a i t p6 Y nv t r n gm i c h a t i nd l i u . C pt n hb n c h op h pc c l ph c k mt h e o t r u yc pv o yt i nd l i u . T om t l pv i c c t h n hv i nd l i up h nt nt r o n gn h i uc n gc n g, t n h n , v b ov p h n . T h m m t c h c n n gt h n hv i ns h o wMa p( ) m i nt nc a m i t h n hv i nd l i uv a c h c a h . N uc t h , b i nd c hv c h yc h n gt r n hn yt r nn h i uh nm t t r n hb i nd c hv /h o c m y t n hv /h o c h i uh n h x e ml i uc s k h c b i t t r o n gb t r c c i t n g . s a oc h pt h c h i nv k i mt r a c c t pt i nc h oS t a s ht r o n gc h n g4 b nc t h b i nd c hv k i mt r a S t a s h . ht r o n gc h n gn y . t c c i t n gc a He nl pt t p6 t r o n gm t S t a s h. L yc h n gr a v i nr a ( n ub n k h n gl m n h v y , b ns c np h i t h m He n: : i n( ) . S a oc h pt h c h i nv k i mt r a c c t pt i n n g nx pt r o n gC h n g4 b nc t h b i nd c hv k i mt r a S t a c k 2 . ht r o n gc h n gn y . t c c i t n gc a He nl pt t p6 t r o n gm t n g nx p. L yc h n gr a v i nr a ( n ub n k h n g l mn h v y , b ns c np h i t h m He n: : i n( ) . S a i C h e s h i r e t r o n gHa n d l e . c p p, v x c mi n hr n gq u nl d nc a b nr e c o mp i l e s v c h r e l i n k s t pt i nn y , n h n gk h n gb i nd c hl i U s e Ha n d l e . c p p. T om t S t a c k Of I n t l p( m t c h n g g i i n t s ) b n gc c hs d n g" c o nm oC h e s h i r e " k t h u t m g i u i n h n gc ut r c d l i uc pt h pb ns d n g l ut r c c p h nt t r o n gm t l p c g i l S t a c k I mp. T h c h i nh a i p h i nb nc a S t a c k I mp: m t l s d n gm t m n gc n hc h i ud i c a i n t , v m t t r o n g s d n gm t < i n t >v e c t o r . C k c ht h c t i a c i s nc h oc h n g , d o b n k h n gc np h i l ol n gv v i c m r n gm n gt r o n gp h i nb n ut i n . L ur n gc c S t a c k Of I n t . h l ph c k h n gp h i t h a y i v i S t a c k I mp.

i un yk h n gc h c u n gc pm t i mt h n gn h t c h i um t t h n hp h nt h v i n , n h n gn c n gg i pg i u i t nc a c c c h c n n gt r o n gt nl p . T r o n gC h n g5 , k i ms o t t r u yc p( nt h c h i n ) c g i i t h i u . i u n yc h op h pc c n h t h i t k n gc pm t c c h t h i t l pr a n hg i i r r n g x c n hn h n gg c c l pt r n h k h c hh n g c p h pt h a ot c v n h n gg l r a g i i h n . Nc n g h a l c c c c h n i b c a h o t n gm t k i ud l i uc a t h u c q u y nk i ms o t v q u y t n hc a c c n h t h i t k n gc p , v n r r n gc h oc c l p t r n hk h c hh n gn h n gg h c t h v c c t h n hv i nn nc h n . C n gn h a u , n gg i v k i ms o t t r u yc pt h c h i nm t b c q u a nt r n gt r o n gv i c c i t h i nd s d n gt h v i n . K h i n i m" k i ud l i um i " m h c u n gc pl t t h nt r o n gm t s c c hh ns ov i h i nt i c x yd n g t r o n gc c l o i d l i ut C . C++c t h c u n gc pt y p e c h e c k i n gb o mc h ol o i d l i uv d o mb om t m c a nt o nk h i m k i ud l i ul c s d n g . K h i n i na nt o n , t u yn h i n , c r t n h i ut r n hb i nd c hc t h l mc h oc h n gt a h ns ov i Cc u n gc p . T r o n g n yv t n gl a i c h n g , b ns t h yt n hn n gb s u n g c t h i t k s a n gC++m l mc h oc c l i t r o n g c h n gt r n hc a b ng nn h n h yr a n g o i v l yb n , i k h i t r c k h i b nb i nd c hc h n gt r n h , n h n g t h n g d n gc c c n hb ot r n hb i nd c hv c c l i . V l d on y , b ns s mq u e nv i k c hb nk h n gt h n g h e c v r n gm t c h n gt r n hC+m b i nd c ht h n gc h yn g a yl n ut i n . Ha i t r o n gs c c v n a nt o nl k h i t ov d nd p . M t b p h nl nc a Cl i x yr a k h i c c l pt r n hv i n q u n k h i t oh o c l ms c hm t b i n . i un y c b i t n gv i c c t h v i nC , k h i l pt r n hk h c hh n g


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 119/320

08/10/2013

Suy ngh trong C + +, Vol 1

k h n gb i t l mt h n o k h i t om t c ut r c , h o c t h mc h l h p h i . ( T h v i nt h n gk h n gb a og m m t c h c n n gk h i t o , v v yc c l pt r n hk h c hh n gb u c p h i k h i t oc c c ut r c b n gt a y . ) C l e a n u pl m t v n c b i t v c c l pt r n hCc mt h yt h o i m i v i q u nv c c b i ns a uk h i c h o nt h n h , v v yb t k l m s c hl nr n gc t h c nt h i t c h om t t h v i nc ut r c t h n g c b q u a . T r o n gC++ , k h i n i mv k h i t ov d nd pl i uc nt h i t s d n gt h v i nd d n gv l o i b n h i u l i v i t x yr a k h i l pt r n hk h c hh n gq u n t h c h i nc c h o t n gn y . C h n gn yx e mx t c c t n hn n g t r o n gC++c t h t r g i p mb ok h i t ot h c hh pv d nd p .

K h i t o mb ov i c cn h x yd n g

C S t a s hv n g nx pl p c n hn g h a t r c yc m t c h c n n gg i l k h i t o( , m g i b i t nc a n r n gn p h i ) c g i t r c k h i s d n gc c i t n gt r o n gb t k c c hn ok h c . T h t k h n gma y , i un yc n g h a l c c l pt r n hk h c hh n gp h i mb ok h i t ot h c hh p . L pt r n hk h c hh n gd b b l c h i t i t n h k h i t ot r o n gc a h h pt p v i v n g l mt h v i nt u y t v i c a b ng i i q u y t v n c a h . T r o n gC++ , k h i t ol q u q u a nt r n g l i c h oc c l pt r n hk h c hh n g . C c n h t h i t k l pc t h mb ok h i c a m i i t n gb n gc c hc u n gc pm t c h c n n g c b i t c g i l x y d n g . N um t l pc m t n h x yd n g , t r n hb i nd c ht n gg i x yd n gm t i t h i i m m t i t n g c t or a , t r c k h i l pt r n hk h c hh n g c t h c c b nt a yc a h t r nc c i t n g . C u c g i x yd n gk h n gp h i l n g a yc m t l a c h nc h oc c l pt r n hv i nc a k h c hh n g , n c t h c h i nb i t r n hb i nd c ht i t h i i m i t n g c x c n h . T h c ht h c t i pt h e ol n h n gg t t nc h oc h c n n gn y . C h a i v n . ut i nl b t k t nb ns d n g l c i g c k h n n gc t h x u n g t v i m t t nb nc t h mu ns d n gn h m t t h n hv i nt r o n gl p . T h h a i l v t r n hb i nd c hl n h i mv k ug i c c n h x yd n g , n l u nl u np h i b i t c h mn o g i . C c g i i p h pS t r o u s t r u p c h nd n gn h d n h t v h pl n h t : t nc a c c n h x yd n gc n gg i n gn h t nc a l p . Nc n g h a r n gm t c h c n n gn h v ys c g i l t n gk h i t ot r n .

c l a s sX{ i n ti ;c n gc n g : X( ) ; //C o n s t r u c t o r } ;

D i yl m t l p ng i nv i m t n h x yd n g :

B yg i , k h i m t i t n g c x c n h ,
v o i df( ){ Xa ; //. . . }

i ut n gt s x yr a n un h mt l m t i n t : l ut r c p h nb c h oc c i t n g . Nh n gk h i c h n gt r n h nc c i mt r n h t ( i mt h i ) m mt c x c n h , c c n h x yd n g c g i l t n g . l , c c t r n hb i n d c hl n gl c h nc c c u c g i nX: : X( ) c h o i t n gmt t i t h i i mx c n h . G i n gn h b t k c h c n n g t h n hv i n , ( b m t ) s ut i n c c n h x yd n gl n yc o nt r a c h c a i t n gm n a n g c g i . T r o n gt r n gh pc a c c n h x yd n g , t u yn h i n , i un y c t r t i m t k h i c h a k h i t ob n h , v l c n gv i c c a c c n h x yd n g k h i t ob n h i un y n g . G i n gn h b t k c h c n n g , c c n h x yd n gc t h c i s c h op h pb n x c n hl mt h n om t i t n g c t or a , c h on g i t r k h i t o , v n h v y . i s n h x yd n gc u n gc pc h ob nm t c c h mb o r n gt t c c c p h nc a i t n gc a b n c k h i t og i t r t h c hh p . V d , n um t l pc yc m t n h x y d n gm p h i m t m t i s s n g u y nd u yn h t b i ut h c h i uc a oc a c y , s a u b np h i t om t i t n g c yn h t h n y :
C yt( 1 2 ) ; c y//1 2 c h n

N uc y( i n t ) l x yd n gd u yn h t c a b n , t r n hb i nd c hs k h n gc h op h pb nt om t i t n gb t k c c h n ok h c . ( C h n gt i s x e mx t n h i un h x yd n gv c c ht h c k h c n h a u g i x yd n gt r o n gc h n gk t i p . ) l t h c s t t c c m t n h x yd n g , l m t c h c n n gc t n c b i t c g i l t n gb i t r n hb i n d c hc h om i i t n gt i t h i i ms n gt oc a i t n g . M c d n ng i n , n l c b i t c g i t r b i v n g i pl o i b m t l pl nc c v n v l mc h om d d n gh n v i t v c . T r o n g o nm t r c , v d , b nk h n gn h nt h ym t c u c g i c h c n n gr r n g m t s k h i t o(c h c n n g l k h i n i m) r i n gb i t t n hn g h a . T r o n gC++ , n hn g h a v k h i t ol n h n gk h i n i mt h n gn h t b nk h n gt h c m t m k h n gc s k h c . C c c n h x yd n gv h mh yl c c l o i b t t h n gc a c c c h c n n g : h k h n gc g i t r t r v . i un yl k h c b i t t m t k h o n gt r n gg i t r t r v , t r o n g c h c n n gt r v k h n gc g n h n gb nv nc t yc h n l mc h on m t c i g k h c . D n gv h mh yt r l i k h n gc g v b nk h n gc m t l a c h n . C c h n hv i
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 120/320

08/10/2013

Suy ngh trong C + +, Vol 1

a m t i t n gv ov r a k h i c h n gt r n hr t c b i t , g i n gn h s i n ht , v t r n hb i nd c hl u nl u nl m c h oc h c n n gt g i m n h , c h c c h nr n gc h n gx yr a . N uc m t g i t r t r v , v n ub nc t h c h nr i n g c a b n , t r n hb i nd c hs b n gc c hn o p h i b i t n h n gg l mv i c c g i t r t r v , h o c c c l pt r n h k h c hh n gs p h i g i m t c c hr r n gd n gv h mh y , m s l o i b a nt o n .

D nd p mb ov i c cd e s t r u c t o r

L m t l pt r n hC , b nt h n gn g h v t mq u a nt r n gc a v i c k h i t o , n h n gn h i mh n s u yn g h v d n d p . S a uk h i t t c , n h n gg b nc nl m l ms c hm t i n t ? C h c nq u nn . T u yn h i n , v i c c t h v i n , c h c n" b u n g " c a m t i t n gk h i b n a n gt h c h i nv i n k h n gp h i l q u a nt o n . N un i m t s p h n c n g , h o c t m t c i g t r nm nh n h , h o c p h nb l ut r t r nh e a p ? N ub nc h c nq u nn i , i t n gc a b nk h n gb a og i t c n gc a k h i x u t c n hc a n t t h g i i n y . T r o n gC++ , d nd pc n g q u a nt r n gn h k h i t ov d o c mb ov i s h y . C p h pc a h mh yt n gt n h c h oc c n h x yd n g : t nl p c s d n gc h ot nc a c c c h c n n g . T u y n h i n , c c d e s t r u c t o r c p h nb i t v i c c n h x yd n gb i m t d un g h n g u( ~) . Ng o i r a , c c d e s t r u c t o r k h n gb a og i c b t k i s v p h h yk h n gb a og i c nb t k t yc h n . yl t u y nb c h om t d e s t r u c t o r :


~Y( ) ;

l pY{ p u b l i c : } ;

D e s t r u c t o r c g i l t n gb i t r n hb i nd c hk h i i t n g i r a k h i p h mv i . B nc t h t h yc c n h x y d n g c g i l b i c c i m n hn g h a c a c c i t n g , n h n gb n gc h n gd u yn h t c h om t c u c g i d e s t r u c t o r l d un g o c n gp h mv i b a oq u a n h i t n g . T u yn h i n , h yv nc n c g i l , n g a yc k h i b n s d n gg o t o n h yr a k h i m t p h mv i . ( g o t ov nc nt nt i t r o n gC++t n gt h c hn g c v i Cv c h o n h n gl nk h i n c c h . ) B nn nl ur n gm t g o t o k h n g c c b , t h c h i nb i Ct i uc h u nt h v i nc h c n n g s e t j mp( ) v l o n g j mp( ) , k h n gg yh y c g i l . ( yl c i mk t h u t , n g a yc k h i t r n hb i nd c hc a b nk h n gt h c h i nn t h e oc c h . D a v om t t n hn n gm k h n gp h i l t r o n gc c c i mk t h u t c n g h a l m c a b nl n o n p o r t a b l e . ) D i yl m t v d mi n hh o c c t n hn n gc a c c h md n gv h mh yb n n h nt h yc h o nn a y :


// :C 0 6 :C o n s t r u c t o r 1 . c p p //N h x yd n gv h mh y#i n c l u d eu s i n gn a m e s p a c es t d ; l pT r e e{ i n tc h i uc a o ,c n gc h n g : C y( i n ti n i t i a l H e i g h t ) ; //C o n s t r u c t o r ~T r e e ( ) ; // D e s t r u c t o r k h o n gt r n g l n( i n t n m ) ; t r n gp r i n t s i z e( ) ; } ; C y: :T r e e( i n ti n i t i a l H e i g h t ){ } h e i g h t=i n i t i a l H e i g h t ;

C y: :~T r e e( ){ c o u t< <" t r o n gc yh y "< <e n d l ; p r i n t s i z e( ) ; } t r n gT r e e: :p h tt r i n( i n tn m ){ c h i uc a o+=n m ; } t r n gT r e e: :p r i n t s i z e( ){ c o u t< <" C h i uc a oc yl "< <c h i uc a o< <e n d l ; } i n tm a i n( ){ c o u t< <" t r ck h im c p "< <e n d l ; { T r e et( 1 2 ) ; c o u t< <" s a uk h ic yt o "< <e n d l ; t . p r i n t s i z e( ) ; t . g r o w( 4 ) ; c o u t< <" t r ck h ic h tc p "< <e n d l ; } c o u t< <" s a uk h i n gc p "< <e n d l ; }/// :~

yl ur a c a c c c h n gt r n ht r n :
t r ck h im c ps a uk h it oc yC h i uc a oc yl 1 2t r ck h i c h tc pt r o n gc yh yc h i uc a oc yl 1 6s a uk h ik tt h cc p

L o i b c ck h i n hn g h a

B nc t h t h yr n gh mh y c t n gg i v od un g o c n gp h mv i m b a oq u a n hn . T r o n gC , b np h i l u nl u nx c n ht t c c c b i n uc a m t k h i , s a uk h i c c d un g o c m . yk h n g p h i l m t y uc up h b i nt r o n gn g nn g l pt r n h , v c c l d o a r a t h n g c r n g l " p h o n gc c h l pt r n ht t . " V i mn y , t i c n g h i n g c a t i . Nl u nl u nc v b t t i nv i t i , n h m t l pt r n hv i n , b t t r l i v o uc a m t k h i m i k h i t i c nm t b i nm i . T i c n gt mt h ym d c h nk h i n hn g h a b i ng n i ms d n gc a n .
121/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

C l n h n gl pl u nn yp h o n gc c h . T r o n gC++ , t u yn h i n , c m t v n q u a nt r n gt r o n gb b u c p h i x c n ht t c c c i t n g uc a m t p h mv i . N um t n h x yd n gt nt i , n p h i c g i k h i i t n g c t or a . T u yn h i n , n uc c n h x yd n gc m t h o c n h i u i s k h i t o , l mt h n o b nb i t b ns c t h n gt i nk h i uc a m t p h mv i ? T r o n gt n hh n hl pt r n hc h u n g , b ns k h n g . B i v Ck h n gc k h i n i m r i n gt , s t c hb i t n yc a n hn g h a v k h i t ol k h n gc v n . T u yn h i n , C++ , mb or n gk h i m t i t n g c t or a , n c n g n gt h i k h i t o . i un y mb or n gb ns k h n gc i t n gc h a c k h i c h yx u n gq u a n ht r o n gh t h n gc a b n . Ck h n gq u a nt m, t r o n gt h c t , Ck h u y nk h c h t h c h n hn y i [ 3 5 ] h i b np h i x c n hc c b i nv o uc a m t k h i t r c k h i b nn h t t h i t p h i c t h n gt i nk h i t o . Nh nc h u n g , C++s k h n gc h op h pb nt om t i t n gt r c k h i b nc t h n gt i nk h i t oc h oc c n h x y d n g . B i v i un y , n g nn g n ys k h n gk h t h i n ub np h i x c n hc c b i nv o uc a m t p h mv i . T r o n gt h c t , p h o n gc c hc a n g nn g d n gn h k h u y nk h c hc c n hn g h a c a m t i t n gc n gg n n t h i i ms d n gc a n c n gt t . T r o n gC++ , b t k q u yt c pd n gc h om t " i t n g " t n g c p n m t i t n gc a m t l o i t c hh pl t t . i un yc n g h a r n gb t k l p i t n gh o c b i nt c hh pt r o n gl o i c n gc t h c q u y n ht i b t k i mn ot r o n gm t p h mv i . Nc n gc n g h a l b nc t h c h i c h o nk h i b nc n h n gt h n gt i nc h om t b i nt r c k h i x c n hn , v v yb nl u nc t h x c n hv k h i t oc n gm t l c :


// :C 0 6 :D e f i n e I n i t i a l i z e . c p p //X c n hb i nb tc n in o #B a og m" . ./R e q u i r e . h " #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; l pG{ i n ti ;c n gc n g : G( i n ti i ) ; } ; G: :G( i n ti i ){ i=i i ; } i n tm a i n( ){ c o u t< <" g i t r k h it o " ; i n tr e t v a l=0 ; r e t v a l ; c nt h i t( r e t v a l=0 ) ; i n ty=r e t v a l+3 ; Gg( y ) ; }/// :~

c i n> >

B nc t h t h ym t s m c t h c t h i , s a u r e t v a l c n hn g h a , k h i t o , v c s d n g b t n g i d n g uv o , v s a u yv g c x c n h . C , m t k h c , k h n gc h op h pm t b i n c x c n hb t c n i n on g o i t r v o up h mv i . N i c h u n g , b nn nx c n hc c b i nn h g nv i q u a n i mc a h s d n gc n gt t , v l u nl u nk h i t o c h n gk h i c h n g c n hn g h a . ( yl m t g i p h o n gc c hv i n h i ut c hh p , n i k h i l t yc h n . ) yl m t v n a nt o n . B n gc c hg i mt h i g i a ns nc c a b i nt r o n gp h mv i , b n a n gl mg i mc h i n s b l md n gt r o n gm t s p h nk h c c a p h mv i . Ng o i r a , k h n n g c c c i t h i nb i v n g i c k h n gp h i n h yq u a l i b t uc a p h mv i b i t l o i c a m t b i n .

c h ov n g

T r o n gC++ , b nt h n gs t h ym t c h ot r u yc pv n gl p c x c n hn g a yt r o n gc h ob i ut h c :
c o u t< <" j= "< <k< <e n d l ; c o u t< <" i= "< <i< <e n d l ;

f o r( i n tj=0 ;j< 1 0 0 ;j++ ){ }F o r( i n ti=0 ;i< 1 0 0 ;i++ )

C c b oc ot r nl t r n gh p c b i t q u a nt r n g , g yn h ml nc h on g i m i t r n hC++ . C c b i ni v j c x c n ht r c t i pb nt r o n g b i ut h c ( m b nk h n gt h l mt r o n gC ) . H l s a u c s n s d n gt r o n gc h ov n gl p . l m t c p h pr t t h u nt i nv b i c n hl o i b t t c c c c uh i v m c c h c a t i v j , d o b nk h n gc np h i s d n gt nv d u y nn h i _ l o o p _ c o u n t e r c h or r n g . T u yn h i n , m t s n h ml nc t h x yr a n ub nmo n g i i s n gc a c c b i ni v j m r n gr a n g o i p h m [ 3 6 ] v i c a v n gl pf o r h k h n g . C h n g3 c h r a r n gt r o n gk h i v c h u y n i b oc on yc n gc h op h p n hn g h a c a c c i t n gt r o n g b i ut h c k i ms o t c a h , m c d s d n g i un yd n gn h t q u a nt r n gh nv i c h ov n gl p . X e mr a c h oc c b i n a p h n gm g i ub i nt p h mv i k mt h e o . N i c h u n g , b n gc c hs d n gc n gt nc h o [ 3 7 ] m t b i nl n gn h a uv m t b i nl t o nc uv i p h mv i l k h h i uv d g yl i . T i t mt h yp h mv i n h l m t c h s c a t h i t k t t . N ub nc n h i ut r a n gc h om t c h c n n gd u yn h t , c l
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 122/320

08/10/2013

Suy ngh trong C + +, Vol 1

b n a n gc g n gl mq u n h i uv i c h c n n g . Nh i uc h c n n gh nh t k h n gc h h u c hh n , n h n gn c n gd d n gh n t ml i .

C pp h tb n h

M t b i nc t h c q u y n ht i b t k i mn ot r o n gm t p h mv i , v v yn c v n h l ut r c h om t b i nc t h k h n g c x c n hc h o nt h i i mc a n hn g h a . Nt h c s n h i uk h n n gl t r n hb i nd c hs t h e o c c t h c h n ht r o n gCp h nb t t c c c l ut r c h om t p h mv i n pm p h mv i . Nk h n gq u a nt r n gb i v , n h m t l pt r n hv i n , b nk h n gt h t r u yc pl ut r ( h a yc ng i l i t n g ) c h o nk h i n c x c [ 3 8 ] n h . M c d l ut r c p h nb v o uc a k h i , c c c u c g i x yd n gk h n gx yr a c h o nk h i c c i mt r n ht m c c i t n g c n hn g h a b i v c c n hd a n hl k h n gc s nc h o nk h i . T r n hb i n d c ht h mc h k i mt r a c h c c h nr n gb nk h n g t n hn g h a i t n g( v d o g i x yd n g ) n i m c c i mt r n ht c h c i uk i n i q u a n , c h n gh nn h t r o n gm t c h u y n i t u y nb h o c m t n i n o m t g o t oc t h n h yq u a n . U n c o mme n t i n gc c b oc ot r o n g o nm s a us t or a m t c n hb oh o c m t l i :

// :C 0 6 :N o j u m p . c p p //K h n gt h n h yq u ax yd n g c l a s sX{ c n g : X( ) ; } ; X: :X( ){ } v o i df( i n ti ){ i f( i< 1 0 ){ // !g o t oj u m p 1 ;//L i :g o t ob q u ai n i t } Xx 1 ; //C o n s t r u c t o rg i y j u m p 1 : c h u y n i( i ){ T r n gh p1 : Xx 2 ; //C o n s t r u c t o rg i y p h v ; // !T r n gh p2 ://L i :t r n gh pb q u ai n i t y p h v ; } } i n tm a i n( ){ f( 9 ) , f( 1 1 ) ; }/// :~

Xx 3 ;

//C o n s t r u c t o rg i

T r o n g o nm t r n , c h a i g o t ov c h u y n i c k h n n gc t h n h yq u a c c i mt r n ht m m t n h x y d n g c g i l . i t n gm s a u s c t r o n gp h mv i n g a yc k h i c c n h x yd n g k h n g c g i , n nt r n hb i nd c hc h om t t h n gb ol i . i un ym t l nn a mb or n gm t i t n gk h n gt h c t o r a t r k h i n c n g c k h i t o . T t c c c c pp h t b n h t h ol u n yx yr a , t t n h i n , t r ns t a c k . L ut r c c pp h t b i c c t r n hb i n d c hb n gc c hd i c h u y nc o nt r n g nx p" x u n g " ( m t t h u t n g t n g i , c t h t h ys g i a t n gh o c g i m g i t r t h c t c o nt r n g nx p , p h t h u c v om yt n hc a b n ) . i t n gc n gc t h c c pp h t t r nh e a p s d n gmi , l m t c i g c h n gt a s k h mp h t h mt r o n gC h n g1 3 . C c v d t c h n gt r c c c h c n n gr r n gr n gb n x yd n gv h mh y : k h i t o(v ) ( ) . yl S t a s h us d n gd n gv h mh y : d nd p

S t a s hv i n h x yd n gv h mh y

// :C 0 6 :S t a s h 2 . h //V ix yd n gv h mh y #I f n d e fS T A S H 2 _ H #X c n hS T A S H 2 _ H l pS t a s h{ i n ts i z e ; //K c ht h cc am ik h n gg i a n i n ts l n g ; // S c h l ut r i n tt i pt h e o ; //k h n gg i a nt r n gT i p //T n gp h nb m n gb y t e : u n s i g n e dc h a r*l ut r ; t r n gt h ip h n g( i n tt n g ) ;c n gc n g : S t a s h( i n ts i z e ) ; ~S t a s h( ) ; i n ta d d( v o i d*p h nt ) ; v o i d* l y( i n ti n d e x ) ; i n tc o u n t( ) ; } ; #E n d i f//S T A S H 2 _ H/// :~

C c n hn g h a h mt h n hv i nc h c t h a y i l k h i t o( v ) d nd p( ) , c t h a yt h b n gm t c o n s t r u c t o r v d e s t r u c t o r :
// :C 0 6 :S t a s h 2 . c p p{ O } //N h x yd n gv h mh y #B a og m" S t a s h 2 . h " #B a og m" . ./R e q u i r e . h " #I n c l u d e#i n c l u d e< c a s s e r t >s d n gt nm i nk h n gg i a nt i uc h u n ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 123/320

08/10/2013

Suy ngh trong C + +, Vol 1

c o n s ti n tt n g=1 0 0 ; S t a s h: :S t a s h( i n tS Z ){ s i z e=s z ; s l n g=0 ; l ut r =0 ; t i pt h e o= 0 ; } i n tS t a s h: :t h m( v o i d*y ut ){ i f( s a u >=s l n g )/k h n gg i a n/ l i ? t n gl n( t n g ) ; //S a oc h pp h nt v ol ut r , //b t ut k h n gg i a n t r n gb nc n h : i n ts t a r t B y t e s=t i pt h e o*K c ht h c ; u n s i g n e dc h a r*e= ( u n s i g n e dc h a r* )y ut ; f o r( i n ti=0 ;i< k c ht h c ;i++ ) l ut r [ s t a r t B y t e s+i ]=e[ i ] ; t i pt h e o++ ; t r l i( t i pt h e o-1 ) ;//C h s } v o i d*s t a s h: :l y( i n ti n d e x ){ y uc u( 0< =c h s ," S t a s h: :l y( )c h s " ) ; i f( i n d e x >=t i pt h e o ) t r v 0 ;// c h ot h yc u ic n g //S nx u tc o nt r np h nt m o n gm u n : t r l iv ( l ut r [ i n d e x*s i z e ] ) ; } i n tS t a s h: :c o u n t( ){ t r l it i pt h e o ;//S p h nt t r o n gC S t a s h } t r n gs t a s h: :t h ip h n g( i n tt n g ){ y uc u( t n g >0 , " S t a s h: :t h ip h n gt n gk h n gh a yt i uc c " ) ; i n tn e w Q u a n t i t y=s l n g+t n g ; i n tn e w B y t e s=n e w Q u a n t i t y*K c ht h c ; i n to l d B y t e s=s l n g*K c ht h c ; u n s i g n e d c h a r*b=n e wu n s i g n e dc h a r[ n e w B y t e s ] ; f o r( i n ti=0 ;i< o l d B y t e s ;i++ ) b[ i ]= l ut r [ i ] ;//S a oc h pc nm i x a[ ]( l ut r ) ;//l ut r C l ut r =b ;// i mt ib n h m i s l n g=n e w Q u a n t i t y ; }

S t a s h: :~S t a s h( ){ i f( l ut r =0 ){ e n d l ; x a[ ]l ut r ; } }/// :~

c o u t< <" g i ip h n gl ut r "< <

B nc t h t h yr n gr e q u i r e . hc h c n n g a n g c s d n g t h e od i c c l i l pt r n h , t h a yv k h n g n h( ) . ur a c a m t t h t b i k h n g n h( ) k h n gp h i l h u c hn h c a r e q u i r e . hc h c n n g( t r o n g s c h i n t h t r o n gc u ns c hn y ) . V t h i p h n g( ) l t n h n , c c hd u yn h t m t y uc u( ) c t h t h t b i n ul m t t r o n gn h n gc h c n n gt h n h v i nk h c v t n h t h n gq u a m t g i t r k h n gc h n hx c t h i p h n g( ) . N ub nc h c c h n i un yk h n g t h x yr a , b nc t h x e mx t l o i b c c y uc u( ) , n h n gb nc t h g h i n h r n gc h o nk h i l p n n h , l u n c k h n n gm m i c t h c t h mv oc c l ph c m c t h g yr a l i . C h i p h c a c c y uc u( ) l t h p( v c t h c t n gl o i b b n gc c hs d n gt i nx l ) v g i t r c a m v n gm n hl c a o . T h n gb ot r o n gc h n gt r n ht h n g h i ms a u yn h t h n o n hn g h a c h oS t a s h i t n gx u t h i nn g a y t r c k h i h l c nt h i t , v l mt h n ok h i t ox u t h i nn h l m t p h nc a n hn g h a , t r o n gd a n hs c h i s n h x yd n g :
// :C 0 6 :S t a s h 2 T e s t . c p p //{ L }S t a s h 2 //N h x yd n gv h mh y #B a og m" S t a s h 2 . h " #B a og m" . ./R e q u i r e . h " #B a og m< f s t r e a m > #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ S t a s hi n t S t a s h( s i z e o f( i n t ) ) ; f o r( i n ti=0 ;i< 1 0 0 ;i++ ) i n t S t a s h . a d d ( &i ) ; f o r( i n tj=0 ;j< i n t S t a s h . c o u n t( ) ;j++ ) c o u t< <"i n t S t a s h . f e t c h ( " < <k< < " )=" < <*( I n t* )i n t S t a s h . f e t c h( j ) < <E n d l ; c o n s ti n tB U F S I Z E=8 0 ; S t a s hs t r i n g S t a s h( s i z e o f( c h a r )*B U F S I Z E ) ; i f s t r e a mt r o n g( " S t a s h 2 T e s t . c p p " ) ; m b o( t r o n g" S t a s h 2 T e s t . c p p " ) ; n gd y , t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) s t r i n g S t a s h . a d d( ( c h a r* )l i n e . c _ s t r( ) ) ; i n tk=0 ; c h a r*c p ; t r o n gk h i( ( c p= ( c h a r* ) !s t r i n g S t a s h . f e t c h( k++ ) )=0 ) c o u t< <" s t r i n g S t a s h . f e t c h( "< <k< <" )= " < <C p< <e n d l ; }/// :~

C n gn h nt h yn h t h n od nd p( ) c c c u c g i c l o i b , n h n gc c h mh yv nc nt n gg i k h i i n t S t a s hv s t r i n g S t a s h i r a k h i p h mv i . M t i uc np h i n h nt h c c t r o n gS t a s hv d : t i l r t c nt h n c h s d n g c x yd n gt r o n gc c l o i , l n h n gn g i k h n gc h mh y . N ub n c g n gs a oc h pc c i t n gl pv oS t a s h, b ns c h yv ot t c c c l o i c a c c v n v n s k h n gl mv i c n g . T i uc h u nC++T h v i nt h c s c t h
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 124/320

08/10/2013

Suy ngh trong C + +, Vol 1

l mb ns a oc h n hx c c a c c i t n gt r o n gc c t h n gc h a c a n , n h n g yl m t q u t r n hk h l nx nv p h c t p . T r o n gp h nt i pt h e on g nx pV d , b ns t h yr n gc o nt r c s d n g t r n hn v n n y , v t r o n gm t c h n gs a u , S t a s hs c c h u y n i n s d n gc o nt r .

Ng nx pv i n h x yd n gv h mh y
// :C 0 6 :S t a c k 3 . h //V ix yd n g/h y #I f n d e fS T A C K 3 _ H #X c n hS T A C K 3 _ H l pS t a c k{ c ut r cl i nk t{ v o i d*d l i u , l i nk t*t i pt h e o ; L i nk t( v o i d*d a t ,*L i nk tN X T ) ; ~L i n k( ) ; }* u ,c n gc h n g : S t a c k( ) ; ~S t a c k( ) ; t r n g y( v o i d*d a t ) ; v o i d*( ) ; v o i d*p o p( ) ; } ; #E n d i f//S T A C K 3 _ H/// :~

R e i mp l e me n t i n gd a n hs c hl i nk t ( t r o n gs t a c k) v i n h t h uv h yc h ot h yc c hg ng n gd n gv h mh y l mv i c v i c c mi v x a . yl t pt i nt i u s a i :

K h n gc h n g nx pc m t c o n s t r u c t o r v d e s t r u c t o r , n h n gn h v yk h n gc c l pl n gn h a ul i nk t :
// :C 0 6 :S t a c k 3 . c p p{ O } //N h x yd n g/h y #B a og m" S t a c k 3 . h "#b a og ms d n gt nm i nk h n gg i a nt i uc h u n " /r e q u i r e . h . . " ; N g nx p: :L i nk t: :L i nk t( v o i d*d a t ,*L i nk tN X T ){ t i pt h e o=n x t ; } N g nx p: :L i nk t: :~L i n k( ){ } N g nx p: :S t a c k( ){ u=0 ; } l mm th i ul cs t a c k: :p u s h( v o i d*d a t ){ u=n e wl i nk t ( d a t ,n g i n g u ) ; } v o i d*s t a c k: :( ){ y uc u( u=0 ," s px pt r n g " ) ; u >t r l id l i u ; } v o i d*s t a c k: :p o p( ){ i f( u= =0 )r e t u r n0 ; v o i d*k t q u = u >d l i u , l i nk t*o l d H e a d= u ; u= u >t i p t h e o ; x ao l d H e a d , k tq u t r v ; } N g nx p: :~S t a c k( ){ y uc u( u= =0 ," s px pk h n gt r n g " ) ; }/// :~ d a t a=d a t ;

C c l i nk t : : L i nk t (x yd n gc h ng i nl k h i t o) d l i uv t i pt h e oc o nt r , v v yt r o n gs t a c k: : p u s h(d n g) u=n e wl i nk t( d a t ,n g i n g u ) ; k h n gc h p h nb m t l i nk t m i ( s d n g i t n gs n gt on n g n gv i c c t k h o mi , c g i i t h i u t r o n gc h n g4 ) , n h n gn c n gg ng n gk h i t oc c c o nt r c h ol i nk t . B nc t h t h i t i s a oc c d e s t r u c t o r c h ol i nk t k h n gl mb t c i ug c b i t l , t i s a on k h n gx a c c d l i uc o nt r ? C h a i v n . T r o n gc h n g4 , n i m c c n g nx p c g i i t h i u , n c h r a r n gb n k h n gt h k h n g n gc c hx a m t k h o n gt r n gc o nt r n un t r t i m t i t n g( m t k h n g n hr n gs c c h n gmi n ht r o n gC h n g1 3 ) . Nh n gt r o n gNg o i r a , n uc c l i nk t h yx a c c d l i uc o nt r , p o p( ) s k t t h c t r v m t c o nt r nm t i t n gb x a , m c h c c h ns l m t l i . i un y i k h i c g i l v n q u y ns h u: s l i nk t v d o n g nx pc h g i c o nt r , n h n gk h n gc h ut r c hn h i ml ms c hc h n g . i un yc n g h a r n gb np h i r t c nt h nm b nb i t a i l c h ut r c hn h i m. V d , n ub nk h n gb t ( ) v x a t t c c c g i v c c n g nx p, h s k h n gc c l ms c ht n gb i c c n g nx ph y' s . i un yc t h l m t v n d n hv d n nr r b n h , v v yb i t a i c h ut r c hn h i md nd pm t i t n gc t h l m c h o s k h c b i t g i a m t c h n gt r n ht h n hc n gv m t l i m t l l d ot i s a os t a c k: : ~S t a c k( i nm t t h n g b ol i n u) n g nx p i t n gl k h n gc s np h mn ok h i t i uh y .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 125/320

08/10/2013

Suy ngh trong C + +, Vol 1

B i v v i c p h nb v d nd pc c l i nk t i t n g c nb nt r o n gn g nx p l m t p h nc a v i c t h c h i nc b nb nk h n gn h nt h yn x yr a t r o n gc h n gt r n ht h n g h i m, m c d b nl c h ut r c hn h i mc h o v i c x a c c c o nt r m t r l i t c a s p o p( ) :
// :C 0 6 :S t a c k 3 T e s t . c p p //{ L }S t a c k 3 //{ T }S t a c k 3 T e s t . c p p //N h x yd n g/h y #B a og m" S t a c k 3 . h " #B a og m" . ./R e q u i r e . h " #B a og m< f s t r e a m > #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ r e q u i r e A r g s( a r g c ,1 ) ;//t pt i nt nl t h a ms t r o n gi f s t r e a m( a r g v[ 1 ] ) ; mb o( t r o n g ,a r g v[ 1 ] ) ; s t a c kt e x t l i n e s ; d n g c h u i; // ct pt i nv d n gl ut r t r o n gn g nx p : t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) t e x t l i n e s . p u s h( m ic h u i( d n g ) ) ; //P o p n gt n g nx pv i nr a : c h u i*s ; t r o n gk h i( (s=( s t r i n g* )t e x t l i n e s . p o p( ) )=0 ){ ! c o u t< <*s< <e n d l ; x as ; } }/// :~

K h i t ot n gh p

T r o n gt r n gh pn y , t t c c c d n gt r o n gt e x t l i n e s c x u t h i nv x a b , n h n gn uc h n gk h n g c , b ns n h n c m t y uc u( ) t i nn h n c n g h a l c m t r r b n h . M t t n g h p c h l n h n gg n g i n gn h mt h a n h : m t l o t c c i uk t t v i n h a u . n hn g h a n yb a og m t ph pc a c c l o i h nh p , n h c ut r c s v l pe s . M t m n gl m t t n gh pc a m t l o i d u yn h t .

U nk h i t oc t h d b l i v t n h t . C++t n g k h i l mc h on a nt o nh nn h i u . K h i b nt om t i t n g l m t t n gh p , t t c c c b np h i l ml t h c h i nm t n h i mv , v k h i t os c c h ms c b i t r n hb i n d c h . Nh i mv n yc k h n h i uh n gv , t yt h u c v ol o i t n gh pb n a n gx l , n h n gt r o n gm i t r n g h pc c y ut t r o n gv i c c h u y nn h n gp h i c b a oq u a n hb i d un g o c n h n . i v i m t m n gc ac c l o i t c hh pn yl k h ng i n : i n ta[ 5 ]={ 1 ,2 ,3 ,4 ,5 } ; N ub nc g n g c u n gc pc h ok h i t oh nc n h n gy ut m n g , t r n hb i nd c hc h om t t h n gb ol i . Nh n gn h n gg s x yr a n ub nc u n gc pc h o t k h i t o ? V d : i n tb[ 6 ]={ 0 } ; y , t r n hb i nd c hs s d n gk h i t o ut i nc h oc c p h nt m n g ut i n , v s a u s d n gs k h n g c h ot t c c c y ut m k h n gc nk h i t o . Nh nt h yh n hv i k h i t on yk h n gx yr a n ub nx c n hm t m n gm k h n gc m t d a n hs c hk h i t o . V v y , c c b i uh i nt r nl m t c c hn g ng n k h i t om t m n g k h n g , m k h n gs d n gc h ov n gl p , v k h n gc b t k k h n n gm t l i o f f b y m t ( T yt h u c v ot r n h b i nd c h , n c n gc t h c h i uq u h nc h ov n gl p . ) M t c c hv i t t t t h h a i c h om n gl m t n g, t r o n g b n c h oc c t r n hb i nd c hx c n hk c ht h c c a m n gd a t r ns l n gk h i t o : i n tc[ ]={ 1 ,2 ,3 ,4 } ; B yg i , n ub nq u y t n ht h m m t y ut k h c v om n g , b nc h c nt h mk h i t ok h c . N ub nc t h t m c a b nl nv v yn c np h i c t h a y i t r o n gc h c m t v t r , b ng i mn g u yc s a i s t t r o n gq u t r n h s a i . Nh n gl mt h n o b nx c n hk c ht h c c a m n g ? C c b i uh i ns i z e o f c / s i z e o f * ( k c ht h c c a t o nb m n gc h i a c k c ht h c c a c c y ut ut i n ) h i nc c t r i c kt r o n gm t c c hm k h n gc np h i t h a y i [ 3 9 ] n ut h a y i k c ht h c m n g :


f o r( i n ti=0 ;i< s i z e o fc/s i z e o f*c ;i++ ) c[ i ]++ ;

B i v c ut r c c n gl t ph p , c h n gc t h c k h i t ot r o n gm t t h i t r a n gt n gt . B i v m t C p h o n g c c hc ut r c c t t c c c t h n hv i nc a n c n gk h a i , h c t h c c h n ht r c t i p :
c ut r cX{ } ; i n ti ; f l o a tf ; c h a rc ;

Xx 1={ 1 ,2 , 2 ,' c ' } ;

N ub nc m t m n gc c i t n gn y , b nc t h k h i t oc h n gb n gc c hs d n gm t b l n gn h a uc a c c d un g o c n h nc h ot n g i t n g :
Xx 2[ 3 ]={ { 1 ,1 , 1 ,' a ' } ,{ 2 ,2 . 2 ,' b ' } } ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 126/320

08/10/2013

Suy ngh trong C + +, Vol 1

y , i t n gt h b a c k h i t ob n gk h n g . N ub t k c a c c t h n hv i nd l i ur i n gt ( m t h n gl t r n gh pc a m t l ph c c t h i t k t r o n gC+ + ) , h o c n g a yc k h i t t c m i t h c a c n gc h n gn h n gc m t n h x yd n g , m i t h k h c . T r o n gv d t r n , k h i t o c p h nc n gt r c t i p nc c y ut c a t n gh p , n h n gx yd n gl m t c c h b u c k h i x y r a t h n gq u a m t g i a od i nc h n ht h c . y , c c n h t h up h i c g i t h c h i nv i c k h i t o . V v y , n u b nc m t c ut r c t r n gn h t h n y ,
c ut r cY{ } ; f l o a tf ; i n ti ; Y( i n ta ) ;

B np h i c h r a c c c u c g i x yd n g . P h n gp h pt t n h t l m t t r o n gn h n gr r n gn h s a u :
Yy 1[ ]={ Y( 1 ) ,Y( 2 ) ,Y( 3 ) } ;

B ns c c b a i t n gv b a c u c g i x yd n g . B t k t h i g i a nb nc m t n h x yd n g , c h od l m t c ut r c v i t t c c c t h n hv i nc n gc n gh o c m t l ph c v i t i nt h n hv i nd l i u , t t c c c k h i t op h i i q u a c c n h x yd n g , n g a yc k h i b n a n gs d n gk h i t ot n gh p . D i yl m t v d t h h a i c h ot h yn h i u i s n h x yd n g :
// :C 0 6 :M u l t i a r g . c p p //N h i u is n h x yd n g //K h it ov it n gh p #I n c l u d eu s i n gn a m e s p a c es t d ; l pZ{ i n ti ,j ;c n gc n g : Z( i ii n t ,i n tj j ) ; i n( )v o i d ; } ; Z: :Z( i ii n t ,i n tj j ){ i=i i ; j=j j ; } t r n gZ: :i n( ){ c o u t< <" i= "< <i< <" ,j= "< <k< <e n d l ; } i n tm a i n( ){ Zz z[ ]={ Z( 1 , 2 ) ,Z( 3 , 4 ) ,Z( 5 , 6 ) ,Z( 7 , 8 ) } ; f o r( i n ti=0 ;i ;i< s i z e o fz z/s i z e o f*z z ) i n( )z z[ i ] ; .}/// :~

C h r n gn t r n gg i n gn h m t n h x yd n gr r n g c g i l c h ot n g i t n gt r o n gm n g .

X yd n g m c n h

M t c o n s t r u c t o r m c n h l m t t r o n g c t h c g i l k h n gc i s . M t c o n s t r u c t o r m c n h c s d n g t or a m t " i t n gv a n i , " n h n gn c n gq u a nt r n gk h i t r n hb i nd c hl n i t or a m t i t n g n h n gk h n g c a r a b t k c h i t i t . V d , n ub nc n h n gc ut r c Y c x c n ht r c v s d n g n t r o n gm t n hn g h a n h t h n y , t r n hb i nd c hs p h nn nr n gn k h n gt h t mt h ym t c o n s t r u c t o r m c n h . i t n gt h h a i t r o n gm n g mu n c t or a k h n gc i s , v l n i m c c t r n hb i nd c ht mk i m m t c o n s t r u c t o r m c n h . T r o n g t h c t , n ub nc h ng i nl x c n hm t m n gc a Y i t n g ,

Yy 2[ 2 ]={ Y( 1 ) } ;

Yy 3[ 7 ] ;

t r n hb i nd c hs p h nn nv n p h i c m t c o n s t r u c t o r m c n h k h i t ot t c c c i t n gt r o n gm n g . C n gm t v n x yr a n ub nt om t i t n gc n h nn h t h n y :
YY 4 ;

H yn h r n g , n ub nc m t n h x yd n g , t r n hb i nd c h mb ox yd n gm l u nl u nx yr a , b t k t n h h n h . C c n h x yd n gm c n hl r t q u a nt r n gm n u( v c h n u ) k h n gc n h x yd n gc h om t c ut r c ( c u t r c h o c l p) , t r n hb i nd c hs t n gt oc h ob n . V v y , c n gt r n hn y :
// :C 0 6 :A u t o D e f a u l t C o n s t r u c t o r . c p p //T n g t or ac o n s t r u c t o rm c n h l pV{ i n ti ; //t i n } ;//K h n gx yd n g i n tm a i n( ){
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 127/320

08/10/2013

Suy ngh trong C + +, Vol 1

Vv ,v 2[ 1 0 ] ; }/// :~

N uc x yd n g c x c n h , t u yn h i n , v k h n gc c o n s t r u c t o r m c n h , c c t r n gh pc a V t r ns t o r a l i t h i g i a nb i nd c h . B nc t h n g h r n gc c n h x yd n gt r n hb i nd c ht n gh pn nl m m t s k h i t ot h n gmi n h , n h t h i t l p t t c c c b n h c h oc c i t n gk h n g . Nh n gn k h n gm c t h mc h i p h t h mn h n gl n g o i t mk i m s o t c a l pt r n hv i n . N ub nmu nb n h p h i c k h i t ob n gk h n g , b np h i l m i u c h om n h b n gc c hv i t c c n h x yd n gm c n hm t c c hr r n g . M c d t r n hb i nd c hs t or a m t c o n s t r u c t o r m c n hc h ob n , h n hv i c a c c n h x yd n gt r n hb i nd c h t n gh pl h i mk h i n h n gg b nmu n . B nn nx l t n hn n gn yn h m t m n gl i a nt o n , n h n gs d n g m t c c ht i t k i m. N i c h u n g , b nn nx c n hn h t h uc a b nm t c c hr r n gv k h n gc h op h pt r n hb i n d c h l m i u c h ob n .

T mt t

C c c c h d n gn h p h c t pc u n gc pb i C++s c h ob nm t g i m n hm v t mq u a nt r n g t t r nk h i t ov d nd pt r o n gn g nn g . Nh S t r o u s t r u p c t h i t k C++ , m t t r o n gn h n gq u a ns t ut i n n g t h c h i nv n n gs u t t r o n gCl m t p h nq u a nt r n gc a c c v n l pt r n hl d ok h i t ok h n g n gc c h c a c c b i n . C c l o i l i r t k h t m, v c c v n t n gt pd n g d nd pk h n g n g . V d n gv h m h yc h op h pb n mb o k h i t ot h c hh pv d nd p( t r n hb i nd c hs k h n g c h op h pm t i t n g c t or a v b p h h ym k h n gc nx yd n gt h c hh pv c c c u c g i d e s t r u c t o r ) , b ns c c k i ms o t v a nt o nt u y t i . K h i t ot n gh p c b a og mt r o n gm t t n hm c ht n gt n n g nc nb nt n h n gs a i l mk h i t o i n h n hv i t ph pc a c c l o i c x yd n gt r o n gv l mc h om c a b ng ng n gh n . A nt o nt r o n gq u t r n hm h a l m t v n l nt r o n gC++ . K h i t ov d nd pl m t p h nq u a nt r n gc a i un y , n h n gb nc n gs t h yv n a nt o nk h c n h c u ns c ht i nb .

B i t p
1. 2. 3.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

4. 5.

6. 7. 8. 9. 10.

V i t m t l ph c ng i n c g i l ng i nv i m t n h x yd n gm i nm t c i g c h ob n b i t r n gn c g i l . T r o n gma i n( ) l mc h om t i t n gc a l ph c . T h m m t d e s t r u c t o r b i t p1 m i nr a m t t h n g i pc h ob nb i t r n gn c g i l . S a i t p2 c c t n gl pc c h a m t i n t t h n hv i n . S a i c c n h x yd n g n m t m t i n t l pl u nr n gn l ut r o n gc c t h n hv i nl p . C c c n h x yd n gv h yn ni nr a c c i n t g i t r n h m t p h nc a t h n g i pc a h , v v yb nc t h x e mc c i t n gk h i c h n g c t or a v b p h h y . C h n gmi n hr n gh mh yv nc n c g i l n g a yc k h i g o t o c s d n g n h yr a k h i m t v n gl p . V i t h a i c h ov n gm i nr a c c g i t r t s k h n g n1 0 . T r o n gl n ut i n , x c n hc c v n gl p t r u yc pt r c k h i c h ov n gl p , v t r o n gl nt h h a i , x c n hc c t r u yc pl pt r o n gb i ut h c k i m s o t c a c h ov n gl p . i v i p h nt h h a i c a b i t pn y , s a i c c n hd a n ht r o n gl nt h h a i c h ov n gl p n n h c n gt nv i b mv n gl pc h ol n g i ut i nv x e mn h n gg t r n h b i nd c hc a b nk h n g . S a i Ha n d l e . h, Ha n d l e . c p p, v U s e Ha n d l e . c p pf i l e c u i C h n g5 s d n gc c h md n gv h mh y . S d n gk h i t ot n gh p t or a m t l o t c c i m b nx c n hk c ht h c c a m n gn h n g k h n gc u n gc p c c y ut . I nr a m n gn ys d n gs i z e o f x c n hk c ht h c c a m n g . B y g i t or a m t l o t c c i s d n gk h i t ot n gh pv t n ht n g . I nr a m n g . S d n gk h i t ot n gh p t or a m t l o t c c c h u i i t n g . T or a m t n g nx p t c h c n h n gc h u i s v b c q u a m n gc a b n , ym i c h u i t r nc a b nn g nx p. C u i c n g , b t c c c h u i s t t c a b nn g nx pv i nm i m t . T h h i nt n ht n gk h i t ov t n gh pv i m t l o t c c i t n gc a l pm b nt or a t r o n gt p3 . T h m m t c h c n n gt h n hv i nc h or n gl ph c m i nm t t h n gb o . T n ht o nk c ht h c c a m n gv d i c h u y nq u a n , g i c h c n n gt h n hv i nm i c a b n . T om t l pm k h n gc b t k n h t h u , v c h ot h yr n gb nc t h t oc c i t n gv i c c n h x yd n gm c n h . B yg i t or a m t n h x yd n gn o n d e f a u l t ( m t v i m t t h a ms ) c h oc c l p h c , v c g n gb i ns o nl i . G i i t h c hn h n gg x yr a .
128/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

K h i b nt om t i t n g( m t b i n ) , b n t t nc h om t k h uv c l ut r . M t c h c n n gl m t t nc h om t h n h n g . B n gc c hl mc h oc c t n mt h t h n g b nt a y , b nt or a m t c h n gt r n hd d n gh nc h o n h nd nh i uv t h a y i . l r t n h i un h v i t v nx u i m c t i ul g i a ot i pv i c g i c a b n . M t v n p h t s i n hk h i l pb n c c k h i n i mv s c t h i t r o n gn g nn g l o i n g i v om t n g nn g l p t r n h . T h n gt h n g , c n gm t t d i nt m t s n g h a k h c n h a u , t yt h u c v ob i c n h . C n g h a l , m t t c n h i un g h a l q u t i . i un yl r t h u c h , c b i t l k h i n i ns k h c b i t n gk . B nn i " r a o , r a x e . " Ns l n g n g n b b u c p h i n i , " s h i r t _ wa s hc h i c o , c a r _ wa s hx e " c h n g i n g h e k h n gp h i t h c h i nb t k s k h c b i t v h n h n gt h c h i n . Ng nn g c a c o nn g i c x yd n g t r o n gd p h n g , v v yn g a yc k h i b nb l m t v i t , b nv nc t h x c n hn g h a . C h n gt a k h n gc n n hd a n hd u yn h t c h n gt a c t h s u yr a n g h a t n g c n h . H uh t c c n g nn g l pt r n h , t u yn h i n , y uc ub np h i c m t n hd a n hd u yn h t c h om i c h c n n g . N u b nc b a l o i k h c n h a uc a d l i um b nmu ni n : i n t , c h a r , v f l o a t , b nt h n gp h i t or a b a t nc h c n n gk h c n h a u , v d , p r i n t _ i n t ( ) , p r i n t _ c h a r ( v ) p r i n t _ f l o a t ( T i c c c n gv i c p h . ) t r nb nn h b n v i t c h n gt r n h , v c g i k h i h c g n g h i un . T r o n gC++ , m t y ut k h c b u c q u t i c a t nc h c n n g : c c n h x yd n g . B i v t nc a n h x yd n g c x c n ht r c b i c c t nc a l p , c v n h c h c t h c m t n h x yd n g . Nh n gn ub nmu nt or a m t i t n gt r o n gn h i uc c h ? V d , g i s b nx yd n gm t l ph c m c t h k h i t oc h n hn t r o n gm t c c ht i uc h u nv c n gc t h b n gc c h c t h n gt i nt m t t pt i n . B nc nh a i x yd n g , m t t r o n g k h n gc i s ( c c n h x yd n gm c n h ) v m t t r o n g c m t c h u i n h m t t h a ms , l t nc a t p t i n k h i t oc c i t n g . C h a i ul n h x yd n g , v v yh p h i c c n gt n : t nc a l p . Nh v y , c h c n n gq u t i l i uc nt h i t c h op h pc c t nc h c n n gt n gt c c n h x yd n gt r o n g t r n gh pn ys c s d n gv i c c l o i i s k h c n h a u . M c d c h c n n gq u t i l p h i c h ox yd n g , l m t t h u nl i c h u n gv c t h c s d n gv i b t k c h c n n g , k h n gc h c c c h c n n gt h n hv i nl p . Ng o i r a , c h c n n gq u t i c n g h a l n ub nc h a i t h v i nc c h a c h c n n gc n gt n , h s k h n gx u n g t mi nl d a n hs c h i s k h c n h a u . C h n gt i s x e mx t t t c n h n gy ut n ym t c c hc h i t i t t r o n gc h n gn y . C h c a c h n gn yl s d n gt h u nt i nc a t nh m. C h c n n gq u t i c h op h pb ns d n gc n gt nc h o c c c h c n n gk h c n h a u , n h n gc m t c c ht h h a i g i m t c h c n n gt h u nt i nh n . N ub nmu ng i c h c n n gt n gt t r o n gn h i uc c hk h c n h a u ? K h i c h c n n gc d a n hs c h i s d i , n c t h t r n nt n h t v i t ( v k h h i u c ) c h c n n gc u c g i k h i h uh t c c i s l n h n h a uc h ot t c c c c u c g i . M t t n hn n gt h n g c s d n gt r o n gC++ c g i l t h a ms m c n h . M t i s m c n hl m t t r o n gn h n g c h nt r n hb i nd c hn un k h n g c q u y n ht r o n gc c c u c g i c h c n n g . D o , c c c u c g i f ( " h e l l o " ) , f ( " h i " , 1 ) , v f ( " h o wd y " , 2 , ' c ' c t h t t c ) c c u c g i nc c c h c n n gt n gt . H c n gc t h l c c c u c g i nb a c h c n n gq u t i , n h n gk h i d a n hs c h i s n yt n gt , b ns t h n gmu nh n hv i t n gt , t r o n g k ug i m t c h c n n gd u yn h t . C h c n n gq u t i v i s m c n ht h c s k h n gp h i l r t p h c t p . B i t h i g i a nb n nc u i c h n gn y , b ns h i uk h i s d n gc h n gv c c c c h c b nm t h c h i nc h n gt r o n gq u t r n hb i nd c hv l i nk t .

H nt nt r a n gt r
v o i df( ) ; c l a s sX{ v o i df( ) ; } ;

T r o n gc h n g4 , c c k h i n i mv t nt r a n g t r c g i i t h i u . T r o n gm

h mf ( ) t r o n gp h mv i l pXk h n gx u n g t v i p h i nb nt o nc uc a f ( ) . T r n hb i nd c ht h c h i nP h mv i n yb n gc c hs nx u t t nn i b k h c n h a uc h oc c p h i nb nt o nc uc a f ( ) v X: : f ( ) . T r o n gc h n g4 , c k i nc h or n gc c t nc h ng i nl t nl p" t r a n gt r " c n gv i t nc h c n n g , d ot nn i b s d n gt r n hb i n d c hc t h l _ f v _ X _ f . T u yn h i n , n c h r a r n gt nc h c n n gt r a n gt r l i nq u a n nn h i uh ns ov i t nl p . yl l d ot i s a o . G i s b nmu nq u t i h a i t nc h c n n g


v o i dp r i n t( c h a r ) ;v o i dp r i n t( f l o a t ) ;

Nk h n gq u a nt r n gc h od h l c h a i b nt r o n gm t l ph o c p h mv i t o nc u . T r n hb i nd c hk h n gt h t or a n hd a n hn i b d u yn h t n un c h s d n gp h mv i c a c c t nc h c n n g . B nmu nk t t h c v i _ p r i n t t r o n gc h a i t r n gh p . t n gv m t c h c n n gq u t i l b ns d n gc c t nc h c n n gt n gt , n h n gd a n h s c h i s k h c n h a u . D o , c h q u t i l mv i c t r n hb i nd c hp h i t r a n gt r c c t nc h c n n gv i t nc a c c l o i i s . C c c h c n n gt r n , c x c n h p h mv i t o nc u , s nx u t t nn i b m c t h t r n gg i n gn h _ p r i n t _ c h a r v _ p r i n t _ f l o a . N n gc h t k h n gc t i uc h u nc h oc c hc c t np h i c t r a n gt r b n gc c
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 129/320

08/10/2013

Suy ngh trong C + +, Vol 1

t r n hb i nd c h , v v yb ns t h yk t q u r t k h c n h a ut m t t r n hb i nd c hk h c . ( B nc t h x e mn h n gg n t r n gg i n gn h b n gc c hn i v i t r n hb i nd c h t or a s nl n gl pr pn g nn g . ) i un y , t t n h i n , g y r a v n n ub nmu nmu a c c t h v i nb i nd c hc h om t t r n hb i nd c h c b i t v m i l i nk t n h n g n g a yc k h i t nt r a n gt r c c h u nh a , c s l c h n gn g i v t k h c v c c ht r n hb i nd c hk h c n h a ut or a c c m . l t h c s t t c c c h c n n gq u t i : b nc t h s d n gc c t nc h c n n gt n gt c h oc c c h c n n gk h c n h a umi nl c c d a n hs c h i s k h c n h a u . T r n hb i nd c ht r a n gt r t n , p h mv i v i s l i t k s nx u t t nn i b c h on v m i l i nk t s d n g .

Qu t i t r ng i t r t r l i

Nt h n gt h i : " T i s a oc h p h mv i v d a n hs c h i s ? T i s a ok h n gt r v g i t r ? " C v n h l c ut i n m n s l mc h ot i n ht h n c nt r a n gt r c c g i t r t r v v i t nc h c n n gn i b . S a u , b nc t h q u t i t r ng i t r t r l i , s a u y : N yh o t n gt t k h i t r n hb i nd c hm t c c hr r n gc t h x c n h c n g h a t n g c n h , n h t r o n gi n t x = f ( ) . T u yn h i n , t r o n gC, b nv nl u nc t h g i m t h mv b q u a c c g i t r t r v ( c n g h a l , b nc t h g i h mc h on t c d n g p h ) . C c ht r n hb i nd c hc t h p h nb i t c g i l c n g h a l t r o n gt r n gh pn y ? C t h t i t h nl n h n gk h k h nc h on g i c c t r o n gb i t c c u c g i c h c n n gc n g h a . Qu t i h o n t o nv og i t r t r v l m t c h t q u t i n ht , v d o k h n g c p h pt r o n gC++ .

v o i df( ) ;i n tf( ) ;

L i nk ta nt o nl o i

C m t l i c hb s u n gc h ot t c c c t nn yt r a n gt r . M t v n c b i t d n ht r o n gCx yr a k h i l pt r n hk h c h h n gmi s d e c l a r e s m t c h c n n g , h o c t h n , m t c h c n n g c g i m k h n gc nk h a i b o ut i n , v t r n h b i nd c hs u yl u nc c c h c n n gk h a i b ot c c hn c g i . i k h i k h a i b oh mn yl c h n hx c , n h n gk h i n k h n gp h i l , n c t h l m t l i r t k h t m. B i v t t c c c c h c n n gp h i c k h a i b ot r c k h i c h n g c s d n gt r o n gC++ , c h i c h ov n n y b t l n c g i mb t r t n h i u . C++t r n hb i nd c ht c h i k h a i b om t c h c n n gt n gc h ob n , v v yn c k h n n gb ns b a og mc c t pt i nt i u t h c hh p . T u yn h i n , n uv m t l d ob nv nq u nl mi s d e c l a r e m t c h c n n g , h o c b n gc c ht u y nb b n gt a yh o c b a og mc c t pt i nt i u s a i ( c l m t t r o n g c ) , t nt r a n gt r c u n gc pm t m n gl i a nt o nm t h n g c g i l k i ul i nk t a nt o n. X e mx t k c hb ns a u y . T r o n gm t t pt i nl n hn g h a c h om t c h c n n g :

// :C 0 7 :D e f . c p p{ O }//C h cn n g n hn g h av o i df( i n t ){ }/ // :~

T r o n gt pt i nt h h a i , c h c n n g c mi s d e c l a r e dv s a u c g i l :
// :C 0 7 :U s e . c p p //{ L }D e f //C h cn n gm i s d e c l a r a t i o nv o i df( c h a r ) ; i n tm a i n( ){ !// f( 1 ) ;//N g u y nn h nm tl im il i nk t }/// :~

Qu t i v d

M c d b nc t h t h yr n gc c c h c n n gt h c s l f ( i n t ) , t r n hb i nd c hk h n gb i t i un yb i v n n i t h n gq u a m t t u y nb r r n g l c h c n n gl f ( c h a r ) . V v y , k h i b i nd c ht h n hc n g . T r o n gC , c c m i l i nk t c n gs t h n hc n g , n h n gk h n g p h i t r o n gC++ . V t r n hb i nd c ht r a n gt r t n , n hn g h a t r t h n h m t c i g n h f _ i n t , t r o n gk h i v i c s d n gc c c h c n n gl f _ c h a r . K h i c c m i l i nk t c g n gg i i q u y t c c t h a mc h i u nf _ c h a r , n c h c t h t mt h yf _ i n t , v n ma n gl i c h ob nm t t h n gb ol i . yl l i nk t a nt o nl o i . M c d v n n yk h n gx yr a t t c n h n gg t h n gx u y n , k h i n on c t h l v c n gk h k h n t mk i m, c b i t l t r o n gm t d nl n . yl m t t r o n gn h n gt r n gh pb nc t h d d n gt m t h ym t l i k h k h nt r o n gm t c h n gt r n hC ng i nb n gc c hc h yn t h n gq u a c c t r n hb i nd c hC++ . B yg i c h n gt i c t h s a i v d t r c s d n gc h c n n gq u t i . Nh n i t r c y , m t n i n g a y l pt c h u c hc h oq u t i l t r o n gx yd n g . B nc t h t h y i un yt r o n gc c p h i nb ns a uc a S t a s hl p :

// :C 0 7 :S t a s h 3 . h //C h cn n gq u t i #I f n d e fS T A S H 3 _ H #X c n hS T A S H 3 _ H l pS t a s h{ i n ts i z e ; //K c ht h cc am ik h n gg i a n /S c h l ut r i n tt i pt h e o ; //k h n gg i a nt r n gT i p b m n gb y t e :


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

i n ts l n g ; / //T n gp h n
130/320

08/10/2013

Suy ngh trong C + +, Vol 1

u n s i g n e dc h a r*l ut r ; t r n gt h ip h n g( i n tt n g ) ,c n gc h n g : S t a s h( i n ts i z e ) ;//Z e r ol n g S t a s h( i n ts i z e ,i n ti n i t Q u a n t i t y ) ; ~S t a s h( ) ; i n ta d d( v o i d*p h nt ) ; v o i d*l y( i n t i n d e x ) ; i n tc o u n t( ) ; } ; #E n d i f//S T A S H 3 _ H/// :~

L n g i ut i nS t a s h( ) x yd n gl g i n gn h t r c , n h n g i ut h h a i c m t l n gt h a ms c h r a s l n gb a n uc a n i l ut r c p h nb . T r o n g n hn g h a , b nc t h t h yr n gg i t r n i b c a s l n g c t h i t l p k h n g , c n gv i c c l ut r c o nt r . T r o n gc c n h x yd n gt h h a i , c c c u c g i nt h i p h n g( i n i t Qu a n t i t y) l mt n gl n gk c ht h c p h nb :
// :C 0 7 :S t a s h 3 . c p p{ O } //C h cn n gq u t i#b a og m" S t a s h 3 . h " #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< c a s s e r t > s d n gt nm i nk h n gg i a nt i uc h u n ;c o n s ti n tt n g=1 0 0 ; S t a s h: :S t a s h( i n tS Z ){ t h e o=0 ; l ut r =0 ; } s i z e=s z ; s l n g=0 ; t i p

S t a s h: :S t a s h( i n ts z ,i n ti n i t Q u a n t i t y ){ s i z e=s z ; t h e o=0 ; l ut r =0 ; t h ip h n g( i n i t Q u a n t i t y ) ; }

s l n g=0 ;

t i p

S t a s h: :~S t a s h( ){ i f( l ut r =0 ){ c o u t< <" g i ip h n gl ut r "< < e n d l ; x a[ ]l ut r ; } } i n tS t a s h: :t h m( v o i d*y ut ){ i f( s a u >=s l n g )/k h n gg i a n/ l i ? t n gl n( t n g ) ; //S a oc h pp h nt v ol ut r , //b t ut k h n gg i a n t r n gb nc n h : i n ts t a r t B y t e s=t i pt h e o*K c ht h c ; u n s i g n e dc h a r*e= ( u n s i g n e dc h a r* )y ut ; f o r( i n ti=0 ;i< k c ht h c ;i++ ) l ut r [ s t a r t B y t e s+i ]=e[ i ] ; t i pt h e o++ ; t r l i( t i pt h e o-1 ) ;//C h s } v o i d*s t a s h: :l y( i n ti n d e x ){ y uc u( 0< =c h s ," S t a s h: :l y( )c h s " ) ; i f( i n d e x >=t i pt h e o ) t r v 0 ;// c h ot h yc u ic n g //S nx u tc o n t r np h nt m o n gm u n : t r l iv ( l ut r [ i n d e x*s i z e ] ) ; } i n ts t a s h: :c o u n t( ){ t r l it i pt h e o ;//S p h nt t r o n gC S t a s h } t r n gs t a s h: :t h ip h n g( i n tt n g ){ k h n g n h( t n g >=0 ) ; i f( t n g= =0 ) r e t u r n ; i n tn e w Q u a n t i t y=s l n g+t n g ; n e w B y t e si n t=n e w Q u a n t i t y*K c ht h c ; i n to l d B y t e s=s l n g*K c ht h c ; u n s i g n e dc h a r*b=n e wu n s i g n e dc h a r[ n e w B y t e s ] ; f o r( i n ti=0 ;i< o l d B y t e s ;i++ ) b[ i ]=l ut r [ i ] ;//S a oc h pc nm i x a[ ]( l ut r ) ;//p h th n hl ut r c l ut r =b ;// i mt ib n h m i s l n g=n e w Q u a n t i t y ;// i uc h n hk c hc }/// :~

K h i b ns d n gc c n h x yd n g ut i nk h n gn h c c pp h t c h o l ut r . V i c p h nb s x yr al n u t i nb nc g n gt h m( ) m t i t n gv b t c l c n ok h i h i nt i c a b n h v t q u t r o n ga d d( ) . C h a i x yd n g c t h c h i nt r o n gc h n gt r n ht h n g h i m:
// :C 0 7 :S t a s h 3 T e s t . c p p //{ L }S t a s h 3 //C h cn n gq u t i#b a og m" S t a s h 3 . h " #B a og m" . ./R e q u i r e . h " #B a og m< f s t r e a m > #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ S t a s hi n t S t a s h( s i z e o f( i n t ) ) ; f o r( i n ti=0 ;i< 1 0 0 ;i++ ) i n t S t a s h . a d d( & i ) ; f o r( i n tj=0 ;j< i n t S t a s h . c o u n t( ) ;j++ ) c o u t< <"i n t S t a s h . f e t c h( " < < k< < " )=" < <*( I n t* )i n t S t a s h . f e t c h( j ) < <E n d l ; c o n s ti n tB U F S I Z E=8 0 ; S t a s hs t r i n g S t a s h( s i z e o f( c h a r )*B U F S I Z E ,1 0 0 ) ; i f s t r e a mt r o n g( " S t a s h 3 T e s t . c p p " ) ; mb o( t r o n g" S t a s h 3 T e s t . c p p " ) ; n gd y , t r o n gk h i( g e t l i n e( t r o n g ,d n g ) )
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 131/320

08/10/2013

Suy ngh trong C + +, Vol 1

s t r i n g S t a s h . a d d(( c h a r* )l i n e . c _ s t r( ) ) ; ( c h a r* )s t r i n g S t a s h . f e t c h( k++ ) )=0 ) < <C p< <e n d l ; }/// :~

i n tk=0 ; c h a r*c p ; !t r o n gk h i( ( c p= c o u t< <" s t r i n g S t a s h . f e t c h( "<< k< <" )= "

C u c g i x yd n gc h os t r i n g S t a s hs d n gm t t h a ms t h h a i , c l b nb i t i ug c b i t v c c v n c t h m b n a n gg i i q u y t c h op h pb nc h nm t k c ht h c b a n uc h oS t a s h. c n g o n Nh b n t h y , s k h c b i t d u yn h t g i a c ut r c v l pt r o n gC++ l c ut r c m c n hl c n gk h a i v l pm c n ht i n. M t c ut r c c n gc t h c c c h md n gv h mh y , n h b nc t h mo n g i . Nh n gn c h r a r n gm t c n g o nc n gc t h c m t n h x yd n g , h mh y , h mt h n hv i n , v t h mc h k i ms o t t r u y c p . B nl i c t h t h yv i c s d n gv l i c hc a v i c q u t i t r o n gc c v d s a u :
// :C 0 7 :U n i o n C l a s s . c p p //C n g o nv in h t h uv c cc h cn n gt h n hv i n #I n c l u d eu s i n gn a m e s p a c es t d ; o nU{ p r i v a t e :k i ms o t//T r u yc pq u ! i n ti ; f l o a tf ;c n g : U( i n ta ) ; U( f l o a tb ) ; ~U( ) ; i n tr e a d _ i n t( ) ; n ir e a d _ f l o a t( ) ; } ; U: :U( i n ta ){ i=a ; } U: :U( f l o a tb ){ f=b ; } U: :~U( ){ c o u t< <" U: :~U( )\n " ; } i n tU: :r e a d _ i n t( ){ r e t u r ni ; } n iU: :r e a d _ f l o a t( ){ r e t u r nf ; } i n tm a i n( ){ U X( 1 2 ) ,Y( 1 . 9 F ) ; c o u t< <X . r e a d _ i n t( )< <e n d l ; c o u t< <Y . r e a d _ f l o a t( )< <e n d l ; }/// :~

B nc t h n g h t c c m t r nl s k h c b i t d u yn h t g i a m t c n g o nv m t l pl c c hd l i u c l u t r ( c n g h a l , c c i n t v f l o a t c p h l nt r nc n gm t m n hl ut r ) . T u yn h i n , m t c n g o nk h n gt h c s d n gn h m t l pc s t r o n gq u t r n ht h a k , m l k h h nc h t m t q u a n i mt h i t k h n g i t n g( b ns t mh i uv t h a k t r o n gc h n g1 4 ) . M c d c c t h n hv i nc h c n n gv nmi n ht r u yc pv oc c c n g o nn o , v nk h n gc c c hn o n g nc h n c c l pt r n hk h c hh n gl a c h nt c c l o i n g u y nt s a i k h i c n g o n c k h i t o . T r o n gv d t r n , b nc t h n i X . r e a d _ f l o a t (m c d n ) l k h n gp h h p . T u yn h i n , m t " a nt o n " c n g o nc t h c g i g n t r o n gm t l ph c . T r o n gv d s a u y , c h c c hd n ge n u ml mr m , v l mt h n oq u t i c c hv i c c n h t h u :


// :C 0 7 :S u p e r V a r . c p p //As i ub i n#i n c l u d eu s i n gn a m e s p a c es t d ; l pS u p e r V a r{ e n u m{ k t , s n g u y n , f l o a t i n g _ p o i n t }V a r T y p e ; // n hn g h am t o n{ //V o n c h a rc ; i n ti ; f l o a tf ; } ; c n gc n g : S u p e r V a r( c h a rc h ) ; S u p e r V a r( i n ti i ) ; S u p e r V a r( f l o a tf f ) ; v o i dp r i n t( ) ; } ; S u p e r V a r: :S u p e r V a r( c h a rc h ){ S u p e r V a r: :S u p e r V a r( i n ti i ){ V a r T y p e=k t ; V a r T y p e=s n g u y n , c=c h ; } i=i i ; }

S u p e r V a r: :S u p e r V a r( f l o a tf f ){ V a r T y p e=f l o a t i n g _ p o i n t ; f=f f ; } t r n g S u p e r V a r: :i n( ){ s w i t c h( V a r T y p e ){ k i uc h : c o u t< <" n h nv t : " < <c< <e n d l ; b r e a k ; t r n gh ps n g u y n : c o u t< <" s n g u y n : " < <i< <e n d l ;b r e a k ;t r n gh pf l o a t i n g _ p o i n t : c o u t< <" f l o a t : "< <f< <e n d l ; b r e a k ; } } i n tm a i n( ){ S u p e r V a rA( ' c ' ) ,B( 1 2 ) ,C( 1 . 4 4 F ) ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 132/320

08/10/2013

Suy ngh trong C + +, Vol 1

A . p r i n t( ) ; B . p r i n t( ) ; C . p r i n t( ) ; }/// :~

T r o n g o nm t r n , c c e n u mk h n gc t nk i u( n l m t i ut r a u n t a g g e d ) . i un yl c h pn h n c n u b ns n g a yl pt c x c n ht r n gh pc a e n u m, n h c t h c h i n y . K h n gc np h i t h a mk h oc c c a e n u mt nl o i t r o n gt n gl a i , d o , t nl o i l t yc h n . C c c n g o nk h n gc t nl o i v k h n gt nb i n . i un y c g i l m t c n g o nv d a n h , v t or a k h n g g i a nc h oc c c n g o nn h n gk h n gy uc ut r u yc pv oc c c n g o nc c y ut v i m t t nb i nv c c d u c h m. V d , n uv d a n hc a o nl :
// :C 0 7 :A n o n y m o u s U n i o n . c p pi n tm a i n( ){ u n i o n{ f l o a tf ; } ; //T h n hv i nt r u yc pm k h n gc ns d n gv n gl o i : i=1 2 ; f=1 , 2 2 ; }/// :~ i n ti ;

L ur n gb nt r u yc pc c t h n hv i nc a m t o nv d a n hc n gg i n gn h k h i c h n gl c c b i nt h n g t h n g . S k h c b i t d u yn h t l c h a i b i nc h i mc n gm t k h n gg i a n . N uv d a n hc n g o nl p h mv i t p t i n( b nn g o i t t c c c c h c n n gv c c l ph c ) s a u n p h i c k h a i b ot n hv v yn c m i l i nk t n i b . M c d S u p e r V a r c a nt o n , h ud n gc a n l m t c h t k h n gr r n gv l d os d n gm t c n g o n n i ut i nl t i t k i mk h n gg i a n , v v i c b s u n gc c V a r T y p e c h i mk h n h i uk h n gg i a nl i nq u a n n c c d l i ut r o n gc c c n g o n, d o t i t k i ml m t c c hh i uq u l o i b . C m t v i l a c h nt h a yt h l mc h oc h n gt r n hn yh o nt o nk h t h i . N uV a r T y p e k i ms o t n h i uh nm t o nd n ut t c h uc n gl o i s a u b nc h c nm t c h on h mv n s k h n gm t n h i u k h n gg i a nh n . M t c c ht i pc nh u c hh nl c #i f d e f s x u n gq u a n ht t c c c V a r T y p e m , m s a u c t h mb om i t h a n g c s d n gm t c c hc h n hx c t r o n gq u t r n hp h t t r i nv t h n g h i m. C h om v nc h u y n , t h mk h n gg i a nv t h i g i a nt r nk h n gt h c l o i b .

i s m c n h

T r o n gS t a s h 3 . h, k i mt r a h a i n h t h uc h oS t a s h( ) . H d n gn h k h n gc k h c , h c ? T r o n gt h c t , c c n h x yd n g ut i nd n gn h l m t t r n gh p c b i t c a m t t h h a i v i b a n uk c ht h c t h i t l pv . l m t c h t c a m t s l n gp h n l c t or a v d u yt r h a i p h i nb nk h c n h a uc a m t c h c n n gt n gt . C++c u n gc pm t b i np h pk h c p h c v i i s m c n h . M t i s m c n hl m t g i t r c a r a t r o n g t u y nb r n gt r n hb i nd c hs t n gc h nn ub nk h n gc u n gc pm t g i t r t r o n gc c c u c g i c h c n n g . T r o n gS t a s hd , c h n gt a c t h t h a yt h h a i c h c n n g :

S t a s h( i n ts i z e ) ;//Z e r ol n g

S t a s h( i n ts i z e ,i n ti n i t Q u a n t i t y ) ;

v i c h c n n gd u yn h t :
S t a s h( i n ts i z e ,i n ti n i t Q u a n t i t y=0 ) ;

C c ( i n t ) S t a s h n hn g h a ng i nl l o i b t t c n h n gg c nt h i t l a nS t a s h( i n t , i n t n hn g h a . ) B yg i , h a i n hn g h a i t n g
S t a s hA( 1 0 0 ) ,B( 1 0 0 ,0 ) ;

s t or a k t q u c h n hx c n h n h a u . C c n h x yd n gg i n gh t n h a u c g i l t r o n gc h a i t r n gh p , n h n g i v i mt , t h a ms t h h a i c t n gt h a yt h b n gc c t r n hb i nd c hk h i n t h yc c t h a ms u t i nl m t i n t v r n gk h n gc s t h h a i . T r n hb i nd c h n h nt h yn h n g i s m c n h , n b i t n v n c t h t h c h i nc u c g i c h c n n gn un t h a yt h s t h h a i n y , l n h n gg b n n i v i n l mb n g c c hl mc h on m t m c n h . i s m c n hl m t t i nn g h i , n h c h c n n gq u t i l m t t i nn g h i . C h a i t n hn n gc h op h pb ns d n g m t t nc h c n n gd u yn h t t r o n gc c t n hh u n gk h c n h a u . S k h c b i t l v i i s m c n ht r n hb i nd c h t h a yt h i s k h i b nk h n gmu n a n v oc h n hm n h . V d t r nl m t n i t t s d n g i s m c n h t h a yv c h c n n gq u t i , n uk h n gb nk t t h c v i h a i h o c n h i uc h c n n gm c c h k t n gt v c c h n hv i t n gt . N uc c c h c n n gc n h n gh n hv i r t k h c n h a u , n t h n gk h n gc n g h a s d n g i s m c n h( c h or n gv n , b nc t h mu n t c uh i l i uh a i c h c n n gv i n h n gh n hv i r t k h c n h a u
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 133/320

08/10/2013

Suy ngh trong C + +, Vol 1

n nc c n gt n ) . C h a i n g u y nt c m b np h i t h c c k h i s d n g i s m c n h . ut i n , c h c i s t h e os a uc t h c m c n h . C n g h a l , b nk h n gt h c m t i s m c n ht h e os a ul m t l pl u nk h n gm c n h . T h h a i , m t k h i b nb t us d n g i s m c n ht r o n gm t c u c g i c h c n n gc t h , t t c c c i s t i pt h e o t r o n gd a n hs c h i s l c h c n n gp h i c m c n h( i un ys a ut n g u y nt c ut i n ) . i s m c n hc h c t t r o n gp h nk h a i b oc am t h m( t h n g c t t r o n gm t t pt i nt i u ) . T r n h b i nd c hp h i n h nt h yg i t r m c n ht r c k h i n c t h s d n gn . i k h i n g i t a s t c c g i t r n h nx t c a c c i s m c n ht r o n g n hn g h a c h c n n g , t i l i uh n gd nc h oc c m c c hv h i uf n( i n t x/*=
0*/ ){ //. . .

i s g i c h
L pl u nt r o n gm t t u y nb c h c n n gc t h c k h a i b omk h n gc n n hd a n h . K h i c h n g c s d n g v i i s m c n h , n c t h n h nm t c h t h i h c . B nc t h k t t h c v i v o i df( i n tx ,i n t=0 ,f l o a t=
1 , 1 ) ;

T r o n gC++ , b nk h n gc np h i n hd a n ht r o n g n hn g h a c h c n n g , h o c l : v o i df( i n tx ,i n t ,f l o a t
F L T ){ /*. . .*/ }

T r o n gc c c q u a nc h c n n g , x v F L Tc t h c t h a mc h i u , n h n gk h n gp h i l t r a n hl u ng i a , b i v n k h n gc t n . C h c n n gc u c g i v np h i c u n gc pm t g i t r c h ov i c g i c h , m c d : f ( 1 ) h o c f ( 1 , 2 , 3 . 0 ) . C p h pn yc h op h pb n t c c t h a ms n h l m t t r n hg i c h m k h n gs d n gn . t n gl b nc t h mu nt h a y i n hn g h a c h c n n g s d n gg i c h s a u , m k h n gt h a y i t t c c c m m h m c g i . T t n h i n , b nc t h t h c h i n i ut n gt b n gc c hs d n gm t i s c t t n , n h n gn ub n n h n g h a c c i s c h oc c c q u a nc h c n n gm k h n gs d n gn , h uh t c c t r n hb i nd c hs c u n gc pc h ob n m t t h n g i pc n hb o , g i s b n t h c h i nm t l i l o g i c . B n gc c hc t n h l i t nt h a ms r a , b nmu n l o i b c n hb on y . Qu a nt r n gh n , n ub nb t ub n gc c hs d n gm t i s c h c n n gv s a u q u y t n hr n gb nk h n g c nn , b nc t h c h i uq u l o i b n m k h n gt or a c c c n hb o , n h n gk h n gl mp h i nb t k m k h c h h n g c g i p h i nb nt r c c a c h c n n g .

L ac h nq u t i s ov i m c n h i s

C h a i c h c n n gq u t i v i s m c n hc u n gc pm t s t i nl i g i t nh m. T u yn h i n , n c t h c v k h h i ut i l n b i t c k t h u t s d n g . V d , h yx e mx t c c c n gc s a u y c t h i t k t n g q u nl c c k h i b n h d n hc h ob n :

// :C 0 7 :M e m . h #I f n d e fM E M _ H#x c n hM E M _ Ht y p e d e fu n s i g n e dc h a rb y t e ; l pM e m{ b y t e*m e m ; i n ts i z e ; t r n ge n s u r e M i n S i z e( i n tm i n S i z e ) , c n gc h n g : M e m( ) ; M e m( i n ts z ) ; ~M e m( ) ; i n tm s i z e( ) ; b y t e*c o nt r ( ) ; b y t e*c o nt r ( i n tm i n S i z e ) ; } ; #E n d i f//M E M _ H/// :~

M t Me m i t n gn mg i m t k h i b y t e s v mb or n gb nc l ut r . C c n h x yd n gm c n h k h n gp h nb b t k l ut r , v c c n h x yd n gt h h a i mb or n gc s z l ut r t r o n gc c Me m i t n g . D e s t r u c t o r g i i p h n gl ut r , ms i z e ( ) s c h ob nb i t c b a on h i ub y t e h i nc t r o n gc c Me m i t n g , v c o nt r ( ) t or a m t c o nt r n a c h b t uc a v i c l ut r ( Me ml m t c n gc k h t h pc p ) . C m t p h i n b nq u t i c a c o nt r ( ) , t r o n g c c l pt r n hk h c hh n gc t h n i r n gh mu nm t c o nt r nm t k h i b y t e t n h t l mi n S i z e l n , v c h c n n g mb ot h n hv i nn y . C c c n h x yd n gv c c c o nt r ( ) c h c n n gt h n hv i ns d n gt i ne n s u r e Mi n S i z e (h mt h n hv i n t n g k c ht h c c a ) c c k h i b n h ( t h n gb or n gn k h n ga nt o n g i k t q u c a c o nt r ( ) n ub n h t h a y i k c hc ) . yl v i c t h c h i nc a l p :
// :C 0 7 :M e m . c p p{ O } #B a og m" M e m . h "#b a og m< c s t r i n g >s d n gt nm i nk h n gg i a n t i uc h u n ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 134/320

08/10/2013

Suy ngh trong C + +, Vol 1

M e m: :M e m( ){ m e m=0 ,k c ht h c=0 ; } M e m: :M e m( i n tS Z ){ e n s u r e M i n S i z e( S Z ) ; } m e m=0 ; k c ht h c=0 ;

M e m: :~M e m( ){ d e l e t e[ ]m e m ; } i n tM e m: :m s i z e( ){ k c ht h ct r l i ; } k h o n gt r n gM e m: :e n s u r e M i n S i z e( i n tm i n S i z e ){ i f( k c ht h c< m i n S i z e ){ b y t e*n e w m e m=n e wb y t e[ m i n S i z e ] ; m e m s e t( n e w m e m+k c ht h c ,0 ,m i n S i z e-k c h t h c ) ; m e m c p y( n e w m e m ,m e m ,k c ht h c ) ; x a[ ]m e m ; m e m=n e w m e m ; s i z e=m i n S i z e ; } } b y t e*M e m: :c o nt r ( ){ r e t u r nm e m ; } b y t e*M e m: :c o nt r ( i n tm i n S i z e ){ e n s u r e M i n S i z e( m i n S i z e ) ; t r l im e m ; }/// :~

B nc t h t h yr n ge n s u r e Mi n S i z e (l c h c n n gd u yn h t c h ut r c hn h i m) c pp h t b n h , v n c s d n gt c c n h x yd n gt h h a i v c c h n ht h c q u t i t h h a i c a c o nt r ( ) . T r o n ge n s u r e Mi n S i z e ( , k h n gc g c np h i c t h c h i nn uc c ) k c ht h c l n . N ul ut r m i p h i c p h nb t h c h i nk h i l nh n( c n gl t r n gh pk h i k h i c k c ht h c b n gk h n gs a uk h i x yd n gm c n h ) , c c " t h m" p h nm i c t h i t l p k h n gs d n gCt i uc h u nt h v i nc h c n n gme ms e t ( ) , c g i i t h i u t r o n gc h n g5 . C c c u c g i c h c n n gt i pt h e ol Ct i uc h u nt h v i nc h c n n gme mc p y( ) , m t r o n g t r n gh pn ys a oc h pc c b y t e h i nt me m n e wme m( t h n gl m t c c hh i uq u ) . C u i c n g , b n h c s b x a v b n h v k c ht h c m i c g i a oc h oc c t h n hv i nt h c hh p . C c Me ml ph c c t h i t k c s d n gn h m t c n gc t r o n gc c l ph c k h c ng i nh a q u nl b n h c a h ( n c n gc t h c s d n g c h e g i um t h t h n gq u nl b n h p h c t ph n c c u n g c p , v d , b i h i uh n h ) . C c ht h c hh p , n c t h n g h i m yb n gc c ht or a m t ng i n" c h u i " l ph c :


// :C 0 7 :M e m T e s t . c p p //K i mt r ac cl pM e m //{ L }M e m #B a og m" M e m . h " #B a og m< c s t r i n g >#i n c l u d eu s i n gn a m e s p a c es t d ; l pM y S t r i n g{ M e m*b u f ;c n gc n g : M y S t r i n g( ) ; M y S t r i n g( c h a r*s t r ) ; ~M y S t r i n g( ) ; t r n gc o n c a t( c h a r* s t r ) ; v o i dp r i n t( o s t r e a m&o s ) ; } ; M y S t r i n gM y S t r i n g: :( ){ b u f=0 ; }

M y S t r i n g: :M y S t r i n g( c h a r*s t r ){ b u f=n e wM e m( s t r l e n( s t r )+1 ) ; s t r c p y( ( c h a r* )b u f >c o nt r ( ) ,s t r ) ; } t r n gM y S t r i n g: :c o n c a t( c h a r*s t r ){ i f( b u f )b u f=n e wM e m ; s t r c a t ( ( c h a r* )b u f >c o nt r ( b u f >m s i z e( )+s t r l e n( s t r )+1 ) ,s t r ); } k h o n gt r n gM y S t r i n g: :i n( o s t r e a m&o s ){ b u f >c o nt r ( )< <e n d l ; } i f( b u f )t r l i ; o s< <

M y S t r i n gM y S t r i n g: :~( ){ x ab u f ; } i n tm a i n( ){ M y S t r i n gs( " c h u it h n g h i mc at i " ) ; s . p r i n t( t a n ) ; s . c o n c a t( " m ts c n gc b s u n g " ) ; s . p r i n t( t a n ) ; M y S t r i n gs 2 ; s 2 . c o n c a t( " S d n gc o n s t r u c t o rm c n h " ) ; s 2 . p r i n t( t a n ) ; }/// :~

T t c c c b nc t h l mv i l pn yl t or a m t My S t r i n g, v nb nc o n c a t e n a t e , v m yi nc h om t o s t r e a m. L pc h c h a m t c o nt r nm t n i m , n h n gl us k h c b i t g i a c c n h x yd n gm c n h , t r o n g t c o nt r v k h n g , v c c n h x yd n gt h h a i , m t or a m t Me mv d l i ub ns a ov on . u i mc a c c n h x yd n gm c n hl b nc t h t or a , v d , m t m n gl nc c t r n gMy S t r i n g i t n gr t
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 135/320

08/10/2013

Suy ngh trong C + +, Vol 1

r , v k c ht h c c a m i i t n gc h l m t c o nt r v t r nk h n gc h c a c c n h x yd n gm c n hl p h nb c c c h s k h n g . C h i p h c a m t My S t r i n gc h b t ut c hl u k h i b nn i d l i u , t i t h i i m c c Me m i t n g c t or a n un k h n g c r i . T u yn h i n , n ub ns d n gc c n h x yd n gm c n hv k h n gb a og i n i b t k d l i u , c u c g i d e s t r u c t o r l v na nt o nv k ug i x a c h os k h n g c n h n g h a n h v ym n k h n gc g n g p h t h n hl ut r h o c n uk h n gg yr a v n . N ub nn h nv oh a i n h t h un yn c t h l c uc v n h yl m t n gc v i nc h oc c i s m c n h . T u yn h i n , n ub nt h c c n h x yd n gm c n hv v i t c c n h x yd n gc nl i v i m t i s m c n h :
M y S t r i n g( c h a r*s t r=" " ) ;

t t c m i t h s l mv i c m t c c hc h n hx c , n h n gb ns b m t l i c hh i uq u t r c t m t Me m i t n gs l u nl u n c t or a . c c h i uq u t r l i , b np h i t h a y i c c n h x yd n g :
M y S t r i n g: :M y S t r i n g( c h a r*s t r ){ n u{ //C h t a yv om tc h u ir n g( *s t r ) b u f=0 ; t r l i ; } b u f=n e wM e m( s t r l e n( s t r )+1 ) ; s t r c p y( ( c h a r* ) b u f >c o nt r ( ) ,s t r ) ; }

i un yc n g h a , c h i ul c , c c g i t r m c n hs t r t h n hm t l c g yr a m t m n hr i n gb i t c a m c t h c h i nh nn um t g i t r m c n hk h n g c s d n g . M c d c v n h n g yt h v i m t n h x y d n gn h n h t h n y , n i c h u n gt h c t i un yc t h g yr a v n . N ub nc t mc h om c n hh nl i ut r n n h l m t g i t r b n ht h n g , m p h i l m t um i l b ns k t t h c v i h i uq u h a i c h c n n g k h c n h a ut r o n gm t c q u a nc h c n n gd u yn h t : m t p h i nb nd n hc h ot r n gh pb n ht h n gv m t c h o m c n h . B nc n gc t h t c hn r a t h n hh a i c q u a nc h c n n gk h c n h a uv c h oc c t r n hb i nd c ht h c h i nl a c h n . K t q u l ( n h n gt h n gk h n gn h nt h y ) t n gn h t r o n gh i uq u , b i v i s t h mk h n g c t h n gq u a v c c m b s u n gc h oc c i uk i nk h n g c t h c h i n . Qu a nt r n gh n , b n a n gg i m c h oh a i c h c n n gr i n gb i t t r o n g h a i c h c n n gr i n gb i t c h k h n gp h i l k t h pc h n gt h n hm t c c hs d n g i s m c n h , m s d n nb ot r d d n gh n , c b i t l n uc c c h c n n gl l n . M t k h c , h yx e mx t c c Me ml p . N ub nn h nv oc c n hn g h a c a h a i n h t h uv h a i c o nt r ( ) c h c n n g , b nc t h t h yr n gv i c s d n g i s m c n ht r o n gc h a i t r n gh ps k h n gg yr a c c n hn g h a h mt h n hv i n t h a y i c . D o , c c l ph c c t h d d n g c :
// :C 0 7 :M e m 2 . h #I f n d e fM E M 2 _ H #X c n hM E M 2 _ H t y p e d e fu n s i g n e dc h a rb y t e ; l pM e m{ b y t e*m e m ; i n ts i z e ; t r n ge n s u r e M i n S i z e( i n tm i n S i z e ) , c n gc h n g : M e m( i n ts z=0 ) ; ~M e m( ) ; i n tm s i z e( ) ; b y t e*c o n t r ( i n tm i n S i z e=0 ) ; } ; #E n d i f//M E M 2 _ H/// :~

C h r n gm t c u c g i ne n s u r e Mi n S i z e ( 0 s l u nl u n c k h ) h i uq u . M c d t r o n gc h a i t r n gh pt i d a m t s c c q u t r n hr a q u y t n hv v n h i uq u , b np h i c nt h n k h n g r i v oc i b yc a s u yn g h c h v h i uq u ( h pd nn h n c ) . V n q u a nt r n gn h t t r o n gt h i t k l pl g i a od i nc a l p( c a c n gv i n , t r o n g c s n c c l pt r n hv i nk h c hh n g ) . N un h n gs nx u t m t l ph c m l d s d n gv t i s d n g , s a u b nc m t t h n hc n g , b nl u nl u nc t h i uc h n hc h o h i uq u n uc nt h i t n h n gh i uq u c a m t l ph c c t h i t k x ub i v c c l pt r n hv i nl q u m c t p t r u n gv oc c v n h i uq u c t h n g h i mt r n g. M i q u a nt mc h n hc a b nn n c r n gg i a od i nc n g h a v i n h n gn g i s d n gn v n g i c m k t q u . C h r n gt r o n gMe mT e s t . c p pv i c s d n g My S t r i n gk h n gt h a y i b t k m t c o n s t r u c t o r m c n h c s d n gh a yh i uq u l c a oh a yt h p .

T mt t

Nh h n gd n , b nk h n gn ns d n gm t i s m c n hn h m t l c t r n c i uk i nt h c t h i m . B nn nt h a yv p h v c h c n n gt h n hh a i h o c n h i uc h c n n gq u t i n ub nc t h . M t i s m c n hs l m t g i t r m b nt h n gs t v t r . l m t g i t r m c n h i uk h n n gx yr a h ns ov i t t c c c p h nc nl i , v v yc c l pt r n hk h c hh n gt h n gc t h b q u a n h o c s d n gn c h k h i h mu nt h a y i n t g i t r m c n h . C c i s m c n h c a v o t h c h i nc h c n n gc u c g i d d n gh n , c b i t l k h i n h n gc h c n n g c n h i ut r a n hc i v i g i t r t i ub i u . K h n gc h l n d d n gh n v i t c c c u c g i , n d d n gh n c c h n g , c b i t l n ut c g i l pc t h t h n gc c i s m c n h t n h t b i n i x u t h i nm i n h t t r o n g d a n hs c h . V i c s d n g c b i t q u a nt r n gc a i s m c n hl k h i b nb t uv i m t c h c n n gv i m t t ph pc c t h a ms , v s a uk h i n c s d n gc h om t t r o n gk h i b np h t h i nr a b nc np h i t h m i s . B i m c n h

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

136/320

08/10/2013

Suy ngh trong C + +, Vol 1

t t c c c i s m i , b n mb or n gt t c c c m s k h c hh n gs d n gg i a od i nt r c k h n gb n h h n g .

B i t p
1.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

2.

T om t T i u l ph c c c h a m t c h u i i t n g g i v nb nc a m t t pt i n . C u n gc pc h on h a i c ut r c : m t c o n s t r u c t o r m c n hv m t n h x yd n gm p h i m t m t c h u i l pl u n l t nc a t p t i n m . K h i c c n h x yd n gt h h a i c s d n g , m f i l e v c n i d u n gv oc c c h u i i t n g t h n hv i n . T h m m t c h c n n gt h n hv i nn i d u n g( ) t r l i c h u i n h v y( v d ) n c t h c i n . T r o n gma i n( ) , m m t t pt i ns d n gT i u v i nn i d u n g . T om t t i nn h nl ph c v i m t n h x yd n gm p h i m t m t nc h u i v i m t g i t r m c n h . T or a m t t h n hv i nt n h nc h u i , v t r o n gc c n h x yd n gc h ng i nl c h n h i s c h u i n i b c h u i . T or a h a i c h c n n gt h n hv i nq u t i c g i l i n( ) : m t t r o n g k h n gc i s v c h c ni n n h n gt i nn h n c l ut r t r o n gc c i t n g , v m t t r o n g c m t c h u i i s , m n i nn g o i c c t i nn h nn i b . Nl mc h o c mn h ns d n gp h n gp h pn yt h a yv m t t r o n gn h n gs d n gc h oc c n h x yd n g ? X c n hn h t h n o t or a s nl n gl pr pv i t r n hb i nd c hc a b n , v c h yt h n g h i m s u yr a c c c h n gt r n hn a me d e c o r a t i o n . T om t l pc c h a b nc h c n n gt h n hv i n , v i 0 , 1 , 2 , v 3 i n t i s t n g n g . T or a m t c h n h( ) m l mc h om t i t n gc a l ph c c a b nv m i g i m i n g i c c h mt h n hv i n . B yg i s a i c c l pv v yn c t h a yv m t h mt h n hv i nd u yn h t v i t t c c c i s m c n h . i un yt h a y i c a b nc h n h( ) ? T om t c h c n n gv i h a i i s v g i n t c h n h( ) . B yg i l mc h om t t r o n gc c i s m t " g i c h " ( k h n g n hd a n h ) v x e mc u c g i c a b nt r o n gma i n( ) t h a y i . S a i S t a s h 3 . hv S t a s h 3 . c p ps d n g i s m c n ht r o n gc c n h x yd n g . K i mt r a c c n h x yd n g b n gc c hl mc h oh a i p h i nb nk h c n h a uc a m t S t a s h i t n g . T om t p h i nb nm i c a n g nx pl p( t c h n g6 ) c c h a c c c o n s t r u c t o r m c n hn h t r c , v m t n h x yd n gt h h a i m m t n h l pl u nc a m t m n gc a c c c o nt r nc c i t n gv k c ht h c c a m n g . X yd n gn yn nd i c h u y nq u a m n gv ym i c o nt r v on g nx p. K i mt r a l ph c c a b nv i m t l o t c c c h u i . S a i S u p e r V a r c #i f d e f s x u n gq u a n ht t c c c V a r T y p e m n h mt t r o n gp h nt r ne n u m. L m V a r T y p e t h n gx u y nv c n gk h a i i ut r a ( k h n gc v d ) v s a i p r i n t ( ) n i h i m t V a r T y p e t r a n hl u n c h on l mg . T h c h i nMe m2 . hv c h c c h nr n gc c l ps a i v nh o t n gv i Me mT e s t . c p p. S d n gl pMe mt h c h i nS t a s h. L ur n gv t h c h i nl r i n gt v d o t i m nt c c l pt r n hv i n k h c hh n g , m k i mt r a k h n gc np h i c s a i . T r o n gl pMe m, t h m m t b o o l d i c h u y n( ) c h c n n gt h n hv i n c k t q u c a m t c u c g i nc o n t r ( ) v c h ob nb i t l i uc o nt r c h u y n( d op h nb l i ) . V i t c h n h( ) m c c b i k i mt r a c a b nd i c h u y n( ) c h c n n gt h n hv i n . L i un c n g h a h n s d n gm t c i g n h d i c h u y n( ) h o c c h ng i nl g i c o nt r ( ) m i k h i b nc nt r u yc pv ob n h t r o n gMe m?

3. 4.

5. 6. 7.

8. 9. 10. 11.

T n g u ng c c a n , c o n s t a v om t s m c c hk h c n h a u . T r o n gk h i n c h yt r l i v on g nn g C m n g h a c a n c t h a y i . T t c i un yc t h c v m t c h t b i r i l c u , v t r o n gc h n gn y b ns h c c k h i n o , t i s a o , v l mt h n o s d n gc o n s t t k h a . C u i c n gc m t c u c t h ol u nv b i n n g, m l m t n g i a n he mh g nc o n s t ( v c h a i ut h a y i m i q u a nt m) v c c p h pg i n g h t n h a u . n gc ut i nc h oc o n s t d n gn h c l o i b v i c s d n gt i nx l #d e f i n e s s d n gq u y nt h a yg i t r . N c a v os d n gc h oc o nt r , c h c n n gl pl u n , k i ut r v , c c i t n gl pv h mt h n h v i n . T t c t r o n gs n yc n g h a h i k h c n h a un h n gk h i n i mt n gt h c hv s c x e mx t t r o n gc c p h nr i n gb i t t r o n gc h n gn y .

T h a yt h g i t r

K h i l pt r n hC , t i nx l c t d os d n g t oc c ma c r ov t h a yt h c c g i t r .B i v t i nx l c h n
137/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

g i nl t h a yt h v nb nv k h n gc k h i n i mh a yc s c h ol o i h n hk i mt r a , t h a yt h g i t r t i nx l g i i t h i uc c v n t i n ht m c t h t r n h c t r o n gC++b n gc c hs d n gc o n s t g i t r . V i c s d n g i nh n hc a t i nx l t h a yt h c c g i t r c h oc c t nt r o n gCn h s a u :
#X c n hB U F S I Z E1 0 0

B U F S I Z El m t c i t nm c h t nt i t r o n gq u t r n ht i nx l , d o n k h n gc h i ml ut r v c t h c t t r o n gm t t pt i nt i u c u n gc pm t g i t r d u yn h t c h ot t c c c nv d c hm s d n gn . Nr t q u a nt r n g b ot r m s d n gt h a yt h g i t r t h a yv c i g i l " c o ns ma t h u t . " N ub ns d n gc o ns k d i ut r o n gm c a b n , k h n gc h n g i c k h n gc t n gn h n gc o ns nt h o c n h n gg h i d i n , n h n gn ub nq u y t n ht h a y i m t g i t r , b np h i t h c h i nc h n hs a t a y , v b nk h n gc n gm n l mt h e o mb ob nk h n gb l m t t r o n gn h n gg i t r c a b n( h o c v t n ht h a y i m t t r o n gn h n g b nk h n gc n ) . H uh t t h i g i a n , B U F S I Z Es h n hx n h m t b i nb n ht h n g , n h n gk h n gp h i t t c c ct h i g i a n . Ng o i r a , k h n gc l o i t h n gt i n . i un yc t h c h eg i ul i mr t k h t mt h y . C++s d n gc o n s t l o i b n h n gv n n yb n gc c h ag i t r t h a yt h v op h mv i c at r n hb i nd c h . B yg i b nc t h n i


c o n s ti n tB U F S I Z E=1 0 0 ;

B nc t h s d n gB U F S I Z Eb t c n i n om c c t r n hb i nd c hp h i b i t g i t r t i t h i g i a nb i nd c h . T r n h b i nd c hc t h s d n gB U F S I Z E t h c h i n g p l i nt c , c n g h a l t r n hb i nd c hs g i m m t b i uh i nl i nt c p h ct p m t ng i nb n gc c ht h ch i nc c t n ht o nc nt h i t t i t h i g i a nb i nd c h . i un y c b i t q u a nt r n gt r o n g n hn g h a m n g : c h a rb u f[ B U F S I Z E ] ; B nc t h s d n gc o n s t c h ot t c c x yd n gt r o n gc c l o i ( c h a r , i n t , f l o a t , v i ) v c c b i nt h c a h ( c n gn h i t n gl ph c , n h b ns t h ys a ut r o n gc h n gn y ) . V c c l i t i n ht m c c t i nx l c t h g i i t h i u , b nn nl u nl u ns d n gc o n s t t h a yv #x c n hg i t r t h a yt h .

c o n s tt r o n gt pt i nt i u
S d n gc o n s t t h a yv #x c n h, b np h i c k h n n g t c o n s t n hn g h a t r o n gt pt i nt i u n h b nc t h v i #x c n h. B n gc c hn y , b nc t h t n hn g h a c h om t c o n s t t r o n gm t n i d u yn h t v p h np h i c h oc c nv d c hb n gc c hb a og mc c t pt i nt i u . M t c o n s t t r o n gC++m c n hl l i nk t n i b , c n g h a l , n c h h i nt h t r o n gc c t pt i nm n c n hn g h a v k h n gt h c n h nt h y t h i g i a nl i nk t c a c c nv d c ht h u t k h c . B np h i l u nl u ng ng i t r c h om t c o n s t k h i b nx c n hn , t r k h i b nt h c h i nm t t u y nb r r n gs d n ge x t e r n: T h n gt h n g , C++t r n hv i c t or a l ut r c h om t c o n s t , n h n gt h a yv g i n hn g h a t r o n gb n gb i u t n gc a n . K h i b ns d n ge x t e r nv i c o n s t , t u yn h i n , b nb u c l ut r c p h nb ( i un yc n g n g i v i m t s t r n gh pk h c , c h n gh nn h l y a c h c a m t c o n s t ) . L ut r p h i c p h nb b i v e x t e r nn i " s d n gl i nk t b nn g o i , " c n g h a l m t s nv d c hp h i c k h n n gt h a mk h oc c s n p h m, i h i n c l ut r . T r o n gt r n gh pb n ht h n g , k h i e x t e r nk h n gp h i l m t p h nc a n hn g h a , k h n gl ut r c p h nb . K h i c o n s t c s d n g , n c h ng i nl g pt r o n gl c b i nd c h . M c t i uk h n gb a og i p h nb l ut r c h om t c o n s t c n gk h n gt h n hc n gv i c ut r c p h c t p . B t c k h i n ot r n hb i nd c hp h i p h nb l ut r , g pl i nt c b n g nc n( v k h n gc c c hn oc h ot r n hb i nd c h b i t c h c c h nn h n gg g i t r c a l ut r l n un c t h b i t r n g , n s k h n gc np h i p h nb l ut r ) . V t r n hb i nd c hc t h k h n gl u nl u nt r n hp h nb l ut r c h om t c o n s t , c o n s t n hn g h a p h i m c n h l i nk t n i b , c n g h a l , l i nk t c h t r o n g nv d c hc t h . N uk h n g , m i l i nk t l i c t h x yr a v i p h c t pc o n s t v h g yr a l ut r c p h nb t r o n gn h i uc p pt pt i n . M i l i nk t s a u s t h yc n gm t n h n g h a t r o n gn h i uf i l e i t n g , v p h nn n . B i v m t c o n s t m c n hl l i nk t n i b , m i l i nk t k h n g c g n g l i nk t c c n hn g h a t r n nv d c ht h u t v k h n gc v a c h m. V i c c l o i t c hh p , c s d n gt r o n gp h nl nc c t r n gh pl i nq u a n nb i uh i nl i nt c , t r n hb i nd c hl u nl u nc t h t h c h i n g pl i nt c .

e x t e r ni n tB U F S I Z E ;

C o n s t sa nt o n

V i c s d n gc o n s t k h n gg i i h n t h a yt h #x c n hs t r o n gb i uh i nl i nt c . N ub nk h i t om t b i n v i m t g i t r c s nx u t t r o n gt h i g i a nc h yv b nb i t i u s k h n gt h a y i c h oc c i c a b i n , n l t h c h n hl pt r n ht t l mc h on m t c o n s t n nt r n hb i nd c hs c u n gc pc h ob nm t t h n gb ol i n ub nv t n hc g n g t h a y i n . yl m t v d :
138/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 0 8 :S a f e c o n s . c p p //S d n gc o n s tc h oa nt o n#i n c l u d eu s i n gn a m e s p a c es t d ; c o n s ti n ti=1 0 0 ; // i nh n hl i nt cc o n s ti n tj=i+1 0//G i t r t c o n s t e x p rd i ac h =( l o n g )& j ;//L cl n gl ut r c h a rb u f[ j+1 0 ] ;//V nc nl m t b i uh i nc o n s t i n tm a i n( ){ c o u t< <" l o in h nv tv C R : " ; c h a rc=c i n . g e t( ) ;//K h n g t h t h a y i c h a rc 2=c+' a ' ; c o u t< <c 2 ; //. . . }/// :~

B nc t h t h yr n gt i l m t t h i g i a nb i nd c hc o n s t , n h n gk c t n ht t i . T u yn h i n , b i v t i l m t c o n s t , t n ht o ng i t r j v nc nx u t p h t t m t b i uh i nt h n gx u y nv c h n hn l m t t h i g i a nb i nd c h k h n g i . D n gt i pt h e o i h i a c h c a j v d o b u c c c t r n hb i nd c h p h nb l ut r c h oj . Nh n g i un yk h n gn g nc nv i c s d n gj t r o n gv i c x c n hk c ht h c c a b u f v t r n hb i nd c hb i t j l c o n s t v g i t r c g i t r n g a yc k h i l ut r c p h nb g i g i t r t i m t s i mt r o n gc h n gt r n h . T r o n gma i n( ) , b ns t h ym t l o i k h c n h a uc a c o n s t t r o n gn h nd n gc v g i t r k h n gt h c b i t nt i t h i g i a nb i nd c h . i un yc n g h a l l ut r l c nt h i t , v t r n hb i nd c hk h n gc g n g g i c h ob t c i ug t r o n gb n gb i ut n gc a n ( c c h n hv i t n gt n h t r o n gC ) . V i c k h i t ov np h i x yr a t i t h i i mx c n h , v m t k h i k h i t ox yr a , g i t r k h n gt h t h a y i . B nc t h t h yr n gc 2 c t n ht c v c n gl x c n hp h mv i h o t n gc h oc o n s t n h l n c h ob t k l o i k h c m t t i nb t r o n gv i c s d n g# x c n h. Nh m t v n c a t h c t , n ub nn g h r n gm t g i t r k h n gn nt h a y i , b nn nl mc h on m t c o n s t . i un yk h n gc h c u n gc pb oh i mc h n gl i n h n gt h a y i v , n c n gc h op h pt r n hb i nd c h t o r a m h i uq u h nb n gc c hl o i b l ut r v b n h c .

U n

Nc t h s d n gc o n s t l mc t , n h n gb nh un h mb or n gc c t r n hb i nd c hs k h n g t i n hv i g i c h om t t n gh pt r o n gb n gb i ut n gc a n , v v yl ut r s c p h nb . T r o n gn h n gt n hh u n g n y , c o n s t c n g h a l " m t p h nc a l ut r k h n gt h t h a y i . " T u yn h i n , g i t r k h n gt h c s d n gt i t h i g i a nb i nd c hb i v t r n hb i nd c hk h n gc nb i t n i d u n gc a c c l ut r t i t h i g i a nb i nd c h . T r o n g o nm s a u , b nc t h x e mb oc ol b t h pp h p :

// :C 0 8 :C o n s t a g . c p p//h n gs v t ph pc o n s ti n ti[ ]={ 1 ,2 ,3 ,4 }// ! f l o a tf[ i[ 3 ] ]//b th pp h ps t r u c tS{ i n ti ,j ; } ;c o n s tSs[ ]={ { 1 ,2 } , { 3 ,4 } }// ! id[ s[ 1 ]j . ] ;//b th pp h pi n tm a i n( ){ }/// :~

T r o n gm t n hn g h a m n g , t r n hb i nd c hp h i c k h n n gt or a m d i c h u y nc o nt r n g nx p c h a m n g . T r o n gc h a i n hn g h a l b t h pp h p t r n , b i nd c hp h nn nb i v n k h n gt h t mt h ym t b i u h i nt h n gx u y nt r o n g n hn g h a m n g .

K h cb i tv i C
H n gs c g i i t h i ut r o n gp h i nb n ut i nc a C++t r o n gk h i c c c i mk t h u t t i uc h u nCv n a n g c h o nt t . M c d yb a nCs a u q u y t n hb a og mc o n s t t r o n gC , b n gc c hn o n c n g h a l c h oh " m t b i nb n ht h n gm k h n gt h t h a y i . " T r o n gC , m t c o n s t l u nl u nc h i ml ut r v t nc a n l t o nc u . T r n hb i nd c hCk h n gt h i ut r m t c o n s t n h m t t h i g i a nb i nd c hk h n g i . T r o n gC , n ub nn i

c o n s ti n tB U F S I Z E=1 0 0 ;c h a rb u f[ B U F S I Z E ] ;

b ns n h n c m t l i , m c d n c v n h l m t i uh pl l m. V B U F S I Z Ec h i ml ut r u , t r n hb i nd c hCk h n gt h b i t c g i t r t i t h i g i a nb i nd c h . B nc t h t yc h nn i c o n s ti n tB U F S I Z E ; t r o n gC , n h n gk h n gc t r o n gC++ , v t r n hb i nd c hCc h pn h nn n h l m t t u y nb c h c c l ut r p h nb n h n gn i k h c . B i v Cm c n hl l i nk t b nn g o i c o n s t s , i un yc n g h a . C++m c n h l l i nk t n i b c h oc o n s t s v v yn ub nmu n t c i ut n gt t r o n gC++ , b np h i t h a y i m t c c h r r n gm i l i nh v i b nn g o i s d n ge x t e r n: e x t e r ni n tB U F S I Z E ;//T u y nb c h D n gn yc n gl mv i c t r o n gC . T r o n gC++ , m t c o n s t k h n gn h t t h i t p h i t or a l ut r . T r o n gCm t c o n s t l u nl u nt or a l ut r . C h a y k h n gl ut r c d n hr i n gc h om t c o n s t t r o n gC++p h t h u c v oc c hs d n gn . N i c h u n g , n um t c o n s t c s d n gc h ng i nl t h a yt h m t t nv i m t g i t r ( c n gg i n gn h b ns s d n gm t #x c n h) , s a u l ut r k h n gp h i c t or a c h oc c c o n s t . N uk h n gl ut r c t or a ( i un yp h t h u c v os p h c t pc a c c l o i d l i uv s t i n ht c a c c t r n hb i nd c h ) , c c g i t r c t h c x pv om c h o h i uq u c a oh ns a uk h i k i mt r a k i u , k h n gt r c , n h v i #x c n h. T u yn h i n , n ub nc m t a c h c a m t c o n s t ( d v t n h , b n gc c h i q u a n v om t c h c n n gm p h i m t m t t h a ms t i l i ut h a mk h o ) h o c b nx c n hn n h l e x t e r n, s a u l ut r c t or a c h oc c c o n s t .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 139/320

08/10/2013

Suy ngh trong C + +, Vol 1

T r o n gC++ , m t c o n s t n mn g o i t t c c c c h c n n gc p h mv i t pt i n( v d , n l v h n hb nn g o i t p t i n ) . C n g h a l , n m c n hl l i nk t n i b . i un yr t k h c s ov i t t c c c n hd n gk h c t r o n gC++ ( v t c o n s t t r o n gC ) m m c n h l i nk t b nn g o i . V v y , n ub nk h a i b om t c o n s t c n gt nt r o n gh a i t pt i nk h c n h a uv b nk h n gc a c h h o c x c n ht nn h e x t e r n, Cl t n g++t r n hb i nd c hs k h n g p h nb l ut r c h oc c c o n s t , n h n gc h ng i nl x pn v om . V c o n s t t h h i np h mv i t pt i n , b n c t h t n t r o n gC++t pt i nt i u k h n gc x u n g t t i t h i g i a nl i nk t . K t k h i m t c o n s t t r o n gC++m c n hl l i nk t n i b , b nc t h k h n gc h c nx c n hm t c o n s t t r o n g m t t pt i nv t h a mk h on n h m t e x t e r nt r o n gt pt i nk h c . c u n gc pc h om t c o n s t l i nk t b nn g o i v v yn c t h c t h a mc h i ut m t t pt i n , b np h i x c n hm t c c hr r n gn n h e x t e r n, n h t h n y :


e x t e r ni n tx=1 ;

Nh nt h yr n gb n gc c hc h on m t k h i t ov n i r n gn l e x t e r n, b nb u c l ut r c t or ac h oc c c o n s t ( m c d t r n hb i nd c hv nc t h c h nl mg pk h n g i y ) . V i c k h i t ot h i t l pn yn h m t n h n g h a , k h n gp h i l m t t u y nb . V i c k k h a i : e x t e r ni n tx ; t r o n gC++c n g h a l n hn g h a t nt i n i k h c ( m t l nn a , i un yl k h n gn h t t h i t p h i n gt r o n g C ) . B yg i b nc t h t h yl d ot i s a oC++ i h i m t c o n s t n hn g h a c m t k h i t o : i n i t i a l i z e r p h n b i t m t t u y nb t m t n hn g h a ( t r o n gCn l u nl u nl m t n hn g h a , v v yk h n gk h i t ol c nt h i t ) . V i m t e x t e r nc o n s t k h a i , t r n hb i nd c hk h n gt h l mg pl i nt c b i v n k h n gb i t g i t r . C c ht i pc nC nc o n s t k h n gp h i l r t h u c h , v n ub nmu ns d n gm t g i t r c t nt r o n gm t b i u t h c h n gs ( m t t r o n g p h i c n hg i t i t h i g i a nb i nd c h ) , Cg nn h b t b u c b ns d n g#x c n ht r o n gt i nx l .

C o nt r

C o nt r c t h c t h c h i nc o n s t . T r n hb i nd c hv ns c g n g n g nc h nv i c p h nb l ut r v l m g pl i nt c k h i g i a od c hv i c o n s t c o nt r , n h n gc c t n hn n gn yc v t h u c ht r o n gt r n gh pn y . Qu a nt r n gh n , c c t r n hb i nd c hs c h ob nb i t n ub nc g n gt h a y i m t c o n s t c o nt r , c t h mr t n h i u s a nt o n . K h i s d n gc o n s t v i c o nt r , b nc h a i l a c h n : c o n s t c t h c pd n gc h on h n gg c c c o nt r t r n , h o c c o n s t c t h c pd n gc h oc c a c h c l ut r t r o n gc o nt r c h n hn . C p h pc h o l m t c h t b i r i l c ut i nn h n gt r n nt h o i m i v i t h c h n h .

C o nt r nc o n s t
B q u y t v i m t n hn g h ac o nt r , n h v i b t k n hn g h ap h c t p , l c n b t ut n hd a n hv l mv i c t h e oc c hc a b nr a . C c c o n s t " . g nn h t v i " c t l i nk t v i c c i un c V v y , n ub nmu n n g nc h nb t k t h a y i c c y ut b n a n gt r n , b nv i t m t n hn g h a n h t h n y : c o n s ti n t*u ; B t ut n hd a n h , c h n gt a c " ul m t c o nt r , t r t i m t c o n s t i n t . " y , k h n gk h i t ol c nt h i t b i v b n a n gn i r n guc t h t r nb t c i ug ( c n g h a l , n k h n gp h i l c o n s t ) , n h n gc c i un t r t i k h n gt h t h a y i . yl m t p h nn h n h n gk h h i u . B nc t h n g h r n g l mc h oc o nt r c h n hn k h n gt h t h a y i , c n g h a l , n g nc h nb t k t h a y i a c h c t r o n gu, b nc h c nd i c h u y nc o n s t s a n gp h a b nk i a c a i n t n h t h n y :
i n tc o n s t*v ;

c o nt r c o n s t

Nk h n gp h i l t t c n h n gg i nr k h i n g h r n g i un yn n c " vl m t c o n s t c o nt r nm t i n t . " T u yn h i n , c c ht h c m n t h c s c l " vl m t c o nt r b n ht h n g nm t i n t m s x yr a l c o n s t . " l , c o n s t b r n gb u c b nt h n i n t m t l nn a , v h i uq u l g i n gn h n hn g h a t r c . T h c t l h a i n hn g h a n y ug i n gn h a ul i mk h h i u , t r n hn h ml nn yt r nm t p h nc a n g i c c a b n , c l b nn nd n hv oc c h n ht h c ut i n . l mc h ob nt h nm t c o nt r c o n s t , b np h i t c o n s t c t b np h i c a * , n h t h n y :

i n td=1 ;i n t*c o n s tw=& D ;

B y g i n c : " wl m t c o nt r , l c o n s t , m i m nm t i n t . " B i v c o nt r c h n hb yg i l c o n s t , t r n hb i nd c h i h i p h i c t r n hb ym t g i t r b a n us k h n gt h a y i c h oc u c s n gc a c o nt r . l OK , t u yn h i n , t h a y i n h n gg m i mg i t r b n gc c hn i
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 140/320

08/10/2013

Suy ngh trong C + +, Vol 1

*W=2 ;

B nc n gc t h l mc h om t c o n s t c o nt r nm t c o n s t i t n gs d n gm t t r o n gh a i h n ht h c p h pl :
i n td=1 ;c o n s ti n t*c o n s tx=& D ; /( 2 ) //( 1 )i n tc o n s t*c o n s tx 2=& D ;/

B yg i k h n gc o nt r c n gk h n gp h i i t n gc t h c t h a y i . M t s n g i c h or n gh n ht h c t h h a i l p h h ph nb i v c o n s t l u n c t b np h i c a n h n gg n i . B ns p h i q u y t n hr r n gh nc h op h o n gc c hm h a c t h c a b n . D i yl n h n gd n g t r nt r o n gm t t pt i nc o mp i l e a b l e :
// :C 0 8 :C o n s t P o i n t e r s . c p pc o n s ti n t*u ;i n tc o n s t*v ;i n td=1 ;i n t* c o n s tw=& D ;c o n s ti n t*c o n s tx=& D ; //( 1 )i n tc o n s t*c o n s tx 2=& d//( 2 )i n tm a i n( ){ }/// :~

n hd n g C u ns c hn yl mc h om t i mc ac h am t n hn g h ac o nt r t r nm t d n g , v k h i t om i c o nt r t i t h i i mx c n hb t c k h i n oc t h . B i v i un y , p h o n gc c h n hd n gc a" g n " c c ' * ' c c k i ud l i uc t h : i n t*u=& i ; n h i n t * l m t l o i r i n gb i t c h oc h n hn . i un yl mc h om d h i u , n h n gk h n gma y k h n gp h i l t h c s l c c h i ul mv i c . C c ' * ' t r o n gt h c t l i nk t v i c c n hd a n h , k h n gp h i l l o i . Nc t h c t b t c n i n og i a t nl o i v n hd a n h . V v y , b nc t h l m i un y : i n t*u=&i ,v=0 ; m t or a m t * ui n t , n h t r c , v k h n gc o nt r i n t v. B i v c g i t h n gt h yk h h i un y , c c ht t n h t l t h c h i nt h e oc c h n ht h c t h h i nt r o n gc u ns c hn y .

P h nc n gv k i m t r ak i u
C++l r t c t h v k i mt r a k i u , v i un yk od i nt pc o nt r . B nc t h g n a c h c a m t p h i c o n s t i t n gv om t c o n s t t r b i v b nc h ng i nh a h nk h n gt h a y i c i g l OK t h a y i . T u y n h i n , b nk h n gt h g n a c h c a m t c o n s t i t n gv om t k h n gc o n s t t r b i v s a u b nn i r n gb n c t h t h a y i i t n gt h n gq u a c o nt r . T t n h i n , b nl u nl u nc t h s d n gm t d nd i nv i n b u c n h m t b i t p , n h n g i un yl t h c h n hl pt r n hx ub i v b nn ys a u c p h v c o n s t Ne s s c a i t n g , c n gv i b t k a nt o nh a c a c o n s t . V d :
// :C 0 8 :P o i n t e r A s s i g n m e n t . c p pi n td=1 ;i n te=2 ;i n t*u=& D ;//O K-dk h n g c o n s t// !i n t*v=& e ;//b th pp h p- i nt c o n s ti n t*w=( i n t* )& e ;// p h pl n h n gt h ct x ui n tm a i n( ){ }/// :~

M c d C++g i pn g nc h nc c l i n k h n gb ov b nk h i c h n hm n hn ub nmu np h v c c h a nt o n . C h m n gk t N i n g h i mn g t c o n s t Ne s s l k h n gb t b u c l v i c h m n gk t . B nc t h n i c h a r*c p=" h o w d y " ; v t r n hb i nd c hs c h pn h nn m k h n gc nk h i un i . yl k t h u t m t l i b i v m t m n gk t c h ( " h o wd y " t r o n gt r n gh pn y ) c t or a b i t r n hb i nd c hn h l m t m n gn h nv t l i nt c , v k t q u c a c c m n gk t t r c hd nl a c h b t uc a n t r o n gb n h . S a i b t k c a c c n h nv t t r o n gm n gl m t l i t h i g i a nc h y , m c d k h n gp h i t t c c c t r n hb i nd c ht h c h i n i un ym t c c hc h n hx c . V v y , c h m n gn h nv t t h c s m n gk t k h n g i . T t n h i n , t r n hb i nd c hc h op h pb nn h n c n g a yv i i x v i h n h k h n gc o n s t b i v c m Cr t n h i uh i nd a t r nn y . T u yn h i n , n ub nc g n g t h a y i c c g i t r t r o n gm t m n gk t c h , h n hv i n yl k h n gx c n h , m c d n c t h s l mv i c t r nn h i um y . N ub nmu n c t h s a i c c c h u i , t n t r o n gm t m n g : c h a rc p[ ]=" h o w d y " ; K t k h i t r n hb i nd c ht h n gk h n gt h c t h i s k h c b i t , b ns c n h c n h k h n gs d n gh n ht h c t h h a i n yv d o , i mt r n nk h t i n ht .

C h cn n gl pl u n V g i t r t r l i

V i c s d n gc o n s t x c n h i s c h c n n gv g i t r t r l i l m t n i m k h i n i mh n gs c t h g y n h ml n . N ub n a n g i q u a i t n gt h e o g i t r , c h n hc o n s t k h n gc n g h a c h ok h c hh n g( c n g h a
141/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

l c c i s c t r u y nk h n gt h c s a i t r o n gc h c n n g ) . N ub n a n gt r v m t i t n gc a m t n g i d n g n hn g h a b i g i t r n h m t c o n s t , n c n g h a l g i t r t r l i k h n gt h c s a i . N ub n a n g i q u a v q u a yt r l i a c h , c o n s t l m t l i h a r n g c h nc a a c h s k h n g c t h a y i .

i n g a n gq u ag i t r c o n s t
B nc t h c h nc h c n n gl pl u nl c o n s t k h i i q u a c h n gb n gg i t r , c h n gh nn h
k h o n gt r n gf 1( i n ti ){ i++ ;//b th pp h p-l it h ig i a nb i nd c h }

n h n g i un yc n g h a l g ? B n a n gt h c h i nm t l i h a r n gc c g i t r b a n uc a b i ns k h n g c t h a y i b n gc h c n n gf 1 ( ) . T u yn h i n , d oc c i s c t r u y nt h e og i t r , b nn g a yl pt c t om t b n s a oc a b i nb a n u , d o h a h nc h ok h c hh n gl m c n h i ng i . T r o n gc h c n n g , c o n s t ma n gm t n g h a : i s k h n gt h t h a y i . V v y , n t h c s l m t c n gc t c g i c a c h c n n g , v k h n gp h i l n g i g i . t r n hn h ml nc h on g i g i , b nc t h a r a l pl u nm t c o n s t t r o n g c h c n n g , c h k h n gp h i l t r o n g d a n hs c h i s . B nc t h l m i un yv i m t c o nt r , n h n gm t c p h p ph nl t c v i c c t i l i ut h a mk h o , m t c h s c p h t t r i n y t r o n gC h n g1 1 . M t t h i g i a nn g n , m t t h a mc h i u l n h m t c o nt r l i nt c c t n gd e r e f e r e n c e d , v v yn c t c d n gl m t b d a n hc h om t i t n g . t or a m t t i l i ut h a mk h o , b ns d n gv t r o n g n hn g h a . V v y , n hn g h a c h c n n gn o n c o n f u s i n g t r n gn h t h n y :
k h o n gt r n gf 2( i n ti c ){ l it h ig i a nb i nd c h } c o n s ti n t&i=i c ; i++ ; //b th pp h p-

M t l nn a , b ns n h n c m t t h n gb ol i , n h n gt h i g i a nn y , c o n s t Ne s s c a i t n g a p h n g k h n gp h i l m t p h nc a c h k c h c n n g , n c h c n g h a v i v i c t h c h i nc c c h c n n gv d o n n t k h c hh n g .

T r v g i t r c o n s t
M t c h nl t n gt n h g i c h og i t r t r v . N ub nn i r n gg i t r t r v c a m t c h c n n gl c o n s t : c o n s ti n tg( ) ; b n a n gh a h nr n gc c b i nb a n u( b nt r o n gk h u n gc h c n n g ) s k h n g c s a i . V m t l nn a , b i v b n a n gt r l i t h e og i t r , n c s a oc h pd o g i t r b a n uk h n gb a og i c t h c s a i t h n gq u a g i t r t r v . L c u , i un yc t h l mc h oc c c i mk t h u t c a c o n s t d n gn h v n g h a . B nc t h t h yv i c t h i u r r n g n hh n gc a t r l i c o n s t s t h e og i t r t r o n gv d n y :
// :C 0 8 :C o n s t v a l . c p p //Q u a yt r l ic o n s t st h e og i t r //K h n gc n g h a iv ic cl o it c hh p i n tf 3( ){ r e t u r n1 ; }c o n s ti n tf 4( ){ r e t u r n1 ; } i n tm a i n( ){ i n tj=f 3( ) ;//c n gt t i n tk=f 4( ) ;//N h n g i un y h o t n gt tq u !}/// :~

C h ox yd n gt r o n gc c l o i , n k h n gq u a nt r n gc h od b nq u a yt r l i g i t r n h m t c o n s t , v v yb nn n t r n hg yn h ml nc c l pt r n hv i nv k h c hh n g b c c p h nc o n s t k h i t r v m t b u i l t i nl o i t h e og i t r . T r v g i t r n h m t c o n s t t r n nq u a nt r n gk h i b n a n gl mv i c v i c c l o i n g i d n g n hn g h a . N u m t h mt r v m t l p i t n gt h e og i t r n h m t c o n s t , g i t r t r l i c h c n n gm k h n gc t h l m t g i t r t r i ( c n g h a l , n c t h k h n g c c h n hh o c n uk h n gs a i ) . V d :
// :C 0 8 :C o n s t R e t u r n V a l u e s . c p p //L i nt ct r l it h e og i t r //K tq u k h n gt h cs d n gn h m tg i t r t r i c l a s sX{ i n ti ;c n g : X( i n ti i=0 ) ; t r n gs a i( ) ; } ; X: :X( i n ti i ){ i=i i ; } k h o n gt r n gX: :s a i( ){ i++ ; }
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 142/320

08/10/2013

Suy ngh trong C + +, Vol 1

Xf 5( ){ t r l iX( ) ; } c o n s tXf 6( ){ t r l iX( ) ; } t r n gf 7( X&x ){ //P a s sb n gc c ht h a mc h i uk h n gc o n s t x . m o d i f y( ) ; } i n tm a i n( ){ f 5( )=X( 1 ) ;//O K-k h n gc o n s tt r l ig i t r ( ) ;//O K//N g u y nn h nt h ig i a nb i nd c hl i . : // ! f 7( f 5( ) ) ; !// f 6( )=X( 1 ) ; !// .f 6( )s a i( ) ; // ! f 7( f 6( ) ) ; }/// :~

f 5( )s a i

f 5 ( ) t r v m t k h n gc o n s t X i t n g , t r o n gk h i f 6 ( ) t r v m t Xc o n s t i t n g . C h l k h n gc o n s t g i t r t r v c t h c s d n gn h m t g i t r t r i . V v y , i uq u a nt r n gl s d n gc o n s t k h i t r v m t i t n gb n gg i t r n ub nmu nn g nc h nv i c s d n gn n h m t g i t r t r i . L d oc o n s t k h n gc n g h a k h i b n a n gt r v m t l o i t c hh pt h e og i t r l t r n hb i nd c h n g nk h n g c h on l m t g i t r t r i ( v n l u nl u nl m t g i t r , v k h n gp h i l m t b i n ) . C h k h i b n a n gt r v i t n gn g i d n g n hn g h a c c l o i g i t r n on t r t h n hm t v n . C h c n n gf 7 ( ) c i s c a n n h m t k h n gc o n s t t h a mk h o ( m t c c hb s u n gx l c c a c h t r o n gC++ v l c h c a c h n g1 1 ) . i un yl c h i uq u g i n gn h t h a mg i a m t p h i c o n s t c o nt r , n c h l c p h p l k h c n h a u . L d on ys k h n gb i nd c ht r o n gC++l v v i c t or a m t t mt h i . T mt h i i k h i , t r o n gq u t r n h n hg i c a m t b i ut h c , t r n hb i nd c hp h i t or a c c i t n g t mt h i . yl n h n g i t n gn h t h n ok h c : h y uc ul ut r v h p h i c x yd n gv p h h y . S k h c b i t l b n k h n gb a og i n h nt h yc h n gt r n hb i nd c hc h ut r c hn h i mv q u y t n hr n gh c nt h i t v c c c h i t i t c a s t nt i c a h . Nh n gc m t i uv t mt h i : h t n gc o n s t . B i v b nt h n gs k h n gt h c c b nt a yc a b nt r nm t i t n gt mt h i , n i c h on l mc i g s t h a y i i u t mt h i l g nn h c h c c h nl m t s a i l mb i v b ns k h n gt h s d n gt h n gt i n . B n gc c hl mc h ot t c t mt h i t n g c o n s t , t r n hb i nd c ht h n gb oc h ob nk h i b nt h c h i ns a i l m. T r o n gv d t r n , f 5 ( ) t r v m t k h n gc o n s t X i t n g . Nh n gt r o n gc c b i uh i n : f 7( f 5( ) ) ; t r n hb i nd c hp h i s nx u t m t i t n gt mt h i g i g i t r t r l i c a f 5 ( ) n c t h c t h n gq u a v o f 7 ( ) . i un ys l t t n uf 7 ( ) l pl u nc a m n hb n gg i t r , s a u t mt h i s c s a oc h pv of 7 ( ) v n s k h n gc v n g x yr a v i t mt h i X. T u yn h i n , f 7 ( ) c i s c a n b n g c c h t h a mk h o , c n g h a l t r o n gv d n yc a c h t m t h i c a X. T f 7 ( ) k h n gc i s c a n b i c o n s t t h a mk h o , n c q u y ns a i c c i t n gt mt h i . Nh n gt r n hb i nd c hb i t r n gt mt h i s b i nm t n g a ys a uk h i n hg i b i uh i n h o nt t , v d o b t k t h a y i b nt h c h i nc h oc c t mt h i Xs b m t . B n gc c hl mc h ot t c c c i t n gt mt h i t n gc o n s t , t n ht r n gn yg yr a m t l i t h i g i a nb i nd c h , d o b nk h n gb b t b i n h n gg s l m t l i r t k h t m. T u yn h i n , n h nt h yn h n gb i uh i n l h pp h p :


f 5( )=X( 1 ) ; .f 5( )s a i( ) ;

M c d n h n g n gc h u y nt ph pc h oc c t r n hb i nd c h , h a n gt h c s c v n . f 5 ( ) t r v m t X i t n g , v t r n hb i nd c h p n gc c b i ut h c t r nn p h i t or a m t t mt h i c h or n gg i t r t r v . V v y , t r o n gc h a i b i ut h c c c i t n gt mt h i a n g c s a i , v n g a ys a uk h i b i ut h c l t r nt mt h i c l ms c h . K t q u l , n h n gs a i s b m t d o , m n yc l l m t l i n h n gt r n hb i nd c hk h n g c h ob nb t c i ug v n . B i uh i nn h t h n yl ng i n b nc t h p h t h i nc c v n , n h n gk h i m i t h t r n np h c t ph nn c t h c h om t l i t r t q u a c c v t n t . C c hc o n s t Ne s s c a i t n gl p c b ot n c h i nt h s a ut r o n gc h n gn y .

i q u av q u a yt r l i ac h

N ub nv t q u a h o c t r l i m t a c h ( h o c m t c o nt r h o c t h a mc h i u ) , n c t h c h oc c l pt r n hv i nc a k h c hh n g c n v t h a y i g i t r b a n u . N ub nl mc h oc o nt r h o c t h a mk h om t c o n s t , b nn g n c h n i un yx yr a , c t h g i pb nt i t k i m m t s a ub u n . T r o n gt h c t , b t c k h i n ob n a n g i q u a m t a c h v om t c h c n n g , b nn nl mc h on m t c o n s t n uc t h . N uk h n g , b n a n gl o i t r k h n n g s d n gc h c n n gv i b t c i ug l m t c o n s t . V i c l a c h n t r v m t c o nt r h o c t h a mc h i u nm t c o n s t p h t h u c v on h n gg b nmu nc h op h p

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

143/320

08/10/2013

Suy ngh trong C + +, Vol 1

l pt r n hv i nk h c hh n gc a b nl mg v i n . D i yl m t v d c h n gmi n hv i c s d n gc o n s t c o nt r n h t h a ms c h c n n gv g i t r t r l i :
// :C 0 8 :C o n s t P o i n t e r . c p p //L i nt ca r g/t r l ic o nt r k h o n gt r n gt( i n t* ){ } k h o n gt r n gu( c o n s ti n t*C I P ){ !// *C I P=2 ;//b th pp h p- ig i t r i n ti=*C I P ;//O K-b ns a o g i t r // ! i n t*I P 2=C I P ;//b th pp h p :k h n gc o n s t } c o n s tc h a r*v( ){ //T r v ac h c am n gk t t n h : t r l i" k tq u c ac h cn n gv( ) " ; } c o n s ti n t*c o n s tw( ){ s t a t i ci n ti ; t r l i& i ; } i n tm a i n( ){ i n tx=0 ; i n t*i p =& x ; c o n s ti n t *C I P= & x ; t ( i p ) ; //O K// ! t( C I P ) ;//K h n gO K u( I P ) ; // O K u( C I P ) ; // N g o ir aO K// ! c h a r*c p=v( ) ;//K h n gO K c o n s tc h a r* C S T Q=v ( ) ; !/ /O K/ / i n t* I P 2= w( ) ;/ /K h n gO K c o n s ti n t* c o n s tC C I P= w ( ) ;//O K c o n s ti n t*c i p 2=w( ) ; !//O K// *w( )=1 ;//K h n gO K }/// :~

C h c n n gt ( ) c m t k h n gb n ht h n gc o n s t c o nt r n h m t i s , v u( ) c m t c o n s t c o nt r . T r o n gu( ) b nc t h t h yr n gc g n gt h a y i c h nc a c o n s t c o nt r l b t h pp h p , n h n gb nc t h t t n h i ns a o c h pc c t h n gt i nr a t h n hm t k h n gc o n s t b i n . T r n hb i nd c hc n gn g nc nb nt v i c t or a m t k h n g c o n s t c o nt r b n gc c hs d n g a c h c l ut r t r o n gm t c o n s t c o nt r . C c c h c n n gv( ) v w( ) k i mt r a l i n g n g h a g i t r . v( ) t r v m t c o n s t c h a r * c t or a t m t m n gk t c h . T u y nb n yt h c s t or a a c h c a n h nv t m n g e n , s a uk h i t r n hb i nd c ht or a n v l ut r n t r o n gc c k h uv c l ut r t n h . Nh c pt r c , m n gk t n yl m t k t h u t k h n g i , c t h h i n n g nc a c c g i t r t r l i v( ) . G i t r t r l i w( ) y uc uc h a i c o nt r v n h n gg n t r t i p h i l c o n s t . Nh v i v( ) , g i t r t r v b i w( ) l h pl s a uk h i c h c n n gc h t r v b i v n l t n h. B nk h n gb a og i mu nt r l i c o nt r ns t a c kb i n a p h n gv h s k h n gc h i ul c s a uk h i t r v c h c n n gv n g nx p c l ms c h . ( M t c o nt r t h n g t h n gb nc t h t r l i l a c h l ut r c pp h t t r nh e a p , m v nc nh i ul c s a uk h i t r v c h c n n g . ) T r o n gma i n( ) , c c c h c n n g c t h n g h i mv i l pl u nk h c n h a u . B nc t h t h yr n gt ( ) s c h pn h n m t k h n gc o n s t h mc o nt r , n h n gn ub nc g n g v t q u a n m t c o nt r nm t c o n s t , k h n gc l i h a t ( ) s l i i m nc a c o nt r m t m n h , n nt r n hb i nd c hc u n gc pc h ob nm t l i t i nn h n . u( ) c m t c o n s t c o nt r , v v yn s c h pn h nc h a i l o i i s . D o , m t c h c n n gm p h i m t m t c o n s t c o nt r t n gq u t h nm t t r o n g k h n g . T h e od k i n , g i t r t r l i v( ) c t h c c h n hc h c m t c o nt r nm t c o n s t . B nc n gh yv n gr n gc c t r n hb i nd c ht c h i c h n hg i t r t r l i w( ) v om t k h n gc o n s t c o nt r , v c h pn h nm t i n t * k h u y t i m , n h n gn c t h l m t c h t n g c n h i nk h i t h yr n gt n c n gc h pn h nm t i n t * , m k h n gp h i l m t k t h pc h n hx c v i k i ut r v . M t l nn a , b i v g i t r ( l a c h c t r o n gc o nt r ) a n g c s a o c h p , l i h a r n gc c b i nb a n ul b n hh n g c t n gl ug i . D o , t h h a i c o n s t t r o n gc o n s t i n t * c o n s t c h c n g h a k h i b nc g n gs d n gn n h l m t g i t r t r i , t r o n gt r n gh pn y , t r n hb i nd c hs n g nc nb n . T i uc h u nt h a ms i q u a T r o n gCn r t p h b i n i q u a g i t r , v k h i b nmu nv t q u a m t a c h l a c h nd u yn h t c a b nl s [ 4 0 ] d n gm t c o nt r . T u yn h i n , k h n gp h i c a c c p h n gp h p c a t h c ht r o n gC++ . T h a yv o , s l a c h n ut i nc a b nk h i t r u y nm t i s l p h i v t q u a b n gc c ht h a mc h i u , v c o n s t t h a mk h ot i . c c l pt r n hv i nk h c hh n g , c p h pl g i n gn h c a i q u a g i t r , v v yk h n gc s n h ml nv c o nt r h t h mc h k h n gc np h i s u yn g h v c o nt r . C h ot c g i c a c h c n n g , i q u a m t a c h l h u n h l u nl u nh i uq u h n i q u a t o nb m t l p i t n g , v n ub n i q u a c o n s t t h a mk h on c n g h a l c h c n n gc a b ns k h n gt h a y i i m nc a a c h , v v yh i uq u t q u a n i ml pt r n hc a k h c hh n gx e ml c h n hx c g i n gn h p a s s b y g i t r ( c h c h i uq u h n ) . V c p h pc a t i l i ut h a mk h o( c v n h p a s s b y g i t r c h on g i g i ) n c t h v t q u a m t i t n gt m t h i nm t c h c n n gm p h i m t m t c o n s t t i l i ut h a mk h o , t r o n gk h i b nk h n gb a og i c t h v t q u a m t i t n gt mt h i nm t c h c n n gm p h i m t m t c o nt r v i m t c o nt r , a c h p h i c t h c h i n m t c c hr r n g . V v y , i n g a n gq u a t h a mk h ot or a m t t n hh n hm i m k h n gb a og i x yr a t r o n gC : t mt h i , m l u nl u nl c o n s t , c t h c c a n a c h c h u y n nm t c h c n n g . yl l d ot i s a o , c h o p h pt mt h i c t h n gq u a c h c n n gt h a mk h o , i s p h i l m t c o n s t t h a mk h o . V d s a u yc h n g t i un y :


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 144/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 0 8 :C o n s t T e m p o r a r y . c p p //T mt h il c o n s t c l a s sX{ } ; Xf( ){ r e t u r nX( ) ; }//T r v g i t r k h o n gt r n gg 1( X& ){ }//P a s sb ik h n gc o n s tt h a mk h ok h o n gt r n gg 2( c o n s tX& ) { }//P a s st h a mc h i uc o n s t i n tm a i n( ){ //L i :c o n s tt mt h i ct or ab if( ) : // ! g 1( f( ) ) ; //O K :g 2c m tt h a mc h i uc o n s t : g 2( f( ) ) ; }/// :~

f ( ) t r v m t i t n gc a l pXt h e o g i t r . i u c n g h a k h i b nn g a yl pt c c g i t r t r l i c a f ( ) v v t q u a n c h c n n gk h c n h t r o n gc c c u c g i ng 1 ( ) v g 2 ( ) , t mt h i c t or a v t mt h i l c o n s t . D o , c c c u c g i t r o n gG1 ( ) l m t l i b i v g 1 ( ) k h n gp h i m t m t c o n s t t h a mk h o , n h n gc c c u c g i ng 2 ( ) l OK .

C cl ph c

P h nn yc h ot h yc c hb nc t h s d n gc o n s t v i c c l ph c . B nc t h mu nt or a m t a p h n gc o n s t t r o n gm t l ph c s d n gt r o n gb i ut h c k h n g i m s c n hg i t i t h i g i a nb i nd c h . T u yn h i n , n g h a c a c o n s t l k h c n h a ut r o n gc c l ph c , v v yb np h i h i uc c t yc h n t or a c o n s t d l i ut h n h v i nc a m t l p . B nc n gc t h l mc h ot o nb m t i t n gc o n s t ( v n h b nv a t h y , t r n hb i nd c hl u nl u nl mc h o i t n gt mt h i c o n s t ) . Nh n gb oq u nc o n s t Ne s s c a m t i t n gp h c t ph n . T r n hb i nd c hc t h mb oc o n s t Ne s s c a m t l o i t c hh pn h n gn k h n gc t h t h e od i n h n gp h c t pc a m t l ph c . mb oc o n s t Ne s s c a m t i t n gl p , c o n s t c h c n n gt h n hv i n c g i i t h i u : c h m t c o n s t c h c n n g t h n hv i nc t h c g i l m t c o n s t i t n g . M t t r o n gn h n gn i b nmu ns d n gm t c o n s t c h oc c b i ut h c l i nt c l b nt r o n gc c l ph c . V d i n h n hl k h i b n a n gt or a m t m n gb nt r o n gm t l pv b nmu ns d n gm t c o n s t t h a yv m t #x c n h t h i t l pk c ht h c m n gv s d n gt r o n gc c t n ht o nl i nq u a n nm n g . K c ht h c m n gl m t c i g b nmu ng i nb nt r o n gl p , v v yn ub ns d n gm t t nn h k c ht h c , v d , b nc t h s d n g t n t r o n gm t l ph c m k h n gc m t c u c n g . T i nx l x l t t c #x c n hn h l t o nc ut h e o q u a n i mc h n g c n hn g h a , i un ys k h n g t c h i uq u mo n gmu n . B nc t h g i n hr n gs l a c h nh pl l t m t c o n s t b nt r o n gl p . i un yk h n gt or a k t q u mo n gmu n . B nt r o n gm t l p , c o n s t m t p h nt r v v i n g h a c a n t r o n gC . Np h np h i l ut r t r o n g m i i t n gv i d i nc h om t g i t r c k h i t om t l nv s a u k h n gt h t h a y i . V i c s d n g c o n s t t r o n gm t l ph c c n g h a l " i un yl k h n g i t r o n gs u t c u c i c a i t n g . " T u yn h i n , m i i t n gk h c n h a uc t h c m t g i t r k h c n h a uc h or n gk h n g i . V v y , k h i b nt om t b n ht h n g( k h n gt n h) c o n s t b nt r o n gm t l p , b nc t h k h n gc u n gc pc h on m t g i t r b a n u . K h i t on yp h i x yr a t r o n gc c n h x yd n g , t t n h i n , n h n gt r o n gm t v t r c b i t t r o n gc c n h x yd n g . B i v m t c o n s t p h i c k h i t ot i t h i i mn c t or a , b nt r o n gc t h c h n h c a c c n h x yd n gc c c o n s t p h i c k h i t o . N uk h n g , b n a n gt r i v i l a c h nc h i c h o nk h i m t s i ms a ut r o n gc t h x yd n g , c n g h a l c o n s t s c b k h i t ot r o n gm t t h i g i a n . Ng o i r a , s k h n gc g g i c h ob nt h a y i g i t r c a c o n s t n h n gn i k h c n h a ut r o n gc t h x yd n g . Da n hs c hk h i t ox yd n g i mk h i t o c b i t c g i l d a n h s c h k h i t o x y d n g , v n c p h t t r i n s d n gt r o n gt h a k ( c n ut r o n gC h n g1 4 ) . D a n hs c hk h i t ox yd n gt r o n g , n h t nc a n , c h x yr a t r o n g n hn g h a c a c c n h x yd n gl m t d a n hs c h" c c c u c g i x yd n g " x yr a s a uk h i d a n hs c h i s c h c n n gv d uh a i c h m, n h n gt r c k h i c pm m nc a c t h x yd n g . i un yl n h c n h b nr n gv i c k h i t ot r o n gd a n hs c hn yx yr a t r c k h i b t k m n h x yd n gc h n h c t h c h i n . yl n i t t t c c o n s t k h i t o . C c h n ht h c t h c hh pc h oc o n s t t r o n gm t l ph c c t h h i n y :

c o n s tt r o n gl p

// :C 0 8 :C o n s t I n i t i a l i z a t i o n . c p p //K h it oc o n s tt r o n gl p #I n c l u d eu s i n gn a m e s p a c es t d ; l pF r e d{ c o n s ti n ts i z e ;c n gc n g : v o i dp r i n t( ) ; } ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

F r e d( i n ts z ) ;

145/320

08/10/2013

Suy ngh trong C + +, Vol 1

F r e d: :F r e d( i n tS Z ) :k c ht h c( S Z ){ }v o i dF r e d: :i n( ){ c o u t< <k c ht h c< < e n d l ; } i n tm a i n( ){ F r e dm t( 1 ) ,b( 2 ) ,c( 3 ) ; a . p r i n t( ) ,b . p r i n t( ) ,c . p r i n t( ) ; }/// :~

D i h n ht h c d a n hs c hk h i t ox yd n g t r nl k h h i ul c ub i v b n a n gk h n gs d n g n h n t h ym t b u i l t i nl o i i x n h t h n c m t n h x yd n g . " C cn h x yd n g "v i n h i ut c hh p L n g nn g n l c p h t t r i nv n h i uh nn a c a v ol mc h on g i d n gx c n hl o i t r n gg i n g n h c x yd n gt r o n gc c l o i , n t r n nr r n gr n gc n h n gl c n l h u c h t h c h i nx yd n g t r o n gc c l o i t r n gg i n gn h n g i d n g n hn g h a c c l o i . T r o n gd a n hs c hk h i t ox yd n g , b nc t h i ut r m t l o i t c hh pn h t h n c m t n h x yd n g , n h t h n y :
// :C 0 8 :B u i l t I n T y p e C o n s t r u c t o r s . c p p #I n c l u d eu s i n gn a m e s p a c es t d ;

l o iB{ } ;

i n ti ;c n g :

B( i n ti i ) ;

v o i dp r i n t( ) ;

B: :B( i n ti i ) :i( i i ){ }v o i dB: :i n( ){ c o u t< <i< <e n d l ; } i n tm a i n( ){ Bm t( 1 ) ,b( 2 ) ; f l o a tp i( 3 . 1 4 1 5 9 ) ; a . p r i n t( ) ;b . p r i n t( ) ; c o u t< <p i< <e n d l ; }/// :~

i un y c b i t q u a nt r n gk h i k h i t oc o n s t t h n hv i nd l i uv c h n gp h i c k h i t ot r c k h i c c c q u a nc h c n n g c n h pv o . Nc n g h a m r n gn y" x yd n g " v i n h i ut c hh p( t r o n g c h c n g h a l c h u y nn h n g ) i v i t r n gh pc h u n g , l l d on i p i ( 3 . 1 4 1 5 9 t c p h m n hn g h a t r o n g o nm t r n . ) Nt h n gh u c h n gg i m t l o i t c hh pb nt r o n gm t l ph c mb ok h i t ov i c c n h x y d n g . V d , yl m t s n g u y nl p :
// :C 0 8 :E n c a p s u l a t i n g T y p e s . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; l pI n t e g e r{ i n ti ;c n gc n g : S n g u y n( i n ti i=0 ) ; v o i dp r i n t( ) ; } ; S n g u y nI n t e g e r: :( i n ti i ) :i( i i ){ }v o i dI n t e g e r: :i n( ){ c o u t< <i< <' ' ; }i n t m a i n( ){ I n t e g e ri[ 1 0 0 ] ; f o r( i n tj=0j< 1 0 0 ;j++ ) i[ j ]i n( ) ; }// / : .~

C c m n gI n t e g e r s t r o n gma i n( ) ut n gk h i t ob n gk h n g . K h i t on yl k h n gn h t t h i t p h i t n k mh nm t c h ov n gl ph o c me ms e t ( ) . Nh i ut r n hb i nd c hd d n gt i uh a n y m t q u t r n hr t n h a n h .

H n gs t h i g i a nb i nd c ht r o n gc cl ph c

V i c s d n gt r nc a c o n s t l t h v v c t h h u c ht r o n gt r n gh p , n h n gn k h n gg i i q u y t c v n b a n ul : " l mt h n o b nt h c h i nm t t h i g i a nb i nd c hl i nt c t r o n gm t l ph c " C ut r l i y uc u s d n gm t t k h a b s u n gm s k h n g c g i i t h i u y c h o nk h i C h n g1 0 : t n h. C c t n ht k h a , t r o n gt n hh u n gn y , c n g h a l " c h c d u yn h t m t t r n gh p , b t k b a on h i u i t n gc a l p c t o r a " , c h n hx c l n h n gg c h n gt i c n y : m t t h n hv i nc a m t l ph c m l k h n g i , v k h n gt h t h a y i t m t i t n gc a l pk h c . D o , m t c o n s t t n hc a m t l o i t c hh pc t h c c o i n h m t t h i g i a nb i nd c hk h n g i . C m t t n hn n gc a n h c i m t n hk h i c s d n gt r o n gl ph c m t l m t c h t k h c t h n g : b np h i c u n gc pk h i t ot i t h i i m n hn g h a c a c c k h u y t i m t n h. yl i um c h x yr a t v i c c k h u y t i m t n h; n h i un h b nc t h mu ns d n gn t r o n gc c t t n hh u n gn s k h n gl mv i c v t t c c c t h n h v i nd l i uk h c p h i c k h i t ot r o n gx yd n gh o c t r o n gc h c n n gt h n hv i nk h c . D i yl m t v d c h ot h yv i c t or a v s d n gm t k h u y t i m t n ht g i l k c ht h c b nt r o n gm t l p [ 4 1 ] i d i nc h om t c h n gc h u i c o nt r :

// :C 0 8 :S t r i n g S t a c k . c p p
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 146/320

08/10/2013

Suy ngh trong C + +, Vol 1

//S d n gc o n s tt n h t or am t //B i nd c h t h ig i a nl i nt ct r o n gm tl ph c #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; l pS t r i n g S t a c k{ t n hc o n s ti n ts i z e=1 0 0 ; c o n s ts t r i n g*c h n g [ s i z e ] ; i n ti n d e x ;c n gc n g : S t r i n g S t a c k( ) ; t r n g y( c o n s t s t r i n g*s ) ; c o n s ts t r i n g*p o p( ) ; } ; S t r i n g S t a c k: :S t r i n g S t a c k( ) :c h s ( 0 ){ m e m s e t( s t a c k ,0 ,k c ht h c*s i z e o f( s t r i n g * ) ) ; } t r n gS t r i n g S t a c k: :p u s h( c o n s ts t r i n g*s ){ i f( i n d e x< k c ht h c ) n g nx p[ i n d e x++ ]=s ; } c o n s ts t r i n g*S t r i n g S t a c k: :p o p( ){ i f( i n d e x >0 ){ c o n s ts t r i n g* r v=s t a c k[ -i n d e x ] ; c h n g[ i n d e x ]=0 ; r vt r l i ; } r e t u r n0 ; } c h u iI c e c r e a m[ ]={ " k oh td &k e m " , " L ng n " , " J a m o c h ah n hn h nk o " , " N ib l a c k b e r r yh o a n gd " , " M mx ik e m " , " C h a n hx o y " , " n g " , " K os c l as u " } ; i n ti C s z= s i z e o fk e m/s i z e o f*k e m ; i n tm a i n( ){ S t r i n g S t a c ks s ; f o r( i n ti=0 ;i< i C s z ;i++ ) s s . p u s h( &I c e c r e a m[ i ] ) ;c o n s ts t r i n g*c p ;!t r o n gk h i( ( c p=s s . p o p( ) ) =0)c o u t< <*c p< <e n d l ; }/// :~

K t k h i k c ht h c c s d n g x c n hk c ht h c c a m n gn g nx p, n t h c s l m t t h i g i a nb i n d c hk h n g i , n h n gm t t r o n g l nb nt r o n gl p . C h r n gp u s h( ) c m t c o n s t * c h u i n h m t t h a ms , p o p( ) t r v m t c o n s t c h u i * , v S t r i n g S t a c kg i c o n s t s t r i n g* . N u i un yl k h n g n gs t h t , b nk h n gt h s d n gm t S t r i n g S t a c k g i c c c o nt r t r o n gk e m. T u yn h i n , n c n gn g nc nb nl mb t c i ug s t h a y i c c i t n gc h a c a S t r i n g S t a c k. T t n h i n , k h n gp h i t t c c c c o n t a i n e r c t h i t k v i s h nc h n y . C c" e n u mh a c k "t r o n gmc T r o n gp h i nb nc c a C++ , t n hc o n s t k h n g c h t r t r o n gc c l ph c . i un yc n g h a r n gc o n s t l v d n g i v i b i uh i nl i nt c t r o n gc c l ph c . T u yn h i n , n g i d nv nmu nl m i un y m t g i i p h p i nh n h( t h n g c g i l " e n u mh a c k " ) c s d n gm t u n t a g g e de n u mk h n gc t r n gh p . M t i u t r a p h i c y g i t r c a n c t h i t l pt i t h i g i a nb i nd c h , l a p h n g nl p , v g i t r c a n c s nc h oc c b i ut h c k h n g i . V v y , b ns t h n gt h y :


// :C 0 8 :E n u m H a c k . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; l pB u n c h{ e n u m{ s i z e=1 0 0 0 } ; i n ti[ s i z e ] ; } ; i n tm a i n( ){ c o u t< <" s i z e o f( B u n c h )= "< <s i z e o f( B u n c h ) < <" ,S i z e o f( i[ 1 0 0 0 ] )= " < <S i z e o f( i n t[ 1 0 0 0 ] )< <e n d l ; }/// :~

V i c s d n ge n u m y c mb o c h i mk h n gl ut r t r o n gc c i t n g , v c c i ut r a v i n c t t c c c n hg i t i t h i g i a nb i nd c h . B nc n gc t h t h i t l pm t c c hr r n gc c g i t r c ac c i ut r av i n :
e n u m{ m t=1 ,h a i=2 ,b a } ;

V i b e n u ml o i , t r n hb i nd c hs t i pt c mt g i t r c u i c n g , v v yc c i ut r a v i nb a s n h n c g i t r 3 . T r o n gS t r i n g S t a c k . c p pv d t r n , c c d n g : t n hc o n s ti n ts i z e=1 0 0 ; s c t h a yt h : e n u m{ s i z e=1 0 0 } ; M c d b nt h n gs t h yc c e n u mk t h u t t r o n gm d i s n , c c k h u y t i m t n ht n hn n g c t h mv o n g nn g g i i q u y t c h n yt v n . T u yn h i n , k h n gc l d o p om b np h i c h nk h u y t i m t n h t r o n gt e n u mh a c k , v t r o n gc u ns c hn yc c e n u mh a c k c s d n gb i v n c h t r b i c c t r n hb i n d c hh nt i t h i i mc u ns c hn y c v i t r a .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 147/320

08/10/2013

Suy ngh trong C + +, Vol 1

i t n gc o n s tv c ch m t h n hv i n
C h c n n gt h n hv i nl ph c c t h c t h c h i nc o n s t . i un yc n g h a g ? Hi u , t r c t i nb np h i h i u k h i n i mc o n s t i t n g . M t c o n s t i t n g c x c n ht n gt c h om t n g i d n g n hn g h a n h l m t l o i d n gs n . V d :
c o n s ti n ti=1 ;c o n s tb l o bb( 2 ) ;

y , bl m t c o n s t i t n gc a l o i b l o b. X yd n gc a n c g i v i m t t h a ms c a h a i . C h ot r n hb i n d c h t h c t h i c o n s t Ne s s , n p h i mb or n gk h n gc t h n hv i nd l i uc a i t n g c t h a y i t r o n gs u t c u c i c a i t n g . Nc t h d d n g mb or n gk h n gc d l i un o c s a i , n h n g l mt h n ol n b i t c c h c n n gt h n hv i ns t h a y i d l i uv n h n gn g i t h nl " a nt o n " c h o m t c o n s t i t n g ? N ub nk h a i b om t h mt h n hv i nc o n s t , b nc h ot r n hb i nd c hc h c n n gc t h c g i l m t c o n s t i t n g . M t c h c n n gt h n hv i nm k h n g c b i t t u y nb c o n s t c c o i l m t t r o n g s t h a y i t h n h v i nd l i ut r o n gm t i t n g , v t r n hb i nd c hs k h n gc h op h pb ng i n l m t c o n s t i t n g . Nk h n gd n gl i , t u yn h i n . C h t u y nb m t h mt h n hv i nl c o n s t k h n g mb on s h o t n g t h e oc c h , n nt r n hb i nd c hb u c b np h i n h c l i c o n s t c i mk t h u t k h i x c n hc c c h c n n g . ( C c c o n s t t r t h n hm t p h nc a c h k c h c n n g , v v yc h a i t r n hb i nd c hv k i mt r a m i l i nk t c h o c o n s t d o a n h . ) S a u , n t h c t h i c o n s t Ne s s t r o n g n hn g h a c h c n n gb n gc c hp h t h n hm t t h n gb ol i n ub nc g n g t h a y i b t k t h n hv i nc a i t n gh o c g i m t k h n gc o n s t c h c n n gt h n hv i n . V v y , b t k t h n hv i nh o t n gb nk h a i b oc o n s t c mb o h n hx n h v yt r o n g n hn g h a . h i u c C p h pk h a i b oc o n s t c h c n n gt h n hv i n , t h n gb o ut i nt r c k h a i b oh mv i c o n s t c n g h a l g i t r t r v l c o n s t , d o k h n gt or a k t q u mo n gmu n . T h a yv o , b np h i t c o n s t c t s a uk h i d a n hs c h i s . V d ,


// :C 0 8 :C o n s t M e m b e r . c p pc l a s sX{ i n tf( )c o n s t ; } ; i n ti ;c n g : X( i n ti i ) ;

X: :X( i n ti i ) :i( i i ){ }i n tX: :f( )c o n s t{ r e t u r ni ; } i n tm a i n( ){ Xx 1( 1 0 ) ; c o n s tXx 2( 2 0 ) ; x 1 . f() ; x 2 . f( ) ; }/// :~

L ur n gc c c o n s t t k h o p h i c l p i l pl i t r o n gc c n hn g h a h o c t r n hb i nd c ht h yn n h l m t c h c n n gk h c n h a u . K t k h i f ( ) l m t c o n s t c h c n n gt h n hv i n , n un c g n g t h a y i t i t r o n g b t k c c hn oh o c g i m t c h c n n gt h n hv i n k h n gp h i l c o n s t , t r n hb i nd c hd u l m t l i . B nc t h t h ym t c o n s t c h c n n gt h n hv i nl a nt o n g i v i c h a i c o n s t v k h n gc o n s t i t n g . V v y , b nc t h n g h v n n h l h n ht h c c h u n gn h t c a m t h mt h n hv i n( v v i un y , l i u k h n gma yl c c h mt h n hv i nk h n gt n gm c n h c o n s t ) . B t k c h c n n gm k h n gs a i d l i ut h n hv i nn n c k h a i b ol c o n s t , v v yn c t h c s d n gv i c o n s t i t n g . yl m t v d t n gp h nm t c o n s t v k h n gc o n s t c h c n n gt h n hv i n :
// :C 0 8 :Q u o t e r . c p p //N g un h i nl ac h nt r c hd n #I n c l u d e #B a og m< c s t d l i b >/m yp h t i ns /n g un h i n#b a og m< c t i m e >// h tg i n gt o n g un h i ns d n gt nm i nk h n gg i a nt i uc h u n ; l pq u o t e r{ i n tl a s t q u o t e ;c n gc n g : q u o t e r( ) ; i n t l a s t Q u o t e( )c o n s t ; c o n s tc h a r*q u o t e( ) ; } ; Q u o t e r: :q u o t e r( ){ l a s t q u o t e=1 ; s r a n d( t i m e( 0 ) ) ;//h tg i n gs n g un h i n } i n tq u o t e r: :l a s t Q u o t e( )c o n s t{ t r l il a s t q u o t e ; } c o n s tc h a r*q u o t e r: :q u o t e( ){ s t a t i cc o n s tc h a r*b og i [ ]={ " C h n gt a v u ic h a ? " " C cb cs l u nl u nb i tr n h t " , " C p h i. . .n g u y nt ? " " S h il k h i ud m " , " K h n gc b n gc h n gk h o ah c " " n gh t n g " " R n gc u cs n gl n g h i mt r n g " ,
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 148/320

08/10/2013

Suy ngh trong C + +, Vol 1

" N h n g i u l mc h oc h n gt ah n hp h c ,l mc h oc h n gt ak h nn g o a n " , } ; i n tq s i z e=s i z e o fb og i /s i z e o f*b og i ; i n tq n u m=r a n d( ) %q s i z e ; t r o n gk h i( l a s t q u o t e >=0& &q n u m= =l a s t q u o t e ) q n u m=r a n d( ) %q s i z e ; g i t r l i [ l a s t q u o t e=q n u m ] ; } i n tm a i n( ){ q u o t e rq ; c o n s tq u o t e rc q ; c q . l a s t Q u o t e ( ) ;//O K !// c q . q u o t e( ) ;c h cn n gk h n gc o n s t ;//K h n gO K f o r( i n ti=0 ;i< 2 0 ;i++ ) c o u t< <q . q u o t e( )< <e n d l ; }/// :~

K h n gx yd n gh a yh yc t h l c o n s t c h c n n gt h n hv i nb i v h h un h l u nl u nt h c h i nm t s t h a y i t r nc c i t n gt r o n gq u t r n hk h i t ov d nd p . C c t r c hd n( ) c h c n n gt h n hv i nc n g k h n gt h c o n s t v n i c c t h n hv i nd l i ul a s t q u o t e ( x e ml i t u y nb ) . T u yn h i n , l a s t Qu o t e (l mc h o k h n gc t h a y i , v v v yn c t h c ) c o n s t v c t h c g i m t c c ha nt o nc h oc c c o n s t i t n gc q. c o t h t h a y i : p h pt o ns ov i c o n s t h pl N ub nmu nt or a m t c o n s t c h c n n gt h n hv i n , n h n gb nv nmu nt h a y i m t s d l i ut r o n gc c i t n g ? i un y i k h i c g i l s k h c b i t g i a B i t w i s e c o n s t v l o g i c c o n s t ( c n g i k h i c g i l m e m b e r w i s e c o n s t ) . B i t wi s e c o n s t c n g h a l t t c c c b i t t r o n gc c i t n gl v n hv i n , d o , m t h n h n h b i t c a i t n gs k h n gb a og i t h a y i . L o g i c c o n s t c n g h a l , m c d t o nb i t n gl k h i n i ml i n t c , c t h c n h n gt h a y i t r nc s t h n hv i nb y me mb e r . T u yn h i n , n ut r n hb i nd c hn i r n gm t i t n gl c o n s t , n s g h e nb ov i t n g mb oB i t wi s e c o n s t d o a n h . T h c h i nh pl c o n s t d o a n h , c h a i c c h t h a y i m t t h n hv i nd l i ut b nt r o n gm t c o n s t c h c n n gt h n hv i n . P h n gp h pt i pc n ut i nl l c hs m t v c g i l c i c o n s t n e s s . N c t h c h i nm t c c hk h k l . B nc n y( t k h a m s nx u t c c a c h c a i t n gh i nh n h ) v b n v om t c o nt r nm t i t n gc a c c l o i h i nh n h . C v n h i un yl c m t c o nt r n h v y . T u yn h i n , t r o n gm t c o n s t c h c n n gt h n hv i n t h c s l m t c o n s t c o nt r , v v yb n gc c h c n v om t c o nt r b n ht h n g , b n l o i b c c c o n s t Ne s s c h oh o t n g . yl m t v d :
// :C 0 8 :C a s t a w a y . c p p //" c i "c o n s t n e s s l pY{ i n ti ;c n gc n g : } ;

Y( ) ;

v o i df( )c o n s t ;

Y: :Y( ){ i=0 ; } k h o n gt r n gY: :f( )c o n s t{ !// i++ ;//L i-h mt h n hv i nc o n s t ( ( Y* )n y )>i++ ;//O K :b ic o n s t N e s s v i nr r n g : ( C o n s t _ c a s t< Y * >( n y ) )>i++ ; } i n tm a i n( ){ // :~ c o n s tYy y y y ;

//t th n :s d n gC++c p h pd i n

y y . f( ) ;//T r nt h ct t h a y in !}/

C c ht i pc nn yh o t n gv b ns t h yn c s d n gt r o n gm d i s n , n h n gn k h n gp h i l k t h u t a t h c h . V n l s t h i uc o n s t Ne s s c n i t r o n gm t n hn g h a c h c n n gt h n hv i n , v b nk h n gc um i t g i a od i nl pd l i uc a i t n g a n gt h c s c s a i , t r k h i b nc q u y nt r u yc pv om n g u n( v b np h i n g h i n g m c o n s t Ne s s a n g c b i , v t mk i mc c d i nv i n ) . a m i t h n g o i t r i , b nn ns d n gt h b i n i t k h a t r o n gk h a i b ol p x c n hr n gm t t h n hv i nd l i uc t h c t h c t h a y i t r o n gm t c o n s t i t n g :
// :C 0 8 :M u t a b l e . c p p //C c" c o t h t h a y i "t k h a l pZ{ i n ti ; c o t h t h a y ii n tj ;c n g : v o i df( )c o n s t ; } ;

Z( ) ;

Z: :Z( ) :i( 0 ) ,j( 0 ){ } k h o n gt r n gZ: :f( )c o n s t{ // !i++ ;//L i-h mt h n hv i nc o n s t j++ ;//O K :c o t h t h a y i } i n tm a i n( ){ c o n s tZz z ; z z . f( ) ;//T r nt h ct t h a y in !} /// :~

B n gc c hn y , n g i s d n gc a l pc t h n h nt h yt v i c k k h a i m c c t h n hv i nc t h s c s a i t r o n gm t c o n s t c h c n n gt h n hv i n . ROMa b i l i t y
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 149/320

08/10/2013

Suy ngh trong C + +, Vol 1

N um t i t n g c n hn g h a l c o n s t , n l m t n gc v i np h i c t t r o n gb n h c h c ( R OM) , m t h n gl m t y ut q u a nt r n gt r o n gl pt r n hc c h t h n gn h n g . C h ng i nl l mc h om t i t n g c o n s t , t u yn h i n , l k h n g c c y uc uv R OMa b i l i t yl k h t k h e h n . T t n h i n , i t n gp h i B i t wi s e c o n s t , t h a y h nl o g i c c o n s t . i un yr t d d n g x e ml c o n s t Ne s s c t h c h i nc h q u a c o t h t h a y i t k h a , n h n gc l k h n gt h p h t h i n c b i t r n hb i nd c hn uc o n s t Ne s s c b i t r o n gm t c o n s t c h c n n gt h n hv i n . Ng o i r a , 1. 2. C c l ph c h o c c ut r c p h i k h n gc n g i d n gx c n hx yd n gh o c h y . K h n gt h c c c l ph c c s ( c n ut r o n gC h n g1 4 ) h o c i t n gt h n hv i nv i n h t h uh o c h yn g i d n g n hn g h a .

Hi uq u c a m t h o t n gv i t t r nb t k p h nn oc a m t c o n s t i t n gc a m t l o i R OMa b l e l k h n g x c n h . M c d m t i t n gp h h ph n ht h n hc t h c t t r o n gR OM, k h n gc i t n gl b a og i y uc u c t t r o n g R OM.

b a yh i

C p h pc a b i n n gl g i n gh t v i c h oc o n s t , n h n gd b a yh i c n g h a l " Nh n gt h n gt i nn yc t h t h a y i b nn g o i c c k i nt h c c a t r n hb i nd c h . " B n gc c hn o , m i t r n g a n gt h a y i d l i u ( t h n gq u a v i c a n h i m, a l u n gh o c n g t ) , v n n hc h ot r n hb i nd c hk h n gt h c h i nb t k g i n h v d l i u , c b i t l t r o n gq u t r n ht i uh a . N ut r n hb i nd c hn i : " T i c d l i un yv om t n gk t r c , v t i k h n g n gm n gk " , t h n gt h n gn s k h n gc np h i c d l i um t l nn a . Nh n gn ud l i u c n n h, t r n hb i nd c h k h n gt h l mn h v ym t g i n hv d l i uc t h c t h a y i b i q u t r n hk h c , v n p h i c l i d l i uc h k h n gp h i t i uh a m l o i b n h n gg b n ht h n gs l m t c k h n gc nt h i t . B nt or a b i n n g i t n gb n gc c hs d n gc p h pt n gt m b ns d n g t oc o n s t i t n g . B n c n gc t h t or a c o n s t d b a yh i i t n g , m k h n gt h t h a y i b i c c l pt r n hk h c hh n gn h n gt h a yv t h a y i t h n gq u a m t s c q u a nb nn g o i . yl m t v d m c t h i d i nc h om t l pl i nk t v i m t s p h nc n gg i a ot i p :

// :C 0 8 :V o l a t i l e . c p p //C ct k h ad b a yh i l pC o m m{ c o n s td b a yh iu n s i g n e dc h a rb y t e , d b a yh iu n s i g n e dc h a r c ; e n u m{ B U F S I Z E=1 0 0 } ; u n s i g n e dc h a rb u f[ B U F S I Z E ] ; i n ti n d e x ;c n g c n g : C o m m( ) ; t r n gi s r( )d b a yh i ; c h a r c( i n ti n d e x )c o n s t; } ; C o m m: :C o m m( ) :c h s ( 0 ) ,b y t e( 0 ) ,c ( 0 ){ } //C h c m tb nd e m o ,s k h n gt h cs l mv i c//n h m td c hv t h n g x u y nb g i n o n : k h o n gt r n gC o m m: :i s r( )d b a yh i{ f l a g=0 ; b u f[ i n d e x++ ]= b y t e ; //W r a pt o uc ab m : n u( c h s >=B U F S I Z E )i n d e x=0 ; } c h a rC o m m: : c( i n ti n d e x )c o n s t{ i f( i n d e x< 0||i n d e x >=B U F S I Z E ) t r v 0 ; b u ft r l i[ i n d e x ] ; } i n tm a i n( ){ C n gC o m md b a yh i ; P o r t . i s r( ) ;//O K !// P o r t . r e a d( 0 ) ;//L i ,r e a d( )k h n gd b a yh i }/// :~

Nh v i c o n s t , b nc t h s d n gn n hc h oc c t h n hv i nd l i u , h mt h n hv i nv c c i t n gc h n h m n h . B nc h c t h g i d b a yh i h mt h n hv i nc h od b a yh i i t n g . L d om i s r ( ) c t h k h n gt h c s c s d n gn h m t d c hv t h n gx u y nb g i n o nl t r o n gm t h m t h n hv i n , a c h c a i t n gh i nt i ( n y) p h i c t h n gq u a b m t , v m t I S Rt h n gmu nk h n g t r a n hl u nt i t t c . g i i q u y t v n n y , b nc t h l mi s r ( ) m t t n hc h c n n gt h n hv i n , m t c h c c pt r o n gC h n g1 0 . C p h pc a b i n n gl g i n gh t n h a u c o n s t , v v yc c c u c t h ol u nc ah a i t h n g c i ut r v i n h a u . Ha i c n h c nt r o n gs k t h pn h c c v n g l o i c v .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 150/320

08/10/2013

Suy ngh trong C + +, Vol 1

T mt t

C c c o n s t t k h a c h ob nk h n n g x c n h i t n g , c h c n n gl pl u n , g i t r t r l i v h mt h n hv i n n h l h n gs , v l o i b c c t i nx l t h a yt h g i t r m k h n gb m t b t k l i c ht i nx l . T t c i u n yc u n gc pm t h n ht h c b s u n g n gk c a l o i k i mt r a a nt o nt r o n gl pt r n hc a b n . V i c s d n gc i g i l c o n s t c h n h x c ( s d n gc o n s t b t c n i n ob nc t h c t h ) c t h l m t c uc n hc h oc c d n . M c d b nc t h b q u a c o n s t v t i pt c s d n gt h c h n hm h a Cc , n c g i pb n . C h n g1 1 v b t us d n gt i l i ut h a mk h or t n h i u , v b ns t h yn h i uh nv c c hq u a nt r n g l s d n gc o n s t v i c h c n n gl pl u n .

B i t p
1.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.

T ob a c o n s t i n t g i t r , s a u t h mc h n gv i n h a u t or a m t g i t r x c n hk c ht h c c a m t m n gt r o n gm t n hn g h a m n g . C g n g b i nd c hm t n gt t r o n gCv x e mn h n gg s x y r a ( b nt h n gc t h b u c b nC++t r n hb i nd c h c h yn h m t t r n hb i nd c hCb n gc c hs d n gm t c d n gl n h ) . C h n gmi n hc h om n hr n gCv C++t r n hb i nd c ht h c s l mc c h n gs i ut r k h c n h a u . T o r a m t t o nc uc o n s t v s d n gn t r o n gm t b i ut h c h n gs t o nc u , s a u b i nd c hn t h e oc Cv C++ . T od c o n s t n hn g h a c h ot t c c c l o i b u i l t i nv c c b i nt h c a h . S d n gc c t r o n gc c b i u t h c v i c c c o n s t s l m m i c o n s t n hn g h a . H yc h c c h nr n gh b i nd c ht h n hc n g . T om t c o n s t n hn g h a t r o n gm t t pt i nt i u , b a og mc c t pt i nt i u t r o n gh a i . c p pf i l e , s a u b i nd c hc c t pt i nv l i nk t c h n g . B nk h n gn nb t k l i n o . B yg i b nh yt h c n gv i C . T om t c o n s t c g i t r c x c n ht i t h i g i a nc h yb n gc c h c t h i g i a nk h i c h n gt r n hb t u( b ns p h i s d n g< c t i me >t i u t i uc h u n ) . T r o n gc h n gt r n h , c g n g c m t g i t r t h h a i c a t h i g i a nv oc a b nc o n s t v x e mn h n gg s x yr a . T om t c o n s t m n gc a c h a r , s a u c g n gt h a y i m t t r o n gn h n gc h a r s . T om t c o n s t e x t e r nt u y nb t r o n gm t t pt i n , v t m t c h n h( ) t r o n gt pt i n m i nr a g i t r c a c o n s t e x t e r n. C u n gc pm t c o n s t e x t e r n n hn g h a t r o n gm t t pt i nt h h a i , s a u b i nd c hv l i nk t h a i t pt i nv i n h a u . V i t h a i c o nt r nc o n s t d i s d n gc h a i h n ht h c c a v i c k k h a i . i m m t t r o n gs h m t l o t c c l u. C h n gmi n hr n gb nc t h t n gh o c g i mc o nt r , n h n gb nk h n gt h t h a y i n h n gg n t r t i . V i t c o n s t c o nt r t i m t i , v i mn m t l o t c c i . C h ot h yr n gb nc t h t h a y i n h n g g c o nt r i m, n h n gb nk h n gt h t n gh o c g i mc o nt r . V i t c o n s t c o nt r nm t c o n s t i t n g . C h ot h yr n gb nc h c t h c c c g i t r m c o nt r t r t i , n h n gb nk h n gt h t h a y i c o nt r h o c n h n gg n i m. H yb n h n gn h nx t v c c d n gl i t om t r o n gP o i n t e r A s s i g n me n t . c p p x e ml i m t r n hb i n d c hc a b nt or a . T om t m n gk t c h v i m t c o nt r t r n uc a m n g . B yg i s d n gc o nt r t h a y i c c y ut t r o n gm n g . K h n gt r n hb i nd c hc a b nb oc on yn h l m t l i ? N nn ? N uk h n g , t i s a ob nn g h r n g l ? T om t c h c n n gm c m t i s t h e og i t r n h m t c o n s t , s a u c g n gt h a y i l pl u nr n g t r o n gc c c q u a nc h c n n g . T om t c h c n n gm p h i m t m t n i t h e og i t r . T r o n gc h c n n g , r n gb u c m t f l o a t c o n s t & t r a n hl u n , v c h s d n gt i l i ut h a mk h ot mb or n gc c i s l k h n gt h a y i . S a i C o n s t R e t u r n V a l u e s . c p pl o i b k i nt r n c c d n gc l i g yr a m t t i m t t h i i m, x e mn h n gg t h n gb ol i t r n hb i nd c hc a b n t or a . S a i C o n s t P o i n t e r . c p pl o i b k i nt r n d n gl i g ym t l c , x e mn h n gg t h n gb ol i t r n hb i nd c hc a b nt or a . T h c h i nm t p h i nb nm i c a C o n s t P o i n t e r . c p pg i C o n s t R e f e r e n c e . c p p c h n gt t i l i ut h a m k h ot h a yv c o nt r ( b nc t h c np h i n h nv p h a t r c c h n g1 1 ) . S a i C o n s t T e mp o r a r y . c p pl o i b n h n gn h nx t t r nd n gl i g yr a x e mn h n gg t h n gb o l i t r n hb i nd c hc a b nt or a . T om t l pc c h a c m t c o n s t v k h n gc o n s t f l o a t . K h i t oc c b n gc c hs d n gd a n hs c hk h i t ox yd n g . T om t l pg i l My S t r i n gt r o n g c m t c h u i v c m t c o n s t r u c t o r m k h i t oc c c h u i v i n ( ) c h c n n g . S a i S t r i n g S t a c k . c p p c c t h n gc h a g i My S t r i n g i t n g , v ma i n( ) n i n c h n g . T om t l pc c h a m t c o n s t t h n hv i nm b nk h i t ot r o n gd a n hs c hk h i t ov x yd n gm t
151/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

22. 23. 24. 25. 26. 27.

28.

i ut r a u n t a g g e dm b ns d n g x c n hm t k c ht h c m n g . T r o n gC o n s t Me mb e r . c p p, l o i b c c c o n s t c t v n hn g h a h mt h n hv i n , n h n g n t r nt k h a i , x e mn h n gl o i t h n gb ol i t r n hb i nd c hb nn h n c . T om t l ph c v i c h a i c o n s t v k h n gc o n s t h mt h n hv i n . T oc o n s t v k h n gc o n s t i t n g c a l pn y , v c g n gk ug i c c l o i k h c n h a uc a c c h mt h n hv i nc h oc c l o i k h c n h a uc a c c i t n g . T om t l ph c v i c h a i c o n s t v k h n gc o n s t h mt h n hv i n . C g n g g i m t k h n gc o n s t c h c n n gt h n hv i nt m t c o n s t c h c n n gt h n hv i n x e mn h n gg l o i t h n gb ol i t r n hb i nd c h b nn h n c . T r o n gMu t a b l e . c p p, l o i b n h n gn h nx t t r nd n ge r r o r c a u s i n g x e mn h n gg s px pc a c c t h n gb ol i t r n hb i nd c hc a b ns nx u t . S a i Qu o t e r . c p pb n gc c ht r c hd n( ) m t c o n s t c h c n n gt h n hv i nv l a s t q u o t e c o t h t h a y i . T om t l pv i m t b i n n gt h n hv i nd l i u . T or a c h a i d b a yh i v k h n gd b a yh i h m t h n hv i nm t h a y i d b a yh i t h n hv i nd l i u , v x e mn h n gg c c t r n hb i nd c hn i . T or a c h a i n n hv k h n gn n h i t n gc a l ph c c a b nv c g n gk ug i c b i n n gv k h n gn n hc h c n n gt h n hv i n x e mn h n gg l t h n hc n gv n h n gl o i t h n gb ol i t r n hb i nd c ht or a . T om t l pg i l c h i mc t h b a y( ) v m t l p m k h n gc t h . T or a m t t n g i t n g , a a c h c a n , v g nc h om t v o i d* . B yg i l yv o i d* , g nn v om t * c h i m( b ns p h i s d n gm t d nd i n v i n ) , v g i b a y( ) t h n gq u a c o nt r . c n i r l d ot i s a os c h op h pc a C c n gk h a i c h n ht h n gq u a m t v o i d* ( k h n gc m t d nd i nv i n ) l m t " l h n g " t r o n gn g nn g , m k h n g t h c l a nt r u y n nC++ ?

T r o n gC , m t t r o n gn h n gc c h b ot nh i uq u l t h n gq u a v i c s d n gc c m a c r o , c h op h pb nt h c h i n n h n gg t r n gg i n gn h m t c u c g i c h c n n g k h n gc c h c n n gb n ht h n gg i t r nk h n g . V m c t h c h i nv i t i nx l t h a yv t r n hb i nd c ht h c h h p , v t i nx l t h a yt h t t c c c v mc u c g i t r c t i pv i m v m , d o , k h n gc c h i p h l i nq u a nt c c i s y , l mc h om t C A L Ll pr pn g nn g , t r v l pl u n , v t h c h i nm t h i n g n g nn g R E T U R N. T t c c c c n gv i c c t h c h i nb n gv i x l , v v yb nc s t i nl i v k h n n g c c a m t c u c g i c h c n n gn h n gn k h n gc h i p h b nb t c i ug . C h a i v n v i v i c s d n gc c ma c r ot i nx l t r o n gC++ . ut i nc n g n gv i C : m t ma c r ot r n g g i n gn h m t c u c g i c h c n n g , n h n gk h n gp h i l c n oh n h n gn h m t . i un yc t h c h nk h k h n t mt h yl i . V n t h h a i l c t h c h oC++ : t i nx l k h n gc q u y nt r u yc pd l i ut h n hv i n l p . i un yc n g h a ma c r ot i nx l k h n gt h c s d n gn h c h c n n gt h n hv i nl p . g i l i h i uq u c a t i nx l v m , n h n g t h ma nt o nv n gc pP h mv i c a c c c h c n n gt h c s , C ++ , c n i t u y n c h c n n g . T r o n gc h n gn y , c h n gt i s x e mx t c c v n c a t i nx l c c ma c r ot r o n gC++ , l mt h n o n h n gv n n y c g i i q u y t v i c h c n n gn i t u y n , v c c h n gd nv n h n gh i ub i t v c c hi n l i n e s l mv i c .

C mb yt i nx l

C h a k h a c h oc c v n c a c c ma c r ot i nx l l b nc t h b l a v os u yn g h r n gh n hv i c a c c t i nx l c n gg i n gn h h n hv i c a t r n hb i nd c h . T t n h i n , n c d n hr n gm t c i n h nv mv h o t n g g i n gn h m t c u c g i c h c n n g , v v yn k h d d n g r i v ot i ut h u y t n y . Nh n gk h k h nb t u k h i s k h c b i t t i n ht x u t h i n . Nh m t v d ng i n , h yx e mx t n h n g i us a u y :

#X c n hf( x )( x+1 )

B yg i , n um t c u c g i c t h c h i nc h oFn h t h n y
F( 1 )

t i nx l m r n gn , h i b t n g , n h s a u :
( X )( x+1 )( 1 )
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 152/320

08/10/2013

Suy ngh trong C + +, Vol 1

V n x yr a v k h o n gc c hg i a Fv d um n g o c c a n t r o n g n hn g h a v m . K h i k h o n gc c hn y c l yr a , b nt h c s c t h g i c c ma c r ov i k h o n gc c h
F( 1 )

v n v ns m r n g n gc c h
( 1+1 )

V d t r nl k h t mt h n gv v n s l mc h ob nt h nr r n gn g a yl pt c . Nh n gk h k h nt h c s x yr a k h i s d n gc c b i ut h c n h l pl u nt r o n gc c c u c g i v m . C h a i v n . ut i nl b i ut h c c t h m r n gt r o n gc c v m n hg i ut i nc a h l k h c v i n h n g g b nmo n g i . V d ,
#X c n hs n( x ,b )x >=b0 : 0 1 ?

B yg i , n ub i ut h c c s d n gc h oc c i s n u( s n( m t&0 x 0 f ,0 x 0 7 ) )//. . . v ms m r n g n u( a&0 x 0 f >=0 x 0 7 ?0 : 1 ) C c ut i nc a v l t h ph ns ov i >=, v v yv i c n hg i v ms l mb nn g c n h i n . M t k h i b np h t h i nr a v n , b nc t h g i i q u y t n b n gc c h t d un g o c x u n gq u a n ht t c m i t h t r o n g n hn g h a v m . ( yl m t t h c h n ht t s d n gk h i t or a c c ma c r ot i nx l . ) Nh v y ,


#X c n hs n( x ,b )( ( x ) >=( b ) ?0 0 : 0 1 )

P h t h i nc c v n c t h k h k h n , t u yn h i n , v b nc t h k h n gt mt h yn c h o nk h i s a uk h i b n t h c h i nh n hv i v mt h c hh pc h oc c c p . T r o n gp h i nb nc h a n g o c c a v mt r c , h uh t c c b i ut h c s l mv i c m t c c hc h n hx c b i v ut i nc a >= t h ph ns ov i h uh t c c n h k h a i t h c n h + , / , , v t h mc h c c c n h k h a i t h c c h u y n i t r nb i t . V v y , b nc t h d d n gb t us u yn g h r n gn h o t n gv i t t c c c b i ut h c , b a og mc n h n gn g i s d n g k h a i t h c h pl t r nb i t . V n t r c c t h c g i i q u y t v i t h c h n h l p t r n h c n t h n : n g h i t mt t c m i t h t r o n g m t v m . T u yn h i n , k h k h nt h h a i l t i n hv i h n . K h n gg i n gn h m t c h c n n gb n ht h n g , m i k h i b ns d n g m t i s t r o n gm t v m , i s l n hg i . Mi nl v m c g i l c h v i c c b i nt h n gt h n g , n h g i n yl l n ht n h , n h n gn u n hg i m t i s c t c d n gp h , s a u k t q u c t h c n g c n h i nv c h c c h ns k h n gb t c h c h n hv i c h c n n g . V d , ma c r on yx c n hx e m i s c a n n mt r o n gm t p h mv i n h t n h :
#X c n hB A N D( x )( ( ( x ) >5& &( x )< 1 0 )( x ) :0 )

Mi nl b ns d n gm t i s " b n ht h n g " , v mh o t n gr t g i n gn h m t c h c n n gt h c s . Nh n gn g a y s a uk h i b nt h g i nv b t ut i nr n gn l m t c h c n n gt h c s , v n b t u . Nh s a u :
// :C 0 9 :M a c r o S i d e E f f e c t s . c p p #B a og m#b a og m< f s t r e a m >s d n gt nm i nk h n gg i a nt i u c h u n" /r e q u i r e . h . . " ; #X c n hB A N D( x )( ( ( x ) >5& &( x )< 1 0 )( x ) :0 ) i n tm a i n( ){ o f s t r e a mr a( " m a c r o . o u t " ) ; mb o( t r o n g" m a c r o . o u t " ) ; f o r( i n t i=4 ;i< 1 1 ;i++ ){ i n ta=i ; r a< <" m t=" < <a< <e n d l< <' \t ' ; r a < <" B A N D( ++a )= "< <B A N D( ++a )< <e n d l ; r a< <" \t a= "< <m t< <e n d l ; } }/// :~

Nh nt h yv i c s d n gc a t t c c c k t c h h o a t r o n gt nc a v m . yl m t t h c t h u c hv n c h o n g i c n yl m t v mv k h n gp h i l m t c h c n n g , d o n uc v n , n h o t n gn h m t l i n h c n h t . yl s nl n gs nx u t c a c h n gt r n h , k h n gp h i l t t c n h n gg b n c t h mo n g i t m t c h c n n gt h t s :
a=4 B A N D( ++a )=0 a=5a=5 B A N D( ++a ) =8 a=8a=6 B A N D( ++a )=9 a=9a=7 B A N D( ++a)=1 0 a=1 0a=8 B A N D( ++a )= 0 a=1 0a=9 B A N D( ++a )=0 a=1 1a=1 0
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 153/320

08/10/2013

Suy ngh trong C + +, Vol 1

B A N D( ++a )=0

a=1 2

K h i mt l b n , c h c p h n ut i nc a c u i uk i nx yr a , d o b i uh i n c n hg i c h m t l n , v c c t c d n gp h c a c u c g i v ml mt t r t h n hn m, l n h n gg b nmo n gc h t m t c u c g i c h c n n g b n ht h n gt r o n gc n gm t t n hh n h . T u yn h i n , k h i c o ns n yt r o n gb a nn h c , c h a i i uk i n c k i mt r a , k t q u l h a i g i a t n g . K t q u c s nx u t b n gc c h n hg i c c l pl u nm t l nn a , m k t q u t r o n gm t t n gt h b a . K h i s l n g c r a k h i b a nn h c , c h a i i uk i nv nc nt h n g h i m b nc c h a i g i a t n g . C c t c d n gp h k h c n h a u , t yt h u c v oc c i s . i un yr r n gk h n gp h i l k i uh n hv i b nmu nt m t v mm t r n gg i n gn h m t c u c g i c h c n n g . T r o n gt r n gh pn y , g i i p h pr r n gl l mc h on m t c h c n n gt h t s , m c c k h a h c c h ob i t t h m c c c h i p h b s u n gv c t h l mg i mh i uq u n ub ng i c h c n n gm r t n h i u . T h t k h n gma y , v n c t h k h n gp h i l u nl u nr r n gn h v y , v b nc t h v t n hn h n c m t t h v i nc c h a c c c h c n n gv c c ma c r op h a t r nv i n h a u , d o , m t v n n h t h n yc t h nm t s r t d i f f i c u l t t o t mt h yl i . V d , p u t c ( ) v mt r o n gc s t d i oc t h n hg i i s t h h a i c a n h a i l n . i un y c q u y n ht r o n gt i uc h u n C . Ng o i r a , v i c t r i nk h a i b t c nc a t o u p p e r ( ) n h m t v mc t h n hg i c c t h a ms n h i uh nm t l n , [ 4 2 ] m s c u n gc pc h ob nk t q u b t n g v i t o u p p e r ( * p++. )

Ma c r ov t r u yc p

T t n h i n , m h a c nt h nv s d n gc c ma c r ot i nx l l c nt h i t v i C , v c h n gt i c h c c h nc t h n h n c n g a yv i i ut n gt t r o n gC++ , n un h k h n gc m t v n : m t v mk h n gc k h i n i mv x c n hp h mv i c nt h i t v i h mt h n hv i n . T i nx l c h ng i nl t h c h i nt h a yt h v nb n , v v yb nk h n g t h n i m t c i g n h

c l a s sX{ i n ti ;c n gc n g : #X c n hV A L( X: :i )//L i

h o c b t c i ug n g a yc g n . Ng o i r a , s k h n gc d uh i uc a i t n gm b n c p n . ng i nl k h n gc c c hn o t h h i np h mv i l ph c t r o n gm t v m . N uk h n gc m t s t h a yt h c h oc c ma c r ot i n x l , l pt r n hs b c md l mc h om t s t h n hv i nd l i uc n gk h a i v l i c hc a h i uq u , d o p h i b yv i c t h c h i nc b nv n g nn g a n h n gt h a y i t r o n gv i c t h c h i n i u , c n gn h l o i b s b ov m t i nc u n gc p .

C h cn n gn i t u y n

T r o n gv i c g i i q u y t c c C++v n c a m t v mt i pc nv i t i nt h n hv i nl ph c , t t c c c v n l i n q u a nv i c c ma c r ot i nx l c l o i b . i un y c t h c h i nb n gc c h a c c k h i n i mv c c ma c r od i s k i ms o t c a t r n hb i nd c hm h t h u c v . C++t h c h i nc c v mn h c h c n n g n i t u y n, m l m t c h c n n gt h t s t r o n gm i n g h a . B t k h n hv i m b nmo n g i t m t c h c n n gb n ht h n g , b nn h n c t m t h mn i t u y n . S k h c b i t d u yn h t l m t h mn i t u y n c m r n gt i c h , n h m t v mt i nx l , d o c h i p h c a c c c u c g i c h c n n g c l o i b . V v y , b nn n( g nn h ) k h n gb a og i s d n gc c ma c r o , c h c c h c n n gn i t u y n .

B t k c h c n n gx c n ht r o n gm t c t h l pl t n gn i t u y n , n h n gb nc n gc t h t h c h i nm t c h c n n gn i t u y nk h n g n gc pb n gc c h t t r c n v i n i t u y nt k h a . T u yn h i n , c h on c h i ul c , b n p h i b a og mc cc q u a nc h c n n gv i v i c k k h a i , n uk h n gt r n hb i nd c hs c o i n n h l m t c h c n n g k h a i b ot h n gt h n g . Nh v y , n it u y ni n tP l u s O n e( i n tx ) ; k h n gc t c d n g t t c c c k h c l t u y nb c h c n n g( c t h h o c k h n gc t h c c m t n hn g h an i t u y n i k h i s a un y ) . P h n gp h pt i pc nt h n hc n gc u n gc pc cc q u a nc h c n n g : i n l i n ei n tP l u s O n e
( i n tx ){ r e t u r nx++ ; }

Nh nt h yr n gc c t r n hb i nd c hs k i mt r a ( v n l u nl u nk h n g ) c h ov i c s d n gc a d a n hs c h i s c h c n n gv g i t r t r v ( t h c h i nb t k c h u y n i c nt h i t ) , m t c i g t i nx l l k h n gc k h n n g . Ng o i r a , n ub nc g n gv i t t r nn h l m t v mt i nx l , b ns c m t t c d n gp h k h n gmo n gmu n . B ns g nn h l u nl u nmu n t n hn g h a n i t u y nt r o n gm t t pt i nt i u . K h i t r n hb i nd c ht h y n hn g h a n h v y , n t c c l o i c h c n n g( c h k k t h pv i g i t r t r v ) v c c c q u a nc h c n n gt r o n gb n gb i ut n gc a n . K h i b ns d n gc h c n n g , t r n hb i nd c hs k i mt r a mb o c c c u c g i l c h n hx c v g i t r t r v a n g c s d n gm t c c hc h n hx c , v s a u t h a yt h c c c q u a n c h c n n gc h oc c c u c g i c h c n n g , d o l o i t r c c c h i p h . C c m n i t u y nk h n gc h i mk h n gg i a n , n h n gn uc h c n n gl n h , i un yt h c s c t h m t k h n gg i a n t h ns ov i m c t or a l m m t c u c g i c h c n n gb n ht h n g( y i s t r ns t a c kv l mC A L L ) . M t h mn i t u y nt r o n gm t t pt i nt i u c m t a v c b i t , k t k h i b np h i b a og mc c t pt i nt i u c c h a c c c h c n n gv n hn g h a c a n t r o n gt t c c c t pt i nm c c c h c n n g c s d n g , n h n gb n


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 154/320

08/10/2013

Suy ngh trong C + +, Vol 1

k h n gk t t h c v i n h i ul i n hn g h a ( t u yn h i n , n hn g h a p h i g i n gn h a ut r o n gt t c n h n gn i m c c c h c n n gn i t u y n c b a og m) .

I n l i n e st r o n gl p
x c n hm t h mn i t u y n , b nt h n gp h i t t r c c c n hn g h a c h c n n gv i n i t u y nt k h a . T u y n h i n , i un yl k h n gc nt h i t t r o n gm t n hn g h a l p . C h c n n gn ob nx c n ht r o n gm t n hn g h a l pl t n gm t n i t u y n . V d :
// :C 0 9 :I n l i n e . c p p //I n l i n e st r o n gl p #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; c l a s sP o i n t{ i n ti ,j ,k ;c n gc n g : i m( ) :i( 0 ) ,j( 0 ) ,k( 0 ){ } i m( i n ti i ,j ji n t ,i n tk k ) :i( i i ) ,j( j j ) ,k( k k ){ } v o i dp r i n t( c o n s t s t r i n g&m s g=" " ){ c o n s t !n u( m s g . s i z e( )=0)c o u t< <m s g< <e n d l ; c o u t < <" i= "< <i< <" , " < <" j= "< <k< <" , " < <" k= "< <k< <e n d l; } } ; i n tm a i n( ){ i mp ,q( 1 , 2 , 3 ) ; p . p r i n t( " g i t r c ap " ) ; q . p r i n t( " g i t r c aq " ) ; }/// :~

y , h a i n h x yd n gv i nn( ) c h c n n gl t t c i n l i n e s t h e om c n h . T h n gb ot r o n gma i n( ) r n gt h c t b n a n gs d n gc h c n n gn i t u y nl mi n hb c h , n h n p h i c . H n hv i h pl c a m t c h c n n g c t r n gb t k c h od l m t n i t u y n( n uk h n gt r n hb i nd c hc a b nb h n g ) . S k h c b i t d u yn h t b ns t h yl t r o n gh o t n g . T t n h i n , s c md l s d n gi n l i n e s k h pm i n i t r o n gk h a i b ol pv h t i t k i mt h mb c l mc h o n h n g h a c h c n n gb nn g o i t h n hv i n . H yg h i n h , t u yn h i n , t n gv m t n i t u y nl c u n gc pc c c h i c i t i n t i uh a c a t r n hb i nd c h . Nh n gn i t u y nl m t c h c n n gl ns g yr a m c n h n i k h pm i n i h m c g i , s nx u t m s n gl nc t h g i mt h i un h n gl i c ht c ( q u t r n hc h n gt i n c yc a h n h n gn yl t h n g h i m k h mp h n h n g n hh n gc a n i t u y nt r nc h n gt r n hc a b n v i t r n hb i nd c hc a b n ) .

C h cn n gt r u yc p

M t t r o n gn h n g n gd n gq u a nt r n gn h t c a i n l i n e s t r o n gl ph c l c h c n n g t r u y c p . yl m t c h c n n g n h c h op h pb n c h o c t h a y i m t p h nc a n h n c c a m t i t n gc n g h a l , m t b i nn i b h o c c c b i n . L d oi n l i n e s r t q u a nt r n g i v i c h c n n gt r u yc pc t h c n h nt h yt r o n gc c v d s a u :

// :C 0 9 :A c c e s s . c p p //C h cn n gt r u yc pn it u y n l pt r u yc p{ i n ti ;c n gc n g : i n tr e a d( )c o n s t{ r e t u r ni ; } t r n gt h i tl p( i n ti i ){ i=i i ; } } ; i n tm a i n( ){ T r u yc pA ; A . s e t( 1 0 0 ) ; i n tx= A . r e a d( ) ; }/// :~

y , n g i s d n gl pk h n gb a og i c t i px c t r c t i pv i c c b i nt r n gt h i b nt r o n gl p , v h c t h c g i r i n gt , d i s k i ms o t c a n h t h i t k l p . T t c c c t r u yc pv oc c t i nt h n hv i nd l i uc t h c i uk h i nt h n gq u a g i a od i nc h c n n gt h n hv i n . Ng o i r a , t r u yc pl h i uq u n gk . X e mx t c c c h i ( ) , v d . N uk h n gc i n l i n e s , c c m c t or a c h oc c c u c g i n c ( ) t h n gs b a og m yn y t r ns t a c kv l mc h om t n g nn g C A L Ll pr p . V i h uh t c c m y , k c ht h c c a m n ys l nh ns ov i m c t or a b i c c n i t u y n , v t h i g i a nt h c h i nc h c c h ns c l uh n . N uk h n gc c h c n n gn i t u y n , m t h i uq u c t h c t h i t k l ph c s b c md c h ng i nl l mc h o t i m t t h n hv i nc n gc n g , l o i b c c c h i p h b n gc c hc h op h pn g i s d n gt r u yc pt r c t i pt i . T m t q u a n i mt h i t k , yl t h mh a b i v t i s a u t r t h n hm t p h nc a g i a od i nc n gc n g , c n g h a l c c n h t h i t k n gc pk h n gb a og i c t h t h a y i n . B n a n gm c k t v i m t i n t g i t i . yl m t v n b i v b nc t h h c h i i k h i s a u n s c n h i uh u c hh n i d i nc h oc c t h n gt i nt r n gt h i n h m t n i h nl m t i n t , n h n gv i n t i l m t p h nc a g i a od i nc n gc n g , b nk h n gt h t h a y i n . Ho c b n c t h mu nt h c h i nm t s t n ht o nk h c n h l m t p h nc a v i c c h o c t h i t l pt i , m b nk h n gt h l mg n un l c n gk h a i . N u , m t k h c , b n l u nl u ns d n gc h c n n gt h n hv i n c v t h a y i c c t h n gt i nt r n gt h i c a m t i t n g , b nc t h t h a y i i d i nc b nc a c c i t n gn i d u n gt r i t i m c a b n . Ng o i r a , v i c s d n gc c c h c n n gt h n hv i n k i ms o t c c t h n hv i nd l i uc h op h pb nt h m m v o c c c h c n n gt h n hv i n p h t h i nk h i d l i u a n g c t h a y i , m c t h r t h u c ht r o n gq u t r n hg r i . N um t t h n hv i nd l i ul c n gk h a i , b t c a i c t h t h a y i b t c l c n om b nk h n gb i t v n .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 155/320

08/10/2013

Suy ngh trong C + +, Vol 1

T r u yx u t v c h n g t b i n M t s n g i t i pt c c h i a c c k h i n i mv c h c n n gt r u yc pv ot r u y x u t ( c t h n gt i nt r n gt h i t m t i t n g ) v c h n g t b i n( t h a y i t r n gt h i c a m t i t n g ) . Ng o i r a , c h c n n gq u t i c t h c s d n g c u n gc pc c t nc h c n n gt n gt c h oc a c c e s s o r v mu t a t o r , l mt h n ob ng i c h c n n gx c n hx e mb n a n g c h o c s a i t h n gt i nt r n gt h i . D o ,
// :C 0 9 :R e c t a n g l e . c p p //A c c e s s o r s&c h n g tb i n l pR e c t a n g l e{ i n tr n g ,c a o ,c n gc h n g : H n hc h n h t( i n tw=0 ,i n th=0 ) :r n g( w ) ,c a o( h ){ } i n tw i d t h( )c o n s t { r e t u r nr n g ; }// c k h o n gt r n gr n g( i n tw ){ r n g=w ; }//S e t i n tc h i uc a o ( )c o n s t{ r e t u r nc a o ; }// c t r n gc a o( i n th ){ c a o=h ; }//S e t } ; i n tm a i n( ){ R e c t a n g l er( 1 9 ,4 7 ) ; //T h a y ic h i ur n g v c h i uc a o : r . h e i g h t( 2*r . w i d t h( ) ) ; r . w i d t h( 2*r . h e i g h t( ) ) ; }/// :~

C c n h x yd n gs d n gd a n hs c hk h i t ox yd n g( m t t h i g i a nn g ng i i t h i ut r o n gc h n g8 v b p t r o n gC h n g1 4 ) k h i t oc c g i t r c a t o nv c a o( s d n gm up s e u d o c o n s t r u c t o r v i n h i ul o i b u i l t i n ) . B nk h n gt h c t nh mt h n hv i nb n gc c hs d n g n hd a n hg i n gn h c c t h n hv i nd l i u , v v yb nc t h b c md p h nb i t c c t h n hv i nd l i uv i m t n h nm n hh n g u . T u yn h i n , n hd a n hv i h n g u n h n u c b ov , d o b nk h n gn ns d n gc h n g . B nc t h c h nt h a yv s d n g" c " v " t h i t l p " c h t r u yx u t v c h n g t b i n :


// :C 0 9 :R e c t a n g l e 2 . c p p //A c c e s s o r s&c h n g tb i nv i" c "v " t h i tl p " l pR e c t a n g l e{ i n tc h i ur n g ,c h i uc a o ,c n gc h n g : H n hc h n h t( i n tw=0 ,i n th=0 ) :c h i ur n g( w ) ,c h i uc a o( h ){ } i n t g e t W i d t h( )c o n s t{ w i d t ht r l i ; } t r n gs e t W i d t h( i n tw ){ w i d t h=w ; } i n t g e t H e i g h t( )c o n s t{ c h i uc a ot r l i ; } t r n gs e t H e i g h t( i n th ){ c h i uc a o=h ; } } ; i n tm a i n( ){ R e c t a n g l er( 1 9 ,4 7 ) ; //T h a y ic h i ur n g v c h i uc a o : r . s e t H e i g h t( 2*r . g e t W i d t h( ) ) ; r . s e t W i d t h( 2*r . g e t H e i g h t( ) ) ; }/// :~

T t n h i n , b t r u yx u t v c h n g t b i nk h n gp h i l n g n gd n ng i n m t b i nn i b . i k h i h c t h t h c h i nc c p h pt n hp h c t ph n . V d s a u ys d n g T i uc h u nt h v i nCc h c n n gt h i g i a n s nx u t m t ng i nT h i g i a nl ph c :
// :C 0 9 :C p p t i m e . h //M tl ph ct h ig i a n ng i n #I f n d e fC P P T I M E _ H #X c n hC P P T I M E _ H #B a og m< c t i m e > #B a og m< c s t r i n g > c l a s sT i m e{ s t d: :t i m e _ tt ; s t d: :t m ap h n g ; c h a ra s c i i R e p [ 2 6 ] ; u n s i g n e dc h a rl f l a g ,a f l a g ; t r n gu p d a t e L o c a l( ){ i f ( l f l a g ! ){ ap h n g=*s t d: :l o c a l t i m e( &T ) ; l f l a g++; } } t r n gu p d a t e A s c i i( ){ i f( a f l a g ! ){ u p d a t e L o c a l( ) ; s t r c p y( a s c i i R e p ,s t d: :a s c t i m e( & ap h n g ) ) ; a f l a g++ ; } }c n gc n g : t h ig i a n( ){ d u( ) ; } n hd uk h o n g t r n g( ){ l f l a g=a f l a g=0 ; s t d: :t h ig i a n( &T ) ; } c o n s tc h a r*a s c i i( ){ u p d a t e A s c i i( ) ; a s c i i R e p t r l i ; } //K h cb i tt r o n gv ig i y : i n t n gb n g( T h ig i a n*d t ){ c o n s t i n t t r l i( s t d: :d i f f t i m e( t ,d t >t ) ) ; } i n td a y l i g h t S a v i n g s( ){ u p d a t e L o c a l( ) ; l o c a l . t m _ i s d s tt r l i ; } i n td a y o f y e a r( ){ //K t n g y0 1t h n g1 u p d a t e L o c a l( ) ; t r l o c a l . t m _ y d a y ; } i n tD A Y O F W E E K( ){ //T K h iS u n d a y u p d a t e L o c a l( ) ; l o c a l . t m _ w d a yt r l i ; } i n ts i n c e 1 9 0 0( ){ //n mk t n m1 9 0 0 u p d a t e L o c a l( ) ; l o c a l . t m _ y e a rt r l i ; } i n tt h n g( ){ //T t h n g u p d a t e L o c a l( ) ; l o c a l . t m _ m o n

s t d: :

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

156/320

08/10/2013

Suy ngh trong C + +, Vol 1

t r l i ; } i n td a y O f M o n t h( ){ u p d a t e L o c a l( ) ; l o c a l . t m _ m d a y t r l i ; } i n tg i ( ){ //K t n a m , n gh 2 4g i u p d a t e L o c a l( ) ; l o c a l . t m _ h o u rt r l i ; } i n tp h t( ){ u p d a t e L o c a l( ) ; l o c a l . t m _ m i nt r l i ; } i n tt h h a i( ){ u p d a t e L o c a l( ) ; l o c a l . t m _ s e ct r l i ; } } ; #E n d i f//C P P T I M E _ H/// :~

C c c h c n n gt h v i nCc h u nc n h i u i d i nc h ot h i g i a n , v yl m t p h nc a c c T h i g i a nl ph c . T u y n h i n , n k h n gp h i l c nt h i t c pn h t t t c t r o n gs h , v v yt h a yv c c t i me _ t t c s d n gn h c c i d i nc s , v t m a p h n gv k t A S C I I i d i na s c i i R e pt n gc c c h r a n uh c c pn h t v oh i n t i t i me _ t . Ha i t i nc h c n n gu p d a t e L o c a l (v ) u p d a t e A s c i i (k i mt r a n h n gl c v c i uk i n) t h c h i nc p n h t . C c n h x yd n gg i l n hd u( ) c h c n n g( m n g i d n gc n gc t h g i b u c c c i t n g i d i n c h ot h i i mh i nt i ) , v i un ys x a h a i l c c h r a r n gt h i g i a n a p h n gv i d i nA S C I I b yg i l k h n gh pl . C c a s c i i ( ) c h c n n gc u c g i u p d a t e A s c i i ( , m c c b ns a ok t q u c a c c t i uc h u nt h v i n C) c h c n n ga s c t i me ( ) v om t b m a p h n gv a s c t i me ( ) s d n gm t k h uv c d l i ut n h c g h i n uh m c g i n i k h c . C c a s c i i ( ) g i t r t r v c h c n n gl a c h c a b m a p h n gn y . T t c c c c h c n n gb t uv i d a y l i g h t S a v i n g s (s d n g) u p d a t e L o c a l (c h c n n g , g yr a h nh pk t q u ) i n l i n e s l k h l n . i un yd n gn h k h n gc g i t r , c b i t l x e mx t c t h b ns k h n gg i c c c h c n n g r t n h i u . T u yn h i n , i un yk h n gc n g h a l t t c c c c h c n n gc n c t h c h i nn o n i n l i n e . N ub nt h c h i nc c c h c n n gk h c k h n gn i t u y n , t n h t l g i u p d a t e L o c a l (n i t u y nv v ym m c a n s c n h n i t r o n gk h n g) c h c n n gn i t u y n , l o i b t h mc h i p h c h c n n gc u c g i . yl m t c h n gt r n ht h n g h i mn h :
// :C 0 9 :C p p t i m e . c p p //K i mt r am tl pt h ig i a n ng i n #B a og m" C p p t i m e . h "#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ T h ig i a nb t u ; f o r( i n ti=1 ;i< 1 0 0 0 ;i++ ){ c o u t< <i< <' ' ; i f( i %1 0= =0 )c o u t< <e n d l ; } T h ig i a nk tt h c ; c o u t< <e n d l ; c o u t< <" b t u= "< <s t a r t . a s c i i( ) ; c o u t< <" k tt h c= "< <e n d . a s c i i( ) ; c o u t< <" n gb n g= "< <c u i . n gb n g ( v b t u ) ; }/// :~

M t T h i g i a n i t n g c t or a , s a u m t s h o t n gt h i g i a n c t h c h i n , s a u m t g i yT h i g i a n i t n g c t or a n hd us k t t h c t h i g i a n . C h n g c s d n g h i nt h b t u , k t t h c , v t h i g i a nt r i q u a .

S t a s hv s px pv i i n l i n e s

T r a n gb i n l i n e s , c h n gt a c t h c h u y n i c c S t a s hv s px pc c l ph c c h i uq u h n :

// :C 0 9 :S t a s h 4 . h //C h cn n gn it u y n #I f n d e fS T A S H 4 _ H #X c n hS T A S H 4 _ H #B a og m" . ./R e q u i r e . h " l pS t a s h{ i n ts i z e ; //K c ht h cc am ik h n gg i a n i n ts l n g ; / /S c h l ut r i n tt i pt h e o ; //k h n gg i a nt r n gT i p //T n gp h n b m n gb y t e : u n s i g n e dc h a r*l ut r ; t r n gt h ip h n g( i n tt n g ) ,c n gc h n g : S t a s h( i n tS Z ) :k c ht h c( S Z ) ,s l n g( 0 ) , t i pt h e o( 0 ) ,l ut r ( 0 ){ } S t a s h( i n ts z ,i n ti n i t Q u a n t i t y ) :k c ht h c( S Z ) , s l n g( 0 ) ,t i pt h e o( 0 ) ,l ut r ( 0 ){ t h ip h n g( i n i t Q u a n t i t y ) ; } S t a s h: :~S t a s h( ){ i f( l ut r =0 ! ) x a[ ]l ut r ; } i n ta d d( v o i d*p h nt ) ; v o i d*l y( i n ti n d e x )c o n s t{ y uc u( 0< =c h s ," S t a s h: :l y( )c h s " ) ; i f( i n d e x >=t i pt h e o ) t r v 0 ;// c h c u ic n g //S nx u tc o nt r np h nt m o n gm u n : t r l i&( l ut r [ i n d e x*s i z e ] ) ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 157/320

08/10/2013

Suy ngh trong C + +, Vol 1

} i n tc o u n t( )c o n s t{ r e t u r nt i pt h e o ; }} ; #E n d i f//S T A S H 4 _ H/// :~

C c c h c n n gn h n yl mv i c t t n h i n l i n e s , n h n gn h nt h yr n gh a i c h c n n gl nn h t v nc nl i n h k h n gi n l i n e s , k t k h i n i t u y nh c t h s k h n gg yr a b t k l i n h u nt h c h i n :
// :C 0 9 :S t a s h 4 . c p p{ O } #B a og m" S t a s h 4 . h " #I n c l u d e#i n c l u d e< c a s s e r t >s d n gt nm i nk h n gg i a nt i uc h u n ; c o n s ti n tt n g=1 0 0 ; i n ts t a s h: :t h m( v o i d*y ut ){ i f( s a u >=s l n g )// k h n gg i a n l i ? t n gl n( t n g ) ; //S a oc h pp h nt v ol ut r , //b t ut k h n gg i a n t r n gb nc n h : i n ts t a r t B y t e s=t i pt h e o*K c ht h c ; u n s i g n e dc h a r*e= ( u n s i g n e dc h a r* )y ut ; f o r( i n ti=0 ;i< k c ht h c ;i++ ) l ut r [ s t a r t B y t e s+i ]=e[ i ] ; t i pt h e o++ ; t r l i( t i pt h e o-1 ) ;//C h s } t r n gs t a s h: :t h ip h n g( i n tt n g ){ k h n g n h( t n g >=0 ) ; i f( t n g= =0 ) r e t u r n ; i n tn e w Q u a n t i t y=s l n g+t n g ; n e w B y t e si n t=n e w Q u a n t i t y*K c ht h c ; i n to l d B y t e s=s l n g*K c ht h c ; u n s i g n e dc h a r*b=n e wu n s i g n e dc h a r[ n e w B y t e s ] ; f o r( i n ti=0 ;i< o l d B y t e s ;i++ ) b[ i ]=l ut r [ i ] ;//S a oc h pc nm i x a[ ]( l ut r ) ;//p h th n hl ut r c l ut r =b ;// i mt ib n h m i s l n g=n e w Q u a n t i t y ;// i uc h n hk c hc }/// :~

M t l nn a , c c c h n gt r n ht h n g h i mx c n h nr n gt t c m i t h a n gl mv i c m t c c hc h n hx c :
// :C 0 9 :S t a s h 4 T e s t . c p p //{ L }S t a s h 4 #B a og m" S t a s h 4 . h " #B a og m" . ./R e q u i r e . h " #B a og m< f s t r e a m > #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ S t a s hi n t S t a s h( s i z e o f( i n t ) ) ; f o r( i n ti=0 ;i< 1 0 0 ;i++ ) i n t S t a s h . a d d( & i ) ; f o r( i n tj=0 ;j< i n t S t a s h . c o u n t( ) ;j++ ) c o u t< <"i n t S t a s h . f e t c h( " < < k< < " )=" < <*( I n t* )i n t S t a s h . f e t c h( j ) < <E n d l ; c o n s ti n tB U F S I Z E=8 0 ; S t a s hs t r i n g S t a s h( s i z e o f( c h a r )*B U F S I Z E ,1 0 0 ) ; i f s t r e a mt r o n g( " S t a s h 4 T e s t . c p p " ) ; mb o( t r o n g" S t a s h 4 T e s t . c p p " ) ; n gd y , t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) s t r i n g S t a s h . a d d(( c h a r* )l i n e . c _ s t r( ) ) ; i n tk=0 ; c h a r*c p ; !t r o n gk h i( ( c p= ( c h a r* )s t r i n g S t a s h . f e t c h( k++ ) )=0 ) c o u t< <" s t r i n g S t a s h . f e t c h( "<< k< <" )= " < <C p< <e n d l ; }/// :~

yl c h n gt r n ht h n g h i mt n gt c s d n gt r c , v v ys nl n gn n c v c b ng i n gn h a u . C c n g nx pl pn ys d n gt t h nc a i n l i n e s :
// :C 0 9 :S t a c k 4 . h//V ii n l i n e s #I f n d e fS T A C K 4 _ H #X c n hS T A C K 4 _ H #B a og m" . ./R e q u i r e . h " l pS t a c k{ c ut r cl i nk t{ v o i d*d l i u , l i nk t*t i pt h e o ; L i nk t( v o i d*d a t ,*L i nk tN X T ) : d l i u( d a t ) ,t i pt h e o( N X T ){ } }* u ,c n gc h n g : N g nx p( ) : u( 0 ){ } ~S t a c k( ){ y uc u( u= =0 ," s px pk h n g t r n g " ) ; } t r n g y( v o i d*d a t ){ u=n e wl i nk t( d a t ,n g i n g u ) ; } v o i d*( )c o n s t{ ut r l i ? u >d l i u :0 ; } v o i d*p o p( ){ i f( u= =0 )r e t u r n0 ; v o i d*k tq u = u >d l i u , l i nk t*o l d H e a d= u ; u= u >t i pt h e o ; x ao l d H e a d , k tq u t r v ; } } ; #E n d i f//S T A C K 4 _ H/// :~

Nh nt h yr n gc c l i nk t h y c m t n h n gc s np h mn ot r o n gc c p h i nb nt r c c a n g nx p c g b . T r o n gc a s p o p( ) , b i ut h c x a o l d He a dc h ng i nl g i i p h n gb n h c s d n gb i
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 158/320

08/10/2013

Suy ngh trong C + +, Vol 1

l i nk t ( k h n gp h h yc c d l i u i t n g c t r nb i c c l i nk t ) . H uh t c c c h c n n gn i t u y nk h c ov r r n g , c b i t l l i nk t . T h mc h p o p( ) c v h pp h p , m c d b t c l c n ob nc i uk i nh o c c c b i n a p h n g l k h n gr r n gr n gi n l i n e s s l c l i . y , h mn h n c t h s k h n gl mt nt h n gb t c i ug . N ut t c c c c h c n n gc a b n c s px pt h e oh n gs d n gt h v i nt r n nk h ng i nv k h n gc l i n k t c nt h i t , n h b nc t h t h yt r o n gv d k i mt r a ( t h n gb or n gk h n gc S t a c k 4 . c p p) :
// :C 0 9 :S t a c k 4 T e s t . c p p //{ T }S t a c k 4 T e s t . c p p #B a og m" S t a c k 4 . h " #B a og m" . ./R e q u i r e . h " #B a og m< f s t r e a m > #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ r e q u i r e A r g s( a r g c ,1 ) ;//t pt i nt nl t h a ms t r o n gi f s t r e a m( a r g v[ 1 ] ) ; mb o( t r o n g ,a r g v[ 1 ] ) ; s t a c kt e x t l i n e s ; d n g c h u i; // ct pt i nv d n gl ut r t r o n gn g nx p : t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) t e x t l i n e s . p u s h( m ic h u i( d n g ) ) ; //P o pc cd n gt n g nx pv i nr a : c h u i*s ; t r o n gk h i( !( s=( s t r i n g* ) t e x t l i n e s . p o p( ) )=0 ){ c o u t< <*s< <e n d l ; x as ; } }/// :~

i k h i n g i t a s v i t c c l ph c v i t t c c c c h c n n gn i t u y n c l ps c t r o n gt pt i nt i u ( b ns t h yt r o n gc u ns c hn ym t i b c q u a d n gb nt h nm n h ) . T r o n gq u t r n hp h t t r i nc h n gt r n hn yc l l v h i , m c d i k h i n c t h l m b i nt pl uh n . S a uk h i c h n gt r n h n n hm t c h t , c t h b ns mu nq u a yt r l i v l mc h oc h c n n gk h n gn i t u y nt h c hh p .

I n l i n e sv t r n hb i nd c h

h i u c k h i n i t u y nc h i uq u , n r t h u c h b i t n h n gg c c t r n hb i nd c hn ok h i n g pm t n i t u y n . Nh v i b t k c h c n n g , t r n hb i nd c hg i c h c n n gl o i ( c n g h a l , c c m ut h n g h i mc h c n n gb a og mt nv c c l o i i s , k t h pv i g i t r t r v c h c n n g ) t r o n gb n gb i ut n gc a n . Ng o i r a , k h i t r n hb i nd c ht h yr n g l o i c h c n n gc a n i t u y nv c c c q u a nc h c n n gp h nt c hm k h n gc l i , c c m c h oc c c q u a nc h c n n gc n g c a v ob n gk h i u . C h od c c m c l ut r d n gm n g u n , h n gd nl pr pb i n s o n , h o c m t s i d i nk h c l nc c t r n hb i nd c h . K h i b nt h c h i nm t c u c g i nm t h mn i t u y n , t r n hb i nd c h ut i n mb or n gc c c u c g i c t h c t h c h i nm t c c hc h n hx c . C n g h a l , t t c c c l o i i s h o c p h i l c c l o i c h n hx c t r o n gd a n h s c h i s c a h m, h o c t r n hb i nd c hp h i c k h n n g t h c h i nm t c h u y n i l o i h n hc h oc c l o i t h c hh pv g i t r t r v p h i n gl o i ( h o c c h u y n i c h o n gl o i ) t r o n gb i ut h c c h . i un y , t t n h i n , l c h n hx c n h n gg c c t r n hb i nd c hk h n gc h ob t k c h c n n gv k h c b i t v i n h n gg t i nx l k h n gv t i nx l k h n gt h k i mt r a c c l o i h o c t h c h i nc h u y n i . N ut t c c c l o i t h n gt i nc h c n n gp h h pv i b i c n hc a c u c g i , s a u m n i t u y n c t h a yt h t r c t i pc h oc c c u c g i c h c n n g , l o i t r c c c h i p h c u c g i v c h op h pt i uh a h nn a b i t r n hb i nd c h . Ng o i r a , n uc c n i t u y nl m t c h c n n gt h n hv i n , a c h c a i t n g( n y) c t v ov t r t h c h h p( s ) , t r o n g t t n h i nl m t h n h n gt i nx l l k h n gt h t h c h i n .

H nc h
C h a i t n hh u n gm c c t r n hb i nd c hk h n gt h t h c h i nn i t u y n . T r o n gn h n gt r n gh pn y , n c h n g i nt r l i t r n gc c h n ht h c t h n gt h n gc a m t h mb n gc c h n hn g h a n i t u y nv t or a l ut r c h o c c c h c n n gg i n gn h n c h om t k h n gn i t u y n . N un p h i l m i un yt r o n gn h i u nv d c h( m t h n gt h n gs g yr a m t l i n h i u n hn g h a ) , c c m i l i nk t c t h n gb ol b q u a n h i u n hn g h a . T r n hb i nd c hk h n gt h t h c h i nn i t u y nn uc h c n n gl q u p h c t p . i un yp h t h u c v ot r n hb i n d c hc t h , n h n gt i t h i i mh uh t c c t r n hb i nd c hc h ol n , n i t u y nc l s k h n g c b nb t k h i u q u . N i c h u n g , b t k l o i v n gl p c c o i l q u p h c t p m r n gn h m t n i t u y n , v n ub nn g h v n , v n gl pc t h i h i n h i ut h i g i a nh nb nt r o n gc h c n n gh ns ov i n h n gg l c nt h i t c h oc h c n n gg i i nt r nk h n g . N uc h c n n gc h l m t t ph pc c c ul n h ng i n , t r n hb i nd c hc t h s k h n gc b t k r c r i n i t u y nn , n h n gn uc r t n h i ub oc o , c c p h c a c u c g i c h c n n gs c t h nn h i us ov i c h i p h t h c h i nc t h . V h yn h , m i k h i b ng i m t c h c n n gn i t u y nl n , t o nb c q u a nc h c n n g c l pv ov t r c a m i c u c g i , v v yb nc t h d d n gn h n c m s n gl nm k h n g c b t c c i t i nh i us u t n gk . ( L ur n gm t s v d t r o n gc u ns c hn yc t h v t q u k c ht h c n i t u y nh pl c l i c h ob ot nm nh n hb t n gs n . )
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 159/320

08/10/2013

Suy ngh trong C + +, Vol 1

T r n hb i nd c hc n gk h n gt h t h c h i nn i t u y nn u a c h c a c c c h c n n g c t h c h i nn g mh o c m t c c hr r n g . N ut r n hb i nd c hp h i t or a m t a c h , s a u n s p h nb l ut r c h oc c m c h c n n gv s d n g a c h k t q u . T u yn h i n , k h i m t a c h l k h n gc nt h i t , t r n hb i nd c hs c l v nc nn i t u y nm . i uq u a nt r n gl p h i h i ur n gm t n i t u y nc h l m t g i t r n hb i nd c h , t r n hb i nd c hk h n gp h i b t c i ug t t c c c n i t u y n . M t t r n hb i nd c ht t s n i t u y nn h , c h c n n g ng i nt r o n gk h i b q u a m t c c ht h n gmi n hi n l i n e s c q u p h c t p . i un ys c u n gc pc h ob nn h n gk t q u b nmu nn g n g h a t h c s c a m t c u c g i c h c n n gv i h i uq u c a m t v m .

C h u y nt i l i ut h a m k h o

N ub n a n gt n gt n gn h n gg c c t r n hb i nd c h a n gl mg t h c h i ni n l i n e s , b nc t h n h ml n m n hv os u yn g h c n h i uh nc h h ns ov i t h c s t nt i . c b i t , n um t n i t u y nl mc h om t t i l i u t h a mk h ov p h a t r c m t c h c n n gm c h a c k h a i b ot r o n gl ph c ( c h od c h c n n g l n i t u y nh a yk h n g ) , n c t h c v n h t r n hb i nd c hs k h n gt h x l n :

// :C 0 9 :E v a l u a t i o n O r d e r . c p p // n hg i I n l i n e l pC h u y nt i p{ i n ti ;c n gc n g : C h u y nt i p( ) :i( 0 ){ } //G ic h cn n gk h n gk h a ib o : i n tf( )c o n s t{ r e t u r ng( )+1 ; } i n tg( )c o n s t{ r e t u r ni ; } } ; i n tm a i n( ){ C h u y nt i pf r w d ; f r w d . f( ) ; }/ // :~

T r o n gf ( ) , m t c u c g i c t h c h i nc h og( ) , m c d g( ) v nc h a c c n gb . i un yl mv i c b i v c c t i ub a n g n hn g h a n g nn g m k h n gc c h c n n gn i t u y nt r o n gm t l ph c s c n hg i c h o nk h i c c d un g o c n gc a k h a i b ol p . T t n h i n , n ug( ) l nl t c g i l f ( ) , b nmu nk t t h c v i m t t ph pc c c u c g i q u y , m l q u p h c t pc h oc c t r n hb i nd c hn i t u y n . ( Ng o i r a , b ns p h i t h c h i nm t s t h n g h i mt r o n gf ( ) h o c g( ) b u c m t t r o n gs h " c h m y " , h o c q u ys l v h n . )

Ho t n g nt r o n gx yd n gv h m h y
D n gv h mh yl h a i n i m b nc t h b l a v os u yn g h r n gm t n i t u y nl h i uq u h ns ov i t h c t . D n gv h mh yc t h c c c h o t n g n , b i v c c l pc t h c h a s u b o b j e c t s c d n gv h mh yp h i c g i . Nh n gs u b o b j e c t s c t h l i t n gt h n hv i n , h o c h c t h t nt i b i v t h a k ( c n ut r o n g C h n g1 4 ) . Nh m t v d v m t l ph c v i i t n gt h n hv i n :
// :C 0 9 :H i d d e n . c p p H o t n g// nt r o n gi n l i n e s#i n c l u d eu s i n gn a m e s p a c es t d ; T h n hv i nl p{ i n ti ,j ,k ;c n gc n g : T h n hv i n( i n tx=0 ) :i( x ) ,f( x ) ,k( x ){ } ~T h n hv i n( ){ c o u t< <" ~T h n hv i n " < <e n d l ; } } ; l pW i t h M e m b e r s{ T h n hv i nq ,r ,s ;//C n h x yd n g i n ti ;c n gc n g : W i t h M e m b e r s( i n ti i ) :i( i i ){ }//k h n g n gk ? ~W i t h M e m b e r s( ){ c o u t< <" ~W i t h M e m b e r s "< <e n d l ; } } ; i n tm a i n( ){ W i t h M e m b e r sw m( 1 ) ; }/// :~

G i ml nx n

C c n h x yd n gc h ot h n hv i n ng i nl n i t u y n , v k h n gc g c b i t x yr a l k h n gt h a k , i t n gt h n hv i n a n gg yr a c c h o t n g nt h m. Nh n gt r o n gl pWi t h Me mb e r s v a c h nx yr a h n p n gm t . C c n h x yd n gv h mh y i v i c c t h n hv i n i t n gq, r v s c g i l t n g , v c c n h x yd n gv h mh yc n gn i t u y n , n ns k h c b i t c n g h a t h mt h n hv i nb n ht h n g . i un yk h n gc n g h a l b nn nl u nl u nx yd n gv n hn g h a h mh yk h n gn i t u y n , c n h n g t r n gh p , n c n g h a . Ng o i r a , k h i b n a n gl mc h om t b a n u" p h c t h o " c a m t c h n gt r n hb n g c c hn h a n hc h n gv i t m , n t h n gt h u nt i nh n s d n gi n l i n e s . Nh n gn ub nl on g i v h i uq u , l m t n i x e mx t . T r o n gm t c u ns c hn h t h n y , s ng i nv t e r s e n e s s a n hn g h a n i t u y nt r o n gc c l ph c l r t h u [ 4 3 ] c hb i v p h h ph nt r nm t t r a n gh o c m nh n h( t r o n gm t c u c h i t h o ) . T u yn h i n , D a nS a k s c h r a r n gt r o n gm t d nt h c t n yc t c d n gk h n gc nt h i t l ml nx ng i a od i nl ph c v d o l mc h o l ph c k h k h nh n s d n g . n g c p nc h c n n gt h n hv i nx c n ht r o n gc c l ph c s d n gt i n g


160/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

L a t i n ht i c h ( t i c h ) v c h or n gt t c c c n hn g h a n yp h i c t b nn g o i l p g i c h og i a od i n s c hs . T i uh a , n gl pl u n , l m t v n r i n gb i t . N ub nmu nt i uh a , s d n gn i t u y nt k h a . S d n gp h n gp h pn y , t r c R e c t a n g l e . c p pd t r t h n h :
// :C 0 9 :N o i n s i t u . c p p //L o ib c cc h cn n gt ic h l pR e c t a n g l e{ i n tc h i ur n g ,c h i uc a o ,c n gc h n g : H n hc h n h t( i n tw=0 ,i n th=0 ) ; i n tg e t W i d t h( )c o n s t ; t r n g s e t W i d t h( i n tw ) ; i n tg e t H e i g h t( )c o n s t ; t r n gs e t H e i g h t( i n th ) ; } ; n it u y nR e c t a n g l e: :R e c t a n g l e( i n tw ,i n th ) :C h i ur n g( w ) ,c h i uc a o( h ){ } i n l i n ei n tc h n h t: :g e t W i d t h( )c o n s t{ c h i ur n gt r l i ; } i n l i n ev o i dc h n h t: :s e t W i d t h( i n tw ){ w i d t h=w ; } i n l i n ei n tc h n h t: :g e t H e i g h t( )c o n s t{ c h i uc a ot r l i ; } i n l i n ev o i dc h n h t: :s e t H e i g h t( i n th ){ c h i uc a o=h ; } i n tm a i n( ){ H n hc h n h tr( 1 9 ,4 7 ) ; //T r a n s p o s ec h i ur n gv c h i uc a o : i n ti H e i g h t=r . g e t H e i g h t( ) ; r . s e t H e i g h t( r . g e t W i d t h( ) ) ; r . s e t W i d t h( i H e i g h t ) ; }/// :~

B yg i n ub nmu ns os n hh i uq u c ac h c n n gn i t u y nc h c n n gn o n i n l i n e , b nc h c t h l o i b c c n i t u y nt k h a . ( C h c n n gn i t u y nn nb n ht h n g c t t r o n gt pt i nt i u , t u yn h i n , t r o n gk h i c h c n n gk h n gn i t u y np h i t r o n g nv d c ht h u t c am n h . ) N ub nmu n t c c c h cn n gv ot i l i u , n l m t h o t n gc t v d n ng i n . T r o n gc h c h c n n gy uc uc n gv i c h nv c t i mn n gl n h nc h oc c l i . M t l d ok h c c h oc c ht i pc nn yl b nl u nl u nc t h t or am t p h o n gc c h n hd n g p h h pc h oc c n hn g h a c h c n n g , m t c i g k h n gl u nl u nx yr a v i t i c h c c c h c n n g .

T h mn h i ut n hn n gt i nx l

T r c , t i n i r n gb ng nn h l u nl u nmu ns d n gn i t u y nc h c n n gt h a yv ma c r ot i nx l . C c t r n gh pn g o i l l k h i b nc np h i s d n gb a t n hn n g c b i t t r o n gt i nx l C( c n gl C++t i nx l ) : s t r i n g i z i n g , d yn i , v d nm t h n gb o . S t r i n g i z i n g , g i i t h i ut r c t r o n gc u ns c h , c t h c h i n v i #c h t h v c h op h pb n c m t n h nd n gv b i nn t h n hm t m n gk t . N i c h u i x yr a k h i h a i m n gk t l i nk k h n gc d uc h mc uc a nt h i p , t r o n gt r n gh pn y , c h n g c k t h p . Ha i t n hn n g n y c b i t h u c hk h i v i t m g l i . D o , i un yi nc c g i t r c a b t k b i n . B nc n gc t h c c m t d uv t m i nr a c c b oc on h h t h c h i n :

#D e f i n eD E B U G( x )c o u t< <#x" = "< <x< <e n d l

#D e f i n eT R A C E( s )c e r r< <#s< <e n d l ;s

C c #s s t r i n g i z e s b oc ok t q u c h o ur a , v l nt h h a i s n h c l i l i t u y nb n yn c t h c t h i . T t n h i n , yl i um c t h g yr a v n , c b i t l t r o n gm t d n gc h ov n g :
f o r( i n ti=0 ;i< 1 0 0 ;i++ ) T R A C E( f( i ) ) ;

B i v t h c s c h a i c ul n ht r o n gT R A C E( ) v m , m t d n gc h ov n gl pt h c h i nc h l n g i ut i n . G i i p h pl t h a yt h c c d uc h mp h yb n gd up h yt r o n gc c v m .

M t h n gb od n
M t h n gb od n , t h c h i nv i s ##c h t h , r t h u c hk h i b n a n gs nx u t m . Nc h op h pb nc h a i n h d a n hv d nc h n gl i v i n h a u t n gt or a m t n hm i . V d ,
#X c n hl n hv c( a )c h a r*a##_ s t r i n g ;i n tm tl pg h i##_ s i z e{ ( m t ) ; L N HV C( h a i ) ; l n hv c( b a ) ; //. . . } ; l n hv c

C i t h i nv i ck i mt r al i

M i c u c g i nc c l n hv c ( ) v mt or a m t n ht c h c m t m n gk t v m t g i d i c a m n g . K h n gc h l n d d n gh n c , n c t h l o i b c c l i m h a v l mc h ob ot r d d n gh n . C c r e q u i r e . hc h c n n g c s d n gc h ot i t h i i mn ym k h n gc nx c n hh ( m c d k h n g n h( ) c n g c s d n g g i pp h t h i nc c l i l pt r n hm n t h c hh p ) . B yg i l l c x c n ht pt i nt i u n y . C h c n n gn i t u y n c t h u nt i n yb i v c h n gc h op h pt t c m i t h p h i c t t r o n gm t t pt i nt i u , m ng i nh a q u t r n hs d n gg i . B nc h b a og mc c t pt i nt i u v b nk h n gc np h i
161/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

l ol n gv v i c l i nk t m t t pt i nt h c t h i . B nn nl ur n gt r n gh pn g o i l ( c t r n hb yc h i t i t t r o n gt p2 c a c u ns c hn y ) c u n gc pm t c c h h i uq u h nn h i ut r o n gv i c x l n h i ul o i l i c b i t l n h n gn g i m b nmu np h c h i t t h a yv o c h d n gc h n gt r n h . C c i uk i nm r e q u i r e . hx l , t u yn h i n , l n h n gn g i m n g nc h nv i c t i pt c c c c h n gt r n h , c h n gh nn h n un g i d n gk h n gc u n gc p i s d n gl n hh o c n um t t pt i nk h n g t h m c . D o , n c c h pn h nm h g i l CS t a n d a r dL i b r a r yc h c n n ge x i t ( ) . C c t pt i nt i u s a u y c t t r o n gt h m c g c c a c u ns c hv v yn d d n gt r u yc pt t t c c c c h n g .
//: :R e q u i r e . h //K i mt r ac h oc c i uk i nl it r o n gc h n gt r n h // ap h n g" s d n gt nm i nk h n gg i a nt i uc h u n "c h oc ct r n hb i nd c hc #I f n d e fR E Q U I R E _ H #X c n hR E Q U I R E _ H #B a og m< c s t d i o > #B a og m< c s t d l i b > #B a og m< f s t r e a m > #I n c l u d e i n l i n ev o i dy uc u( y uc ub o o l , s t d: :s t r i n gc o n s t&m s g=" Y uc uk h n g " ){ s d n gt nm i nk h n gg i a nt i uc h u n ; n u( y uc u ){ f p u t s( m s g . c _ s t r( ) ,t h i t b l ic h u n ) ; f p u t s( " \n " ,t h i tb l ic h u n ); e x i t( 1 ) ; } } i n l i n ev o i dr e q u i r e A r g s( i n ta r g c ,i n ta r g s , s t d: :s t r i n gc o n s t&m s g= " P h is d n g %d is " ){ s d n gt nm i nk h n gg i a nt i uc h u n ; i f( a r g c= a r g s+1 ){ f p r i n t f( s t d e r r ,m s g . c _ s t r( ),a r g s ) ; f p u t s( " \n " ,t h i tb l ic h u n ) ; e x i t( 1 ) ; } } i n l i n ev o i dr e q u i r e M i n A r g s( i n ta r g c ,i n tm i n A r g s , c o n s ts t d: :s t r i n g&m s g= " P h is d n g tn h t %d is " ){ s d n gt nm i nk h n gg i a nt i uc h u n ; i f( a r g c < m i n A r g s+1 ){ f p r i n t f( s t d e r r ,m s g . c _ s t r() ,m i n A r g s ) ; f p u t s( " \n " ,t h i tb l ic h u n ) ; e x i t( 1 ) ; } } i n l i n ev o i d mb o( s t d: :i f s t r e a mv t r o n g , s t d: :s t r i n gc o n s t&f i l e n a m e= " " ){ s d n gt nm i nk h n gg i a nt i uc h u n ; n u( t r o n g ){ f p r i n t f( s t d e r r , " k h n gt h m t pt i n %s\n " , f i l e n a m e . c _ s t r( ) ) ; e x i t( 1 ) ; } } i n l i n ev o i d mb o( s t d: :o f s t r e a m&r a , s t d: :s t r i n gc o n s t&f i l e n a m e=" " ){ s d n gt nm i nk h n gg i a nt i uc h u n ; n u( r a ! ){ f p r i n t f( s t d e r r ," k h n g t h m t pt i n %s\n " , f i l e n a m e . c _ s t r( ) ) ; e x i t( 1 ) ; } } #E n d i f//R E Q U I R E _ H/// :~

C c g i t r m c n hc u n gc pt h n g i ph pl c t h t h a y i n uc nt h i t . B ns n h nt h yr n gt h a yv s d n g* c h a r i s , c o n s t s t r i n g& i s c s d n g . i un yc h op h pc h a i c h a r * v c h u i n h l i s c h oc c c h c n n gn y , v d o n i c h u n gl h u c h( b nc t h mu nt h e o h n ht h c n yt r o n gm c a r i n gb n ) . T r o n gc c n hn g h a c h or e q u i r e A r g s ( ) v r e q u i r e Mi n A r g s ( , m t l ) c b s u n gv os l n g i s m b n c nt r nd n gl n hv a r g c l u nl u nb a og mt nc a c h n gt r n h a n g c t h c h i nn h l i s k h n g , v d o l u nl u nc m t g i t r m l m t n h i uh ns l n gc c i s t h c t t r nd n gl n h . L uv i c s d n gc c a p h n g" s d n gt nmi nk h n gg i a nt i uc h u n" t k h a i t r o n gt n gc h c n n g . i un yl d om t s t r n hb i nd c ht i t h i i mv i t b i n yk h n gc h n hx c k h n gb a og mc c c h c n n g t h v i nCc h u nt r o n gt i uc h u nk h n gg i a nt n, t r n h c h u y nm nr t r r n gs g yr a m t l i c o mp i l e t i me . K h a i b o a p h n gc h op h pr e q u i r e . h l mv i c v i c c t h v i nc h a i c h n hx c v k h n g c h n hx c m k h n gc nm k h n gg i a nt nt i uc h u nc h ob t c a i c t pt i nt i u n y . yl m t c h n gt r n h ng i n k i mt r a r e q u i r e . h:


// :C 0 9 :E r r T e s t . c p p //{ T }E r r T e s t . c p p //K i mt r ar e q u i r e . h #B a og m#b a og m< f s t r e a m >s d n gt nm i nk h n gg i a nt i u c h u n" /r e q u i r e . h . . " ; i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ i n ti=1 ; y uc u( i ," g i t r
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 162/320

08/10/2013

Suy ngh trong C + +, Vol 1

p h il k h ck h n g " ) ; r e q u i r e A r g s( a r g c ,1 ) ; r e q u i r e M i n A r g s( a r g c ,1 ) ; i f s t r e a mt r o n g( a r g v[ 1] ) ; mb o( t r o n g ,a r g v[ 1 ] ) ;//S d n gt nt pt i n i f s t r e a mn o f i l e ( " n o f i l e . x x x " ) ; //K h n g : !// mb o( n o f i l e ) ;//m c n ht h a ms o f s t r e a mr a( " t m p . t x t " ) ; mb o ( t r o n g ) ; }/// :~

B nc t h b c md i t h m m t b c n a m c c t pt i nv t h m m t v m r e q u i r e . h:
#X c n hI F O P E N( V A R ,T N )\ T N ) ; i f s t r e a mV A R( N A M E ) ;\ mb o( V A R ,

M s a u c t h c s d n gn h t h n y :
I F O P E N( t r o n g ,a r g v[ 1 ] )

L c u , i un yc v h pd nv n c n g h a l c t h n l o i . Nk h n gp h i l k h n gk h i pk h n ga n t o n , n h n g l m t c o n n gt t n h t t r n h . L ur n g , m t l nn a , m t v mt r n gg i n gn h m t c h c n n gn h n gc x k h c n h a u , n t h c s t or a m t i t n g( t r o n g) c p h mv i v nc nv t q u v m . B n c t h h i u c i un y , n h n g i v i c c l pt r n hv i nm i v b ot r m n c h l m t i un a h p h i l n gt n gr a . C++l p h c t pm k h n gc nt h mv os n h ml n , v v yh yt h n i c h u y nm n hr a k h i s d n gc c ma c r ot i nx l b t c k h i n ob nc t h .

T mt t
l q u a nt r n gm b nc t h c h e g i uv i c t h c h i nc b nc a m t l ph c b i v b nc t h mu nt h a y i t h c h i nm i k h i s a un y . B ns l mc h on h n gt h a y i n yc h oh i uq u , h o c b i v b ns c c m t s h i ub i t t t h nv c c v n , h o c v m t s l ph c m i t r n nc s nm b nmu ns d n gt r o n gv i c t h c h i n . B t c i ug g yn g u yh i mc h os r i n gt c a v i c t h c h i nc b nl mg i mt n hl i n hh o t c a n g n n g . Nh v y , c h c n n gn i t u y nl r t q u a nt r n gb i v n h un h l o i b s c nt h i t c h oc c ma c r ot i nx l v v n g i c a h . V i i n l i n e s , h mt h n hv i nc t h c h i uq u n h c c ma c r ot i nx l . C h c n n gn i t u y nc t h b l md n gt r o n g n hn g h a l p , t t n h i n . C c l pt r n hv i n c c md l m n h v yb i v n d d n gh n , v v yn s x yr a . T u yn h i n , n k h n gp h i l l nc a m t v n b i v s a u , k h i t mk i mg i mk c ht h c , b nc t h l u nl u nt h a y i c c c h c n n g k h n gi n l i n e s v i k h n g n hh n g nc h c n n gc a h . P h n gc h mp h t t r i np h i l " ut i nl mc h on l mv i c , s a u t i uh a n . "

B i t p
1. 2. 3. 4.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o n p h n h t www. B r u c e E c k e l . c o m.

5. 6. 7. 8. 9. 10. 11. 12. 13.

V i t m t c h n gt r n hs d n gF( ) v mt h h i n p h n uc a c h n gn yv c h n gmi n hr n gn k h n gm r n g n gc c h , n h c mt t r o n gv nb n . S a c h a c c v mv t h yr n gn h o t n gc h n hx c . V i t m t c h n gt r n hs d n gs n( ) v mt h h i n p h n uc a c h n gn y . C c i uk i nm n k h n gh o t n g n g . S a i Ma c r o S i d e E f f e c t s . c p p B A ND ( ) h o t n gt t . T oh a i c h c n n gg i n gh t n h a u , f 1 ( ) v f 2 ( ) . N i t u y nf 1 ( ) v l i f 2 ( ) l m t c h c n n gk h n gn i t u y n . S d n gc c t i uc h u nCc h c n n gt h v i n n gh ( ) c t mt h yt r o n g< c t i me > n h d u i mb t uv k t t h c i mv s os n hh a i c h c n n g x e mc i n ol n h a n hh n . B nc t h c np h i t h c h i nc u c g i l p i l pl i c c c h c n n gb nt r o n gv n gl pt h i g i a nc a b n c c c o ns h u c h . T h n g h i mv i c c k c ht h c v p h c t pc a m t r o n gc c c h c n n gt r o n gt p4 x e mn ub nc t h t mt h ym t i mh a v nm c c c h c n n gn i t u y nv c h c n n gn o n i n l i n e m t c n gm t l n g t h i g i a n . N ub nc s n , h yt h i un yv i c c t r n hb i nd c hk h c n h a uv l us k h c b i t . C h n gmi n hr n gc h c n n gn i t u y nm c n h l i nk t n i b . T om t l pc c h a m t m n gc a c h a r . T h m m t n h x yd n gn i t u y nc s d n gCc h u nt h v i n c h c n n gme ms e t ( ) k h i t om n g i s n h x yd n g( m c n hn y ' ' ) , v m t h mt h n hv i n n i t u y n c g i l p r i n t ( ) i nr a t t c c c k t t r o n gm n g . H yNe s t F r i e n d . c p pv d t C h n g5 v t h a yt h t t c c c c h c n n gt h n hv i nv i i n l i n e s . L mc h o h k h n g c h c c c h c n n gn i t u y n . C n gt h a y i k h i t o() c h c n n g x yd n g . S a i S t r i n g S t a c k . c p pt C h n g8 s d n gc h c n n gn i t u y n . T om t e n u mg i l Hu c m u , m ux a n h, v m uv n g. B yg i t om t l p c g i l m uc c h a m t t h n hv i nd l i uk i uHu v m t n h x yd n g a r a Hu t i s c a n . T h mc h c n n gt r u yc p " n h n " v " t h i t l p " c c Hu . L mc h ot t c c c c h c n n gi n l i n e s . S a i t p1 0 s d n g" t r u yx u t " v " t b i nd n " c c ht i pc n . S a i C p p t i me . c p p n ot h i g i a nt t h i i m c h n gt r n hb t uc h y nt h i i mk h i n g i d n gn h n" E n t e r " h o c " R e t u r n " k h a . T om t l ph c v i h a i h mt h n hv i nn i t u y n , n h v yl c h c n n g ut i n l n hn g h a t r o n g
163/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

14. 15.

16. 17. 18. 19. 20. 21. 22.

l pg i l c h c n n gt h h a i , m k h n gc nm t t k h a i c h u y nt i p . V i t c h n hm t or a m t i t n g c a l pv g i h m ut i n . T om t l pMt v i m t c o n s t r u c t o r m c n hn i t u y nt h n gb oc h n hn . B yg i t om t l pm i B v t m t i t n gc a mt n h m t t h n hv i nc a B, v c u n gc pc h oBm t n h x yd n gn i t u y n . T or a m t m n gc a B i t n gv x e mn h n gg s x yr a . T om t s l n gl nc c i t n gt c c t pt r c , v s d n gT h i g i a nl ph c t h i g i a ns k h c b i t g i a x yd n gk h n gn i t u y nv x yd n gn i t u y n . ( N ub nc m t h s , c n gc g n gs d n g . ) V i t m t c h n gt r n hm c m t c h u i n h l i s d n gl n h . V i t c h ov n gl o i b m t k t t c h u i v i n h a uv t q u a , v s d n gDE B U G( ) v mt c h n gn y i nc c c h u i m i l n . S a T R A C E( ) v mn h q u y n ht r o n gc h n gn y , v c h n gmi n hr n gn h o t n gc h n hx c . S a i c c l n hv c ( ) v m n c n gc h a m t s s . T or a m t l ph c m c c t h n hv i nb a og m c c c u c g i nc c l n hv c ( ) v m . T h m m t c h c n n gt h n hv i nc h op h pb nt mk i m m t l n hv c s d n gs c h s c a n . V i t c h n h( ) k i mt r a c c l ph c . S a i c c l n hv c ( ) v m n t n gt or a c c c h c n n gt r u yc pc h ot n gl n hv c ( c c d l i u v nc nl c n h n , t u yn h i n ) . T or a m t l ph c m c c t h n hv i nb a og mc c c u c g i nc c l n h v c ( ) v m . V i t c h n h( ) k i mt r a c c l ph c . V i t c h n gt r n hc h a i i s d n gl n h : ut i nl m t i n t v t h h a i l m t t nt pt i n . S d n g r e q u i r e . h mb or n gb nc s l pl u n , r n gi n t l t 5 n1 0 , v r n gt pt i nc t h t h n h c n g c m r a . V i t c h n gt r n hs d n gI F OP E N( ) v m m m t t pt i nn h m t d n g uv o . L uv i c t or a c c i f s t r e a m i t n gv p h mv i c a n . ( T h c ht h c ) X c n hl mt h n o b i nd c hc a b n t or a m l pr p . T or a m t t pt i nc c h a m t c h c n n gr t n h v c h n h( ) m c c c u c g i c h c n n g . T or a c c m l pr pk h i h m c i n l i n e dv k h n gs px pt h e oh n gv c h n gmi n hr n gp h i nb ni n l i n e dk h n gc c h c n n gg i t r nk h n g .

C++c h op h pb nr t n h i uk i ms o t i v i s s n gt ov k h n n gh i nt h t n , n i l ut r c h on h n gc i t n c t , v l i nk t c h oc c t n . C c t n ht k h a b q u t i t r o n gCt r c k h i m i n g i b i t n h n gg t h u t n g " q u t i " c n g h a l , v C++ b s u n gt h m m t n g h a . C c k h i n i mc b nv i t t c c c n gd n gc a t n hc v l " m t c i g g i v t r c a m n h " ( n h t n h i n ) , c h od c n g h a l m t v t r a l t r o n gb n h h o c k h n n gh i nt h t r o n g m t t pt i n . T r o n gc h n gn y , b ns h c c c ht n h i uk h i nl ut r v k h n n gh i nt h , v m t c c hc i t i n k i ms o t t r u yc pt h n gq u a t nC++' s k h n g g i a nt nt n hn n g . B nc n gs t mh i ul mt h n o s d n gc c c h c n n g c v i t v b i ns o nC .

C cy ut t n ht C
.1 2.

T r o n gc Cv C++t k h a t n hc h a i n g h a c b n , m t i c l t h n gb c v on g nc h nc a n h a u : c p h nb m t l nt i m t a c h c n h , c n g h a l , c c i t n g c t or a t r o n gm t c b i t k h u v c d l i ut n h h nl t r ns t a c km i m t c h c n n g c g i . yl k h i n i mc a l ut r t n h . a p h n g m t nv d c h c b i t ( v a p h n g nm t p h mv i l pt r o n gC++ , n h b ns t h ys a u n y ) . y , t n hk i ms o t t mn h nc a m t t n , v v yt nc t h k h n g c n h nt h yb nn g o i c c nv d c hh o c l ph c . i u n yc n gmt c c k h i n i mv l i nk t , m q u y t n hn h n gg t nc c m i l i nk t s t h y .

P h nn ys x e mx t c c n g h a t r nc a t n hn h h c t h a h n gt C .

b i nt n ht r o n gc h cn n g

K h i b nt om t b i nc c b b nt r o n gm t h m, t r n hb i nd c hp h nb l ut r c h ob i nm i k h i h m c g i l b n gc c hd i c h u y nc o nt r n g nx px u n gm t l n gt h c hh p . N uc m t k h i t oc h ob i n , k h i t o c t h c h i nm i k h i i mt r n ht c t h n gq u a .
164/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

i k h i , t u yn h i n , b nmu ng i l i m t g i t r g i a c c c u c g i c h c n n g . B nc t h t h c h i n i un yb n g c c hl mc h om t b i nt o nc u , n h n gs a u b i n s k h n g c d i s k i ms o t d u yn h t c a c h c n n g . Cv C++c h op h pb nt or a m t t n h i t n gb nt r o n gm t h m, l ut r c h o i t n gn yk h n gp h i l t r ns t a c kn h n gt h a yv t r o n gk h uv c d l i ut n hc a c h n gt r n h . i t n gn y c k h i t oc h m t l n , l n ut i nc h c n n g c g i l , v s a u g i l i g i t r c a n g i a c c v i nd nc h c n n g . V d , c c c h c n n g s a u yt r v k t t i pt h e ot r o n gm n gm i k h i h m c g i l :
// :C 1 0 :S t a t i c V a r i a b l e s I n f u n c t i o n s . c p p #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d" /r e q u i r e . h . . " ; c h a ro n e C h a r( c o n s tc h a r*c h a r A r r a y=0 ){ t n hc o n s tc h a r*s ; n u ( c h a r A r r a y ){ s=c h a r A r r a y ; t r l i*s ; } k h c y uc u( s ," c h ak h it os " ) ; n u( *s= =' \0 ' ) t r v 0 ; t r l i*s++ ; } c h a r*a=" A B C D E F G H I J K L M N O P Q R S T U V W X Y Z " ; i n tm a i n( ){ //O n e C h a r( ) ;//y uc u( )k h n g o n e C h a r( a ) ;//K h is m t c h a rc ; t r o n gk h i( ( c=o n e C h a r( ) )=0 ) c o u t< <c< <e n d l ; }/// :~

C c t n hc h a r * s g i g i t r c a n g i a c c c u c g i c a o n e C h a r ( ) v l ut r c a n k h n gp h i l m t p h nc a k h u n gn g nx pc a c h c n n g , n h n gl t r o n gl n hv c l ut r t n hc a c h n gt r n h . K h i b ng i o n e C h a r ( ) v i m t * c h a r i s , s c g nc h ot h a ms , v k t ut i nc a m n g c t r v . M i c u c g i t i pt h e o o n e C h a r ( ) m k h n g c nm t i s s nx u t g i t r m c n hk h n gc h oc h a r A r r a y, m c h r a c c c h c n n gm b nv ng i i n nc c n h nv t t c c g i t r k h i t ot r c c a s . C h c n n gs t i pt c s nx u t c c n h nv t c h o nk h i n t nt e r mi n a t o r v g i t r c a m n gk t , l c n yn d n gi n c r e me n t i n gc o nt r n k h n gb t n p h v oc u i m n g . Nh n gn h n gg s x yr an ub ng i o n e C h a r ( ) k h n gc i s v k h n gc t r c k h i t og i t r c as ? T r o n g n hn g h a c h os , b nc t h c u n gc pm t k h i t o , t n hc h a r*s=0 ; n h n gn ub nk h n gc u n gc pm t k h i t oc h om t b i nt n hc a m t b u i l t i nl o i , t r n hb i nd c h mb or n g b i ns c k h i t ob n gk h n g( c h u y n i t h n hk i ut h c hh p ) k h i k h i n gc h n gt r n h . V v y , t r o n g o n e C h a r ( ) , l n ut i nc h c n n g c g i l , s l s k h n g . T r o n gt r n gh pn y , n u( s ) c i uk i ns b t n . V i c k h i t o t r n s l r t ng i n , n h n gk h i t oc h oc c i t n gt n h( g i n gn h t t c c c i t n g k h c ) c t h c b i ut h c t yl i nq u a n nh n gs v c c b i nk h a i b ot r c v c h c n n g . B nn nb i t r n gc c c h c n n gt r nl r t d b t nt h n gv i c c v n x l a l u n g , b t c k h i n ob nt h i t k c c c h c n n gc c h a c c b i nt n hb nn ng i c h oc c v n a l u n gt r o n gt mt r . i t n gl pt n ht r o n gc h cn n g C c q u yt c l n h n h a uc h oc c i t n gt n hc a c c l o i n g i d n gx c n h , b a og mc t h c t l m t s k h i t ol c nt h i t c h oc c i t n g . T u yn h i n , g i a oc h ok h n gc h c n g h a i v i c c l o i t c hh p , l o i n g i d n g n hn g h a p h i c k h i t ov i c c c u c g i x yd n g . V v y , n ub nk h n gc h n h i s n h x y d n gk h i b nx c n hc c i t n gt n h , l pp h i c m t c o n s t r u c t o r m c n h . V d ,
// :C 1 0 :S t a t i c O b j e c t s I n F u n c t i o n s . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; c l a s sX{ i n ti ;c n gc n g : X( i n ti i=0 ) :i( i i ){ }//M c n h ~X( ){ c o u t< <" X: :~X( ) "< <e n d l ; } } ; v o i df( ){ t n hXx 1( 4 7 ) ; t n hXx 2 ;//M c n hx yd n gc nt h i t } i n tm a i n( ){ f( ) ; }/// :~

C c i t n gt n hc a l o i Xt r o n gf ( ) c t h c k h i t oh o c v i d a n hs c h i s n h x yd n gh o c v i c c n h x yd n gm c n h . X yd n g i un yx yr a s k i ms o t l n ut i n i q u a n hn g h a , v c h c l n u t i n . H mh y i t n gt n h H mh y i v i c c i t n gt n h( c n g h a l , t t c c c i t n gv i l ut r t n h , k h n gc h a p h n gc c i t n gt n hn h t r o n gv d t r n ) c g i l k h i c h n h( ) t h o t h o c k h i Ct i uc h u nt h v i nc h c n n ge x i t ( ) c g i m t c c hr r n g . T r o n gh uh t c c t r n g , ma i n( ) c h c ng i e x i t ( ) k h i n c h md t . i un yc n g h a r n gn c t h g yn g u yh i mc h og i e x i t ( ) b nt r o n gm t h mh yv b nc t h k t t h c v i q u yv h n . H mh y i t n gt n h c k h n g g i n ub nt h o t k h i c h n gt r n hb n gc c hs d n gCt i uc h u nt h v i nc h c n n gh yb ( ) .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 165/320

08/10/2013

Suy ngh trong C + +, Vol 1

B nc t h c h n hc c h n h n gd i nr a k h i r i k h i c h n h( ) ( h o c g i e x i t ( ) ) b n gc c hs d n gc c t i uc h u n t h v i nCc h c n n ga t e x i t ( ) . T r o n gt r n gh pn y , c c c h c n n g n gk a t e x i t ( ) c t h c g i t r c k h i c c h mh y i v i b t k i t n g c x yd n gt r c k h i r i k h i c h n h( ) ( h o c g i e x i t ( ) ) . Nh p h h yb n ht h n g , p h h yc c i t n gt n hx yr a t h e ot h t n g c l i k h i t o . T u yn h i n , c h c c c i t n g c x yd n gb p h h y . Ma ym nt h a y , C++ , c n gc p h t t r i nt h e od i k h i t ov c c i t n g c x yd n g . i t n gt o nc ul u n c x yd n gt r c k h i c h n h( ) c n h pv p h h yn h c h n h( ) t h o t r a , n h n gn um t h mc h a m t i t n gt n h a p h n gl k h n gb a og i c g i l , c c n h x yd n gc h o i t n g l k h n gb a og i t h c h i n , d o h yc n gk h n g c t h c h i n . V d ,
// :C 1 0 :S t a t i c D e s t r u c t o r s . c p p //H y it n gt n h#b a og m< f s t r e a m >s d n gt nm i nk h n gg i a nt i uc h u n ; o f s t r e a mr a( " s t a t d e s t . o u t " ) ;t pt i n//v t l pO b j{ c h a rc ;c n g//I d e n t i f i e r : O b j( c h a rc c ) :c( c c ){ r a< <" o b j: :o b j( )c h o "< <c< <e n d l ; } ~o b j( ){ r a< <" o b j: :~o b j( )c h o "< <c< <e n d l ; } } ; O b jm t( ' a ' ) ;//t o nc u( l ut r t n h ) //C o n s t r u c t o rv d e s t r u c t o rl u nl u n cg il v o i df( ){ t n ho b jb( ' b ' ) ; } k h o n gt r n gg( ){ t n ho b jc( ' c ' ) ; } i n tm a i n( ){ r a< <" b nt r o n gc h n h( ) "< <e n d l ; f( ) ;//c u cg i c o n s t r u c t o rt n hc h ob //G( )k h n g cg i r a< <" l ic h n h( ) "< <e n d l ; }/// :~

T r o n go b j , c c c h a r c n gv a i t r n h m t n hd a n h c c n h x yd n gv h mh yc t h i nr a t h n gt i nv i t n gh a n gl mv i ct r n . C c o b j mt l m t i t n gt o nc u , v v yc c n h x yd n gl u nl u n c g i c h on t r c k h i c h n h( ) c n h pv o , n h n gc c n h t h uc h oc c o b j bt n ht r o n gf ( ) v o b j t n hc t r o n gg( ) c g i l c h k h i c c c h c n n g c g i l . c h n gmi n h d n gv h mh y c g i l , c h c f ( ) c g i . ur a c a c h n gt r n hl
O b j: :o b j( )c h om to b jt r o n gm a i n( ): :o b j( )c h ob l i c h n h( )o b j: :~o b j( )c h ob O b j: :~o b j( )c h om t

C c n h x yd n gc h omt c g i l t r c k h i c h n h( ) c n h pv o , v c c n h x yd n gc h ob c g i l c h v f ( ) c g i . K h i c h n h( ) l i r a , c c h mh y i v i c c i t n g c x yd n g c g i t h e ot h t n g c c a x yd n g . i un yc n g h a r n gn ug( ) c g i l , t h t m c c h mh yc h obv c c g i l p h t h u c v ov i c f ( ) h o c g( ) c g i l ut i n . Nh nt h yr n gc c t pt i nd uv t o f s t r e a m i t n gr a c n gl m t i t n gt n hk t k h i n c n h n g h a b nn g o i c a t t c c c c h c n n g , n s n gt r o n gc c k h uv c l ut r t n h . i uq u a nt r n gl n hn g h a c a n ( n h t r i n g c v i m t e x t e r nk h a i ) x u t h i n uc a t pt i n , t r c k h i c b t k k h n n gs d n gr a . N uk h n g , b ns c s d n gm t i t n gt r c k h i n c k h i n g . T r o n gC++ , c c n h x yd n gc h om t i t n gt n ht o nc u c g i l t r c k h i ma i n( ) c n h pv o , v v yb yg i b nc m t c c h ng i nv d i n g t h c t h i m t r c k h i v oma i n( ) v t h c t h i m v i h y s a uk h i t h o t k h i c h n h( ) . T r o n gC , i un yl u nl u nl m t t h n g h i m m i h i b np h i n h t ng c x u n gq u a n ht r o n ga s s e mb l y l a n g u a g e m k h i n gc c n h c u n gc pt r n hb i nd c hc a .

K i m s o tl i nk t
T h n gt h n g , b t k t nn o p h mv i t p t i n( c n g h a l , k h n gl n gv ob nt r o n gm t l ph c h o c c h c n n g ) c t h n h nt h yt r o n gt t c c c nv d c ht r o n gm t c h n gt r n h . i un yt h n g c g i l l i nk t b n n g o i b i v t i t h i g i a nl i nk t t nc a n l c t h n h nt h ym i l i nk t k h pm i n i , b nn g o i m nv d c ht h u t . B i nt o nc uv c h c n n gb n ht h n gc m i l i nh b nn g o i . C l nk h i b nmu nh nc h t mn h nc a m t t n . B nc t h mu nc m t b i n p h mv i t pt i n t t c c c c h c n n gt r o n gt pt i n c t h s d n gn , n h n gb nk h n gmu nc c c h c n n gb nn g o i t pt i n x e m h o c t r u yc pb i n , h o c v t n hg yr a v n g v i t n n hd a n hb nn g o i t pt i n . M t i t n gh o c t nc h c n n g p h mv i t pt i n c k h a i b or r n gt n hl a p h n g nv d c ht h u t c a m n h( t r o n gc c i uk h o nc a c u ns c hn y , c p pt pt i nm t u y nb x yr a ) . M c t nn i b
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 166/320

08/10/2013

Suy ngh trong C + +, Vol 1

l i nk t . i un yc n g h a l b nc t h s d n gc n gm t t nt r o n gk h c nv d c hm k h n gc m t c u c n g t n . M t l i t h l i nk t n i b l t nc t h c t t r o n gm t t pt i nt i u m k h n gl ol n gr n gs c m t c u c n g t h i g i a nl i nk t . T nt h n g c t t r o n gt pt i nt i u , c h n gh nn h c o n s t n hn g h a v n i t u y nc h c n n g , m c n h l i nk t n i b . ( T u yn h i n , c o n s t m c n hl l i nk t n i b t r o n gC++ , t r o n gC n m c n hl l i nk t b nn g o i . ) L ur n gl i nk t c h c p nc c p h nt c a c h t i l i nk t /t i t h i g i a n , d o , k h a i b ol pv c c b i n a p h n gk h n gc m i l i nk t . Nh ml n D i yl m t v d v c c hh a i n g h a c a t n hc t h v t q u a n h a u . T t c c c i t n gt o nc un g mc l pl ut r t n h , v v yn ub nn i ( p h mv i t pt i n ) ,
i n ta=0 ;

s a u l ut r c h omt s c t r o n gk h uv c d l i ut n hc ac h n gt r n h , v k h i t oc h omt s x yr am t l n , t r c k h i c h n h( ) c n h pv o . Ng o i r a , k h n n gh i nt h c a mt l t o nc ut r nt t c c c nv d c h . V t m n h n , t r i n g c v i t n h( c h h i nt h t r o n g nv n yd c h ) l e x t e r n, t r o n g n i r r n gk h n n gh i nt h c a t n l t r nt t c c c nv d c h . V v y , n hn g h a t r nl t n g n gv i n i e x t e r ni n ta=0 ; Nh n gn ub nn i t h a yv o , t n hi n ta=0 ; t t c c c b n l ml t h a y i h i nt h , v v ymt c m i l i nk t n i b . L pl ut r l k h n gt h a y i i t n gc t r t r o n gk h uv c d l i ut n hc k h n n gh i nt h l t n hh o c e x t e r n. M t k h i b nn h n c v oc c b i n a p h n g , t n hd n gl mt h a y i k h n n gh i nt h v t h a yv o l m t h a y i l pl ut r . N ub nk h a i b on h n gg d n gn h l m t b i n a p h n gn h e x t e r n, n c n g h a l l ut r t nt i n i k h c ( b i nt h c s t r nt o nc uv i c h c n n g ) . V d :


// :C 1 0 :L o c a l E x t e r n . c p p //{ L }L o c a l E x t e r n 2 #I n c l u d e i n tm a i n( ){ e x t e r ni n ti ; }/// :~

s t d: :c o u t< <i ;

// :C 1 0 :L o c a l E x t e r n 2 . c p p{ O }i n ti=5 ;/// :~

V i t nc h c n n g( c h oc c c h c n n gk h n gt h n hv i n ) , t n hv e x t e r nc h c t h l mt h a y i t mn h n , v v y n ub nn i e x t e r nv o i df( ) ; n c n gg i n gn h v i c k k h a i k h n gt r a n gt r v o i df( ) ; v n ub nn i , v o i df( ) ; n c n g h a l f ( ) l c h h i nt h t r o n g nv n yd c h i un y i k h i c g i l t p t i nt n h .

K h cl ut r l ps p e c i f i e r s

B ns t h yt n hv e x t e r ns d n gp h b i n . C h a i s p e c i f i e r s l pl ut r k h c x yr a t t h n gx u y nh n . C c t c t g nn h k h n gb a og i s d n gv n c h ot r n hb i nd c hr n g yl m t b i n a p h n g . t n gl v i t t t c a " t n g " v n c p nc c ht r n hb i nd c ht n gp h nb l ut r c h oc c b i n . T r n hb i nd c h l u nl u nc t h x c n ht h c t n yt b i c n ht r o n g c c b i n c n hn g h a , v v yt n gl k h n gc n t h i t . M t n gk b i nl m t a p h n g( t n gt h a y i ) , c n gv i m t g i c h ot r n hb i nd c hm b i n c b i t n ys c s d n gn h i un nt r n hb i nd c hn ng i n t r o n gm t n gk n uc t h . D o , n l m t s t r g i pt i uh a . T r n hb i nd c hk h c n h a up h n n gk h c n h a u g i n y , h c t yc h n b q u a n . N u b nl y a c h c a b i n , n gk s p e c i f i e r s g nn h c h c c h nb b q u a . B nn nt r n hs d n g n gk v t r n h b i nd c ht h n gc t h l m m t c n gv i c t t h nv t i uh a h nb n .

K h n gg i a nt n
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 167/320

08/10/2013

Suy ngh trong C + +, Vol 1

M c d c i t nc t h c l n gv ob nt r o n gc c l ph c , t nc a c c c h c n n gt o nc u , b i nt o nc u , v c c l ph c v nc n a n g t r o n gm t k h n gg i a nd u yn h t t nt o nc u . C c t n ht k h a c u n gc pc h ob nm t s k i ms o t n yb n gc c hc h op h pb n c u n gc pc h oc c b i nv c h c n n gl i nk t n i b ( c n g h a l , l m c h oh n pt n h ) . Nh n gt r o n gm t d nl n , t h i uk i ms o t k h n gg i a nt nt o nc uc t h g yr a v n . g i i q u y t n h n gv n n yc h oc c l ph c , c c n h c u n gc pt h n gx u y nt or a c c t np h c t pl uk h n gc k h n n gx u n g t , n h n gs a u b n a n gm c k t g n h n gc i t n . ( M t t y p e d e f t h n g c s d n g n g i nh a n y . ) Nk h n gp h i l m t g i i p h pt h a n hl c hn g nn g c h t r . B nc t h c h i a n h c c k h n gg i a nt nt o nc uv op h nq u nl h nb n gc c hs d n gk h n g g i a nt nt n hn n g c a C++ . C c k h n gg i a nt nt k h a , t n gt n h l ph c , c ut r c , e n u m, v c n g o n, t t nc a c c t h n hv i nt r o n gm t k h n gg i a nr i n gb i t . T r o n gk h i c c t k h a k h c c m c c hb s u n g , v i c t or a m t k h n gg i a nt nm i l m c c hd u yn h t c h ok h n gg i a nt n.

T or a m tk h n gg i a nt n
V i c t or a m t k h n gg i a nt nl n gc h t n gt n h v i c t or a m t l p:
// :C 1 0 :M y L i b . c p pk h n gg i a nt nm y l i b{ } i n tm a i n( ){ }/// :~ //K h a ib o

i un yt or a m t k h n gg i a nt nm i c c h a c c t k h a i k mt h e o . C s k h c b i t n gk s ov i l ph c , c ut r c , c n g o nv e n u m, t u yn h i n : M t n hn g h a k h n gg i a nt nc t h c h x u t h i n p h mv i t o nc u , h o c l n gn h a ut r o n gk h n gg i a n t nk h c . K h n gc d uc h mp h yc h md t l c nt h i t s a uk h i c c d un g o c n gc a m t n hn g h a k h n gg i a n t n . M t n hn g h a k h n gg i a nt nc t h c " t i p " t r nn h i ut pt i nt i u s d n gc p h p , c h om t l p h c , s x u t h i nn h m t n hn g h a l i :

// :C 1 0 :H e a d e r 1 . h #I f n d e fH E A D E R 1 _ H#x c n hk h n gg i a nt nH E A D E R 1 _ Hm y l i b { e x t e r ni n tx ; v o i df( ) ; //. . . } #E n d i f//H E A D E R 1 _ H/// :~ // :C 1 0 :H e a d e r 2 . h #I f n d e fH E A D E R 2 _ H #X c n hH E A D E R 2 _ H #B a og m" H e a d e r 1 . h "//T h mn h i uc it nn a m y l i bk h n gg i a nt nm y l i b{ // k h n gm t n hn g h al i ! e x t e r ni n ty ; t r n gg( ) ; //. . . } #E n d i f//H E A D E R 2 _ H/// :~ // :C 1 0 :C o n t i n u a t i o n . c p p#b a og m" H e a d e r 2 . h "i n tm a i n( ){ }// / :~

M t t nk h n gg i a nt nc t h c t b d a n h c h ot nk h c , v v yb nk h n gc np h i g m t t nk h s d n g c t or a b i m t n h c u n gc pt h v i n :

// :C 1 0 :B o b s S u p e r D u p e r L i b r a r y . c p pk h n gg i a nt nB o b s S u p e r D u p e r L i b r a r y{ l p W i d g e t{ /*. . .*/ } ; l pP o p p i t{ /*. . .*/ } ; //. . . } //Q u n h i u g !T is b d a n hn :k h n gg i a nt nB o b=B o b s S u p e r D u p e r L i b r a r y i n tm a i n( ){ }/// :~

B nk h n gt h t or a m t t h h i nc a m t k h n gg i a nt nn h b nc t h v i m t l ph c .

K h n gg i a nt nv d a n h M i nv d c ht h u t c m t k h n gg i a nt nv d a n hm b nc t h t h mv ob n gc c hn i " k h n gg i a nt n " m k h n gc m t n hd a n h :
// :C 1 0 :U n n a m e d N a m e s p a c e s . c p pk h n gg i a nt n{ l pA r m { /*. . .* / } ; l pc h n { /*. . .*/ } ; l pt r n g{ /*. . .*/ } ; l p R o b o t{ t a yA r m[ 4 ] ; C h nc h n[ 1 6 ] ; T r n g u[ 3 ] ; //. . . }
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 168/320

08/10/2013

Suy ngh trong C + +, Vol 1

X a n t h a n ; i n ti ,j ,k ; }I n tm a i n( ){ }/// :~

T nt r o n gk h n gg i a nn yl t n gc s nt r o n g nv d c hm k h n gc t r n h c h u y nm n . N c m b or n gm t k h n gg i a nv d a n hl d u yn h t c h om i nv d c ht h u t . N ub n t t n a p h n gt r o n gm t k h n gg i a nv d a n h , b nk h n gc np h i c u n gc pc h oh l i nk t n i b b n gc c hl mc h oh t n h. C++ c t nt h n hv i c s d n gc c t pt i nt n hc l i c h ok h n gg i a nt nv d a n h . B nb B nc t h t i mm t n g i b nk h a i v om t k h n gg i a nt nb n gc c ht u y nb n t r o n gm t l ph c k mt h e o :
l ph {

// :C 1 0 :F r i e n d I n j e c t i o n . c p pt nm i nk h n gg i a nn h { //. . . b nk h o n gt r n gb n( ) ; } ; } i n tm a i n( ){ }/// :~

B yg i c c c h c n n gb n( ) l m t t h n hv i nc a k h n gg i a nt nn h . N ub ng i i t h i um t n g i t r o n gm t l pt r o n gk h n gg i a nt nt o nc u , n g i b n c t i mt r nt o nc u .

S d n g m tk h n gg i a nt n
B nc t h t h a mk h om t t nt r o n gm t k h n gg i a nt nt r o n gb a c c h : b n gc c hx c n ht ns d n gt o nt p h ng i i p h mv i , v i m t s d n gc h g i i t h i ut t c c c t nt r o n gk h n gg i a nt n , h o c v i m t s d n g k h a i b o g i i t h i ut nc n gm t l c . p h ng i i p h mv i B t k t nt r o n gm t k h n gg i a nt nc t h c x c n hm t c c hr r n gb n gc c hs d n g p h ng i i p h m v i i uh n ht r o n gc n gm t c c hm b nc t h t h a mk h oc c t nt r o n gm t l p :
// :C 1 0 :S c o p e R e s o l u t i o n . c p pk h n gg i a nt nX{ l pY{ s t a t i ci n ti ; c n gc n g : v o i df( ) ; } ; l pZ ; v o i d f u n c( ) ; }I n tX: :Y: :i=9 ;l pX: :Z{ i n tu ,v ,w ,c n g c n g : Z( i n ti ) ; i n tg( ) ; } ; X: :Z: :Z( i n ti ){ u=v=w=i ; }i n tX: :Z: :g( ){ r e t u r nu=v=w=0 ; } v o i dX: :f u n c( ){ X: :Zm t( 1 ) ; a g( ) ; }i n tm a i n( ){ }/// :~

C h r n g n hn g h a X: : Y: : t i c t h d d n g c c p nm t t h n hv i nd l i uc a m t l pYl n gn h a u t r o n gm t l ph c Xt h a yv m t k h n gg i a nt nX. C h o nn a y , k h n gg i a nt nt r n gr t g i n gc c l ph c . B n gc c hs d n gc h t h B i v n c t h n h a n hc h n gc c t n h t n h p i uk i nc h om t n hd a n ht r o n gm t k h n gg i a nt n , c c s d n gt k h a c h op h pb nn h pt o nb m t k h n gg i a nc n gm t l c . K h i s d n gk t h pv i c c k h n gg i a nt nt k h a n y c g i l m t c h t h s d n g . C c s d n gc h l mc h ot nx u t h i nn h t h h t h u c v p h mv i k h n gg i a nt nk mt h e og nn h t , v v yb nc t h t h o i m i s d n gc c t nk h n g t i u c h u n . X e mx t m t k h n gg i a nt n ng i n :
// :C 1 0 :N a m e s p a c e I n t . h #I f n d e fN A M E S P A C E I N T _ H#x c n hk h n gg i a nt nN A M E S P A C E I N T _ HI n t{ e n u m { d uh i ut c hc c ,t i uc c } ; l pI n t e g e r{ i n ti ; d uh i us ; c n gc n g : S n g u y n( i n ti i=0 ) :i( i i ) , s( i >=0t c hc c :t i u c c ) { } d uh i ug e t S i g n( )c o n s t{ r e t u r ns ; } t r n gs e t S i g n( d us g n ){ s =s g n ; } //. . . } ; } #E n d i f//N A M E S P A C E I N T _ H/// :~

M t s d n gs d n gc h l ma n gl i t t c c c t nt r o n gI n t v ok h n gg i a nt nk h c , l i n h n gc i t nl n g n h a ut r o n gk h n gg i a nt n :
// :C 1 0 :N a m e s p a c e M a t h . h #I f n d e fN A M E S P A C E M A T H _ H #X c n hN A M E S P A C E M A T H _ H#b a og m" N a m e s p a c e I n t . h "k h n gg i a nt n
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 169/320

08/10/2013

Suy ngh trong C + +, Vol 1

T o n{ s d n gt nm i nk h n gg i a nI n t ; S n g u y na ,b ; P h nc h i as n g u y n( I n t e g e r ,I n t e g e r ) ; } #E n d i f//N A M E S P A C E M A T H _ H/// :~

//. . .

B nc n gc t h t u y nb t t c c c t nt r o n gI n t b nt r o n gm t h m, n h n g l i n h n gt nl n gn h a ut r o n gc c c h c n n g :
// :C 1 0 :A r i t h m e t i c . c p p#b a og m" N a m e s p a c e I n t . h "v o i ds h c( ){ u s i n gn a m e s p a c eI n t ; S n g u y nx ; x . s e t S i g n( t c hc c ) ; }i n tm a i n( ){ }/// :~

M k h n gs d n gc h t h , t t c c c t nt r o n gk h n gg i a nt ns c np h i c i uk i n y . M t k h a c n hc a s d n gc h c t h c v h i k h c t h n gl c ut i n . T mn h nc a t n c g i i t h i uv i m t s d n gc h t h l p h mv i m c c c h t h c t h c h i n . Nh n gb nc t h g h i l nc c t nt s d n gc h t h , n un h h t u y nb t r nt o nc uv i p h mv i !
// :C 1 0 :N a m e s p a c e O v e r r i d i n g 1 . c p p #B a og m" N a m e s p a c e M a t h . h " i n tm a i n( ){ s d n gk h n gg i a nt nT o n ; : :a ; a . s e t S i g n( t i uc c ) ; //B yg i p h ng i ip h mv ic nt h i t T o nh c: :a . s e t S i g n( t c hc c ) ; }/// :~

I n t e g e ra ;//D aT o n

//c h nT o n: :a :

G i s b nc m t k h n gg i a nt nt h h a i c c h a m t s t nt r o n gt o nh c k h n gg i a nt n:
// :C 1 0 :N a m e s p a c e O v e r r i d i n g 2 . h #I f n d e fN A M E S P A C E O V E R R I D I N G 2 _ H #X c n hN A M E S P A C E O V E R R I D I N G 2 _ H#b a og m" N a m e s p a c e I n t . h "k h n gg i a n t n{ T n ht o n s d n gt nm i nk h n gg i a nI n t ; P h nc h i as n g u y n( I n t e g e r ,I n t e g e r ) ; //. . . } #E n d i f//N A M E S P A C E O V E R R I D I N G 2 _ H/// :~

T k h n gg i a nt nn yc n g c g i i t h i uv i m t s d n gc h t h , b nc k h n n gc a m t v v a c h m. T u y n h i n , s m h x u t h i nt i t h i i ms d n g c a t n , k h n g s d n gc h t h :
// :C 1 0 :O v e r r i d i n g A m b i g u i t y . c p p #B a og m" N a m e s p a c e M a t h . h "#b a og m" N a m e s p a c e O v e r r i d i n g 2 . h "v o i ds( ){ s d n gk h n gg i a nt nT o n , s d n gt nm i nk h n gg i a nt n ht o n ; //M it h uo kc h o nk h i : // !c h i a( 1 ,2 ) ;//s m h }I n tm a i n( ){ }/// :~

D o , n c t h v i t s d n gc h g i i t h i um t s k h n gg i a nt nv i t nm ut h u nm k h n gb a og i s n x u t m t s m h . V i ck k h a i s d n g B nc t h t i mt nc n gm t l c v op h mv i h i nt i v i m t t u y nb s d n g . K h n gg i n gn h s d n gc h t h , m i x v i t nn h l c t u y nb t r nt o nc uv i p h mv i , m t s d n gk h a i b ol m t t u y nb t r o n gp h mv i h i nt i . i un yc n g h a n c t h g h i l nt nt m t s d n gc h t h :
// :C 1 0 :U s i n g D e c l a r a t i o n . h #I f n d e fU S I N G D E C L A R A T I O N _ H#x c n hU S I N G D E C L A R A T I O N _ Hk h n gg i a n t nU{ i n l i n ev o i df( ){ } i n l i n ev o i dg( ){ } }K h n gg i a nt nV{ i n l i n ev o i df( ){ } i n l i n ev o i dg( ) { } } #E n d i f//U S I N G D E C L A R A T I O N _ H/// :~ // :C 1 0 :U s i n g D e c l a r a t i o n 1 . c p p#b a og m" U s i n g D e c l a r a t i o n . h "v o i dh( ) { u s i n gn a m e s p a c eU ;//S d n gc h s d n gV: :f ;//S d n gk h a i f( ) ;/ /c u cg iV: :f() ; U: :f( ) ;//P h ih o nt o n i uk i n g i }
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 170/320

08/10/2013

Suy ngh trong C + +, Vol 1

i n tm a i n( ){ }/// :~

C c s d n gk h a i c h c u n gc pt n y q u y n hc a b n h nd i n , n h n gk h n gc l o i t h n gt i n . i un yc n g h a r n gn uk h n gg i a nt nc c h a m t t ph pc c c h c n n gq u t i v i c n gt n , s d n gk h a i t u y nb t t c c c c h c n n gt r o n gt pq u t i . B nc t h t m t s d n gk h a i b ob t c n i n om t t u y nb b n ht h n gc t h x yr a . M t s d n gk h a i h o t n gn h m t t u y nb b n ht h n gt r o n gt t c c c c c hn h n gm t : b i v b nk h n g a r a m t d a n hs c h i s , n c t h c h om t s d n gk h a i g yr a s q u t i c a m t c h c n n gv i c c l o i l pl u nt n gt ( m k h n g c p h pv i b n ht h n gq u t i ) . S m h n y , t u yn h i n , k h n gh i nt h c h o nk h i t h i i ms d n g , c h k h n gp h i l i mk k h a i . M t s d n gt u y nb c n gc t h x u t h i nt r o n gm t k h n gg i a nt n , v n c t c d n gt n gt n h b t c n i n ok h c c t n c k h a i b ot r o n gk h n gg i a n :
// :C 1 0 :U s i n g D e c l a r a t i o n 2 . c p p#b a og m" U s i n g D e c l a r a t i o n . h "k h n g g i a nt nQ{ s d n gU: :f ; s d n gV: :g ; //. . .}V o i dm ( ){ s d n gk h n gg i a nt nQ , f( ) ;//c u cg iU: :f( ) ; g ( ) ;//c u cg iV: :g( ) ; } i n tm a i n( ){ }/// :~

M t s d n gk h a i b ol m t b d a n h , v n c h op h pb nk h a i b oc c c h c n n gt n gt t r o n gk h n gg i a nt n r i n gb i t . N ub nk t t h c l i t u y nb c n gc h c n n gb n gc c hn h pk h n gg i a nt nk h c n h a u , l OKs k h n gc b t k s m h h o c t r n gl p .

V i cs d n gc ck h n gg i a nt n

M t s c c q u yt c t r nc t h c v m t c h t k h k h nl c u , c b i t l n ub nc nt n gr n gb ns s d n gt t c t h i g i a n . Nh nc h u n g , t u yn h i n , b nc t h n h n c n g a yv i c c hs d n gr t ng i nc a k h n g g i a nt nn h mi nl b nh i uc c hh l mv i c . i uq u a nt r n gc nn h l k h i b ng i i t h i um t t o nc us d n gc h t h ( t h n gq u a m t " s d n gt nmi nk h n gg i a n" b nn g o i c a b t k p h mv i ) b n m t o a n g k h n gg i a nt nc h ot pt i n . i un yt h n gl t t c h om t t pt i nt h c t h i ( m t " c p p" t pt i n ) v s d n gc h t h l c h c h i ul c c h o nk h i k t t h c v i c b i ns o nt pt i n . Ng h a l , n k h n g n hh n g nb t k t p t i nk h c , v v yb nc t h i uc h n hs k i ms o t c a c c k h n gg i a nt nm t t pt i nt h c h i nt i m t t h i i m. V d , n ub np h t h i nr a m t c u c n g t nv q u n h i us d n gc h t r o n gm t t pt i nt h c h i nc t h , l m t v n ng i n t h a y i t pt i n n s d n gt r n h r r n gh o c s d n gt k h a i l o i b c c c u c n g , m k h n gc nt h a y i c c f i l e t h c t h i k h c . T pt i nt i u l m t v n k h c n h a u . B nh un h k h n gb a og i mu ng i i t h i um t t o nc us d n gc h t h v om t t pt i nt i u , b i v i u c n g h a r n gb t k t pt i nk h c m b a og mt i u c a b nc n gs c t nmi nk h n gg i a nm t o a n gr a ( v c c t pt i nt i u c t h b a og mc c t pt i nt i u k h c ) . V v y , t r o n gt pt i nt i u b nc n ns d n gt r n h c h u y nm nr r n gh o c s c o p e ds d n gc h t h , s d n gt k h a i . yl t h c t r n gb ns t mt h yt r o n gc u ns c hn y , v b n gc c hl mt h e on , b ns k h n g " g yn h i m" k h n gg i a nt nt o nc uv n m m n ht r l i v ot h g i i t r c k h n gg i a nt nc a C++ .

C ct h n hv i nt n ht r o n gC+ +

C n h n gl c b nc nm t k h n gg i a nl ut r d u yn h t c s d n gb i t t c c c i t n gc a m t l p . T r o n g C , b ns s d n gm t b i nt o nc u , n h n g i un yk h n gp h i l r t a nt o n . D l i ut o nc uc t h c s a i b i b t c a i , v t nc a n c t h x u n g t v i t ng i n gh t n h a ut r o n gm t d nl n . Ns l l t n gn u c c d l i uc t h c l ut r n h t h n l t o nc u , n h n g c nb nt r o n gm t l p , v l i nk t r r n gv i l p . i un y c t h c h i nv i t n hd l i ut h n hv i nt r o n gm t l ph c . C m t m n hd u yn h t c a l ut r c h o m t t n ht h n hv i nd l i u , b t k b a on h i u i t n gc a l pm b nt or a . T t c c c i t n gc h i a s c n g t n hk h n gg i a nl ut r c h or n gt h n hv i nd l i u , d o , n l m t c c h h " g i a ot i p " v i n h a u . Nh n gc c t n hd l i ut h u c v l p , t nc a n l s c o p e db nt r o n gl pv n c t h c c n gk h a i , r i n gt , h o c b ov .

X c n hl ut r c h oc ct h n hv i nd l i ut n h
B i v t n hd l i uc m t m n hd u yn h t c a l ut r b t k b a on h i u i t n g c t or a , l ut r p h i c x c n ht r o n gm t n i d u yn h t . T r n hb i nd c hs k h n gp h nb l ut r c h ob n . C c m i l i nk t s b ol i n u m t t n ht h n hv i nd l i u c c n gb n h n gk h n g c x c n h . n hn g h a p h i x yr a b nn g o i l p( k h n gn i t u y n c c h op h p ) , v c h c m t n hn g h a c c h op h p .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 171/320

08/10/2013

Suy ngh trong C + +, Vol 1

D o , n g i t a t h n g t n t r o n gc c t pt i nt h c t h i c h oc c l ph c . C p h p i k h i ma n gl i c h on g i g p k h k h n , n h n gn t h c s l k h h pl . V d , n ub nt or a m t t h n hv i nd l i ut n ht r o n gm t l ph c n h t h n y :
c l a s sA{ } ; s t a t i ci n ti ;c n gc n g : //. . .

S a u , b np h i x c n hl ut r c h or n gt h n hv i nd l i ut n ht r o n gc c f i l e n hn g h a n h t h n y :
i n tA: :i=1 ;

N ub n x c n hm t b i nt o nc ub n ht h n g , b ns n i i n ti=1 ; n h n g y , c c n h i uh n hc p h ng i i p h mv i v t nl p c s d n g x c n hA: : t i . M t s n g i g pk h k h nv i t n gr n gA: : t i l t i n, n h n g yl m t c i g m d n gn h c i u k h i nn p h i n g o i t r i . C p h i i un yp h v c c h b ov ? l m t t h c h n hh o nt o na nt o nv h a i l d o . ut i n , l n i d u yn h t k h i t on yl h pp h pl t r o n g n hn g h a . T h c t , n ut n hd l i ul m t i t n gv i m t n h x yd n g , b ns g i c c n h x yd n gt h a yv s d n g= i uh n h . T h h a i , m t k h i n h n g h a c t h c h i n , n g i d n gc u i c t h k h n gl mc h om t n hn g h a t h h a i m i l i nk t s b ol i . V t c g i l pb u c p h i t or a c c n hn g h a h o c m s k h n gl i nk t t r o n gq u t r n ht h n g h i m. i un y mb or n gc c n hn g h a c h x yr a m t l nv r n g l t r o n gt a yc a n g i t or a l p . C c b i uh i nt o nb k h i t oc h om t t h n hv i nt n hl t r o n gp h mv i c a l p . V d ,


// :C 1 0 :S t a t i n i t . c p p //P h mv ik h it ot n h#i n c l u d eu s i n gn a m e s p a c es t d ; i n tx=1 0 0 ; l pW i t h S t a t i c{ s t a t i ci n tx ; t n hi n t y ;c n gc n g : v o i dp r i n t( )c o n s t{ c o u t< <" W i t h S t a t i c: :x= "< <x< <e n d l ; " W i t h S t a t i c: :y= "< <y< <e n d l ; } } ; i n tW i t h S t a t i c: :x=1 ;i n tW i t h S t a t i c: :y=x+1 ; //W i t h S t a t i c: :xK H N G: :x i n tm a i n( ){ W i t h S t a t i cw s ; w s . p r i n t( ) ; }/// :~

c o u t< <

y , t r n h Wi t h S t a t i c : m r n gp h mv i : Wi t h S t a t i c c h ot o nb n g h a . m n gk h i t ot n h C h n g8 g i i t h i uc c k h u y t i m t n hb i nc h op h pb nt x c n hm t g i t r k h n g i t r o n gm t c t h l p . Nc n gc t h t or a c c m n gc a t n hv t , c h a i c o n s t v k h n gc o n s t . C p h pl h pl :
// :C 1 0 :S t a t i c A r r a y . c p p //K h it om tm n gt n ht r o n gl pl pc cg i t r { //C o n s t st n h ck h it ot ic h : t n hc o n s ti n ts c S i z e=1 0 0 ; t n hc o n s ts c L o n gd i=1 0 0 ; //T n g ml mv i cv im n gt n h . //M n g ,t n hk h n gt h t h i uv k h n gc o n s t //p h i ck h it ob nn g o i : t n hi n ts c I n t s[ ] ; s c L o n g sl ut n hc o n s t[ ] ; t n hc o n s tf l o a ts c T a b l e[ ] ; t n h c h a rs c L e t t e r s[ ] ; t n hi n ts i z e; t n hc o n s tf l o a ts c F l o a t ; b n gn it n h[ ] ; c h c h a rt n h[ ] ; } ; i n tg i t r : :s i z e=1 0 0 ;g i t r f l o a tc o n s t: :s c F l o a t=1 , 1 ; c o n s ti n tg i t r : :s c I n t s[ ]={ 9 9 ,4 7 ,3 3 ,1 1 ,7 } ; c o n s tg i t r l u: :s c L o n g s[ ]={ 9 9 ,4 7 ,3 3 ,1 1 ,7 } ; c o n s tf l o a tg i t r : :s c T a b l e[ ]={ 1 . 1 ,2 . 2 ,3 . 3 ,4 . 4 } ; c o n s tg i t r c h a r: :s c L e t t e r s[ ]={ ' A ' ,' b ' ,' c ' ,' d ' ,' e ' , ' E ' ,' g ' ,' h ' ,' i ' ,' j ' } ; f l o a tg i t r : :b n g[ 4 ]={ 1 . 1 ,2 . 2 ,3 . 3 ,4 . 4 } ; g i t r c h a r: :c h [ 1 0 ]={ ' a ' ,' b ' ,' c ' ,' d ' ,' e ' , ' E ' ,' g ' ,' h ' ,' i ' ,' j ' } ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 172/320

08/10/2013

Suy ngh trong C + +, Vol 1

i n tm a i n( ){ G i t r v ; }/// :~

V i n h c i m t n hs c a c c l o i t c hr i , b nc t h c u n gc pc c n hn g h a t b nt r o n gl p , n h n g i v i t t c m i t h k h c ( b a og mc c m n gc a c c l o i t c hr i , n g a yc k h i h c h n gt n h) t b np h i c u n gc pm t n h n g h a b nn g o i d u yn h t c h oc c t h n hv i n . Nh n g n hn g h a n yc l i nk t n i b , h c t h c t t r o n gt pt i nt i u . C p h p k h i t om n gt n hc n gg i n gn h i v i b t k t n gh p , b a og mc t n ht n g . B nc n gc t h t or a c c k h u y t i m t n h i t n gc k i ul pv c c m n gc a t i t n g . T u yn h i n , b n k h n gt h k h i t oc h n gb n gc c hs d n gc p h p" n i t u y n " c h op h pt n hc o n s t s c a c c l o i t c hh p t r o n gt h t h i u :
// :C 1 0 :S t a t i c O b j e c t A r r a y s . c p pm n g//t n hc al p it n gc l a s sX{ i n ti ;c n gc n g : X( i n ti i ) :i( i i ){ } } ; l pS t a t{ // i un yk h n gl mv i c ,m cd //b nc t h m u nn : // ! t n hc o n s tXx( 1 0 0 ) ; //C h a ic o n s tv k h n gc o n s tl pt n h // it n gp h i ck h it ob n n g o i : t n hXx 2 ; t n hXx T a b l e 2[ ] ; c o n s tt n hXx 3 ; c o n s tt n hXx T a b l e 3 [ ] ; } ; XS t a t: :x 2( 1 0 0 ) ; XS t a t: :x T a b l e 2[ ]={ X( 1 ) ,X( 2 ) ,X( 3 ) ,X( 4 ) } ; c o n s tXS t a t: :x 3( 1 0 0 ) ; c o n s tXS t a t: :x T a b l e 3[ ]={ } ; i n tm a i n( ){ S t a tv ; }/// :~ X( 1 ) ,X( 2 ) ,X( 3 ) ,X( 4 )

V i c k h i t oc a c h a i c o n s t v k h n gc o n s t t n hm n gc a c c i t n gl ph c p h i c t h c h i nt h e oc n g m t c c h , s a u i nh n ht n hc p h p n hn g h a .

C cl pl n gn h a uv ap h n g

B nc t h d d n g a c c t h n hv i nd l i ut n ht r o n gc c l ph c c l n gv ob nt r o n gc c l pk h c . n h n g h a c a c c t h n hv i nn h l m t p h nm r n gt r c q u a nv r r n gb nc h c ns d n gm t m c p h n g i i p h mv i . T u yn h i n , b nk h n gt h c t n hd l i ut h n hv i nt r o n gl ph c a p h n g( m t l p a p h n g l m t l p c n hn g h a b nt r o n gm t h m) . D o ,

// :C 1 0 :L o c a l . c p p //T n ht h n hv i nv c cl ph c ap h n g #I n c l u d eu s i n gn a m e s p a c es t d ; //L pl n gn h a uc t h c c ct h n hv i nd l i ut n h : l pn g o i{ l pI n n e r{s t a t i ci n ti ;//O K } ; } ; i n tn g o i: :N i: :i=4 7 ; //L p ap h n gk h n gt h c d l i ut n ht h n hv i n :v o i df( ){ c n gc n g : // !s t a t i ci n ti ; //L i //( L mt h n ob ns x c n ht i ? ) }X ; } i n tm a i n( ){ n g o ix ,f( ) ; }/// :~ l p ap h n g{

B ns n h nt h yv n n g a yl pt c v i m t t n ht h n hv i nt r o n gm t l ph c ap h n g : L mt h n o b n mt c c t h n hv i nd l i up h mv i t pt i n x c n hn ? T r o n gt h c t , c c l ph c a p h n g c s d n gr t h i mk h i . h m t h n hv i nt n h B nc n gc t h t or a t n hc h c n n gt h n hv i n , n h t n ht h n hv i nd l i u , l mv i c c h oc c l ph c n h m t t n gt h c h k h n gp h i c h om t i t n gc t h c a m t l p . T h a yv l m m t c h c n n gt o nc us n g
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 173/320

08/10/2013

Suy ngh trong C + +, Vol 1

t r o n gv " g yn h i m" k h n gg i a nt nt o nc uv a p h n g , ma n gl i c h ob nc c c h c n n gb nt r o n gl p . K h i b nt or a m t t n hc h c n n gt h n hv i n , b n a n gt h h i nm t s k t h pv i m t l ph c c b i t . B nc t h g i m t t n hc h c n n gt h n hv i nt h e oc c ht h n gt h n g , v i c c d uc h mh o c m i t n , k t h pv i m t i t n g . T u yn h i n , n l i nh n hh n g i m t t n hc h c n n gt h n hv i nc a c h n hn , m k h n gc n b t k i t n gc t h , b n gc c hs d n gt o nt c p h ng i i , n h t h n y :
// :C 1 0 :S i m p l e S t a t i c M e m b e r F u n c t i o n . c p p v o i df( ){ } ; } ; i n tm a i n( ){ X: :f( ) ; }/// :~ c l a s sX{ c n gc n g :

K h i b nn h nt h yh mt h n hv i nt n ht r o n gm t l ph c , h yn h r n gc c n h t h i t k d n hr n gc h c n n g c k h i n i ml i nq u a n nl ph c n h m t t o nt h . M t t n hh mt h n hv i nk h n gt h t r u yc pc c t h n hv i nd l i ut h n gt h n g , c h c t n ht h n hv i nd l i u . Nc t h g i c h k h c t n hh mt h n hv i n . T h n gt h n g , a c h c a i t n gh i nt i ( n y) c l n gl t r i q u a t r o n gk h i b t k c h c n n gt h n hv i n c g i l , n h n gm t t n ht h n hv i nk h n gc i un y, l l d on k h n gt h t r u yc pc c t h n hv i nb n ht h n g . D o , b ns c c s g i a t n gn h t r o n gt c k h n n gc a m t c h c n n gt o nc uv m t t n hh mt h n hv i nk h n gc t h mp h t r u y nn y. n gt h i b ns c c n h n gl i c hc a v i c c c c c h c n n gb nt r o n gl p . C h oc c t h n hv i nd l i u , t n hc h r a r n gc h c m t p h nl ut r d l i ut h n hv i nt nt i c h ot t c c c i t n gc a m t l p . N ys o n gs o n gv i v i c s d n gc c t n h x c n h i t n gb nt r o n g m t c h c n n g c n g h a l c h c m t b ns a oc a m t b i n a p h n g c s d n gc h ot t c c c c u c g i c a c h c n n g . D i yl m t v d c h ot h yt n ht h n hv i nd l i uv t n hc h c n n gt h n hv i ns d n gv i n h a u :
// :C 1 0 :S t a t i c M e m b e r F u n c t i o n s . c p pc l a s sX{ i n ti ; t n hi n tj ;c n g c n g : X( i n ti i=0 ) :i( i i ){ //H mt h n hv i nk h n gt n hc t h t r u yc p //c h cn n gt h n hv i nt n h h o cd l i u : j=i ; } i n tv a l( )c o n s t{ r e t u r ni ; } s t a t i ci n ti n c r( ){ // !i++ ;//L i :t h n hv i nt n hc h cn n g //k h n gt h t r u yc pd l i u t h n hv i nk h n gt n h t r l i++j ; } t n hi n tf( ){ // !v a l( ) ;//L i :t h n hv i nt n hc h cn n g //c t h k h n gt r u yc pc h cn n g t h n hv i nk h n gt n h i n c rt r l i( ) ;//O K-g it n h } } ; i n tX: :j=0 ; i n tm a i n( ){ xx ; X*x p=& x ; x f( ) ; x p >f( ) ; X: :f( ) ;//C h l mv i cv ic ct h n hv i nt n h }/// :~

V h k h n gc i un yc o nt r , t n hh mt h n hv i nk h n gt h t r u yc pk h n gt n ht h n hv i nd l i uc n g k h n gg i k h n gt n hh mt h n hv i n . T h n gb ot r o n gma i n( ) l m t t n ht h n hv i nc t h c l a c h nb n gc c hs d n gd uc h mt h n gt h n g h o c c p h pm i t n , k t h pc h c n n gv i m t i t n g , n h n gc n gk h n gc i t n g( v m t t n ht h n h v i nc l i nq u a n nm t l ph c , k h n gp h i l m t i t n gc t h ) , s d n gt nl pv t o nt p h ng i i p h mv i . D i yl m t t n hn n gt h v : D oc c hk h i t ox yr a c h ot n h i t n gt h n hv i n , b nc t h t m t t n h t h n hv i nd l i uc a l pc n gt r o n g l p . yl m t v d c h c h op h pm t i t n gd u yn h t c a l o i t r n g t nt i b n gc c hl mc h oc c n h x yd n gt n h n . B nc t h t r u yc pv o i t n g , n h n gb n k h n gt h t or a b t k m i t r n g i t n g :
// :C 1 0 :S i n g l e t o n . c p p //T h n hv i nt n hc ac n gl o i , mb or n g//c h c m t it n gc al o in y t nt i . //C n g cg il " n "m h n h . #I n c l u d eu s i n gn a m e s p a c es t d ; l pt r n g{ t n ht r n g i nt ; i n ti ; T r n g( i n ti i ) :i( i i ){ } T r n g( t r n gc o n s t& ) ;//N g nc h nc n gc h n gb ns a o x yd n g : T r n gt n h*d ( ){ r e t u r n& e ; } i n tv a l( )c o n s t{ r e t u r ni ; } } ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 174/320

08/10/2013

Suy ngh trong C + +, Vol 1

T r n gt r n g: : i nt ( 4 7 ) ; i n tm a i n( ){ !// t r n gx( 1 ) ;//L i-k h n gt h t or am tq u t r n g //B nc t h t r u yc p v oc ct r n gh pd u yn h t : c o u t< <t r n g: :i n s t a n c e( )>v a l( )< <e n d l ; }/// :~

V i c k h i t oc h oEx yr a s a uk h i k h a i b ol ph o nt t , n nt r n hb i nd c hc t t c c c t h n gt i nc nt h i t p h nb l ut r v t h c h i nc u c g i x yd n g . h o nt o nn g nc h nv i c t or a c a b t k i t n gk h c , m t c i g k h c c t h mv o : m t x yd n g t n h nt h h a i c g i l s a o c h p n h x y d n g . T i t h i i mn yt r o n gc u ns c h , b nk h n gt h b i t t i s a o i un yl c nt h i t v c c n h x yd n gb ns a os k h n g c g i i t h i u nc h n gk t i p . T u yn h i n , n h m t b nx e m t r c , n ub n l o i b c c b ns a ox yd n g c x c n ht r o n gv d t r n , b ns c t h t or a m t t r n g i t n gn h t h n y :
T r n ge=*T r n g: :i n s t a n c e( ) ; T r n ge 2( *T r n g: :i n s t a n c e( ) ) ;

C h a i s d n gc c b ns a o x yd n g , d o , n i mp h o n gk h n n gs a oc h p x yd n g c k h a i b ol t n h n( k h n gc n hn g h a l c nt h i t v n k h n gb a og i c g i l ) . M t p h nl nc a c h n gt i pt h e ol m t c u c t h ol u nv c c b ns a o x yd n g n s t r n nr r n gc h ob ns a u .

P h t h u ck h i t ot n h

T r o n gm t nv d c hc t h , t r n ht k h i t oc c i t n gt n hl mb o c t h t m c c n hn g h a i t n gx u t h i nt r o n g nv d c ht h u t . T r n ht h yd i t l mb o c s on g c t h t k h i t o . T u yn h i n , k h n gc mb ol i nq u a n nt r n ht k h i t oc c i t n gt n ht r n nv d c ht h u t v n g n n g c u n gc pk h n gc c c hn o x c n ht h t n y . i un yc t h g yr a v n n gk . Nh m t v d v m t t h mh a n g a yl pt c ( t r o n g s n g nc h nc c h i uh n hn g u y nt h yv g i t c h t q u t r n ht r nn h n g t i n hv i ) , n um t t pt i nc c h a

T pt i n// ut i n #B a og m< f s t r e a m > s t d: :o f s t r e a mr a( " o u t . t x t " ) ;

v t pt i nk h c s d n gr a k h i i t n gt r o n gm t t r o n gn h n gk h i t oc a n
//T pt i nt h h a i#b a og m< f s t r e a m >e x t e r ns t d: :o f s t r e a mr a ; l pO o f{ p u b l i c : O o f( ){ s t d: :o u t< <" o u c h " ; } }O o f ;

c h n gt r n hc t h l mv i c , v n c t h k h n g . N um i t r n gl pt r n hx yd n gc c c h n gt r n h c c t p t i n ut i n c k h i t ot r c k h i c c t pt i nt h h a i , s a u s k h n gc v n . T u yn h i n , n uc c t pt i nt h h a i c k h i t ot r c k h i l n g i ut i n , c c n h x yd n gc h oOo f d a v os t nt i c a h i n, m k h n g c x yd n gn ur a v i un yg yr a s h nl o n . V n n yc h x yr a v i k h i t o i t n gt n hp h t h u c v on h a u . C c t n ht r o n gm t nv d c h c k h i t o t r c k h i g i ut i nc a m t c h c n n gt r o n g nv n h n gn c t h l s a uk h i c h n h( ) . B nk h n gt h c h c c h nv t h t k h i t oc c i t n gt n hn uh t r o n gc c t pt i nk h c n h a u . [ 4 4 ] M t v d t i n hv i h nc t h c t mt h yt r o n gc c A R M. T r o n gm t t pt i nm b nc t r o n gp h mv i t o n c u :
e x t e r ni n ty ,i n tx=y+1 ;

v t r o n gm t t pt i nt h h a i b nc p h mv i t o nc u :
e x t e r ni n tx ;i n ty=x+1 ;

i v i t t c c c i t n gt n h , c c c c h l i nk t n p mb om t k h i t ot n hb n gk h n gt r c k h i k h i n g t h e oq u y n hc a c c l pt r n hv i nd i nr a . T r o n gv d t r c , z e r o i n gc a l ut r b c h i m n gb i f s t r e a mr a i t n gk h n gc n g h a c b i t , v v yn t h c s l k h n gx c n hc h o nk h i x yd n g c g i . T u y n h i n , v i x yd n gt r o n gc c l o i , k h i t ob n gk h n gk h n g c n g h a , v n uc c t pt i n c k h i t ot r o n g t h t c h n g c t r n hb y t r n , yb t un h t n hk h i t ob n gk h n g , v v yx t r t h n hm t , v yl t n gk h i t oh a i . T u yn h i n , n uc c t pt i n c k h i t ot h e ot h t n g c l i , x c k h i t ot n hk h n g , yl
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 175/320

08/10/2013

Suy ngh trong C + +, Vol 1

t n gk h i t om t , v x s a u t r t h n hh a i . L pt r n hv i np h i t h c c i un yb i v h c t h t or a m t c h n gt r n hv i p h t h u c k h i t ot n hv l mc h on l mv i c t r nm t n nt n g , n h n gd i c h u y nn nm t m i t r n gb i ns o n , n i n b t n g , b n , k h n gl mv i c .

P h i l m g
1. 2. 3.

C b a p h n gp h p i p h v i v n n y : n gl m i u . T r n hp h t h u c k h i t ot n hl g i i p h pt t n h t . N ub np h i l m i u , t c c n hn g h a q u a nt r n g i t n gt n ht r o n gm t t pt i nd u yn h t , v v y b nc t h k i ms o t p o r t a b l yk h i t oc a h b n gc c h t c h n gt h e ot h t n g . N ub nt i n l k h n gt h t r n hk h i p h nt nc c i t n gt n ht r n nv d c hn h t r o n gt r n g h pc a m t t h v i n , n i m b nk h n gt h k i ms o t c c c l pt r n hv i ns d n gn c h a i c h n g t r n hk t h u t g i i q u y t v n .

K t h u t m t K t h u t n y i t i np h o n gb i J e r r yS c h wa r z t r o n gk h i t or a c c t h v i ni o s t r e a m( d oc c n hn g h a c h oc i n , c o u t v c e r r l t n hv s n gt r o n gm t t pt i nr i n gb i t ) . Nt h c s k mh ns ov i k t h u t t h h a i n h n gn c k h o n gm t t h i g i a nd i v d o b nc t h i q u a m c s d n gn , d o i uq u a nt r n gl b nh i u c c hh o t n g . K t h u t n y i h i m t l ph c t h mt r o n gt pt i nt i u t h v i nc a b n . L pn yc h ut r c hn h i mk h i n g c a c c i t n gt n ht h v i nc a b n . yl m t v d ng i n :
// :C 1 0 :I n i t i a l i z e r . h //K h it ok t h u tt n h #I f n d e fI N I T I A L I Z E R _ H #X c n hI N I T I A L I Z E R _ H#i n c l u d ee x t e r ni n tx ;//K h a ib o ,k h n g n hn g h ae x t e r n i n ty ; l pI n i t i a l i z e r{ s t a t i ci n ti n i t C o u n t ;c n gc n g : I n i t i a l i z e r( ){ s t d: :c o u t< <" I n i t i a l i z e r( ) "< <t i uc h u n ::e n d l ; //k h it ol n ut i nc h n u( i n i t C o u n t++= =0 ){ s t d: :c o u t< <" t h ch i nk h it o " < <S t d: :e n d l ; x=1 0 0 ; y=2 0 0 ; } } ~I n i t i a l i z e r( ){ s t d: :c o u t< <" ~I n i t i a l i z e r( ) "< <s t d: :e n d l ; //L ms c hl nc u ic n gc h n u( -i n i t C o u n t= =0 ){ s t d: :c o u t < <" t h ch i nd nd p " < <s t d: :e n d l ; //B tk d nd pc nt h i t y } } } ; //S a u yt or am t it n gt r o n gm i //T pt i nm I n i t i a l i z e r . h cb a og m ,n h n gm // it n gl c h h i nt h t r o n gt p t i n : I n i t i a l i z e rt n hi n i t ; #E n d i f//I N I T I A L I Z E R _ H/// :~

T k h a i c h ox v yc h t h n gb or n gc c i t n gn yt nt i , n h n gh k h n gp h nb l ut r c h oc c i t n g . T u yn h i n , n hn g h a c h oi n i I n i t i a l i z e r p h nb l ut r c h oc c i t n gt r o n gt t t c c c t pt i nm c c t i u c b a og m. Nh n gv c i t nl t n h( t mn h nk i ms o t t h i g i a nn y , k h n gl ut r n g c p h nb ; l ut r l t pt i np h mv i t h e om c n h ) , n l c h h i nt h t r o n g nv d c ht h u t , v v yc c m i l i n k t s k h n gp h nn nv l i n h i u n hn g h a . yl f i l e c h a c c n hn g h a c h ox , y, v i n i t C o u n t :
// :C 1 0 :I n i t i a l i z e r D e f s . c p p{ O } // n hn g h av I n i t i a l i z e r . h #B a og m" I n i t i a l i z e r . h " //K h it ot n hs b u c//t tc n h n gg i t r n yk h n g : i n tx ;i n ty ,i n tI n i t i a l i z e r: :i n i t C o u n t ;/// :~

( T t n h i n , m t t pt i nt r n gh pt n hc a i n i t . c n g c t t r o n gt pt i nn yk h i p h n u c b a og m) G i s h a i t pt i nk h c c t or a b i n g i s d n gt h v i n :
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 176/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 1 0 :I n i t i a l i z e r . c p p{ O } //K h it ot n h #B a og m" I n i t i a l i z e r . h " /// :~

v
// :C 1 0 :I n i t i a l i z e r 2 . c p p //{ L }I n i t i a l i z e r D e f sI n i t i a l i z e r //K h it ot n h#b a og m" I n i t i a l i z e r . h "u s i n gn a m e s p a c es t d ; i n tm a i n( ){ c o u t< <" b nt r o n gc h n h( ) "< <e n d l ; c o u t< <" l ic h n h( ) "< <e n d l ; }/// :~

B yg i n k h n gq u a nt r n gm nv d c h c k h i t o ut i n . L n ut i nm t nv d c hc h a I n i t i a l i z e r . h c k h i t o , i n i t C o u n t s k h n g k h i t os c t h c h i n . ( i un yp h t h u c r t n h i uv o t h c t l c c k h uv c l ut r t n h c t h i t l p k h n gt r c k h i k h i n gd i nr a . ) i v i t t c c c p h nc n l i c a c c nv d c h , i n i t C o u n t s k h c k h n gv k h i t os c b q u a . D nd px yr a t h e ot h t n g c l i , v ~I n i t i a l i z e r ( mb or n gn s x yr a c h m t l n . ) V d n ys d n g c x yd n gt r o n gc c l o i n h c c i t n gt n ht o nc u . K t h u t n yc n gl mv i c v i c c l ph c , n h n gc c i t n gn ys a u p h i c t n gk h i t ob i I n i t i a l i z e r l p . M t c c h l m i u n yl t or a c c l ph c m k h n gc nx yd n gv h mh y , n h n gt h a yv v i k h i t ov h mt h n hv i n d nd ps d n gc c t nk h c n h a u . M t c c ht i pc np h b i nh n , t u yn h i n , l c c o nt r nc c i t n g v t oc h n gb n gmi t r o n gI n i t i a l i z e r ( . ) K t h u t h a i L us a uk h i m t k t h u t c s d n g , m t n g i n o ( t i k h n gb i t l a i ) a r a c c k t h u t g i i t h c ht r o n gp h nn y , l ng i nh nn h i uv s c hh ns ov i k t h u t m t . T h c t l n q u l u k h m p h l t n gn h s p h c t pc a C++ . K t h u t n yd a t r nt h c t l c c i t n gt n ht r o n gc c c h c n n g c k h i n gl n ut i n( c h ) l h m c g i . H yn h r n gv n c h n gt a a n gt h c s c g n g g i i q u y t yk h n gp h i l k h i c c i t n gt n h c k h i t o( c t h c i uk h i nr i n gb i t ) m l mb or n gc c k h i t ox yr a t h e o n gt h t . K t h u t n yl r t g ng n gv t h n gmi n h . i v i b t k p h t h u c k h i t o , b n t m t i t n gt n hb n t r o n gm t h mt r v m t t h a mc h i u n i t n g . B n gc c hn y , c c hd u yn h t b nc t h t r u yc pc c i t n gt n hl b n gc c hg i c h c n n g , v n u i t n gm c np h i t r u yc pv oc c i t n gt n hk h c m n p h t h u c n p h i g i h c h c n n g . V l n ut i nm t h m c g i , n b u c n g i k h i t os d i nr a . T r n h t k h i t ot n hl mb o c c h n hx c b i v c c t h i t k c a m n y , k h n gp h i v m t t r t t t yt h n hl p b i c c m i l i nk t . t h i t l pm t v d , yl h a i l ph c p h t h u c v on h a u . Ng i ut i nc c h a m t b o o l c k h i t oc h b i c c n h x yd n g , v v yb nc t h c h ob i t n uc c n h x yd n g c g i l m t t r n gh pt n hc a l p ( k h uv c l ut r t n h c k h i t ob n gk h n gk h i k h i n gc h n gt r n h , t r o n g s nx u t m t s a i g i t r c h o c c b o o l n uc c n h x yd n g k h n g c g i ) :


// :C 1 0 :D e p e n d e n c y 1 . h #I f n d e fD E P E N D E N C Y 1 _ H #X c n hD E P E N D E N C Y 1 _ H #I n c l u d e l pD e p e n d e n c y 1{ b o o li n i t ,c n gc h n g : D e p e n d e n c y 1( ) :i n i t( t r u e ){ s t d: :c o u t< <" D e p e n d e n c y 1x yd n g " < <S t d: :e n d l ; } v o i dp r i n t( )c o n s t{ s t d: :c o u t< <" D e p e n d e n c y 1i n i t : " < <I n i t< <s t d: :e n d l ; } } ; #E n d i f//D E P E N D E N C Y 1 _ H/// :~

C c n h x yd n gc n gt h n gb ok h i n a n g c g i , v b nc t h i n( ) t r n gt h i c a i t n g t mh i u x e mn c k h i t o . L pt h h a i c k h i t ot m t i t n gc a l ph c ut i n , l n h n gg s g yr a s p h t h u c :
// :C 1 0 :D e p e n d e n c y 2 . h #I f n d e fD E P E N D E N C Y 2 _ H
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 177/320

08/10/2013

Suy ngh trong C + +, Vol 1

#X c n hD E P E N D E N C Y 2 _ H #B a og m" D e p e n d e n c y 1 . h " l pD e p e n d e n c y 2{ D e p e n d e n c y 1d 1 ,c n gc h n g : D e p e n d e n c y 2( c o n s tD e p e n d e n c y 1&d e p 1 ) :d 1( d e p 1 ){ s t d: :c o u t< <" D e p e n d e n c y 2x y d n g " ; i n( ) ; } v o i dp r i n t( )c o n s t{ d 1 . p r i n t( ) ; } } ; #E n d i f//D E P E N D E N C Y 2 _ H/// :~

C c n h x yd n gt h n gb oc h n hn v i nr a t r n gt h i c a d 1 p h n i , d o b nc t h x e mn un c k h i t ob i t h i g i a nx yd n g c g i . c h n gmi n hn h n gg c t h i s a i , t pt i ns a u y ut i n t c c n hn g h a i t n gt n ht h e ot h t s a i , v c h n gs x yr a n ux yr a c c m i l i nk t k h i t oDe p e n d e n c y 2 i t n gt r c k h i De p e n d e n c y 1 i t n g . S a u t h e ot h t on g c l i h i nt h n h t h n on h o t n gc h n hx c n u x yr a l " n g " . C u i c n g , h a i k t h u t c t h h i n . C u n gc ps nl n gd c h n , c h c n n gp h nc c h(l ) t or a . B q u y t l b nk h n gt h g i m t c h c n n g t r nt o nc ut r k h i c h c n n g a n g c s d n g t h c h i nv i c k h i t om t b i n , v d up h nc c h(t r v g i t r g i c s d n g ) k h i t om t v i b i nt o nc u .


// :C 1 0 :T e c h n i q u e 2 . c p p#b a og m" D e p e n d e n c y 2 . h "u s i n gn a m e s p a c es t d ; //T r v m tg i t r n c t h cg il //m tk h it ot o nc u : i n tp h nc c h( ){ c o u t< <" "< <e n d l ; t r l i1 ; } //M p h n gc cv n p h t h u c : e x t e r nD e p e n d e n c y 1d e p 1 ; D e p e n d e n c y 2d e p 2( d e p 1 ) ;D e p e n d e n c y 1d e p 1 ;i n tx 1=p h nc c h( ) ; //N h n gn un x yr at h e ot h t n yn h o t n gO K : D e p e n d e n c y 1d e p 1 b ;D e p e n d e n c y 2d e p 2 b( d e p 1 b ) ;i n tx 2=p h nc c h( ) ; //B a ob c c it n gt n ht r o n gc h cn n gt h n hc n gD e p e n d e n c y 1&D 1( ){ D e p e n d e n c y 1d e p 1 ; t r l id e p 1 ; } D e p e n d e n c y 2&d 2( ){ t n hD e p e n d e n c y 2d e p 2( d 1( ) ) ; } i n tm a i n( ){ D e p e n d e n c y 2&d e p 2=d 2( ) ; }/// :~ t r l id e p 2 ; t n h

C c c h c n n gd 1 ( ) v d 2 ( ) q u nt r n gh pt n hc a De p e n d e n c y 1 v De p e n d e n c y 2 i t n g . B yg i , c c h d u yn h t b nc t h n h n c c h oc c i t n gt n hl b n gc c hg i c c c h c n n gv l c l n gk h i t ot n h t r nc c c h c n n gg i ut i n . i un yc n g h a k h i t om c mb ol n g , m b ns t h yk h i b n c h yc h n gt r n hv x e mk t q u . yl c c hb ns t h c s t c h c m s d n gk t h u t n y . T h n gt h n g , c c i t n gt n hs c x c n h t r o n gt pt i nr i n gb i t ( b i v b nb u c p h i c h om t s l d o , h yn h r n gv i c x c n hc c i t n gt n ht r o n g t pt i nr i n gb i t l n h n gg g yr a v n ) , v v yt h a yv o b nx c n hc c c h c n n gg i t r o n gt pt i nr i n g b i t . Nh n gh s c np h i c k h a i b ot r o n gt pt i nt i u :

// :C 1 0 :D e p e n d e n c y 1 S t a t F u n . h #I f n d e fD E P E N D E N C Y 1 S T A T F U N _ H #X c n hD E P E N D E N C Y 1 S T A T F U N _ H#b a og m" D e p e n d e n c y 1 . h "e x t e r nD e p e n d e n c y 1& D 1( ) ;#e n d i f//D E P E N D E N C Y 1 S T A T F U N _ H/// :~

T r nt h c t , " e x t e r n " l k h n gc nt h i t c h oc c c h c n n gk h a i b o . yl t pt i nt i u t h h a i :
// :C 1 0 :D e p e n d e n c y 2 S t a t F u n . h #I f n d e fD E P E N D E N C Y 2 S T A T F U N _ H #X c n hD E P E N D E N C Y 2 S T A T F U N _ H#b a og m" D e p e n d e n c y 2 . h "e x t e r nD e p e n d e n c y 2& d 2( ) ;#e n d i f//D E P E N D E N C Y 2 S T A T F U N _ H/// :~

B yg i , t r o n gc c t pt i nt h c h i n , n i b ns t r c t c c n hn g h a i t n gt n h , b nt h a yv t c c n hn g h a c h c n n gg i :
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 178/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 1 0 :D e p e n d e n c y 1 S t a t F u n . c p p{ O } #B a og m" D e p e n d e n c y 1 S t a t F u n . h "D e p e n d e n c y 1&D 1( ){ d e p 1 ; t r l id e p 1 ; }/// :~

t n hD e p e n d e n c y 1

C l , c c m k h c c n gc t h c t t r o n gn h n gt pt i n . D i yl c c t pt i nk h c :
// :C 1 0 :D e p e n d e n c y 2 S t a t F u n . c p p{ O } #B a og m" D e p e n d e n c y 1 S t a t F u n . h " #B a og m" D e p e n d e n c y 2 S t a t F u n . h "D e p e n d e n c y 2&d 2( ){ d e p 2( d 1( ) ) ; t r l id e p 2 ; }/// :~

t n hD e p e n d e n c y 2

// :C 1 0 :T e c h n i q u e 2 b . c p p //{ L }D e p e n d e n c y 1 S t a t F u nD e p e n d e n c y 2 S t a t F u n#b a og m" D e p e n d e n c y 2 S t a t F u n . h "i n t m a i n( ){ d 2( ) ; }/// :~

V v y , h i nn a yc h a i t pt i nc t h c l i nk t t r o n gb t k t h t v n un c h a i t n gb n ht h n gt n h c t h s nx u t b t k k h i t o . Nh n gv c h n gc c h a c c c h c n n gb a ob , k h n gc m i e d a c a v i c k h i t ok h n gc h n hx c :

K h i b nc h yc h n gt r n hn y , b ns t h yr n gv i c k h i t oc c De p e n d e n c y 1 i t n gt n hl u nl u nx yr a t r c k h i k h i t oc a De p e n d e n c y 2 i t n gt n h . B nc n gc t h t h yr n g yl m t p h n gp h p ng i n h nn h i us ov i k t h u t m t . B nc t h b c md v i t d 1 ( ) v d 2 ( ) l c h c n n gn i t u y nt r o n gt pt i nt i u c a m n h , n h n g yl m t c i g b np h i c h c c h nk h n gl m. M t h mn i t u y nc t h c l pl i t t c c c f i l e t r o n g n x u t h i nv n h nb nn yb a o g m n hn g h a i t n gt n h . B i v c h c n n gn i t u y nt n gm c n hl i nk t n i b , i un ys d n nv i c c n h i u i t n gt n ht r nc c nv d c hk h c n h a u , m c h c c h ns g yr a v n . V v y , b np h i mb or n gc h c m t n hn g h a c a t n gc h c n n gb a ob , v i un yc n g h a l k h n gl mc h oc c c h c n n gg i n i t u y n .

T h n gs k t h u t l i nk t t h a yt h
i ug x yr an ub n a n gv i t m t c h n gt r n ht r o n gC++v b nmu ns d n gm t t h v i nC ? N ub n t h c h i nv i c k k h a i c h c n n gC , n if( i n ta ,c h a rb ) ; C++ , t r n hb i nd c hs t r a n gt r t nn yv om t c i g n h _ f _ i n t _ c h a r h t r c h c n n gq u t i ( v l i n k t a nt o nl o i ) . T u yn h i n , t r n hb i nd c hCm b i ns o nt h v i nCc a b n c h c c h nn h t k h n g t r a n gt r t n , v v yt nn i b c a n s c _ f . Nh v y , m i l i nk t s k h n gc k h n n gg i i q u y t c a b nC++c u c g i nf ( ) . C c h t h o t c c u n gc pt r o n gC++l c c c i mk t h u t l i nk t t h a y t h , c s nx u t t r o n gc c n g nn g d oq u t i c c e x t e r nt k h a . C c e x t e r nT i pt h e ol m t c h u i q u y n hc t h m i l i nk t mb nmu nc h ov i c k k h a i , t i pt h e ol t u y nb : e x t e r n" C "f l o a tf ( i n ta ,
c h a rb ) ;

i un yc h ot r n hb i nd c hc h oCl i nk t v i f ( ) t r n hb i nd c hk h n gt r a n gt r t n . C h c h a i l o i c h i t i t k t h u t l i nk t h t r t h e ot i uc h u nl " C " v " C++ " , n h n gc c n h c u n gc pt r n hb i nd c hc t yc h nh t r c c n g nn g k h c t r o n gc n gm t c c h . N ub nc m t n h mc c t k h a i v i l i nk t t h a yt h , t c h n gt r o n gd un g o c , n h t h n y :


e x t e r n" C "{ f l o a tf( i n ta ,c h a rb ) ; id( i n ta ,c h a rb ) ; }

Ho c , v i m t t pt i nt i u ,
e x t e r n" C "{ #i n c l u d e" M y h e a d e r . h " }

H uh t C++c c n h c u n gc pt r n hb i nd c hx l c c c h i t i t k t h u t l i nk t t h a yt h t r o n gt pt i nt i u c a h l mv i c v i c Cv C++ , d o b nk h n gp h i l ol n gv n .

T mt t

C c t n ht k h a c t h l k h h i ub i v t r o n gm t s t r n gh pn i uk h i nv t r l ut r , v t r o n gn h n g n g i k h c n k i ms o t t mn h nv s l i nk t c a m t t n .
179/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

V i s r a i c a C++k h n gg i a nt n , b nc m t s t h a yt h c i t h i nv l i n hh o t h n k i ms o t s g i a t n g c a t nt r o n gc c d nl n . V i c s d n gc c t n hl pb nt r o n gl m t t r o n gn h i uc c h k i ms o t t nt r o n gm t c h n gt r n h . T nk h n g x u n g t v i c c t nt o nc u , v k h n n gh i nt h v t r u yc p c l ug i t r o n gc h n gt r n h , c h ob nk i m s o t t t h nt r o n gv i c d u yt r m c a b n .

B i t p
1.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o n p h n h t www. B r u c e E c k e l . c o m.

2. 3.

4.

5.

6. 7. 8. 9.

10. 11.

12. 13. 14. 15. 16.

T om t h mv i m t b i nt n hm l m t c o nt r ( v i m t i s m c n hc a s k h n g ) . K h i n g i g i c u n gc pm t g i t r c h ol pl u nn yn c s d n g t r v o uc a m t m n gc a i n t . N ub n g i h mv i m t i s k h n g( b n gc c hs d n g i s m c n h ) , h mt r v g i t r t i pt h e ot r o n g m n g , c h o nk h i n t h ym t " 1 " g i t r t r o n gm n g( h o t n gn h m t c h s c u i c n gc a m n g ) . T h c h i nc h c n n gn yt r o n gma i n( ) . T om t h mt r v g i t r t i pt h e ot r o n gm t d yF i b o n a c c i m i k h i b ng i n . T h m m t l l u nr n g l m t b o o l v i m t g i t r m c n hl s a i n h v ym k h i b nc u n gc pc h oc c t r a n hc i v i n gn " r e s e t " c h c n n g b t uc a d yF i b o n a c c i . T h c h i nc h c n n gn yt r o n gma i n( ) . T om t l pc h a m t m n gc a i n t s . T h i t l pk c ht h c c a m n gs d n gc o n s t t n h b nt r o n gl p . T h m m t t c o n s t i n t b i n , v k h i t on t r o n gd a n hs c hk h i t ox yd n g , l mc h oc c n h x y d n gn i t u y n. T h m m t t n hi n t b i nt h n hv i nv k h i t om t g i t r c t h . T h m m t t n hh m t h n hv i nm i nc c t n ht h n hv i nd l i u . T h m m t n i t u y nc h c n n gt h n hv i n c g i l p r i n t ( ) i nr a t t c c c g i t r t r o n gm n gv g i t n hh mt h n hv i n . T pt h d c l pn yt r o n gma i n ( ) . T om t l pg i l m nh n h t h e od i s l nm n c ( ) c h c n n gt h n hv i n c g i . T h m m t p r i n t ( ) c h c n n gt h n hv i nc h i nt h s l n gc c s c . B yg i t or a m t c h c n n gt o nc u( k h n gp h i l m t t h n hv i nn n g ) c c h a m t t n hM nh n h i t n g . M i l nb ng i h mc ng i s c ( ) , s a u i n( ) h i nt h c c s s c . T h c h i nc h c n n gt r o n gc h n h( ) . S a i M nh n hl pt t p4 b nc t h g i m g i t r ( ) s l n gs c . L mc h om t l pMo n i t o r 2 m m t n h m t i s n h x yd n gm t c o nt r nm t Mo n i t o r 1 , v c t h l u c c o nt r v g i s c ( ) v p r i n t ( ) . T r o n gd e s t r u c t o r c h oMo n i t o r 2 , g i d e c r e me n t ( ) v i n( ) . B yg i l m m t t n h i t n gc a Mo n i t o r 2 b nt r o n gm t h m. T r o n gma i n( ) , t h n g h i mv i k ug i c c c h c n n gv k h n gk ug i c c c h c n n g x e mn h n gg s x yr a v i d e s t r u c t o r c a Mo n i t o r 2 . T h c h i nm t i t n gt o nc uc a Mo n i t o r 2 v x e mn h n gg s x yr a . T om t l ph c v i m t d e s t r u c t o r m i nm t t i nn h nv s a u g i e x i t ( ) . T or a m t i t n gt o n c uc a l pn yv x e mn h n gg s x yr a . T r o n gS t a t i c De s t r u c t o r s . c p p, t h n g h i mv i t h t c c n h x yd n gv h yc u c g i b n gc c hg i f ( ) v g( )t r o n gma i n( ) t r o n g n t h n gk h c n h a u . K h n gt r n hb i nd c hc a b nc c n p h i k h n g ? T r o n gS t a t i c De s t r u c t o r s . c p p, k i mt r a v i c x l l i m c n ht h c h i nc a b nb n gc c h n hn g h a b a n uc a r a v om t e x t e r nk h a i v a n hn g h a t h c t s a uk h i n hn g h a c a mt ( c o b j x yd n g g i t h n gt i nr a ) . H yc h c c h nr n gk h n gc g k h c q u a nt r n gc h yt r nm yt n hc a b nk h i b n c h yc h n gt r n hh a ym yt n hc a b ns x l l i l m n hm . C h n gmi n hr n gt pc c b i nt n ht r o n gt pt i nt i u k h n gx u n g t v i n h a uk h i a v on h i uh n m t c p pt pt i n . T om t l p ng i nc c h a m t i n t , m t n h x yd n gm k h i t oi n t t t h a ms c a n , m t c h c n n gt h n hv i n t h i t l pi n t t t h a ms c a n , v m t b ni n( ) c h c n n gi nc c i n t . t l ph c c a b nt r o n gm t t pt i nt i u , v b a og mc c t pt i nt i u t r o n gh a i c p pt pt i n . T r o n gm t c p pt pt i nl mc h om t t h h i nc a l p h c c a b n , v t r o n gk h c t u y nb r n g n hd a n he x t e r nv t h n g h i mn t r o n gma i n( ) . H yn h r n g , b ns p h i l i nk t h a i i t n gt pt i nh o c n g i n ok h c c c m i l i nk t s k h n gt mt h y i t n g . H yt h h i nc a c c i t n gt r o n gt p1 1 t n hv x c mi n hr n gn k h n gt h c t mt h yb i c c m i l i nk t v i un y . K h a i b om t c h c n n gt r o n gm t t pt i nt i u . X c n hc c c h c n n gt r o n gm t c p pt pt i nv g i n t r o n gma i n( ) t r o n gm t g i yc p pt pt i n . B i nd c hv x c mi n hr n gn h o t n g . B yg i t h a y i n hn g h a c h c n n g n l t n hv x c mi n hr n gc c m i l i nk t k h n gt h t mt h yn . S a i V o l a t i l e . c p pt C h n g8 l mc h oc o mm : : i s r ( ) m t c i g t h c s c t h l mv i c n h m t d c hv t h n gx u y nb g i n o n . G i : m t d c hv t h n gx u y nb g i n o nk h n gc b t k i s . V i t v b i nd c hm t c h n gt r n h ng i ns d n gt n gv n gk c c t k h a . T om t t pt i nt i u c h a m t k h n gg i a nt n. B nt r o n gk h n gg i a nt nt or a m t s t u y nb c h c n n g . B yg i t or a m t t pt i nt i u t h h a i b a og m m t t r o n gn h n g ut i nv t i pt c c c k h n gg i a nt n, t h m m t s t u y nb c h c n n gh n . B yg i t or a m t c p pt pt i nc c h a c c t p
180/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

17. 18. 19. 20. 21. 22.

23. 24.

25.

26. 27.

28. 29.

30. 31. 32.

33. 34. 35.

t i nt i u t h h a i . B d a n ht nmi nk h n gg i a nc a b n nm t t n( n g nh n ) . T r o n gm t n hn g h a c h c n n g , g i m t t r o n gn h n gc h c n n gc a b ns d n g p h ng i i p h mv i . T r o n gm t n h n g h a c h c n n gr i n gb i t , v i t s d n gc h g i i t h i uk h n gg i a nt nc a b nv o p h mv i c h c n n g , v c h ot h yr n gb nk h n gc n p h ng i i p h mv i g i c c c h c n n gt k h n gg i a nt nc a b n . T om t t pt i nt i u v i m t k h n gg i a nt nv d a n h . B a og mc c t i u t r o n gh a i r i n gb i t c p pt p t i nv c h ot h ym t k h n gg i a nv d a n hl d u yn h t c h om i nv d c ht h u t . S d n gc c t pt i nt i u t t p1 7 , c h ot h yc c t nt r o n gm t k h n gg i a nv d a n ht n gc s nt r o n g m t nv d c hm k h n gc t r n h c h u y nm n . S a i F r i e n d I n j e c t i o n . c p pt h m m t n hn g h a c h oc c c h c n n gb nv g i h mb nt r o n gc h n h ( ) . T r o n gA r i t h me t i c . c p p, c h n gmi n hr n gs d n gc h t h k h n gk od i b nn g o i c c c h c n n gt r o n g c c c h t h c t h c h i n . S a c h a c c v n t r o n gOv e r r i d i n g A mb i g u i t y . c p, ut i npv i p h ng i i p h mv i , s a u t h a y v v i m t s d n gt u y nb r n gl c l n gb i nd c h l a c h nm t t r o n gn h n gt nc h c n n gg i n g h t n h a u . T r o n gh a i t pt i nt i u , t or a h a i k h n gg i a nt n , m i d n gc h a m t l p( v i t t c c c n hn g h a n i t u y n ) v i t ng i n gv i t r o n gk h n gg i a nt nk h c . T or a m t c p pt pt i nb a og mc t pt i nt i u . T or a m t c h c n n g , v b nt r o n gc c c h c n n gs d n gs d n gc h g i i t h i uc h a i k h n gg i a n t n . C g n gt or a m t i t n gc a l pv x e mn h n gg s x yr a . L mc h os d n gc h t h t o nc u ( n g o i c h c n n g ) x e mn un l mc h ob t k s k h c b i t . S a c h a c c v n s d n g p h ng i i p h mv i , v t oc c i t n gc a c h a i l p . S a c h a c c v n t r o n gb i t p2 2 v i m t s d n gt u y nb r n gl c l n gb i nd c h l a c h nm t t r o n gc c t nl pg i n gh t n h a u . T r c hx u t t k h a i k h n gg i a nt nt r o n gB o b s S u p e r Du p e r L i b r a r y . c pv p U n n a me d Na me s p a c e s . c p pv t c h n gt r o n gc c t pt i nt i u r i n gb i t , t oc h ok h n gg i a nt nv d a n hm t t nt r o n gq u t r n hn y . T r o n gm t t pt i nt i u t h b a t or a m t k h n gg i a nt nm i k t h pc c y ut c a h a i k h n gg i a nt nk h c v i s d n gt k h a i . T r o n gma i n( ) , g i i t h i uk h n gg i a n t nm i c a b nv i m t s d n gc h t h v t r u yc pt t c c c y ut c a t nmi nk h n gg i a nc a b n . T om t t pt i nt i u b a og m< s t r i n g >v < i o s t r e a m>n h n gk h n gs d n gb t k s d n gc h t h , s d n gt k h a i . T h m" b a og mv s " n h b n t h yt r o n gc c t pt i nt i u t r o n gc u ns c hn y . T or a m t l ph c v i t t c c c c h c n n g n i t u y nc c h a m t c h u i t h n hv i n , v i m t c o n s t r u c t o r m k h i r n gc h u i t i s c a n v i n ( ) c h c n n gh i nt h c h u i . T or a m t c p pt pt i nv t h c h i nc c l ph c c a b nt r o n gma i n( ) . T om t l pc c h a m t t n h i v d i . V i t t n hc h c n n gt h n hv i n i nr a c c g i t r . T om t l pc c h a m t i n t , m t n h x yd n gm k h i t oi n t t t h a ms c a n , v m t b ni n( ) c h c n n g h i nt h c c i n t . B yg i t om t l pt h h a i c c h a m t t n h i t n gc a c c ut i n . T h m m t t n hh mt h n hv i nm c c c u c g i t n hc a i t n gi n( ) c h c n n g . T h c h i nl ph c c a b n t r o n gma i n( ) . T om t l pc c h a c m t c o n s t v k h n gc o n s t t n hm n gc a i n t . V i t t n hp h n gp h p i nr a c c m n g . T h c h i nl ph c c a b nt r o n gma i n( ) . T om t l pc c h a m t c h u i , v i m t c o n s t r u c t o r m k h i t oc c c h u i t i s c a n , v m t b n i n( ) c h c n n g h i nt h c h u i . T om t l pc c h a c c o n s t v k h n gc o n s t t n hm n gc a c c i t n gc a l ph c ut i n , v t n hp h n gp h p i nr a c c m n g . T pt h d c l pt h h a i n yt r o n g ma i n( ) . T om t c ut r c c c h a m t i n t v m t c o n s t r u c t o r m c n hk h i t oi n t k h n g . L mc h oc ut r c a p h n g nm t c h c n n g . T r o n gc h c n n g , t or a m t m n gc c i t n gc a b nc ut r c v c h n g mi n hr n gm i i n t t r o n gm n g t n g c k h i t ob n gk h n g . T om t l p i d i nc h om t k t n i m yi n , v c h c h op h pb nc m t m yi n . T r o n gm t t pt i nt i u , t or a m t l pg n gc c h a h a i t h n hv i nd l i u : m t c o nt r nm t g n g i t n gv m t b o o l . C u n gc pc h on h a i c ut r c : c c n h x yd n gm c n hk h i t ob o o l n gv g n gc o nt r k h n g . C c n h x yd n gt h h a i c n h m t t h a ms m t c o nt r nm t g n g i t n g , m n g i a oc h on i b c a i t n g c o nt r , n t b o o l s a i . T h m m t c h c n n gt h n hv i nk i m t r a ( ) : n uc o nt r c a i t n gl k h c k h n g , n s t r v g i t r c a t e s t ( ) c g i l t h n gq u a c o nt r . N uc o nt r l s k h n g , n t r v b o o l . B yg i t on mc p pt pt i n , m i b g mc c g n gt i u . L n g i ut i nc p pt pt i n n hn g h a t o nc uGn g i t n gs d n gc o n s t r u c t o r m c n h . C c t pt i nt h h a i k h a i b o i t n gt r o n gt pt i n ut i nn h e x t e r n, v n hn g h a m t t o nc uGn g i t n gs d n gc c n h x yd n gt h h a i , v i m t c o nt r n i t n g ut i n . H yl m i un yc h o nk h i b n t n c c t pt i nc u i c n g , c n gs c m t n hn g h a i t n gt o nc u . T r o n gt pt i n , ma i n( ) n n g i t h n g h i m ( ) c h c n n gv b oc ok t q u . N uk t q u l s t h t , t mr a c c h t h a y i t h t l i nk t c h oc c m i l i nk t c a b nv t h a y i n c h o nk h i k t q u l s a i . S a c h a c c v n t r o n gb i t p3 2 s d n gm t k t h u t t h h i nt r o n gc u ns c hn y . S a c h a c c v n t r o n gb i t p3 2 s d n gh a i k t h u t t h h i nt r o n gc u ns c hn y . N uk h n gc b a og m m t t pt i nt i u , k k h a i c h c n n g t ( ) t c c t h v i nCc h u n . G i c h c
181/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

n n gn yt c h n h( ) .

M c d t i l i ut h a mk h oc n gt nt i t r o n gP a s c a l , C++p h i nb n c l yt n g nn g A l g o l . H l r t c n t h i t t r o n gC++ h t r c c c p h pc a n h i uh n hq u t i ( x e mC h n g1 2 ) , n h n gh c n gl m t t i n c h u n g k i ms o t c c h i s c t r u y nv ov r a k h i c c c h c n n g . C h n gn y ut i ns x e mx t m t t h i g i a nn g nt i s k h c b i t g i a c o nt r t r o n gCv C++ , s a u g i i t h i ut i l i ut h a mk h o . Nh n gp h nl nc c c h n gn ys i s uv om t v n k h r c r i i v i C++m i l pt r n h : c c b ns a o x yd n g , m t n h x yd n g c b i t ( y uc ut i l i ut h a mk h o ) m l mc h om t i t n gm i t m t i t n gh i nc c a c n gl o i . B ns a o x yd n g c s d n gb i c c t r n hb i nd c h v t q u a v t r v i t n gt h e o g i t r v ov r a k h i c c c h c n n g . C u i c n g , p h nn oc h e k h u t C++c o nt r nt h n h v i nt n hn n g c c h i us n g .

C o nt r t r o n gC+ +

S k h c b i t q u a nt r n gn h t g i a c o nt r t r o n gCv n h n gn g i t r o n gC++l C++l m t n g nn g n h m n hh n . N y n gr a n i v o i d* l c l i nq u a n . Ck h n gc h op h pb nt n hc g nm t c o nt r c a m t l o i k h c , n h n gn k h n g c h op h pb nt h c h i n i un yt h n gq u a m t v o i d* . D o ,

c h i m*b ; *r ;v o i d*v ,v=rb=v ;

T i l i ut h a mk h ot r o n gC+ +

B i v t n hn n gn y" " c a Cc h op h pb n mt h m i ut r b t k l o i n h b t k l o i k h c , n l i m t l h n gl nt r o n gh t h n gk i u . C++k h n gc h op h p i un y , t r n hb i nd c hc u n gc pc h ob nm t t h n gb o l i , v n ub nt h c s mu n i x n h m t l o i k h c , b np h i l mc h on r r n g , c h a i nt r n hb i nd c h v c h on g i c , s d n gm t d nd i nv i n . ( C h n g3 g i i t h i uC++' s c i t h i n" r r n g " c p h p c . ) M t t i l i ut h a mk h o ( &) l n h m t c o nt r l i nt c c t n gd e r e f e r e n c e d . Nt h n g c s d n gc h o c c d a n hs c h i s c h c n n gv g i t r t r l i c h c n n g . Nh n gb nc n gc t h t h a mk h omi np h n g . V d ,

// :C 1 1 :F r e e S t a n d i n g R e f e r e n c e s . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; //T h n gt h a mk h om i np h i :i n ty ,i n t&r=y ; //K h im tt h a mc h i u ct or a ,n p h i // ck h it om t it n gs n g . //T u yn h i n ,b nc n gc t h n i :c o n s ti n t&q=1 2 ; //( 1 ) //T il i ut h a mk h o cg nv il ut r c an g ik h c : i n tx=0 ; //( 2 )i n t&a=x ; //( 3 )i n tm a i n( ){ c o u t< <" x= " < <x< <" ,a= "< <a< <e n d l ; m t++; c o u t< <" x= "< <x< <" ,a= "< <a< <e n d l ; } /// :~

T r o n gd n g( 1 ) , t r n hb i nd c hp h nb m t p h nd u n gl n gl ut r , k h i t on v i g i t r 1 2 , v b u c c c t h a mc h i u nn h n g o nl ut r . i uq u a nt r n gl b t k t i l i ut h a mk h op h i c g nl i nv i m t n g i n o k h c p h nl ut r . K h i b nt r u yc pm t t i l i ut h a mk h o , b n a n gt r u yc pl ut r . V v y , n u b nv i t n h n gd n gn h ( 2 ) v ( 3 ) , s a u i n c r e me n t i n gmt t h c s l c c ht n gx , n h c t h h i nt r o n g c h n h( ) . M t l nn a , c c hd n h t s u yn g h v m t t h a mc h i ul n h m t c o nt r a t h c h . M t l i t h c a " c o nt r " l b nk h n gb a og i p h i t h i l i un c k h i t o( t r n hb i nd c ht h c t h i n ) v l mt h n o t i c hc a n ( c c t r n hb i nd c hh i nn ) . C n h n gq u yt c n h t n hk h i s d n gt i l i ut h a mk h o : 1. M t t h a mc h i up h i c k h i t ok h i n c t or a . ( C o nt r c t h c k h i t ob t c l c n o . ) 2. 3. K h i m t t i l i ut h a mk h o c k h i t om t i t n g , n c t h k h n g c t h a y i c h m t i t n gk h c . ( C o nt r c t h c c h t i m t i t n gk h c b t c l c n o . ) B nk h n gt h c t i l i ut h a mk h oNU L L . B np h i l u nl u nc t h g i n hr n gm t t i l i ut h a mk h o c k t n i v i m t p h nh pp h pl ut r .


182/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

T i l i ut h a m k h ot r o n gc h cn n g
N i p h b i nn h t b ns t h yt i l i ut h a mk h ol n h i s c h c n n gv g i t r t r l i . K h i m t t i l i ut h a m k h o c s d n gn h m t t h a ms c a h m, b t k s a i c c t i l i ut h a mk h ot r o n g c h c n n gs g yr a n h n gt h a y i t r o n gl pl u nb nn g o i c c c h c n n g . T t n h i n , b nc t h l m i ut n gt b n gc c h i q u a m t c o nt r , n h n gm t t i l i ut h a mk h oc c p h ps c hh nn h i u . ( B nc t h n g h v m t t h a mc h i un h k h n gc g h nl m t t i nn g h i c p h p , n ub nmu n . ) N ub nt r v m t t i l i ut h a mk h ot m t h m, b np h i i t h e oc h ms c g i n gn h k h i b nq u a yt r l i m t c o nt r t m t h m. B t c t i l i ut h a mk h o c k t n i v i k h n gn n i x a k h i t r v c h c n n g , n uk h n g b ns c c p nb n h k h n gr . yl m t v d :
// :C 1 1 :R e f e r e n c e . c p p // ng i nC++t il i ut h a mk h o i n t*f( i n t*x ){ ( *x )++ ; xt r l i ;//a nt o n ,xl b nn g o ip h mv i n y } i n t&g( i n t&x ){ x++ ;//K tq u t n gt n h t r o n gf( ) r e t u r nx ; //a nt o n ,b nn g o ip h mv in y } i n t&h( ) { i n tq ; !// q u a yt r l iq ; //L i t n hi n tx ; r e t u r nx ;//a nt o n ,xc u cs n gb n n g o ip h mv in y } i n tm a i n( ){ i n ta=0 ; f( &a ) ;//U g l y( n h n gr r n g ) g ( a ) ; //s c h( n h n g n ) }/// :~

C c c u c g i nf ( ) k h n gc s t i nl i v s c hs c a v i c s d n gt i l i ut h a mk h o , n h n gr r n gl m t a c h a n g c t h n gq u a . T r o n gc c c u c g i ng( ) , m t a c h c t h n gq u a ( t h n gq u a m t t i l i ut h a m k h o ) , n h n gb nk h n gn h nt h yn . t i l i ut h a mk h oc o n s t i s t i l i ut h a mk h ot r o n gR e f e r e n c e . c p pc h h o t n gk h i i s l m t k h n gc o n s t i t n g . N un l m t c o n s t i t n g , c h c n n gg( ) s k h n gc h pn h nl pl u n , m t h c s l m t i ut t , b i v c h c n n g l mt h a y i c c t h a ms b nn g o i . N ub nb i t c h c n n gs t nt r n gc c c o n s t Ne s s c a m t i t n g , l m c h oc c i m t c o n s t t i l i ut h a mk h os c h op h pc c c h c n n g c s d n gt r o n gm i t n hh u n g . i u n yc n g h a r n g , c h ox yd n gt r o n gc c l o i , c c c h c n n gs k h n gt h a y i c c t h a ms , v c h on g i d n g n hn g h a c c l o i , c c c h c n n gs c h g i c o n s t c h c n n gt h n hv i n , v s k h n gt h a y i b t k c n gt h n h v i nd l i u . V i c s d n gc o n s t t i l i ut h a mk h ot r o n gc h c n n gl pl u n c b i t q u a nt r n gb i v c h c n n gc a b nc t h n h n c m t i t n gt mt h i . i un yc t h c t or a n h m t g i t r t r l i c h c n n gk h c h o c m t c c hr r n gb i n g i s d n gc h c n n gc a b n . i t n gt mt h i l u nc o n s t , v v yn ub nk h n gs d n gm t c o n s t t h a mk h o , l pl u nr n gs k h n g c c h pn h nb i c c t r n hb i nd c h . Nh m t v d r t n g i n ,
// :C 1 1 :C o n s t R e f e r e n c e A r g u m e n t s . c p p // iq u at il i ut h a mk h on h c o n s t v o i df( i n t& ){ }v o i dg( c o n s ti n t& ){ } i n tm a i n( ){ // ! f( 1 ) ;//L i g( 1 ) ; }/// :~

C c c u c g i nf ( 1 ) g yr a m t l i t h i g i a nb i nd c hb i v t r n hb i nd c h ut i np h i t or a m t t i l i u t h a mk h o . Nn h v yb n gc c hp h nb l ut r c h om t i n t , k h i t on c h om t v s nx u t c c a c h l i n k t v i c c t i l i ut h a mk h o . L ut r p h i l m t c o n s t v t h a y i n s l mc h ok h n gc n g h a b nk h n g b a og i c t h c c b nt a yc a b nt r n m t l nn a . V i t t c c c i t n gt mt h i , b np h i l mc h o c c g i n hg i n gn h a u : h k h n gt h t i pc n . Nc g i t r c h oc c t r n hb i nd c h c h ob nb i t k h i b n a n gt h a y i d l i un h v yb i v k t q u s b m t t h n gt i n . T i l i ut h a mk h oc o nt r T r o n gC , n ub nmu nt h a y i n i d u n g c ac o nt r c h k h n gp h i l n h n gg n t r t i , t u y nb c h c n n g c a b nt r n gg i n gn h : v o i df( i n t* * ) ; v b np h i l y a c h c a c o nt r k h i i q u a n t r o n g :
i n ti=4 7 ;i n t*i p=& i ;f( &I P ) ;

V i t i l i ut h a mk h ot r o n gC++ , c p h pl s c h . T h a ms c a h mt r t h n hm t t h a mc h i u nm t c o nt r , v b nk h n gc np h i l y a c h c a c o nt r . D o ,
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 183/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 1 1 :R e f e r e n c e T o P o i n t e r . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; v o i di n c r e m e n t( i n t*&i ){ i++ ; } i n tm a i n( ){ i n t*i=0 ; c o u t < <" i= "< <i< <e n d l ; t n g( i ) ; c o u t< <" i= "<< i< <e n d l ; }/// : ~

B n gc c hc h yc h n gt r n hn y , b ns c h n gmi n hc h om n hr n gc o nt r c t n gl n , k h n gp h i n h n gg n t r t i .

H n gd nl pl u n q u a
T h i q u e nb n ht h n gc a b nk h i v t q u a m t i s c h om t c h c n n gn n c i q u a c o n s t t h a mk h o . M c d l c u i un yc v n h c h l m t m i q u a nt mh i uq u ( v b nt h n gk h n gmu nq u a nt m m n hv i i uc h n hh i uq u t r o n gk h i b n a n gt h i t k v l pr pc h n gt r n hc a b n ) , c n h i u e d a : n h b ns t h yt r o n gp h nc nl i c a c h n g , m t b ns a o x yd n gl c nt h i t v t q u a m t i t n gt h e og i t r , v i un yk h n gp h i l c n oc n gc s n . C c k h o nt i t k i mh i uq u c t h l n gk c h om t t h i q u e n ng i nn h v y : v t q u a m t c u c t r a n h c i v g i t r y uc ux yd n gv h yc u c g i , n h n gn ub ns k h n gs a i c c t h a ms s a u i n g a n g q u a c o n s t t h a mk h oc h c nm t a c h yv os t a c k . T r o n gt h c t , h un h t h i g i a nd u yn h t i q u a m t a c h l k h n g t h c hh ph nl k h i b n a n g i l m t h i t h i c h om t i t n g i q u a g i t r c h l p h n gp h pa nt o n( h nl s a i c c i t n gb nn g o i , m t c i g n g i g i k h n gt h n gmo n g i ) . yl c h c a p h nt i pt h e o .

B ns a o x yd n g

B yg i b nh i un h n g i uc b nc a c c t i l i ut h a mk h ot r o n gC++ , b n s ns n g g i i q u y t m t t r o n gn h n gk h i n i mk h h i uh nt r o n gc c n g nn g : c c b ns a o x yd n g , t h n g c g i l X( X&) ( " X c a Xr e f " ) . X yd n gn yl c nt h i t k i ms o t i q u a v q u a yt r l i c a c c l o i u s e r d e f i n e dg i t r t r o n g c c c u c g i c h c n n g . Nr t q u a nt r n g , t r nt h c t , t r n hb i nd c hs t n gt n gh pm t c o p y c o n s t r u c t o r n ub nk h n gc u n gc pm t m n h , n h b ns t h y .

i q u av t r v g i t r

h i u c s c nt h i t c a c c b ns a o x yd n g , x e mx t c c hCx l i q u a v q u a yt r l i c c b i nt h e og i t r t r o n gc c c u c g i c h c n n g . N ub nt u y nb m t c h c n n gv t h c h i nc u c g i c h c n n g , l mt h n o b i nd c hb i t l mt h n o v t q u a v t r l i n h n gb i n ? Nc h c nb i t ! P h mv i c a c c l o i n p h i i p h v i q u n h c h a r , i n t , f l o a t , d o u b l e , v c c b i nt h c a h t h n gt i nn y c x yd n g v ot r n hb i nd c h . N ub nt mr a c c h t or a m l pr pv i t r n hb i nd c hc a b nv x c n hc c b oc o c t or a b i c c c u c g i c h c n n gf ( ) , b ns n h n c t n g n gv i :

i n tf( i n tx ,c h a rc ) ;i n tg=f( a ,b ) ;

y b y k m t

m tc u cg i

f( )t h m

s p , 4m o v

g , n g

M n y c l ms c h n gk l mc h on c h u n gc h u n g , c c b i ut h c bv mt s k h c n h a ut yt h u c v ov i c c c b i nt o nc u( t r o n gt r n gh p h s c _ bv _ a ) h o c a p h n g( t r n hb i nd c hs c h m c c h n gr a k h i n g nx pc o nt r ) . i un yc n g n gc h os b i uh i nc h og. S x u t h i nc a c c c u c g i nf ( ) s p h t h u c v oc h n gt r n ht n t r a n gt r c a b n , v " n gk m t " p h t h u c v oc c hg h i C P U c t t nt r o n gl pr pc a b n . L o g i c n gs a um n y , t u yn h i n , s v nn h c . T r o n gCv C++ , l pl u n ut i n c yv os t a c kt p h i s a n gt r i , s a u c h c n n gg i c t h c h i n . M g i l t r c hn h i ml ms c hc c i s r a k h i s t a c k( c h i mc h ot h ms p , 4 ) . Nh n gn h nt h yr n g v t q u a c c i s t h e og i t r , t r n hb i nd c hc h ng i nl yb nt r ns t a c kn b i t l mt h n ol nh a n gc v yn h n gl pl u nt oc c b ns a oc h n hx c c a c h n g . G i t r t r l i c a f ( ) c t t r o n gm t n gk . M t l nn a , t r n hb i nd c hb i t t t c m i t h c b i t v l o i g i t r t r v v l o i c x yd n gv on g nn g , n nt r n hb i nd c hc t h t r l i b n gc c h t n t r o n gm t n gk . V i c c k i ud l i ut r o n gC , c c h n h n g ng i ns a oc h pc c b i t c a g i t r t n g n gv i v i c s a oc h pc c i t n g . i q u av q u a yt r l i c c i t n gl n Nh n gb yg i x e mx t c c l o i n g i d n g n hn g h a . N ub nt om t l pv b nmu nv t q u a m t i t n gc a l p t h e og i t r , l mt h n ol t r n hb i nd c hp h i b i t p h i l mg ? yk h n gp h i l m t l o i c x yd n gt r o n gt r n hb i nd c h , l m t k i um b n t or a .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 184/320

08/10/2013

Suy ngh trong C + +, Vol 1

i ut r a n y , b nc t h b t uv i m t c ut r c ng i nm r r n gl q u l n t r l i t r o n gs n gk :
// :C 1 1 :P a s s i n g B i g S t r u c t u r e s . c p pc ut r cB i g{ i ; d in g y ; }B ,B 2 ; B i g f u nl n( B i gb ){ b i=1 0 0 ;//L mg t r a n hl u n } i n tm a i n( ){ B 2=b i g f u n( B ) ; }/// :~ c h a rb u f[ 1 0 0 ] ; i n t

t r l ib ;

G i i m s nl n gl pr pl m t c h t p h c t p yb i v h uh t c c t r n hb i nd c hs d n g" t r g i p " c c c h c n n gt h a yv t t t c c c c h c n n gn i t u y n . T r o n gma i n( ) , c c c u c g i nb i g f u n( ) b t un h b n c t h o nt o nb n i d u n gc a B c yv os t a c k . ( y , b nc t h t h ym t s t r n hb i nd c h n gk t i v i a c h c a n g i l nv k c ht h c c a n , s a u g i m t c h c n n gt r g i p yl nv on g nx p . ) T r o n gc c o nm t r c , yc c i s v os t a c kl t t c n h n gg c y uc ut r c k h i t h c h i nc c c u c g i c h c n n g . T r o n gP a s s i n g B i g S t r u c t u r e s . c p, t u yn h i n , b ns t h yt h m ph n h n g : a c h c a B 2 c yt r c k h i t h c h i nc u c g i , m c d n r r n gk h n gp h i l m t i s . h i un h n gg a n gx yr a y , b nc np h i h i un h n gh nc h t r nc c t r n hb i nd c hk h i n l mc h om t c u c g i c h c n n g . C h cn n gg i s t a c kk h u n g K h i t r n hb i nd c ht or a m c h om t c u c g i c h c n n g , n ut i n yt t c c c i s t r ns t a c k , s a u l m c h oc c c u c g i . B nt r o n gh m, m c t or a d i c h u y nc o nt r n g nx px u n gx a h nn a c u n gc p l ut r c h oc c b i nc c b c a h m. ( " D o wn " l t n g i y ; . M yt n hc a b nc t h t n gh o c g i mc o nt r n g nx pt r o n gm t y ) Nh n gt r o n gC A L Ll pr pn g nn g , C P U y a c h t r o n gc c m c h n gt r n hm c c c u c g i c h c n n g nt , d o R E T U R Na s s e mb l y l a n g u a g e c t h s d n g a c h t r v i mg i . a c h n yl t t n h i nt h i n gl i n g , b i v k h n gc n c h n gt r n hc a b ns b m t h o nt o n . yl t o nb k h u n gn g nx pt r n gg i n gn h s a uk h i C A L Lv p h nb l ut r b i n a p h n gt r o n gc h c n n g :


C hc nng lp lun Tr li a ch C c bin a phng

C c m c t or a c h op h nc nl i c a c c c h c n n gd k i nb n h c t r a m t c c hc h n hx c t h e oc c h n y , n c nt h nc t h c h nc c c h c n n gl pl u nv c c b i n a p h n gm k h n gc nc h mv oc c a c h t r l i . T i s g i k h i n yb n h , m l t t c m i t h c s d n gb i m t c h c n n gt r o n gq u t r n hc a c u c g i c h c n n g , k h u n g c h c n n g . B nc t h n g h r n gn h pl c g n gt r v g i t r t r ns t a c k . T r n hb i nd c hc h ng i nl c t h yn , v c c c h c n n gc t h t r l i m t k h o n gt r n g c h r a c c hx a x u n gt r o n gn g nx pg i t r t r v b t u . T i e n t r a n c y V n x yr a b i v c c h mt r o n gCv C++h t r n g t , l c c n g nn g c t i n g k d t h i . C h n g c n gh t r c h c n n gc u c g i q u y . i un yc n g h a r n gt i b t k i mn ot r o n gv i c t h c h i nm t c h n gt r n hm t g i n o nc t h x yr a m k h n gv i p h mc c c h n gt r n h . T t n h i n , n g i v i t c c d c hv t h n gx u y nn g t ( I S R ) c t r c hn h i ml uv k h i p h c l i t t c c c n gk c s d n gt r o n gc c I S R , n h n gn uc c I S Rc np h i s d n gb t k b n h t i pt c x u n gt r nc c n g nx p , i un yp h i c a nt o n i up h i l m. ( B nc t h n g h v m t I S Rn h m t c h c n n gb n ht h n gk h n gc i s v k h o n gt r n g g i t r t r v m t i t k i mv k h i p h c t r n gt h i c a C P U . M t I S Rc u c g i c h c n n g c k c hh o t b i m t s s k i np h nc n gt h a yv m t c u c g i r r n gt b nt r o n gm t c h n gt r n h . ) B yg i t n gt n gn h n gg s x yr a n um t c h c n n gb n ht h n g c g n g t r v g i t r t r ns t a c k . B nk h n gt h c h mv ob t k p h nc a c ut r c l t r nc c a c h t r l i , v v yc h c n n gs p h i t h c y c c g i t r b nd i a c h t r l i . Nh n gk h i R E T U R Na s s e mb l y l a n g u a g e c t h c h i n , c o nt r n g nx pp h i c t r n a c h t r l i ( h o c n g a yb nd i n , p h t h u c v om yt n hc a b n ) , v v yn g a yt r c k h i R E T U R N, c h c n n gp h i d i c h u y nc o nt r n g nx pl n , d o b t r t t c c a n c c b i n a p h n g . N u b n a n gc g n g t r v g i t r t r nc h n gd i a c h t r l i , b nt r n nd b t nt h n gv ot h i i m b i v m t g i n o nc t h i c n g . I S Rs d i c h u y nc o nt r n g nx px u n g g i a c h c a n t r l i v b i n a p h n gv g h i l ng i t r t r v c a b n . g i i q u y t v n n y , n g i g i c t h c h ut r c hn h i mp h nb t h md u n gl n gt r nc c n g nx pc h oc c g i t r t r l i t r c k h i g i h m. T u yn h i n , Ck h n g c t h i t k t h e oc c hn y , v C++p h i p h h p . Nh b ns t h yn g a y , C++ , b i nd c hs d n gm t c h n gt r n hh i uq u h n . t n gt i pt h e oc a b nc t h t r v g i t r t r o n gm t s k h uv c d l i ut o nc u , n h n g i un yk h n gl m v i c , h o c . R e e n t r a n c yc n g h a l b t k c h c n n gc t h l m t t h i q u e ng i n o nc h ob t k c h c n n g k h c , b a o g mc c c h c n n g t n g t m b n a n g b nt r o n g . V v y , n ub n t g i t r t r v t r o n gm t k h uv c t o n


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 185/320

08/10/2013

Suy ngh trong C + +, Vol 1

c u , b nc t h t r l i v oc c c h c n n gt n gt , t r o n g s g h i l ng i t r t r v . C n gm t l o g i c pd n g c h o q u y . N i d u yn h t a nt o n t r v g i t r l t r o n gs n gk , v v yb nt r l i v n p h i l mg k h i n gk l k h n g l n g i g i t r t r v . C ut r l i l t h c y a c h c a i m ng i t r t r v n g nx pl m t t r o n gn h n gc h c n n gl pl u n , v c h oc c c h c n n gs a oc h pc c t h n gt i nt r l i t r c t i pv o i m n . i un yk h n gc h g i i q u y t t t c c c v n , l h i uq u h n . c n gl l d o , t r o n g P a s s i n g B i g S t r u c t u r e s . c p, t r n hb i nd c h y a c h c a p B 2 t r c k h i c c c u c g i nb i g f u n( ) t r o n g ma i n( ) . N ub nn h nv os nl n gl pr pc h ob i g f u n( ) , b nc t h n h nt h yn c n i s nn yv t h c h i nc c b ns a oc h oc c i m nt r o n g c c c h c n n g . B i t c o p ys ov i k h i t o C h o nn a y , n h v yt t . C m t q u t r n hh o nt o nk h t h i t h n gq u a v t r v c ut r c ng i nl n . Nh n gn h nt h yr n gt t c c c b nc m t c c h s a oc h pc c b i t t m t n i k h c , m c h c c h nh o t n gt t c h oc c hn g u y nt h ym Cn h nv oc c b i n . Nh n gt r o n gC++ i t n gc t h p h c t ph nn h i us ov i m t b nv c a c c b i t , h c n g h a . n g h a n yc t h k h n g p n g c v i c h b i t c a n c s a o c h p . H yx e mx t m t v d ng i n : m t l ph c m b i t b a on h i u i t n gc a k i uc a n t nt i c n gm t l c . T c h n g1 0 , b nb i t c c h l m i un yl b n gc c hb a og m m t t n ht h n hv i nd l i u :
// :C 1 1 :H o w M a n y . c p p //M tl ph cc t n h it n gc an #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ;o f s t r e a mr a ( " H o w M a n y . o u t " ) ; l ph o w m a n y{ s t a t i ci n to b j e c t C o u n t ,c n gc h n g : H o w m a n y( ){ o b j e c t C o u n t++ ; } v o i di n( c o n s ts t r i n g&m s g=" " ){ i f( m s g . s i z e ( )=0 ! )r a< <m s g< <" : " ; r a< <" o b j e c t C o u n t= " < <o b j e c t C o u n t< <e n d l ; } ~h o w m a n y( ){ o b j e c t C o u n t; p r i n t( " ~h o w m a n y ( ) " ) ; } } ; i n th o w m a n y: :o b j e c t C o u n t=0 ; //P a s sv t r l iG I T R : H o w m a n yf( h o w m a n yx ){ x . p r i n t( " xl u nt r o n gf( ) " ) ; r e t u r nx ; } i n tm a i n( ){ h o w m a n yh ; H o w m a n y: :i n( " s a uk h ix yd n gh " ) ; H o w m a n yh 2=f( h ) ; H o w m a n y: :i n( " s a uk h ic u cg i nf( ) " ) ; }/// :~

L ph o wma n yc h a m t t n hi n t o b j e c t C o u nv tt n ht h n hv i nc h c n n gi n( ) b oc og i t r m o b j e c t C o u n t , c n gv i m t i s t i nn h nt yc h n . S g i a t n gx yd n gs l n gm i l nm t i t n g c t or a , v d e c r e me n t s h yn . S nl n g , t u yn h i n , k h n gp h i l n h n gg b nmo n g i :
s a uk h ix yd n gh :o b j e c t C o u n t=1xl u nt r o n gf( ) :o b j e c t C o u n t=1~h o w m a n y ( ) :o b j e c t C o u n t=0s a uk h ic u cg i nf( ) :o b j e c t C o u n t=0~h o w m a n y( ) : o b j e c t C o u n t=1 ~H o w m a n y( ) :o b j e c t C o u n t=2

S a uk h i h c t or a , s l n g i t n gl m t , l t t . Nh n gs a uk h i c c c u c g i nf ( ) b ns mo n g i c m t s i t n gc a h a i , b i v h 2 l b yg i t r o n gp h mv i l t t . T h a yv o , t n hl s k h n g , m c h r a m t c i g i s a i l mk h n gk h i p . i un y c x c n h nb i m t t h c t l h a i h mh y c u i l mc h o s i t n g i t i uc c , m t c i g m k h n gb a og i n nx yr a . X e mx t c c i mt r o n gf ( ) , x yr a s a uk h i c c i s c t r u y nt h e og i t r . i un yc n g h a c c i t n g b a n uht nt i b nn g o i k h u n gc h c n n g , v c t h m m t i t n gt r o n g k h u n gc h c n n g , l b ns a o c t h n gq u a g i t r . T u yn h i n , l pl u n c t h n gq u a s d n gk h i n i mn g u y nt h yc a Cc a b i t c o p y i n g , t r o n gk h i ++Ch o wma n yl py uc uk h i t ot h c s d u yt r t n ht o nv nc a n , v v y b i t c o p ym c n hk h n gs nx u t h i uq u mo n gmu n . K h i c c i t n g a p h n g i r a k h i p h mv i c u i c a c c c u c g i nf ( ) , c c d e s t r u c t o r c g i , d e c r e me n t s o b j e c t C o u n t , v v yn g o i c h c n n g , o b j e c t C o u n t l s k h n g . V i c t or a c c h 2 c n g c t h c h i nb n gc c hs d n gb i t c o p y , v v yc c n h x yd n gk h n g c g i l c m t t r o n gh a i , v k h i hv h 2 i r a k h i p h mv i , h mh yc a h g yr a c c g i t r t i uc c c a o b j e c t C o u n t .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 186/320

08/10/2013

Suy ngh trong C + +, Vol 1

C o p y x yd n g
V n x yr a b i v t r n hb i nd c hs m c n hn h t h n o t or a m t i t n g m i t m t i t n g h i nt i . K h i b nv t q u a m t i t n gt h e og i t r , b nt om t i t n gm i , c c i t n gt h n gq u a t r o n gk h u n k h c h c n n g , t m t i t n gh i nc , i t n gb a n un g o i k h u n gc h c n n g . yc n gl t h n g n g k h i t r v m t i t n gt m t h m. T r o n gb i ut h c
H o w m a n yh 2=f( h ) ;

h 2 , m t i t n gt r c yu n c o n s t r u c t e d , c t or a t c c g i t r t r l i c a f ( ) , l i m t i t n gm i c t or a t m t t r o n gh i nt i . G i n hc a t r n hb i nd c hl b nmu nt h c h i ns n gt on ys d n gm t b i t c o p y , v t r o n gn h i ut r n gh p , i un yc t h l mv i c t t , n h n gt r o n gh o wma n yn k h n gb a yv n g h a c a k h i t ov t x a c h ng i nl s a oc h p . M t v d p h b i nx yr a n uc c l pc c h a c o nt r l mn h n gg h c h r a , v b nn ns a oc h p c h n gh o c c h n gs c k t n i v i m t s p h nm i c a b n h ? Ma ym nt h a y , b nc t h c a nt h i pv oq u t r n hn yv n g nc h nc c t r n hb i nd c ht l m m t b i t c o p y . B n l m i un yb n gc c hx c n hc h c n n gc a r i n gb n c s d n gb t c k h i n ot r n hb i nd c hc n p h i l mc h om t i t n gm i t m t i t n gh i nc . L o g i c , b n a n gl mc h om t i t n gm i , c h c n n gn yl m t n h x yd n g , v c n gh pl , c c i s d u yn h t x yd n gn y l mv i c c i t n gb n a n gx yd n gt . Nh n g i t n gk h n gt h c t h n gq u a v oc c n h x yd n gt h e og i t r b i v b n a n gc g n g x c n h c c c h c n n gx l i n g a n gq u a g i t r , v c p h pn k h n gc n g h a v t q u a m t c o nt r b i v , s a uk h i t t c , b n a n gt o i t n gm i t m t i t n gh i nc . y , t i l i u t h a mk h o n g i i c u , v v yb nc t i l i ut h a mk h oc a i t n gn g u n . C h c n n gn y c g i l b n s a o x y d n g v t h n g c g i l X( X&) , l s x u t h i nc a m n hc h om t l p c g i l X. N ub nt om t b ns a o x yd n g , t r n hb i nd c hs k h n gt h c h i nm t b i t c o p yk h i t om t i t n gm i t m t t r o n gh i nt i . Ns l u nl u ng i s a oc h px yd n gc a b n . V v y , n ub nk h n gt or a m t c o p y c o n s t r u c t o r , t r n hb i nd c hs l m i ug h pl , n h n gb nc s l a c h nl yq u y nk i ms o t t o nb q u t r n h . B yg i n c t h s a c h a c c v n t r o n gHo wMa n y . c p p:


// :C 1 1 :H o w M a n y 2 . c p p //B ns a o x yd n g #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ;o f s t r e a mr a ( " H o w M a n y 2 . o u t " ) ; l pH o w M a n y 2{ s t r i n gn a m e ;// it n gn h nd n g t n hi n t o b j e c t C o u n t ,c n gc h n g : H o w M a n y 2( c o n s ts t r i n g&i d=" " ) :t n( i d ){ ++O b j e c t C o u n t ; p r i n t( " H o w M a n y 2( ) " ) ; } ~H o w M a n y 2( ){ -o b j e c t C o u n t ; p r i n t( " ~H o w M a n y 2( ) " ) ; } //B ns a o x yd n g : H o w M a n y 2( c o n s tH o w M a n y 2&h ) :t n( h . n a m e ){ t n+=" b ns a o " ; ++ o b j e c t C o u n t ; p r i n t( " H o w M a n y 2( c o n s tH o w M a n y 2& ) " ) ; } v o i dp r i n t( c o n s ts t r i n g&m s g=" " )c o n s t{ i f( m s g . s i z e( )=0 ! ) r a< <m s g< <e n d l ; r a< <' \t '< <t n< <" : " < <"o b j e c t C o u n t=" < <O b j e c t C o u n t< <e n d l ; } } ; i n tH o w M a n y 2: :o b j e c t C o u n t=0 ;//P a s sv t r l iG I T R : H o w M a n y 2f( H o w M a n y 2x ){ x . p r i n t( " xl u nt r o n gf( ) " ) ; r a< <" T r v t f( ) "< <e n d l ; r e t u r nx ; } i n tm a i n( ){ H o w M a n y 2h( " h " ) ; r a< <" B cv of( ) "< <e n d l ; H o w M a n y 2h 2 =f( h ) ; h 2 . p r i n t( " h 2s a uk h ic u cg i nf( ) " ) ; r a< <" G if( ) ,k h n gc g i t r t r v "< <e n d l ; f( h ) ; r a< <" S a uk h ic u cg i nf( ) "< <e n d l ; }/// :~

C m t s t h a y i m i n mv o y b nc t h c c m t t n gt t h nv n h n gg a n gx yr a . u t i n , c c c h u i t n n gv a i t r n h m t n hd a n h i t n gk h i t h n gt i nv i t n g c i n . T r o n gc c n h x yd n g , b nc t h t m t c h u i n hd a n h( t h n gl t nc a i t n g ) c s a oc h p t t nb n gc c h s d n gc h u i n h x yd n g . M c n h=" " t or a m t s np h mn oc h u i . G i a t n gc c n h x yd n gc c o b j e c t C o u n t n h t r c , v d e c r e me n t s h yn . T i pt h e ol c c b ns a o x yd n g , Ho wMa n y 2 ( c o n s t Ho wMa n y 2 &. ) B ns a o x yd n gc t h t or a m t i t n gm i c h t s nc , d o , t n i t n gh i nt i c s a oc h pv ot n, t h e os a ul t " b ns a o " b nc t h n h nt h yn i n nt u . N ub nn h nk , b ns t h yr n gc c c u c g i t n( h . n a me t r o n gc c n h x y d n g) d a n hs c hk h i t o c t h c s k ug i c c c h u i s a oc h px yd n g .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 187/320

08/10/2013

Suy ngh trong C + +, Vol 1

T r o n gc c b ns a o x yd n g , s l n g i t n g c t n gl nc h v n l t r o n gc c n h x yd n gb n ht h n g . i un yc n g h a l b ns n h n c m t s i t n gc h n hx c k h i i q u a v t r v g i t r . C c i n( ) c h c n n g c s a i i nr a m t t i nn h n , n h nd n g i t n g , v s l n g i t n g . Nb y g i p h i t r u yc pv ot nd l i uc a m t i t n gc t h , v v yn k h n gc nc t h l m t t n hh mt h n h v i n . T r o n gma i n( ) , b nc t h t h ym t c u c g i t h h a i f ( ) c t h mv o . T u yn h i n , l i k ug i n ys d n gp h n gp h pt h n gt h n gt r o n gCb q u a g i t r t r v . Nh n gb yg i m b nb i t l mt h n og i t r c t r v ( c n g h a l , m t r o n g c c c h c n n gx l c c q u t r n ht r l i , a k t q u t i m t a i mc a c h c t h n gq u a n h l m t t h a ms n ) , b nc t h t h i i ug s x yr a k h i g i t r t r l i c b q u a . ur a c a c h n gt r n hs n m m t s n hs n gt r nn y . T r c k h i h i nt h ur a , yl m t c h n gt r n hn h m s d n gi o s t r e a ms t h ms d n gc h ob t k t pt i n :
// :C 1 1 :L i n e n u m . c p p//{ T }L i n e n u m . c p p //T h ms d n g #B a og m" . ./R e q u i r e . h " #B a og m< v e c t o r > #I n c l u d e #B a og m< f s t r e a m > #I n c l u d e#i n c l u d e< c m a t h >s d n gt nm i nk h n gg i a nt i u c h u n ; i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ r e q u i r e A r g s( a r g c ,1 ," C c hs d n g :l i n e n u mt p t i n\n " " T h ms d n gv ot pt i n " ) ; i f s t r e a mt r o n g( a r g v[ 1 ] ) ; mb o( t r o n g , a r g v[ 1 ] ) ; n gd y , n g< s t r i n g >v e c t o r , t r o n gk h i( g e t l i n e( t r o n g ,d n g ) )// ct r o n gt o nb t pt i n l i n e s . p u s h _ b a c k( l i n e ) ; i f( l i n e s . s i z e( )= =0 )r e t u r n0 ; i n tn u m=0 ; //S d n gt r o n gt pt i nx c n hc h i ur n g : c o n s ti n tw i d t h=i n t( l o g 1 0( l i n e s . s i z e ( ) ) )+1 ; f o r( i n ti=0 ;i< l i n e s . s i z e( ) ;i++ ){ c o u t . s e t f(i o s: :p h i ,i o s: : a d j u s t f i e l d ) ; c o u t . w i d t h( c h i ur n g ) ; c o u t< <++n u m< <" ) "< <d n g[ i ]< <e n d l ; } }/// :~

T o nb t pt i n c c v om t < s t r i n g >v e c t o r , s d n gm t n gt m b n n h nt h yt r c t r o n g c u ns c h . K h i i nc c s d n g , c h n gt i mu nt t c c c d n g c l i nk t v i n h a u , v i un y i h i p h i i uc h n hc h os d n gt r o n gt pt i ns a oc h o r n gc h op h pc c s d n gp h h p . C h n gt a c t h d d n g x c n hs l n gc c d n gs d n gv e c t o r : : k c ht h c ( , n h n gn h n gg c h n gt i ) t h c s c np h i b i t l l i uc h n1 0 d n g , 1 0 0 d n g , 1 . 0 0 0 d n g , v vN ub nl yl o g a r i t , c s 1 0 , c a s l n gc c d n gt r o n gt pt i n , c t n nm t i n t v t h m m t g i t r , b ns t mr a c h i ur n gt i a s d n gc a b ns c . B ns n h nt h ym t v i c u c g i l b nt r o n gc h ov n gl p : s e t f ( ) v c h i ur n g( ) . yl n h n go s t r e a mc u c g i c h op h pb nk i ms o t , t r o n gt r n gh pn y , s b i nmi n hv c h i ur n gc a ur a . T u yn h i n , h p h i c g i l m i l nm t d n gl ur a v l l d ot i s a oh l b nt r o n gc h ov n gl p . T p2 c a c u ns c h n yc c m t c h n gg i i t h c hi o s t r e a ms s c h ob nb i t t h mv c c c u c g i c n gn h n h n gc c hk h c k i ms o t i o s t r e a ms . K h i L i n e n u m. c p p c pd n gc h oHo wMa n y 2 . o u t , k t q u l


1 )H o w M a n y 2( ) 2 )h :o b j e c t C o u n t=1 3 )B cv of( ) 4 )H o w M a n y 2( c o n s tH o w M a n y 2& ) 5 )B ns a oh :o b j e c t C o u n t=2 6 )xl u nt r o n gf( ) 7 ) hs a o :o b j e c t C o u n t=2 8 )T r v t f( ) 9 ) H o w M a n y 2( c o n s tH o w M a n y 2& ) 1 0 )b ns a ob ns a oh :o b j e c t C o u n t=3 1 1 ) ~H o w M a n y 2( ) 1 2 )b ns a oh :o b j e c t C o u n t=2 1 3 )h 2s a uk h ic u cg i nf( ) 1 4 )b ns a ob ns a oh :o b j e c t C o u n t=2 1 5 )G if( ) ,k h n gc g i t r t r v 1 6 )H o w M a n y 2( c o n s tH o w M a n y 2& ) 1 7 )b ns a oh :o b j e c t C o u n t=31 8 )xl u nt r o n gf( ) 1 9 ) b ns a oh :o b j e c t C o u n t=32 0 )T r v t f( ) 2 1 )H o w M a n y 2( c o n s tH o w M a n y 2& )
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 188/320

08/10/2013

Suy ngh trong C + +, Vol 1

2 2 ) 2 3 ) 2 4 ) 2 5 ) 2 6 ) 2 7 ) 2 8 ) 2 9 ) 3 0 ) 3 1 )

b ns a ob ns a oh :o b j e c t C o u n t=4 ~H o w M a n y 2( ) b ns a oh :o b j e c t C o u n t=3 ~H o w M a n y 2( ) b ns a ob ns a oh :o b j e c t C o u n t=2 S a uk h ic u cg i nf( ) ~H o w M a n y 2( ) b ns a ob ns a oh :o b j e c t C o u n t=1 ~H o w M a n y 2( ) h :o b j e c t C o u n t=0

Nh b nmo n g i , i u ut i nm x yr a l c c n h x yd n gb n ht h n g c g i l c h oh, c n g h a l t n g i t n g m nm t . Nh n gs a u , n h f ( ) c n h pv o , s a oc h px yd n g a n gl n gl g i l b i t r n h b i nd c h t h c h i nc c p a s s b y g i t r . M t i t n gm i c t or a , l b ns a oc a h( d o t n" hb n s a o " ) b nt r o n gk h u n gc h c n n gc a f ( ) , v v ys l n g i t n gt r t h n hh a i , l c hs c a c c b ns a o x y d n g . D n gt mt h ys k h i uc a s t r l i c a f ( ) . Nh n gt r c k h i c c b i n a p h n g" hb ns a o " c t h b p h h y( n i r a k h i p h mv i c u i c a c h c n n g ) , n p h i c s a oc h pv og i t r t r v , m s x yr a l h 2 . M t i t n gt r c yu n c o n s t r u c t e d( h 2 ) c t or a t m t i t n gh i nc ( c c b i n a p h n gt r o n gf ( ) ) , n nd n h i nc c b ns a o x yd n g c s d n gl i t r o n g n gc h n . B yg i t nt r t h n h" hb ns a ob n s a o " c h oh 2 n hb i v n a n g c s a oc h pt c c b ns a o l c c i t n g a p h n gt r o n gf ( ) . S a uk h i i t n g c t r l i , n h n gt r c k h i c h c n n gk t t h c , s l n g i t n gt r n nt mt h i b a , n h n gs a u c c i t n g a p h n g" hb ns a o " b p h h y . S a uk h i c c c u c g i nf ( ) h o nt h n ht r o n gd n g1 3 , c h c h a i i t n g , hv h 2 , v b nc t h t h yr n gh 2 t h c s k t t h c n h " hb ns a ob ns a o . " i t n gt mt h i D n g1 5 b t uc c c u c g i nf ( h ) , l nn yb q u a c c g i t r t r v . B nc t h n h nt h yt r o n gd n g1 6 l b ns a o x yd n g c g i n h t r c v t q u a i s i nV c n gn h t r c y , d n g2 1 c h ot h yc c b n s a o x yd n g c g i l c h og i t r t r v . Nh n gc o p y c o n s t r u c t o r p h i c m t a c h l mv i c t r nn h l i m nc a n ( m t n yc o nt r ) . N i k h n g a c h n y nt u ? Nc h r a c c t r n hb i nd c hc t h t or a m t i t n gt mt h i b t c k h i n on c nm t n hg i n gm t b i ut h c . T r o n gt r n gh pn yn t or a m t t r o n gn h n gb nt h mc h k h n gn h nt h yh n h n gn h l i m nc h oc c g i t r t r v b q u a c a f ( ) . C u c i c a i t n gt mt h i n yl c n gn g nc n gt t c n h q u a nk h n g c l nx nv i t mt h i c h i c p h h yv c h i mt i n g u y nc g i t r . T r o n gm t s t r n gh p , t mt h i n g a yl pt c c t h c t h n gq u a v i c h c n n gk h c , n h n gt r o n gt r n gh pn yl k h n gc nt h i t s a uk h i c c c h c n n gg i , v v yn g a yk h i g i c h c n n gk t t h c b n gc c hg i h yc a i t n g a p h n g( d n g2 3 v 2 4 ) , c c i t n gt mt h i b p h h y( d n g2 5 v 2 6 ) . C u i c n g , t r o n gd n g2 8 3 1 , c c h 2 i t n gb t i ud i t , t i pt h e ol h, v s i t n g i m t c c hc h n hx c t r l i b n gk h n g .

S a oc h p m c n h x yd n g

B i v c c c s a oc h px yd n gv t q u a v t r v g i t r , i uq u a nt r n gl t r n hb i nd c ht or a m t c h ob n t r o n gt r n gh pc ut r c ng i nh i uq u , i ut n gt n t r o n gC . T u yn h i n , t t c c c b n n h nt h y c h o nn a yl m c n hh n hv i n g u y nt h y : m t b i t c o p y . K h i c c l o i p h c t ph nc l i nq u a n , C++ , t r n hb i nd c hs v nt n gt om t b ns a o x yd n gn ub n k h n gl m m t . M t l nn a , t u yn h i n , m t b i t c o p yk h n gc n g h a , b i v n k h n gn h t t h i t p h i t h c h i n c c n g h a t h c hh p . D i yl m t v d c h ot h yc c ht i pc nt h n gmi n hh nc c t r n hb i nd c hc . G i s b nt om t l pm i b a og mc c i t n gc a m t s l ph c h i nc . i un y c g i l , t h c hh p , t h n h p h n, v l m t t r o n gn h n gc c hb nc t h l mc h oc c l pm i t c c l ph c h i nc . B yg i m t v a i t r c a m t n g i d n gn g yt h a i a n gc g n gg i i q u y t v n m t c c hn h a n hc h n gb n gc c ht or a m t l pm i t h e oc c hn y . B nk h n gb i t v s a oc h px yd n g , d o b nk h n gt or a m t . V d c h ot h y n h n gg c c t r n hb i nd c hn ot r o n gk h i t os a oc h pm c n h x yd n gc h ol pm i c a b n :

// :C 1 1 :D e f a u l t C o p y C o n s t r u c t o r . c p p //T n gt or ac cb ns a o x yd n g #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; l pW i t h C C{ //V ic n gc h n gb ns a o x yd n g : //R r n gc o n s t r u c t o rm c n hy uc u : W i t h C C( ){ } W i t h C C( c o n s tW i t h C C& ){ c o u t< <" W i t h C C( W i t h C C& ) "< < e n d l ; }
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 189/320

08/10/2013

Suy ngh trong C + +, Vol 1

} ; l pW o C C{ //N uk h n gc b ns a o x yd n g c h u ii d ,c n gc h n g : W o C C( c o n s ts t r i n g&i d e n t=" " ) :i d( i d e n t ){ } v o i dp r i n t( c o n s ts t r i n g&m s g=" " ) { c o n s t n uc o u t< <m s g< <" : " ;( m s g . s i z e( )=0 ) c o u t< <i d< <e n d l ; } } ; l pc o m p o s i t e{ W i t h C Cw i t h c c ;//n h n g it n g W o C Cw o c c ,c n gc h n g : T n gh p( ) :w o c c( " C o m p o s i t e( ) " ){ } v o i dp r i n t( c o n s ts t r i n g&m s g=" " ){ c o n s t w o c c . p r i n t( m s g ) ; } } ; i n tm a i n( ){ c o m p o s i t ec ; c . p r i n t( " N id u n gc " ) ; c o u t< <" k ug it n gh ps a oc h px yd n g " < < e n d l ; T n gh pc 2=c ; //c u cg ib ns a o x yd n g c 2 . p r i n t( " N id u n gc ac 2 " ) ; }// / :~

L pWi t h C Cc h a m t b ns a o x yd n g , m c h ng i nt h n gb or n gn c g i l , v i un ys t r v m t v n t h v . T r o n gl pc o mp o s i t e , m t i t n gc a Wi t h C C c t or a s d n gm t c o n s t r u c t o r m c n h . N uk h n gc n h n gn h x yd n g t t c t r o n gWi t h C C, t r n hb i nd c hs t n gt or a m t c o n s t r u c t o r m c n h , s k h n gp h i l mg t r o n gt r n gh pn y . T u yn h i n , n ub nt h m m t b ns a o x y d n g , b n n i v i t r n hb i nd c hb ns x l s n gt ox yd n g , d o , n k h n gc nt or a m t c o n s t r u c t o r m c n hc h ob nv s p h nn nt r k h i b nt or a m t c o n s t r u c t o r m c n hn h c t h c h i nc h o Wi t h C C. L pWo C Ck h n gc b ns a o x yd n g , n h n gx yd n gc a n s l ut r t i nn h nt r o n gn i b c h u i c t h c i nb n gc c hs d n gi n( ) . X yd n gn y c g i m t c c hr r n gt r o n gh nh pl d a n hs c hk h i t o x yd n g( m t t h i g i a nn g ng i i t h i ut r o n gc h n g8 v b p t r o n gC h n g1 4 ) . L d oc h o i un yt r n nr r n gs a u . L pc o mp o s i t e c c c i t n gt h n hv i nc a c h a i Wi t h C Cv Wo C C( l uc c i t n gn h n gwo c c c k h i t ot r o n gd a n hs c hx yd n g k h i t o , v n p h i ) , v k h n gx c n hr r n gb ns a o x yd n g . T u y n h i n , t r o n gc h n h( ) m t i t n g c t or a b n gc c hs d n gb ns a o x yd n gt r o n g n hn g h a :


T n gh pc 2=c ;

B ns a o x yd n gc h oh nh p c t or a t n gb it r n hb i nd c h , v ur a c a c h n gt r n ht i t l c c h m n c t or a :
N id u n gc ac :C o m p o s i t e( ) G it n gh ps a oc h px yd n g W i t h C C( W i t h C C& ) N id u n gc ac 2 :C o m p o s i t e( )

t or a m t b ns a o x yd n gc h om t l pc s d n gt h n hp h n( v t h a k , c g i i t h i ut r o n gc h n g 1 4 ) , t r n hb i nd c h q u yg i l s a oc h px yd n gc h ot t c c c i t n gt h n hv i nv c c l ph c c s . C n g h a l , n u i t n gt h n hv i nc n gc m t i t n gk h c , n s a oc h px yd n gc n g c g i . V v y , t r o n gt r n gh pn y , t r n hb i nd c hg i l s a oc h px yd n gc h oWi t h C C. ur a c h on h x yd n gn y c g i . V Wo C Ck h n gc c o p y c o n s t r u c t o r , t r n hb i nd c ht or a m t c h on m c h t h c h i nm t b i t c o p y , v g i l b nt r o n gh nh ps a oc h px yd n g . C c c u c g i nt n gh p: : i n( t r o n gc h n gt r n hc h n h m i un yx yr a b i v ) c c n i d u n gc a c 2 . wo c c c t r n gv i c c n i d u n gc a c . wo c c . Qu t r n ht r n h b i nd c h i q u a t n gh pm t b ns a ox yd n g c g i m e m b e r w i s e k h i t o . Nl u nl u nt t n h t t or a b ns a oc a c h n h x yd n gc a b nt h a yv c h oc c t r n hb i nd c hl m i u c h ob n . i un y mb or n gn s c d i s k i ms o t c a b n .

L ac h nt h a yt h s a oc h px yd n g

T i t h i i mn y uc a b nc t h b i , v b nc t h t h i l mt h n ob nc t h c t h v i t m t g i a i c pc n g n h nm k h n gb i t v c c b ns a o x yd n g . Nh n gh yn h : B nc nm t b ns a o x yd n gc h n ub n a n g i v t q u a m t i t n gc a l ph c c a b nt h e o g i t r . N u i u k h n gb a og i x yr a , b nk h n gc n p h i c c o p y c o n s t r u c t o r . Ng nc h np a s s b y g i t r " Nh n g , " b nn i , " n ut i k h n gt om t b ns a o x yd n g , t r n hb i nd c hs t or a m t c h ot i . V v y , l mt h n o t i b i t r n gm t i t n gs k h n gb a og i c t h n gq u a g i t r ? " C m t k t h u t ng i n n g nn g a p a s s b y g i t r : k h a i b om t t i ns a oc h px yd n g . B nt h mc h k h n g c np h i t or a m t n hn g h a , t r k h i m t t r o n gc c c h c n n gt h n hv i nc a b nh o c m t n g i b nc h c n n gc nt h c h i nm t p a s s b y g i t r . N un g i d n gc g n g v t q u a h o c t r l i v t g i t r , t r n hb i n d c hs t or a m t t h n gb ol i b i v b ns a o x yd n gl t i n. Nk h n gc nc t h t or a m t b ns a om c n h x yd n gb i v b n q u y n hr r n gr n gb n a n gd n gh nc n gv i c .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

190/320

08/10/2013

Suy ngh trong C + +, Vol 1

yl m t v d :
// :C 1 1 :N o C o p y C o n s t r u c t i o n . c p p //N g nc h ns a oc h px yd n g l pN o C C{ i n ti ; N o C C( c o n s tN o C C& ) ;//K h n gc n gk h a i n hn g h a : N o C C( i n ti i=0 ) :i( i i ){ } } ; v o i df( N o C C ) ; i n tm a i n( ){ N o C Cn ; // !f( n ) ;//L i :s a oc h px yd n g cg il // !N o C C2=n ;//L i :c cg il // !N o C CN 3( n ) ;//L i :c cg i }/// :~

Nh nt h yv i c s d n gc c h n ht h c t n gq u t h n
N o C C( c o n s tN o C C& ) ;s d n gc o n s t .

C h cn n gs a i i t n gb nn g o i C p h pt h a mc h i ul p s d n gh ns ov i c p h pc o nt r , n h n gn m m yn g h a c h on g i c . V d , t r o n gc c t h v i ni o s t r e a ms m t p h i nb nq u t i c a g e t ( ) c h c n n gc m t c h a r &n h m t t h a ms , v t o nb c c i mc h c n n gl t h a y i i s c a n b n gc c hc h nk t q u c a s n h n c ( ) . T u yn h i n , k h i b n c m s d n gc h c n n gn yn k h n gp h i n g a yl pt c r r n gc h ob nr n gc c i t n gb nn g o i a n g c s a i : T h a yv o , c c c u c g i c h c n n gt r n gg i n gn h m t p a s s b y g i t r , t r o n g c h ot h yc c i t n gb n n g o i l k h n g t h a y i . B i v i un y , n c t h l a nt o nh nt m t q u a n i md u yt r m s d n gc o nt r k h i b n a n g i q u a a c h c a m t i s t h a y i . N ub nl u nl u nv t q u a c c a c h n h c o n s t t i l i ut h a mk h o, t r k h i b n c n ht h a y i c c i t n gb nn g o i t h n gq u a a c h , n i b n i q u a k h n gc o n s t c o nt r , s a u m c a b nl d d n gh nc h on g i c l mt h e o .

c h a rc ;c i n . g e t( c ) ;

C o nt r t i c ct h n hv i n

M t c o nt r l m t b i nc h a a c h c a m t s v t r . B nc t h t h a y i n h n gg m t c o nt r c h nt r o n gt h i g i a nc h y , v c h nc a c o nt r c t h l d l i uh o c m t c h c n n g . C++ c o nt r nt h n h v i ns a uk h i n i mn yt n gt , n g o i t r n h n gg n c h nm t v t r b nt r o n gm t l ph c . C c v n yl m t c o nt r c nm t a c h , n h n gk h n gc " a c h " b nt r o n gm t l p , l a c h nm t t h n h v i nc a m t l pc n g h a l b pv ol p . B nk h n gt h t or a m t a c h t h c t c h o nk h i b nk t h p b pb n gc c a c h b t uc a m t i t n gc t h . C p h pc a c o nt r c h oc c t h n hv i ny uc ub n c h nm t i t n gc n gm t l c b n a n gd e r e f e r e n c i n gc o nt r t h n hv i n . h i u c c p h pn y , h yx e mx t m t c ut r c ng i n , v i m t c o nt r s pv m t i t n g c h oc u t r c n y . B nc t h c h nt h n hv i nv i c p h pt h h i n :

// :C 1 1 :S i m p l e S t r u c t u r e . c p pc ut r c ng i n{ i n ta ; }i n tm a i n( ){ ng i nn h v y ,*s p=& s o ; s p >a ; s o . a ; }/// :~

B yg i g i s b nc m t c o nt r b n ht h n g nm t s n g u y n , i p. t r u yc pn h n gg i p c t r n , b n d e r e f e r e n c e c o nt r v i m t ' * ' :
*I p=4 ;

C u i c n g , h yx e mx t n h n gg s x yr a n ub nc m t c o nt r i u x yr a t r nm t c i g b n t r o n gm t l p i t n g , t h mc h n un k h n gt h c s i d i nc h om t b pv oc c i t n g . t r u yc p n h n gg n c h v o , b np h i d e r e f e r e n c e n v i * . Nh n gn l m t b pv om t i t n g , d o b n c n gp h i c p n i t n gc t h . Nh v y , * c k t h pv i c c i t n gt i c h . V v y , c c c p h p m i t r t h n h>* c h om t c o nt r nm t i t n g , v * . c h o i t n gh o c m t t i l i ut h a mk h o , n h t h n y :
o b j e c t P o i n t e r >*p o i n t e r T o M e m b e r=4 7 ; . it n g*p o i n t e r T o M e m b e r=4 7 ;

B yg i , c c c p h p x c n hn h n gg l p o i n t e r T o Me mb e ? G i n gn h b t k r c o nt r , b nc t h n i n h n g g l o i n c h v o , v b ns d n gm t * t r o n g n hn g h a . S k h c b i t d u yn h t l b np h i n i n h n gg l ph c c ac c i t n gn yt r nt h n hv i n c s d n gv i . T t n h i n , i un y c t h c h i nv i t nc al pv c c n h i uh n hc p h ng i i p h mv i . D o , i n to b j e c t C l a s s: :*p o i n t e r T o M e m b e r ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 191/320

08/10/2013

Suy ngh trong C + +, Vol 1

i n to b j e c t C l a s s: :*p o i n t e r T o M e m b e r=&o b j e c t C l a s s: :a ;

n hn g h a m t b i nc o nt r t o t h n hv i nm i l p o i n t e r T o Me mb e r n gr i mc h ob t k i n t t r o n go b j e c t C l a s s . B nc n gc t h k h i t oc c c o nt r nt h n hv i nk h i b nx c n hn ( h o c b t c l c n ok h c ) : C t h t l k h n gc " a c h " c a o b j e c t C l a s s : : mt b i v b nc h c n c p nc c l ph c v k h n gp h i l m t i t n gc a l p . V v y , &o b j e c t C l a s s : : mt c h c t h c s d n gn h c p h pc o nt r nt h n h v i n . D i yl m t v d c h ot h yl mt h n o t or a v s d n gc o nt r c h oc c t h n hv i nd l i u :

// :C 1 1 :P o i n t e r T o M e m b e r D a t a . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; l pd l i u{ p u b l i c : i n ta ,b ,c ; v o i dp r i n t( )c o n s t{ c o u t< <" a= "< <a< <" ,b= "< <b < <" ,C= "< <c< <e n d l ; } } ; i n tm a i n( ){ d l i ud*d p=& D ; i n td l i u: :*p m I n t=& d l i u: :a ; d p >*p m I n t=4 7 ; p m I n t=&d l i u: :b ; d*p m I n t=4 8 ; . p m I n t=&d l i u: :c ; d p >*p m I n t= 4 9 ; d p >p r i n t( ) ; }/// :~

R r n g , yl q u v n gv s d n gb t c n i n on g o i t r t r n gh p c b i t ( c c h n hx c n h n gg h d n hc h o ) . Ng o i r a , c o nt r c h oc c t h n hv i n a n gk h h nc h : c h n gc t h c p h nc n gc h nm t v t r c t h b n t r o n gm t l p . B nc t h k h n g , v d n h t n gh o c s os n hc h n gn h b nc t h v i c o nt r b n ht h n g .

C h cn n g

M t b i t pt n gt n h s nx u t c c c p h pc o nt r nt h n hv i nc h oc c c h c n n gt h n hv i n . M t c o nt r nm t c h c n n g( c g i i t h i uv oc u i c h n g3 ) c n hn g h a n h t h n y : i n t( *f p )( f l o a t ) ; D un g o c x u n gq u a n h( * f p ) l c nt h i t b u c c c t r n hb i nd c h n hg i n hn g h a n g . N uk h n g c h n ys x u t h i nn h m t c h c n n gm t r v m t i n t * . Ng o c c n g n gm t v a i t r q u a nt r n gk h i n hn g h a v s d n gc o nt r nh mt h n hv i n . N ub nc m t c h c n n gb nt r o n gm t l p , b n n hn g h a m t c o nt r v o c h c n n gt h n hv i nb n gc c hc h nt nl p v t o nt p h ng i i p h mv i t h n hm t n hn g h a c o nt r c h c n n gb n ht h n g :
// :C 1 1 :P m e m F u n D e f i n i t i o n . c p pl pS i m p l e 2{ c n gc n g : i n tf( f l o a t )c o n s t{ r e t u r n1 ; } } ;I n t( S i m p l e 2: :*f p )( f l o a t )c o n s ti n t( S i m p l e 2: :*F P 2 )( f l o a t )c o n s t=&S i m p l e 2: : fi n tm a i n( ){ f p=&S i m p l e 2: :f ; }/// :~

T r o n g n hn g h a c h oF P 2 b nc t h t h yr n gm t c o nt r nh mt h n hv i nc n gc t h c k h i t ok h i n c t or a , h o c b t c l c n ok h c . K h n gg i n gn h c c c h c n n gk h n gt h n hv i n , v l k h n g b t b u c k h i l y a c h c a m t h mt h n hv i n . T u yn h i n , b nc t h c u n gc pc h oc c c h c n n gn h nd n gm k h n g c m t d a n hs c h i s , b i v g i i q u y t t n ht r n gq u t i c t h c x c n hb i k i uc a c o nt r t h n hv i n . M t v d G i t r c a m t c o nt r l b nc t h t h a y i n h n gg n c h nt r o n gt h i g i a nc h y , c u n gc pm t s l i n hh o t q u a nt r n gt r o n gl pt r n hc a b nb i v t h n gq u a m t c o nt r b nc t h c h nh o c t h a y i h n h v i t r o n gt h i g i a nc h y . M t c o nt r nt h n hv i nl k h n gk h c n h a u , n c h op h pb nl a c h nm t t h n hv i nt r o n gt h i g i a nc h y . T h n gt h n g , c c l ph c c a b ns c h c c h c n n gt h n hv i nc t h n h nt h yc n gk h a i ( t h n h v i nd l i ut h n g c c o i l m t p h nc a v i c t h c h i nc b n ) , d o v d s a u yc h nc h c n n gt h n h v i nt r o n gt h i g i a nc h y .
// :C 1 1 :P o i n t e r T o M e m b e r F u n c t i o n . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; l pW i d g e t{ p u b l i c : v o i df( i n t )c o n s t{ c o u t< <" W i d g e t: :f( )\n " ; } t r n gg( i n t )c o n s t{ c o u t< <" W i d g e t: : g( )\n " ; } t r n gh( i n t )c o n s t{ c o u t< <" W i d g e t: :h( ) \n " ; } t r n gi( i n t )c o n s t{ c o u t < <" W i d g e t: :i( )\n " ; } } ; i n tm a i n( ){ W i d g e tw ; W i d g e t*w p=& w ; v o i d( W i d g e t: :*P M E M )( i n t )= c o n s t&W i d g e t: :h ; ( W .*P M E M )( 1 ) ; ( W p >*P M E M )( 2 ) ; }/// :~

T t n h i n , n k h n gp h i l c b i t h pl mo n g i n g i d n gb n ht h n g t or a b i ut h c p h c t p n h v y . N un g i d n gp h i t h a ot c t r c t i pm t c o nt r nt h n hv i n , s a u m t t y p e d e f l t h e ot h t .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 192/320

08/10/2013

Suy ngh trong C + +, Vol 1

t h c s l ms c hn h n gt h l n , b nc t h s d n gc o nt r nt h n hv i nn h m t p h nc a c c h t h c h i n n i b . D i yl n h n gv d t r ns d n gm t c o nt r nt h n hv i nt r o n g l p . T t c n g i s d n gc nl m [ 4 5 ] l v t q u a m t s t r o n g c h nm t c h c n n g .
// :C 1 1 :P o i n t e r T o M e m b e r F u n c t i o n 2 . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; l pW i d g e t{ v o i df( i n t ) c o n s t{ c o u t< <" W i d g e t: :f( )\n " ; } t r n gg( i n t )c o n s t { c o u t< <" W i d g e t: :g()\n" ; } t r n gh( i n t )c o n s t{ c o u t < <" W i d g e t: :h( ) \n " ; } t r n gi( i n t )c o n s t{ c o u t< < " W i d g e t: :i( )\n " ; } e n u m{ C N T=4 } ; v o i d( W i d g e t: :* f p t r[ c n t ] )( i n t )c o n s t ;c n gc n g : W i d g e t( ){ f p t r [ 0 ]=&W i d g e t: :f ;//F u l lt h n gs c nt h i t f p t r[ 1 ] =&W i d g e t: :g ; f p t r[ 2 ]=&W i d g e t: :h ; f p t r[ 3 ]= &W i d g e t: :i ; } k h o n gt r n gc h n( i n ti ,i n tj ){ i f( i< 0||i >=C N T )t r l i ; ( N y >*f p t r[ i ] )( j ) ; } i n tc o u n t( ){ r e t u r nC N T ; } } ; i n tm a i n( ){ W i d g e tw ; f o r( i n ti=0 ;i< w . c o u n t( ) ;i++ ) w . s e l e c t( i ,4 7 ) ; }/// :~

T r o n gg i a od i nl pv t r o n gma i n( ) , b nc t h t h yt o nb t h c h i n , b a og mc c c h c n n g , c n i . M t h mc h p h i y uc uc c t n h( ) c h c n n g . B n gc c hn y , n g i t h c h i nl ph c c t h t h a y i s l n g c a c c c h c n n gt r o n gv i c t h c h i nc b nk h n g n hh n g nm n i c c l ph c c s d n g . V i c k h i t oc c c o nt r nc c t h n hv i nt r o n gc cn h x yd n gc t h c v o v e r s p e c i f i e d . K h n gn n b nc t h n i f p t r[ 1 ]=& g ; b i v t ngx yr a t r o n gc c c h c n n gt h n hv i n , l t n gt r o n gp h mv i c a l p ? V n l i un y k h n gp h h pv i c c c p h pc o nt r nt h n hv i n , l c nt h i t t t c m i n g i , c b i t l t r n hb i n d c h , c t h t mr a n h n gg a n gx yr a . T n gt n h v y , k h i c o nt r nt h n hv i n c d e r e f e r e n c e d , n c v n h


( N y >*f p t r[ i ] )( j ) ;

c n gl q u q u y n h ; n yc v k h n gc nt h i t . M t l nn a , c p h py uc um t c o nt r nt h n hv i nl u n l u nb r n gb u c v om t i t n gk h i n c d e r e f e r e n c e d .

T mt t
C o nt r t r o n gC++l g ng i n gn h c o nt r t r o n gC , l t t . N uk h n g , r t n h i um Cs k h n gb i nd c h n gt h e oC++ . C c l i t h i g i a nb i nd c hc h b ns s nx u t x yr a v i c c n h i mv n g u yh i m. N un h n g i un yt r o n gt h c t n h n gg a n gd n h , c c l i t h i g i a n b i nd c hc t h c l o i b v i m t d nd i nv i n ng i n( v r r n g ! ) . C++c n gc h ob i t t h mc c t i l i ut h a mk h o t A l g o l v P a s c a l , m l g i n gn h m t c o nt r l i nt c c t n gd e r e f e r e n c e db i t r n hb i nd c h . M t t i l i ut h a mk h og i m t a c h , n h n gb n i x v i n n h m t i t n g . T i l i ut h a mk h oc nt h i t c h oc p h pt r o n gs c hv i n h i uh n hq u t i ( c h c a c h n gk t i p ) , n h n g h c n gc t h mt h u nt i nc p h p t h n gq u a v t r v i t n gc h oc c c h c n n gb n ht h n g . B ns a o x yd n gc m t t h a mc h i u nm t i t n gh i nc c a c n gl o i n h l i s c a n , v n c s d n g t or a m t i t n gm i t m t t r o n gh i nt i . T r n hb i nd c ht n gg i c o p y c o n s t r u c t o r k h i b n v t q u a h o c t r l i m t i t n gt h e og i t r . M c d t r n hb i nd c hs t n gt om t b ns a o x yd n gc h o b n , n ub nn g h a i s l c nt h i t c h ol ph c c a b n , b nn nl u nl u nx c n hn c h om n h mb o r n gc c h n hv i t h c hh px yr a . N ub nk h n gmu nc c i t n gt h n gq u a h o c t r v g i t r , b nn nt o m t b ns a ot i n x yd n g . C o nt r nc c t h n hv i nc c h c n n gt n gt n h c o nt r b n ht h n g : B nc t h c h nm t k h uv c c t h c a l ut r ( d l i uh o c c h c n n g ) t i t h i g i a nc h y . C o nt r nc c t h n hv i nc h c nx yr a l mv i c v i c c t h n hv i nl ph c t h a yv v i c c d l i ut o nc uh o c c h c n n g . B ns c c s l i n hh o t c h n gt r n h c h op h pb nt h a y i h n hv i t r o n gt h i g i a nc h y .

B i t p
1.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

X o a y" c h i mv " o nm uc h n gn yv om t c h n gt r n hC( s d n gc ut r c s c h oc c


193/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

k i ud l i u ) , v c h ot h yr n gn b i nd c h . B yg i c g n g b i nd c hn v i C++v x e m n h n gg s x yr a . 2. L y o nm t r o n gp h n uc a p h nc t i u " t i l i ut h a mk h ot r o n gC++ " v t c h n gv o m t c h n h( ) . T h mb oc o i nr a b nc t h c h n gmi n hc h om n hr n gt i l i ut h a mk h o n h c o nt r c t h t n gd e r e f e r e n c e d . 3. V i t m t c h n gt r n hm t r o n g b nc g n g( 1 ) T om t t i l i ut h a mk h om k h n g c k h i t o k h i n c t or a . ( 2 ) T h a y i m t t i l i ut h a mk h o c p nm t i t n gk h c s a uk h i n c k h i t o . ( 3 ) T om t t i l i ut h a mk h oNU L L . 4. V i t m t c h c n n gm p h i m t m t h mc o nt r , s a i n h n gg c o nt r t r t i , v s a u t r v c c i m nc a c o nt r n h m t t i l i ut h a mk h o . 5. T om t l ph c v i m t s c h c n n gt h n hv i n , v l mc h oc c i t n g c t r nb i i s c a t p4 . L mc h oc o nt r m t c o n s t v l mc h om t s c c c h c n n gt h n hv i nc o n s t v c h n gmi n h r n gb nc h c t h g i c o n s t c h c n n gt h n hv i nt r o n gc h c n n gc a b n . a r a l pl u n c h c n n gc a b nm t t i l i ut h a mk h ot h a yv m t c o nt r . 6. L y o nm up h nc t i u " t i l i ut h a mk h oc o nt r " v b i nc h n gt h n hm t c h n gt r n h . 7. T om t c h c n n gm p h i m t m t i s c a m t t h a mc h i u nm t c o nt r nm t c o nt r v s a i t h a ms . T r o n gma i n( ) , g i h m. 8. T om t c h c n n gm p h i m t m t c h a r &t r a n hl u nv s a i t h a ms . T r o n gma i n( ) , i nr a m t c h a r b i n , g i c h c n n gc a b n b i n i u , v i nr a m t l nn a c h n gmi n hc h om n h r n gn c t h a y i . L mt h n ot h c h i n i un y n hh n g nc h n gt r n hc t h c c ? 9. V i t m t l ph c m c m t c o n s t c h c n n gt h n hv i nv m t p h i c o n s t c h c n n gt h n hv i n . V i t b a c h c n n gm p h i m t m t i t n gc a l pn h m t t h a ms , l n g i ut i nc n b n gg i t r , t h h a i b n gc c ht h a mc h i u , v t h b a b i c o n s t t h a mk h o . T r o n gc h c n n g , c g n gg i c h o c h a i c h c n n gt h n hv i nc a l ph c c a b nv g i i t h c hk t q u . 10. ( H i k h ) V i t m t c h c n n g ng i nm p h i m t m t i n t n h m t t h a ms , t n gg i t r , v t r v n . T r o n gma i n( ) , g i c h c n n gc a b n . B yg i k h mp h c c ht r n hb i nd c hc a b nt or a m l p r pv d uv t t h n gq u a c c b oc oh i b nh i un h t h n o i s c t r u y nv q u a yt r l i , v l mt h n ob i n a p h n g c l pc h m c r a k h i s t a c k . 11. V i t m t h m ma n gt h e on h l pl u nc a m t c h a r , i n t , f l o a t , v i . T or a c c m l pr pv i t r n hb i nd c hc a b nv t mt h yn h n gb oc or n g yc c i s t r ns t a c kt r c k h i m t c u c g i c h c n n g . 12. V i t m t h mt r v m t i . T or a c c m l pr pv x c n hg i t r c t r v . 13. S nx u t l pr pm c h oP a s s i n g B i g S t r u c t u r e s . c p. pt h e od i t h n gq u a v l ms n gt c c hb i nd c hc a b nt or a m v t q u a v t r l i c ut r c l n . 14. V i t m t c h c n n g ng i n q u yd n g g i m i s c a n v t r v s k h n gn u i s t r t h n h s k h n g , n uk h n gn g i c h n hn . T ol pr pm c h o i un y h o t n gv g i i t h c hn h t h n oc c hm c c m l pr p c t or a b i t r n hb i nd c hh t r q u y . 15. V i t m c h n gmi n hr n gt r n hb i nd c ht n gt n gh pm t b ns a o x yd n gn ub nk h n gt t o . C h n gmi n hr n gt n gh ps a oc h px yd n gt h c h i nm t b i t c o p yc a c c l o i n g u y nt h yv g i c o p y c o n s t r u c t o r c a n g i d n g n hn g h a c c l o i . 16. V i t m t l ph c v i m t b ns a o x yd n gm c n gb b nt h n c o u t . B yg i t or a m t c h c n n g m v t q u a m t i t n gc a l pm i c a b nt r o n gg i t r v m t s k h c t or a m t i t n g a p h n gc a l pm i c a b nv t r v g i t r . G i c c c h c n n g c h n gmi n hc h om n hr n gc c b n s a o x yd n gt h c s l l n gl g i k h i i q u a v t r v i t n gt h e og i t r . 17. T om t l pc c h a m t i * . C c n h x yd n gk h i t o i * b n gc c hg i i mi v g ng i t r c h ov i c l ut r k t q u t c c i s n h x yd n g . D e s t r u c t o r i ng i t r l c h , g ng i t r l 1 , k ug i x a c h ov i c l ut r , v s a u t c o nt r k h n g . B yg i t or a m t c h c n n gm p h i m t m t i t n gc a l ph c c a b nt h e og i t r , v g i c h c n n gn yt r o n gma i n( ) . Nh n gg s x yr a ? S a c h a v n b n gc c hv i t m t b ns a o x yd n g . 18. T om t l ph c v i m t n h x yd n gt r n gg i n gn h m t c o p y c o n s t r u c t o r , n h n gc m t t h a ms v i g i t r m c n h . C h or n g i un yv n c s d n gn h c c c o p y c o n s t r u c t o r . 19. T om t l ph c v i m t b ns a o x yd n gm t h n gb oc h n hn . L mc h om t l pt h h a i c c h a m t i t n gt h n hv i nc a l ph c ut i n , n h n gk h n gt or a m t b ns a o x yd n g . C h ot h y t n gh pb ns a o x yd n gt r o n gl pt h h a i t n gg i s a oc h pc o n s t r u c t o r c a l p ut i n . 20. T om t l ph c r t ng i n , v m t h mt r v m t i t n gc a l p t h e og i t r . T or a m t c h c n n gt h h a i m p h i m t m t t h a mc h i u nm t i t n gc a l ph c . G i h m ut i nn h l i s c a h mt h h a i , v c h n gmi n hr n gc h c n n gt h h a i p h i s d n gm t c o n s t t h a mk h on h i s c a n . 21. T om t l p ng i nm k h n gc m t b ns a o x yd n g , v m t c h c n n g ng i nm p h i m t m t i t n gc a l p t h e og i t r . B yg i t h a y i l ph c c a b nb n gc c ht h m m t t i nk h a i b o ( c h ) c h oc c b ns a o x yd n g . G i i t h c hn h n gg x yr a k h i c h c n n gc a b n c b i nd c h . 22. B i t pn yt or a m t t h a yt h c h os d n gc o p y c o n s t r u c t o r . T or a m t l pXv t u y nb ( n h n g k h n gx c n h ) m t t i ns a oc h px yd n g . L mc h om t c n gc l o n e ( ) c h c n n gn h m t c o n s t c h c n n gt h n hv i n t r v m t b ns a oc a i t n g c t or a s d n gmi . B yg i v i t m t c h c n n gm m t n h m t i m t c o n s t X& v n h nb nm t b ns a o a p h n gc t h c s a i .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 194/320

08/10/2013

Suy ngh trong C + +, Vol 1

23. 24.

25. 26.

27.

28.

H nc h c a p h n gp h pn yl b nc t r c hn h i mp h h ym t c c hr r n g i t n gn h nb nv t n h( s d n gx a ) k h i b n a n gt h c h i nv i n . G i i t h c hn h n gg x yr a v i c h a i Me m. c p pv Me mT e s t . c p pt C h n g7 . S a c h a v n . T om t l pc c h a m t i v m t i n( ) c h c n n gi nc c i . T r o n gma i n( ) , t or a c o nt r c h oc c t h n hv i nc h oc c c t h n hv i nd l i uv c c c h c n n gt r o n gl ph c c a b n . T or a m t i t n g c a l ph c c a b nv m t c o nt r n i t n g , v t h a ot c c h a i y ut l ph c t h n gq u a c o n t r c a b nc h oc c t h n hv i n , s d n gc h a i i t n gv c o nt r t i c c i t n g . T om t l pc c h a m t m n gc a i n t . B nc t h c h t h n gq u a m n gn ys d n gm t c o nt r n t h n hv i n ? S a i P me mF u n De f i n i t i o n . c p pb n gc c ht h m m t c h c n n gt h n hv i nq u t i f ( ) ( b nc t h x c n hd a n hs c h i s l n g u y nn h ng yt n ht r n gq u t i ) . B yg i l mc h om t c o nt r t h h a i c h o c c t h n hv i n , g i a oc h oc c p h i nb nq u t i c a f ( ) , v g i h mq u a c o nt r . L mt h n o g i i q u y t t n ht r n gq u t i x yr a t r o n gt r n gh pn y ? B t uv i F u n c t i o n T a b l e . c p pt c h n g3 . T or a m t l pc c h a m t v e c t o r c a c c c o nt r c h c n n g , v i a d d( ) v r e mo v e ( ) c h c n n gt h n hv i n t h mv l o i b c c c o nt r nc c c h c n n g . T h m m t r u n( ) c h c n n gd i c h u y nt h n gq u a c c v e c t o r v k ug i t t c c c c h c n n g . S a i c c b i t pt r n2 7 n h o t n gv i c o nt r nc c c h c n n gt h n hv i nt h a yt h .

S k h c b i t l c c i s c h oc h c n n gn yk h n gx u t h i nt r o n gd un g o c n , n h n gt h a yv o h b a o q u a n hh o c l b nc n hk t m b n l u nl u nn g h n h c c n h k h a i t h c k h n gt h a y i . C h a i k h c b i t g i a v i c s d n gm t n h i uh n hv m t c u c g i c h c n n gb n ht h n g . C p h pl k h c n h a u , m t n h i uh n ht h n g" c g i l " b n gc c h t n g i a h o c i k h i s a uk h i c c i s . S k h c b i t t h h a i l t r n hb i nd c hx c n h" c h c n n g " g i . V d , n ub n a n gs d n gc c n h i u h n h+v i c c i s d uc h m n g , t r n hb i nd c h" k ug i " c c c h c n n g t h c h i nt h md uc h m n g ( i un y" g i " t h n gl h n h n gc h nm t r o n gm n g , h o c m t d uc h m n gx l h n gd n ) . N ub n s d n gt o nt +v i m t s d uc h m n gv m t s n g u y n , t r n hb i nd c h" k ug i " m t c h c n n g c b i t b i ni n t v om t f l o a t , v s a u " g i l " m Ng o i d uc h m n g . Nh n gt r o n gC++ , c t h x c n hc c n h k h a i t h c m i m l mv i c v i c c l ph c . n hn g h a n yc n g g i n gn h m t n hn g h a c h c n n gb n ht h n gn g o i t r t nc a c c c h c n n gb a og mc c t k h a i u h n ht i pt h e oc c n h i uh n h . l s k h c b i t d u yn h t , v n t r t h n hm t c h c n n gg i n gn h b t k c h c n n gk h c , t r o n g t r n hb i nd c hg i k h i n t h yc c mh n ht h c hh p .

C n hb ov b o m

Nh pd n t r t h n hq u n h i t t n hv i n h i uh n hq u t i . l m t m n c h i t h v , l n ut i n . Nh n gh yn h l c h c p h p n g , m t c c hk h c g i m t c h c n n g . Nh nv on t h e oc c hn y , b n k h n gc l d o t n ht r n gq u t i m t n h i uh n ht r k h i n s l mc h oc c m l i nq u a n nl ph c c a b nd d n gh n v i t v c b i t l d d n gh n c . ( H yn h r n g , m c c n h i uh nn c v i t . ) N u y k h n gp h i l t r n gh p , k h n gb nt m. M t p h n n gc h u n g i uh n hq u t i l b n ht n h , t n h i n , c c n h k h a i t h c Ck h n gc n g h a q u e n t h u c n a . " T t c m i t h t h a y i v t t c c c m Cc a t i s l mn h n g i uk h c n h a u ! " i un yk h n g n g . T t c c c n h k h a i t h c s d n gt r o n gc c b i ut h c c h c h a c x yd n gt r o n gc c l o i d l i uk h n gt h t h a y i . B nc t h k h n gb a og i k h a i t h c q u t i n h v ym

1< <4 ;

c x k h c n h a u , h o c
1 . 4 1 4< <2 ;

c n g h a . C h l m t b i ut h c c h a m t n g i d n gx c n hl o i c t h c m t n h i uh n hq u t i .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

195/320

08/10/2013

Suy ngh trong C + +, Vol 1

C p h p

X c n hm t n h i uh n hq u t i l n h x c n hm t c h c n n g , n h n gt nc a c h c n n g l n h i u h n h@, t r o n g @ i d i nc h oc c n h i uh n h l b q u t i . S l n gc c i s t r o n gd a n hs c h i s n h i uh n hq u t i p h t h u c v oh a i y ut : 1. .2 C h od l m t t o nt nh n g( m t i s ) h o c m t n h i uh n hn h p h n( h a i i s ) . C h od c c n h i uh n h c n hn g h a l m t c h c n n gt o nc u( m t i s c h on g u y np h n , h a i c h on h p h n ) h o c m t h mt h n hv i n( k h n gd n gt h a ms c h on g u y np h n , m t c h on h p h n i t n gt r t h n h i s b nt r i ) .

D i yl m t l ph c n h c h ot h yc p h pc h o i uh n hq u t i :
// :C 1 2 :O p e r a t o r O v e r l o a d i n g S y n t a x . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; l pI n t e g e r{ i n ti ;c n gc n g : S n g u y n( i n ti i ) :i( i i ){ } c o n s tn g u y n t +( c o n s tn g u y n&r v )c o n s t { c o u t< <" n h i uh n h+ "< <e n d l ; I n t e g e rt r l i( i+r v . i ) ; } I n t e g e r& o p e r a t o r+=( c o n s tn g u y n&r v ){ c o u t< <" n h i uh n h+= "< <e n d l ; i+=r v . i ; *t r l in y ; } } ; i n tm a i n( ){ c o u t< <" cx yd n gt r o n gc cl o i : "< <e n d l ; i n ti =1 ,j=2 ,k=3 ; k+=i+j ; c o u t< <" n g id n g n hn g h ak i u : "< <e n d l ; I n t e g e ri i( 1 ) ,j j( 2 ) ,k k( 3 ) ; k k+=i i+j j ; }/// :~

Ha i n h k h a i t h c q u t i c n hn g h a l h mt h n hv i nn i t u y nt h n gb ok h i c h n g c g i l . C c i s d u yn h t l n h n gg x u t h i n p h a b np h i c a c c n h i uh n hc h oc c n h k h a i t h c n h p h n . K h a i t h c n g u y np h nk h n gc i s k h i n hn g h a l h mt h n hv i n . C h c n n gt h n hv i n c g i l c h oc c i t n g p h a b nt r i c a c c n h i uh n h . i v i c c n h k h a i t h c k h n gc i uk i n( i uk i nt h n gt r v m t g i t r B o o l e a n ) , b ns h un h l u n l u nmu nt r v m t i t n gh o c t h a mc h i uc ac n gl o i b n a n gh o t n gt r nn uh a i i s c n g l o i . ( N uh k h n gc n gl o i , v i c g i i t h c hn h n gg n n ns nx u t l t yt h u c v ob n . ) B n gc c hn y , b i ut h c p h c t pc t h c x yd n g : k k+=i i+j j ; C c n h i uh n h+t or a m t m i n g u y n( t mt h i ) c s d n gn h c c r v i s c h ot o nt +=. N y t mt h i b p h h yn g a ys a uk h i n k h n gc nc nt h i t . M c d b nc t h q u t i g nn h t t c c c n h k h a i t h c c s nt r o n gC , v i c s d n gc c n h i uh n hq u t i l k h h nc h . c b i t , b nk h n gt h k t h pc c n h k h a i t h c h i nk h n gc n g h a t r o n gC( n h * * i d i nc h ol yt h a ) , b nk h n gt h t h a y i n hg i ut i nc a c c n h k h a i t h c , v b nk h n gt h t h a y i s l n gc c i s t h e oy uc uc a m t n h i uh n h . N yc n g h a t t c n h n gh n h n gn ys t or a c c n h k h a i t h c m g yn h ml nc n g h a l t h a yv l mr n . Ha i p h nk t i p a r a v d c a t t c c c n h k h a i t h c " t h n gt h n g " , q u t i t r o n gc c h n ht h c m b nc l s s d n g .

K h a i t h cOv e r l o a d a b l e

K h a i t h cn g u y np h n

V d s a u yc h ot h yc c c p h p q u t i t t c c c n h k h a i t h c n g u y np h n , d i h n ht h c c a c h a i c h c n n gt o nc u( k h n gt h n hv i nb nc h c n n g ) v l h mt h n hv i n . ys m r n gc c n g u y nl pt h h i nt r c v t h m m t m i b y t e l p . n g h a c a c c n h k h a i t h c c t h c a b ns p h t h u c v oc c hb n mu ns d n gc h n g , n h n gx e mx t c c l pt r n hv i nc a k h c hh n gt r c k h i l m m t c i g b t n g . yl m t d a n hm c t t c c c c h c n n gn g u y np h n :

// :C 1 2 :O v e r l o a d i n g U n a r y O p e r a t o r s . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; //C h cn n gk h n gt h n hv i n : l pI n t e g e r{ l ut i ; S n g u y n*n y( ){ r e t u r nn y ; }c n gc n g : S n g u y n( d il l=0 ) :i( I I ){ } //K h n gc t cd n gp h c c o n s t&t r a n h l u n : b nc o n s tI n t e g e r& o p e r a t o r+( c o n s tn g u y n&a ) ; b nc o n s tI n t e g e r n h i uh n h( c o n s tn g u y n&a ) ; b nc o n s tI n t e g e r i uh n h~
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 196/320

08/10/2013

Suy ngh trong C + +, Vol 1

( c o n s tn g u y n&a ) ; b nI n t e g e r* i uh n h&( n g u y n&a ) ; b ni n t ! i uh n h( c o n s tn g u y n&a ); /C ch i u n g/S i d ec k h n gc o n s tv l pl u n : //T i nt : b nc o n s tI n t e g e r& o p e r a t o r++( n g u y n&a ) ; //P o s t f i x : b nc o n s tn g u y n t ++( n g u y n&a ,i n t ) ; //T i nt : b nc o n s tn g u y n& i uh n h-( n g u y n&a ) ; //P o s t f i x : b nc o n s tI n t e g e r i uh n h-( n g u y n&a ,i n t ) ; } ; //N h i uh n ht o nc u :c o n s tI n t e g e r&o p e r a t o r+( c o n s tn g u y n&a ){ c o u t< < " +S n g u y n\n " ; t r v m t ;//U n a r y+k h n gc t cd n g }C o n s tI n t e g e rn h i uh n h( c o n s tn g u y n&a ){ c o u t< <" I n t e g e r\n " ; I n t e g e rt r l i( a i ) ; }C o n s t i uh n hI n t e g e r~( c o n s tn g u y n&a ){ c o u t< <" ~I n t e g e r\n " ; I n t e g e rt r l i( ~a i ) ; } S n g u y n* i uh n h&( n g u y n&a ){ c o u t< <" &I n t e g e r\n " ; a . T h i st r l i( ) ;//&al q u y ! }I n tn h i uh n h( c o n s tn g u y n&a ){ ! c o u t< <" I n t e g e r\n " ; !t r l ia i ; } //T i nt ,t r l it n gt h mg i t r c o n s tI n t e g e r&o p e r a t o r++( n g u y n&a ){ c o u t< <" ++I n t e g e r\n " ; a . i++ ; t r l i ; } //P o s t f i x ,t r v g i t r t r ck h it n g :c o n s t i uh n hI n t e g e r++( n g u y n&a ,i n t ) { c o u t< <" I n t e g e r++\n " ; I n t e g e rt r c( a i ) ; a . i++ ; t r v t r c ; } //T i nt ;t r l ig i m ig i t r c o n s tI n t e g e r&o p e r a t o r-( n g u y n&a ){ c o u t< <" -n g u y n\n " ; a i; t r v m t ; } //P o s t f i x ,t r v g i t r t r ck h il n gg i m :c o n s t i uh n hI n t e g e r-( n g u y n&a , i n t ){ c o u t< <" I n t e g e r-\n " ; I n t e g e rt r c( a i ) ; a i; t r v t r c ; } //H i nt h n h n gn g i i uh n hc n gv i cq u t i :v o i df( I n t e g e ra ){ +A ; A ; ~A ; S n g u y n*i p=& a ; !M t ; ++a ; a++ ; -m t , m t; } //C h cn n g( t i m n" n y " )T h n hv i n : l pB y t e{ u n s i g n e dc h a rb ,c n gc h n g : B y t e( u n s i g n e dc h a rb b=0 ) :b( b b ){ } //K h n gc t cd n gp h :h mt h n hv i n c o n s t : c o n s tB y t e&o p e r a t o r+( )c o n s t{ c o u t< <" +B y t e\n " ; *t r l in y ; } c o n s tB y t en h i u h n h( )c o n s t{ c o u t< <" B y t e\n " ; B y t et r l i( b ) ; } c o n s t i uh n hB y t e~( )c o n s t{ c o u t< <" ~B y t e\n " ; B y t et r l i( ~b ) ; } B y t e i uh n h( )c o n s t{ ! c o u t< <" B y t e\n " ; B y t et r l i( b ) ; } B y t e i uh n h*&( ){ c o u t< <" &B y t e\n " ; t r l i n y ; } //T cd n gp h :h mt h n hv i nc o n s t : c o n s tB y t e&o p e r a t o r++( ){ //T i nt c o u t< <" ++B y t e\n " ; b++ ; *t r l in y ; } c o n s t i uh n hB y t e++( i n t ){ //P o s t f i x c o u t< < " B y t e++\n " ; B y t et r c( b) ; b++ ; t r l it r c ; } c o n s t B y t e& i uh n h-( ){ //T i nt c o u t< <" -B y t e\n " ; -b ; *t r l in y ; } c o n s t i uh n hB y t e-( i n t ){ //P o s t f i x c o u t< <" B y t e-\n " ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 197/320

08/10/2013

Suy ngh trong C + +, Vol 1

B y t et r c( b ) ; -b ; t r v t r c ; } } ; t r n gg( B y t eb ){ +b ; B ; ~B ; B y t e*b p=& b ; !B ; ++b ; b++ ; -b ; b; } i n tm a i n ( ){ I n t e g e ra , f( a ) ; B y t eb , g( b ) ; }// / :~

C c c h c n n g c n h mt h e oc c hl pl u nc a h c t h n gq u a . H n gd nl mt h n o v t q u a v t r v l pl u n c a r a s a u . C c h n ht h c t r n( v n h n gn g i t h e ot r o n gp h nt i pt h e o ) t h n gl n h n g g b ns s d n g , b t uv i h n h m t mh n hk h i q u t i k h a i t h c c a r i n gb n . T n gv l n gg i m S q u t i ++v n h k h a i t h c a r a m t t n ht h k h x b i v b nmu n c t h g i c h c n n gk h c n h a u t yt h u c v ov i c c h n gx u t h i nt r c ( t i nt ) h o c s a u( h ut ) i t n gh a n gh n h n gt r n . G i i p h p l ng i n , n h n g i k h i n g i t mt h yn m t c h t b i r i l c ut i n . K h i t r n hb i nd c ht h y , v d , ++ mt ( m t t r c t n g ) , n s t or a m t c u c g i nn h i uh n h++( a ; n h n g) k h i n t h ymt C++ , n s t or a m t c u c g i n( a , i n t o p e r a t o r ++. l , ) c c t r n hb i nd c hp h nb i t g i a h a i h n ht h c b n gc c h l mc h oc c c u c g i nc c c h c n n gq u t i k h c n h a u . T r o n g Ov e r l o a d i n g U n a r y Op e r a t o r s . c pc h oc c t h n hv i nc h c n n gpp h i nb n , n ut r n hb i nd c ht h y++b, n s t or a m t c u c g i nB: : o p e r a t o r ++( , n un t h y) b++n g i B: : o p e r a t o r ++( i n t . ) T t c n g i d n gt h yl m t c h c n n gk h c n h a u c g i l c h ot i nt v c c p h i nb nh ut . B nd i , t u yn h i n , h a i c h c n n gc u c g i c c h k k h c n h a u , v v yh l i nk t t i h a i c q u a nc h c n n gk h c n h a u . T r n hb i nd c hv t q u a m t g i t r k h n g i g i c h oi n t l u n( k h n gb a og i a r a m t n hd a n hb i v g i t r k h n gb a og i c s d n g ) t o r a c c c h k k h c n h a uc h op h i nb nh ut .

Nh i uh n hn h p h n
D a n hs c hs a u yl pl i v d v Ov e r l o a d i n g U n a r y Op e r a t o r s . c pc h oc c n h k h a i t h c n h p h n , d o b nc pm t v d c a t t c c c n h k h a i t h c b nc t h mu n t n ht r n gq u t i . M t l nn a , c h a i p h i nb nt o nc uv c c p h i nb nc h c n n g t h n hv i n c h i nt h .
// :C 1 2 :I n t e g e r . h //K h a it h cq u t ik h n gt h n hv i n #I f n d e fI N T E G E R _ H #X c n hI N T E G E R _ H #I n c l u d e //C h cn n gk h n gt h n hv i n : l pI n t e g e r{ l ut i ,c n gc h n g : S n g u y n( d il l=0 ) :i( I I ){ } //C cn h k h a it h ct om ig i t r ,s b i n i : b nc o n s tn g u y n t +( c o n s t n g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib nc o n s tI n t e g e r n h i uh n h( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib nc o n s t I n t e g e r i uh n h*( c o n s tn g u y n&t r i , c o n s tn g u y nv p h i ) ; b nc o n s tI n t e g e r i uh n h/( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) ; b nc o n s tn g u y n t %( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib nc o n s tI n t e g e r i uh n h^( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib nc o n s tI n t e g e r i uh n h&( c o n s t n g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib nc o n s tI n t e g e r i uh n h|( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib n c o n s tI n t e g e r i uh n h< <( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) ; b nc o n s tI n t e g e r o p e r a t o r> >( c o n s tn g u y n&t r i , c o n s t I n t e g e rv p h i ) ; //B it ps a iv t r l ig i t r t r i : b nI n t e g e r& o p e r a t o r+=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ) , n g ib n I n t e g e rv n h i uh n h=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ) , n g ib nI n t e g e r& i uh n h*=( S n g u y n&t r i , c o n s t I n t e g e rv p h i ) ; b nI n t e g e r& i uh n h/=( S n g u y n&t r i , c o n s tI n t e g e rv p h i ) ; b nI n t e g e r& i uh n h %=( S n g u y n&t r i , c o n s tI n t e g e rv p h i ) ; b nI n t e g e r& i uh n h^=( I n t e g e r& t r i , c o n s tI n t e g e rv p h i ) , n g ib nI n t e g e r& i uh n h&= ( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ) , n g ib nI n t e g e r& i uh n h|=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ) , n g ib n I n t e g e r& o p e r a t o r> >=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ) , n g ib nn g u y n& i uh n h< <=( I n t e g e rv t r i , c o n s t I n t e g e rv p h i ) , n h k h a it h c//c i uk i nt r v n g/s a i : n g ib ni n t
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 198/320

08/10/2013

Suy ngh trong C + +, Vol 1

t = =( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib n i n t o p e r a t o r=( c o n s tn g u y n&t r i , ! c o n s tI n t e g e r&b np h i ) , n g ib ni n t o p e r a t o r< ( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib ni n t i uh n h >( c o n s tn g u y n&t r i , c o n s t I n t e g e rv p h i ) , n g ib ni n t o p e r a t o r< =( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib ni n t i uh n h >=( c o n s tn g u y n &t r i , c o n s tI n t e g e rv p h i ) , n g ib ni n t & & i uh n h ( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) , n g ib ni n t i u h n h||( c o n s tn g u y n&t r i ,c o n s tI n t e g e rv p h i ) ;//V i tc cn id u n g m t o s t r e a m : v o i dp r i n t( s t d: :o s t r e a m&o s )c o n s t{ o s< <i ; } } ; #E n d i f//I N T E G E R _ H/// :~ // :C 1 2 :I n t e g e r . c p p{ O } //T h ch i nk h a it h cq u t i #B a og m" I n t e g e r . h " #B a og m" . ./R e q u i r e . h " c o n s tn g u y n t +( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ t r l iI n t e g e r( l e f t . i+r i g h t . i ) ; }C o n s tI n t e g e r n h i uh n h( c o n s tn g u y n&t r i , c o n s t I n t e g e rv p h i ){ t r l iI n t e g e r( l e f t . i-r i g h t . i ) ; }C o n s tI n t e g e r i uh n h*( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ t r l iI n t e g e r ( l e f t . i*r i g h t . i ) ; }C o n s tI n t e g e r i uh n h/( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ y uc u( r i g h t . i=0 ," c h i ac h os k h n g " ) ; t r l iI n t e g e r( l e f t . i/ r i g h t . i ) ; }C o n s tn g u y n t %( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ y uc u( !r i g h t . i=0 ," m o d u l os k h n g " ) ; I n t e g e rt r l i( l e f t . i %r i g h t . i ) ; }C o n s tI n t e g e r i uh n h^( c o n s tn g u y n&t r i , c o n s t I n t e g e rv p h i ){ t r l iI n t e g e r( l e f t . i^r i g h t . i ) ; }C o n s tI n t e g e r i uh n h&( c o n s tn g u y n&t r i , c o n s t I n t e g e rv p h i ){ t r l iI n t e g e r( l e f t . i&r i g h t . i ) ; }C o n s tI n t e g e r i uh n h|( c o n s tn g u y n&t r i ,c o n s tI n t e g e rv p h i ){ t r l iI n t e g e r( l e f t . i|r i g h t . i ) ; }C o n s tI n t e g e r i uh n h< <( c o n s tn g u y n&t r i , c o n s t I n t e g e rv p h i ){ t r l iI n t e g e r( l e f t . i< <r i g h t . i ) ; }C o n s tI n t e g e r o p e r a t o r> >( c o n s tn g u y n&t r i , c o n s t I n t e g e rv p h i ){ t r l iI n t e g e r( l e f t . i> >r i g h t . i ) ; } //B it ps a iv t r l ig i t r t r i :I n t e g e r&o p e r a t o r+=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ i f( v l i= =v p h i ){ /*t p h n */ } l e f t . i+=r i g h t . i ; t r l it r i ; } N g u y n&n h i uh n h=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ i f( t r i&= =&p h i ){ /*t p h n*/ } l e f t . i-=r i g h t . i ; t r l it r i ; } N g u y n& i uh n h*=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ i f( t r i&= =v p h i ){ /*t p h n*/ } l e f t . i*=r i g h t . i ; t r l it r i ; } N g u y n& i uh n h/=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ y uc u( r i g h t . i=0 ," c h i ac h os k h n g " ) ; n u( v t r i= =v p h i ){ /*t p h n */ } l e f t . i/=r i g h t . i ; t r l it r i ; } N g u y n& i uh n h %=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ y uc u( r i g h t . i=0 ," m o d u l os k h n g " ) ; n u( v t r i= =v p h i ){ /*t p h n*/ } l e f t . i %=r i g h t . i ; t r l it r i ; } N g u y n& i uh n h^=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ i f( t r i&= =&p h i ){ /*t p h n*/ } l e f t . i^=r i g h t . i ; t r l it r i ; } N g u y n& i uh n h&=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ i f( t r i&= =&p h i ){ /*t p h n*/ } l e f t . i&=r i g h t . i ; t r l it r i ; } N g u y n& i uh n h|=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ i f( t r i&= =&p h i ){ /*t p h n*/ } l e f t . i|=r i g h t . i ; t r l i ; } N g u y n& i uh n h> >=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ i f( t r i&= =&p h i ){ /*t p h n*/ } l e f t . i> >=r i g h t . i ; t r l it r i ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 199/320

08/10/2013

Suy ngh trong C + +, Vol 1

} N g u y n&o p e r a t o r< <=( I n t e g e rv t r i , c o n s tI n t e g e rv p h i ){ i f( t r i&= =&p h i ){ /*t p h n*/ } l e f t . i< <=r i g h t . i ; t r l it r i ; } //C cn h k h a it h cc i uk i nt r v n g/s a i :i n tt = =( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ t r l il e f t . i= =r i g h t . i ; }I n to p e r a t o r=( c o n s tn g u y n&t r i , ! c o n s tI n t e g e rv p h i ){ t r l il e f t . i=r i g h t . i ! ; }I n to p e r a t o r< ( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ t r l il e f t . i< r i g h t . i ; }I n t i uh n h >( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ t r l il e f t . i >r i g h t . i ; }I n to p e r a t o r< =( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ t r l il e f t . i< =r i g h t . i ; }I n t i uh n h >=( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ t r l il e f t . i >=r i g h t . i ; }I n tt & &( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ){ t r l il e f t . i& &r i g h t . i ; }I n t i uh n h||( c o n s tn g u y n&t r i , c o n s tI n t e g e rv p h i ) { t r l il e f t . i||r i g h t . i ; }/// :~ // :C 1 2 :I n t e g e r T e s t . c p p //{ L }I n t e g e r #B a og m" I n t e g e r . h "#b a og m< f s t r e a m >s d n gt nm i nk h n gg i a nt i u c h u n ;o f s t r e a mr a( " I n t e g e r T e s t . o u t " ) ; k h o n gt r n gh( n g u y n&c 1 ,n g u y n&c 2 ){ //M tb i ut h cp h ct p : c 1+= c 1*c 2+c 2 %c 1 ; #x c n hT R Y( O P )\ r a< <" c 1= " ;c 1 . p r i n t( t r o n g ) ;\ r a< <" ,c 2= " ;c 2 . p r i n t( t r o n g ) ;\ r a< <" ; \ ;c 1" #O P "c 2s nx u t" i n( t r o n g )( c 1c 2O P ) ; .\ r a< <e n d l ; T R Y( + )T R Y( )T R Y( * )T R Y( / ) T R Y( % )T R Y( ^ )T R Y( & )T R Y( | ) T R Y( < < )T R Y( > > )T R Y( += )T R Y( -= ) T R Y( *= )T R Y( /= )T R Y( %= )T R Y( ^= ) T R Y( &= )T R Y( |= )T R Y( > >= )T R Y( < <= ) //C c i uk i n : #x c n hT R Y C(O P )\ r a< <" c 1= " ;c 1 . p r i n t( t r o n g ) ; \ r a< <" ,c 2= " ;c 2 . p r i n t( t r o n g ) ;\ r a< <" ; c 1" #O P "c 2s nx u t" ;\ r a< <( c 1c 2O P ) ;\ r a< <e n d l ; T R Y C( < )T R Y C( > )T R Y C( = = )T R Y C( != )T R Y C( < = ) T R Y C( >= )T R Y C( & & )T R Y C( || ) } i n tm a i n( ){ c o u t< <" b nc h cn n g "< <e n d l ; I n t e g e rc 1( 4 7 ) ,c 2( 9 ) , h( c 1 ,c 2 ) ; }/ // :~ // :C 1 2 :B y t e . h //T h n hn h k h a it h cq u t i #I f n d e fB Y T E _ H #X c n hB Y T E _ H #B a og m" . ./R e q u i r e . h " #I n c l u d e //C h cn n g( t i m n" n y " )T h n hv i n : l pB y t e{ u n s i g n e dc h a rb ,c n gc h n g : B y t e( u n s i g n e dc h a rb b=0 ) :b( b b ){ } //K h n gc t cd n gp h :c o n s tc h cn n g t h n hv i n : c o n s tB y t e i uh n h+( c o n s tB y t ev p h i )c o n s t{ B y t et r l i( b+r i g h t . b ) ; } c o n s tB y t e i uh n h ( c o n s tB y t ev p h i )c o n s t{ B y t et r l i( b -r i g h t . b ) ; } c o n s tB y t e i uh n h*( c o n s tB y t ev p h i )c o n s t{ B y t et r l i ( b*r i g h t . b ) ; } c o n s tB y t e i uh n h/( c o n s tB y t ev p h i )c o n s t{ y uc u( !r i g h t . b =0 ," c h i ac h os k h n g " ) ; B y t et r l i( b/r i g h t . b ) ; } c o n s tB y t e i uh n h %( c o n s tB y t ev p h i )c o n s t{ y uc u( r i g h t . b= 0 ," m o d u l os k h n g " ) ; B y t et r l i( b %r i g h t . b ) ; } c o n s tB y t e i uh n h^( c o n s tB y t ev p h i )c o n s t{ B y t et r l i ( b^r i g h t . b ) ; } c o n s tB y t e i uh n h&( c o n s tB y t ev p h i )c o n s t{ B y t et r l i ( b&r i g h t . b ) ; } c o n s tB y t e i uh n h|( c o n s tB y t ev p h i )c o n s t{ B y t et r l i ( b|r i g h t . b ) ; } c o n s tB y t e i uh n h< <( c o n s tB y t ev p h i )c o n s t{ B y t et r l i ( b< <r i g h t . b ) ; } c o n s tB y t e i uh n h> >( c o n s tB y t ev p h i )c o n s t{ B y t et r l i ( b> >r i g h t . b ) ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 200/320

08/10/2013

Suy ngh trong C + +, Vol 1

} //B it ps a iv t r l ig i t r t r i . //N h i uh n h=c h c t h l m th mt h n hv i n : B y t e&o p e r a t o r=( c o n s tB y t ev p h i ){ //X l t p h nc n g : n u ( i un y= =v p h i )t r l i*n y ; b=r i g h t . b ; *t r l in y ; } B y t e&o p e r a t o r+=( c o n s tB y t ev p h i ){ i f( = =n yv p h i ){ /*t p h n*/ } b+=r i g h t . b ; *t r l in y ; } B y t ev n h i uh n h=( c o n s tB y t ev p h i ){ i f( = =n yv p h i ){ /*t p h n* / } b-=r i g h t . b ; *t r l in y ; } B y t e& i uh n h*=( c o n s tB y t ev p h i ){ i f( i un y= =v p h i ){ /*t p h n */ } b*=r i g h t . b ; *t r l in y ; } B y t e& i uh n h/=( c o n s tB y t ev p h i ){ y uc u( r i g h t . b=0 ," c h i ac h os k h n g " ) ; n u( i un y= =v p h i ){ /*t p h n*/ } b/=r i g h t . b ; t r l i*n y ; } B y t e& i uh n h %=( c o n s tB y t ev p h i ){ y uc u( r i g h t . b=0 ," m o d u l os k h n g " ) ; n u( i un y= =v p h i ){ /*t p h n*/ } b %=r i g h t . b ; t r l i *n y ; } B y t e& i uh n h^=( c o n s tB y t ev p h i ){ i f( i un y= =v p h i ){ /*t p h n */ }b^=r i g h t . b ;*t r l in y ; } B y t e& i uh n h&=( c o n s tB y t ev p h i ){ i f( i un y= =v p h i ){ /*t p h n */ } b&=r i g h t . b ; *t r l in y ; } B y t e& i uh n h|=( c o n s tB y t ev p h i ){ i f( i un y= =v p h i ){ /*t p h n */ } b|=r i g h t . b ; *t r l in y ; } B y t e& i uh n h> >=( c o n s tB y t ev p h i ){ i f( i un y= =v p h i ){ /*t p h n */ } b=> >r i g h t . b ; *t r l in y ; } B y t e&o p e r a t o r< <=( c o n s tB y t ev p h i ){ i f( = =n yv p h i ){ /*t p h n*/ } b< <=r i g h t . b ; *t r l in y ; } //C cn h k h a it h cc i uk i nt r v n g/s a i : i n tt = =( c o n s tB y t ev p h i ) c o n s t{ t r l ib= =r i g h t . b ; } i n to p e r a t o r=( c o n s tB y t ev p h i )c o n s t{ ! t r l ib=r i g h t . b ! ; } i n to p e r a t o r< ( c o n s tB y t ev p h i )c o n s t{ t r l ib< r i g h t . b ; } i n t i uh n h >( c o n s tB y t ev p h i )c o n s t{ t r l ib >r i g h t . b ; } i n to p e r a t o r< =( c o n s tB y t ev p h i )c o n s t{ t r l ib< =r i g h t . b ; } i n t i uh n h >=( c o n s tB y t ev p h i )c o n s t{ t r l ib >=r i g h t . b ; } i n t& & i uh n h( c o n s tB y t ev p h i )c o n s t{ t r l ib& &r i g h t . b ; } i n t i uh n h||( c o n s tB y t ev p h i )c o n s t{ t r l ib||r i g h t . b ; } //G h ic cn id u n g m to s t r e a m : v o i dp r i n t( s t d: :o s t r e a m&o s )c o n s t{ o s < <" 0 x "< <s t d: :h e x< <i n t( b )< <s t d: :T h n gM iH a i ; } } ; #E n d i f//B Y T E _ H/// :~ // :C 1 2 :B y t e T e s t . c p p #B a og m" B y t e . h "#b a og m< f s t r e a m >s d n gt nm i nk h n gg i a nt i u c h u n ;o f s t r e a mr a( " B y t e T e s t . o u t " ) ; k h o n gt r n gk( B y t e&b 1 ,B y t e&b 2 ){ b 1=b 1*b 2+b 2b 1 % ; #X c n hT R Y 2( O P )\ r a< <" b 1= " ;b 1 . p r i n t( t r o n g ) ;\ b 2 . p r i n t( t r o n g ) ;\ r a< <" ; b 1" #O P "b 2s nx u t" ,\ ( t r o n g ) ; .\ r a< <e n d l ; b 1=9 ;b 2=4 7 ; T R Y 2( + )T R Y 2( )T R Y 2( * )T R Y 2( / ) T R Y 2( % )T R Y 2( ^ )T R Y 2( & )T R Y 2( | ) T R Y 2( < < )T R Y 2( > > )T R Y 2( += )T R Y 2( -= ) T R Y 2( *= )T R Y 2( /= )T R Y 2( %= )T R Y 2( ^= ) T R Y 2( &= )T R Y 2( |= )T R Y 2( > >= )T R Y 2( < <= )
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

r a< <" ,b 2= " ; ( O Pb 1b 2 )i n

201/320

08/10/2013

Suy ngh trong C + +, Vol 1

T R Y 2( = ) i uh n h//C h u y nn h n g //C c i uk i n : #x c n hT R Y C 2( O P )\ r a< <" b 1= " ;b 1 . p r i n t( t r o n g ) ; r a< <" ,b 2= " ;b 2 . p r i n t( t r o n g ) ;\ r a< <" ; b 1" #O P "b 2s nx u t" ,\ r a< <( O Pb 1b 2 ) ;\ r a< <e n d l ; b 1=9 ;b 2=4 7 ; T R Y C 2( < )T R Y C 2( > )T R Y C 2( = = )T R Y C 2( != )T R Y C 2( < = ) T R Y C 2( >= )T R Y C 2( & & )T R Y C 2( || ) //X c hv i c : B y t eb 3=9 2 ; } b 1=b 2=b 3 ; i n tm a i n( ){ r a< <" h mt h n hv i n : "< <e n d l ; / :~

b 1B y t e( 4 7 ) ,b 2( 9 ) ,

k( b 1 ,b 2 ) ; }//

B nc t h t h yr n g i uh n h=c h c p h pc m t h mt h n hv i n . i un y c g i i t h c hs a u . C h r n gt t c c c n h k h a i t h c c h u y nn h n gc m k i mt r a t p h nc n g , yl m t h n gd n c h u n g . T r o n gm t s t r n gh pn yl k h n gc nt h i t , v d , v i n h i uh n h+=b nt h n gm u nn i A+ =Av n c t h m mt c h oc h n hn . N i q u a nt r n gn h t k i mt r a t c h u y nn h n gl n h i uh n h= b i v v i c c i t n gp h c t p , k t q u t a i h i c t h x yr a . ( T r o n gm t s t r n gh p , n l OK , n h n gb n n nl u nl u ng i n t r o n gt mt r k h i v i t i uh n h=. ) T t c c c n h k h a i t h c t h h i nt r o n gc c v d t r c c q u t i x l m t l o i d u yn h t . Nc n gc t h c c n h k h a i t h c q u t i x l c c l o i h nh p , v v yb nc t h t h mt o c a m, v d . T r c k h i b nb t ut r nm t q u t i y c a c c n h k h a i t h c , t u yn h i n , b nn nn h nv op h nt r nl o i c h u y n i t n gs a ut r o n gc h n gn y . T h n gt h n g , m t c h u y n i l o i h n h t b np h i c t h g i pb nt i t k i mr t n h i un h k h a i t h c q u t i .

i s v g i t r t r l i

Nc v m t c h t b i r i l c ut i nk h i b nn h nv o Ov e r l o a d i n g U n a r y Op e r a t o r s . c p, p I n t e g e r . hv B y t e . hv x e mt t c c c c c hk h c n h a um i s c t r u y n v q u a yt r l i . M c d b nc t h v t q u a v t r l i l pl u nt h e oc c hm b nmu n , c c l a c h nt r o n gc c v d n yk h n g c l a c h nn g un h i n . H t h e om t mh n hh pl , m t t r o n gn h n gg i n gb ns mu ns d n gt r o n gh uh t c c s l a c h nc a b n . 1. Nh v i b t k i s c h c n n g , n ub nc h c n c t c c i s v k h n gt h a y i , m c n h i q u a n n h l m t c o n s t t h a mk h o . P h pt n hs h c t h n gt h n g( n h +v , v v ) v B o o l e a ns k h n g t h a y i l pl u nc a h , v v y i q u a c o n s t t i l i ut h a mk h oc h y ul n h n gg b ns s d n g . K h i c h c n n gl m t t h n hv i nl ph c , i un y a nl mc h on m t c o n s t c h c n n gt h n hv i n . C h v i c c n h i uh n h b i t p( n h +=) v c c n h i uh n h=, t r o n g t h a y i c c t h a ms b nt a y t r i , l t h a ms t r i k h n g m t h n gs , n h n gn v nc nt h n gq u a t i n h m t a c h b i v n s c t h a y i . 2. C c l o i g i t r t r v b nn nc h np h t h u c v on g h a d k i nc a c c n h i uh n h . ( M t l nn a , b n c t h l mb t c i ug b nmu nv i c c i s v g i t r t r l i . ) N ut c d n gc a c c n h i uh n hl t or a m t g i t r m i , b ns c np h i t or a m t i t n gm i n h g i t r t r v . V d , I n t e g e r : : o p e r a t o r +p h i s nx u t m t s n g u y n i t n gm l t n gh pc a c c t o nh n g . i t n gn y c t r v g i t r n h m t c o n s t , n nk t q u k h n gt h c s a i n h m t g i t r t r i . T t c c c n h k h a i t h c c h u y nn h n gt h a y i v t r i . c h op h pc c k t q u c a c n gv i c s c s d n gt r o n gc c b i ut h c b x i n gx c h , n h a =b=c , n h yv n gr n gb ns t r v m t t h a mc h i u n c n gm t g i t r t r i c c h c ns a i . Nh n gn nt h n gt i nn yl m t c o n s t h a yk h n gc o n s t ? M c d b nc c a =b=c t t r i s a n gp h i , c c t r n hb i nd c hp h nt c hn t p h i s a n gt r i , v v y b nk h n gb u c p h i t r v m t k h n gc o n s t h t r p h nc h u i . T u yn h i n , n g i t a i k h i mo n g i c t h t h c h i nm t t h a ot c t r nl i um c h c g i a o , c h n gh nn h ( a =b ) c h c n n g( ) . g i , c h c n n g( ) t r nmt s a uk h i g i a obv i n . Nh v y , g i t r t r c h ot t c c c n h k h a i t h c c h u y n n h n gp h i l m t k h n gc o n s t t h a mc h i u nc c g i t r t r i . i v i c c n h k h a i t h c h pl , t t c m i n g i h yv n gs n h n c t n h t m t i n t t r l i , v t t n h t m t b o o l . ( T h v i np h t t r i nt r c k h i h uh t c c t r n hb i nd c hh t r C++ c t c hh pt r o n gb o o l s s d n gi n t h o c t n g n gt y p e d e f . )

3.

4.

V i c t n gv g i mb t c c n h k h a i t h c a r a m t t n ht r n gk h x v c c p h i nb nt r c v h ut . C h a i p h i nb nt h a y i i t n gv d o k h n gt h x l c c i t n gn h m t c o n s t . P h i nb nt i nt t r v
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 202/320

08/10/2013

Suy ngh trong C + +, Vol 1

g i t r c a i t n gs a uk h i n c t h a y i , v v yb nmo n g i c c t r l i c c i t n g c t h a y i . Nh v y , v i t i nt b nc h c t h t r l i * n yn h m t t i l i ut h a mk h o . P h i nb nh ut c c h o l t r l i g i t r t r c k h i c c g i t r c t h a y i , v v yb nb u c p h i t or a m t i t n gr i n gb i t i d i nc h og i t r v t r l i n . V v y , v i h ut b np h i t r l i g i t r n ub nmu ng i l i n g h a mo n g i . ( L ur n g i k h i b ns t mt h yn h n gt n gv g i mb t c c n h k h a i t h c t r l i m t i n t h o c b o o l c h r a , v d , c h od m t i t n g c t h i t k d i c h u y nq u a m t d a n hs c h c u i d a n hs c h . ) B yg i c u h i l : c n nc n h n gt r l i n h c o n s t h a yk h n gc o n s t ? N ub nc h op h pc c i t n g c s a i v m t n g i n o v i t f u n c ( ( ++a ) . , ) c h c n n g( ) s c h o t n gt r nmt b nt h n , n h n gv i c h c n n g ( ( a ++ ) . , ) f u n c ( ) h o t n gt r nc c i t n gt mt h i t r l i b i c c h ut i uh n h++. i t n gt mt h i c t n gc o n s t , v v y ys c g nc c a t r n hb i nd c h , n h n gv l i c ht h n gn h t c a n c t h c n g h a h n l mc h oh c h a i c o n s t , n h c t h c h i n y . Ho c b nc t h c h n l mc h op h i nb n t i nt k h n gc o n s t v h ut c o n s t . D os a d n gv n g h a b nc t h mu nc u n gc pc h oc c n h k h a i t h c t n gv g i m, h s c np h i c x e mx t t r nc s t n gt r n gh pc t h . T r l i g i t r n h c o n s t T r v g i t r n h m t c o n s t c t h c v m t c h t t i n ht l c u , v v yn x n g n g c g i i t h c ht h m m t c h t . X e mx t c c n h p h nt +. N ub ns d n gn t r o n gm t b i ut h c n h f ( a +b ) , k t q u c a a +bt r t h n hm t i t n gt mt h i c s d n gt r o n gc c c u c g i nf ( ) . B i v l m t t mt h i , n s t n g c o n s t , v v yc h od b nm t c c hr r n gl mc h oc c g i t r t r v c o n s t h o c k h n gc h i ul c . T u yn h i n , n c n gc t h b nc t h g i t i nn h n nc c g i t r t r l i c a a +b, t h a yv c h i q u a n m t c h c n n g . V d , b nc t h n i ( a +b ) g . ( ) , t r o n g g( ) l m t s c h c n n gt h n hv i nc a s n g u y n, t r o n g t r n gh pn y . B n gc c hl mc h oc c g i t r t r v c o n s t , b nn i r n gc h c m t c o n s t c h c n n gt h n hv i n c t h c g i l c h or n gg i t r t r v . yl c o n s t c h n hx c , b i v n n g nc nb nl ut r t h n gt i ng i t r t i mn n gt r o n gm t i t n gm r t c t h s b m t . C ct i uh al i n h u n K h i c c i t n gm i c t or a t r v g i t r , t h n gb oc c h n ht h c s d n g . T r o n g i uh n h+, v d :


t r l is n g u y n( l e f t . i+r i g h t . i ) ;

i un yc t h n h n ut i nn h m t " c h c n n gc u c g i nm t n h x yd n g , " n h n gn k h n gp h i . C p h pl c a m t i t n gt mt h i , b nt u y nb n i " l mt mt h i I n t e g e r i t n gv t r l i n . " B i v i u n y , b nc t h n g h r n gk t q u l g i n gn h v i c t om t i t n g a p h n g t t nv t r v m . T u y n h i n , n k h k h c n h a u . N ub n n i t h a y :


N g u y nt m p( l e f t . i+r i g h t . i ) ;t r l it m p ;

b a i us x yr a . ut i n , t mp i t n g c t or a b a og mc c u c g i c o n s t r u c t o r c a n . T h h a i , c c b n s a o x yd n gb ns a ot mp nv t r c a g i t r t r v b nn g o i . T h b a , c c d e s t r u c t o r c g i l c h ot mpv o c u i p h mv i . Ng c l i , " t r l i m t t mt h i " c c ht i pc nh o t n gk h k h c n h a u . K h i t r n hb i nd c ht h yb nl m i u n y , n b i t r n gb nk h n gc n h uc uk h c c h oc c i t n gn t oh n t r l i n . T r n hb i nd c hl i d n g i un yb n gc c hx yd n gc c i t n gt r c t i p v ov t r c a g i t r t r v b nn g o i . i un y i h i c h c m t c u c g i x yd n gt h n gt h n gd u yn h t ( k h n gc b ns a o x yd n gl c nt h i t ) v k h n gc c u c g i h yb i v b nk h n gb a og i t h c s t or a m t i t n g a p h n g . V v y , t r o n gk h i n k h n gc h i p h b t c i ug n h n gn h nt h c v l pt r n h , l n gk h i uq u h n . i un yt h n g c g i l t i uh a g i t r t r v . M t s n h k h a i t h c t h mc m t c p h ph i k h c n h a uc h oq u t i . C h s d i , i uh n h[ ] , p h i l m t t h n hv i nn n gv n i h i m t i s d u yn h t . B i v n h i uh n h [ ] n g r n gc c i t n gn c g i l i v i h n hv i n h m t m n g , b nt h n gs t r l i m t t i l i ut h a m k h ot n h i uh n hn y , v v yn c t h c t h u nt i ns d n g p h a b nt r i c a d ub n g . i uh n h n yt h n gq u t i , b ns t h yv d t r o n gp h nc nl i c a c u ns c h . C c n h k h a i t h c mi v x a k i ms o t c pp h t b n h n gv c t h c q u t i t r o n gm t s c c hk h c n h a u . C h n y c c pt r o n gC h n g1 3 . D up h y C c n h i uh n hd up h y c g i l k h i n x u t h i nb nc n hm t i t n gc a c c l o i d up h y c n hn g h a c h o . T u yn h i n , " i uh n h , " l k h n g c g i l c h od a n hs c h i s c h c n n g , c h d n hc h o c c i t n g c m r a t r o n g , c c hn h a ub n gd up h y . C v n h k h n gp h i l r t n h i uc n gd n gt h c t c h on h i uh n hn y , l t r o n gn g nn g c h op h h p . D i yl m t v d c h ot h yc c hc c c h c n n gd up h yc t h c g i k h i d up h yx u t h i nt r c k h i m t i t n g , c n gn h s a u :


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 203/320

C cn h k h a i t h ck h ct h n g

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 1 2 :O v e r l o a d i n g O p e r a t o r C o m m a . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; S a uk h il p{ p u b l i c : S a uk h ic o n s t& i uh n h ,( c o n s tS a u& )c o n s t{ h n h ,( ) "< <e n d l ; *t r l in y ; } } ; l pT r ck h i{ } ;

c o u t< <" S a uk h i: :n h i u

T r cv i uh n h ,( i n t ,T r c&b ){ c o u t< <" T r ck h i: :n h i uh n h ,( ) "< <e n d l ; t r l ib ; } i n tm a i n( ){ S a uk h ia ,b , a ,b ; // i uh n h cg il d u p h y T r ck h ic ; 1 ,c ; // i uh n h cg il d up h y }/// :~

C h c n n gt o nc uc h op h pc c d up h y c t t r c c c i t n gt r o n gc uh i . V i c s d n gt h h i n k h m h v c v n . M c d b nc t h s s d n gm t d a n hs c hb n gd up h yn h l m t p h nc a m t b i ut h c p h c t ph n , n q u t i n ht s d n gt r o n gh uh t c c t n hh u n g . i uh n h > C c n h i uh n h >t h n g c s d n gk h i b nmu nt h c h i nm t i t n gx u t h i nn h m t c o nt r . V n h m t i t n gc n h i u" t h n gmi n h " x yd n gv on h nt nt i t r o n gm t c o nt r i nh n h , m t i t n gn h t h n yt h n g c g i l m t c o nt r t h n g m i n h . yl c b i t h u c hn ub nmu n" b c " m t l px u n gq u a n hm t c o nt r l mc h oc o nt r l a nt o n , h o c t r o n gv i c s d n gc h u n gc a m t i t e r a t o r , l m t v t c h u y n n gt h n gq u a m t b s ut p /t h n g c h a c a c c i t n gk h c v l a c h nc h n gm t l c m t t h i g i a n , m k h n gc u n gc pt r u yc pt r c t i p nv i c t h c h i nc c c o n t a i n e r . ( B nt h n gs t h y c o n t a i n e r v v n gl pt r o n gc c t h v i n , c h n gh nn h t r o n gt i uc h u nC++T h v i n , c mt t r o n gt p2 c a c u ns c hn y . ) M t t o nt t h a mc h i uc o nt r p h i l m t c h c n n gt h n hv i n . Nc b s u n g , h nc h k h n g i nh n h : N p h i t r l i m t i t n g( h o c t h a mc h i u nm t i t n g ) m c n gc m t t o nt t h a mc h i uc o nt r , h o c n p h i t r l i m t c o nt r c t h c s d n g c h nn h n gg c o nt r t i c hc a n h i uh n hm i t nc h v o . D i yl m t v d ng i n :
// :C 1 2 :S m a r t P o i n t e r . c p p #I n c l u d e #B a og m< v e c t o r >#b a og ms d n gt nm i nk h n gg i a nt i uc h u n " /r e q u i r e . h . . " ; l pO b j{ s t a t i ci n ti ,j ;c n gc n g : v o i df( )c o n s t{ c o u t< <i++< <e n d l ; } t r n gg( )c o n s t{ c o u t< <j< <e n d l ; } } ; // n hn g h at h n hv i nt n h : i n to b j: :i=4 7 ;i n to b j: :j=1 1 ; //C o n t a i n e r :l pO b j C o n t a i n e r{ v e c t o r< O b j * >m t ,c n g c h n g : l mm th i ul ct h m( o b j*o b j ){ a . p u s h _ b a c k( o b j ) ; } b nl pS m a r t P o i n t e r ; } ; l pS m a r t P o i n t e r{ O b j C o n t a i n e r&o c ; i n ti n d e x ; c n gc n g : S m a r t P o i n t e r( O b j C o n t a i n e r&o b j c ) :o c( o b j c ){ i n d e x=0 ; } //T r v g i t r c h r ac u id a n hs c h : b o o lo p e r a t o r++( ){ //T i nt n u( c h s >=o c . a . s i z e( ) )r e t u r nf a l s e ; n u( o c . a[ ++i n d e x ]= =0 )r e t u r n f a l s e ; r e t u r nt r u e ; } b o o lo p e r a t o r++( i n t ){ //P o s t f i x t r l i i u h n h++( ) ;//S d n gp h i nb nt i nt } O b j*o p e r a t o r >( )c o n s t{ y uc u( o c . a[ i n d e x ]=0 ," Z e r og i t r " ! " t r v b iS m a r t P o i n t e r: :o p e r a t o r >( ) " ) ; t r l io c . a[ i n d e x ] ; } } ; i n tm a i n( ){ c o n s ti n ts z=1 0 ; o b jo[ S Z ] ; O b j C o n t a i n e ro c ; f o r( i n ti= 0 ;i< s z ;i++ ) o c . a d d( :D[ i ] ) ;// i nn l n S m a r t P o i n t e rs p( o c ) ;//T o m tb i nl p d o{ s p >f( ) ;//C o nt r t i c hc ac u cg i i uh n h s p > g( ) ; }t r o n gk h i( s p++ ) ; }/// :~

L po b j x c n hc c i t n g c t h a ot c t r o n gc h n gt r n hn y . C c c h c n n gf ( ) v g( ) c h ng i nl
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 204/320

08/10/2013

Suy ngh trong C + +, Vol 1

i nr a c c g i t r t h v s d n gt n ht h n hv i nd l i u . C o nt r nc c i t n g c l ut r t r o n gc o n t a i n e r l o i Ob j C o n t a i n e r s d n gc a n a d d( ) c h c n n g . Ob j C o n t a i n e r t r n gg i n gn h m t m n gc a c o nt r , n h n gb ns n h nt h yk h n gc c c hn o c c c o nt r t r l i m t l nn a . T u yn h i n , S ma r t P o i n t e r c k h a i b ol m t n g i b nh c , v v yn c s c h op h pn h nv ob nt r o n gc c c o n t a i n e r . C c S ma r t P o i n t e r l pt r n gr t g i n gn h m t c o nt r t h n gmi n hb nc t h d i c h u y nn v p h a t r c s d n g t o nt ++( b nc n gc t h x c n hm t n h i uh n h) , n s k h n g i q u k h c u i c o n t a i n e r n c h v o , v n t or a ( t h n gq u a c o nt r t o nt t h a mc h i u ) g i t r n t r n . C h r n gS ma r t P o i n t e r l m t t yc h n h p h h pc h oc o n t a i n e r n c t or a c h o , k h n gg i n gn h m t c o nt r b n ht h n g , k h n gc m t " m c c h c h u n g " c o nt r t h n gmi n h . B ns t mh i ut h mv c o nt r t h n gmi n hg i l " v n gl p " t r o n gc h n gc u i c n gc a c u ns c hn yv t r o n gT p2 ( t i v t w w w . B r u c e E c k e l . c o m) . T r o n gma i n( ) , m t k h i c c t h n gc h a o c c l m yv i o b j i t n g , m t S ma r t P o i n t e r s p c t or a . C o nt r t h n gmi n hg i x yr a t r o n gc c b i ut h c :
s p >f( ) ;c o nt r //t h n gm i n hg is p >g( ) ;

y , m c d s pk h n gt h c s c f ( ) v g( ) c h c n n gt h n hv i n , c c n h i uh n ht i c hc a c o nt r t n gg i n h n gc h c n n gc h oo b j * c t r v b i S ma r t P o i n t e r : : n h i uh n h. T r n hb i nd c ht h c h i nt t c c c k i mt r a > mb oc c c u c g i c h c n n gh o t n gt t . M c d c c c c h c b nc a t o nt t h a mc h i uc o nt r c n h i up h c t ph ns ov i c c n h k h a i t h c k h c , m c t i ul h o nt o ng i n gn h a u : c u n gc pm t c p h pt h u nt i nh nc h on g i s d n gc a c c l ph c c a b n . M t l pl n gn h a u Np h b i nh n x e m m t " c o nt r t h n gmi n h " h a y" l p " l pl n gb nt r o n gl pm n d c hv . V d t r c yc t h c v i t l i l mt S ma r t P o i n t e r t r o n gOb j C o n t a i n e r n h t h n y :


// :C 1 2 :N e s t e d S m a r t P o i n t e r . c p p #I n c l u d e #B a og m< v e c t o r >#b a og ms d n gt nm i nk h n gg i a nt i uc h u n " /r e q u i r e . h . . " ; l pO b j{ s t a t i ci n ti ,j ;c n gc n g : v o i df( ){ c o u t< <i++< <e n d l ; } t r n gg( ){ c o u t< <j< <e n d l ; } } ; // n hn g h at h n hv i nt n h : i n to b j: :i=4 7 ;i n to b j: :j=1 1 ; //C o n t a i n e r :l pO b j C o n t a i n e r{ v e c t o r< O b j * >m t ,c n g c h n g : l mm th i ul ct h m( o b j*o b j ){ a . p u s h _ b a c k( o b j ) ; } l pS m a r t P o i n t e r ; b n S m a r t P o i n t e r ; l pS m a r t P o i n t e r{ O b j C o n t a i n e r&o c ; u n s i g n e dc h s i n t ; c n gc n g : S m a r t P o i n t e r( O b j C o n t a i n e r&o b j c ) :o c( o b j c ){ i n d e x=0 ; } //T r v g i t r c h r ac u id a n hs c h : b o o lo p e r a t o r++( ){ //T i nt n u( c h s >=o c . a . s i z e( ) )r e t u r nf a l s e ; n u( o c . a[ ++i n d e x ]= =0 ) r e t u r nf a l s e ; r e t u r nt r u e ; } b o o lo p e r a t o r++( i n t ){ //P o s t f i x t r l i i uh n h++( ) ;//S d n gp h i nb nt i nt } O b j*o p e r a t o r >( )c o n s t{ y uc u( o c . a[ i n d e x ]=0 ," Z e r og i t r " ! " t r v b iS m a r t P o i n t e r: :o p e r a t o r >( ) " ) ; t r l io c . a[ i n d e x ] ; } } ; //C h cn n g t or am tc o nt r t h n gm i n h // i m uO b j C o n t a i n e r : S m a r t P o i n t e rb t u( ){ t r l iS m a r t P o i n t e r( * n y ) ; } } ; i n tm a i n( ){ c o n s ti n ts z=1 0 ; o b jo[ S Z ] ; O b j C o n t a i n e r o c ; f o r( i n ti=0 ;i< s z ;i++ ) o c . a d d( :D[ i ] ) ;// i nn l n O b j C o n t a i n e r: :S m a r t P o i n t e rs p=o c . b e g i n( ) ; d o{ s p >f( ) ;//C o nt r t i c hc ac u cg i i uh n h s p >g( ) ; }t r o n gk h i( ++s p ) ; }/// :~

B nc n hv i c l mt t h c t c a l p , c h c h a i s k h c b i t y . ut i nl t r o n gk h a i b oc a l p n c
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 205/320

08/10/2013

Suy ngh trong C + +, Vol 1

l pS m a r t P o i n t e r ;b nS m a r t P o i n t e r ;

t h l m t n g i b n:

T r n hb i nd c h ut i np h i b i t r n gc c l ph c t nt i t r c k h i n c t h c n i r n g l m t n g i b n . S k h c b i t t h h a i l t r o n gOb j C o n t a i n e r c h c n n gt h n hv i nb t u( ) , t r o n g s nx u t m t S ma r t P o i n t e r m i m n uOb j C o n t a i n e r t . M c d n t h c s c h l m t t i nn g h i , n c g i t r b i v n s a up h nc a b i um u c s d n gt r o n gt i uc h u n C++T h v i n . i uh n h >* C c n h i uh n h >* l m t n h i uh n hn h p h nm c x n h t t c c c t o nt k h c . N c c u n gc p c h on h n gt n hh u n gk h i b nmu nb t c h c c c h n hv i c u n gc p c x yd n gt r o n gc o nt r nt h n h v i n c p h p , c mt t r o n gc h n gt r c . C n gg i n gn h n h i uh n h >, c c t o nt t h a mc h i uc o nt r nt h n hv i nt h n g c s d n gv i m t s l o i i t n g i d i nc h om t " c o nt r t h n gmi n h " , m c d c c v d a r a ys c ng i nv v y n d h i u . B q u y t k h i x c n h i uh n h >* l n p h i t r l i m t i t n gm c c n h i uh n h( ) c t h c g i v i c c i s c h oc c h mt h n hv i nb n a n gg i i nt h o i . C c c u c g i c h c n n g i uh n h( ) p h i l m t c h c n n gt h n hv i n , v n c o c h n c h op h pb t k s l n gc c i s . Nl mc h o i t n gc a b nt r n gg i n gn h n t h c s l m t c h c n n g . M c d b nc t h x c n hm t s q u t i t o nt ( ) c h c n n gv i c c i s k h c n h a u , n t h n g c s d n gv i n h i ul o i m c h c m t h o t n g nl , h o c t n h t l m t c b i t n i b t n h t . B ns t h yt r o n gt p2 l t i uc h u nC+ +T h v i ns d n gc c n h i uh n hc u c g i c h c n n g t or a " i t n gc h c n n g . " t or a m t n h i uh n h >* t r c t i nb np h i t or a m t l ph c v i m t n h i uh n h( ) l c c l o i i t n gm n h i uh n h >* s t r l i . L pn yp h i b n gc c hn o n mb t c t h n gt i nc nt h i t k h i c c n h i uh n h( ) c g i l ( m x yr a t n g ) , c o nt r t o t h n hv i ns c d e r e f e r e n c e dc h o i t n g . T r o n gv d s a u ,c c F u n c t i o n Ob j e c c h px yd n gv t c c c a h n gc h a i c o nt r n i t n gv c o nt r nh mt h n hv i n , v s a u c c n h i uh n h( ) s d n gn h n gn g i t h c h i nc u c g i c o nt r nt h n hv i nt h c t :
// :C 1 2 :P o i n t e r T o M e m b e r O p e r a t o r . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; c l a s sD o g{ p u b l i c : i n tc h y( i n ti )c o n s t{ c o u t< <" c h y\n " ; t r l it i ; } i n t n( i n ti )c o n s t{ c o u t< <" n\n " ; t r l it i ; } i n tn g ( i n ti ){ c o n s t c o u t< <" Z Z Z\n " ; t r l it i ; } t y p e d e fi n t( D o g: :*P M F )( i n t )c o n s t ; //N h i uh n h >*p h it r l im t it n g //c m tn h i uh n h ( ) : l pF u n c t i o n O b j e c t{ C o nc h *p t r ; P M E MP M F ; c n gc n g : //L uc o nt r it n gv c o nt r t h n hv i n F u n c t i o n O b j e c t( C h *w p ,P M Fp m f ) :p t r( w p ) ,P M E M( p m f ){ c o u t< < " F u n c t i o n O b j e c tx yd n g\n " ; } //T h ch i nc u cg ib n gc c hs d n gc o nt r it n g //V t h n hv i nc o nt r i n to p e r a t o r( )( i n ti )c o n s t{ c o u t< < " F u n c t i o n O b j e c t: :o p e r a t o r( )\n " ; t r l i( p t r >*P M E M )( i ) ;//T h ch i n c u cg i } } ; F u n c t i o n O b j e c t i uh n h >*( P M Fp m f ){ c o u t< <" n h i uh n h >* "< < e n d l ; t r l iF u n c t i o n O b j e c t( n y ,p m f ) ; } } ; i n tm a i n( ){ C h w ; C h : :P M Fp m f=&D o g: : n g ; c o u t< <( w >*p m f )( 1 )< <e n d l ; p m f=&D o g: :g i cn g ; c o u t< <( w >*p m f )( 2 )< <e n d l ; p m f=& D o g: : n ; c o u t< <( w >*p m f )( 3 )< <e n d l ; }/// :~

C o nc h c b a c h c n n gt h n hv i n , t t c uc m t i n t i s v t r v m t i n t . P MFl m t t y p e d e f n g i nh a v i c x c n hm t p o i n t e r t ot h n hv i n c h c h c n n gc a t h n hv i n . M t F u n c t i o n Ob j e c c t or a v t r v b i t i uh n h >* . C h r n g i uh n h >* b i t c h a i i t n gc o nt r nt h n hv i n a n g c k ug i ( n y) v c o nt r nt h n hv i n , v n i nn h n g F u n c t i o n Ob j e c x yd n gm c c c a h n gc c g i t r . t K h i i uh n h >* c g i l , c c t r n hb i nd c hn g a y l pt c q u a yl i v g i i uh n h( ) c h og i t r t r l i c a n h i uh n h >* , i q u a t r o n gc c i s c


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 206/320

08/10/2013

Suy ngh trong C + +, Vol 1

a r a i uh n h >* . C c F u n c t i o n Ob j e c t : : n h i uh n h( c c c l pl u nv s a u ) d e r e f e r e n c e s " t h c s " c o nt r nt h n hv i ns d n gc o nt r i t n g c l ut r v c o nt r nt h n hv i n . Nh nt h yr n gn h n gg b n a n gl mg y , c n gn h v i c c n h i uh n h >, c c h nm n h g i a c a c u c g i i uh n h >* . i un yc h op h pb nt h c h i nm t s h o t n gt h mn ub nc n . C c n h i uh n h >* c c h t h c h i n yc h h o t n gc h oc c c h c n n gt h n hv i n c m t i n t i s v t r v m t i n t . yl h nc h , n h n gn ub nc g n gt or a c c c c h q u t i c h om i k h n n gk h c n h a u , n c v n h m t n h i mv c m. Ma ym nt h a y , C++' s muc c h ( c mt t r o n gc h n gc u i c n gc a c u ns c hn y , v t r o n gT p2 ) c t h i t k x l c h l m t v n n h v y .

Nh i uh n hb nc t h k h n gq u t i

C n h k h a i t h c n h t n ht r o n gc c t h i t l pc s nm k h n gc t h c q u t i . L d oc h u n gc a c c h nc h l a nt o n . N uc c n h k h a i t h c o v e r l o a d a b l e , n s b n gc c hn o g yn g u yh i mh o c p h v c c h a nt o n , l mc h om i v i c k h k h nh n , h o c n h ml nt h c h n hh i nc . V i c l a c h nt h n hv i n i uh n h. Hi nn a y , d uc h mc n g h a c h ob t k t h n hv i nt r o n gm t l p h c , n h n gn ub nc h op h pn c q u t i , s a u b nk h n gt h t r u yc pc c t h n hv i nt h e oc c ht h n g t h n g , t h a yv o b ns p h i s d n gm t c o nt r v m i t n i uh n h >. C o nt r t i c ht h n hv i n i uh n h . * , v i c n gl d on h n h i uh n h. k h n gc t o nt l yt h a . S l a c h np h b i nn h t c h o i un yl i uh n h* * t F o r t r a n , n h n g i u n yl nl nk h k h nc uh i p h nt c hc p h p . Ng o i r a , Ck h n gc n g i i uh n hl yt h a , d o , C+ + , c v n h k h n gc nm t t r o n gh a i b i v b nl u nl u nc t h t h c h i nm t c u c g i c h c n n g . M t n h i uh n hl yt h a s t h m m t k h i ut h u nt i n , n h n gk h n gc c h c n n gn g nn g m i v ot i k h o n c h os p h c t pn h t c a t r n hb i nd c h . K h n gc c c n h k h a i t h c s d n g c x c n h . C n g h a l , b nk h n gt h t on nc c n h k h a i t h c m i m k h n gp h i l h i nt i b n y . M t p h nc a v n l l mt h n o x c n ht h t ut i n , v m t p h n c a v n l m t n h uc uk h n g g i i t h c hc h on h n gr c r i c nt h i t . B nk h n gt h t h a y i c c q u yt c ut i n . H a n gk h n h v n l k h n g c h on g i c h i v i h .

C cn h k h a i t h ck h n gt h n hv i n

T r o n gm t s v d t r c , c c n h k h a i t h c c t h l t h n hv i nh a yk h n gl t h n hv i n , v n d n gn h k h n gl mc h on h i us k h c b i t . i un yt h n g t r a c uh i , " T i n nc h na i ? " N i c h u n g , n un k h n gt h c h i nb t k s k h c b i t , h p h i l t h n hv i n , n h nm n hm i l i nh g i a c c n h i uh n hv c c l ph c . K h i t o nh n gb nt r i l u nl u nl m t i t n gc a l ph i nt i , i un yh o t n gt t . T u yn h i n , i k h i b nmu nc c t o nh n gb nt r i l m t i t n gc a m t l pk h c . M t n i t h n gt h n g b ns t h y i un yl k h i c c n h k h a i t h c < <v > > c q u t i c h oi o s t r e a ms . T i o s t r e a ms l m t n n t n gC++ , c t h b ns mu nq u t i c c n h i uh n hc h oh uh t c c l ph c c a b n , v v yq u t r n hn y l n gg h i n h :

// :C 1 2 :I o s t r e a m O p e r a t o r O v e r l o a d i n g . c p p //V d v k h a it h cq u t ik h n gt h n hv i n #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< s s t r e a m >//" d n gS t r i n g " #B a og m< c s t r i n g >s d n gt nm i nk h n gg i a nt i uc h u n ; l pI n t A r r a y{ e n u m{ s z=5 } ; i n ti[ S Z ] ,c n gc h n g : I n t A r r a y( ){ m e m s e t( i ,0 ,s z*s i z e o f( *i ) ) ; } i n t&o p e r a t o r[ ]( i n tx ){ y uc u( x >=0& &x< S Z , " I n t A r r a y: :o p e r a t o r[ ]r ak h ip h mv i " ) ; r e t u r ni[ x ] ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tI n t A r r a y&i a ) ; b ni s t r e a m & o p e r a t o r> >( i s t r e a m&l ,I n t A r r a y&i a ) ; } ; o s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tI n t A r r a y&i a ){ f o r( i n tj=0 ;j < i a . s z ;j++ ){ o s< <i a . i[ j ] ; i f( j=i a . s z1 ! ) o s< <" " ; } o s< <e n d l ; t r l ih i uh n h ; } i s t r e a m&o p e r a t o r> >( i s t r e a m&l ,I n t A r r a y&i a ){ f o r( i n tj=0 ;j< i a . s z ;j ++ ) l > >i a . i[ j ] ; t r l il ; } i n tm a i n( ){ s t r i n g s t r e a m uv o( " 4 73 45 69 21 0 3 " ) ; I n t A r r a yt i ; uv o> >t i ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 207/320

08/10/2013

Suy ngh trong C + +, Vol 1

T i[ 4 ]=1 ;//S d n gt o nt q u t i[ ]

c o u t< <t i ; }/// :~

L pn yc n gc c h a m t q u t i t o nt [ ] , t r o n g t r v m t t h a mc h i u nm t g i t r h pp h pt r o n g m n g . B i v m t t i l i ut h a mk h o c t r l i , b i uh i n
T i[ 4 ]=1 ;

k h n gc h c v n h i uh nv nmi n hh nn uc o nt r c s d n g , n c n gh o nt h n hh i uq u mo n gmu n . i uq u a nt r n gl c c n h k h a i t h c d c hc h u y nq u t i v t q u a v t r l i b n g c c h t h a mc h i u, d o h n h n gs n hh n g nc c i t n gb nn g o i . T r o n g n hn g h a c h c n n g , b i uh i nn h o s< <i a . i[ j ] ; g yr a h i nc h c n n g i uh n hq u t i c g i l ( c n g h a l , n h n gq u y n ht i < i o s t r e a m>) . T r o n g t r n gh pn y , c c c h c n n g c g i l o s t r e a m &o p e r a t o r < <( o s t r e a m &, t r o n gv t ) i a . i [ j ] r e s o l v e s n m t i n t . M t k h i t t c c c h n h n g c t h c h i nt r ni s t r e a mh o c o s t r e a m, n c t r l i n c t h c s d n g t r o n gm t b i ut h c p h c t ph n . T r o n gma i n( ) , m t l o i m i c a i o s t r e a m c s d n g : c c s t r i n g s t r e a m( t u y nb t r o n g< s s t r e a m>) . yl m t l pm p h i m t m t c h u i ( m n c t h t or a t m t c h a r m n g , n h h i nt h y ) v b i nn t h n hm t i o s t r e a m. T r o n gv d t r n , i un yc n g h a l c c n h k h a i t h c c h u y n i c t h c k i mt r a m k h n g c nm m t t pt i nh o c g d l i ut r o n gt r nd n gl n h . H n ht h c t h h i nt r o n gv d n yc h oI n s e r t e r v g i i n nl t i uc h u n . N ub nmu nt or a n h n gn h k h a i t h c c h ol ph c c a r i n gc a b n , s a oc h pc h k c h c n n gv k i ut r v t r nv t h c h i nt h e oc c h n h t h c c a c t h .

H n gd nc b n
i uh n h

[ 4 6 ] Mu r r a y c h ot h yc c h n gd nc h ov i c l a c h ng i a c c t h n hv i nv k h n gt h n hv i n : K h u y nc os d n g t h n hv i n p h i l t h n hv i n t h n hv i n k h n gt h n hv i n

T t c c c n h k h a i t h c n g u y np h n =( ) [ ] >>* += = / = * = ^= & = |= % = > > = < <= T t c c c t o nt k h c

Qu t i g i a o

M t n g u nc h u n gc a s n h ml nv i C++m i l pt r n hl c h u y nn h n g . i un yl k h n gc n g h i n g v =d uh i ul m t h o t n gc b nt r o n gl pt r n h , p h i x u n g s a oc h pm t n gk c pm y . Ng o i r a , c c b ns a o x yd n g( mt t r o n gC h n g1 1 ) c n g i k h i g i k h i =d uh i u c s d n g : T r o n gd n gt h h a i , c c i t n gmt a n g c x c n h . M t i t n gm i a n g c t or a m t n i k h n g t nt i t r c . B i v b nb i t b yg i t h n op h n gn g c a C++l v i t n gk h i t o , b nb i t r n gm t n h x yd n gl u nl u np h i c g i v ot h i i m m m t i t n g c x c n h . ? Nh n gm x yd n g mt a n g c t or a t m t h i nMy T y p e i t n g( b, p h a b np h i c a d ub n g ) , d o , c h c m t s l a c h n : b ns a o x yd n g . M c d m t d ub n gc l i nq u a n , b ns a o x yd n g c g i . T r o n gd n gt h b a , m i t h k h c . p h a b nt r i c a d ub n g , c m t i t n gk h i t ot r c . R r n g , b nk h n gt h g i m t n h x yd n gc h om t i t n g c t or a . T r o n gt r n gh pn yMy T y p e : : o p e r a t o r = c g i l c h omt , t h a mg i a n h l m t i b t c i ug x u t h i n p h a b nt a yp h i . ( B nc t h c n h i un h i uh n h=c h c n n g c c c l o i k h c n h a uc a c c i s b np h i . ) H n hv i n yk h n gc h g i i h nc c b ns a o x yd n g . B t c l c n ob nk h i t om t i t n gs d n g=t h a y c h oh n ht h c c h c n n gc u c g i t h n gt h n gc a c c n h x yd n g , t r n hb i nd c hs t m m t n h x yd n g m c h pn h nb t c t h g p h a b np h i :

M y T y p eb ;M y T y p ea=b ;a=b ;

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

208/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 1 2 :C o p y i n g V s I n i t i a l i z a t i o n . c p pl pF i{ p u b l i c : F i( ){ } } ; l pP h { p u b l i c : P h ( i n t ){ } L p h ( c o n s tF i& ){ } } ; i n tm a i n( ){ L p h l p h =1 ;//P h ( i n t ) F if i ; P h F u m=f i//P h ( F i ) }/// :~

K h i g i a od c hv i c c =d uh i u , i uq u a nt r n g g i c h os k h c b i t n yt r o n gt mt r : N u i t n g k h n g c t or a c h a , k h i t ol c nt h i t , n uk h n gs p h nc n g i uh n h= c s d n g . Nt h mc h c nt t h n t r n hv i t m c s d n g= k h i t o , t h a yv o , l u nl u ns d n gc c h n ht h c x yd n gr r n g . Ha i c n gt r n hx yd n gv i c c d ub n gs a u t r t h n h :
L p h l p h ( 1 ) ; P h F u m( f i ) ;

B n gc c hn y , b ns t r n hg yn h ml n c g i c a b n .

H n hv i c ac cn h i uh n h=
T r o n gI n t e g e r . hv B y t e . h, b n t h yr n g i uh n h=c t h c h l m t c h cn n gt h n hv i n . Nl i n q u a nm t t h i t nc c i t n g p h a b nt r i c a ' =' . N un c t h x c n h i uh n h=t o nc u , s a u b nc t h c g n g x c n hl i c x yd n gt r o n g' =' d uh i u : i n to p e r a t o r =( i n t ,M y T y p e ) ;/ /t o n
c u=k h n gc h op h p !

T r n hb i nd c hv yt o nb v n n yb n gc c hb u c b nt h c h i n i uh n h=m t h mt h n hv i n . K h i b nt or a m t n h i uh n h=, b np h i s a oc h pt t c c c t h n gt i nc nt h i t t c c i t n gb np h i v o i t n gh i nt i ( c n g h a l , c c i t n g i uh n h= a n g c k ug i ) t h c h i nb t c i ug b nc h ol " c h u y nn h n g " c h ol ph c c a b n. C h oc c i t n g ng i n , i un yl r r n g :


// :C 1 2 :S i m p l e A s s i g n m e n t . c p p // ng i no p e r a t o r=( )#i n c l u d eu s i n gn a m e s p a c es t d ; G i t r l p{ i n ta ,b , f l o a tc ;c n gc n g : G i t r ( i n ta a=0 ,i n tb b=0 ,f l o a tc c=0 . 0 ) :A( a a ) ,b( b b ) ,c( c c ){ } G i t r &o p e r a t o r=( c o n s tG i t r &r v ){ a=r v . a ; b=r v . b ; c=r v . c ; *t r l in y ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tG i t r &r v ){ t r l i o s< <" a= "< <r v . a< <" ,b= " < <R v . b< <" ,c= "< <r v . c ; } } ; i n tm a i n( ){ G i t r a ,b( 1 ,2 ,3 . 3 ) ; c o u t< <" l : "< <a < <e n d l ; c o u t< <" b : "< <b< <e n d l ; a=b; c o u t< <" m tn h i mv s a u : "< <a< <e n d l ; }/// :~

y , c c i t n g p h a b nt r i c a =b ns a ot t c c c y ut c a i t n g b np h i , s a u t r v m t t h a mc h i u nb nt h n , c h op h pm t b i ut h c p h c t ph n c t or a . V d n yb a og m m t s a i l mp h b i n . K h i b n a n gg i a oh a i i t n gc n gl o i , b nn nl u nl u nk i m t r a ut i nc h os e l f a s s i g n me n t : l c c i t n g c g i a oc h oc h n hn ? T r o n gm t s t r n gh p , c h n gh n n h m t n y , n v h i n ub nt h c h i nc c h o t n gc h u y nn h n gd s a o , n h n gn ut h a y i c t h c h i n t h c h i nc c l ph c , n c t h t os k h c b i t , v n ub nk h n gl m i u n h m t v n t h i q u e n, b nc t h q u nv g yk h k h n t ml i . C o nt r t r o n gl p i ug x yr a n u i t n gk h n gp h i l q u ng i n ? V d , n u i t n gc h a c o nt r nc c i t n g k h c ? ng i nc h c ns a oc h pm t c o nt r c n g h a l b ns k t t h c v i h a i i t n gt r nv t r l ut r t n gt . T r o n gn h n gt n hh u n gn h t h n y , b nc nl ms s c hk t o nc a r i n gb n . C h a i p h n gp h pc h u n gc h ov n n y . C c k t h u t ng i nn h t l s a oc h pb t c i ug c o nt r c p nk h i b nl m m t c h u y nn h n gh o c m t b ns a ox yd n g . yl ng i n :
// :C 1 2 :C o p y i n g W i t h P o i n t e r s . c p p //G i iq u y tv n r n gc ac o nt r b i
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 209/320

08/10/2013

Suy ngh trong C + +, Vol 1

//S a oc h pn h n gg cc h r at r o n g //c h u y nn h n gv s a oc h p x yd n g . #B a og m" . ./R e q u i r e . h " #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; c l a s sD o g{ c h u in m ,c n gc h n g : C o nc h ( c o n s ts t r i n gv t n ) :n m( t n ){ c o u t< <" T oD o g : "< <*n y< <e n d l ; } //T n gh ps a oc h px yd n gv i uh n h= //l c h n hx c . //T om tc o nc h t m tc o nt r D o g : C o nc h ( c o n s tC h *d p ,c o n s ts t r i n g&m s g ) :N m( d p >n m+m s g ){ c o u t< <" s a oc h pc h "< <*< <" t " < <*D p< <e n d l ; } ~D o g( ){ c o u t< <" X aD o g : "< <*n y< <e n d l ; } t r n g it n( c o n s ts t r i n g&n e w N a m e ){ n m=n e w N a m e ; c o u t< < " C h it nt h n h : "< <*n y< <e n d l ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tD o g&d ){ t r l io s < <" [ "< <d . n m< <" ] " ; } } ; l pD o g h o u s e{ C h *p ; c h u ih o u s e N a m e ,c n g c h n g : D o g h o u s e( c h c o nc h * ,c o n s ts t r i n g&n h ) :P( c o nc h ) ,h o u s e N a m e( n h ){ } D o g h o u s e( c o n s tD o g h o u s e&d h ) :p( m iD o g( d h . p ," s a oc h px yd n g " ) ) , h o u s e N a m e( d h . h o u s e N a m e +" b ns a o x yd n g " ){ } D o g h o u s e&o p e r a t o r=( c o n s tD o g h o u s e&d h ){ //K i mt r at p h nc n g : ( ! &d h=n y )n u{ p=n e wD o g( d h . p ," p h nc n g " ) ;h o u s e N a m e=d h . h o u s e N a m e+ " g i a o " ; } *t r l in y ; } t r n gr e n a m e H o u s e( c o n s ts t r i n g&n e w N a m e ){ h o u s e N a m e=n e w N a m e ; } C o nc h *g e t D o g( )c o n s t{ r e t u r np ; } ~D o g h o u s e( ){ d e l e t ep ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tD o g h o u s e&d h ){ t r l io s< <" [ "< < d h . h o u s e N a m e < <" ]C h a "< <*d h . p ; } } ; i n tm a i n( ){ F i d o sD o g h o u s e( D o gm i( " F i d o " ) ," F i d o H o u s e " ) ; c o u t< <f i d o s< <e n d l ; D o g h o u s ef i d o s 2=f i d o s ;//S a oc h px yd n g c o u t< <f i d o s 2< <e n d l ; f i d o s 2 . g e t D o g ( )> it n( " i m " ) ; f i d o s 2 . r e n a m e H o u s e( " S p o t H o u s e " ) ; c o u t< <f i d o s 2< <e n d l ; f i d o s=f i d o s 2 ;//P h n c o u t< <f i d o s< <e n d l ; f i d o s . g e t D o g( )> it n( " M a x " ) ; f i d o s 2 . r e n a m e H o u s e( " M a x H o u s e " ) ; }/// :~

C o nc h l m t l p ng i nc h c h a m t c h u i c h a t nc a c o nc h . T u yn h i n , b ns t h n gb i t t r c i u g s x yr a v i m t c o nc h b i v c c n h x yd n gv h mh yi nt h n gt i nk h i c h n g c g i l . C h r n gc c n h x yd n gt h h a i l m t c h t g i n gn h m t b ns a o x yd n gn g o i t r v i c n c m t c o nt r nm t c o nc h t h a yv m t t i l i ut h a mk h o , v n c m t s t h h a i l t h n g i p l n i v i i s Do g' s t n . N y c s d n g g i pt h e od i c c h n hv i c a c h n gt r n h . B nc t h t h yr n gb t c k h i n om t t h n hv i nc h c n n gi nt h n gt i n , n k h n gt r u yc pt h n gt i nt r c t i p n h n gt h a yv g i * n y nc o u t . i un yl nl t g i o s t r e a m i uh n h< <. Nc g i t r l m i u t h e oc c hn yb i v n ub nmu n n hd n gl i c c hm c h t h n gt i n c h i nt h ( n h t i l mb n gc c h t h m' [ ' v ' ] ' ) , b nc h c nl m i u m t n i . M t Do g h o u s e c h a m t c o nc h * v t h h i nb nc h c n n gb ns l u nl u nc np h i x c n hk h i l ph c c a b nc c h a c o nt r : t t c c c n h x yd n gt h n gt h n gc nt h i t , c c b ns a o x yd n g , i uh n h= ( h o c n hn g h a n h o c k h n gc h op h pn ) , v m t d e s t r u c t o r . C c n h i uh n h=k i mt r a t p h n c n gn h m t i ut t y u , m c d n k h n gt h c s c nt h i t y . i un yh un h l o i b k h n n gr n g b ns q u n k i mt r a t c h u y nn h n gn ub nk h n g t h a y i m n c v n . mt h a mk h o T r o n gv d t r n , c c b ns a o x yd n gv i uh n h=t om t b ns a om i c a n h n gg c o nt r t r t i , v h y x a n . T u yn h i n , n u i t n gc a b n i h i n h i ub n h h o c m t c h i p h k h i t oc a o , b nc t h mu n t r n hv i c s a oc h pn y . M t c c ht i pc nc h u n gc h ov n n y c g i l t n h t h a mk h o . B nc u n gc pc h o t n hb o nc c i t n g a n g c c h r a n b i t b a on h i u i t n g c t r nn . S a u s a oc h p x yd n gh o c c h u y nn h n gc n g h a l g nm t c o nt r nm t i t n gh i nc v c c ht n gs l n gt i l i ut h a mk h o . P h h yc n g h a l l mg i mt n ht h a mk h ov p h h yc c i t n gn ut n ht h a mk h o i k h n g .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 210/320

08/10/2013

Suy ngh trong C + +, Vol 1

Nh n gn ub nmu nv i t t h c h oc c i t n g( n h n gc o nc h t r o n gv d t r n ) ? Nh i uh nm t i t n gc t h c s d n gn yDo g, v v yb ns c s a i c a n g i k h c c h c n gn h c a b n , m k h n gc v r t l n gg i n g . g i i q u y t i un y" r n gc a " v n , m t k t h u t b s u n g c g i c o p y o n v i t c s d n g . T r c k h i g h i v om t k h i c a b n h , b nc h c c h nr n gk h n ga i k h c a n gs d n gn . N us t h a m c h i ul l nh nm t , b np h i l mc h om n hm t b ns a oc n h nc a k h i t r c k h i v i t n , v v yb nk h n g l mp h i nn g i k h c s n . D i yl m t v d ng i nc a t n ht h a mk h ov c o p y o n v i t :


// :C 1 2 :R e f e r e n c e C o u n t i n g . c p p //S t h a mk h o ,c o p y o n v i t #B a og m" . ./R e q u i r e . h " #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; c l a s sD o g{ c h u in m ; i n tr e f c o u n t ; D o g( c o n s ts t r i n g&t n ) :n m( t n ) , r e f c o u n t( 1 ){ c o u t< <" T oD o g : "< <*n y< <e n d l ; } //N g nc h nv i c : D o g&o p e r a t o r=( c o n s tD o g&r v ) ,c n gc h n g : //C h c h c t h ct or at r nh e a p : t n hC h *l m( c o n s ts t r i n g&n a m e ){ t r l iD o gm i( t n ) ; } C o nc h ( c o n s tD o g&d ) :N m( d . n m+" b ns a o " ) ,r e f c o u n t( 1 ){ c o u t< <" C h b ns a o x yd n g : " < <*N y< <e n d l ; } ~D o g( ){ c o u t< <" X aD o g : "< <*n y< <e n d l ; } t r n g n hk m( ){ ++r e f c o u n t ; c o u t< <" n hk mD o g : "< <*n y< < e n d l ; } k h o n gt r n gr i n gr a( ){ y uc u( r e f c o u n t=0 ) ; c o u t< <" T c hD o g : " < <*n y< <e n d l ; //D e s t r o y it n gn uk h n gc a is d n gn : n u( -r e f c o u n t= =0 )x an y ; } //C i uk i ns a oc h pc h n y . //G it r ck h is a ic h ,g n //k tq u l c o nt r nc o nc h c ab n* . C h *u n a l i a s( ){ c o u t< <" U n a l i a s i n gD o g : "< <*n y< <e n d l ; //K h n gt r n g l pn uk h n gb d a n h : i f( r e f c o u n t= =1 )t r l in y ; -R e f c o u n t ; //S d n gb ns a o x yd n gn h nb n : C h t r l im i( *n y ) ; } t r n g it n( c o n s ts t r i n g&n e w N a m e ){ n m=n e w N a m e ; c o u t< <" C h i t nt h n h : "< <*n y< <e n d l ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tD o g&d ){ t r l io s < <" [ "< <d . n m< <" ] ,r c= " < <D . r e f c o u n t ; } } ; l pD o g h o u s e{ C h *p ; c h u ih o u s e N a m e ,c n g c h n g : D o g h o u s e( c h c o nc h * ,c o n s ts t r i n g&n h ) :P( c o nc h ) ,h o u s e N a m e( n h ){ c o u t< <" t oD o g h o u s e : "< <*n y< <e n d l ; } D o g h o u s e( c o n s tD o g h o u s e&d h ) :P( d h . p ) , h o u s e N a m e( " b ns a o x yd n g "+ d h . h o u s e N a m e ){ p > n hk m( ) ; c o u t< <" D o g h o u s es a oc h px yd n g : " < <*N y< <e n d l ; } D o g h o u s e&o p e r a t o r=( c o n s tD o g h o u s e&d h ){ //K i mt r at p h n : n u{ ( &d h=n y ! ) h o u s e N a m e=d h . h o u s e N a m e+" g i a o " ; //L ms c h n h n gg b n a n gs d n g ut i n : p >r i n gr a( ) ; p=d h . p ;//G i n g n h b ns a o x yd n g p> n hk m( ) ; } c o u t< <" n h i uh n h D o g h o u s e= : " < <*n y< <e n d l ; *t r l in y ; } //G i md nr e f c o u n t ,c i uk i nt i ud i t ~D o g h o u s e( ){ c o u t< <" D o g h o u s eh y : " < <*n y< <e n d l ; p > r i n gr a( ) ; } t r n gr e n a m e H o u s e( c o n s ts t r i n g&n e w N a m e ){ h o u s e N a m e= n e w N a m e ; } t r n gu n a l i a s( ){ p=p >u n a l i a s( ) ; } //C o p y o n v i t .B tc l cn ob n s a i //N id u n gc ac o nt r b np h i u n a l i a s// ut i n : k h o n gt r n gr e n a m e D o g( c o n s ts t r i n g&n e w N a m e ){ u n a l i a s( ) ; p > i t n( n e w N a m e ) ; }
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 211/320

08/10/2013

Suy ngh trong C + +, Vol 1

//. . .h o ck h ib nc h op h pn g ik h ct r u yc p : C h *g e t D o g( ){ u n a l i a s ( ) ; t r l ip ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tD o g h o u s e&d h ){ t r l io s < <" [ "< <d h . h o u s e N a m e < <" ]C h a "< <*d h . p ; } } ; i n tm a i n( ){ D o g h o u s e f i d o s( D o g: :t h ch i n( " F i d o " ) ," F i d o H o u s e " ) , i m( D o g: :t h ch i n( " i m " ) ," S p o t H o u s e " ) ; c o u t< <" N h pb nx yd n g" < <e n d l ; B o b sD o g h o u s e( f i d o s ) ; c o u t< <" S a uk h is a oc h px yd n gB o b s "< <e n d l ; c o u t< < " f i d o s : "< <f i d o s< <e n d l ; c o u t< <" i m : "< < i m<< e n d l ; c o u t< <" B o b s : "< <B o b s < <e n d l ; c o u t< <" N h p i m=f i d o s "< <e n d l ; i m=f i d o s ; c o u t< <" S a uk h i i m =f i d o s "< <e n d l ; c o u t< <" i m : "< < i m< <e n d l ; c o u t< <" N h pt c h u y nn h n g " < <e n d l ; B o b s=B o b s ; c o u t< <" S a uk h it p h nc n g "< <e n d l ; c o u t< <" B o b s : "< < B o b s< <e n d l ; //T h ol u nr ac cd n gs a u : c o u t< <" B cv o it n( \ "B o b\" ) "< <e n d l ; b o b s . g e t D o g( )> it n ( " B o b " ) ; c o u t< <" S a uk h i it n( \ "B o b\" ) "< <e n d l ;}/// :~

L pDo gl i t n g c t r nb i m t n h a c h u t . Nc h a m t s t i l i ut h a mk h ov c c c h c n n gk i ms o t v c t n ht h a mk h o . C m t b ns a o x yd n g b nc t h l mc h om t m i C h t c s n . C c n hk m( ) g i a t n gc h c n n gt n ht h a mk h oc a m t c o nc h c h c m t i t n gs d n gn . t c h( ) d e c r e me n t st n ht h a mk h o . N ut n ht h a mk h o i v k h n g , s a u k h n ga i c s d n gn n a , v v yc c t h n hv i nn n gt i ud i t i t n gr i n gc a m n hb n gc c hn i r n gx a n y. T r c k h i b nt h c h i nb t k s a i ( n h i t nm t c o nc h ) , b nn n mb or n gb nk h n gp h i t h a y i m t c o nc h m m t s i t n gk h c a n gs d n g . B nl m i un yb n gc c hg i Do g h o u s e : : u n a l i a s ( m ) s g i C h : : u n a l i a s ( . ) C h c n n gt h h a i s t r l i v i h i nt i c h c o nt r n us t i l i ut h a mk h ol m t ( c n g h a l k h n ga i k h c l c h v i c h ) , n h n gs l pl i t r o n gc c Do gn ut n ht h a mk h on h i uh n m t . B ns a o x yd n g , t h a yv t or a b n h c a n , g i a oc h c h oc h c a i t n gn g u n . S a u , b i v b yg i c m t i t n gk h c s d n gm k h i c a b n h , n g i a t n gs l n gt i l i ut h a mk h ob n gc c hg i C h : : n hk m( . ) C c n h i uh n h=g i a od c hv i m t i t n g c t or a p h a b nt r i c a =, d o ut i np h i l m s c hm l nb n gc c hg i r i n gr a ( ) c h or n gc h , s p h h yc c c c h n uk h n gc a i k h c a n gs d n gn . S a u , n h i uh n h=l pl i h n hv i c a c c c o p y c o n s t r u c t o r . C h r n gn ut i nk i mt r a p h t h i nx e mb n a n gg nc n gm t i t n gc h oc h n hn . D e s t r u c t o r g i t c h( ) c i uk i nt i ud i t c h . t h c h i nc o p y o n v i t , b np h i k i ms o t t t c c c h n h n gm v i t t h c h ok h i c a b n h . V d , r e n a me Do g( ) c h c n n gt h n hv i nc h op h pb nt h a y i c c g i t r t r o n gk h i c a b n h . Nh n gt r c t i n , n s d n gu n a l i a s ( ) n g nc h ns t h a y i c a m t r n gc a C h ( m t c o nc h c n h i uh nm t n h a c h u t i t n gt r nn ) . V n ub nc n s nx u t m t c o nt r nm t c o nc h t b nt r o n gm t n h a c h u t , b nu n a l i a s ( ) m c o nt r ut i n . ma i n( ) k i mt r ac c c h c n n gk h c n h a um p h i l mv i c m t c c hc h n hx c t h c h i nt h a mc h i u m: c c n h x yd n g , s a oc h p x yd n g , i uh n h=, v h y . Nc n gk i mt r ac c b ns a o o n v i t b n gc c h g i r e n a me Do g( ) .


T oD o g :[ F i d o ] ,r c=1t oD o g h o u s e :[ F i d o H o u s e ] c h a[ F i d o ] ,r c=1 T oD o g :[ i m ] ,r c=1t oD o g h o u s e :[ S p o t H o u s e ] c [ i m ] ,r c=1 b nB cv ox yd n g K mt h e oc h :[ F i d o ] ,r c=2D o g h o u s es a oc h px yd n g : [ s a oc h px yd n g F i d o H o u s e ] c h a[ F i d o ] ,r c=2S a uk h is a oc h px yd n gB o b sf i d o s : [ F i d o H o u s e ]c h a[ F i d o ] ,r c=2 i m :[S p o t H o u s e ]c [ i m ] ,r c=1B o b s :[ s a o c h px yd n gF i d o H o u s e ] c h a[ F i d o ] ,r c=2 i mB cv o=f i d o s T c hD o g :[ i m ] ,r c=1 X aD o g :[ i m ] ,r c=0 K mt h e oc h :[ F i d o ] ,r c=3 i uh n hD o g h o u s e= :[ F i d o H o u s eg i a o ] c h a[ F i d o ] , r c=3S a uk h i i m=f i d o s i m :[ F i d o H o u s eg i a o ]c h a[ F i d o ] ,r c=3B cv ot p h nc n g i uh n hD o g h o u s e= :[ s a oc h px yd n gF i d o H o u s e ] c h a[ F i d o ] ,r c=3S a uk h iB o b st p h nc n g :[ s a oc h px yd n gF i d o H o u s e ] c h a[ F i d o ] ,r c=3B cv o it n( " B o b " ) S a uk h i it n( " B o b " ) D o g h o u s eh y :[ s a oc h px yd n gF i d o H o u s e ] c h a[ F i d o ] ,r c=3T c hD o g :[ F i d o ] ,r c=3 n h a c h u th y :[ F i d o H o u s eg i a o ] c h a[ F i d o ] ,r c=2T c hD o g :[ F i d o ] ,r c=2 D o g h o u s eh y :[ F i d o H o u s e ] c h a[ F i d o ] ,r c=1T c hD o g :[ F i d o ] ,r c=1 X aD o g :[ F i d o ] ,r c=0
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 212/320

yl ur a ( s a uk h i m t d n g t ) :

08/10/2013

Suy ngh trong C + +, Vol 1

B n gc c hn g h i nc u ur a , t r u yt mt h n gq u a m n g u n , v t h n g h i mv i c c c h n gt r n h , b ns l m s us c t h ms h i ub i t c a b nv c c k t h u t . T n g i uh n h= t o B i v c h n hm t i t n g nm t i t n gc n g l o i l m t h o t n gh uh t m i n g i mo n g i c t h , t r n hb i nd c hs t n gt or a m t l o i : : o p e r a t o r =( l o i n ub nk h n gl m m t . ) C c h n hv i c a n h i uh n hn yb t c h c c a t n gt or a b ns a o x yd n g , n ul pc h a c c i t n g( h o c c t h a k t m t l pk h c ) , c c n h i uh n h=c h oc c i t n g c g i l q u y . i un y c g i l m e m b e r w i s e n h n g . V d ,
// :C 1 2 :A u t o m a t i c O p e r a t o r E q u a l s . c p p #I n c l u d eu s i n gn a m e s p a c es t d ; l ph n g{ p u b l i c : H n gh a&o p e r a t o r=( c o n s th n g& ){ c o u t< <" t r o n gh n g: :o p e r a t o r=( ) "< < e n d l ; *t r l in y ; } } ; l px et i{ H n gh ab ; } ; i n tm a i n( ){ x et ia ,b , a=b ;//I n :" t r o n gh n g: :o p e r a t o r=( ) " }// / :~

T n gt or a i uh n h=c h ox e t i g i h n g: : o p e r a t o r =. N i c h u n g , b nk h n gmu n c h oc c t r n hb i nd c hl m i un yc h ob n . V i c c l ph c c a b t k t i n ht ( c b i t l n uh c c o nt r ! ) B nmu nt or a m t c c hr r n gm t i uh n h=. N ub nt h c s k h n g mu nm i n g i t h c h i nc h u y nn h n g , k k h a i , i uh n h=n h m t t i nc h c n n g . ( B nk h n gc np h i n hn g h a n , t r k h i b n a n gs d n gn t r o n gc c l ph c . )

L o i c h u y n i t n g

T r o n gCv C++ , n ut r n hb i nd c ht h ym t b i uh i nh o c c h c n n gg i s d n gm t l o i k h n gp h i l h o nt o nm t c nt h i t , n c t h t h n gx u y nt h c h i nm t l o i c h u y n i t n gt l o i n p h i l o i n mu n . T r o n gC++ , b nc t h t c t c d n gt n gt n yc h on g i d n gx c n hl o i b n gc c hx c n h c c c h c n n gc h u y n i l o i h n ht n g . C c c h c n n gn yg mh a i l o i : m t l o i h n hc t h c a n h x y d n gv i uh n hq u t i .

C h u y n i x yd n g

N ub n n hn g h a m t c o n s t r u c t o r m m t n h i s d u yn h t c a m t i t n g( h o c t h a mc h i u ) c a l o i k h c , x yd n g , c h op h pt r n hb i nd c h t h c h i nm t l o i c h u y n i t n g . V d ,

// :C 1 2 :A u t o m a t i c T y p e C o n v e r s i o n . c p p//L o ic h u y n ic o n s t r u c t o rl pM t { p u b l i c : M t( ){ } } ; l pH a i{ p u b l i c : H a i( c o n s tO n e& ){ } } ; v o i df( H a i ){ } i n tm a i n( ){ M tm t ; f( m t ) ;//M u nc m th a i ,c m t }/// :~

K h i t r n hb i nd c ht h yf ( ) c g i v i mt i t n g , n n h nv ot k h a i c h of ( ) v t h n gb on mu nm t h a i . S a u , n s t mh i ux e mc c c hn o c c m t h a i t mt , v n t mt h yc c n h x yd n gHa i : : Ha i ( Mt , m n l n gl g i . C c k t q u ) Ha i i t n g c g i a oc h of ( ) . T r o n gt r n gh pn y , c h u y n i l o i h n ht n g c ub nk h i n h n gr c r i c a v i c x c n hh a i p h i n b nq u t i c a f ( ) . T u yn h i n , c h i p h c c c u c g i n x yd n gh a i , c t h q u a nt r n gn ub nl on g i v h i uq u c a c c c u c g i nf ( ) . Ng nc h nc h u y n i x yd n g C l nk h i c h u y n i l o i h n ht n gt h n gq u a c c n h x yd n gc t h g yr a v n . t t n i , b n t h a y i c c n h x yd n gc nm uv i t k h a r r n g( m c h l mv i c v i n h t h u ) . c s d n g s a i c c n h x yd n gc a l pHa i t r o n gv d t r n :
// :C 1 2 :E x p l i c i t K e y w o r d . c p p//S d n g" r r n g "t k h o c l a s sM t { p u b l i c : M t( ){ } } ; l pH a i{ p u b l i c : H a ir r n g( c o n s tO n e& ){ } } ; v o i df( H a i ){ } i n tm a i n( ){
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 213/320

08/10/2013

Suy ngh trong C + +, Vol 1

M tm t ; !// f( m t ) ;//K h n gt n gc h u y n ic h op h p t h ch i nc h u y n i }/// :~

f( H a i( m t ) ) ;//O K-n g is d n g

B n gc c hl mc h oHa i l x yd n gr r n g , t r n hb i nd c h c y uc uk h n gt h c h i nb t k c h u y n i t n gs d n gm x yd n g c b i t ( k h n gk h c r r n gx yd n gt r o n gl ph c m v nc t h t h c h i nc h u y n i t n g ) . N un g i d n gmu nt h c h i nv i c c h u y n i x yr a , c c m p h i c v i t r a . T r o n g o nm t r n , f ( Ha i ( mt ) ) t or a m t i t n gt mt h i l o i h a i t mt , g i n gn h c c t r n hb i nd c h l mt r o n gc c p h i nb nt r c .

C h u y n i i uh n h
C c ht h h a i s nx u t l o i c h u y n i t n gl t h n gq u a i uh n hq u t i . B nc t h t om t h mt h n h v i nm c c c l o i h i nt i v c h u y n i n l o i mo n gmu ns d n gc c n h i uh n ht k h a t i pt h e o l k i um b nmu nc h u y n i s a n g . H n ht h c i uh n hq u t i l d u yn h t b i v b nk h n gx u t h i n x c n hm t k i ut r v k i ut r v l t nc a c c n h i uh n hb n a n gq u t i . yl m t v d :
// :C 1 2 :O p e r a t o r O v e r l o a d i n g C o n v e r s i o n . c p pl pB a{ i n ti ;c n gc n g : B a( i n ti i=0 ,i n t=0 ) :i( i i ){ } } ; l pB n{ i n tx ;c n gc n g : B n( i n tx x ) :x( x x ){ } i uh n hB a( )c o n s t{ r e t u r nB a( x ) ; } } ; t r n gg( B a ){ } i n tm a i n( ){ B nb n( 1 ) ; g( b n ) ; g( 1 ) ; //c u cg iB a ( 1 , 0 ) }/// :~

V i k t h u t x yd n g , l p c h c t h c h i nc h u y n i , n h n gv i n h n gh o t n g , l pn g u nt h c h i n v i c c h u y n i . G i t r c a k t h u t x yd n gl b nc t h t h m m t c o n n gc h u y n i m i c h om t h t h n gh i nc n h b n a n gt or a m t l pm i . T u yn h i n , v i c t or a m t n h x yd n g nl pl u n l u nl u nx c n hm t l o i c h u y n i t n g( n g a yc k h i n c n h i uh nm t i s , n up h nc nl i c a c c i s c m c n h ) , c t h k h n g c n h n gg b nmu n( t r o n gt r n gh pn yb nc t h t t n b n gc c h s d n gr r n g) . Ng o i r a , k h n gc c c hn o s d n gc h u y n i x yd n gt m t l o i n g i d n gx c n h t c hh pl o i , i un yc t h c h v i i uh n hq u t i . P h nx M t t r o n gn h n gl d ot h u nt i nn h t s d n gk h a i t h c q u t i t o nc ut h a yv c c n h k h a i t h c t h n h v i nl t r o n gc c p h i nb nt o nc u , l o i c h u y n i t n gc t h c pd n gc h oc c t o nh n g , t r o n gk h i v i c c i t n gt h n hv i n , t o nh n gt r i t a yp h i c l o i t h c hh p . N ub nmu nc h a i t o nh n g c c h u y n i , c c p h i nb nt o nc uc t h t i t k i mr t n h i um h a . yl m t v d n h :
// :C 1 2 :R e f l e x i v i t y I n O v e r l o a d i n g . c p pS l p{ i n ti ;c n gc n g : S ( i n ti i=0 ) :i( i i ){ } c o n s tS n h i uh n h+( c o n s tS &n ) c o n s t{ s t r l i( i+n i ) ; } b nc o n s tS n h i uh n h( c o n s tS & ,c o n s tS & ) ; } ; S c o n s t n h i uh n h( c o n s tS &n 1 , c o n s tS & n 2 ){ s t r l i( n 1 . i-n 2 . i ) ; } i n tm a i n( ){ s m t( 4 7 ) ,b( 1 1 ) ; a+b ;//O K a+1//2a r g c h u y n is // !1+a//s a i !1a r gk h n gl o iS a-b ;//O K m t1//2a r gc h u y n is a n gs 1-a ;//1a r gc h u y n is a n gs }/// :~

L pS c c m t t h n hv i n i uh n h+v m t n g i b nc a n h i uh n h. B i v c m t n h x yd n g m p h i m t m t ni n t i s , m t i n t c t h c t n gc h u y n i t h n hm t s , n h n gc h t r o n g i u k i nt h c hh p . T r o n gma i n( ) , b nc t h t h yr n gv i c t h m m t s k h c s h o t n gt t b i v n l m t k t h pc h n hx c c h oc c n h i uh n hq u t i . Ng o i r a , k h i t r n hb i nd c ht h ym t s t h e os a ul m t +v m t i n t , n c t h p h h pv i c h c n n gt h n hv i nS : : o p e r a t o r +v c h u y n i i n t t h a ms c h om t s s d n g c c n h x yd n g . Nh n gk h i n t h ym t i n t , m t +, v m t S , n k h n gb i t p h i l mg b i v t t c n l s : : o p e r a t o r +, t r o n g y uc uc c t o nh n gt r i c m t s i t n g . D o , t r n hb i nd c hp h t h n hc c l i . V i c c b n i uh n h , m i t h k h c . T r n hb i nd c hc np h i i nv oc h a i i s c a n t u yn h i nn c t h , n k h n gb g i i h n c m t s n h l i s b nt r i . D o , n un t h y
1-m t

n c t h c h u y n i c c t h a ms ut i nc h om t s s d n gc c n h x yd n g . i k h i b nmu n c t h h nc h v i c s d n gc c n h i uh n hc a b nb n gc c hl mc h oc h n gt h n h v i n . V d , k h i n h nm t ma t r nc a m t v e c t o r , v e c t o r p h i i b np h i . Nh n gn ub nmu nk h a i t h c c a
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 214/320

08/10/2013

Suy ngh trong C + +, Vol 1

b n c t h c h u y n i m t t r o n gh a i i s , l mc h oc c n h i uh n hm t h mb nb . Ma ym nt h a y , t r n hb i nd c hs k h n gm t 1 1 v c h u y n i c h a i t h a ms s i t n gv s a u g i t n g i . i u c n g h a r n gm Ch i nb t n g c t h b t ul mv i c k h c n h a u . T r n hb i nd c hp h h pv i " ng i n " K h n n gt h n h t , l c c n h i uh n h c x yd n g c c b i uh i n1 1 . M t v d t r o n gl o i h n hc h u y n i t n gl v c n gh u c hx yr a v i b t k l pm n gg i c h u i k t ( t r o n gt r n gh pn y , c h n gt i s c h c nt h c h i nc c l ph c b n gc c hs d n gt i uc h u nC++c h u i l p b i v n ng i n ) . N uk h n gc l o i c h u y n i t n g , n ub nmu ns d n gt t c c c c h c n n gc h u i h i nc t c c t h v i nCc h u n , b np h i t om t h mt h n hv i nc h om i m t , n h t h n y :


// :C 1 2 :S t r i n g s 1 . c p p //K h n gc l o ic h u y n it n g #B a og m" . ./R e q u i r e . h " #B a og m< c s t r i n g > #B a og m< c s t d l i b >#i n c l u d eu s i n gn a m e s p a c es t d ; l pS t r i n g c{ s t r i n gs ;c n gc n g : S t r i n g c( c o n s ts t r i n g&s t r=" " ) :s( s t r ){ } i n ts t r c m p( c o n s tS t r i n g c&S )c o n s t { t r l i: :s t r c m p( s . c _ s t r( ) ,S s c _ s t r( ) ) ; } //. . .v v ,c h ot tc c cc h cn n gt r o n gs t r i n g . h } ; i n tm a i n( ){ S t r i n g cs 1( " h e l l o " ) ,s 2( " c " ) ; s 1 . s t r c m p( s 2 ) ; }/// :~

L o i v d c h u y n i

y , c h c c c s t r c mp( ) c h c n n g c t or a , n h n gb np h i t or a m t c h c n n gt n g n gc h om i m t t r o n g< c s t r i n g >r n gc t h l c nt h i t . Ma ym nt h a y , b nc t h c u n gc pm t c h u y n i l o i h n ht n g c h op h pt r u yc pv ot t c c c c h c n n gt r o n g< c s t r i n g >:


// :C 1 2 :S t r i n g s 2 . c p p //V il o ic h u y n it n g #B a og m" . ./R e q u i r e . h " #B a og m< c s t r i n g > #B a og m< c s t d l i b > #I n c l u d eu s i n gn a m e s p a c es t d ; l pS t r i n g c{ s t r i n gs ;c n gc n g : S t r i n g c( c o n s ts t r i n g&s t r=" " ) :s( s t r ){ } i uh n hc o n s tc h a r*( )c o n s t{ s . c _ s t rt r l i( ) ; } } ; i n tm a i n( ){ S t r i n g cs 1( " h e l l o " ) ,s 2( " c " ) ; s t r c m p( s 1 ,s 2 ) ;//T i uc h u nCc h cn n g s t r s p n( s 1 ,s 2 ) ;//B tk c h cn n gc h u i !}/// :~

B yg i b t k c h c n n gm p h i m t m t * c h a r t h a ms c n gc t h m t m t S t r i n g c t r a n hl u nb i v t r n h b i nd c hb i t c c hl mc h om t c h a r * t m t S t r i n g c .

C m b yt r o n gl o i c h u y n i t n g

B i v t r n hb i nd c hp h i c h nc c hl n gl t h c h i nc h u y n i l o i h n h , n c t h g pr c r i n ub nk h n g t h i t k c h u y n i c a b nm t c c hc h n hx c . M t t n hh u n g ng i nv r r n gx yr a v i m t l pXc t h c h u y n i b nt h nv i m t i t n gc a l pYv i m t n h i uh n hY( . N ul p) Yc m t n h x y d n gm p h i m t m t i s nk i uX, i un y i d i nc h oc c l o i h n hc h u y n i g i n gh t n h a u . T r n h b i nd c hh i nn a yc h a i c c h i t X nY, v v yn s t or a m t l i k h n gr r n gk h i c h u y n i x yr a :

// :C 1 2 :T y p e C o n v e r s i o n A m b i g u i t y . c p pl pd ac a m ;//k h a ib ol p l pc aA p p l e{ p u b l i c : i uh n hO r a n g e( )c o n s t ;//C h u y n iA p p l ed ac a m } ; l pd ac a m{ p u b l i c : C a m( A p p l e ) ;//C h u y n iA p p l ed ac a m } ; v o i df( O r a n g e ){ } i n tm a i n( ){ Q u t o ; // !f( a ) ;//L i :c h u y n ik h n gr r n g }/// :~

C c g i i p h pr r n gc h ov n n yk h n gp h i l l m i u . C h c nc u n gc pm t c o n n gd u yn h t t n gc h u y n i t m t l o i k h c .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 215/320

08/10/2013

Suy ngh trong C + +, Vol 1

M t v n k h k h nh n p h t h i nx yr ak h i b nc u n gc pc h u y n i t n gn h i uh nm t l o i . i un y i k h i c g i l f a nh mm r a :
// :C 1 2 :T y p e C o n v e r s i o n F a n o u t . c p pl pd ac a m{ } ;l pP e a r{ } ; l pc aA p p l e{ p u b l i c : i uh n hO r a n g e( )c o n s t ; i uh n hP e a r( )c o n s t ; } ; //Q u t i n( ) :v o i d n( O r a n g e )v o i d n( P e a r ) ; i n tm a i n( ){ cc aA p p l e ; // ! n( c ) ; //L i :A p p l e>O r a n g eh o cA p p l e>P e a r ? }/// :~

L pc a A p p l e c c h u y n i t n gc h oc h a i c a mv l . i un g mn g mv v i c n yl k h n gc v n c h o nk h i m t n g i n o n g yt h nc n gv t or a h a i p h i nb nq u t i c a n( ) . ( C h v i m t p h i nb n , m t r o n gma i n( ) h o t n gt t . ) M t l nn a , c c g i i p h pv k h uh i uc h u n gv i l o i c h u y n i t n gl c h c u n gc pm t c h u y n i t n gd u yn h t t m t l o i k h c . B nc t h c h u y n i c c l o i k h c , h c h k h n gp h i l t n g . B nc t h t o c c c u c g i c h c n n gr r n gv i n h n gc i t nn h ma k e A( ) v ma k e B( ) . Ho t n g n L o i c h u y n i t n gc t h g i i t h i uc c h o t n gc b nn h i uh nb nc t h mo n g i . Nh m t c h t t r ug h on o , n h nv oc c s a i n yc a C o p y i n g V s I n i t i a l i z a t i o n . c p: p
// :C 1 2 :C o p y i n g V s I n i t i a l i z a t i o n 2 . c p pl pF i{ } ; l pP h { p u b l i c : P h ( i n t ){ } L p h ( c o n s tF i& ){ } } ; l pF o{ i n ti ;c n gc n g : F o( i n tx=0 ) :i( x ){ } P h i uh n h( )c o n s t{ P h t r l i( i ) ; } } ; i n tm a i n( ){ F of o ; L p h l p h =f o ; }/// :~

K h n gc n h x yd n g t or ac c k h o np h P h t F o i t n g . T u yn h i n , F oc m t l o i c h u y n i t n gv op h . K h n gc b ns a o x yd n g t or a m t p h t p h , n h n g yl m t t r o n gn h n gc h c n n g c b i t c a t r n hb i nd c hc t h t or ac h ob n . ( C c n h x yd n gm c n h , s a oc h p x yd n g , i uh n h=, v h yc t h c t n gh pt n gb i t r n hb i nd c h . ) V v y , b oc ok t q u t n g i v h i p h P h =f o ; c c n h i uh n hc h u y n i l o i h n ht n g c g i , v m t c o p y c o n s t r u c t o r c t or a . S d n gl o i c h u y n i t n gm t c c hc nt h n . Nh v i t t c c c n h i uh n hq u t i , l t u y t v i k h i n l mg i m n gk m t n h i mv m h a , n h n gn t h n gk h n gc g i t r s d n gc c hn h n gk h n g .

T mt t

L d ot o nb s t nt i c a n h i uh n hq u t i l i v i n h n gt n hh u n gk h i n l mc h oc u c s n gd d n gh n . K h n gc g c b i t k d i uv n , c c n h k h a i t h c q u t i c h l c h c n n gv i n h n gc i t nh i h c , v c c c u c g i c h c n n gx yr a p h i c t h c h i nc h ob nb n gc c t r n hb i nd c h , k h i m mh n hb n p h i . Nh n gn u i uh n hq u t i k h n g e ml i l i c h n gk c h ob n( t c g i c a c c l p ) h o c n g i s d n gc a l p , k h n gn h ml nv n n yb n gc c ht h mv on .

B i t p
1. 2. 3. .4

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

T om t l p ng i nv i m t q u t i t o nt ++. H yt h g i n h i uh n hn yt r o n gc t r c v h u t h n ht h c v x e mn h n gg l o i c n hb ot r n hb i nd c hb nn h n c . T om t l p ng i nc c h a m t i n t v t n ht r n gq u t i c c t o nt +n h m t h mt h n hv i n . C n g c u n gc pm t b ni n( ) c h c n n gt h n hv i nm p h i m t m t o s t r e a m &n h m t t h a ms v i nv i o s t r e a m &. K i mt r a l ph c c a b n c h n gmi n hr n gn h o t n gc h n hx c . T h m m t n h p h n i uh n h T pt h d c 2 n h m t h mt h n hv i n . C h n gmi n hr n gb nc t h s d n gc c i t n gt r o n gb i ut h c p h c t pn h a +bc . T h m m t n h i uh n h++v n h i uh n h T pt h d c 2 , c h a i t i nt v h ut p h i nb n , n h v ym h t r l i i t n gt n gl nh o c g i m i . H yc h c c h nr n gp h i nb np o s t f i x t r v g i


216/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

t r c h n hx c . S a i t n gv g i mb t c c n h k h a i t h c t r o n gt p4 c c p h i nb nt i nt t r l i m t k h n gc o n s t t h a mk h ov c c p h i nb np o s t f i x t r v m t c o n s t i t n g . C h ot h yh l mv i c m t c c hc h n h x c v g i i t h c hl d ot i s a o i un ys c t h c h i nt r o n gt h c t . 6. T h a y i i n( ) c h c n n gt r o n gt p2 n l q u t i n h i uh n h< <n h t r o n g I o s t r e a mOp e r a t o r Ov e r l o a d i n g . c p. p 7. S a i t p3 c c n h i uh n h+v n h i uh n hl c h c n n gk h n gt h n hv i n . C h n gmi n h r n gh v nl mv i c m t c c hc h n hx c . 8. T h mu n a r yn h i uh n h T pt h d c 2 v c h n gmi n hr n gn h o t n gc h n hx c . 9. T om t l pc c h a m t nr i n gt c h a r . Qu t i i o s t r e a mk h a i t h c < <v > >( n h t r o n g I o s t r e a mOp e r a t o r Ov e r l o a d i n g . c p) pv k i mt r a c h n g . B nc t h k i mt r a c h n gv i f s t r e a ms , s t r i n g s t r e a m, v c i nv c o u t . 10. X c n hg i t r k h n g i g i , b i nd c hc a b n i c h op o s t f i x o p e r a t o r ++v i uh n h. . 11 V i t m t s l pc h a m t i , v t h mc c t o nt q u t i c h o+ , , * , / , v c h u y nn h n g . C h nc c g i t r t r l i c h oc c c h c n n gn y b i ut h c c t h c x c hl i v i n h a u , v c h oh i uq u . V i t m t l o i t n gc h u y n i h n hi n t ( . ) 12. S a i t p1 1 c c t i uh a g i t r t r v c s d n g , n ub n k h n gl mn h v y . 13. T om t l pc c h a m t c o nt r , v c h n gmi n hr n gn ub nc h op h pt r n hb i nd c h t n gh pc c n h i uh n h=k t q u c a v i c s d n gn h i uh n hs c c o nt r c t b d a n hc h oc n g m t l ut r . B yg i s a c h a v n b n gc c h n hn g h a c a r i n gb n i uh n h=v c h n gmi n hr n gn k h c p h c c n h n gr n gc a . H y c h c c h nr n gb nk i mt r a s e l f a s s i g n me n t v x l t r n gh p n g . 14. V i t m t l p c g i l c h i mc c h a m t c h u i t h n hv i nv m t i n t t n h. T r o n gc o n s t r u c t o r m c n h , s d n gi n t t n gt or a m t n hd a n hm b nx yd n gt r o n gc h u i , c n gv i t nc a l p ( B i r d#1 , g i a c m #2 , v v . ) T h m m t t < <c h oo s t r e a ms i nr a c c B i r d i t n g . V i t m t p h nt =v m t c o p y c o n s t r u c t o r . T r o n gma i n( ) , x c mi n hr n gt t c m i t h h o t n gc h n h x c . 15. V i t m t l pg i l l n gc h i mc c h a m t i t n g , m t c o nt r v m t t i l i ut h a mk h oc h ol p B i r dt t p1 4 . C c n h x yd n gn nb a c h i mn h l i s . T h m m t t < <c h oo s t r e a ms c h ol n g c h i m. K h n gc h op h pc h u y nn h n gn h i uh n h=v s a oc h p x yd n g . T r o n gma i n( ) , x c mi n hr n gt t c m i t h h o t n gc h n hx c . H yc h c c h nr n gb nc t h t pc h oc h u i l n gc h i m c c i t n gv x yd n gb i ut h c l i nq u a n nn h i un h k h a i t h c . 16. T h m m t i n t t h n hv i nd l i uc h oc c h i mv l n gc h i mt r o n gt p1 5 . T h mc c t o nt t h n hv i n+ , , * , v / s d n gc c i n t t h n hv i n t h c h i nc c h o t n gt r nc c t h n hv i nt n g n g . X c mi n hr n gn h n gc n gv i c . 17. L pl i b i t p1 6 s d n gc c n h k h a i t h c k h n gt h n hv i n . 18. T h m m t i uh n h S ma r t P o i n t e r . c p pv Ne s t e d S ma r t P o i n t e r . c p. p 19. S a i C o p y i n g V s I n i t i a l i z a t i o n . c p t t c c c px yd n gi nm t t h n gb oc h ob nb i t n h n gg a n gx yr a . B yg i x c mi n hr n gh a i h n ht h c c c c u c g i nc c c o p y c o n s t r u c t o r ( d i h n h t h c c h u y nn h n gv c c h n ht h c t r o n gn g o c n ) l t n g n g . 20. C g n g t or a m t t h n hv i nk h n g i uh n h=c h om t l ph c v t h yl o i t r n hb i nd c ht i n n h nb nn h n c . 21. T om t l ph c v i m tn h i uh n hp h nc m t s t h h a i , m t c h u i c m t g i t r m c n h n i " o p=c u c g i . " T om t c h c n n gm c h n hm t i t n gc a l ph c c a b nv i n h a uv c h ot h yn h i uh n hp h nc n gc a b n c g i l c h n hx c . 22. T r o n gC o p y i n g Wi t h P o i n t e r s . c p, l o i b c c p = i uh n ht r o n gn h a c h u t v c h ot h y r n gc c t r n hb i nd c ht n gh p i uh n h=m t c c hc h n hx c c c b ns a oc c c h u i n h n gc h n g i nl b d a n hl C h c o nt r . 23. T r o n gR e f e r e n c e C o u n t i n g . c p p, t h m m t i n t t n hv b n ht h n gi n t n h t h n hv i nd l i uc h oc c h v n h a c h u t . T r o n gt t c c c n h t h uc h oc h a i l p , t n gc c i n t t n hv g nk t q u c h ot h n gi n t t h e od i s l n gc c i t n g c t or a . T oc c t h a y i c nt h i t t t c c c b oc oi n ns n i i n t n hd a n hc a c c i t n gl i nq u a n . 24. T om t l pc c h a m t c h u i n h m t t h n hv i nd l i u . K h i t oc c c h u i t r o n gc c n h x yd n g , n h n gk h n gt or a m t b ns a o x yd n gh o c i uh n h=. L mc h om t l pt h h a i c m t i t n gt h n hv i nc a l p ut i nc a b n , k h n gt or a m t b ns a o x yd n gh o c i uh n h=c h o c c l ph c n y , h o c . C h n gmi n hr n gc c b ns a o x yd n gv i uh n h= c t n gh p n g nc a c c t r n hb i nd c h . 25. K t h pc c l ph c t r o n gOv e r l o a d i n g U n a r y Op e r a t o r s . c ppv I n t e g e r . c p p. 26. S a i P o i n t e r T o Me mb e r Op e r a t o r . c pb n gc c ht h mh a i pc h c n n gt h n hv i nm i v oC h m k h n gc i s v t r v k h o n gt r n g. T or a v t h n g h i m m t q u t i n h i uh n h >* l m v i c v i h a i c h c n n gm i c a b n . 27. T h m m t i uh n h >* Ne s t e d S ma r t P o i n t e r . c p. p 28. T oh a i l p , c a A p p l e v Or a n g e . T r o n gc a A p p l e , t or a m t n h x yd n gm p h i m t m t Or a n g e n h m t t h a ms . T or a m t c h c n n gm p h i m t m t c a A p p l e v g i l c h c n n g v i m t m ud a c a m c h ot h yr n gn h o t n g . B yg i l mc h oc a A p p l e x yd n gr r n g 5.
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 217/320

08/10/2013

Suy ngh trong C + +, Vol 1

29. 30. 31. 32.

c h n gmi n hr n gc c l o i c h u y n i t n gd o n g nn g a c . S a i c c c u c g i n c h c n n gc a b n v i c c h u y n i c t h c h i nm t c c hr r n gv d o t h n hc n g . T h m m t t o nc u i uh n h* R e f l e x i v i t y I n Ov e r l o a d i n g . c ppv c h n gmi n hr n gn l p h nx . T oh a i l ph c v t or a m t n h i uh n h+v c h u y n i c h c n n gn h v ym Ng o i r a l p h n x c h oh a i l p . S a c h a T y p e C o n v e r s i o n F a n o u t . c pb n gc c ht or a m t c c hr r n gpc h c n n gg i t h c h i n c h u y n i l o i h n h , t h a yv m t t r o n gn h n gn h k h a i t h c c h u y n i t n g . V i t m ng i n s d n g+, , * , v / k h a i t h c c h oh a i s . T mr a c c ht r n hb i nd c hc a b nt or a m l pr pv n h nv on g nn g l pr p l t or a k h mp h v g i i t h c hn h n gg a n gx yr a d i mu i x e .

B a on h i um yb a ym t h t h n gk h n gl us c np h i x l ? B a on h i uh n hd n gm t s s d n gh t h n g C A D ? B a on h i un t s c t r o n gm t m n g ? g i i q u y t v n l pt r n hc h u n g , n l i uc nt h i t m b nc t h t or a v t i ud i t c c i t n g t h i g i a nc h y . T t n h i n , Cl u nc u n gc pc h oc c b n h g i a o n g c h c n n gma l l o c ( ) v mi np h ( ) ( c n gv i c c b i nt h c a ma l l o c ( ) m p h nb l ut r t n g ( c ng i l c a h n g m i np h ) t r o n gt h i g i a nc h y . T u yn h i n , i un yc h ng i nl s k h n gl mv i c t r o n gC++ . C c n h x yd n gk h n gc h op h pb n a n a c h c a b n h k h i t o , v v l d ot t . N ub nc t h l m i u , b nc t h : 1. 2. 3. H yq u n i . S a u k h i t o mb oc c i t n gt r o n gC++s k h n g c mb o . v t n hl m i ug c h oc c i t n gt r c k h i b nk h i t on , h yv n gl i up h i x yr a . a n c h oc c i t n gs a i k c ht h c .

V t t n h i n , n g a yc k h i b n l mt t c m i t h m t c c hc h n hx c , b t c a i i c h n gt r n hc a b nl d b c c l i t n gt . K h i t ok h n g n gc c hc t r c hn h i m m t p h nl nc c v n l pt r n h , v v yn c b i t q u a nt r n g mb oc c c u c g i x yd n gc h oc c i t n g c t or a t r nh e a p . V v y , l mt h n oC++ mb ok h i t ot h c hh pv d nd p , n h n gc h op h pb nt oc c i t n g n g t r nh e a p ? C ut r l i l b n gc c h a i t n gs n gt on n g n gv oc t l i c a n g nn g . ma l l o c ( ) v mi np h ( ) l c c h mt h v i n , v d o n g o i t mk i ms o t c a t r n hb i nd c h . T u yn h i n , n ub nc m t n h i uh n h t h c h i nc c h n h n gp h i h pc a c pp h t b n h n gv k h i t ov m t n h i uh n h t h c h i nc c h n h n gk t h pc a d nd pv p h t h n hl ut r , t r n hb i nd c hv nc t h mb or n g d n gv h mh ys c g i c h ot t c c c i t n g . T r o n gc h n gn y , b ns h c c c hC++' s mi v x a t h a n hl c hg i i q u y t v n n yb n gc c ht or a m t c c ha nt o n i t n gt r nh e a p .

T o i t n g
1. 2.

K h i m t C++ i t n g c t or a , h a i s k i nx yr a : l ut r c p h nb c h oc c i t n g . C c n h x yd n g c g i k h i t ol ut r .

B i b yg i b nn nt i nr n gb c h a i l u nl u nx yr a . C++t h c t h i n v c c i t n gc h a c k h i t ol m t n g u nc h n hc a c c l i c h n gt r n h . Nk h n gq u a nt r n gn i h o c l mt h n oc c i t n g c t or a c c n h x yd n gl u nl u n c g i . B c m t , t u yn h i n , c t h x yr a t h e on h i uc c h , h o c v on h n gt h i i mk h c : 1. 2. l ut r c t h c p h nb t r c k h i c h n gt r n hb t u , t r o n gc c k h uv c l ut r t n h . L ut r n yt n t i c h oc u c s n gc a c h n gt r n h . l ut r c t h c t or a t r ns t a c kb t c k h i n om t i mt h c h i nc t h t c ( m t d un g o c m ) .
218/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

M l ut r c p h t h n ht n gt i t h i i mt h c h i nb s u n g( c c d un g o c n g ) . C c h o t n g n g nx pp h nb c x yd n gt h n hc c t pl n hc a b v i x l v r t h i uq u . T u yn h i n , b np h i b i t c h n hx c c b a on h i ub i nb nc nk h i b n a n gv i t c h n gt r n h t r n hb i nd c hc t h t or a m n g . 3. l ut r c t h c b t r t m t h b i c a b n h c g i l n g( c n c g i l c c c a h n gmi np h ) . i un y c g i l c pp h t b n h n g . C pp h t b n h n y , m t c h c n n g c g i l t h i g i a n c h y , i un yc n g h a l b nc t h q u y t n hb t c l c n om b nmu nc m t s b n h v b a o n h i ub nc n . B nc n gc t r c hn h i mx c n hk h i p h t h n h b n h , c n g h a l t u i t h c a b n h c t h c mi nl b nc h nn k h n g c x c n hb i p h m v i .

T h n gb a k h uv c c t t r o n gm t p h nt i pg i pd u yn h t c a b n h v t l : k h uv c t n h , n g nx p , v h e a p( t r o n gm t t r t t x c n hb i c c n h v nb i nd c h ) . T u yn h i n , k h n gc q u y n h . Ng nx pc t h l t r o n gm t v t r c b i t , v h e a pc t h c t h c h i nb n gc c hl mc h oc c c u c g i c h ok h i b n h t h i uh n h . L m t l pt r n hv i n , n h n g i un yl b n ht h n g c b ov t b n , v v yt t c c c b nc n p h i s u yn g h v l b n h l c k h i b ng i c h on .

C c ht i pc nCv o n g

C pp h t b n h t n gt r o n gt h i g i a nc h y , Cc u n gc pc c c h c n n gt r o n gt h v i nc h u nc a n : ma l l o c ( ) v b i nt h c a n c a l l o c ( ) v r e a l l o c ( ) s nx u t b n h t n g , v mi np h ( ) g i i p h n gb n h t r l i n g . C c c h c n n gn yl t h c d n gn h n gn g u y nt h yv i h i s h i ub i t v c h ms c t r nm t p h nc a c c l pt r n hv i n . t or a m t t h h i nc a m t l ph c t r n n gs d n gc h c n n gb n h n gC , b ns p h i l m m t c i g n h t h n y :

// :C 1 3 :M a l l o c C l a s s . c p p //M a l l o cv ic c it n gl p //N h n gg b ns p h il mg n uk h n gc h o" m i " #B a og m" . ./R e q u i r e . h " #B a og m< c s t d l i b >//m a l l o c( )v m i np h ( ) #B a og m< c s t r i n g >//m e m s e t( )#i n c l u d eu s i n gn a m e s p a c es t d ; l pO b j{ i n ti ,j ,k ; e n u m{ s z=1 0 0 } ; c h a rb u f [ S Z ] ,c n gc h n g : l mm th i ul ck h it o( ){ //c t h k h n gs d n gx yd n g c o u t< <" k h it o o b j "< <e n d l ; i=j=k=0 ; m e m s e t( b u f ,0 ,s z ) ; } l mm th i ul ct i ud i t( )c o n s t{ //k h n gc t h s d n gh mh y c o u t< <" p h h y o b j "< <e n d l ; } } ; i n tm a i n( ){ O b j*o b j=( o b j* )m a l l o c( s i z e o f( o b j ) ) ; y uc u( o b j=0 ) ; o b j >k h i t o( ) ; //. . . ik h is a u : o b j >t i ud i t( ) ; m i np h ( o b j ) ; }/// :~

B nc t h t h yv i c s d n gma l l o c ( ) t or a l ut r c h oc c i t n gt r o n g n gd y :
O b j*o b j=( o b j* )m a l l o c( s i z e o f( o b j ) ) ;

y , n g i s d n gp h i x c n hk c ht h c c a i t n g( m t n i c h om t l i ) . ma l l o c ( ) t r v m t v o i d* b i v n c h t or a m t b nv c a b n h , k h n gp h i l m t i t n g . C++k h n gc h op h pm t v o i d* c g i a o c h ob t k c o nt r k h c , v v yn p h i c c . V ma l l o c ( ) c t h k h n gt mt h yb t k b n h ( t r o n gt r n gh pn yn s t r v s k h n g ) , b np h i k i mt r a c o nt r t r v c h c c h nr n gn t h n hc n g . Nh n gv n t i t n h t l d n gn y :
O b j >k h it o( ) ;

N un g i s d n gl mc h on x a m t c c hc h n hx c , h p h i n h k h i t oc c i t n gt r c k h i n c s d n g . C h r n gm t n h x yd n gk h n g c s d n gb i v c c n h x yd n gk h n gt h c g i m t c c h [ 4 7 ] r r n g n c g i c h ob nb i t r n hb i nd c hk h i m t i t n g c t or a . V n yl n g i s d n gh i nn a yc c c t yc h n q u n t h c h i nv i c k h i t ot r c k h i i t n g c s d n g , d o g i i t h i ul i m t n g u nc h n hc a l i . Nc n gc h r a r n gn h i un g i l pt r n hd n gn h t mt h yc h c n n gb n h n gc a Cq u k h h i uv p h c t p , n k h n gp h i l h i m t mt h yc c l pt r n hv i nCn h n gn g i s d n gm yb n h op h nb m n gr t l nc a c c b i nt r o n gc c k h uv c l ut r t n h t r n hs u yn g h v c pp h t b n h n g . V C++
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 219/320

08/10/2013

Suy ngh trong C + +, Vol 1

a n gc g n g l mc h ot h v i ns d n ga nt o nv d d n gc h oc c l pt r n ht h n gt h n g , p h n gp h pt i p c nC b n h n gk h n gt h c h pn h n .

i uh n h m i
C c g i i p h pt r o n gC++l k t h pt t c c c h n h n gc nt h i t t or a m t i t n gv om t n h i u h n hd u yn h t c g i mi . K h i b nt om t i t n gv i mi ( s d n gm t t h h i nm i ) , c c pp h t l ut r t r nh e a p g i i t n gv k ug i c c n h x yd n g l ut r . V v y , n ub nn i
M y T y p e*f p=n e wM y T y p e( 1 , 2 ) ;

t i t h i g i a nc h y , t n g n gv i ma l l o c ( s i z e o f ( My T y p e ) c g i l ) ( t h n gx u y n , n c n g h a l m t c u c g i nma l l o c ( ) , v c c n h x yd n gc h oMy T y p e c g i v i a c h k t q u n h n yc o nt r , s d n g ( 1 , 2 ) n h d a n hs c h i s V ot h i i mc o nt r c g nc h o . f p, l m t s n g , k h i t o i t n gt h mc h b nk h n gt h c c b nt a yc a b nt r n t r c s a u Nc n gt n gt h c hh p . My T y p e l o i n h v y k h n gc d i nv i nl c nt h i t . M c n hmi k i mt r a mb oc pp h t b n h l t h n hc n gt r c k h i i q u a a c h c c n h x yd n g , v v yb nk h n gc np h i x c n hm t c c hr r n gn uc u c g i t h n hc n g . Ng a ys a uc h n gn yb ns t m r a n h n gg s x yr a n uk h n gc t r i n h . B nc t h t or a m t t h h i nm i s d n gb t k n h x yd n gs nc h oc c l ph c . N uc c n h x yd n g k h n gc t h a ms , b nv i t c c b i uh i nm i m k h n gc d a n hs c h i s n h x yd n g : C h ng i nq u t r n ht o i t n gt r nh e a pt r t h n hm t b i uh i nd u yn h t , v i t t c c c k c ht h c , c h u y n i , v k i mt r a a nt o n c x yd n gi nNd d n g t or a m t i t n gt r nh e a pn h n l t r n s t a c k .

M y T y p e*f p=n e wM y T y p e ;

n h i uh n hx a
C c b s u n gc h oc c t h h i nm i l x a b i uh i n, l n ut i ng i h yv s a u g i i p h n gb n h ( t h n gv i m t c u c g i nmi np h ( ) ) . C h n h m t t h h i nm i t r v m t c o nt r n i t n g , m t x ab i uh i n i h i a c h c a m t i t n g . x af p ; N yh yv s a u r a m t l ut r c h oc c c pp h t n gMy T y p e i t n gt or a t r c . x a c t h c g i l c h c h om t i t n g c t or a b i mi . N ub nma l l o c ( ) ( h o c c a l l o c ( ) h o c r e a l l o c ( ) m t i t n gv s a u x a n , h n hv i n yl k h n gx c n h . B i v h uh t c c c i t m c n hc a mi v x a s d n gma l l o c ( ) v f r e e ( ) , b nc t h mu nk t t h c p h t h n hb n h m k h n gg i d e s t r u c t o r . N uc o nt r b nx a l s k h n g , k h n gc g s x yr a . V l d on y , n g i t a t h n gk h u y nb nn nt h i t l p m t c o nt r t i k h n gn g a yl pt c s a uk h i b nx a n , n g nc h nv i c x a n h a i l n . X a m t i t n g n h i uh nm t l nc h c c h nl m t i ux u l m, v s g yr a v n .

M tv d ng i n
// :C 1 3 :T r e e . h #I f n d e fT R E E _ H #X c n hT R E E _ H #I n c l u d e

V d n yc h ot h yk h i d i nr a :

l pT r e e{ i n tc h i uc a o ,c n gc h n g : C y( i n tt r e e H e i g h t ) :c h i uc a o( t r e e H e i g h t ){ } ~T r e e( ){ s t d: :c o u t< <" * " ; } b ns t d: :o s t r e a m& o p e r a t o r< <( s t d: :o s t r e a m& o s ,c o n s tT r e e*t ){ t r l io s< <" C h i uc a oc yl : " < <t>c a o< < s t d: :e n d l ; } } ; #E n d i f//T R E E _ H/// :~ // :C 1 3 :N e w A n d D e l e t e . c p p D e m o// ng i nc am iv x a #B a og m" T r e e . h "u s i n gn a m e s p a c es t d ; i n tm a i n( ){ C y*t=n e wT r e e( 4 0 ) ; c o u t< <t ; x at ; }/// :~

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

220/320

08/10/2013

Suy ngh trong C + +, Vol 1

C h n gt a c t h c h n gmi n hr n gc c n h x yd n g c g i l b n gc c hi nr a g i t r c a c y. y , n c t h c h i nb i q u t i o p e r a t o r < < s d n gv i m t o s t r e a mv m t c y* . L u , t u yn h i n , n g a yc k h i h m c k h a i b on h m t n g i b n, n c n hn g h a l m t n i t u y n ! yl m t t i nn g h i c h n hn g h a m t n g i b nc h c n n gn h m t n i t u y nc h om t l pk h n gt h a y i b nt n ht r n gh o c t h c t l n l m t c h c n n gt o nc uv k h n gp h i l m t c h c n n gt h n hv i nl p . C n gn h nt h yr n gc c g i t r t r v l k t q u c a t o nb b i ut h c ur a , m l m t o s t r e a m &( m n p h i l , p n gc c l o i g i t r t r v c a h m) .

Qu nl t r nb n h

K h i b nt oc c i t n gt n gt r nc c n g nx p , k c ht h c c a c c i t n gv c u c i c a h c x y d n gn g a yv oc c m c t or a , b i v t r n hb i nd c hb i t c h n hx c l o i , s l n gv p h mv i . T oc c i t n gt r nh e a pl i nq u a n nb s u n gt r nk h n g , c v t h i g i a nv t r o n gk h n gg i a n . D i yl m t k c h b n i nh n h . ( B nc t h t h a yt h ma l l o c ( ) v i c a l l o c ( ) h o c r e a l l o c ( ) . ) B ng i ma l l o c ( ) , t r o n g y uc um t k h i n h t h b i . ( M n yt h c s c t h l m t p h nc a ma l l o c ( ) . ) H b i c t mk i mc h om t k h i b n h l n p n gy uc u . N y c t h c h i nb n gc c hk i mt r a m t b n h o c t h m c c a m t s l o i c h ot h yc c k h i h i n a n gs d n gv t r o n g c s n . l m t q u t r n hn h a n hc h n g , n h n gn c t h m t n h i uc g n g n c t h k h n g c x c n h l , b nc t h k h n gn h t t h i t p h i d a v oma l l o c ( ) l u nl u nl yc h n hx c c n gm t l n gt h i g i a n . T r c k h i m t c o nt r nk h i c t r v , k c ht h c v v t r c a k h i p h i c g h i l i c u c g i h nn a ma l l o c ( ) s k h n gs d n gn , v d o k h i b ng i mi np h ( ) , h t h n gb i t b a on h i ub n h p h t h n h. C c ht t c i un y c t h c h i nc t h r t k h c n h a u . V d , k h n gc g n g nc h nn g u y nt h y c p p h t b n h c t h c h i nt r o n gb v i x l l . N ub nt m , b nc t h v i t c c c h n gt r n ht h n g h i m c g n g o nt h e oc c hc a b nma l l o c ( ) c t h c h i n . B nc n gc t h c m n g u nt h v i n , n ub nc n ( c c n g u nG NUCl u nc s n ) .

V d b a n u ct h i t k l i

S d n gmi v x a , c c S t a s hv d g i i t h i ut r c t r o n gc u ns c hn yc t h c v i t l i s d n gt t c c c t n hn n gt h ol u nt r o n gc u ns c hc h o nn a y . K i mt r a m m i c n gs c u n gc pc h ob nm t n hg i h u c hc a c c c h . T i t h i i mn yt r o n gc u ns c h , k h n gp h i l S t a s hc n gk h n gn g nx pl ps " s h u " c c i t n gm c h n gc h t i , l k h i S t a s hh o c n g nx p i t n g i r a k h i p h mv i , n s k h n gg i x a c h ot t c c c i t n gm n t r t i . L d on yl k h n gc t h l b i v , t r o n gm t n l c c c h u n gc h u n g , h n mg i k h o n gt r n gc o nt r . N ub nx a m t k h o n gt r n gc o nt r , i ud u yn h t m s x yr a l b n h c p h t h n h , v k h n gc l o i t h n gt i nv k h n gc c c hn oc h ot r n hb i nd c hb i t n h n gg h y g i .

x av o i d* c t h l m tl i

Nc g i t r l m m t i m m n ub ng i x a m t v o i d* , n g nn h c h c c h ns l m t l i t r o n gc h n g t r n hc a b n , t r k h i c h nc a c o nt r l r t ng i n , c b i t , n k h n gc np h i c m t h mh y . D i yl m t v d c h ot h yb nb i t n h n gg s x yr a :

// :C 1 3 :B a d V o i d P o i n t e r D e l e t i o n . c p p //X ac o nt r v o i dc t h g yr ar r b n h #I n c l u d eu s i n gn a m e s p a c es t d ; l p it n g{ v o i d*d l i u ;//M ts l ut r c o n s ti n t s i z e ; c h a ri d ,c n gc h n g : it n g( i n ts z ,c h a rc ) :k c ht h c( S Z ) ,i d( c ){ d a t a=n e wc h a r[ s i z e ] ; c o u t< <" X yd n g it n g "< <i d < <" ,k c ht h c= "< <k c ht h c< < e n d l; } ~O b j e c t( ){ c o u t< <" D e s t r u c t i n g it n g "< <i d< <e n d l ; x a[ ]d l i u ;//O K ,c h c np h th n hl ut r , //K h n gc c u cg ih yl c nt h i t } } ; i n tm a i n( ){ it n g*a=n e wO b j e c t( 4 0 ,' a ' ) ; x am t ; v o i d*b=n e wO b j e c t ( 4 0 ,' b ' ) ; x ab ; }/// :~

C c l p i t n gc c h a m t v o i d* c k h i t od l i u" t h " ( n k h n gt r nc c i t n gc h mh y ) . T r o n gc c i t n gh y , x a c g i l c h on yv o i d* k h n gc t c n gx u , v i ud u yn h t c h n gt a c n p h i x yr a l c h ov i c l ut r s c p h t h n h .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 221/320

08/10/2013

Suy ngh trong C + +, Vol 1

T u yn h i n , t r o n gma i n( ) b nc t h t h yr n gn r t c nt h i t m x a b i t l o i i t n gn l mv i c v i . yl k t q u :
X yd n gm t it n g ,k c ht h c=4 0 it n gD e s t r u c t i n gm t X yd n g it n gb ,k c ht h c=4 0

V x a mt b i t r n gmt i m nm t i t n g, c c d e s t r u c t o r c g i l v d o v i c l ut r p h nb c h o d l i u c p h t h n h . T u yn h i n , n ub nt h a ot c m t i t n gt h n gq u a m t v o i d* n h t r o n gt r n gh p x a b, i ud u yn h t m s x yr a l v i c l ut r c h oc c i t n g c p h t h n hn h n gh yk h n g c g i l n h v yk h n gc p h t h n hc a b n h d l i u i m. K h i c h n gt r n hn yb i nd c h , c t h b ns k h n g t h yb t k t h n g i pc n hb o , t r n hb i nd c hg i n hr n gb nb i t n h n gg b n a n gl m. V v y , b nc c m t r r b n h r t y nt n h . N ub nc m t r r b n h t r o n gc h n gt r n hc a b n , t mk i mt h n gq u a t t c c c x a b oc ov k i mt r a c c l o i c o nt r b x a . N u l m t k h o n gt r n g* s a u b n c t h t mt h ym t n g u nr r b n h c a b n( C++c u n gc pp h o n gp h c c c h i k h c c h or r b n h , t u yn h i n ) .

D nd pt r c hn h i m v i c o nt r
l mc h oS t a s hv s px pc c t h n gc h a l i n hh o t ( c t h g i b t k l o i i t n g ) , h s t c h c k h o n g t r n gc o nt r . i un yc n g h a r n gk h i m t c o nt r c t r v t S t a s hh o c n g nx p i t n g , b np h i p n v k i ut h c hh pt r c k h i s d n gn , n h t h y t r n , b nc n gp h i pn v k i ut h c hh pt r c k h i x a h o c b ns n h n c m t b n h b r r . V n r r b n h k h c l mv i mb or n gx a t h c s g i l c h om i c o nt r i t n gt c h c t r o n g c o n t a i n e r . C o n t a i n e r k h n gc t h " s h u " c o nt r b i v n g i n n h l m t v o i d* v d o k h n gt h t h c h i nv i c d nd pt h c hh p . Ng i s d n gp h i c h ut r c hn h i ml ms c hc c i t n g . i un yt or a m t v n n g h i mt r n gn ub nt h mc o nt r nc c i t n gt or a t r ns t a c k v i t n g c t or a t r nh e a p c n gm t c o n t a i n e r v m t x a b i uh i nl k h n ga nt o nc h om t c o nt r m k h n g c c pp h t t r nh e a p . ( V k h i b nl ym t c o nt r t r l i t c o n t a i n e r , l mt h n ob ns b i t c n i i t n gc a n c p h nb ? ) V v y , b np h i c h c c h nr n gc c i t n g c l ut r t r o n gc c p h i nb ns a uc a S t a s hv n g nx p c t h c h i nc h t r n n g , h o c t h n gq u a c nt h nl pt r n hh a yb n gc c ht or a c c l ph c m c h c t h c x yd n gt r n n g . Nc n gq u a nt r n g mb or n gc c l pt r n hk h c hh n gc h ut r c hn h i ml ms c ht t c c c c o nt r t r o n g c o n t a i n e r . B n t h yt r o n gv d t r c n h t h n on g nx pl pk i mt r a t r o n gd e s t r u c t o r c a n l t t c c c l i nk t i t n g c x u t h i n . i v i m t s t a s hc a c o nt r , t u yn h i n , c c ht i pc nk h c l c nt h i t .

S t a s hc h oc o nt r

yl p h i nb nm i c a S t a s hl p , c g i l P S t a s h, g i c o nt r n i t n gt nt i t t r n n g , t r o n gk h i t u i S t a s ht r o n gc c c h n gt r c s a oc h pc c i t n gt h e og i t r v oS t a s hc o n t a i n e r . S d n gmi v x a , t h t d d n gv a nt o n g i c o nt r nc c i t n g c t or a t r nh e a p . yl t pt i nt i u c h oc c " c o nt r S t a s h" :

// :C 1 3 :P S t a s h . h //G i c o nt r t h a yv it n g #I f n d e fP S T A S H _ H #X c n hP S T A S H _ H l pP S t a s h{ i n ts l n g ;//S c h l ut r i n tt i pt h e o ;//k h n gg i a n t r n gT i p //C o nt r l ut r : k h o n gt r n g* *l ut r ; l mm th i ul ct n gl n( i n tt n g ) ,c n gc h n g : P S t a s h( ) :s l n g( 0 ) ,l ut r ( 0 ) ,t i pt h e o( 0 ){ } ~P S t a s h( ) ; i n ta d d( v o i d*p h nt ) ; v o i d*o p e r a t o r[ ]( i n ti n d e x )c o n s t ;// L y //H yb c ct il i ut h a mk h ot P S t a s hn y : v o i d*r e m o v e( i n ti n d e x ) ; //S p h nt t r o n gS t a s h : i n tc o u n t( ) c o n s t{ r e t u r nt i pt h e o ; } } ; #E n d i f//P S T A S H _ H/// :~

C cy ut d l i uc b nt n g i g i n gn h a u , n h n gb yg i l ut r l m t m n gt r n gc o nt r , v p h nb d u n gl n gl ut r c h om n g c t h c h i nv i mi t h a yv ma l l o c ( ) . T r o n gb i ut h c t r n g* *s t= n e wv o i d
*[ s l n g+t n g ] ;

c c l o i i t n g c g i a ol m t v o i d* , v v yc c b i uh i np h nb m t l o t c c k h o n gt r n gc o nt r .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 222/320

08/10/2013

Suy ngh trong C + +, Vol 1

C c h mh yx a l ut r m k h o n gt r n gg i c t c h c h nl c g n gx a n h n gg m n t r t i ( t r o n g , n h c p , s p h t h n hl ut r c a h v k h n gg i h mh yv m t k h o n gt r n gc o nt r k h n gc l o i t h n gt i n ) . S t h a y i k h c l s t h a yt h c a l y( ) v i c h c n n g i uh n h[ ] , c n g h a h nc p h p . M t l nn a , t u y n h i n , m t v o i d* c t r l i , v v yn g i d n gp h i n h n h n gl o i c l ut r t r o n gc c t h n gc h a v b c c c o nt r k h i l yc h n gr a ( m t v n m s c s a c h a t r o n gc h n gt n gl a i ) . yl c c n hn g h a h mt h n hv i n :
// :C 1 3 :P S t a s h . c p p{ O } //C o nt r n hn g h aS t a s h #B a og m" P S t a s h . h " #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< c s t r i n g >//' m e m 'c h cn n g s d n gt nm i nk h n gg i a nt i uc h u n ; i n tP S t a s h: :t h m( v o i d*y ut ){ c o n s ti n ti n f l a t e S i z e=1 0 ; n u ( s a u >=s l n g ) t n gl n( i n f l a t e S i z e ) ; l ut r [ t i pt h e o++ ]= y ut ; t r l i( t i pt h e o-1 ) ;s //C h s } //K h n gc q u y ns h u :P S t a s h: :~P S t a s h( ){ < t i pt h e o ;i++ ) y uc u( l ut r [ i ]= =0 , s c h " ) ; x a[ ]l ut r ; } f o r( i n ti=0 ;i " P S t a s hk h n g

// i uh n hq u t it h a yt h c h ol yv o i d*P S t a s h: :o p e r a t o r[ ]( i n ti n d e x )c o n s t{ y uc u( c h s >=0 , " P S t a s h: :o p e r a t o r[ ]c h s t i uc c " ) ; i f( i n d e x >=t i pt h e o ) t r v 0 ;// c h ot h yc u ic n g //S nx u tc o nt r np h nt m o n gm u n : t r v l ut r [ i n d e x ] ; } v o i d*P S t a s h: :r e m o v e( i n ti n d e x ){ v o i d*v= i uh n h[ ] ( i n d e x ) ; //" H yb "c o nt r : i f( !v=0 )l ut r [ i n d e x ]=0 ; t r l iv ; } t r n gP S t a s h: :t h ip h n g( i n tt n g ){ c o n s ti n tp s z=s i z e o f( v o i d* ) ; t r n g * *s t=n e wv o i d*[ s l n g+t n g ] ; m e m s e t( s t ,0 ,( s l n g+T n g )*p s z ) ; m e m c p y( s t ,l ut r ,s l n g*p s z ) ; s l n g+=t n g ; x a[ ]l ut r ;//C l ut r l ut r =s t ;// i mt ib n h m i }/// :~

C c a d d( ) c h c n n gl c h i uq u t n gt n h t r c , n g o i t r m t c o nt r c l ut r t h a yv m t b ns a o c a t o nb i t n g . S t h i p h n g( ) a n g c s a i x l v i c p h nb m t m n gv o i d* t h a yv c c t h i t k t r c , m c h l mv i c v i b y t e t h . y , t h a yv s d n gp h n gp h pt i pc nt r c k h i s a oc h pb i m n gl pc h m c , C t i uc h u nt h v i nc h c n n gme ms e t ( ) l l n ut i n c s d n g t h i t l pt t c c c b n h m i k h n g ( i un yl k h n gt h c s c nt h i t , k t k h i P S t a s hc l l q u nl t t c c c b n h m t c c hc h n hx c n h n gn t h n gk h n gl mt nt h n g n mv om t c h t c nt h n ) . S a u me mc p y( ) d i c h u y nc c d l i uh i nc t v t r c s a n gm i . T h n gt h n g , c c c h c n n gn h me ms e t ( ) v me mc p y( ) c t i uh a t h e ot h i g i a n , d o , h c t h n h a n hh ns ov i c c v n gt h h i nt r c . Nh n gv i m t c h c n n gn h t h i p h n g( ) s c t h k h n g c s d n gt h n gx u y n , b nc t h k h n gn h nt h ym t s k h c b i t h i us u t . T u yn h i n , t h c t l c c c u c g i c h c n n gc n h i us c t c hh nc c v n gc t h g i pn g nc h nc c l i m h a . t t r c hn h i mc a i t n gd nd pt h n gt r nv a i c a c c l pt r n hv i nk h c hh n g , c h a i c c h t r u yc p c c c o nt r t r o n gP S t a s h: c c n h i uh n h[ ] , m c h ng i nt r v c o nt r n h n gl n n h m t t h n hv i n c a c o n t a i n e r , v m t c h c n n gt h n hv i nt h h a i l o i b ( ) , t r v c o nt r n h n gc n gl o i b n t c o n t a i n e r b n gc c hc h n hv t r k h n g . K h i h yc h oP S t a s h c g i , n s k i mt r a mb or n gt t c c c c o n t r i t n g c l o i b , n uk h n g , b ns c t h n gb o b nc t h n g nc h nr r b n h ( c c g i i p h pt h a n hl c hh ns c s pt i t r o n gc h n gs a u ) . M t t h n g h i m yl c h n gt r n ht h n g h i mc c h oS t a s hv i t l i c h oP S t a s h:
// :C 1 3 :P S t a s h T e s t . c p p //{ L }P S t a s h //K i mt r ac o nt r S t a s h #B a og m" P S t a s h . h "
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 223/320

08/10/2013

Suy ngh trong C + +, Vol 1

#B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ P S t a s hi n t S t a s h ; //T cp h m" m i " cx yd n gt r o n gc cl o i ,q u .L u //c c" g i x yd n g "c p h p : f o r( i n ti=0 ;i< 2 5 ;i++ ) i n t S t a s h . a d d( n e wi n t( i ) ) ; f o r( i n tj=0 ;j < i n t S t a s h . c o u n t( ) ;j++ ) c o u t< <" i n t S t a s h[ "< <k< <" ]= " < <*( i n t * )i n t S t a s h[ j ]< <e n d l ; //L ms c h : f o r( i n tk=0 ;k< i n t S t a s h . c o u n t( ) ;k+ + ) x ai n t S t a s h . r e m o v e( k) ; t r o n gi f s t r e a m( " P S t a s h T e s t . c p p " ) ; mb o ( t r o n g" P S t a s h T e s t . c p p " ) ; P S t a s hs t r i n g S t a s h ; n gd y , t r o n gk h i( g e t l i n e ( t r o n g ,d n g ) ) s t r i n g S t a s h . a d d( m ic h u i( d n g ) ) ; //I nr ac h u i : f o r( i n tu=0 ;s t r i n g S t a s h[ u ]u++ ) c o u t< <" s t r i n g S t a s h[ "< <u< <" ]= " < <*( S t r i n g* )s t r i n g S t a s h[ u ]< <e n d l ; //L ms c h : f o r( i n tv=0 ;v< s t r i n g S t a s h . c o u n t( ) ;v++ ) x a( s t r i n g* )s t r i n g S t a s h . r e m o v e ( v ) ; }/// :~

Nh t r c y , S t a s he s c t or av c h a yt h n gt i n , n h n gt h i g i a nn y , t h n gt i nl c c c o nt r t mi b i ut h c . T r o n gt r n gh p ut i n , l ud n g : i n t S t a s h . a d d( i n tm i( i ) ) ; B i ut h c i n t mi ( i ) s d n gh n ht h c g i x yd n g , v v yl ut r c h om t m i i n t i t n g c t or a t r n h e a p , v i n t c k h i t ov i g i t r t i . T r o n gq u t r n hi n , g i t r t r v b i P S t a s h: : o p e r a t o r [ p h i ] b i n i t h n hk i up h h p , i un y c l p i l pl i c h op h nc nl i c a P S t a s h i t n gt r o n gc h n gt r n h . yl m t t c d n gk h n gmo n gmu nc a v i c s d n gk h o n gt r n gc o nt r n h l i d i nc b nv s c c n ht r o n gc c c h n gs a u . T h n g h i mt h h a i m f i l e m n g u nv c n m t d n gt i m t t h i g i a nv om t P S t a s h. M i d n g c c v om t c h u i s d n gg e t l i n e ( ) , s a u m t mi c h u i c t or a t n g l mc h om t b ns a o c l pc a d n g . N uc h n gt a c h t h n gq u a t i a c h c a d n gm i t h i g i a n , c h n gt i n h n c m t b t o nb c c c o nt r t r nd n g, m s c h c c c d n gv a c c t t pt i n . K h i l yc c c o nt r , b ns t h yb i uh i n :
*( S t r i n g* )s t r i n g S t a s h[ v ]

C o nt r t r v t n h i uh n h[ ] p h i c c v om t c h u i * c h on l o i t h c hh p . S a u , c c c h u i * c d e r e f e r e n c e d b i ut h c n hg i c h om t i t n g , l c n yt r n hb i nd c ht h ym t c h u i i t n g g i nc o u t . C c i t n g c t or at r nh e a pp h i c p h h yt h n gq u av i c s d n gc c l o i b ( ) t u y nb h o c n g i n ok h c b ns n h n c t i nn h nt r o n gt h i g i a nc h yn i v i b nr n gb n k h n gh o nt o nl ms c hc c i t n gt r o n g P S t a s h. C h r n gt r o n gt r n gh pc c i n t c o nt r , k h n gc d i nv i nl c nt h i t b i v k h n g c d e s t r u c t o r c h om t i n t v t t c c h n gt a c nl g i i p h n gb n h : x ai n t S t a s h . r e m o v e( k ) ; T u yn h i n , i v i c c c h u i c o nt r , n ub nq u nl mc c d i nv i nb ns c m t ( y nt n h ) r r b n h , v v y c c d i nv i nl i uc nt h i t : x a( s t r i n g* )s t r i n g S t a s h . r e m o v e( k ) ; M t s v n ( n h n gk h n gp h i t t c ) c t h c l o i b b n gc c hs d n gc c m u( m b ns h c t r o n g c h n g1 6 ) . T r o n gC++ , b nc t h t oc c m n gc a c c i t n gt r ns t a c kh a yt r nh e a pm t c c hd d n gb n gn h a u , v ( t t n h i n ) c c n h x yd n g c g i l c h ot n g i t n gt r o n gm n g . C m t h nc h , t u yn h i n : P h i c m t c o n s t r u c t o r m c n h , n g o i t r k h i t n gh pt r ns t a c k( x e mC h n g6 ) , b i v m t c o n s t r u c t o r k h n gc i s p h i c g i c h om i i t n g . K h i t or a c c m n gc a c c i t n gt r nh e a ps d n gmi , c m t i ub np h i l m. M t v d v m t m n g n h v yl
M y T y p e*f p=n e wM y T y p e[ 1 0 0 ] ;

m i v x ac h om n g

N yp h nb l ut r t r nh e a pc h o1 0 0 My T y p e i t n gv k ug i c c n h x yd n gc h om i m t . B y g i , t u yn h i n , b nc h c nc m t * My T y p e , l c h n hx c g i n gn h b ns n h n c n ub nn i
M y T y p e*f p 2=n e wM y T y p e ;

t or a m t i t n gd u yn h t . V b n v i t m , b nb i t r n gf pt h c s l a c h b t uc a m t m n g , v v yn c n g h a c h nc c p h nt m n gs d n gm t b i ut h c n h f p[ 3 ] . Nh n gn h n gg s x yr a k h i
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 224/320

08/10/2013

Suy ngh trong C + +, Vol 1

b nt i ud i t m n g ? C c b oc o
x aF P 2 ;//O K x af p ; //K h n gh i uq u m o n gm u n

n h ng i n gh t n h a u , v t c n gc a c h n gs g i n gn h a u . D e s t r u c t o r s c g i c h oMy T y p e i t n g c t r nb i a c h n h t n h , v s a u l ut r s c p h t h n h . C h oF P 2 n yl t t , n h n g i v i f pn yc n g h a l 9 9 c u c g i h yk h c s k h n g c t h c h i n . n gs l n gl ut r v ns c p h t h n h , t u yn h i n , b i v n c p h nb t r o n gm t o nl n , v k c ht h c c a t o nb o n c c t g i u u b i c c t h i q u e np h nb . C c g i i p h p i h i b np h i c u n gc pc h oc c t r n hb i nd c hc c t h n gt i nm yt h c s l a c h b t uc a m t m n g . i un y c t h c h i nv i c p h ps a u :

x a[ ]f p ;

K h u n gt r n gc h ot r n hb i nd c h t or amn ps l n gc c i t n gt r o n gm n g , c l ut r u k h i c c m n g c t or a , v c c c u c g i d e s t r u c t o r c h or n gn h i u i t n gm n g . i un yt h c s l m t c p h pc i t i nt h n ht h c t r c , m b nc t h v nn h nt h yt r o n gm c : x a[ 1 0 0 ]f p ; t r o n g b u c c c l pt r n h b a og ms l n gc c i t n gt r o n gm n gv g i i t h i uk h n n gr n gc c l p t r n hv i ns n h n c n s a i . C c c h i p h b s u n g c h oc c t r n hb i nd c hx l n l r t t h p , v n c c o i l t t h n x c n hs i t n g m t n i t h a yv h a i .

L m c h o m tc o nt r g i n gn h m tm n g
L m t s a n gm t b n , f p n hn g h a t r nc t h c t h a y i t r nb t c i ug , mk h n gc n g h a c h oc c a c h b t uc a m t m n g . Nc n g h ah n x c n hn n h m t h n gs , v v yb t k n l c t h a y i c o nt r s c g nc n h l m t l i . c c h i u n gn y , b nc t h t h i n tc o n s t* q= n e wi n t
[ 1 0 ] ;

h o c c o n s ti n t*q=n e wi n t[ 1 0 ] ; n h n gt r o n gc h a i t r n gh pc o n s t s l i nk t v i c c i n t , c n g h al , n h n gg a n g c c h c h o , c h k h n g p h i l c h t l n gc a c o nt r c h n hn . T h a yv o , b np h i n i i n t*c o n s tq=n e wi n t[ 1 0 ] ;

C h yr ak h i l ut r

B yg i c c p h nt m n gt r o n gqc t h c s a i , n h n gt h a y i q( n h q++) l b t h pp h p , v n l v i m t n hd a n hm n gb n ht h n g . Nh n gg s x yr a k h i c c n h i uh n hmi k h n gt h t mt h ym t k h i l i nt c l ut r l n c h a c c i t n gmo n gmu n ? M t c h c n n g c b i t c g i l m i x l c g i l . Ha y n gh n , m t c o nt r n m t c h c n n g c k i mt r a , v n uc o nt r k h c k h n g , s a u c h c n n gn c h c g i . H n hv i m c n hc h o x l m i l n mm t n g o i l , m t c h c c pt r o n gt p2 . T u yn h i n , n ub n a n gs d n gp h nb n gt r o n gc h n gt r n hc a b n , n k h nn g o a n t n h t l t h a yt h c c n e wh a n d l e r v i m t t h n gb or n gb n c h yr a k h i b n h v s a u a b o r t s c h n gt r n h . B n gc c h , t r o n gq u t r n h g l i , b ns c m t um i v n h n gg x yr a . i v i c h n gt r n hc u i c n gb ns mu ns d n gp h c h i m n hm h n . B nt h a yt h m i x l b n gc c hb a og mn e w. hv s a u g i s e t _ n e w_ h a n d l e r (v i a c h c a c c c h c n n g b nmu n) c i t :

// :C 1 3 :N e w H a n d l e r . c p p //T h a y im ix l #I n c l u d e #B a og m< c s t d l i b >#b a og m< n e w >s d n gt nm i nk h n gg i a n t i uc h u n ; i n tc o u n t=0 ; k h o n gt r n go u t _ o f _ m e m o r y( ){ c e r r< <" c nb n h s a uk h i "< <s < <" P h nb "< <E n d l ; e x i t( 1 ) ; } i n tm a i n( ){ s e t _ n e w _ h a n d l e r( o u t _ o f _ m e m o r y ) ; t r o n gk h i( 1 ){ t n h++ ;n e wi n t[ 1 0 0 0 ] ;//h tb n h } }/// :~

C h c n n gm i x l p h i k h n gc i s v c m t k h o n gt r n gg i t r t r v . C c t r o n gk h i v n gl ps t i p t c p h nb i n t i t n g( v v t i a c h t r v ) c h o nk h i c c c a h n gmi np h h t . T i c u c g i r t c n h mi , k h n gl ut r c t h c p h nb , v v y x l m i s c g i .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 225/320

08/10/2013

Suy ngh trong C + +, Vol 1

H n hv i c a c c x l m i c g nv i n h i uh n hmi , v v yn ub nq u t i n h i uh n hmi ( c n ut r o n gp h nt i pt h e o ) c c n e wh a n d l e r s k h n g c g i t h e om c n h . N ub nv nmu nn e wh a n d l e r c g i l b ns p h i v i t c o d e l mn h v yt r o n gq u t i c a n h i uh n hmi . T t n h i n , b nc t h v i t p h c t ph nm i x l , n g a yc m t c g n g l yl i b n h ( t h n g c b i t n n h m t t h n g r c t h u) . yk h n gp h i l m t c n gv i c c h oc c l pt r n hv i nm i l mq u e n .

Qu t i m i v x a

K h i b nt or a m t t h h i nm i , c h a i i ux yr a . ut i n , l ut r c p h nb s d n gc c n h i uh n h mi , s a u c c n h x yd n g c g i l . T r o n gm t x a t h h i n , c c d e s t r u c t o r c g i , s a u l ut r c d e a l l o c a t e db n gc c hs d n gx a n h i uh n h. C c n h x yd n gv h yc u c g i k h n gb a og i d i s k i ms o t c a b n( n uk h n gb nc t h v t n hp h v c h n g ) , n h n gb nc t h t h a y i l ut r p h nb c h c n n g i uh n hmi v n h i uh n hx a . H t h n gc pp h t b n h c s d n gb i mi v x a c t h i t k s d n gm c c hc h u n g . T r o n gt r n g h p c b i t , t u yn h i n , n k h n gp h c v n h uc uc a b n . L d op h b i nn h t t h a y i c pp h t l h i u q u : B nc t h t or a v p h h yr t n h i u i t n gc a m t l ph c c b i t m n t r t h n hm t n t c c h a i t c . C++c h op h pb nq u t i mi v x a t h c h i nc h n gt r n hc pp h t b n h c a r i n gb n , b n c t h x l v n n h t h n y . M t v n k h c l s p h nm n h n g . B n gc c hp h nb i t n gc k c ht h c k h c n h a un c t h p h v c c n g b nc h i uq u h t d u n gl n g . l , v i c l ut r c t h c s n , n h n gv p h nm n hk h n gm n h l l n p n gn h uc uc a b n . B n gc c ht or a c pp h t c a r i n gb nc h om t l ph c c b i t , b nc t h mb o i un yk h n gb a og i x yr a . T r o n gc c h t h n gn h n gv t h i g i a nt h c , m t c h n gt r n hc t h c h yt r o n gm t t h i g i a nr t d i v i n g u n l c h nc h . M t h t h n gn h v yc n gc t h y uc uc pp h t b n h l u nl u nc c n gm t l n gt h i g i a n , v k h n gc t r c pc h o n gk i t s c h o c c c m n hv n . M t c pp h t b n h t yc h n hl g i i p h p , n u k h n g , c c l pt r n hv i ns t r n hs d n gmi v x a h o nt o nt r o n gt r n gh pn h v yv b l m t g i t r C ++t i s n . K h i b nq u t i n h i uh n hmi v i uh n hx a , i uq u a nt r n gl h yn h r n gb n a n gt h a y i c h l c c hs n g l ut r c p h nb . T r n hb i nd c hc h ng i nl s g i b nmi t h a yv p h i nb nm c n h p h nb l u t r , s a u g i c c n h x yd n g l ut r . V v y , m c d c c t r n hb i nd c hp h nb l ut r v k ug i c c n h x yd n gk h i n t h ymi , t t c c c b nc t h t h a y i k h i b nq u t i mi l p h nc pp h t b n h . ( x a c m t g i i h nt n gt . ) K h i b nq u t i n h i uh n hmi , b nc n gt h a yt h h n hv i k h i n c h yr a k h i b n h , v v yb np h i q u y t n hl mg t r o n gb n i uh n hmi : t r l i k h n g , v i t m t v n gl p g i n e wh a n d l e r v t h l i p h n b , h o c ( t h n g ) n m m t b a d _ a l l o c n g o i l ( c t h ol u nt r o n gt p2 , c s nt i w w w . B r u c e E c k e l . c o m) . Qu t i mi v x a g i n gn h q u t i b t k n h i uh n hk h c . T u yn h i n , b nc m t s l a c h nq u t i c a c c c pp h t t o nc uh o c s d n gm t c pk h c n h a uc h om t l ph c c b i t . yl p h n gp h pq u y t l i t , k h i c c p h i nb nt o nc umi v x a k h n g t y uc uc h ot o nb h t h n g . N ub nq u t i c c p h i nb nt o nc u , b nt h c h i nm c n hh o nt o nk h n gt h t i pc nb nt h mc h k h n gt h g i c h oh t b nt r o n g n hn g h a l i c a b n . C c q u t i mi p h i n h nm t i c a s i z e _ t ( t i uc h u nt i uc h u nl o i Cc h oc c k c hc ) . L pl u nn y c t or a v c h u y n nb nb n gc c t r n hb i nd c hv k c ht h c c a c c i t n gm b n a n gc h ut r c hn h i m p h nb . B np h i t r l i m t c o nt r h o c nm t i t n gc k c ht h c n h ( h o c l nh n , n ub nc m t s l d o l mn h v y ) , h o c b n gk h n gn ub nk h n gt h t mt h yb n h ( t r o n gt r n gh pn h x yd n gl k h n g c g i ) . T u yn h i n , n ub nk h n gt h t mt h yb n h , b ns c t h l m m t c i g n h i ut h n gt i n h nc h t r v s k h n g , n h c c hg i m i x l h o c n m m t n g o i l , b oh i ur n gc m t v n . G i t r t r l i c a n h i uh n hmi l m t v o i d* , k h n g m t c o nt r nb t k l o i c b i t . T t c c c b n t h c h i n c s nx u t b n h , k h n gp h i l m t i t n g h o nt h n h k h n gx yr a c h o nk h i c c n h x yd n g c g i l , m t h n h n gn h n g mb ot r n hb i nd c hv l n g o i t mk i ms o t c a b n . C c n h i uh n hx a m t m t v o i d* v ob n h c c pp h t b i n h i uh n hmi . l m t k h o n gt r n g* b i v t o nt d e l e t e c h n h n cc o nt r s a uk h i d e s t r u c t o r c g i , m l o i b c c i t n g Ne s s t p h nd u n gl n gl ut r . K i ut r l i l k h o n gt r n g. D i yl m t v d ng i nc h ot h yl mt h n o t n ht r n gq u t i t o nc umi v x a :

Qu t i t o nc u m i v x a

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

226/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 1 3 :G l o b a l O p e r a t o r N e w . c p p //Q u t im it o nc u/x a #B a og m< c s t d i o >#b a og m< c s t d l i b >s d n gt nm i nk h n gg i a n t i uc h u n ; v o i d*n h i uh n hm i( s i z e _ tS Z ){ p r i n t f( " n h i uh n hm i : %db y t e\n " , s z ) ; v o i d*m=m a l l o c( S Z ) ; i f( !m ) t( " r ak h ib n h " ) , t r l im; } i uh n hx ak h o n gt r n g( v o i d*m ){ p u t s( " n h i uh n hx a " ) ; m i np h ( m ) ; } l pS{ i n ti[ 1 0 0 ] ;c n gc n g : S( ){ t( " S: :S( ) " ) ; } ~S( ){ p u t s( " S: :~S( ) " ) ; } } ; i n tm a i n( ){ p u t s( " t or av p h h ym ti n t " ) ; i n t*p=n e wi n t ( 4 7 ) ; d e l e t ep ; t( " t or av p h h ym ts " ) ; S*s=n e wS ; x as ; t( " t or av p h h yS[ 3 ] " ) ; S*s a=m iS[ 3 ] ; x a[ ]s a ; }/// : ~

yb nc t h t h yh n ht h c c h u n gc a q u t i mi v x a . H s d n gn h n gt i uc h u nt h v i nCc h c n n gma l l o c ( ) v f r e e ( ) c pp h t ( m c l l n h n gg m c n hmi v x a s d n gn a ! ) . T u yn h i n , h c n gi nc c t h n g i pv n h n gg h a n gl m. C h r n gp r i n t f ( ) v p u t s ( ) c s d n gt h a yv i o s t r e a ms . i un yl d ok h i m t i o s t r e a m i t n g c t or a ( n h t o nc uc i n, c o u t v c e r r ) , n g i mi c pp h t b n h . V i p r i n t f ( ) , b nk h n gn h n c v ob t c b i v n k h n gg i mi k h i t oc h n hn . T r o n gma i n( ) , i t n gc k i ub u i l t i n c t or a c h n gmi n hr n gq u t i mi v x a c n g c g i l t r o n gt r n gh p . S a u , m t i t n gd u yn h t c a l o i S c t or a , t i pt h e ol m t l o t c c S. i v i m n g , b ns t h yt s b y t e y uc ut h mb n h c p h nb l ut r t h n gt i n( t r o n gm n g ) v s l n g c c i t n gm n n mg i . T r o n gm i t r n gh p , c c p h i nb nq u t i t o nc umi v x a c s d n g .

Qu t i m i v x ac h o m tl ph c

M c d b nk h n gc np h i n i r r n gt n h, k h i b nq u t i mi v x a c h om t l ph c , b n a n gt or a t n h h mt h n hv i n . Nh t r c , c p h pt n gt n h q u t i b t k n h i uh n hk h c . K h i t r n hb i nd c ht h y b ns d n gmi t or a m t i t n gc a l ph c c a b n , n c h nc c t h n hv i n i uh n hmi s ov i p h i nb nt o nc u . T u yn h i n , c c p h i nb nt o nc umi v x a c s d n gc h ot t c c c l o i i t n g k h c ( t r k h i h c r i n gc a h mi v x a ) . T r o n gv d s a u y , m t h t h n gp h nb l ut r n g u y nt h y c t or a c h ol pF r a mi s . M t p h nc a b n h c d n hr i n gt r o n gk h uv c d l i ut n ht i c h n gt r n hk h i n g , v b n h c s d n g p h nb k h n gg i a nc h oc c i t n gc a l o i F r a mi s . x c n hk h i c g i a o , m t m n g ng i nc a b y t e c s d n g , m t b y t e c h om i k h i :

// :C 1 3 :F r a m i s . c p p // ap h n gq u t im iv x a #B a og m< c s t d d e f >//s i z e _ t #B a og m< f s t r e a m > #I n c l u d e#i n c l u d e< n e w >s d n gt nm i nk h n gg i a nt i uc h u n ; o f s t r e a mr a( " F r a m i s . o u t " ) ; l pF r a m i s{ e n u m{ s z=1 0 } ; c h a rc[ S Z ] ;// m tk h n gg i a n ,k h n g cs d n g t n hu n s i g n e dc h a rh b i[ ] ; s t a t i cb o o la l l o c _ m a p[ ] ;c n gc n g : e n u m{ p s i z e=1 0 0 } ; //f r a m ip h p F r a m i s( ){ r a< <" F r a m i s( )\n " ; } ~F r a m i s( ) { r a< <" ~F r a m i s( ). . . " ; } v o i d*n h i uh n hm i( s i z e _ t )n m( b a d _ a l l o c ) ; k h o n g t r n g i uh n hx a( v o i d* ) ; } ;U n s i g n e dc h a rF r a m i s: :h b i[ p s i z e*s i z e o f( F r a m i s ) ] ;b o o lF r a m i s: :a l l o c _ m a p[ p s i z e ] ={ f a l s e } ; //K c ht h c cb q u a-c h or n gm tk h o n gt r n g it n gF r a m i s* F r a m i s: :n h i uh n hm i( s i z e _ t )n m( b a d _ a l l o c ){ f o r( i n ti=0 ;i< p s i z e ;i++ ) ( !a l l o c _ m a p[ i ] ){ n ur a< <" s d n gk h i "< <i< <" . .." ;a l l o c _ m a p[ i ]=t r u e ;// n hd un cs d n gh b it r l i+( i*s i z e o f( F r a m i s ) ) ; } r a< <" r ak h ib n h "< <e n d l ; n mb a d _ a l l o c( ) ; } t r n gF r a m i s: :o p e r a t o rd e l e t e( v o i d *m ){ i f( m )t r l i ;/ /K i mt r ac o n t r n u l l //G i s n ct or at r o n gc ch b i //T n ht o nm s k h il : u n s i g n e dl o n gk h i=( u n s i g n e dl o n g )m -( u n s i g n e dl o n g )h b i ; k h i/= s i z e o f( F r a m i s ) ; r a< <" g i ip h n gk h i "<< k h i< <e n d l ; // n hd un m i n p h : a l l o c _ m a p[ k h i ]=f a l s e ; } i n tm a i n( ){
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 227/320

08/10/2013

Suy ngh trong C + +, Vol 1

F r a m i s*f[ F r a m i s: :p s i z e ] ; t r y{ f o r( i n ti=0 ;i< F r a m i s: :p s i z e ;i+ + ) f[ i ]=n e wF r a m i s ; m iF r a m i s ;//H tb n h }c a t c h( b a d _ a l l o c ) { c e r r< <" H tb n h ! "< <E n d l ; } x af[ 1 0 ] ; f[ 1 0 ]=0 ; //S d n gb n h p h th n h : F r a m i s*x=n e wF r a m i s ; x ax ; f o r( i n tj=0 ;j< F r a m i s: :p s i z e ;j++ ) x af[ j ] ;//X af [ 1 0 ]O K }/// :~

H b i b n h c h oc c F r a mi s n g c t or a b n gc c hp h nb m t m n gb y t e l n g i p s i z e F r a mi s i t n g . B n p h nb l p s i z e y ut d i , d o , c m t b o o l c h om i k h i . T t c c c g i t r t r o n gb n p h n b c k h i t os a i b n gc c hs d n gt h t h u t k h i t ot n gh pc a t h i t l pc c y ut ut i n t r n hb i n d c ht n gk h i t ot t c c c p h nc nl i g i t r m c n hb n ht h n gc a h ( l s a i , t r o n gt r n gh p c a b o o l ) . C c a p h n g i uh n hmi c c p h pt n gt n h k h n gh o n gt o nc u . T t c n l t mk i mt h n gq u a c c b n p h nt mk i m m t s a i g i t r , s a u t v t r t h c s c h r a n c p h nb v t r v a c h c a k h i b n h t n g n g . N un k h n gt h t mt h yb t k b n h , n p h t h n hm t t h n g i pt i c c t pt i nd uv t v n m m t b a d _ a l l o c n g o i l . yl v d ut i nc a n g o i l m b n n h nt h yt r o n gc u ns c hn y . K t k h i c u c t h ol u nc h i t i t v t r n gh pn g o i l b t r h o nc h o nk h i T p2 , yl m t s d n gr t ng i nc a h . T r o n g i uh n hmi c h a i h i nv t c a x l n g o i l . ut i n , d a n hs c h i s c h c n n gt i pt h e ol n m( b a d _ a l l o c , m n i v i t r n hb i nd c hv c c ) n g i c r n gc h c n n gn yc t h n m m t n g o i l c a l o i b a d _ a l l o c . T h h a i , n u k h n gc b n h n h i uh nc c c h c n n gt h c s k h n gn mn g o i t r t r o n gb oc on mb a d _ a l l o c . K h i m t n g o i l c n mr a , c h c n n gd n gt h c h i nv k i ms o t c t h n gq u a v i m t x l n g o i l , c t h h i nn h m t n m b t i uk h o n . T r o n gma i n( ) , b ns t h ym t p h nk h c c a h n h n h , l t r y c a t c h k h o n . C c t h k h i c b a oq u a n hb i n i n gr n gv c h a t t c c c m c t h n mn g o i l t r o n gt r n gh pn y , b t k c u c g i nmi c l i n q u a n nF r a mi s i t n g . Ng a ys a uk h i t h k h i l m t h o c n h i ub t k h o n , m i n g i x c n hl o i n g o i l m h b t c . T r o n gt r n gh pn y , b t ( b a d _ a l l o c n i r n g) m b a d _ a l l o c t r n gh pn g o i l s b b t y . c b i t n yb t k h o nc h c t h c h i nk h i m t b a d _ a l l o c n g o i l c n mr a , v t i pt c t h c h i ns a u k h i k t t h c c u i c n gb t i uk h o nt r o n gn h m( c h c m t y , n h n gc t h c n h i uh n ) . T r o n gv d n y , n c t h d n gi o s t r e a ms v t o nc u i uh n hmi v x a a n gb n hh n g . C c n h i uh n hx a g i n hF r a mi s a c h c t or a t r o n gh b i . yl m t g i n hh pl , b i v c c a p h n g i uh n hmi s c g i l b t c k h i n ob nt or a m t nF r a mi s i t n gt r nh e a pn h n g k h n gp h i l m t m n gt r o n gs h : t o nc umi c s d n gc h oc c m n g . V v y , n g i s d n gc t h v t n h k ug i n h i uh n hx a m k h n gc ns d n gc p h pk h u n gt r n g c h r a m n gp h h y . i u n ys g yr a m t v n . Ng o i r a , n g i d n gc t h x a m t c o nt r nm t i t n gt or a t r ns t a c k . N u b nn g h r n gn h n g i un yc t h x yr a , b nc t h mu nt h m m t d n g mb o a c h l t r o n gh b i v t r nm t r a n hg i i c h n hx c ( b nc n gc t h b t un h nt h yt i mn n gc a q u t i mi v x a c h ov i c t m k i mr r b n h ) . n h i uh n hx a t n ht o nk h i t r o n gh b i m c o nt r n y i d i n , v s a u t l c b n p h nb c h o k h i f a l s e c h k h i c p h t h n h . T r o n gma i n( ) , F r a mi s i t n g c c pp h t n g c h yr a k h i b n h , i un ys k i mt r a c c h n hv i n g o i b n h . S a u , m t t r o n gn h n g i t n g c g i i p h n g , v m t s k h c c t or a c h ot h yr n g b n h p h t h n h c t i s d n g . B i v c h n gt r n hp h nb n yl c t h c h oF r a mi s i t n g , n c t h l n h a n hh nn h i us ov i c h n gt r n h c pp h t b n h c m c c hc h u n g c s d n g m c n hmi v x a . T u yn h i n , b nn nl ur n gn k h n gt n gl mv i c n ut h a k c s d n g( t h a k t r o n gc h n g1 4 ) . N ub nq u t i n h i uh n hmi v x a c h om t l ph c , n h n gn h i uh n h c g i l b t c k h i n ob n t om t i t n gc al p . T u yn h i n , n ub nt om t m n gc ac c i t n gl ph c , t o nc u i uh n h mi cg i l c pp h t l ut r c h om n gt t c c n gm t l c , v t o nc u i uh n hx a c g i l p h t h n hl ut r . B nc t h k i ms o t v i c p h nb c c m n gc ac c i t n gd oq u t i c c p h i nb n c b i t c a m n g i uh n hmi [v ] t o nt d e l e t e [c h o] l p . D i yl m t v d c h ot h yk h i h a i p h i nb n k h c n h a u c g i l :
// :C 1 3 :A r r a y O p e r a t o r N e w . c p p // i uh n hm ic h om n g #B a og m< n e w >//s i z e _ t n hn g h a #B a og m< f s t r e a m >s d n gt nm i nk h n gg i a nt i uc h u n ;o f s t r e a md uv t
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 228/320

Qu t i m i v x ac h o m n g

08/10/2013

Suy ngh trong C + +, Vol 1

( " A r r a y O p e r a t o r N e w . o u t " ) ; l pW i d g e t{ e n u m{ s z=1 0 } ; i n ti[ S Z ] ,c n gc h n g : P h t n g( ){ d uv t< <" * " ; } ~W i d g e t( ){ d uv t< <" ~ " ; } v o i d*n h i uh n hm i( s i z e _ tS Z ){ d uv t< <" W i d g e t: :m i : "< <s z< <"b y t e" < <e n d l ;t r l i: :n e wc h a r[ S Z ] ; } i uh n hx ak h o n gt r n g( v o i d*p ){ d uv t< <" W i d g e t: :d e l e t e " < <e n d l ; : :D e l e t e[ ]p ; } v o i d*n h i uh n hm i[ ]( s i z e _ tS Z ){ d uv t< <" W i d g e t: : m i[ ] : " < <s z< <" b y t e "< <e n d l ; t r l i: :n e wc h a r[ S Z ] ; } t r n gt o nt d e l e t e[ ]( v o i d*p ){ d uv t< <" W i d g e t: :d e l e t e[ ] " < <e n d l ; : :D e l e t e[ ]p ; } } ; i n tm a i n( ){ d uv t< <" m iW i d g e t "< <e n d l ; W i d g e t*w=n e wW i d g e t ; d uv t< <" \ n d e l e t eW i d g e t "< <e n d l ; x aw ; d uv t< <" \n T n hn n gm iW i d g e t[ 2 5 ] "< <e n d l ; W i d g e t*w a=n e wW i d g e t [ 2 5 ] ; d uv t< <" \n d e l e t e[ ]W i d g e t "< <e n d l ; x a[ ]w a ; }/// :~

y , c c p h i nb nt o nc umi v x a c g i l n h v yh i uq u l g i n gn h k h n gc p h i nb n q u t i mi v x a n g o i t r v i c t h e od i t h n gt i n c t h mv o . T t n h i n , b nc t h s d n gb t k c h n g t r n hc pp h t b n h m b nmu nt r o n gq u t i mi v x a . B nc t h t h yr n gc p h pc a m n gmi v x a t n gt n h i v i c c p h i nb n i t n gc n h nn g o i t r v i c b s u n gc c d un g o c n . T r o n gc h a i t r n gh p , b n a n g a k c ht h c c a b n h b np h i p h n b . K c ht h c g i a oc h op h i nb nm n gs c k c ht h c c a t o nb m n g . l g i t r l ug i t r o n gt mt r r n gc h c i uc c n h i uh n hq u t i mi c y uc up h i l ml t r a ol i m t c o nt r nm t k h i b n h l n . M c d b nc t h t h c h i nk h i t ot r nb n h , t h n gt h n g l c n gv i c c a c c n h x yd n gs t n g c g i l b n h c a b nb n gc c t r n hb i nd c h . C c n h x yd n gv h yc h c ni nr a n h n gn h nv t b nc t h n h nt h yk h i h c g i . yl n h n g g c c t pt i nd uv t t r n gg i n gn h m t t r n hb i nd c h :


m iW i d g e tW i d g e t: :m i :4 0b y t e *X aW i d g e t ~W i d g e t: :d e l e t e W i d g e tm i[ 2 5 ]W i d g e t: :m i[ ] :1 0 0 4b y t e* * * * * * * * * * * * * * * * * * * * * * * * * x a[ ]W i d g e t ~~~~~~~~~~~~~~~~~~~~~~~~~W i d g e t: :d e l e t e[ ]

T om t i t n gc n h ny uc u4 0 b y t e , n h b nc t h mo n g i . ( M yn ys d n gb nb y t e c h om t i n t . ) C c n h i uh n hmi c g i , s a u c c n h x yd n g( c h r a b i * ) . T r o n gm t t h i t r a n gb s u n g , k ug i x a l mc h od e s t r u c t o r c g i , s a u c c n h i uh n hx a . K h i m t l o t c c Wi d g e t i t n g c t or a , p h i nb nm n gc an h i uh n hmi c s d n g , n h h a . Nh n gt h n gb or n gk c ht h c y uc ul b nb y t e h ns ov i d k i n . i un yt h mb nb y t el n i m h t h n gg i t h n gt i nv c c m n g , c b i t , s l n gc c i t n gt r o n gm n g . B n gc c h , k h i b nn i x a[ ]
W i d g e t ;

k h u n gc h ot r n hb i nd c hn l m t m n gc a c c i t n g , d o t r n hb i nd c ht om t ms c a c c i t n gt r o n gm n gv g i d e s t r u c t o r m n h i ul n . B nc t h t h yr n g , m c d c c m n g i uh n hmi v i uh n hx a c h c g i m t l nc h ot o nb o nm n g , c c n h x yd n gm c n hv h mh y c g i l c h ot n g i t n gt r o n gm n g .

C u cg i x yd n g
X e mx t r n g
M y T y p e*f=n e wM y T y p e ;

// :C 1 3 :N o M e m o r y . c p p //C o n s t r u c t o rk h n g cg il m in uk h n g
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

c u c g i mi p h nb m t My T y p e m n hc k c ht h c l ut r , s a u g i c c My T y p e x yd n gt r nl u t r , n h n gg s x yr a n uc c c pp h t b n h t r o n gmi k h n g ? C c n h x yd n gk h n g c g i t r o n g t r n gh p , v v ym c d b nv nc m t i t n gk h n gt h n hc n gt or a , t n h t b n k h n gg i c c n h x yd n gv a m t s k h n gn yc o nt r . D i yl m t v d c h n gmi n h i u :

229/320

08/10/2013

Suy ngh trong C + +, Vol 1

#I n c l u d e #B a og m< n e w >//b a d _ a l l o c n hn g h as d n gt nm i nk h n gg i a nt i uc h u n ; l pN o M e m o r y{ p u b l i c : N o M e m o r y( ){ c o u t< <" N o M e m o r y: :N o M e m o r y( ) "< < e n d l ; } v o i d*n h i uh n hm i( s i z e _ tS Z )n m( b a d _ a l l o c ){ c o u t< <" N o M e m o r y: :n h i uh n hm i "< <e n d l ; n mb a d _ a l l o c( ) ;//" H tb n h " } } ; i n tm a i n( ){ N o M e m o r y*n m=0 ; t r y{ n m=n e wN o M e m o r y ; }c a t c h ( b a d _ a l l o c ){ c e r r< <" H tb n h n g o il "< <e n d l ; } c o u t< <" n m= "< <n m< <e n d l ; }/// :~

K h i c h n gt r n hc h y , n k h n gi nt h n g i px yd n g , c h c t i nn h nt n h i uh n hmi v t h n g i p t r o n gx l n g o i l . V mi k h n gb a og i q u a yt r l i , c c n h x yd n gl k h n gb a og i g i l n h v yt h n g i pc a n k h n g c i n . i uq u a nt r n gl n m c k h i t ob n gk h n gv mi b i uh i nk h n gb a og i h o nt h n h , v c o nt r n n k h n gc h c c h nr n gb nk h n gl md n gn . T u yn h i n , b nt h c s n nl mn h i uh nt r o n gx l n g o i l h nl c h i nr a m t t h n g i pv t i pt c n h n u i t n g c t ot h n hc n g . L t n gn h t , b ns l m c i g s l mc h oc h n gt r n h p h c h i t v n , h o c l i r a t n h t l s a uk h i n gn h pm t l i . T r o n gc c p h i nb nt r c c a C++n l t i uc h u nt h c h n h t r l i b n gk h n gt mi n uc pp h t b n h t h t b i . i u s n g nc h nx yd n gx yr a . T u yn h i n , n ub nc g n g t r l i b n gk h n gt mi v i m t t r n hb i nd c hh pc h u n , n s c h ob nb i t r n gb nn nn mb a d _ a l l o c t h a yt h . v t r m i v C h a i k h c , t p h b i n , s d n gc h oq u t i n h i uh n hmi . 1. B nc t h mu n t m t i t n gt r o n gm t v t r c t h t r o n gb n h . i un y c b i t q u a nt r n gv i c c h t h n gn h n gp h nc n gt h e o n hh n gm m t i t n gc t h n gn g h a v i m t o nc t h c a p h nc n g . B nc t h mu n c t h l a c h nc pp h t k h c n h a uk h i g i mi .

x a

2.

C h a i t n hh u n g c g i i q u y t v i c c h t n gt : C c q u t i n h i uh n hmi c t h m t h nm t i s . Nh b n t h yt r c y , t h a ms ut i nl u nl u nl k c ht h c c a i t n g , c t n hb m t v t h n g q u a c c t r n hb i nd c h . Nh n gc c i s k h c c t h l b t c i ug b nmu n a c h m b nmu nc c i t n g c t t i , m t t h a mc h i u nm t c h c n n gb n h g i a o t , i t n g , h o c b t c i ug k h c m l t h u nt i nc h ob n . C c hm b nv t q u a c c i s b s u n g i uh n hmi t r o n gk h i g i c t h c v h i t ml n ut i n . B n a d a n hs c h i s ( k h n g c c s i z e _ t l u n , c x l b i c c t r n hb i nd c h ) s a ut k h a mi v t r c t n l pc a i t n gb n a n gt o . V d ,


X*x p=n e w( a )X ;

s v t q u a mt i s t h h a i i uh n hmi . T t n h i n , i un yc t h c h l mv i c n un h m t n h i u h n hmi c c n gb .
// :C 1 3 :P l a c e m e n t O p e r a t o r N e w . c p p //V t r v in h i uh n hm i #B a og m< c s t d d e f >//s i z e _ t#i n c l u d eu s i n gn a m e s p a c es t d ; c l a s sX{ i n ti ;c n gc n g : X( i n ti i=0 ) :i( i i ){ c o u t< <" n y= "< <n y< <e n d l ; } ~X( ){ c o u t< <" X: :~X( ) : "< <n y< <e n d l ; } v o i d*n h i uh n hm i( s i z e _ t ,v o i d*L c ){ t r l iL c ; } } ; i n tm a i n( ){ i n tl[ 1 0 ] ; c o u t< <" l= "< <l< <e n d l ; X*x p=n e w( l ) X( 4 7 ) ;//Xt i a i ml x p >X: :~X( ) ;//r r n gh yc u cg i //c h s d n gv iv t r ! }/// :~

D i yl m t v d c h ot h yl mt h n ob nc t h t m t i t n gt i m t a i mc t h :

C h r n g i uh n hmi c h t r v c o nt r l t r u y nc h on . D o , n g i g i q u y t n hn i i t n gn y s p h i n g i , v c c n h x yd n g c g i l c h or n gb n h n h l m t p h nc a t h h i nm i . M c d v d n yc h ot h yc h c m t i s b s u n g , k h n gc g n g nc nb nt h mn h i uh nn ub nc n c h n gc h oc c m c c hk h c l . M t t n ht r n gk h x x yr a k h i b nmu n t i ud i t c c i t n g . C h c m t p h i nb nc a t o nt d e l e t e ,
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 230/320

08/10/2013

Suy ngh trong C + +, Vol 1

v v yk h n gc c c hn o n i , " S d n gd e a l l o c a t o r c b i t c a m n hc h o i t n gn y . " B nmu ng i d e s t r u c t o r , n h n gb nk h n gmu nb n h s c p h t h n hb i c c c c h b n h n gb i v n k h n g c c pp h t t r nh e a p . C ut r l i l m t c p h pr t c b i t . B nr r n gc t h g i d e s t r u c t o r , n h t r o n gx p >X: :~X( ) ;


g id e s t r u c t o r//r r n g

M t c n hb on g h i mk h c l y . M t s n g i t h y i un yn h l m t c c h t i ud i t i t n gt i m t s t h i g i a nt r c k h i k t t h c p h mv i , c h k h n gp h i l m t t r o n gh a i i uc h n hp h mv i h o c ( c h n hx c h n ) s d n g i t n gs n gt on n g n gn uh mu nc u c i c a i t n g c x c n ht i t h i g i a nc h y . B ns c v n n g h i mt r n gn ub ng i d e s t r u c t o r c c hn yc h om t i t n gt h n gt h n gt or a t r ns t a c k v d e s t r u c t o r s c g i t r l i v oc u i c a p h mv i . N ub ng i d e s t r u c t o r c c hn yc h om t i t n g c t or a t r nh e a p , d e s t r u c t o r s t h c h i n , n h n gb n h s k h n g c p h t h n h , m c l k h n gp h i l n h n gg b nmu n . L d od u yn h t l h yc t h c g i m t c c hr r n gt h e oc c hn yl h t r c c c p h pc h ov t r i uh n hmi . Ng o i r a c nc m t v t r i uh n hx a m c h c g i l n um t n h x yd n gc h om t v t r mi b i uh i n n m m t n g o i l ( b n h c t n gl ms c ht r o n gt r n gh pn g o i l ) . C c v t r i uh n hx a c m t d a n hs c h i s t n g n gv i v t r i uh n hmi c g i l t r c k h i x yd n gn mn g o i l . C h n ys c k h mp h t r o n gx l n g o i l t r o n gc h n gK h i l n g2 .

T mt t

l t h u nt i nv t i uh i uq u t oc c i t n gt n gt r nc c n g nx p , n h n g g i i q u y t v n l pt r n hn i c h u n gb np h i c k h n n gt or a v t i ud i t i t n gb t k l c n ot r o n gq u t r n ht h c h i n c a c h n gt r n h , c b i t l p n gv i t h n gt i nt b nn g o i c h n gt r n h . M c d c pp h t b n h c a C n n g n gs c l ut r t n g , n k h n gc u n gc pd s d n gv x yd n g mb oc nt h i t t r o n gC++ . B n gc c h a i t n gs n gt on n g n gv oc t l i c a n g nn g v i mi v x a , b nc t h t oc c i t n gt r nh e a pn h d d n gn h l mc h oc h n gv on g nx p . Ng o i r a , b nn h n c r t n h i ut n hl i n h h o t . B nc t h t h a y i h n hv i mi v x a n uh k h n gp h h pv i n h uc uc a b n , c b i t n uh k h n g h i uq u . Ng o i r a , b nc t h s a i n h n gg s x yr a k h i n gh t d u n gl n gl ut r .

B i t p
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

14.

T om t l pT n hc c h a m t i n t i dv m t i n t t n hq u c . C c n h x yd n gm c n hs b t u : t T n h( ) : i d( t n h++ ) . Nc n gn ni nc a n { i dv r n gn c t or a . D e s t r u c t o r n ni nr n gn b p h h yv n i d. K i mt r a l ph c c a b n . C h n gmi n hc h om n hr n gmi v x a l u nl u ng i c c n h x yd n gv h mh yb n gc c ht or a m t i t n gc a l pT n h( t t p1 ) v i mi v p h h yn v i x a . C n gt or a v p h h ym t m n gc a c c i t n gt r nh e a p . T om t P S t a s h i t n gv t m un b n gmi i t n gt t p1 . Qu a ns t n h n gg s x yr a k h i n yP S t a s h i t n g i r a k h i p h mv i v d e s t r u c t o r c a n c g i l . T om t v e c t o r < T n h* >v i nn v i c o nt r nT n hmi i t n g( t t p1 ) . D i c h u y nq u a c c v e c t o r v i nT n h i t n g , s a u d i c h u y nq u a m t l nn a v x a m i m t . L pl i b i t p4 , n h n gt h m m t c h c n n gt h n hv i nf ( ) T n h i nm t t h n gb o . D i c h u y n q u a c c v e c t o r v g i f ( ) c h ot n g i t n g . L pl i b i t p5 s d n gm t P S t a s h. L pl i b i t p5 s d n gS t a c k 4 . ht C h n g9 . T n gt om t m n gc c i t n gc a l pT n h( t t p1 ) . G i x a c h oc o nt r x u t h i n , k h n g c d un g o c v u n g . G i i t h c hk t q u . T om t i t n gc a l pT n h( t t p1 ) s d n gmi , b c o nt r nm t k t q u v o i d* , v x a . G i i t h c hk t q u . T h c h i nNe wHa n d l e r . c p pt r nm yt n hc a b n x e ms k t q u . T n ht o ns l n gc a h n g mi np h c s nc h oc h n gt r n hc a b n . T om t l ph c v i m t n h i uh n hq u t i mi v x a , c h a i p h i nb nm t i t n gv c c p h i nb nm n g . C h n gmi n hr n gc h a i p h i nb nl mv i c . Ng h r a m t t h n g h i mc h oF r a mi s . c p p c h om n hk h o n gb a on h i un h a n hh nc c t yc h n hmi v x a c h yh ns ov i t o nc umi v x a . S a i No Me mo r y . c p p n c c h a m t m n gc a i n t v n t h c s c pp h t b n h t h a yv n mb a d _ a l l o c . T r o n gma i n( ) , t h i t l pm t t r o n gk h i v n gl pn h m t t r o n gNe wHa n d l e r . c p p c h yr a k h i b n h v x e mn h n gg s x yr a n ub n i uh n hmi k h n gk i mt r a x e mn u b n h c p h nb t h n hc n g . S a u t h mc c k i mt r a b n i uh n hmi v n mb a d _ a l l o c . T om t l ph c v i m t v t r mi v i m t i s t h h a i c k i uc h u i . C c l pc nc m t < s t r i n g >
231/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

15.

v e c t o r t n hn i t h h a i mi t r a n hl u n c l ut r . C c v t r mi n np h nb l ut r n h b n h t h n g . T r o n gma i n( ) , t h c h i nc u c g i nv t r c a b nmi v i c h u i l pl u nr n gmt c c c u c g i ( b nc t h mu ns d n gc a t i nx l _ _ F I L E _ _ v _ _ L I NE _ _ ma c r o ) . S a i A r r a y Op e r a t o r Ne w. c p pb n gc c ht h m m t < Wi d g e t * >v e c t o r t n hc h ob i t t h mr n gm i Wi d g e t a c h c c pp h t t r o n g i uh n hmi v l o i b n k h i n c p h t h n ht h n gq u a n h i uh n hx a . ( B nc t h c np h i t mk i mt h n gt i nv v e c t o r t r o n gt i uc h u nC++t i t h l l i ut h v i nc a b nh o c t r o n g2 n gc a c u ns c hn y , c s nt i t r a n gwe b . ) T om t l pt h h a i c g i l Me mo r y C h e c k e r c m t d e s t r u c t o r i nr as Wi d g e t c o nt r c a b nt r o n gv e c t o r . T or a m t c h n gt r n hv i m t t r n gh pt o nc ud u yn h t c a Me mo r y C h e c k e r v t r o n gma i n( ) , t n g p h nb v t i ud i t m t s i t n gv c c m n gc a Wi d g e t . C h ot h yMe mo r y C h e c k e r c h ot h y r r b n h .

l c c ht i pc nC , v n k h n gl mv i c r t t t . Nh v i h uh t t t c m i t h t r o n gC++ , c c g i i p h px o a yq u a n hl p . B ns d n gl i m b n gc c ht or a c c l ph c m i , n h n gt h a yv t or a c h n gt u , b ns d n gc c l ph c h i nc m n g i k h c c x yd n gv s a l i . B q u y t l s d n gc c l pm k h n gl mb nm h i nc . T r o n gc h n gn y , b ns t h yh a i c c h t h c h i n i un y . ut i nl k h ng i n : B nc h c nt o i t n gc a l ph i nt i c a b nb nt r o n gl pm i . i un y c g i l t h n h p h nv l pm i b a og mc c i t n gc a c c l ph c h i nc . P h n gp h pt h h a i l t i n hv i h n . B nt om t l pm i n h m t l o i m t l ph c h i nc . B nc n g h a l ma n gh n ht h c c a c c l ph c h i nc v t h m m v on , m k h n gs a i c c l ph c h i nc . H n h n g ma t h u t n y c g i l t h a k , v h uh t c n gv i c c t h c h i nb i t r n hb i nd c h . T h a k l m t t r o n g n h n gn nt n gc a l pt r n hh n g i t n gv c n g h a b s u n gm s c k h mp h t r o n gC h n g1 5 . Nc h r a r n gp h nl nc c c p h pv c c h n hv i t n gt c h oc h a i t h n hp h nv t h a k ( c n g h a , h l c h a i c c hl mc h oc c l o i m i t c c l o i h i nc ) . T r o n gc h n gn y , b ns t mh i uv c c c c h t i s d n gm .

C p h pt h n hp h n

T r nt h c t , b n s d n gt h n hp h nt t c c n g t or a c c l ph c . B nv a c s n gt c c c l ph c c h y uv i c c l o i t c hh p( v i k h i c h u i s ) . Nh a r a l g nn h l d d n g s d n gt h n hp h nv i c c l o i n g i d n g n hn g h a . X e mx t m t l ph c m r t c g i t r i v i m t s l d o :

// :C 1 4 :U s e f u l . h //M tl ph c t is d n g #I f n d e fU S E F U L _ H #X c n hU S E F U L _ H c l a s sX{ i n ti ;c n g : X( ){ i=0 ; } t r n gt h i tl p( i n ti i ){ i= i i ; } i n tr e a d( )c o n s t{ r e t u r ni ; } i n th o nv ( ){ r e t u r ni=i*4 7; } } ; #E n d i f//U S E F U L _ H/// :~

C c t h n hv i nd l i ur i n gt t r o n gl pn y , v v yn h o nt o na nt o n n h n gm t i t n gc a l o i X n h m t c n g i t n gt r o n gm t l ph c m i , m l mc h og i a od i n ng i n :
// :C 1 4 :C o m p o s i t i o n . c p p //S d n gl im v it h n hp h n #B a og m" U s e f u l . h " l pY{ i n ti ;c n gc n g : Xx ;//n h n g it n g Y( ){ i=0 ; } v o i df( i n ti i ){ i=i i ; } i n tg( )c o n s t{ r e t u r ni ; } } ; i n tm a i n( ){ Yy ; y f( 4 7 ) ; y x s e t( 3 7 ) ;//T r u yc pc c it n gn h n g }/// :~
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 232/320

08/10/2013

Suy ngh trong C + +, Vol 1

T r u yc pv oc c c h c n n gt h n hv i nc a i t n g( g i t t l m t s u b o b j e c t ) c h ng i nl y uc uk h c l a c h nt h n hv i n . Np h b i nh n l mc h oc c i t n gn h n gt i n, h t r t h n hm t p h nc a v i c t h c h i nc b n( c n g h a l b nc t h t h a y i t h c h i nn ub nmu n ) . C c c n gc h c n n gg i a od i nc h ol pm i c a b ns a u l i nq u a n nv i c s d n gc a i t n g , n h n gh k h n gn h t t h i t p h i b t c h c g i a od i nc a i t n g :

// :C 1 4 :C o m p o s i t i o n 2 . c p p // it n gn h n gc n h n #B a og m" U s e f u l . h " l pY{ i n ti ; Xx ;//n h n g it n gc n gc h n g : Y( ){ i=0 ; } v o i df( i n ti i ){ i=i i ; x . s e t( i i ) ; } i n tg( )c o n s t{ r e t u r ni*x . r e a d() ; } k h o n gt r n gh o nv ( ){ x . p e r m u t e( ) ; } } ; i n tm a i n( ){ Yy ; y f( 4 7 ) ; y . p e r m u t e( ) ; }/// :~

y , h o nv ( ) c h c n n g c t h c h i nt h n gq u a c c g i a od i nl ph c m i , n h n gc c h mt h n hv i n k h c c a X c s d n gt r o n gc c t h n hv i nc a Y.

C p h pt h ak
C p h pc h oc c t h n hp h nl h i nn h i n , n h n g t h c h i nt h a k c m t h n ht h c m i v k h c n h a u . K h i b nt h a h n g , b n a n gn i , " l pm i n yl n h t h l pc . " n gt u y nb i un yt r o n gm b n g c c h a r a t nc a l pn h t h n gl , n h n gt r c k h i c pm m nc a c t h l p , b n t m t d uh a i c h mv t nc a l p c s ( h o c c s l p h c , c c hn h a ub n gd up h y , c h o a k t h a ) . K h i b nl m i u n y , b ns t n gn h n c t t c c c t h n hv i nd l i uv h mt h n hv i nt r o n gl pc s . yl m t v d :
// :C 1 4 :I n h e r i t a n c e . c p p // ng i nt h ak #B a og m" U s e f u l . h " #I n c l u d e s d n gt nm i nk h n gg i a nt i uc h u n ; l pY :c n gX{ i n ti ;//K h cv it ic n gX : Y( ){ i=0 ; } i n tt h a y i( ){ i=h o nv ( ) ;g it n//k h cn h a u t r l it i ; } t r n gt h i tl p( i n ti i ){ i=i i ; X: :s e t( i i ) ;//C n gt nc h cn n gc u cg i } } ; i n tm a i n( ){ c o u t< <" s i z e o f( X )= "< <s i z e o f( X )< <e n d l ; c o u t< <" s i z e o f ( Y )= " < <s i z e o f( Y )< <e n d l ; Y D ; D . c h a n g e( ) ; //Xg i a od i nc h cn n g iq u a : D . r e a d( ) ; D . p e r m u t e( ) ; // n hn g h al ic h cn n g nc cp h i nb nc s : D . s e t( 1 2 ) ; }/// :~

B nc t h t h yY c t h a h n gt X, c n g h a l Ys c h a t t c c c y ut d l i uXv t t c c c c h c n n gt h n hv i nt r o n gX. T r o n gt h c t , Yc c h a m t s u b o b j e c t c a Xg i n gn h k h i b n t or a m t i t n gt h n hv i nc a Xt r o n gYt h a yv k t h a t X. C h a i i t n gt h n hv i nv l ut r l pc s c g i l s u b o b j e c t s . T t c c c t i ny ut c a Xv nt i nt r o n gY, l c h v Yk t h a t Xk h n gc n g h a l Yc t h p h v c c h b ov . C c t i nc c y ut c a Xv nc n , c h n gc h i mk h n gg i a nb nc h c t h t r u yc pt r c t i p . T r o n gma i n( ) b nc t h t h yr n gYl y ut d l i u c k t h pv i Xl b i v s i z e o f ( Y ) l h a i l nl nn h s i z e o f ( X ) . B ns n h nt h yr n gc c l pc s l t r c b i c n g. T r o n gk h i t h a k , m c n ht t c m i t h t i n. N u l pc s c k h n gp h i d oc n gc h n g, n s c n g h a l t t c c c c n gc c t h n hv i nc a l pc s s l [ 4 8 ] t i nt r o n gl pc n g u ng c . i un yg nn h k h n gb a og i n h n gg b nmu n ; k t q u mo n gmu nl


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 233/320

08/10/2013

Suy ngh trong C + +, Vol 1

g i c h ot t c c c c n gc c t h n hv i nc a l pc s c n gc n gt r o n gc c l pd nx u t . B nl m i un y b n gc c hs d n gc c c n gt k h a t r o n gk t h a . T r o n gt h a y i ( ) , c c l pc s h o nv ( ) c g i . L p c t h a k c q u y nt r u yc pt r c t i p nt t c c c c n gc h c n n gc s n gc p . C c t h i t l p( ) c h c n n gt r o n gc c l pd nx u t n h n g h a l i c c t h i t l p( ) c h c n n gt r o n gl pc s . C n g h a l , n ub ng i c h c n n g c ( ) v h o nv ( ) c h om t i t n gk i uY, b ns n h n c c c p h i nb n c s n gc pc a n h n gc h c n n g( b nc t h t h y i un yx yr a b nt r o n gc h n h( ) ) . Nh n gn ub ng i s e t ( ) c h om t Y i t n g , b ns c c p h i nb n n hn g h a l i . i un yc n g h a r n gn ub nk h n g t h c hc c p h i nb nc a m t c h c n n gb nn h n c t r o n gq u t r n ht h a k , b nc t h t h a y i n h n gg n l m. ( B nc n gc t h t h mc c c h c n n gm i h o nt o nn h t h a y i ( ) . ) T u yn h i n , k h i b n a n gx c n hl i c h c n n g , b nc t h v nmu ng i p h i nb nl pc s . N u , t r o n gs e t ( ) , b nc h c ng i s e t ( ) b ns n h n c p h i nb n a p h n gc a h mm t c h c n n gg i q u y . g i c c p h i nb nc s c p , b np h i t t nm t c c hr r n gc c l pc s s d n gc c n h i uh n hc p h ng i i p h mv i .

Da n hs c hk h i t ox yd n g

B n n h nt h yt mq u a nt r n gc a n l t r o n gC++ mb ok h i t ot h c hh p , v n k h n gk h c n h a u t r o n gt h n hp h nv t h a k . K h i m t i t n g c t or a , t r n hb i nd c h mb or n gn h x yd n gc h ot t c c c s u b o b j e c t s c a n c g i l . T r o n gc c v d c h o nn a y , t t c c c s u b o b j e c t s c n h x yd n gm c n h , v l n h n gg c c t r n hb i nd c ht n gg i . Nh n gn h n gg s x yr a n us u b o b j e c t s c a b nk h n g c n h t h um c n h , h o c n ub nmu nt h a y i m t i s m c n ht r o n gm t n h x yd n g ? yl m t v n b i v c c n h x yd n gl ph c m i k h n gc q u y nt r u yc pv ot i ny ut d l i uc a s u b o b j e c t , v v y n k h n gt h k h i t ot r c t i p . G i i p h pr t ng i n : H yg i c c n h x yd n gc h oc c s u b o b j e c t . C++c u n gc pm t c p h p c b i t c h o i un y , d a n h s c h k h i t o x y d n g . D i h n ht h c d a n hs c hk h i t ox yd n gv n gl i h n h n gc a t h a k . V i d i s n , b n t c c l pc s s a ud uh a i c h mv d un g o c m t r c c a c t h l p . T r o n gd a n h s c hk h i t ox yd n g , b n t c c c u c g i nx yd n gs u b o b j e c t s a uk h i d a n hs c h i s n h x yd n g v d uh a i c h m, n h n gt r c k h i c pm m nc a c q u a nc h c n n g . C h om t l ph c My T y p e , t h a h n gt B a r , i un yc t h t r n gn h t h n y :

M y T y p e: :M y T y p e( i n ti ) :B a r( i ){ //. . .

n uB a r c m t n h x yd n gm p h i m t m t ni n t l u n .

T h n hv i n i t n gk h i t o
Nc h r a r n gb ns d n gr t g i n gc p h pn yc h ot h n hv i n i t n gk h i t ok h i s d n gt h n hp h n . C h oc c t h n hp h n , b nc h ot nc a c c i t n gt h a yv c c t nl p . N ub nc n h i uh nm t c u c g i x y d n gt r o n gd a n hs c hk h i t o , b nt c hb i t c c c u c g i b n gd up h y :
M y T y p e 2: :M y T y p e 2( i n ti ) :B a r( i ) ,m( i+ 1 ){ //. . .

L o i t c hh pt r o n gd a n hs c hk h i t o

yl s k h i uc a m t n h x yd n gc h ol pMy T y p e 2 , c t h a k t B a r v c h a m t i t n gt h n h v i nm i l m. L ur n gt r o n gk h i b nc t h x e mc c l o i c a l pc s t r o n gd a n hs c hk h i t ox yd n g , b nc h n h nt h yc c n hd a n h i t n gt h n hv i n . D a n hs c hk h i t ox yd n gc h op h pb ng i m t c c hr r n gc c n h x yd n gc h oc c i t n gt h n h v i n . T r o n gt h c t , k h n gc c c hn ok h c g i n h n gn h x yd n g . t n gl c c n h t h u c k ug i t r c k h i b nn h n c v oc t h c a x yd n gl ph c m i . B n gc c h , b t k c u c g i b nt h c h i nc h c n n gt h n hv i nc a s u b o b j e c t s s l u nl u n i nc c i t n g c k h i t o . K h n gc c c hn o c c c pm m nc a c c n h x yd n gm k h n gc m t s n h x yd n g c g i l c h ot t c c c i t n gt h n hv i nv c c i t n gl pc s , n g a yc k h i t r n hb i nd c hp h i t h c h i nc u c g i n m t c o n s t r u c t o r m c n h . yl m t t n gc n gh nn a c a C++ mb or n gk h n gc i t n g( h o c m t p h nc a m t i t n g ) c t h c r a k h i c a b t um k h n gc c o n s t r u c t o r c a n c g i . t n gr n gt t c c c i t n gt h n hv i n c k h i t ob i t h i g i a nn pm c c n h x yd n g t c l m t t r g i pl pt r n ht h u nt i nl t t . M t k h i b nn h n pm , b nc t h g i n ht t c s u b o b j e c t s c k h i n g n gc c hv t pt r u n gv on h i mv c t h m b nmu n t c t r o n gc c n h x yd n g . T u y n h i n , c m t v n gm c : i ug v c c i t n gt h n hv i nc a c c l o i t c hh ps n , m l mk h n g c n h x yd n g ? t h c h i nc c c p h pp h h p , b n c p h p i ut r c x yd n gt r o n gc c l o i n h n uh c m t n h x yd n gd u yn h t , t r o n g c m t i s d u yn h t : m t b i nc a c c l o i g i n gn h c c b i nb nk h i t o . V v y , b nc t h n i

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

234/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 1 4 :P s e u d o C o n s t r u c t o r . c p pc l a s sX{ i n ti ; c h a rc ; c h a r*s ;c n gc n g : X( ) :i( 7 ) ,f( 1 . 4 ) ,c( ' x ' ) ,s( " h o w d y " ){ } } ; i n tm a i n( ){ xx ; i n ti( 1 0 0 ) ; // p d n gc h o n hn g h at h n gt h n g i n t*i p=n e w i n t( 4 7 ) ; }/// :~

f l o a tf ;

C c h n h n gc a n h n g" c u c g i g i x yd n g " l t h c h i nm t n h i mv ng i n . l m t k t h u t t h u nt i nv m t p h o n gc c hm h a t t , v v yb ns t h yn t h n g c s d n g . Nt h mc h c nc t h s d n gc p h pg i x yd n gk h i t or a m t b i nc a m t b u i l t i nl o i b nn g o i c a m t l p :
i n ti( 1 0 0 ) ;i n t*i p=n e wi n t( 4 7 ) ;

i un yl mc h ox yd n gt r o n gc c l o i h o t n gh nm t c h t n h c c i t n g . H yn h r n g , m c d , r n g yk h n gp h i l x yd n gt h c t . c b i t , n ub nk h n gr r n gt h c h i nc u c g i g i x yd n g , k h n gk h i t o c t h c h i n .

K t h pc ct h n hp h n& t h ak
// :C 1 4 :C o m b i n e d . c p p //T h ak v t h n hp h n c l a s sA{ i n ti ;c n gc n g : A( i n ti i ) :i( i i ){ } ~A( ){ } v o i df( )c o n s t{ } } ; c l a s sB{ i n ti ;c n gc n g : B( i n ti i ) :i( i i ){ }

T t n h i n , b nc t h s d n gt h n hp h n&t h a k v i n h a u . V d s a u yc h ot h yv i c t or a m t l pp h c t ph ns d n gc h a i .

~B( ){ } v o i df( )c o n s t{ } } ; l pC :p u b l i cB{ Aa ;c n gc n g : C( i n ti i ) :B( i i ) ,m t( i i ){ } ~C( ){ }//c u cg i~A( )v ~B( ) v o i df( )c o n s t{ //R e d e f i n i t i o n a f( ) ; B: :f( ) ; } } ; i n tm a i n( ){ Cc( 4 7 ) ; }/// :~

Ct h a k t Bv c m t i t n gt h n hv i n( " b a og m" ) c a l o i mt . B nc t h x e md a n hs c hk h i t ox yd n g c h a c c c u c g i c h oc x yd n gc s h n gn h t v c c n h x yd n gt h n hv i n i t n g . C h c n n gC: : f ( ) n hn g h a l i B: : f ( ) , m n c t h a h n g , v c n gk ug i c c p h i nb nc s n gc p . Ng o i r a , n g i a f ( ) . Nh nt h yr n gt h i g i a nd u yn h t b nc t h n i v x c n hl i c h c n n gl t r o n gk h i t h a k , v i m t i t n gt h n hv i n , b nc h c t h t h a ot c g i a od i nc n gc n gc a i t n g , k h n gx c n hl i n . Ng o i r a , g i f ( ) c h om t i t n gc a l pCs k h n gg i a f ( ) n uC: : f ( ) k h n g c x c n h , t r o n gk h i n s g i B: : f ( ) . C u cg i d e s t r u c t o rt n g M c d b nt h n g c y uc u t h c h i nc u c g i x yd n gr r n gt r o n gd a n hs c hk h i t o , b nk h n gb a o g i c np h i t h c h i nh yt n gmi n hb i v c h c m t d e s t r u c t o r c h ol pn o , v n k h n gc b t k i s . T u y n h i n , t r n hb i nd c hv n mb or n gt t c c c h mh y c g i l , v c n g h a l t t c c c h mh yt r o n g t o nb h t h n gp h nc p , b t uv i m t h u h uh t c n g u ng c t v l mv i c t r l i v ot h m c g c . Nc g i t r n h nm n hr n gx yd n gv h mh yl k h b t t h n g c h m i n g i t r o n gh t h n gp h nc p c g i l , t r o n gk h i v i m t h mt h n hv i nb n ht h n gc h c c h c n n g c g i l , n h n gk h n gp h i b t k c c p h i nb nc s n gc p . N ub nc n gmu ng i c h op h i nb nc s n gc pc a m t h mt h n hv i nb n h t h n gm b n a n gt r n g , b np h i l m i u m t c c hr r n g .

T r n ht x yd n gv h yc u cg i
T h t t h v k h i b i t t h t c a n h x yd n gv h yc u c g i k h i m t i t n gc n h i us u b o b j e c t s . V d s a u y c h ot h yc h n hx c c c ht h c h o t n g :
// :C 1 4 :O r d e r . c p p
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 235/320

08/10/2013

Suy ngh trong C + +, Vol 1

//C o n s t r u c t o r/h yl n h #B a og m< f s t r e a m >s d n gt nm i nk h n gg i a nt i uc h u n ;o f s t r e a m r a( " o r d e r . o u t " ) ; #X c n hC L A S S( I D ) n gc pI D{ \c n gc n g :\ I D( i n t ){ r a< <#I D" x yd n g\n " ; }\ ~I D( ){ r a< <#I D" h y\n " ; }\ } ; C L A S S( B a s e 1 ) ; C L A S S( m e m b e r 1 ) ; C L A S S( M e m b e r 2 ) ; C L A S S( M e m b e r 3 ) ; C L A S S( M e m b e r 4 ) ; l pD e r i v e d 1 :B a s e 1c n g{ M e m b e r 1m 1 ; M e m b e r 2m 2 ,c n gc h n g : D e r i v e d 1( i n t ) :m 2( 1 ) ,M 1( 2 ) ,B a s e 1( 3 ){ } ~D e r i v e d 1( ){ r a< <" D e r i v e d 1h y\n " ; } } ;

r a< <" D e r i v e d 1x yd n g\n " ;

l pD e r i v e d 2 :c n gD e r i v e d 1{ M e m b e r 3m 3 ; M e m b e r 4M 4 ,c n gc h n g : D e r i v e d 2( ) :m 3( 1 ) ,D e r i v e d 1( 2 ) ,M 4( 3 ){ r a< <" D e r i v e d 2x yd n g\n " ; } ~D e r i v e d 2( ){ r a< <" D e r i v e d 2h y\n " ; } } ; i n tm a i n( ){ D e r i v e d 2d 2 ; }/// :~

ut i n , m t o f s t r e a m i t n g c t or a g i t t c c c ur a v om t t pt i n . S a u , t i t k i m m t s n hm yv c h n gmi n hm t k t h u t v ms c t h a yt h b i m t k t h u t c c i t h i nn h i ut r o n gC h n g1 6 , m t v m c t or a x yd n gm t s l ph c , s a u c s d n gt r o n gt h a k v t h n hp h n . M i c o n s t r u c t o r v d e s t r u c t o r b ov i t pt i nd uv t . L ur n gc c n h x yd n gk h n gp h i l n h x yd n gm c n h , h t n gc m t i n t l u n . L pl u nc h n hn k h n gc n hd a n h ; l d od u yn h t c h os t nt i c a n l b u c b np h i g i m t c c hr r n gc c n h t h ut r o n gd a n hs c hk h i t o . ( L o i b c c n hn g nc h nt i nn h nc n hb o t r n hb i nd c h . ) ur a c a c h n gt r n hn yl
B a s e 1x yd n g M e m b e r 1x yd n g M e m b e r 2x yd n g D e r i v e d 1x yd n g M e m b e r 3x yd n g M e m b e r 4x yd n g D e r i v e d 2x yd n g D e r i v e d 2h y M e m b e r 4h y M e m b e r 3h y D e r i v e d 1h y M e m b e r 2h y M e m b e r 1h y B a s e 1h y

B nc t h t h yr n gx yd n gb t ut g c r c a h t h n gp h nc pl p , v m i c pc c n h x yd n gl pc s c g i l ut i n , t i pt h e ol x yd n g i t n gt h n hv i n . C c h mh y c g i l c h n hx c t r o n gt h t on g c c a c c n h t h u i un yl q u a nt r n gv p h t h u c t i mn n g( t r o n gc c n h x yd n gc n g u ng c t l ph o c h y , b np h i c k h n n gg i n hr n gs u b o b j e c t b a s e c l a s s v nc s n s d n g , v c x yd n gh o c k h n gb p h h yn o ) .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 236/320

08/10/2013

Suy ngh trong C + +, Vol 1

Nc n gt h v m t h t c a c c c u c g i x yd n gc h oc c i t n gt h n hv i nl h o nt o nk h n gb n h h n gb i t h t c a c c c u c g i t r o n gd a n hs c hk h i t ox yd n g . T h t c x c n hb i t h t m c c i t n gt h n hv i n c k h a i b ot r o n gl p . N ub nc t h t h a y i t h t c a c c c u c g i x yd n gt h n gq u a d a n hs c hk h i t ox yd n g , b nc t h c h a i t r n ht g i k h c n h a ut r o n gh a i n h t h uk h c n h a u , n h n gc c d e s t r u c t o r n g h os k h n gb i t l mt h n o n gc c h on g c t h t c a c c c u c g i t i uh y , v b n c t h k t t h c v i m t v n p h t h u c .

T n n

N ub nt h a h n gm t l ph c v c u n gc pm t n hn g h a m i c h om t t r o n gn h n gc h c n n gt h n hv i n c a n , c h a i k h n n g . ut i nl b nc u n gc pc h k c h n hx c v k i ut r v t r o n g n hn g h a l pd nx u t n h t r o n g n hn g h a l pc s . i un y c g i l x c n h l i c h c n n gc h ot h n hv i nt h n gt h n gv t r n g k h i c h c n n gt h n hv i nl pc s l m t oc h c n n g( oc h c n n gl n h n gt r n gh pb n ht h n g , v s c t r n hb yc h i t i t t r o n gc h n g1 5 ) . Nh n gn h n gg s x yr a n ub nt h a y i c c t h n hv i nd a n h s c h i s c h c n n gh o c k i ut r v t r o n gl pb t n g u n ? yl m t v d :

// :C 1 4 :N a m e H i d i n g . c p p // nt nq u t it r o n gq u t r n ht h ak #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; c l a s sB a s e{ p u b l i c : i n tf( )c o n s t{ c o u t< <" B a s e: :f( )\n " ; t r l i1 ; } i n tf ( s t r i n g )c o n s t{ r e t u r n1 ; } t r n gg( ){ } } ; l pD e r i v e d 1 :p u b l i cB a s e{ c n gc n g : k h o n gt r n gg( )c o n s t{ } } ; l pD e r i v e d 2 :c n gk h a ic s { p u b l i c : //R e d e f i n i t i o n : i n tf( )c o n s t{ c o u t< <" D e r i v e d 2: :f( )\n " ; t r l i2 ; } } ; l pD e r i v e d 3 :p u b l i cB a s e{ c n gc n g : //T h a y ik i ut r v : v o i df( )c o n s t{ c o u t< <" D e r i v e d 3: :f( )\n " ; } } ; l pD e r i v e d 4 :p u b l i cB a s e{ c n gc n g : //T h a y id a n hs c h is : i n tf( i n t )c o n s t{ c o u t< <" D e r i v e d 4: :f ( )\n " ; t r l i4 ; } } ; i n tm a i n( ){ s t r i n gs( " h e l l o " ) ; D e r i v e d 1d 1 ; i n tx=d 1 . f ( ) ; d 1 . f( s ) ; D e r i v e d 2d 2 ; x=d 2 . f( ) ; // ! d 2 . f( s ) ,p h i nb n//c h u i n D e r i v e d 3D 3 ; // ! x=d 3 . f( ) ;//r e t u r ni n tp h i nb n n D e r i v e d 4d 4 ; !// x=d 4 . f( ) ;//f( )p h i nb n n x=d 4 . f( 1 ) ; }/// :~

T r o n gc s b nt h ym t c h c n n gq u t i f ( ) , v De r i v e d 1 k h n gt h c h i nb t k t h a y i f ( ) n h n gn k h n g x c n hl i g( ) . T r o n gma i n( ) , b nc t h t h yr n gc h a i p h i nb nq u t i c a f ( ) c s nt r o n gDe r i v e d 1 . T u y n h i n , De r i v e d 2 n hn g h a l i m t p h i nb nq u t i c a f ( ) n h n gk h n gp h i l k h c , v k t q u l h n ht h c q u t i t h h a i l k h n gc . T r o n gDe r i v e d 3 , t h a y i k i ut r v d a c h a i p h i nb nl pc s , v De r i v e d 4 c h ot h y r n gv i c t h a y i d a n hs c h i s c n gg i pg i u i c h a i p h i nb nl pc s . N i c h u n g , c h n gt i c t h n i r n gb t c l c n ob nx c n hl i m t t nc h c n n gq u t i t l pc s , t t c c c p h i nb nk h c c t n g n t r o n gl pm i . T r o n gc h n g1 5 , b ns t h yr n gv i c b s u n gc c ot k h a n hh n g nc h c n n gq u t i h n m t c h t . N ub nt h a y i g i a od i nc a l pc s b n gc c ht h a y i c h k v /h o c k i ut r v c a m t h mt h n hv i nc a l pc s , s a u b n a n gs d n gc c l pt r o n gm t c c hk h c v i t h a k t h n g c d n g h t r . Nk h n g c n g h a l b n a n gl mn s a i , n c h l m c t i uc u i c n gc a t h a k l h t r a h n h , v n ub nt h a y i c h k c h c n n gh o c k i ut r v s a u b n a n gt h c s t h a y i g i a od i nc a l pc s . N u yl n h n gg b n c n hl mt h b n a n gs d n gt h a k c h y u s d n gl i m , v k h n g d u yt r g i a od i nc h u n gc a l pc s ( l m t k h a c n ht h i t y uc a a h n h ) . N i c h u n g , k h i b ns d n gt h a k t h e oc c hn yc n g h a l b n a n gt h a mg i a m t l ph c c m c c hc h u n gv c h u y nn c h o m t c b i t c nm t h n gl , n h n gk h n gp h i l u nl u n , c c o i l l n hv c c a c c t h n hp h n . V d , h yx e mx t c c n g nx pl pt C h n g9 . M t t r o n gn h n gv n v i c c l ph c l b np h i t h c h i n m t d nd i nv i nm i k h i b nl ym t c o nt r t c o n t a i n e r . i un yk h n gc h t n h t , n k h n ga nt o nb nc t h c a s t c o nt r nb t c i ug b nmu n . M t c c ht i pc nc v t t h n c i n h n ut i nl c h u y nc h u n gn g nx pl ps d n gt h a k . D i yl m t v d s d n gl pt C h n g9 :


// :C 1 4 :I n h e r i t S t a c k . c p p
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 237/320

08/10/2013

Suy ngh trong C + +, Vol 1

//C h u y nc cl pS t a c k #B a og m" . . / C 0 9 / S t a c k 4 . h " #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ; l pS t r i n g S t a c k :S t a c k{ p u b l i c : k h o n gt r n g y( s t r i n g*s t r ){ N g nx p: :p u s h( s t r ) ; } c h u i*( )c o n s t{ r e t u r n( c h u i* )s t a c k: :( ) ; } c h u i*p o p( ){ r e t u r n( c h u i* )s t a c k: :p o p( ) ; } ~S t r i n g S t a c k( ){ s t r i n g* u=p o p( ) ; t r o n gk h i ( m in h t ){ x ah n g u ; u=p o p( ) ; } } } ; i n tm a i n( ){ i f s t r e a mt r o n g( " I n h e r i t S t a c k . c p p " ) ; mb o( t r o n g" I n h e r i t S t a c k . c p p " ) ; d n gc h u i ; t e x t l i n e sS t r i n g S t a c k ; t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) t e x t l i n e s . p u s h( c h u im i( d n g )) ; c h u i*s ; !t r o n gk h i( ( s=t e x t l i n e s . p o p( ) )= 0 ){ //K h n gc d i nv i n ! c o u t< <*s< <e n d l ; x as ; } }/// :~

V t t c c c c h c n n gt h n hv i nt r o n gS t a c k 4 . hl i n l i n e s , k h n gc g c np h i c l i nk t . S t r i n g S t a c kc h u y nn g nx p p u s h( ) s c h c h pn h nc h u i c o nt r . T r c y , s t a c ks c h pn h nk h o n gt r n g c o nt r , v v yn g i d n gk h n gc l o i k i mt r a c h c c h nr n gc c c o nt r t h c hh p c a v o . Ng o i r a , c i n h n( ) v p o p( ) b yg i t r l i c h u i c o nt r t h a yv k h o n gt r n gc o nt r , v v yk h n gc d i nv i nl c nt h i t s d n gc o nt r . T h t n g c n h i n , t h ma nt o nl o i k i mt r a n yl mi np h t r o n gp u s h( ) , c i n h n( ) v p o p( ) ! T r n hb i nd c h a n g c a r a l o i t h n gt i nt h m m n s d n gt i t h i g i a nb i nd c h , n h n gc c c h c n n g u c s px p v k h n gc m t h m c t or a . T nt r n nc h i yb i v , c b i t l p u s h( ) c h c n n gc m t c h k k h c n h a u : d a n hs c h i s l k h c n h a u . N ub n c h a i p h i nb nc a p u s h( ) t r o n gc n gm t l p , m c t h c q u t i , n h n gt r o n gt r n gh pn y q u t i l k h n g g c h n gt a mu n , v v ns c h op h pb nv t q u a b t k l o i c o nt r v op u s h( ) n h m t v o i d* . Ma ym nt h a y , C++g i u y( v o i d* ) p h i nb nt r o n gl pc s n gh c a p h i nb nm i c n hn g h a t r o n g l pd nx u t , v d o n c h c h op h pc h n gt a y( ) c h u i c o nt r v oS t r i n g S t a c k. B i v b yg i c h n gt a c t h mb or n gc h n gt a b i t c h n hx c n h n gg l o i c a c c i t n gl t r o n gc c c o n t a i n e r , h yh o t n gc h n hx c v v n q u y ns h u c g i i q u y t h o c t n h t , m t c c ht i pc nv n q u y ns h u . y , n ub n y( ) m t c h u i c o nt r v oS t r i n g S t a c k, s a u ( t h e on g n g h a c a c c S t r i n g S t a c k) b nc n g i q u a q u y ns h uc a c o nt r nS t r i n g S t a c k. N ub nb t ( ) c o nt r , b nk h n gc h c c c o nt r , n h n gb nc n gc c q u y ns h uc a c o nt r . B t k c o nt r c ns t l i t r nS t r i n g S t a c k k h i d e s t r u c t o r c a n c g i s a u c x a b i h y . V v yl l u nl u nc h u i c o nt r v x a t u y n b a n gl mv i c t r nc h u i c o nt r t h a yv k h o n gt r n gc o nt r , s p h h yt h c hh px yr a v t t c m i t h h o t n gc h n hx c . C m t n h c i m: l pn yh o t n gc h c h oc h u i c o nt r . N ub nmu nc m t n g nx pl mv i c v i m t s l o i k h c c a i t n g , b np h i v i t m t p h i nb nm i c a l p n c h h o t n gv i c c l o i m i c a i t n g . i un yn h a n hc h n gt r n nt n h t , v c u i c n g c g i i q u y t s d n gc c m u , n h b ns t h y t r o n gC h n g1 6 . C h n gt a c t h l mc h om t q u a ns t b s u n gv v d n y : n t h a y i g i a od i nc a c c n g nx pt r o n gq u t r n ht h a k . N ug i a od i nl k h c n h a u , s a u m t S t r i n g S t a c kt h c s k h n gp h i l m t n g nx p, v b n s k h n gb a og i c t h s d n gm t c c hc h n hx c m t S t r i n g S t a c kn h m t n g nx p. i un yl mc h ov i c s d n gt h a k v n y , n ub nk h n gt or a m t S t r i n g S t a c k l m t l o i n g nx p, t h t i s a ob nk t h a ? M t p h i nb nt h c hh ph nS t r i n g S t a c ks c h i nt h s a ut r o n gc h n gn y .

C h cn n gk h n gt n g ch n g

K h n gp h i t t c c c c h c n n gs c t n gk t h a t l pc s v ol pd nx u t . D n gv h mh y i p h v i v i c t or a v p h h ym t i t n g , v h c t h b i t p h i l mg v i c c k h a c n hc a i t n gd u yn h t c h ol ph c c b i t c a h , v v yt t c c c n h x yd n gv h mh yt r o n gh t h n gp h nc pd i yc h n g p h i c g i . V v y , x yd n gv h mh yk h n gk t h a v p h i c t or a c b i t c h om i l pd nx u t .
238/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

Ng o i r a , c c n h i uh n h=k h n gk t h a b i v n t h c h i nm t h o t n gx yd n gn h t h n o . l , c h v b nb i t l mt h n o g nt t c c c t h n hv i nc a m t i t n g p h a b nt r i c a =t m t i t n g p h a b n p h i t a yk h n gc n g h a l n h i mv m v ns c c n gn g h a s a uk h i t h a k . T h a yc h ot h a k , c c c h c n n gn y c t n gh pb i t r n hb i nd c hn ub nk h n gt or a c h n gm n h . ( V i n h x yd n g , b nk h n gt h t or a b t k x yd n g c h oc c t r n hb i nd c h t n gh px yd n gm c n hv b ns a o x yd n g . ) n y c mt n g ng nt r o n gc h n g6 . C c n h t h ut n gh ps d n gme mb e r wi s e k h i t ov t n g h p i uh n h=s d n gme mb e r wi s e c h u y nn h n g . D i yl m t v d v c c c h c n n gm c t n gh p b i t r n hb i nd c h :


// :C 1 4 :S y n t h e s i z e d F u n c t i o n s . c p p //C h cn n g ct n gh pb it r n hb i nd c h #I n c l u d eu s i n gn a m e s p a c es t d ; l pb np h mt r c h i{ p u b l i c : B np h mt r c h i( ){ c o u t< <" b np h mt r c h i( )\n " ; } p h mt r c h i( c o n s tb n p h mt r c h i& ){ c o u t< <" b np h mt r c h i( c o n s tb np h mt r c h i& )\n " ; } B np h mt r c h i&o p e r a t o r=( c o n s tb np h mt r c h i& ){ c o u t< <" b np h m t r c h i: :o p e r a t o r=( )\n " ; *t r l in y ; } ~B np h mt r c h i( ){ c o u t< <" ~b np h mt r c h i( )\n " ; } } ; l pg a m e{ B np h mt r c h ig b ;//T h n hp h n c n gc n g : //M c n hb np h mt r c h ix yd n g cg il : T r c h i( ){ c o u t< <" G a m e( )\n " ; } //B np h ig im tc c hr r n gc cp h mt r c h i //S a oc h px yd n gh o cc cn h x yd n gm c n h // ct n gg il t h a yv : T r c h i ( c o n s tG a m e&g ) :g b( g . g b ){ c o u t< <" G a m e( c o n s tG a m e& )\n " ; } T r c h i( i n t ){ c o u t< <" G a m e( i n t )\n " ; } T r c h i&o p e r a t o r=( c o n s tG a m e&g ){ //B np h ig im tc c hr r n gc cp h mt r c h i //c h u y nn h n gn h i uh n hh o c k h n gc h u y nn h n gt i //t tc s x yr ac h og b ! g b=g . g b ; c o u t< <" G a m e: :o p e r a t o r=( )\n " ; *t r l in y ; } l pk h c { }//l pl n gn h a u //k i ut n gc h u y n i : n h i uh n hk h c( )c o n s t{ c o u t< <" G a m e: :n h i uh n hk h c( )\n " ; t r l ik h c( ) ; } ~G a m e( ){ c o u t< <" ~G a m e( )\n " ; } } ; l pT n g :t r c h ic n gc n g{ } ; v o i df( G a m e: :k h c ){ } l pC h e c k e r s :G a m e{ p u b l i c : //M c n hl pc s x yd n g cg il : C h e c k e r s( ){ c o u t< <" a m( )\n " ; } //B np h ig im tc c hr r n gc cl pc s //C o n s t r u c t o rs a oc h ph o cc cn h x yd n gm c n h //s ct n gg il t h a yv : C h e c k e r s( a mc o n s t&c ) :G a m e( c ){ c o u t< <" a m( c o n s t a m&c )\n " ; } C a r &o p e r a t o r=( c o n s t a m&c ){ //B np h ig im tc c hr r n gc cl pc s //P h i nb nc an h i uh n h=( )h o ck h n gc l pc s //C h u y nn h n gs x yr a : T r c h i: :o p e r a t o r=( c ) ; c o u t< <" a m: :o p e r a t o r=( )\n " ; * t r l in y ; } } ; i n tm a i n( ){ D 1c v u a ; //M c n hx yd n g T n gd 2( d 1 )//S a oc h p c o n s t r u c t o r// !T n gD 3( 1 ) ;//L i :k h n gx yd n gi n t d 1=d 2// i uh n ht n gh p= f( D 1 ) ;//L o ic h u y n iI St h ak T r c h i: :k h c i ; // ! d 1= i ;// i uh n h=k h n gt n gh p //C h oc ck i uk h c a mc 1 ,c 2( c 1 ) ; c 1=c 2 ; }/// :~

C c n h t h uv c c n h i uh n h=c h ob np h mt r c h i v t r c h i t h n gb om n h b nc t h n h nt h yk h i h a n g c s d n gb i c c t r n hb i nd c h . Ng o i r a , c c n h i uh n hk h c ( t h c h i nt n g) c h u y n i l o i h n ht m t t r c h i i t n g nm t i t n gc a l pl n gn h a uk h c . L pT n gc h ng i nl c t h a
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 239/320

08/10/2013

Suy ngh trong C + +, Vol 1

h n gt t r c h i v t or a k h n gc h c n n g( x e mc c ht r n hb i nd c hp h n n g ) . H mf ( ) c m t k h c i t n g k i mt r a c c c h c n n gc h u y n i l o i h n ht n g . T r o n gma i n( ) , c c n h x yd n gm c n ht n gh pv c o p y c o n s t r u c t o r c h oc c l ph c c n g u ng c T n g c g i l . C c t r c h i p h i nb nc a c c n h x yd n g c g i l m t p h nc a h t h n gp h nc pc o n s t r u c t o r c a l l . M c d c v n h t h a k , x yd n gm i t h c s t n gh pc a t r n hb i nd c h . Nh b nc t h mo n g i , k h n gx yd n g v i c c i s s c t n gt or a b i v l q u n h i uc h oc c t r n hb i nd c hc t h t r c g i c . C c n h i uh n h=c n g c t n gh pn h m t c h c n n gm i t r o n gT n gs d n gme mb e r wi s e c h u y n n h n g( d o , p h i nb nc s c p c g i l ) b i v c h c n n g k h n gp h i l m t c c hr r n gb n gv nb n t r o n gl pm i . V t t n h i nl h y c t n gt n gh pc a t r n hb i nd c h . V t t c n h n gq u y n hv v i t l i c c c h c n n gc t h x l i t n gs n gt o , n c v h i l l c ut i nm c c n h i uh n hc h u y n i l o i h n ht n g c t h a h n g . Nh n gn k h n gp h i l q u b t h pl n uc mi n gt r o n gt r c h i t h c h i nm t k h c i t n g , n h n gm n hv nc n t r o n gb t c i ug x u t p h t t t r c h i v c c n h i uh n hc h u y n i l o i h n hv nc nh pl ( m c d b nc t h t r o n gt h c t mu n n hn g h a l i n ) . = i uh n h c t n gh pc h g n i t n gc n gl o i . N ub nmu nc h n hm t l o i k h c , b np h i l u nl u n v i t r n gn h i uh n h=m n h . N ub nn h nk h n t r c h i , b ns t h yr n gc o p y c o n s t r u c t o r v p h nc n gc c n h k h a i t h c c c c c u c g i r r n g c c t h n hv i n i t n gs a oc h p x yd n gv p h nc n g i uh n h . B nt h n gs mu nl m i un yb i v n uk h n g , t r o n gt r n gh pc a c o p y c o n s t r u c t o r , c c t h n hv i nx yd n g i t n gm c n hs c s d n g t h a yt h , v t r o n gt r n gh pc a c c n h i uh n hp h nc n g , k h n g p h n t t c s c t h c h i nc h oc c i t n gt h n hv i n ! C u i c n g , h yn h nv o a m, m r r n gv i t r a c c n h x yd n gm c n h , s a oc h p x yd n g , v c c n h k h a i t h c c h u y nn h n g . T r o n gt r n gh pc a c c n h x yd n gm c n h , x yd n gc s n gc pm c n h c t n gg i , v t h n gl n h n gg b nmu n . Nh n g , v yl m t i mq u a nt r n g , n g a ys a uk h i b nq u y t n h g h i c h p x yd n gv p h nc n g i uh n hc a r i n gb n , t r n hb i nd c hg i n hr n gb nb i t n h n gg b n a n gl mv k h n g t n gg i c h oc c p h i nb nc s n gc p , v n k h n gt r o n gc c c h c n n gt n gh p . N ub n mu nc c p h i nb nl pc s c g i l ( v b nt h n gl m) t h b np h i g i m t c c hr r n gc h n gm n h . T r o n g a mc o p y c o n s t r u c t o r , c u c g i n yx u t h i nt r o n gd a n hs c hk h i t ox yd n g :


C h e c k e r s( a mc o n s t&c ) :G a m e( c ){

T r o n g a m i uh n hp h nc n g , c c c u c g i l pc s l d n g ut i nt r o n gc c c q u a nc h c n n g :
T r c h i: :o p e r a t o r=( c ) ;

C c c u c g i n nl m t p h nc a h n ht h c k i n h i nm b ns d n gb t c k h i n ob nc k t h a m t l p .

K t h a , h m t h n hv i nt n ht n hc h cn n gt h n hv i nh n h n gn h v yl k h n g
t n hc h c n n gt h n hv i n : 1. 2. 3. Nc c v oc c l ph c c n g u ng c . N ub nx c n hl i m t t h n hv i nt n h , t t c c c c h c n n gq u t i k h c t r o n gl pc s c n . N ub nt h a y i c h k c a m t h mt r o n gl pc s , t t c c c p h i nb nl pc s v i t nc h c n n g c n i ( i un yt h c s l m t b i nt h c a c c i mt r c ) .

T u yn h i n , t n hh mt h n hv i nk h n gt h l o( m t c h b a op h h o nt o nt r o n gc h n g1 5 ) .

L ac h nt h n hp h ns ov i t h ak

C h a i t h n hp h n , t h a k n i s u b o b j e c t s t r o n gl pm i c a b n . C h a i us d n gd a n hs c hk h i t ox y d n g x yd n gn h n gs u b o b j e c t s . B yg i b nc t h t h i n h n gg l s k h c b i t g i a h a i , v k h i l a c h nm t t r o n gk h c . T h n hp h nt h n g c s d n gk h i b nmu nc c t n hn n gc a m t l ph c h i nb nt r o n gl ph c m i c a b n , n h n gk h n gg i a od i nc a n . C n g h a l , b nn h n gm t i t n g t h c h i nc c t n hn n gc a l p m i c a b n , n h n gn g i s d n gc a l pm i c a b nt h yg i a od i nm b n x c n hh nl g i a od i nt c c l ph c b a n u . l m i un y , b nl mt h e oc c c o n n g i nh n hc a n h n gt i n i t n gc a c c l ph c h i nc t r o n gl ph c m i c a b n .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

240/320

08/10/2013

Suy ngh trong C + +, Vol 1

i k h i , t u yn h i n , n c n g h a c h op h pn g i s d n gl p t r u yc pt r c t i pc c t h n hp h nc a l pm i c a b n , c n g h a l , l mc h oc c i t n gt h n hv i nc n gc n g. C c i t n gt h n hv i ns d n gk i ms o t t r u y c pb nt h n , d o , yl m t i ua nt o n l mv k h i n g i s d n gb i t b n a n gl pr pm t l o t c c b p h n , n l mc h og i a od i nd h i uh n . M t x e l ph c l m t v d i nh n h :
// :C 1 4 :C a r . c p p //T h n hp h nh l pc { p u b l i c : l mm th i ul cb t u( )c o n s t{ } t r n gr e v( )c o n s t{ } t r n gs t o p( )c o n s t{ } } ; l pb n h{ p u b l i c : k h o n gt r n gt n gl n( i n tp s i )c o n s t{ } } ; c l a s sW i n d o w{ p u b l i c : k h o n gt r n gr o l l u p( )c o n s t{ } t r n gr o l l d o w n( )c o n s t{ } } ; l pc a{ p u b l i c : c as W i n d o w ; t r n gm ( )c o n s t{ } v o i dc l o s e( )c o n s t{ } } ; c l a s sC a r{ p u b l i c : n gc n gc ; B n hx eb n hx e[ 4 ] ; C n hc ab nt r i ,b np h i ;//2c a } ; i n tm a i n( ){ x et ; c a r . l e f t . w i n d o w . r o l l u p( ) ; c a r . w h e e l[ 0 ]t n gl n( 7 2 ) ; }/// : .~

B i v c c t h n hp h nc a m t x e l m t p h nc a v i c p h nt c hc c v n ( v k h n gc h ng i nl m t p h nc a t h i t k c b n ) , l mc h oc c t h n hv i nc n gc n gg i ph i ub i t c c l pt r n hv i nc a k h c hh n gv c c hs d n gc c l ph c v y uc um p h c t p t h nc h oc c t c g i c a l p . V i m t c h t s u yn g h , b nc n gs t h yr n gn s l mc h ok h n gc n g h a s o nm t x e s d n gm t " p h n gt i n " i t n gm t c h i c x e k h n gc m t c h i c x e , n l m t c h i c x e . Nh n g c m t m i q u a nh c t h h i nv i t h a k , v m t m i q u a nh c t h h i nv i c c t h n hp h n .

S u b t y p i n g

B yg i g i s b nmu nt or a m t l o i i f s t r e a m i t n g k h n gc h m m t t pt i nm c nt h e od i n h n g t nc a t pt i n . B nc t h s d n gt h n hp h nv n h n gc m t i f s t r e a mv m t c h u i v ol pm i :

// :C 1 4 :F N a m e 1 . c p p //M tf s t r e a mv im tt nt pt i n #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ; l pF N a m e 1{ t pt i ni f s t r e a m ; c h u it nt pt i n ; b o o lt n ,c n gc h n g : F N a m e 1( ) : tt n( s a i ){ } F N a m e 1( c o n s ts t r i n g&f n a m e ) :T nt pt i n( f n a m e ) ,t pt i n( f n a m e . c _ s t r( ) ){ mb o( t pt i n ,t nt p t i n ) ; t n=t r u e ; } t nc h u i( )c o n s t{ r e t u r nt nt pt i n ; } t nv o i d( c o n s ts t r i n g&n e w N a m e ) { i f( t n )t r l i ;//K h n gg h i l n t nt pt i n=n e w N a m e ; t n= t r u e ; } i uh n hi f s t r e a m&( ){ t pt i nt r l i ; } } ; i n tm a i n( ){ F N a m e 1t pt i n( " F N a m e 1 . c p p " ) ; c o u t< <f i l e . n a m e( )< <e n d l ; // L i :c l o s e( )k h n gp h il m tt h n hv i n : !// f i l e . c l o s e( ) ; }/// :~

C m t v n y , t u yn h i n . M t n l c c t h c h i n c h op h pv i c s d n gc c F Na me 1 i t n gb t c n i n om t i f s t r e a m i t n g c s d n gb n gc c hb a og m m t n h i uh n hc h u y n i l o i h n ht n gt F Na me 1 m t i f s t r e a m &. Nh n gt r o n gc h n h , d n gf i l e . c l o s e( ) ; s k h n gb i nd c hb i v l o i c h u y n i t n gc h x yr a t r o n gc c c u c g i c h c n n g , k h n gp h i t r o n gq u t r n h l a c h nt h n hv i n . V v y , p h n gp h pn ys k h n gl mv i c . M t c c ht i pc nt h h a i l t h m n hn g h a c a g n( ) F Na me 1 : v o i dc l o s e( ){ f i l e . c l o s e( ) ; } i un ys l mv i c n uc h c m t v i c h c n n gb nmu nma n gl i t h n gq u a t i f s t r e a ml p . T r o n gt r n gh p b nc h s d n gm t p h nc a l p , v t h n hp h nt h c hh p .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 241/320

08/10/2013

Suy ngh trong C + +, Vol 1

Nh n gn ub nmu nt t c m i t h t r o n gl ph c i q u a ? i un y c g i l s u b t y p i n g b i v b n a n gt h c h i nm t l o i m i t m t l o i h i nc , v b nmu nl o i m i c a b nc c h n hx c c n gm t g i a od i nn h c c l o i h i nc ( c n gv i b t k h mt h n hv i nk h c b nmu nt h m) , v v yb nc t h s d n gn k h pm i n i b n mu ns d n gc c l o i h i nc . yl n i t h a k l i uc nt h i t . B nc t h t h yr n gs u b t y p i n gg i i q u y t v n t r o n gv d t r c h o nh o :


// :C 1 4 :F N a m e 2 . c p p //S u b t y p i n gg i iq u y tv n #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ; l pF N a m e 2 :c n gi f s t r e a m{ c h u it nt pt i n ; b o o lt n ,c n gc h n g : F N a m e 2( ) : tt n( s a i ){ } F N a m e 2( c o n s ts t r i n g&f n a m e ) :I f s t r e a m( f n a m e . c _ s t r( ) ) ,t nt pt i n( f n a m e ){ mb o( *n y ,t nt pt i n ) ; t n=t r u e ; } t nc h u i( )c o n s t{ r e t u r nt nt pt i n ; } t nv o i d( c o n s ts t r i n g&n e w N a m e ) { i f( t n )t r l i ;//K h n gg h i l n t nt pt i n=n e w N a m e ; t n= t r u e ; } } ; i n tm a i n( ){ F N a m e 2t pt i n( " F N a m e 2 . c p p " ) ; mb o( t pt i n ," F N a m e 2 . c p p " ) ; c o u t< < " t n : "< <f i l e . n a m e( )< <e n d l ; s t r i n gs ; g e t l i n e( t pt i n ,s ) ;//N h n gc n g v i cq u ! f i l e . s e e k g( 2 0 0 ,i o s: :e n d ) ; f i l e . c l o s e( ) ; }/// :~

B yg i b t k h mt h n hv i nc s nc h om t i f s t r e a m i t n gc s nc h om t F Na me 2 i t n g . B nc n gc t h t h yr n gc c c h c n n gk h n gt h n hv i nn h g e t l i n e ( ) m mo n g i m t i f s t r e a mc n gc t h l mv i c v i m t F Na me 2 . l b i v m t F Na me 2 l m t l o i i f s t r e a m, n k h n gc h ng i nl c m t . yl v n r t q u a nt r n gl s c k h a i t h c v oc u i c h n gn yv t r o n gk t i p .

t h ak r i n gt
B nc t h k t h a m t l pc s t n h nb n gc c h r a k h i c n gc n gt r o n gd a n hs c hc s n gc p , h o c b n gc c hn i m t c c hr r n gt i n( c t h l m t c h n hs c ht t h nb i v n l r r n gc h on g i s d n gm b n c n g h a l n ) . K h i b nt h a h n gt n h n , b n a n g" t h c h i nv , " c n g h a l , b n a n gt or a m t l pm i m c t t c c c d l i uv c h c n n gc a c c l pc s , n h n gc h c n n g c n , d o , n c h l m t p h nc a l mc s t h c h i n . Ng i s d n gl pk h n gc q u y nt r u yc pv oc c c h c n n gc b n , v m t i t n g k h n gt h c c o i l m t v d c a l pc s ( n h t r o n gF Na me 2 . c p p) . B nc t h t h i n h n gg m c c hc a t i nt h a k , b i v c c t h a yt h c a v i c s d n gt h n hp h n t or a m t t i n i t n gt r o n gl pm i c v t h c hh ph n . t i nt h a k c b a og mt r o n gc c n g nn g c h o y , n h n g n uk h n gc l d on ok h c n g o i v i c l mg i ms n h ml n, b nt h n gs mu ns d n gt h n hp h nc h k h n gp h i l t i nt h a k . T u yn h i n , i k h i c t h c t n hh u n gm b nmu ns nx u t m t p h nc a g i a od i n t n gt n h c c l pc s v k h n gc h op h p i ut r c c i t n gn h t h n l m t i t n gl pc s . t i nt h a k c u n gc pk h n n gn y . C n gb c ct h n hv i nt n h n ct h ak K h i b nt h a h n gt n h n , t t c c c c n gc c t h n hv i nc a l pc s t r t h n ht i n. N ub nmu nb t k n g i t r o n gs h c n h nt h y , c h c nn i t nc a h ( k h n gc i s h o c g i t r t r l i ) t r o n gc c c n g p h nc a l pd nx u t :
// :C 1 4 :P r i v a t e I n h e r i t a n c e . c p p l pP e t{ p u b l i c : c h a r n( )c o n s t{ r e t u r n' a ' ; } i n tn i( )c o n s t{ r e t u r n2 ; } ( )c o n s t{ r e t u r n3 . 0 ; } f l o a tn g ( i n t )c o n s t{ r e t u r n4 . 0 ; } } ; l pc v n g :P e t{ //c n h nt h ak c n gc n g : V tn u i: : n ;//T nc n gb c h u n gt h n hv i n V tn u i: :g i cn g ;//C h a it h n hv i nt i px cq u t i } ; i n tm a i n( ){ b o bc v n g ; b o b . e a t( ) ; b o b . s l e e p( ) ; b o b . s l e e p( 1 ) ; // !b o b . s p e a k( ); //L i :c h cn n gt h n hv i nt n h n }/// :~

f l o a tg i cn g

D o , t i nt h a k l h u c hn ub nmu n nm t p h nc a c c c h c n n gc a l pc s . C h r n g a r a t nc a m t c h c n n gq u t i c h ot h yt t c c c p h i nb nc a c c c h c n n gq u t i t r o n gc c l pc s .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 242/320

08/10/2013

Suy ngh trong C + +, Vol 1

B nn ns u yn g h c nt h nt r c k h i s d n gt i nt h a k t h a yv t h n hp h n ; t i nk t h a c b i nc h n g c b i t k h i k t h pv i t h i g i a nc h yx c n hl o i ( yl c h c a m t c h n gt r o n gt p2 c a c u ns c hn y , t i v t w w w . B r u c e E c k e l . c o m) .

b ov

B yg i b n c g i i t h i u t h a k , t k h a b ov c u i c n gc n g h a . T r o n gm t t h g i i l t n g , t i n t h n hv i ns l u nl u n c k h k h nv n h a n hc h n gt i n, n h n gt r o n gt h c t c c d nc n h n gl c b n mu nl m m t c i g nt t h g i i t i t r u yc pl nv c h a c h op h pc c t h n hv i nc a c c l ph c c n g u n g c . C c b ov t k h a l m t c i g t u c h n g h a t h c d n g , n n i , " yl t i nn h x a n h n g i s d n g l pc l i nq u a n , n h n gc s nc h ob t c a i k t h a t l pn y . "

P h n gp h pt t n h t l l i c c t h n hv i nd l i ur i n gt b np h i b ov q u y nc a b n t h a y i c i t c s . S a u b nc t h c h op h pk i ms o t t r u yc p t h a k c a l ph c c a b nt h n gq u a b ov c h c n n gt h n h v i n :
// :C 1 4 :P r o t e c t e d . c p p //C ct k h a cb ov #b a og m< f s t r e a m >s d n gt nm i n k h n gg i a nt i uc h u n ; c l a s sB a s e{ i n ti ;b ov : i n tr e a d( )c o n s t{ r e t u r ni ; } t r n gt h i tl p( i n ti i ){ i=i i ; }c n g c n g : C s ( i n ti i=0 ) :i( i i ){ } i n tg i t r ( i n tm )c o n s t{ r e t u r nm*i ; } } ; l pD e r i v e d :p u b l i cB a s e{ i n tj ;c n gc n g : N g u ng c( i n tj j=0 ) :j( j j ){ } k h o n gt r n gt h a y i( i n tx ){ t h i tl p ( x ) ; } } ; i n tm a i n( ){ n g u ng cd ; d . c h a n g e( 1 0 ) ; }/// :~

B ns t mt h yn h n gv d v s c nt h i t p h i b ov t r o n gv d s a ut r o n gc u ns c hn y , v t r o n gt p2 .

t h ak b ov

K h i b n a n gk t h a , g i t r m c n hl pc s t i n, c n g h a l t t c c c t h n hv i nc h c n n gc n gc n gt i n c h on g i s d n gc a l pm i . T h n gt h n g , b ns l mc h oc c t h a k c n gc n g g i a od i nc a l pc s c n gl g i a od i nc a l p c t h a k . T u yn h i n , b nc n gc t h s d n g c b ov t k h a t r o n gk t h a . Ng u ng c b ov c n g h a l " t h c h i n t r o n g t h u t n g c a " c c l pk h c n h n g" l m t " c h oc c l ph c v b nb c n g u ng c . l m t c i g b nk h n gs d n gt h n gx u y n , n h n g l t r o n gn g nn g c h o y .

Nh i uh n hq u t i v t h ak

Ng o i t r c h oc c n h i uh n hp h nc n g , i uh n hs t n g c t h a h n gv om t l ph c c n g u n g c . i un yc t h c c h n gmi n hb n gc c hk t h a t C 1 2 : B y t e . h:

// :C 1 4 :O p e r a t o r I n h e r i t a n c e . c p p //K t h ac cn h k h a it h cq u t i #B a og m" . . / C 1 2 / B y t e . h "#b a og m< f s t r e a m >s d n gt nm i nk h n g g i a nt i uc h u n ;o f s t r e a mr a( " B y t e T e s t . o u t " ) ; l pB y t e 2 :B y t e{ p u b l i c : //N h x yd n gk h n gk t h a : B y t e 2( u n s i g n e dc h a rb b=0 ) :B y t e( b b ){ } //N h i uh n h=k h n gk t h a ,n h n g // ct n gh pc h om e m b e r w i s ec h u y nn h n g . //T u yn h i n ,c h s a m e T y p e=s a m e T y p e //N h i uh n h= ct n gh p ,v v yb np h i //l mc h on h n gn g ik h cm t c c hr r n g : B y t e 2&o p e r a t o r=( c o n s tB y t ev p h i ){ B y t e: :o p e r a t o r=( b np h i ) ; *t r l in y ; } B y t e 2&o p e r a t o r=( i n ti ){ B y t e: :o p e r a t o r=( i ) ; t r l i*n y ; } } ;

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

243/320

08/10/2013

Suy ngh trong C + +, Vol 1

C h cn n gk i mt r a//t n gt n h t r o n gC 1 2 :B y t e T e s t . c p p : k h o n gt r n gk( B y t e 2&b 1 ,B y t e 2&b 2 ){ b 1=b 1*b 2+b 2b 1 % ; #X c n hT R Y 2( O P )\ r a< <" b 1= " ;b 1 . p r i n t( t r o n g ) ;\ r a< <" ,b 2= " ;b 2 . p r i n t ( t r o n g ) ;\ r a< <" ; b 1" #O P "b 2s nx u t" ,\ ( O Pb 1b 2 )i n( t r o n g ) ; .\ r a< < e n d l ; b 1=9 ;b 2=4 7 ; T R Y 2( + )T R Y 2( )T R Y 2( * )T R Y 2( / ) T R Y 2( % )T R Y 2( ^ )T R Y 2( & )T R Y 2( | ) T R Y 2( < < )T R Y 2( > > )T R Y 2( += )T R Y 2( -= ) T R Y 2( *= )T R Y 2( /= )T R Y 2( %= )T R Y 2( ^= ) T R Y 2( &= )T R Y 2( |= )T R Y 2( > >= )T R Y 2( < <= ) T R Y 2( = ) i uh n h//C h u y nn h n g //C c i uk i n : #x c n hT R Y C 2( O P )\ r a< <" b 1= " ;b 1 . p r i n t( t r o n g ) ;\r a< <" ,b 2 = " ;b 2 . p r i n t( t r o n g ) ;\r a< <" ;b 1" #O P "b 2s nx u t" ,\r a< <( O Pb 1b 2 ) ;\r a< <e n d l ; b 1=9 ;b 2=4 7 ; T R Y C 2( < )T R Y C 2( > )T R Y C 2( = = )T R Y C 2( != )T R Y C 2( < = ) T R Y C 2( >= )T R Y C 2( & & )T R Y C 2( || ) //X c hv i c : B y t e 2b 3=9 2 ; i n tm a i n( ){ r a< <" h mt h n hv i n : "< <e n d l ; b 1=b 2=b 3 ; B y t e 2b 1( 4 7 ) ,b 2( 9 ) , k( b 1 ,b 2 ) ; }/// :~

M k i mt r a g i n gh t t r o n gC 1 2 : B y t e T e s t . c p pn g o i t r B y t e 2 c s d n gt h a yv B y t e . B n gc c hn y , t t c c c n h k h a i t h c a n gx c mi n h l mv i c v i B y t e 2 t h n gq u a k t h a . K h i b nk i mt r a l pB y t e 2 , b ns t h yr n gc c n h x yd n gp h i c x c n hm t c c hr r n g , v c h c = i uh n hm c h n hm t B y t e 2 m t B y t e 2 c t n gh p , b t k n h k h a i t h c c h u y nn h n gk h c m b n c n , b ns p h i t n gh pt r nc a b nr i n g .

ak t h a

B nc t h k t h a t m t l ph c , d o , n d n gn h c n g h a k t h a t n h i uh nm t l pt i m t t h i i m. T h c s b nc t h , n h n gl i un c n g h a n h l m t p h nc a m t t h i t k l m t c h c a c u c t r a n h l u nt i pt c . M t i ut h n g c t h o t h u n : B nk h n gn nc g n gn yc h o nk h i b n c l pt r n h k h t r o n gm t v h i u c n g nn g h o nt o n . V ot h i i m , c t h b ns n h nr a r n gk h n gc v n b a on h i ub nn g h r n gb nh o nt o np h i s d n g a k t h a , b nh un h l u nl u nc t h n h n c n g a y v i t h a k d u yn h t . B a n u , a k t h a c v ng i n : B nc t h t h mc c l ph c t h mt r o n gd a n hs c hl pc s t r o n gq u t r n h t h a k , c c hn h a ub n gd up h y . T u yn h i n , n h i ud i s ng i i t h i um t s k h n n gm h , l l d ot i s a o m t c h n gt r o n gT p2 c d n hc h oc h n y .

P h t t r i ng i at n g

M t t r o n gn h n gl i t h c a t h a k v t h n hp h nl n h n gh t r p h t t r i ng i a t n g b n gc c hc h op h pb ng i i t h i um m i m k h n gg yr a l i t r o n gm h i nc . N ul i l mx u t h i n , h a n gb c l pt r o n gm m i . B n gc c hk t h a t ( h o c s n gt c v i ) m t l ph c h i nc , c h c n n gv b s u n gt h mt h n hv i nd l i uv h mt h n hv i n( v x c n hl i c h c n n gt h n hv i nh i nc t r o n gt h a k ) b n l i m h i nc m n g i k h c v nc t h c s d n gb n hh n gv u n b u g g e d . N um t l i x yr a , b nb i t l t r o n gm m i c a b n , l n g nh nn h i uv d d n gh n c h nn ub n s a i c t h c a m h i nc .

Nk h n g c n h i ns c hc c l ph c c t c hr a . B nt h mc h k h n gc np h i c m n g u nc h oc c c h c n n gt h n h v i n s d n gl i m , c h l t pt i nt i u mt c c l pv c c i t n gt pt i nh o c t h v i nt pt i nv i c c h m t h n hv i nb i ns o n . ( i un y n gc h oc h a i t h a k v t h n hp h n . ) i uq u a nt r n gl n h nr a r n gp h t t r i nc h n gt r n hl m t q u t r n hg i a t n g , g i n gn h h c t pc a c o nn g i . B nc t h l mp h nt c hn h n h i un h b nmu n , n h n gb nv ns k h n gb i t t t c c c c ut r l i k h i b n t r a t r nm t d n . B ns c n h i uh nn a t h n hc n gv n g a yl pt c p h nh i h nn ub nb t u" p h t t r i n " d nc a b nn h m t s i n hv t t i nh a h uc , c h k h n gp h i x yd n gn t t c c n gm t l c n h m t t a n h c h c [ 4 9 ] t r i b n gk n hh p . M c d t h a k c h ot h n g h i ml m t k t h u t h u c h , t i m t s i ms a uk h i i u n n hb nc n c m t c i


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 244/320

08/10/2013

Suy ngh trong C + +, Vol 1

[ 5 0 ] n h nm i v h t h n gc pb c l ph c c a b nv i m t m t b s p v om t c ut r c h pl . H yn h r n gb n d i n t t c , t h a k l c n g h a l t h h i nm t m i q u a nh m n i , " l pm i n yl m t l o i m l ph c c . " C h n gt r n hc a b nk h n gc nq u a nt m yb i t x u n gq u a n h , n h n gt h a yv v i v i c t or a v t h a ot c c c i t n gc k i uk h c n h a u t h h i nm t mh n ht r o n gc c i uk h o n a c h ob nt k h n gg i a nv n .

U p c a s t i n g

T r c t r o n gc h n gn y , b nt h yl mt h n om t i t n gc a m t l pb t n g u nt i f s t r e a mc t t c c c c i mv h n hv i c a m t i f s t r e a m i t n g . T r o n gF Na me 2 . c p p, b t k i f s t r e a mc h c n n gt h n hv i nc t h c g i l m t F Na me 2 i t n g . K h a c n hq u a nt r n gn h t c a k t h a k h n gp h i l n c u n gc pc h c n n gt h n hv i nc a l pm i , t u yn h i n . l m i q u a nh h i ng i a l pm i v c c l pc s . M i q u a nh n yc t h c t mt t b n gc c hn i , " C c l ph c m i l m t l o i c a c c l ph c h i nc . " Mt n yk h n gc h l m t c c hh u y n oc a g i i t h c ht h a k l h t r t r c t i pb i t r n hb i nd c h . V d , h yx e mx t m t l pc s c g i l c i d i nc h on h c c v m t l pd nx u t c g i l g i . V t h a k c n g h a l t t c c c c h c n n gt r o n gl pc s c n gc s nt r o n gc c l pd nx u t , b t k t i nn h nb nc t h g i nc c l pc s c n gc t h c g i nc c l pd nx u t . V v y , n uc c c c m t l pc h i ( ) c h c n n g t h n hv i n , v v ys Gi c . i un yc n g h a c h n gt i c h n hx c c t h n i r n gm t g i i t n gc n gl m t l o i d n gc . V d s a u yc h ot h yc c ht r n hb i nd c hh t r k h i n i mn y :

// :C 1 4 :I n s t r u m e n t . c p p//T h ak &u p c a s t i n ge n u m{ l um i d d l e C ,c s h a r p ,C f l a t }// v v l pC { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ } } ; / it n g/g i l d n gc //b iv h c c n gm tg i a od i n : l pg i :C n o{ } ; i uc h n hk h o n gt r n g( C &i ){ //. . . i . p l a y( m i d d l e C ) ; } i n tm a i n( ){ / :~ s og i , i uc h n h( s o ) ;//U p c a s t i n g }//

Nh n g i ut h v t r o n gv d n yl i uc h n h( ) c h c n n g , m c h pn h nm t c t h a mk h o . T u yn h i n , t r o n g c h n h( ) c c g i a i i u( ) c h c n n g c g i l b n gc c hg i a on m t t h a mc h i u nm t g i i t n g . C h or n g C++l r t c t h v k i mt r a k i u , c v n h k l m m t c h c n n gc h pn h nm t l o i s d d n gc h pn h n l o i k h c , c h o nk h i b nn h nr a r n gm t g i i t n gc n gl m t d n gc i t n g , v k h n gc c h c n n g i uc h n h( ) c t h g i c h om t d n gc k h n gp h i l c n gt r o n gg i ( yl n h n gg t h a k mb o ) . T r o n gg i a i i u( ) , m l mv i c c h oc v b t c i ug x u t p h t t d n gc , v c c h n hv i c h u y n i m t g i t i l i ut h a mk h oh o c c o nt r v om t d n gc t h a mk h oh o c c o nt r c g i l u p c a s t i n g .

L d ot i s a o" u p c a s t i n g ? "
C

L d oc h ot h u t n g n yl l c hs v d a t r ns t h a k l pc c ht r u y nt h n g c r t r a : v i g c t r nc n gc a t r a n g , p h t t r i n i x u n g . ( . T t n h i n , b nc t h v s c a b nt h e oc c hm b nt h y h u c h ) S t h a k c h oI n s t r u me n t . c p pl s a u :

Gi

c t n g u ng c nc s d i c h u y nl nt r ns t h a k , v v yn t h n g c g i l u p c a s t i n g . U p c a s t i n g l u nl u nl a nt o nb i v b n a n g i t m t l o i h n hc t h h nc h om t l o i t n gq u t h n i ud u yn h t c t h x yr a v i g i a od i nl pl n c t h m t c h c n n gt h n hv i n , k h n g t c c h n g . yl l d ot i s a oc c t r n hb i nd c hc h op h pu p c a s t i n gm k h n gc n pr r n gh o c k h i u c b i t k h c .

U p c a s t i n gv s a oc h p x yd n g
N ub nc h op h pt r n hb i nd c h t n gh pm t b ns a o x yd n gc h om t l ph c c n g u ng c , n s t n g g i c o p y c o n s t r u c t o r l pc s , v s a u s a oc h px yd n gc h ot t c c c i t n gt h n hv i n( h o c t h c h i n
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 245/320

08/10/2013

Suy ngh trong C + +, Vol 1

m t b i t c o p yt r n c x yd n gt r o n gc c l o i ) , d o b ns c n h n gh n hv i n g :
// :C 1 4 :C o p y C o n s t r u c t o r . c p p //C h n hx ct or ac cb ns a o x yd n g #I n c l u d eu s i n gn a m e s p a c es t d ; l pc h u y n{ i n ti ;c n gc n g : C h am ( i n ti i ) :i( i i ){ c o u t< <" C h am ( i n ti i )\n " ; } C h am ( c o n s tc aP h H u y n hv b ) :i( b i ){ c o u t< <" C h am ( c o n s tP h H u y n h )\ n " ; } C h am ( ) :i( 0 ){ c o u t< <" C h am ( )\n " ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m& o s ,c o n s tC h n h&b ){ t r l io s< <" P h h u y n h : "< <b i< <e n d l ; } } ; l pT h n hv i n{ i n ti ;c n gc n g : T h n hv i n( i n ti i ) :i( i i ){ c o u t< <" T h n hv i n( i n ti i )\n " ; } T h n hv i n( t h n hv i nc o n s t&m ) :i( m i ){ c o u t< <" t h n hv i n( t h n hv i n c o n s t& )\n " ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tT h n hv i n&m ){ t r l io s < <" T h n hv i n : "< <m i< <e n d l ; } } ; c l a s sC h i l d :P a r e n tc n g{ i n ti ; T h n hv i nm ;c n gc n g : T r e m( i n ti i ) :P h h u y n h( i i ) ,i( i i ) ,m( i i ){ c o u t< <" T r e m( i n ti i )\n " ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tT r e m&c ){ t r l ih i uh n h< <( P h H u y n h )c< <c m < <" T r e m : "< <c i< <e n d l ; } } ; i n tm a i n( ){ t r e mc( 2 ) ; c o u t< <" g ib ns a o x yd n g : "< <e n d l ; t r e mc 2=c ;//c u cg ib ns a o x yd n g c o u t< <" g i t r t r o n gc 2 :\n "< <c 2 ; }/// :~

C c n h i uh n h< <c h ot r e ml t h v v c c hmn g i < < i uh n hc h oC h n hp h nb nt r o n gn : b n g c c h cc c t r e m i t n gv om t P h Hu y n h( n ub ns d n gm t l pc s i t n gt h a yv m t t i l i u t h a mk h o , b ns t h n gn h n c k t q u k h n gmo n gmu n ) : t r l ih i uh n h< <( P h H u y n h )c< <c m K t k h i t r n hb i nd c hs a u n h nt h yn n h l m t c h u y n, n g i c h u y np h i nb nc a t o nt < <. B nc t h t h yr n gt r e mk h n gc n hn g h a r r n gs a oc h px yd n g . T r n hb i nd c hs a u t n gh pc c b n s a o x yd n g( v l m t t r o n gb nc h c n n gn s t n gh p , c n gv i c c n h x yd n gm c n hn ub n k h n gt or a b t k x yd n gc c = i uh n hv d e s t r u c t o r ) b n gc c hg i c h u y ns a oc h px yd n gv T h n hv i ns a oc h px yd n g . i un y c t h h i n ur a
C h am ( i n ti i ) T h n hv i n( i n ti i )T r e m( i n ti i )g ib ns a o x yd n g :P h h u y n h ( c o n s tP h H u y n h )t h n hv i n( t h n hv i nc o n s t& )g i t r t r o n gc 2 : P h h u y n h :2 T h n hv i n :2 T r e m :2

T u yn h i n , n ub nc g n g v i t r i n gc a b ns a o x yd n gc a b nc h ot r e mv c c b nt h c h i nm t s a i l m v t i v l mn x u :
T r e m( c o n s tT r e m&c ) :i( c i ) ,m( c m ){ }

t h m c n h n h x yd n gs c t n gg i c h om t p h nc s n gc pc a t r e m, v l n h n gg c c t r n h b i nd c hg i mt r l i k h i n k h n gc s l a c h nk h c c a n h x yd n g g i ( h yn h r n g m t s n h x yd n gl u nl u np h i c g i c h om i i t n g , b t k l m t s u b o b j e c t c a l pk h c ) . S nl n g s a u s l :
C h am ( i n ti i ) T h n hv i n( i n ti i )T r e m( i n ti i )g ib ns a o x yd n g :P h h u y n h ( ) T h n hv i n( t h n hv i nc o n s t& )g i t r t r o n gc 2 :P h h u y n h :0 T h n hv i n :2 T r e m :2

i un yc l k h n gp h i n h n gg b nmo n g i , k t k h i t h n gt h n gb ns mu np h nl pc s c s a oc h p t c c i t n gh i nc c c i t n gm i n h m t p h nc a b nx yd n g .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 246/320

08/10/2013

Suy ngh trong C + +, Vol 1

s a c h a c c v n b np h i n h g i n gc s c pb ns a o x yd n g( n h c c t r n hb i nd c hk h n g ) b t c k h i n ob ng h i c h p x yd n gc a r i n gb n . i un yc t h d n gn h l m t s t r a n g e l o o k i n gc h t l c un h n g n l m t v d c a u p c a s t i n g :
T r e m( c o n s tT r e m&c ) < <" T r e m( C h i l d& )\n " ; } :P h h u y n h( c ) ,i( c i ) ,m( c m ){ c o u t

P h nk l l n i c h u y ns a oc h px yd n g c g i l : C h n h( c ) . C n g h a l g v t q u a m t c o n i t n g nm t c h u y nx yd n g ? Nh n gt r e m c t h a k t c h u y n, d o , m t t r e mt i l i ut h a mk h ol m t c h u y nt h a mk h o . C c l pc s g i s a oc h px yd n gu p c a s t s m t t h a mc h i u nt r e m nm t t h a m c h i u nC h n hv s d n gn t h c h i nc c b ns a o x yd n g . K h i b nv i t x yd n gb ns a oc a c h n hb n , b ns h un h l u nl u nmu nl m i ut n gt .

T h n hp h ns ov i t h ak ( x e m x tl i )
M t t r o n gn h n gc c hr r n g x c n hx e mb nn ns d n gp h nt h a k l b n gc c hh i x e mb n b a og i s c n p h i n e ml n t l p h c m i c a b n . T r c t r o n gc h n gn y , c c n g nx pl ph c c c h u y n s d n gt h a k . T u yn h i n , r t c t h l S t r i n g S t a c k i t n gs c h c s d n gn h c h u i c o n t a i n e r v k h n g b a o g i n e ml n , d o , m t t h a y t h t h c h h p h n l t h n h p h n :
// :C 1 4 :I n h e r i t S t a c k 2 . c p p //T h n hp h n ,s ov it h ak #B a og m" . . / C 0 9 / S t a c k 4 . h " #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ; l pS t r i n g S t a c k{ N g nx pc h n g ;//N h n gt h a yv k t h ac n gc n g : k h o n gt r n g y( s t r i n g*s t r ){ s t a c k . p u s h( s t r ) ; } c h u i*( )c o n s t{ r e t u r n( c h u i* )s t a c k . p e e k( ) ; } c h u i*p o p( ){ r e t u r n( c h u i* )s t a c k . p o p( ) ; } } ; i n tm a i n( ){ i f s t r e a mt r o n g( " I n h e r i t S t a c k 2 . c p p " ) ; mb o( t r o n g " I n h e r i t S t a c k 2 . c p p " ) ; d n gc h u i ; t e x t l i n e sS t r i n g S t a c k ; t r o n gk h i( g e t l i n e ( t r o n g ,d n g ) ) t e x t l i n e s . p u s h( c h u im i(d n g ) ) ; c h u i*s ; t r o n gk h i( ( s= t e x t l i n e s . p o p( ) )=0 )//K h n gc d i nv i n ! c o u t< <*s< <e n d l ; }/// :~

C c t pt i nt r n gv i I n h e r i t S t a c k . c p p, n g o i t r m t n g nx p i t n g c n h n gt r o n gS t r i n g S t a c k, v h mt h n hv i n c g i l c h o i t n g . V nc nk h n gc t h i g i a nh o c k h n gg i a nt r nc a ov s u b o b j e c t c h i mc n gm t l n gk h n gg i a n , v t t c c c k i mt r a k i uk h c x yr a t i t h i g i a nb i nd c h . M c d n c x uh n gg yn h ml nh n , b nc n gc t h s d n gt i nt h a k t h h i n" t h c h i nv . " i un y c n gs g i i q u y t v n y . M t n i n t r n nq u a nt r n g , t u yn h i n , k h i a k t h a c t h c mb o . T r o n gt r n gh p , n ub nt h ym t t h i t k m t r o n g t h n hp h nc t h c s d n gt h a yv t h a k , b n c t h c t h l o i b s c nt h i t p h i a k t h a .

C o nt r & u p c a s t i n gt h a m k h o
T r o n gI n s t r u me n t . c p p, c c u p c a s t i n gx yr a t r o n gs u t c u c g i c h c n n gm t g i i t n gb nn g o i h mc t h a mc h i uc a n c t h c h i nv t r t h n hm t d n gc t h a mk h ob nt r o n gh m. U p c a s t i n gc n gc t h x y r a t r o n gm t n h i mv ng i n m t c o nt r h o c t h a mk h o :
G i w ; C *i p=& w ;//u p C a s t C &i r=w ;//u p C a s t

Nh c c c h c n n gg i , k h n gp h i c a c c t r n gh p i h i m t d i nv i nr r n g .

M tc u ck h n gh o n g
G i w ; C *i p=& w ;

T t n h i n , b t k n e ml n m t l o i t h n g t i n v m t i t n g .

N ub nn i

t r n hb i nd c hc t h i p h v i i pc h n h l m t d n gc c o nt r v k h n gc g k h c . Ng h a l , n k h n g c t h b i t r n gi pt h c s x yr a t r nm t g i i t n g . V v y , k h i b ng i p l a y( ) c h c n n gt h n hv i n
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 247/320

08/10/2013

Suy ngh trong C + +, Vol 1

b n gc c hn i i p >c h i( m i d d l e C ) ; t r n hb i nd c hc t h c h b i t r n gn a n gg i p l a y( ) c h om t c c o nt r , v g i p h i nb nl pc s c a C : : c h i ( t h a yv n h n gg n p h i l m, l c u c g i ) Gi : : c h i ( . V v y , b ns k h n gn h n c h n hv i n g . ) yl m t v n q u a nt r n g , n c g i i q u y t t r o n gC h n g1 5 b n gc c hg i i t h i un nt n gt h b a c a l p t r n hh n g i t n g : a h n h( t h c h i nt r o n gC++v i oc h c n n g ) .

T mt t

C h a i t h a k v t h n hp h nc h op h pb nt or a m t l o i m i t c c l o i h i nc , v c h a i s u b o b j e c t s a c h m n gc a c c l o i h i nc t r o n gc c l o i h n hm i . T h n gt h n g , t u yn h i n , b ns d n gt h n hp h nt i s d n g c c l o i h i nc n h m t p h nc a v i c t h c h i nc b nc a c c l o i m i v k t h a k h i b nmu n b u c c c l o i m i l c n gk i uv i l pc s ( l o i t n g n g mb og i a od i nt n g n g ) . K t k h i l ph c c n g u n g c c g i a od i nl pc s , n c t h c n e ml n nc s , l q u a nt r n g i v i a h n hn h b ns t h y t r o n gC h n g1 5 . M c d t i s d n gm t h n gq u a t h n hp h nv k t h a l r t h u c hc h op h t t r i nd nn h a n hc h n g , b ns t h n gmu nt h i t k l i h t h n gp h nc pl ph c c a b nt r c k h i c h op h pc c l pt r n hv i nk h c t r t h n hp h t h u c v on . M c t i uc a b nl m t h t h n gp h nc p , t r o n g m i l pc s d n gc t h v k h n gp h i l q u l n( c h a n gr t n h i uc h c n n gm n k h s d n g t i s d n g ) , c n gk h n gk h c h u n h ( b nk h n gt h s d n gn b n gc h n hn h o c k h n gc t h mc h c n n g ) .

B i t p
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

15. 16.

S a i C a r . c p p n c n gk t h a t m t l p c g i l X e , t c h c n n gt h n hv i nt h c hh pt r o n gx e ( c n g h a l , l mc h om t s c h c n n gt h n hv i n ) . T h m m t n h x yd n gn o n d e f a u l t x e , m b np h i g i b nt r o n gt x yd n g' s . T oh a i l p , Av B , v i n h t h um c n ht h n gb om n h . K t h a m t l pm i g i l Ct A, v t or a m t i t n gt h n hv i nc a Bt r o n gC, n h n gk h n gt or a m t n h x yd n gc h oC. T or a m t i t n gc a l pCv q u a ns t k t q u . T om t h t h n gb a c pl ph c v i n h x yd n gm c n h , c n gv i h mh y , c h a i ut h n gb ot c o u t . X c mi n hr n g i v i m t i t n gc a c c l o i n g u ng c n h t , t t c b a d n gv h mh y c g i t n g . G i i t h c ht h t m c c c u c g i c t h c h i n . S a i C o mb i n e d . c p pt h m m t m c t h a k v m t i t n gt h n hv i nm i . T h m m h i nt h k h i x yd n gv h mh y c g i l . T r o n gC o mb i n e d . c p p, t or a m t l pD t h a k t Bv c m t i t n gt h n hv i nc a l pC. T h m m h i nt h k h i x yd n gv h mh y c g i l . S a i Or d e r . c p pt h m m t m c t h a k De r i v e d 3 v i c c i t n gt h n hv i nc a l pMe mb e r 4 v Me mb e r 5 . T h e od i c c ur a c a c h n gt r n h . T r o n gNa me Hi d i n g . c p p, x c mi n hr n gt r o n gDe r i v e d 2 , De r i v e d 3 , v De r i v e d 4 , k h n ga i t r o n gs c c p h i nb nc s n gc pc a f ( ) c s n . S a i Na me Hi d i n g . c p pb n gc c ht h mb a c h c n n gq u t i t nl h( ) c s , v c h ot h yr n gv i c x c n hl i m t t r o n gs h t r o n gm t l pd nx u t nk h c . T h a k m t l pS t r i n g V e c t o r t v e c t o r < v o i d * >v x c n hl i p u s h _ b a c k( ) v n h i uh n h[ ] c h c n n g t h n hv i nc h pn h nv t or a c h u i * . i ug x yr a n ub nc g n gp u s h _ b a c k( ) m t v o i d* ? V i t m t l pc c h a m t d i v s d n gc p h pg i p s u e d o c o n s t r u c t o r t r o n gc c n h x yd n g k h i t o d i . T om t l p c g i l t i uh n ht i n h. S d n gt h a k c h oc c c h u y nP S t a s hl pt r o n gC h n g1 3 ( P S t a s h . h&P S t a s h . c p p) n c h pn h nv t r l i t i uh n ht i n hc o nt r . C n gt h a y i P S t a s h T e s t . c p p k i mt r a c c l ph c c a b n . T h a y i l p P S t a s hl m t i t n gt h n hv i n . L pl i b i t p1 1 v i m t v e c t o r t h a yv m t P S t a s h. T r o n gS y n t h e s i z e d F u n c t i o n s . c p, s a i pT n g c h on m t c o n s t r u c t o r m c n h , s a oc h p x yd n g , v i uh n hc n gv i c . C h n gmi n hr n gb n v i t n h n gc c hc h n hx c . T oh a i l ph c c g i l d uv M yn h nt i nm k h n gc nx yd n gm c n h , n h n gv i n h x yd n g m p h i m t m t i s k i uc h u i , m h c h ng i nl s a oc h pv om t n i b c h u i b i n . i v i m i l ph c , v i t c c b ns a o x yd n gv p h nc n g i uh n hc h n hx c . B yg i t h a k m t l p B u s i n e s s T r a v e l e t r d uv c u n gc pc h on m t i t n gt h n hv i nc a l o i M yn h nt i n. V i t c c c o n s t r u c t o r m c n h n g , m t n h x yd n gm p h i m t m t c h u i l pl u n , m t b ns a o x yd n g , v m t n h i uh n hc h u y nn h n g . T om t l ph c v i h a i t n hh mt h n hv i n . K t h a t l pn yv x c n hl i m t t r o n gn h n gc h c n n g t h n hv i n . C h ot h yc c k h c l nt r o n gl pc n g u ng c . T r a c ut h mc c c h c n n gt h n hv i nc h oi f s t r e a m. T r o n gF Na me 2 . c p p, h yt h c h n gt r nc c t pt i n i
248/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

17. 18. 19. 20. 21. 22.

23. 24.

25. 26.

27.

28. 29.

t n g . S d n gr i n gt v b ov d i s n t or a h a i l pm i t m t l pc s . S a u c g n g n e ml n c c i t n gc a l pd nx u t nl pc s . G i i t h c hn h n gg x yr a . T r o n gP r o t e c t e d . c p p, t h m m t c h c n n gt h n hv i nt r o n gn g u ng c m c c c u c g i b ov c s t h n h v i n c ( ) . T h a y i P r o t e c t e d . c p p n g u ng c c s d n gb ov d i s n . X e mb nc t h g i g i t r ( ) c h om t n g u n g c i t n g . T om t l p c g i l t uv t r v i m t f l y( ) p h n gp h p . K t h a S h u t t l e t t uv t r v t h m m t t ( ) p h n gp h p . T or a m t m i S h u t t l e , n e ml n b n g c o n t r h o c t h a mc h i u n m t t uv t r , v c g n gg i c h o t ( ) p h n gp h p . G i i t h c hk t q u . S a i I n s t r u me n t . c p pt h m m t c h u nb ( ) p h n gp h p c . G i c h u nb ( ) t r o n gg i a i i u( ) . S a i I n s t r u me n t . c p p c h i ( ) i nr a m t t h n g i pt i c o u t , v g i n hn g h a l i c h i ( ) i nm t t h n g b ok h c n h a u c o u t . C h yc h n gt r n hv g i i t h c hl d ot i s a oc t h b ns k h n gmu nh n hv i n y . B yg i t ot k h a ( m b ns h c t r o n gc h n g1 5 ) p h a t r c c a p l a y( ) t u y nb t r o n gd n gc v q u a ns t s t h a y i t r o n gh n hv i . T r o n gC o p y C o n s t r u c t o r . c p p, t h a k m t l pm i t t r e mv c h on m t t h n hv i nm . V i t t h c hh px y d n g, s a oc h pC o n s t r u c t o, r o p e r a t o r =, v i uh n h< <c h oo s t r e a ms , v k i mt r a c c l ph c t r o n g ma i n( ) . L yv d C o p y C o n s t r u c t o r . c p pv s a i n b n gc c ht h mc a b ns a o x yd n gc a b n t r e mk h n g g i c s c pb ns a o x yd n gv x e mn h n gg x yr a . S a c h a c c v n b n gc c ht h c h i nc u c g i r r n gt h c hh p c c n h x yd n gb ns a oc s n gc pt r o n gd a n hs c hc o n s t r u c t o r i n i t i a l i z e r c a t r e mb ns a o x yd n g . S a i I n h e r i t S t a c k 2 . c p ps d n g< s t r i n g >v e c t o r t h a yv m t n g nx p. T om t l p v i m t c o n s t r u c t o r m c n h , m t c o p y c o n s t r u c t o r , m t n h i uh n hp h nc n gv h y , t t c ut h n gb oc h oc o u t r n gh c g i l . T r o n gma i n( ) , t or a m t < R o c k >v e c t o r ( c n g h a l , t c h c i t n gt h e og i t r ) v t h m m t s s . C h yc h n gt r n hv g i i t h c hk t q u b nn h n c . L ux e mh mh y c g i l c h o c c i t n gt r o n gv e c t o r . B yg i l pl i b i t pv i m t < R o c k * > v e c t o r . L n c t h t or a m t < R o c k &>v e c t o r ? B i t pn yt or a c c m ut h i t k c g i l y q u y n. B t uv i m t l pc s v c u n gc pc h on b a c h c n n g : f ( ) , g( ) , v h( ) . B yg i t h a k m t l pP r o x yv h a i l pI mp l e me n t a t i o n 1 v I mp l e me n t a t i o n 2 t . P r o x yn nc h a m t c o nt r nm t c h , v t t c c c t h n hv i nc h c n n gc h o P r o x yc h n nq u a yl i v t h c h i nc c c u c g i t n gt t h n gq u a c c c o nt r . C c P r o x yx yd n gc m t c o nt r nm t c h c c i t t r o n gc c P r o x y( t h n gl d oc c n h x yd n g ) . T r o n gma i n( ) , t o r a h a i k h c n h a uP r o x y i t n gs d n gh a i n g nn g k h c n h a u . B yg i t h a y i P r o x y b nc t h t n gt h a y i h i nt h c . S a i A r r a y Op e r a t o r Ne w. c p pt C h n g1 3 n c h ot h yr n g , n ub nt h a h n gt Wi d g e t , v i c p h nb v nh o t n gm t c c hc h n hx c . G i i t h c hl d ot i s a ot h a k t r o n gF r a mi s . c p pt C h n g1 3 s k h n g h o t n gc h n hx c . S a i F r a mi s . c p pt C h n g1 3 b n gc c hk t h a t F r a mi s v t or a p h i nb nm i c a mi v x a c h ol p d nx u t c a b n . C h n gmi n hr n gh l mv i c m t c c hc h n hx c .

Nc u n gc pm t c h i uh n gt c hg i a od i nt v i c t h c h i n , t c hn h n g t n h t h n o . a h n hc h op h p c i t h i nm t c h c v k h n n g c c n gn h v i c t or a c c m r n g c c c h n gt r n hc t h c " p h t t r i n " k h n gc h t r o n gv i c t or a b a n uc a d n , n h n gc n gc k h i c c t n hn n gm i c mo n gmu n . n gg i t or a c c k i ud l i um i b n gc c hk t h pc c c i mv h n hv i . K i ms o t t r u yc pp h nb i t g i a od i nt v i c t h c h i nb n gc c hl mc h oc c c h i t i t r i n gt . L o i t c h c c k h l mc h ot i n ht h ns n s n g m t n g i n o v i m t n nt n gl pt r n ht h t c . Nh n gc h c n n g o i p h v i t c hv l o i . T r o n g C h n g1 4 , b n b i t c c hk t h a c h op h p i ut r c a m t i t n gn h k i ur i n gc a m n hh o c l o i h n h c b nc a n . K h n n gn yl r t q u a nt r n gv n c h op h pn h i ul o i ( c n g u ng c t c c l o i c n gm t c s ) c i x n h t h c h n gl m t l o i , v m t m n hd u yn h t c a m l mv i c t r nt t c c c l o i k h c n h a un h n h a u . C h c n n g oc h op h pm t l o i t h h i ns k h c b i t c a m n ht m t , l o i t n gt , mi nl c h n g uc n g u ng c t c c l o i h n hc b nn h n h a u . S k h c b i t n y c t h h i nq u a s k h c b i t t r o n g h n hv i c a c c c h c n n gm b nc t h g i t h n gq u a c c l pc s . T r o n gc h n gn y , b ns t mh i uv c h c n n g o , b t ut n h n g i uc b nv i c c v d ng i nm t c i t t c m i t h n h n g" v i r t u a l n e s s " c a c h n gt r n h .

S p h t t r i nc at r n hC+ +
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 249/320

08/10/2013

Suy ngh trong C + +, Vol 1

L pt r n hCd n gn h c c C++t r o n gb a b c . ut i n , n h c h ng i nl m t " Ct t h n , " b i v C+ +b u c b np h i k h a i b ot t c c c c h c n n gt r c k h i s d n gc h n gv l p i c k i e r n h i uv c c hb i n c s d n g . B nt h n gc t h t mt h yn h n gl i t r o n gm t c h n gt r n hC ng i nb n gc c hb i nd c hn v i m t t r n hb i nd c hC++ . B c t h h a i l " i t n gd a t r n " C++ . i un yc n g h a l b nd d n gn h nt h yn h n gl i c ht c h c m c a n h m m t c ut r c d l i uc n gv i c c c h c n n gm h n h n gt h e on , g i t r c a x yd n gv h mh y , v c l m t s t h a k ng i n . H uh t c c l pt r n hv i n l mv i c v i Ct r o n gm t t h i g i a nn h a n hc h n gt h ys h u c hc a i un yb i v , b t c k h i n oh t or a m t t h v i n , i un yl c h n hx c n h n gg h c g n gl m. V i C+ + , b nc s t r g i pc a t r n hb i nd c h . B nc t h g pk h k h n c pd a t r n i t n gb i v b nc t h n h a n hc h n g t c i u v b ns c c r t n h i ul i c hm k h n gc nn l c t i n ht h nn h i u . Nc n gd d n g c mt h yn h b n a n gt or a c c k i ud l i ub nt h c h i nc c l ph c v c c i t n g , b ng i t i nn h nc h oc c i t n g , v m i t h ut t pv g n g n g . Nh n g n g b l a . N ub nd n gl i y , b n a n gb l p h nl nn h t c a n g nn g , l n h y l pt r n h o b j e c t o r i e n t e d n g . B nc t h l m i un yc h c c h c n n g o . C h c n n g on n gc a oc c k h i n i mv l o i t h a yv c h n gg i m b nt r o n gc ut r c v s a un h n gb c t n g , d o h k h n gc n g h i n g k h i n i mk h k h nn h t i v i C++l pt r n hm i h i u c . T u yn h i n , h c n gl b c n g o t t r o n gs h i ub i t v l pt r n hh n g i t n g . N ub nk h n gs d n gc h c n n g o , b nk h n gh i u OOP c n ur a . B i v c h c n n g o c r n gb u c m t t h i t v i c c k h i n i mv l o i , v l o i l c t l i c a l pt r n hh n g i t n g , k h n gc t n gt v i c h c n n g ot r o n gm t n g nn g t h t c t r u y nt h n g . L m t l pt r n ht h t c , b n k h n gc mc h n o s u yn g h v c h c n n g o , n h b nl mv i h uh t c c t n hn n gk h c t r o n gn g nn g . T n hn n gt r o n gm t n g nn g t h t c c t h c h i ut r nm t m c t h u t t o n , n h n gc c c h c n n g oc t h c h i uc h t m t q u a n i mt h i t k .

U p c a s t i n g

T r o n gc h n g1 4 , b nt h yl mt h n om t i t n gc t h c s d n gn h m t l o i r i n gc a m n hh o c n h m t i t n gc a l o i h n hc b nc a n . Ng o i r a , n c t h c t h a ot c t h n gq u a m t a c h c a c c l o i h n hc s . L y a c h c a m t i t n g( h o c m t c o nt r h o c t h a mc h i u ) v x l n n h l a c h c a c c l o i h n hc b n c g i l u p c a s t i n g v c c hc yt h a k c r t r a v i c c l pc s ut r a n g . B nc n gt h ym t v n p h t s i n h , c t h h i nt r o n g o nm s a u :

// :C 1 5 :I n s t r u m e n t 2 . c p p //T h ak &u p c a s t i n g#i n c l u d eu s i n gn a m e s p a c es t d ;e n u m{ l um i d d l e C ,c s h a r p , E f l a t }//v v l pC { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" C : :c h i "< <e n d l ; } } ; / it n g/g i l d n gc //b iv h c c n gm tg i a od i n : l pg i :C { p u b l i c : //X c n hl ic h cn n gg i a od i n : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" g i : :c h i "< <e n d l ; } } ; t r n g i uc h n h( C &i ){ //. . . i . p l a y( m i d d l e C ) ; } i n tm a i n( ){ s og i , i uc h n h( s o ) ;//U p c a s t i n g}// / :~

C h c n n g i uc h n h( ) c h pn h n( t h a mk h o ) m t c , n h n gc n gk h n gc k h i un i b t c i ug x u t p h t t c . T r o n gma i n( ) , b nc t h t h y i un yx yr a n h m t g i i t n g c t h n gq u a i uc h n h( ) , v i d nd i nv i nk h n gc nt h i t . i un yl c h pn h n c , g i a od i nt r o n gC p h i t nt i t r o n gg i , v g i c c n gk h a i t h a h n gt c . U p c a s t i n gt g i c c t h " t h uh p " m g i a od i n , n h n gk h n gb a og i t h ns ov i g i a od i n y d n gc . C n gm t i s l n gs t h t k h i i x v i c o nt r , s k h c b i t d u yn h t l n g i d n gp h i c m t c c hr r n g a c h c a i t n gk h i c h n g c t r u y nv oh m.

V n

V n v i I n s t r u me n t 2 . c p pc t h c n h nt h yb n gc c hc h yc h n gt r n h . ur a l c : : c h i . i un yr
250/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

r n gk h n gp h i l k t q u mo n gmu n , b i v b n b i t r n g i t n gt h c s l m t g i v k h n gc h l m t d n gc . C u c g i n ns nx u t g i : : c h i . C h or n gv n , b t k i t n gc a m t l pb t n g u nt c n n c p h i nb nc a v k c h( ) c s d n g , b t k t n hh n h . H n hv i c a I n s t r u me n t 2 . c p pl k h n g n gn g c n h i n , v i c c ht i pc nCc h c n n g . h i u c v n , b nc np h i n h nt h c c c c k h i n i mv l i nk t .

C h cn n gg i r n gb u c

K t n i m t c u c g i c h c n n gm t c q u a nc h c n n g c g i l r n g b u c . K h i r n gb u c c t h c h i n t r c k h i c h n gt r n h a n gc h y( c a t r n hb i nd c hv m i l i nk t ) , n c g i l ur n g b u c . B nc t h k h n gc n g h e n i t h u t n g t r c b i v n c h a b a og i l m t l a c h nv i c c n g nn g t h t c : t r n hb i n d c hCc h c m t l o i c h c n n gg i , v l ur n gb u c . C c v n t r o n gc h n gt r n ht r nl d o ur n gb u c b i v t r n hb i nd c hk h n gt h b i t c h c n n gc h n hx c g i k h i n c h c m t c a c h .

C c g i i p h p c g i l c u i r n g b u c , c n g h a l r n gb u c x yr a t r o n gt h i g i a nc h y , d a t r nc c l o i i t n g . R n gb u cc u i c n g c g i l n n g n gr n gb u c h a yr n gb u ct h i g i a nc h y. K h i m t n g nn g t h c h i nv oc u i r n gb u c , p h i c m t s c c h x c n hk i uc a i t n gt i t h i g i a nc h yv g i h mt h n h v i nt h c hh p . T r o n gt r n gh pc a m t n g nn g b i nd c h , t r n hb i nd c hv nk h n gb i t l o i i t n gt h c t , n h n gn c h nmmp h t h i nr av k ug i c c c q u a nc h c n n gc h n hx c . C c h c u i r n gb u c t h a y i t n g nn g nn g nn g , n h n gb nc t h t n gt n gr n gm t s l o i l o i t h n gt i np h i c c i t t r o n gc c i t n g . B ns t h yc c hl mv i c n ys a u . c h cn n g o G yr a v oc u i r n gb u c x yr a c h om t c h c n n gc t h , C++y uc ub ns d n got k h a k h i k h a i b oh mt r o n gl pc s . R n gb u c c u i c h x yr a v i oc h c n n g , v c h k h i b n a n gs d n gm t a c h c a l pc s , n i n h n goc h c n n gt nt i , m c d h c n gc t h c n hn g h a t r o n gm t l pc s t r c . t or a m t h mt h n hv i nn h o, b nc h c n t t r c k h a i b oc a h mv i t k h a o. C h k h a i b oc n ot k h a , k h n g n hn g h a . N um t h m c k h a i b ol ot r o n gl pc s , n l ot r o n gt t c c c l pd n x u t . X c n hl i m t oc h c n n gt r o n gm t l ph c c n g u ng c t h n g c g i l t r n g . C h r n gb nc h c nk h a i b om t h m ot r o n gl pc s . T t c c c c h c n n gc n g u ng c t l pp h h p v i c h k c a n g i k h a i b ol pc s s c g i l s d n gc c h o . B nc t h s d n got k h a t r o n gt k h a i n g u ng c t l p( n k h n gc h i l mn h v y ) , n h n gn l k h n gc nt h i t v c t h g yn h ml n . c c n h n gh n hv i mo n gmu nt I n s t r u me n t 2 . c p p, c h c nt h m ot k h a t r o n gc c l pc s t r c k h i c h i ( ) :


// :C 1 5 :I n s t r u m e n t 3 . c p p //R n gb u ct r v it k h a o #I n c l u d eu s i n gn a m e s p a c es t d ;e n u m{ l um i d d l e C ,c s h a r p ,C f l a t }//v v l pC { p u b l i c : v i r t u a lv o i dc h i( l u )c o n s t{ c o u t< <" C : :c h i "< <e n d l ; } } ; / it n g/g i l d n gc //b iv h c c n gm tg i a od i n : l pg i :C { p u b l i c : //G h i l ng i a od i nc h cn n g : c h it r n g( l u )c o n s t{ c o u t< <" g i : :c h i "< <e n d l ; } } ; t r n g i uc h n h( C &i ){ //. . . i . p l a y( m i d d l e C ) ; } i n tm a i n( ){ s og i , i uc h n h( s o ) ;//U p c a s t i n g }// / :~

T pt i nn yg i n gv i I n s t r u me n t 2 . c p pn g o i t r v i c b s u n gc c ot k h a , n h n gh n hv i n yl k h c n h a u n g k : B yg i ur a l g i : : c h i .

M r n g

V i p l a y( ) c n hn g h a l ot r o n gl pc b n , b nc t h t h mn h i ul o i m i n h b nmu nm k h n gt h a y i i uc h n h( ) c h c n n g . T r o n gm t c h n gt r n hh n g i t n g c t h i t k t t , h uh t h o c t t c c c c h c n n gc a b ns t h c h i nt h e omh n h i uc h n h( ) v c h g i a ot i pv i g i a od i nl pc s . M t c h n g t r n hn h v yl m r n g b i v b nc t h t h mc h c n n gm i b n gc c hk t h a k i ud l i um i t l pc s c h u n g . C c c h c n n gt h a ot c v i g i a od i nb a s e c l a s s s k h n gc np h i c t h a y i t t c t h c h n gv i c c l ph c m i .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 251/320

08/10/2013

Suy ngh trong C + +, Vol 1

D i yl v d c v i c c c h c n n g oh nv m t s l ph c m i , t t c ul mv i c m t c c hc h n hx c v i c i c , k h n gt h a y i i uc h n h( ) c h c n n g :
// :C 1 5 :I n s t r u m e n t 4 . c p p //K h n n gm r n gt r o n gO O P#i n c l u d eu s i n gn a m e s p a c es t d ;e n u m{ l um i d d l e C ,c s h a r p , C f l a t }//v v l pC { p u b l i c : v i r t u a lv o i dc h i( l u )c o n s t{ c o u t< <" C : :c h i "< <e n d l ; } oc h a r*g ( )c o n s t{ t r v " c " ; } //G i s n ys s a ic c it n g : v i r t u a lv o i d i uc h n h( i n t ){ } } ; l pg i :C { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" g i : :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" g i " ; } k h o n gt r n g i uc h n h( i n t ){ } } ; l pP e r c u s s i o n :C { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" B g : :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" B g " ; } k h o n gt r n g i uc h n h( i n t ){ } } ; l pD y :C { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" D y: :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" D y " ; } k h o n gt r n g i uc h n h( i n t ){ } } ; l p n gt h a ug i { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" B r a s s: :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" n gt h a u " ; } } ; l pW o o d w i n d :g i { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" W o o d w i n d: :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" W o o d w i n d " ; } } ; //C h cn n gg i n gh tn h a ut t r c : i uc h n hk h o n gt r n g( C &i ){ //. . . i . p l a y( m i d d l e C ) ; } //C h cn n gm i : v o i df( C &i ){ i . a d j u s t( 1 ) ; } //U p c a s t i n gt r o n gm n gk h it o : C *A[ ]={ g i m i , m iB g , b d ym i , B r a s sm i , } ; i n tm a i n( ){ G i t h is o ; B g t r n g ; V i o l o nd y ; n gf l u g e l h o r n ; g h iW o o d w i n d ; i uc h n h( s o ) ; c h n h ( t r n g ) , i uc h n h( v i o l i n ) , i uc h n h( f l u g e l h o r n ) ; i uc h n h( g h i m ) ; f( f l u g e l h o r n ) ; }/// :~

B nc t h t h ym t m c t h a k c t h mv ob nd i g i , n h n gn h n goc c h h o t n gc h n hx c d c b a on h i um c c . C c i uc h n h( ) c h c n n gl k h n g g h i c h o n gt h a uv B Hi Mc . K h i i un yx y r a , n hn g h a " g nn h t " t r o n gh t h n gp h nc pt h a k s t n gs d n gt r n hb i nd c h mb ol u nc m t s n hn g h a c h om t c h c n n g o , v v yb ns k h n gb a og i k t t h c v i m t c u c g i m k h n gl i nk t v i m t c q u a nc h c n n g . ( i u s l t h mh a . ) M n gA[ ] c h a c o nt r t i l pc s c , v v yu p c a s t i n gx yr a t r o n gq u t r n hk h i t om n g . M n gn yv c h c n n gf ( ) s c s d n gt r o n gc c c u c t h ol u ns a u . T r o n gc c c u c g i n i uc h n h( ) , u p c a s t i n g c t h c h i nt h e ot n gl o i k h c n h a uc a c c i t n g , n h n g h n hv i mo n gmu nl u nl u nd i nr a . i un yc t h c mt n h c c " g i m t t h n g i p nm t i t n g v c h op h pc c i t n gl ol n gv v i c p h i l mg v i n . " oc h c n n gl n gk n h s d n gk h i b n a n gc g n g p h nt c hm t d n : T r n gh pc c l pc s s x yr a , v l mt h n ob nc t h mu nm r n gc h n g t r n h ? T u yn h i n , n g a yc k h i b nk h n gp h t h i nr a c c g i a od i nl pc s v c h c n n g ov ov i c t or a b a n u c a c h n gt r n h , b ns t h n gx u y nk h mp h c h n gs a un y , n g a yc s a un y , k h i b n t r a m r n g h o c d u yt r c h n gt r n h . yk h n gp h i l m t l i p h nt c h , t h i t k , n c h ng i nc n g h a l b nk h n g h o c k h n gt h b i t t t c c c t h n gt i nl n ut i n . V m u nl pc h t c h t r o n gC++ , n k h n gp h i l m t


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 252/320

08/10/2013

Suy ngh trong C + +, Vol 1

v n l nk h i i un yx yr a v n h n gt h a y i b nt h c h i nt r o n gm t p h nc a m t h t h n gc x uh n g k h n g t u y nt r u y n nc c b p h nk h c c a h t h n gn h t r o n gC .

L mt h n oC + + t h ch i nv oc u i r n gb u c

L mt h n ov oc u i r n gb u c c t h x yr a ? T t c c c c n gv i c d i nr a n gs a uh ut r n gt r o n gt r n hb i n d c h , d n g c i t c c h c u i r n gb u c c nt h i t k h i b ny uc u( b nh i b n gc c ht or a c c c h c n n g o ) . V c c l pt r n ht h n g c h n gl i t s h i ub i t c c h c c c h c n n g ot r o n gC++ , p h nn ys g i i t h c h v c c ht r n hb i nd c ht h c h i nc c h n y . C c t k h a oc h ot r n hb i nd c hn k h n gn nt h c h i n ur n gb u c . T h a yv o , n s t n gc i t t t c c c c c h c nt h i t t h c h i nv oc u i r n gb u c . i un yc n g h a r n gn ub ng i p l a y( ) c h om t t h a u i t n gt h n g q u a m t a c h c h o c c c s n g c p d n gc , b ns n h n c c c c h c n n gp h h p . [ 5 1 ] t h c h i n i un y , t r n hb i nd c h i nh n h t or a m t b n gd u yn h t ( g i l v t a b l e ) c h om i l ph c c c h a oc h c n n g . T r n hb i nd c h t a c h c a c c c h c n n g oc h or n gl ph c c b i t t r o n gv t a b l e . T r o n g m i l ph c v i c c c h c n n g o , n b m t t m t c o nt r , c g i l v p o i n t e r ( v i t t t l V P T R ) , m c h v o v t a b l e c h o i t n g . K h i b nt h c h i nc u c g i c h c n n g ot h n gq u a m t c o nt r l pc s ( c n g h a l , k h i b nt h c h i nc u c g i a h n h ) , t r n hb i nd c hl n gl c h nm l yV P T Rv t mk i mc c a c h c h c n n gt r o n gv t a b l e , d o k ug i c c c h c n n gc h n hx c v g yr a v oc u i r n gb u c x yr a .

T t c i un yl pv t a b l e c h om i l p , k h i t oV P T R , c h nm c h oc c c u c g i c h c n n g os x yr a t n g , d o b nk h n gp h i l ol n gv n . V i c h c n n g o , c c c h c n n gp h h p c g i l c h om t i t n g , n g a yc k h i t r n hb i nd c hk h n gt h b i t c l o i h n hc t h c a i t n g . C c p h ns a u i v oq u t r n hn ym t c c hc h i t i t h n .

L ut r c cl o i t h n gt i n
B nc t h t h yr n gk h n gc t h n gt i nl o i r r n g c l ut r t r o n gb t k c a c c l ph c . Nh n gc c v d t r c , v l o g i c ng i n , c h ob nb i t r n gp h i c m t s l o i l o i t h n gt i n c l ut r t r o n gc c i t n g , n u k h n gl o i k h n gt h c t h n hl pt r o n gt h i g i a nc h y . i un yl n g , n h n gn h n gt h n gt i nk i ul n . x e mn , yl m t v d k i mt r a c c k c ht h c c a c c l ph c s d n gc c c h c n n g os ov i n h n g n g i k h n g :
// :C 1 5 :S i z e s . c p p // it n gk c ht h cc /k h n gc c h cn n g o #I n c l u d eu s i n gn a m e s p a c es t d ; l pN o V i r t u a l{ i n ta ;c n gc n g : v h i ux( )c o n s t{ } i n ti( )c o n s t{ r e t u r n1 ; } } ; l pO n e V i r t u a l{ i n ta ;c n gc n g : v i r t u a lv o i dx( )c o n s t{ } i n ti( )c o n s t{ r e t u r n1 ; }} ; l p T w o V i r t u a l s{ i n ta ;c n gc n g : v i r t u a lv o i dx( )c o n s t{ } oi n ti( )c o n s t{ r e t u r n1 ; } } ; i n tm a i n( ){ c o u t< <" i n t : "< <s i z e o f( i n t )< <e n d l ; c o u t< < " N o V i r t u a l : " < <S i z e o f( N o V i r t u a l )< <e n d l ; c o u t< <" v o i d* : "< <s i z e o f( v o i d* )< <e n d l ; c o u t< <" O n e V i r t u a l : " < <S i z e o f( O n e V i r t u a l )< <e n d l ; c o u t< <" T w o V i r t u a l s : " < <S i z e o f( T w o V i r t u a l s )< <e n d l ; }/// :~

K h n gc c h c n n g o , k c ht h c c a c c i t n gl c h n hx c n h n gg b nmo n gmu n : k c ht h c c a m t n [ 5 2 ] i n t . V i c h c n n g ot r o n gOn e V i r t u a l , k c ht h c c a c c i t n gl k c ht h c c a No V i r t u a l c n gv i k c h t h c c a m t k h o n gt r n gc o nt r . Nc h r a r n gc h nc c t r n hb i nd c hm t c o nt r d u yn h t ( V P T R ) v oc u t r c n ub nc m t h o c n h i uc h c n n g o . K h n gc s k h c b i t k c ht h c g i a On e V i r t u a l v T wo V i r t u a l s . l b i v c c i mV P T Rv om t b n gc c a c h c h c n n g . B nc h c nm t b n gb i v t t c c c a c h c h c n n g o c c h a t r o n gb n g . V d n yy uc u t n h t m t t h n hv i nd l i u . N u c k h n gt h n hv i nd l i u , C++ , t r n hb i nd c hs b u c c c i t n gl m t k c ht h c k h c k h n gb i v m i i t n gp h i c m t a c h r i n gb i t . N ub nt n gt n g n hc h m c v om t m n gc c i t n gk h n gc k c ht h c , b ns h i u . M t " g i " t h n hv i n c a v o i t n gm n uk h n gs l k h n gn h . K h i n h n gt h n gt i nk i u c c h nv ot k h a , i un yc nc v t r c a " g i " t h n hv i n . C g n gc h ok i nr a i n t mt t r o n gt t c c c l pt r o n gv d t r n t h y i un y .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

253/320

08/10/2013

Suy ngh trong C + +, Vol 1

H n hd u n gc h cn n g o
h i uc h n hx c n h n gg a n gx yr a k h i b ns d n gm t h m o , n r t h u c h h n hd u n gc c h o t n g x yr a n gs a ub c m n . D i yl m t b nv c a c c m n gc a c o nt r A[ ] t r o n gI n s t r u me n t 4 . c p p: M n gC c o nt r k h n gc t h n gt i nl o i h n hc t h , h m i i m nm t i t n gc a l o i d n gc . g i , b g , b d y, v n gt h a ut t c p h h pv ot h l o i n yb i v h c n g u ng c t c ( v d o c g i a od i nt n g t n h c , v c t h t r l i n h n gt h t n gt ) , v v y a c h c a h c n gc t h c t v om n g . T u yn h i n , t r n hb i nd c hk h n gb i t r n gh l b t c i ug n h i uh nc i t n g , v v y l i c h oc c t h i t b r i n gc a m n hb n ht h n gs g i p h i nb nl pc s c a t t c c c c h c n n g . Nh n gt r o n gt r n gh pn y , t t c n h n g c h c n n g c k h a i b ov i ot k h a , d o m t c i g k h c n h a ux yr a . M i k h i b nt or a m t l pc c h a h m o , h o c b nl y c t m t l pc c h a h m o , t r n hb i nd c ht or a m t v t a b l e d u yn h t c h ol p , n h nt h yt r nb np h i c a b i u . T r o n gb n gm n t a c h c a t t c c c c h c n n g c k h a i b o ot r o n gl pn yh o c t r o n gl pc s . N ub nk h n gg h i l nm t c h c n n gm c t u y nb o t r o n gl pc s , t r n hb i nd c hs d n g a c h c a c c p h i nb nc s h n gn h t t r o n gl pd nx u t . ( B nc t h t h y i un yt r o n g i uc h n hm c t r o n gt h a uv t a b l e . ) S a u n t V P T R( p h t h i nt r o n gS i z e s . c p p) v ol p . C h c m t V P T Rc h ot n g i t n gk h i s d n gt h a k ng i nn h t h n y . C c V P T Rp h i c k h i t o t r n a c h b t uc a v t a b l e t h c hh p . ( i un yx yr a t r o n gc c n h x yd n g , t r o n g b ns t h ys a un ym t c c hc h i t i t h n . ) K h i V P T R c k h i t ov i v t a b l e t h c hh p , c c i t n gc h i ul c " b i t " n h n gg n l l o i . Nh n g i un yt k i n t h c l v g i t r t r k h i n c s d n gt i t h i i m m t c h c n n g o c g i . K h i b ng i m t h m ot h n gq u a m t a c h l pc s ( c c t n hh u n gk h i t r n hb i nd c hk h n gc t t c c c t h n g t i nc nt h i t t h c h i n ur n gb u c ) , m t c i g c b i t x yr a . T h a yv t h c h i nm t c u c g i c h c n n g i n h n h , m c h ng i nl m t h i n gn g nn g C A L L nm t a c h c t h , t r n hb i nd c ht or a m k h c n h a u t h c h i nc c c u c g i c h c n n g . yl n h n gg m t c u c g i i uc h n h( ) c h om t t h a u i t n gn h t h n o , n u c t h c h i nt h n gq u a m t d n gc c o nt r ( M t c t h a mk h oc h or a k t q u t n gt ) :
C B r a s svtable:

T r n hb i nd c hb t uv i c c c c o nt r , t r t i a c h b t uc a i t n g . T t c c c d n gc c c i t n gh o c i t n gc n g u ng c t c c V P T Rc a h t r o n gc n gm t v t r ( t h n gv o uc a i t n g ) , n nt r n hb i n d c hc t h c h nV P T Rr a k h i i t n g . C c i mV P T R n a c h b t uc a v t a b l e . T t c c c a c h c h c n n g v t a b l e c t r n hb yt h e ot h t , k h n gp h t h u c v ol o i h n hc t h c a i t n g . c h i ( ) l l n ut i n , n h n g g ( ) l l nt h h a i , v i uc h n h( ) l t h b a . T r n hb i nd c hb i t r n gb t k l o i i t n gc t h , c c i uc h n h( ) c h c n n gl v t r V P T R2 . D o , t h a yv n i , " G i h m v t r t u y t i c : : a d j u s " ( ur n gb u c , s a i t h n h n g ) , n s t or a m m n i , c h i ul c , " G i h ms t i V P T R2 . " B i v s n c a V P T Rv v i c x c n h a c h c h c n n gt h c t x yr a t r o n gt h i g i a nc h y , b ns c c n h n gn mc u i mo n gmu nr n gb u c . B ng i m t t h n g i pt i c c i t n g , v i t n gh i ur a n h n gg l mv i n .

D i mu i x e
Nc t h h u c h x e m m l pr pn g nn g t or a b i m t c u c g i c h c n n g o , v v yb nc t h t h yr n g c u i r n gb u c t h c s d i nr a . yl ur a t m t t r n hb i nd c hc h oc c c u c g i
i . a d j u s t( 1 ) ;

b nt r o n gh mf ( C &i : )
y 1 y s im o v t h m s p ,4 b x ,t p t r[ s i ]c u cg i t p t r[ b x4 ]

C c i s c a m t C++c h c n n gg i , n h m t c u c g i c h c n n gC , c yv os t a c kt p h i s a n gt r i ( t h e o t h t n yl c nt h i t h t r d a n hs c h i s b i nC ) , v v y i s 1 c yv os t a c k ut i n . T i t h i i mn yt r o n gc h c n n g , n gk s i ( m t p h nc a k i nt r c b v i x l I n t e l X 8 6 ) c h a a c h c a t i . i un y c n g c yv os t a c kv n l a c h b t uc a c c i t n gq u a nt m. H yn h r n g a c h b t ut n g n gv i g i t r n y, v i un y a n gl n gl yv os t a c kn h m t t h a ms t r c k h i t t c c c t h n hv i nn n g c u c g i , v v yc h c n n gt h n hv i nb i t m c t h i t n g a n gl mv i c t r n . V v y , b ns l u nl u nn h nt h ym t n h i uh ns l n gc c i s yv os t a c kt r c k h i m t c h c n n gg i t h n hv i n( t r t n hc h c n n gt h n hv i n , t r o n g c k h n gn y) . B yg i t h c t og i c h c n n gp h i c t h c h i n . ut i n , V P T Rp h i c s nx u t , v v yv t a b l ec t h c t mt h y . i v i t r n hb i nd c hn yV P T R c c h nv o uc a i t n g , v v yn i d u n gc a i un yt n g n gv i c c V P T R . D n gm o vb x ,t p t r[ s i ]
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 254/320

08/10/2013

Suy ngh trong C + +, Vol 1

t mn pt s i ( c n g h a l , n y) i m, l V P T R . N t V P T Rv os n gk b x . C c V P T Rc h a t r o n gb x i m n a c h b t uc a v t a b l e , n h n gc o nt r c h c n n g g i k h n gp h i l v t r s k h n gc a v t a b l e , n h n gt h a yv t i v t r h a i ( b i v n l c h c n n gt h b a t r o n gd a n hs c h ) . i v i mh n hb n h n ym i c o nt r c h c n n gl d i h a i b y t e , d o t r n hb i nd c ht h mb n nV P T R t n ht o nn i a c h c a c c c h c n n gp h h pl . L ur n g yl m t g i t r k h n g i , c t h n hl pt i t h i g i a nb i nd c h , d o , i u d u yn h t q u a nt r n gl c o nt r c h c n n g v t r s h a i l m t t r o n gc h o i uc h n h( ) . Ma ym nt h a y , c c t r n hb i n d c hs c h ms c c a t t c c c s s c hk t o nc h ob nv mb or n gt t c c c c o nt r c h c n n gt r o n gt t c c c v t a b l e s c a m t h t h n gp h nc pl ph c c b i t x yr a t r o n gc n gm t t h t , k h n gp h t h u c v ot h t m b n c t h g h i l nc h n gt r o n gc c l pt h a k . M t k h i a c h c a c o nt r c h c n n gp h h pt r o n gv t a b l e c t n ht o n , c h c n n g c g i l . V v y , a c h c l yv k ug i t t c c n gm t l c t r o n gb oc ok t q u c u cg it p t r[ b x4 ] C u i c n g , c o nt r n g nx p c c h u y nt r l i l ms c hk h i c c i s c yt r c k h i c u c g i . T r o n gC v C++m l pr pb nt h n gs t h yn g i g i l ms c hk h i c c i s n h n g i un yc t h t h a y i t yt h u c v ob v i x l v t r i nk h a i t h c h i nb i nd c h .

C i tv p o i n t e r
V V P T Rx c n hh n hv i c h c n n g oc a i t n g , b nc t h t h y l q u a nt r n gr n gV P T Rl u nl u n c t r nv t a b l e t h c hh p . B nk h n gb a og i mu n c t h t h c h i nc u c g i nm t c h c n n g ot r c k h i V P T R c k h i t o n gc c h . T t n h i n , n i k h i t oc t h c mb ol t r o n gc c n h x yd n g , n h n g k h n ga i t r o n gs c c c v d c m t n h x yd n g . yl n i s n gt oc a c c n h x yd n gm c n hl i uc nt h i t . T r o n gC v d , t r n hb i nd c ht or a m t c o n s t r u c t o r m c n hm k h n gl mg n g o i t r k h i t oV P T R . X yd n gn y , t t n h i n , c t n gg i c h o t t c c c d n gc i t n gt r c k h i b nc t h l mb t c i ug v i h , b nb i t r n gn l u nl u na nt o n g i c h c n n g o . Nh n gt c n gc a v i c k h i t ot n gc a V P T Rt r o n gc c n h x yd n gs c t h ol u nt r o n gp h ns a u .

i t n gk h cn h a u
i uq u a nt r n gl n h nr a r n gg i a od c hu p c a s t i n gc h c a c h . N ut r n hb i nd c hc m t i t n g , n b i t c c l o i c h n hx c v d o ( t r o n gC++ ) s k h n gs d n gv oc u i r n gb u c i v i b t k c u c g i c h c n n gh o c t n h t , t r n hb i nd c hk h n gc ns d n gv oc u i r n gb u c . V l i c hh i uq u , h uh t c c t r n hb i nd c h s t h c h i nk t n i s mk h i h a n gt h c h i nm t c u c g i nm t c h c n n g oc h om t i t n gb i v h b i t c h n hx c l o i . yl m t v d :
// :C 1 5 :E a r l y . c p p // ur n gb u cv c h cn n g o #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; l pP e t{ p u b l i c : c h u i on i( )c o n s t{ r e t u r n" " ; } } ; c l a s sD o g :P e t{ p u b l i c : c h u in i( )c o n s t{ r e t u r n" B a r k ! " ; } } ; i n tm a i n( ){ D o gr a l p h ; V tn u i*p 1=& r a l p h ; V tn u i&p 2=r a l p h ; P 3v tn u i ; //R n gb u ct r c h oc h a i : c o u t< <" p 1 >n i( )= "< <p 1 >n i( )< <e n d l ; c o u t< <" p 2 . s p e a k( )= "< <p 2 . s p e a k( ) < <e n d l ; // ur n gb u c( c t h ) : c o u t< <" p 3 . s p e a k( )= "< <p 3 . s p e a k( )< <e n d l ; } /// :~

T r o n gp 1 >n i ( ) v p 2 . s p e a k( ) , a c h c s d n g , c n g h a l t h n gt i nk h n g y : p 1 v p 2 c t h i d i nc h o a c h c a m t v t n u i h o c m t c i g c n g u ng c t v t n u i , v v yc c h op h i c s d n g . K h i g i p 3 . s p e a k( ) k h n gc s m h . T r n hb i nd c hb i t l o i c h n hx c v r n gn l m t i t n g , v v yn c t h k h n gc t h l m t i t n gc n g u ng c t v t n u i l c h n h x c m t v t n u i . D o , u r n gb u c l c t h s d n g . T u yn h i n , n ut r n hb i nd c hk h n gmu nl mv i c k h k h nn h v y , n v nc t h s d n gv oc u i r n gb u c v c c h n hv i t n gt s x yr a .

T i s a oc h cn n g o ?
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

L c n y , b nc t h c m t c uh i : " N uk t h u t n yl r t q u a nt r n g , v n un l mc h o " n g" c h c n n gg i t t c c c t h i g i a n , l d ot i s a on l m t l a c h n ? T i s a ot i t h mc h c np h i b i t v n ? " yl m t c uh i h a y , v c ut r l i l m t p h nc a t r i t l c b nc a C++" . B i v n k h n gp h i l k h h i u


255/320

08/10/2013

Suy ngh trong C + +, Vol 1

q u " B nc t h n h nt h yt s nl n gl pr pn g nn g t r c t h a yv m t c u c g i ng i n nm t a c h t u y t i , c h a i p h c t ph nh n gd nl pr pc nt h i t t h i t l pc u c g i c h c n n g o . i un y i h i c h a i m k h n gg i a nv t h i g i a nt h c h i n . M t s n g nn g h n g i t n g t h c h i np h n gp h pm c u i r n gb u c l n i t i l pt r n hh n g i t n gm n l u nl u nx yr a , n k h n gp h i l m t l a c h n , v n g i s d n gk h n gc np h i b i t v n . yl [ 5 3 ] m t q u y t n ht h i t k k h i t or a m t n g nn g , v c o n n g c b i t l t h c hh pc h on h i un g nn g . T u y n h i n , C++x u t p h t t d i s nC , m h i uq u l r t q u a nt r n g . S a uk h i t t c , C c t or a t h a yt h n g n n g l pr pc h ov i c t h c h i nm t h i uh n h( d o k h i nh i uh n hU n i x x a t i nh ns ov i n g i t i n n h i mc a n ) . M t t r o n gn h n gl d oc h n hc h ov i c p h t mi n hc a C++l l mc h oc c l pt r n hCh i uq u h n . [ 5 4 ] V c uh i ut i nk h i l pt r n hCg pp h i C++ , " s t i n h n c g l o i k c ht h c v t c n gt c ? " N u c ut r l i l " M i t h ut u y t v i n g o i t r c h oc c c u c g i c h c n n gk h i b ns l u nl u nc m t c h t c h i p h t h m, " n h i un g i s g nb v i Cc h k h n gp h i t h c h i nt h a y i C++ . Ng o i r a , c h c n n gn i t u y ns k h n g c t t , b i v c h c n n g op h i c m t a c h a v ov t a b l e . V v y , c c c h c n n g ol m t l a c h n , v g i t r m c n hn g nn g n o n v i r t u a l , l c uh n hn h a n hn h t . S t r o u s t r u pn i r n gh n gd nc a n g , " N u b nk h n gs d n gn , b nk h n gt r t i nc h on . " Nh v y , ot k h a c c u n gc p i uc h n hh i uq u . K h i t h i t k c c l ph c c a b n , t u yn h i n , b nk h n g n nl ol n gv i uc h n hh i uq u . N ub n a n gs d n g a h n h , s d n gc c c h c n n g o k h pm i n i . B nc h c nt mk i mc c c h c n n gc t h c t h c h i nk h n g ok h i t mk i mn h n gc c h t n gt c m c a b n( v t h n gc l i n h u nl nh nn h i u c c t r o n gc c l n hv c k h c m t h s t t s l m m t c n gv i c t t h nc a v i c t mk i mt c n g h nh nb ns b n gc c hd o n ) . B n gc h n gc h ot h yr n gk c ht h c v t c t c n gc a i v i C++l t r o n gv n g1 0 p h nt r mc a k c h t h c v t c c a C , v t h n gr t g nv i n h a u . L d ob nc t h n h n c k c ht h c t t h nv h i uq u t c l b i v b nc t h t h i t k m t c h n gt r n hC+t r o n gm t c c hn h a n hh nn h h nb ns s d n gC .

L pc s t r ut n gv c h cn n gt h u n o

T h n gt r o n gm t t h i t k , b nmu nc c l pc s t r n hb yc h m t g i a od i nc h oc c l ph c c a n c n g u ng c . C n g h a l , b nk h n gmu nb t c a i t h c s t or a m t i t n gc a l pc s , c h u p C a s t v o n g i a od i nc a n c t h c s d n g . N y c t h c h i nb n gc c hl mc h ol ph c t r ut n g , m s x yr a n ub nc h on t n h t m t c h c n n g t h u no . B nc t h n h nr a m t h m ot h u n t u v n s d n got k h a v t h e os a ul =0 . N ua i c g n g l mc h om t i t n gc a m t l pt r u t n g , t r n hb i nd c hn g nc nh . yl m t c n gc c h op h pb nt h c t h i m t t h i t k c b i t . K h i m t l pt r ut n g c t h a k , t t c c c c h c n n g ot i n hk h i t p h i c t h c h i n , h o c l pk t h a t r n nt r ut n gl t t . T or a m t c h c n n gt h u n oc h op h pb n t m t h mt h n hv i nt r o n gm t g i a od i n m k h n gb b u c p h i c u n gc pm t c t h c t h v n g h a c a m c h or n gc h c n n gt h n hv i n . n gt h i , m t l c l n gc h c n n gt h u n ok t h a c c l ph c c u n gc pm t n hn g h a c h on . T r o n gt t c c c v d c , c c c h c n n gt r o n gl pc s c l l u nl u n" g i " c h c n n g . N uc c c h c n n gn y b a og i c g i l , c i g l s a i . l b i v m c c hc a c l t or a m t g i a od i nc h u n gc h ot t c c c l p

t h h i nk h c n h a uc h om i p h nn h mk h c n h a u . Nt or a m t h n ht h c c b nx c n hn h n gg l i mc h u n g v i t t c c c l ph c c n g u ng c k h n gc g k h c . V v y , c l m t n gc v i nt h c hh p c m t l pt r u t n g . B nt or a m t l pt r ut n gk h i b nc h mu nt h a ot c m t t pc c l pt h n gq u a m t g i a od i nc h u n g , n h n gg i a od i nc h u n gk h n gc np h i c m t t h c h i n( h o c t n h t , t h c h i n y ) . N ub nc m t k h i n i mn h c l mv i c n h m t t r ut n gl p , i t n gc a l pm h un h l u nl u nk h n g c n g h a . l , C c n g h a l t h h i nc h c g i a od i n , v k h n gp h i l m t t h c h i nc t h , d o t or a m t i t n gm c h l m t d n gc l mc h ok h n gc n g h a , v c t h b ns mu nn g nc h nn g i d n gl mv i c . i un yc t h c t h c h i nb n gc c hl mc h ot t c c c c h c n n g ot r o n gC t h n gb ol i i n n , n h n gs c h mt r s x u t h i nc a c c t h n gt i nb ol i c h o nk h i t h i g i a nc h yv n i h i k i mt r a t o nd i n n gt i nc yt r nm t p h n c a n g i s d n g . Nl t t h n n mb t n h n gv n t h i g i a nb i nd c h . yl c p h p c s d n gc h om t t u y nb t h u n o : v i r t u a lv o i df( )=0 ; B n gc c hn y , b nc h ot r n hb i nd c h d t r m t k h e c mc h om t c h c n n gt r o n gv t a b l e , n h n gk h n g a m t a c h t r o n g v n gc t h . Ng a yc k h i c h c m t c h c n n gt r o n gm t l ph c c k h a i b ol ot i n hk h i t , c c v t a b l e l k h n g y . N uv t a b l e c h om t l ph c k h n g y , t r n hb i nd c hp h i l mg k h i a i c g n g l mc h om t i t n g c a l p l n h n gg ? Nk h n gt h t or a m t c c ha nt o nm t i t n gc a m t l pt r ut n g , d o , b nn h n
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 256/320

08/10/2013

Suy ngh trong C + +, Vol 1

c m t t h n gb ol i t c c t r n hb i nd c h . D o , t r n hb i nd c h mb o t i n hk h i t c a l pt r ut n g . B n g c c hl mc h om t l pt r ut n g , b n mb or n gc c l pt r n hk h c hh n gk h n gc t h l md n gn . yl I n s t r u me n t 4 . c p ps a i s d n gc h c n n gt h u n o . V l pk h n gc g n h n gc h c n n g ot i n hk h i t , c h n gt i g i n l m t l p t r ut n g t i n h k h i t :
// :C 1 5 :I n s t r u m e n t 5 . c p p //L pc s t r ut n gt i n hk h i t#i n c l u d eu s i n gn a m e s p a c es t d ;e n u m{ l um i d d l e C , c s h a r p ,C f l a t }//v v l pC { p u b l i c : //C h cn n g ot i n hk h i t : v i r t u a lv o i dc h i( l u )c o n s t=0 ; oc h a r*g ( )c o n s t=0 ; //G i s n ys s a ic c it n g : v i r t u a lv o i d i uc h n h( i n t )=0 ; } ; //P h nc nl ic at pt i nl n h n h a u. . . l pg i :C { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" g i : :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" g i " ; } k h o n gt r n g i uc h n h( i n t ){ } } ; l pP e r c u s s i o n :C { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" B g : :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" B g " ; } k h o n gt r n g i uc h n h( i n t ){ } } ; l pD y :C { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" D y: :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" D y " ; } k h o n gt r n g i uc h n h( i n t ){ } } ; l p n gt h a ug i { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" B r a s s: :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" n gt h a u " ; } } ; l pW o o d w i n d :g i { p u b l i c : k h o n gt r n gc h i( l u )c o n s t{ c o u t< <" W o o d w i n d: :c h i "< <e n d l ; } c h a r*g ( )c o n s t{ r e t u r n" W o o d w i n d " ; } } ; //C h cn n gg i n gh tn h a ut t r c : i uc h n hk h o n gt r n g( C &i ){ //. . . i . p l a y( m i d d l e C ) ; } //C h cn n gm i :v o i df( C &i ){ i . a d j u s t( 1 ) ; } i n tm a i n( ){ G i t h is o ; B g t r n g ; V i o l o nd y ; n gf l u g e l h o r n ; g h iW o o d w i n d ; i uc h n h( s o ) ; c h n h ( t r n g ) , i uc h n h( v i o l i n ) , i uc h n h( f l u g e l h o r n ) ; i uc h n h( g h i m ) ; f( f l u g e l h o r n ) ; }/// :~

C h c n n gt h u n ol h u c hb i v h l ms n gt n h n gt n ht r ut n gc a m t l pv c h oc n g i d n gv c c t r n hb i nd c hn h t h n on c d n h c s d n g . L ur n gc h c n n g ot i n hk h i t n g nc h nm t l pt r ut n gt c c h u y nv om t c h c n n gt h e o g i t r . D o , n c n gl m t c c h n g nc h n i t n g c t ( s c mt m t t h i g i a nn g n ) . B n gc c hl mc h om t l p t r ut n g , b nc t h mb or n gm t c o nt r h o c t h a mc h i ul u n c s d n gt r o n gu p c a s t i n g nl p . C h v m t c h c n n g ot i n hk h i t n g nc nv t a b l e t h h o nt h n hk h n gc n g h a l b nk h n gmu nc q u a nc h c n n gc h om t s n g i k h c . T h n gt h b ns mu ng i m t p h i nb nc s n gc pc a m t c h c n n g , n g a yc k h i n l o . Nl u nl u nl m t t n gt t t m c h u n gc n gg nc n gt t v ot h m c g c c a h t h n gp h n c pc a b n . K h n gc h k h n gg i a nl um n y , n c h op h pt r u y nd d n gt h a y i .

n hn g h at h u n o
Nc t h c u n gc pm t n hn g h a c h om t c h c n n gt h u n ot r o n gl pc s . B nv nn i v i t r n hb i nd c h k h n gc h op h pc c i t n gc a l pc s t r ut n g , v c c c h c n n g ot i n hk h i t v np h i c x c n h t r o n gc c l pt h a k t oc c i t n g . T u yn h i n , c t h c m t p h nc h u n gc a m m b nmu nc m t s h o c t t c c c n hn g h a l pd nx u t g i c h k h n gp h i s a oc h pm t r o n gm i c h c n n g . yl n h n gg m t n hn g h a t h u n ot r n gg i n gn h :
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 257/320

08/10/2013

Suy ngh trong C + +, Vol 1

// :C 1 5 :P u r e V i r t u a l D e f i n i t i o n s . c p p // n hn g h ac s ot i n hk h i t #I n c l u d eu s i n gn a m e s p a c es t d ; l pP e t{ p u b l i c : v i r t u a lv o i dn i( )c o n s t=0 ; v i r t u a lv o i d n( )c o n s t=0 ; //I n l i n e n hn g h at h u n ob th pp h p : // ! v i r t u a lv o i dg i cn g ( )c o n s t=0{ } } ; //O K ,k h n g c n hn g h ai n l i n ev o i dP e t: : n( )c o n s t{ c o u t< < " P e t: : n( ) "< <e n d l ; } t r n gP e t: :n i( )c o n s t{ c o u t< <" P e t: :n i( ) "< <e n d l ; } c l a s sD o g :P e t{ p u b l i c : //S d n gm m a n gt h e ov tn u ip h b i n : l mm th i ul cn i( )c o n s t{ P e t: :n i( ) ; } t r n g n( )c o n s t{ P e t: : n ( ) ; } } ; i n tm a i n( ){ C h s i m b a ; //R i c h a r dc o nc h s i m b a . s p e a k( ) ; s i m b a . e a t( ) ; }/ // :~

K h e t r o n gP e t v t a b l e v nc nt r n gr n g , n h n gc x yr a l m t c h c n n gc a t n m b nc t h g i i n t h o i t r o n gl pd nx u t . C c l i c hk h c t n hn n gn yl n c h op h pb nt h a y i t m t ob n ht h n g nm t ot i n hk h i t m k h n gl mp h i nc c m h i nc . ( yl m t c c h b nc t h x c n hv t r c c l ph c m k h n gg h i l n r n gc h c n n g o . )

T h ak v v t a b l e

B nc t h t n gt n gn h n gg s x yr a k h i b nt h c h i nk t h a v g h i l nm t s c h c n n g o . T r n h b i nd c ht or a m t v t a b l e m i c h oc c l ph c m i c a b n , v n c h nc h c n n gm i g i i q u y t b n gc c hs d n g a c h c h c n n gl pc s c h ob t k c h c n n g ob nk h n gg h i l n . C c hn yh a yc c hk h c , c h om i i t n gc t h c t or a ( c n g h a l , c c l ph c k h n gc i u ot i n hk h i t ) l u nl u nc m t b y c c c h c n n g a c h t r o n gv t a b l e , v v yb ns k h n gb a og i c t h t h c h i nc u c g i nm t a c h l k h n gc ( t r o n g s l t h mh a ) . Nh n gn h n gg x yr a k h i b nk t h a v b s u n gc h c n n g om i t r o n gn g u ng c l ph c ? D i yl m t v d ng i n :

// :C 1 5 :A d d i n g V i r t u a l s . c p p //T h m i u ot r o n gn g u ng c #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; l pP e t{ c h u iP N A M E ,c n gc h n g : V tn u i( c o n s ts t r i n g&p e t N a m e ) :P N A M E( p e t N a m e ){ } t nc h u i o( )c o n s t{ P N A M Et r l i ; } c h u i on i( )c o n s t{ r e t u r n" " ; } } ; c l a s sD o g :P e tc n g{ s t r i n gn a m e ;c n gc n g : C o nc h ( c o n s ts t r i n g&p e t N a m e ) :P e t( p e t N a m e ){ } /c h cn n g o/m it r o n gl pD o g : n g i( )c h u i oc o n s t{ t r l im a n gt h e ov tn u i: :t n( )+" n g i " ; } c h u in i( )c o n s t{ //G h i t r l im a n gt h e ov tn u i: :t n( )+ " n i : "B a r k !' " ; } } ; i n tm a i n( ){ V tn u i*p[ ]={ m im a n gt h e ov tn u i( " c h u n gc h u n g " ) ,C nm i( " b o b " ) } ; c o u t< <" p [ 0 ]>n i( )= "< <p[ 0 ]>n i( )< <e n d l ;c o u t< <" p[ 1 ]>n i( )= "< <p[ 1 ]>n i( ) < <e n d l ; // !c o u t< <" p[ 1 ]>n g i( )= " !// < <p[ 1 ]>n g i( )< <e n d l ;//b th pp h p }/// :~

L pv t n u i c c h a m t h a i c h c n n g o : n i ( ) v t n( ) . Do gt h m m t c h c n n gt h b a c g i l on g i ( ) , c n gn h t r n gn g h a c a n i ( ) . M t s s g i pb nh n hd u n gn h n gg a n gx yr a . D i yl n h n g v t a b l e s c t or a b i t r n hb i nd c hc h ov t n u i v c o nc h :

C h r n gc c b n t r n hb i nd c hv t r c a n i ( ) a c h c h n hx c v oc n gm t c h c h v t a b l e n h n a n g t r o n gP e t v t a b l e . T n gt n h v y , n um t l pP u g c t h a k t c h , p h i nb nc a n g i ( ) s c t t r o n g
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 258/320

08/10/2013

Suy ngh trong C + +, Vol 1

v t a b l e c a n t r o n gc h n hx c c n gm t c h n h c h . i un yl d o( n h b n t h yv i v d a s s e mb l y l a n g u a g e ) t r n hb i nd c ht or a m c s d n gm t s ng i nb pv ov t a b l e c h nc h c n n g o . K h n gp h t h u c v o k i up h c t h c c i t n gt h u c v , v t a b l e c a n c t r a t h e oc n gm t c c h , v v yc c c u c g i nc c c h c n n g os l u nl u n c t h c h i nt h e oc n gm t c c h . T r o n gt r n gh pn y , t u yn h i n , t r n hb i nd c h a n gl mv i c c h v i m t c o nt r nm t i t n gl pc s . C c l pc s c h n i c h u y n( ) v t n( ) c h c n n g , d o , n h n gl c c c h c n n gc h t r n hb i nd c hs c h op h pb n g i . L mt h n oc t h n c t h b i t r n gb n a n gl mv i c v i m t c o nc h i t n g , n un c h c m t c o nt r nm t i t n gl pc s ? c o nt r c t h t r nm t s l o i k h c , m k h n gc m t n g i ( ) c h c n n g . Nc t h h o c k h n gt h c m t s a c h c h c n n gk h c t i t h i i m t r o n gv t a b l e , n h n gt r o n gc h a i t r n gh p , t h c h i nc u c g i o n a c h v t a b l e k h n gp h i l n h n gg b nmu nl m. V v y , c c b i nd c hl l mc n gv i c c a m n hb n gc c hb ov b nt h c h i nc u c g i o c c c h c n n gm c h t nt i t r o n gc c l pt h a k . C m t s t r n gh p t p h b i nm b nc t h b i t r n gc o nt r t h c s c h nm t i t n gc a m t l pc o nc t h . N ub nmu ng i m t c h c n n gm c h t nt i t r o n gl pc o n , s a u b np h i pc o nt r . B nc t h l o i b c c t h n gb ol i c s nx u t b i c c c h n gt r n ht r c n h t h n y :
( ( C h * )p[ 1 ] )>n g i( )

T i y , b n b i t r n gp[ 1 ] t r nm t c o nc h i t n g , n h n gn i c h u n gb nk h n gb i t i u . N uv n c a b n c t h i t l p b np h i b i t c c l o i c h n hx c c a t t c c c i t n g , b nn ns u yn g h l i v n , b i v c l b n a n gk h n gs d n gc h c n n g o n g . T u yn h i n , c m t s t n hh u n gt r o n g t h i t k h o t n gt t n h t ( Ho c b nk h n gc s l a c h n ) n ub nb i t c h n hx c l o i c a t t c c c i t n gl ug i t r o n gm t c o n t a i n e r c h u n gc h u n g . yl v n c a l o i t h i g i a nc h y x c n h ( R T T I ) . R T T I l t t c v c c o nt r l pc s x u n g c o nt r c n g u ng c t l p( " l n " v " x u n g " c l i nq u a n n m t s l p i nh n h , v i c c l pc s ut r a n g ) . c l nx yr a t n g , k h n gc s pb u c , b i v n h o nt o na nt o n . c x u n g l k h n ga nt o nv k h n gc t h i g i a nb i nd c ht h n gt i nv c c l o i t h c t , v v yb np h i b i t c h n hx c n h n gg c c l o i i t n gl . N ub ns d n gn v oc c l o i s a i , b ns g pr c r i . R T T I c mt s a ut r o n gc h n gn y , v t p2 c a c u ns c hn yc m t c h n gd n hc h o t i n y .

i t n gc t

C m t s k h c b i t r r t g i a i q u a c c a c h c a c c i t n gv i q u a c c i t n gt h e og i t r k h i s d n g a h n h . T t c c c v d b n n h nt h y y , v h un h t t c c c v d b ns t h y , q u a a c h v k h n gc [ 5 5 ] g i t r . i un yl d ot t c c c a c h c k c ht h c t n gt , i q u a a c h c a m t i t n gc a m t l o i c n g u ng c ( t h n gl m t i t n gl nh n ) c n gg i n gn h i q u a a c h c a m t i t n gc a l o i h n hc b n( m t h n gl m t i t n gn h h n ) . Nh g i i t h c ht t r c , yl m c t i uk h i s d n g a h n hm i uk h i nm t l o i c s mi n hb c hc t h i uk h i nc c v t c n g u ng c t l o i l t t . N u b n n e ml n n m t i t n g t h a y v m t c o n t r h o c t h a mc h i u , m t c i g s x y r a m c t h l m b nn g c n h i n : i t n g c " c t " c h o nk h i t t c n h n gg c nl i l s u b o b j e c t t n g n gv i k i u c hc a d nd i nv i nc a b n . T r o n gv d s a u y , b nc t h x e mn h n gg s x yr a k h i m t i t n g c t h i l t :

// :C 1 5 :O b j e c t S l i c i n g . c p p #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; l pP e t{ c h u iP N A M E ,c n gc h n g : V tn u i( c o n s ts t r i n g&t n ) :P N A M E( t n ){ } t nc h u i o( )c o n s t{ P N A M Et r l i ; } m t c h u i o( )c o n s t{ t r l i" n yl "+P N A M E ; } } ; c l a s sD o g :P e tc n g{ c h u if a v o r i t e A c t i v i t y ,c n gc h n g : C o nc h ( c o n s ts t r i n g&t n ,c o n s ts t r i n g&h o t n g ) :P e t( t n ) ,f a v o r i t e A c t i v i t y ( h o t n g ){ } m t c h u i( )c o n s t{ t r l im a n gt h e ov tn u i: :t n( )+" t h c h " + f a v o r i t e A c t i v i t y ; } } ; t r n gm t ( P e tp ){ //S l i c e s it n g c o u t< <p . d e s c r i p t i o n( )< <e n d l ; } i n tm a i n( ){ m a n gt h e ov tn u ip( " A l f r e d " ) ; C h d ( " F l u f f y " ," n g " ) , m t ( p ) ; m t ( d ) ; }/// :~

C h c n n gmt ( ) c t h n gq u a m t i t n gc a l o i v t n u i t h e o g i t r . S a u n g i c h c n n g omt ( c h o) ma n gt h e ov t n u i i t n g . T r o n gma i n( ) , b nc t h mo n g i c c c u c g i ut i ns nx u t " yl A l f r e d , " v t h h a i s nx u t " F l u f f yt h c hn g . " T r o n gt h c t , c h a i c u c g i s d n gp h i nb nc s n gc pc a mt ( . ) Ha i i u a n gx yr a t r o n gc h n gt r n hn y . ut i n , b i v mt ( ) c h pn h nm t v t n u i i t n g ( c h k h n g p h i l m t c o nt r h o c t h a mc h i u ) , b t k c u c g i mt ( ) s g yr a m t i t n gk c ht h c c a v t n u i c yv os t a c kv l ms c hs a uk h i c u c g i . i un yc n g h a r n gn um t i t n gc a m t l p c t h a k t


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 259/320

08/10/2013

Suy ngh trong C + +, Vol 1

v t n u i c t h n gq u a mt ( ) , t r n hb i nd c hc h pn h nn , n h n gn s a oc h pc h ma n gt h e ov t n u i p h n c a i t n g . Nl t p h nh a t c c i t n g , n h t h n y :
Trc khi Slice Sau khi Slice

B yg i b nc t h t h i v c u c g i c h c n n g o . C h : : Mt ( ) s d n gc c p h nc a c h a i ma n gt h e ov t n u i ( m v nc nt nt i ) v c h , m k h n gc nt nt i b i v n c c t r a ! V v y , n h n gg s x yr a k h i c h c n n g o c g i l ? B n a n gt i t k i m c t t h mh a v c c i t n g a n g c t h n gq u a g i t r . B i v i un y , t r n hb i nd c h b i t l o i c h n hx c c a i t n gv i t n gc n g u ng c b b u c p h i t r t h n hm t i t n gc s . K h i i q u a c c g i t r , c c b ns a o x yd n gc h om t v t n u i i t n g c s d n g , k h i t oc c V P T Rc h ov t n u i v t a b l e v b ns a oc h c v t n u i p h nc a i t n g . K h n gc r r n gb ns a o x yd n g y , n nt r n hb i nd c ht n gh p m t . T r o n gt t c c c g i i , c c i t n gt h c s t r t h n hm t v t n u i t r o n gq u t r n hc t . i t n gc t t h c s l o i b m t p h nc a i t n gh i nt i n h n s a oc h pn v o i t n gm i , c h k h n gp h i c h ng i nl t h a y i n g h a c a m t a c h n h k h i s d n gm t c o nt r h o c t h a mc h i u . B i v i un y , u p c a s t i n gv om t i t n gk h n g c t h c h i nt h n gx u y n , t r o n gt h c t , n t h n gl m t c i g x e mr a c h ov n g nc h n . L ur n g , t r o n gv d n y , n umt ( c t h c h i nv om t ot i n hk h i t ) c h c n n gt r o n g l pc s ( m k h n gp h i l k h n gh pl , v n k h n gt h c s l mb t c i ug t r o n gc c l pc s ) , s a u t r n h b i nd c hs n g nc h n i t n gc t v r n gs k h n gc h op h pb n" t or a " m t i t n gc a l o i h n hc b n( l n h n g g x y r a k h i b n n e ml n v g i t r ) . i un yc t h l g i t r q u a nt r n gn h t c a c h c n n gt h u n o : n g nc h n i t n gc t b n gc c ht or a m t t h n gb ol i t h i g i a nb i nd c hn ua i c g n g l m i u .

Qu t i v t r n g

T r o n gC h n g1 4 , b n t h yr n gv i c x c n hl i c h c n n gq u t i t r o n gc c l pc s g i ut t c c c p h i n b nc s n gc pk h c c a c h c n n g . K h i oc h c n n gc l i nq u a n nh n hv i n yl m t c h t k h c n h a u . X e mx t m t p h i nb ns a i c a Na me Hi d i n g . c p pv d t C h n g1 4 :

// :C 1 5 :N a m e H i d i n g 2 . c p p //C h cn n g oh nc h q u t i #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; c l a s sB a s e{ p u b l i c : oi n tf( )c o n s t{ c o u t< <" B a s e: :f( )\n " ; t r l i1 ; } ov o i df( s t r i n g )c o n s t{ } v i r t u a lv o i dg( )c o n s t{ } } ; l pD e r i v e d 1 :p u b l i cB a s e{ c n gc n g : k h o n gt r n gg( )c o n s t{ } } ; l pD e r i v e d 2 :p u b l i cB a s e{ c n gc n g : //T r n gm th m o : i n tf( )c o n s t{ c o u t< <" D e r i v e d 2: :f( )\ n " ; t r l i2 ; } } ; l pD e r i v e d 3 :p u b l i cB a s e{ c n gc n g : //K h n gt h t h a y ik i ut r v : // !v o i df( )c o n s t{ c o u t< <" D e r i v e d 3: :f( )\n " ; } } ; l pD e r i v e d 4 :p u b l i cB a s e{ c n gc n g : //T h a y id a n hs c h is : i n tf( i n t )c o n s t{ c o u t< < " D e r i v e d 4: :f( )\n " ; t r l i4 ; } } ; i n tm a i n( ){ s t r i n gs( " h e l l o " ) ; D e r i v e d 1d 1 ; i n tx=d 1 . f( ) ; d 1 . f( s ) ; D e r i v e d 2d 2 ; x=d 2 . f( ) ; // ! d 2 . f( s ) ,p h i nb n//c h u i n D e r i v e d 4d 4 ; x=d 4 . f( 1 ) ; // ! x=d 4 . f( ) ;//f( )p h i nb n n // ! d 4 . f( s ) ,p h i nb n//c h u i n C s v b r=d 4 ;//u p C a s t !// b r . f( 1 ) ;//n g u ng cp h i nb nk h n gc b r . f( ) ;//c s p h i nb nc s n b r . f( s ) ;//c s p h i nb na b a i l a b l e }/// :~

i u ut i nc nc h l t r o n gDe r i v e d 3 , t r n hb i nd c hs k h n gc h op h pb nt h a y i k i ut r v c a m t h mg h i ( n s c h op h pn n uf ( ) k h n gp h i l o ) . yl m t h nc h q u a nt r n gb i v t r n hb i nd c hp h i mb or n g b np o l y mo r p h i c a l l yt h g i c h c n n gt h n gq u a c c l pc s , v n ul pc s c mo n g i m t i n t c t r l i t f ( ) , s a u p h i nb nc n g u ng c t l ph c c a f ( ) p h i t i pt c h p n gh o c n g i n ok h c i un ys p h v .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 260/320

08/10/2013

Suy ngh trong C + +, Vol 1

C c q u yt c t h h i nt r o n gC h n g1 4 v nh o t n g : n ub ng h i l nm t t r o n gn h n gc h c n n gt h n hv i n q u t i t r o n gc c l pc s , c c p h i nb nq u t i k h c b nt r o n gl pd nx u t . T r o n gma i n( ) m k i mt r a De r i v e d 4 c h ot h y i un yx yr a n g a yc k h i p h i nb nm i c a f ( ) l k h n gt h c s t r n gm t g i a od i nc h c n n g oh i nt i c h a i p h i nb nc s n gc pc a f ( ) c nb i f ( i n t ) . T u yn h i n , n u b n n e ml n d 4 nc s , s a u c h c p h i nb nb a s e c l a s s c s n( v l n h n gg h p n gc s c ph a h n ) v p h i nb n c n g u ng c t l pk h n gc s n( v n k h n g c q u y n ht r o n gc c l pc s ) .

K i ut r v b i nt h

C c De r i v e d 3 l pt r nc h ot h yr n gb nk h n gt h t h a y i k i ut r v c a m t h m ot r o n gk h i t r n g . i un y t h n gl n g , n h n gc m t t r n gh p c b i t m b nh i c t h t h a y i k i ut r v . N ub n a n gt r v m t c o nt r h o c m t t h a mc h i u nm t l pc s , s a u g h i p h i nb nc a h mc t h t r v m t c o nt r h o c t h a mc h i u nm t l pb t n g u nt n h n gg t r v c nc . V d :

// :C 1 5 :V a r i a n t R e t u r n . c p p //Q u a yt r l im tc o nt r h o ct h a mc h i u nm tn g u ng c //L o it r o n go v v e r r i d i n g #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; l pP e t f o o d{ p u b l i c : oc h u if o o d T y p e( )c o n s t=0 ; } ; l pP e t{ p u b l i c : l o id y o( )c o n s t=0 ; oP e t f o o d* n( )=0 ; } ; l pB i r d :P e t{ p u b l i c : c h u il o i( )c o n s t{ r e t u r n" B i r d " ; } l pB i r d F o o d :P e t f o o dc n g{ c n gc n g : c h u if o o d T y p e( )c o n s t{ t r v " t h cp h mg i ac m " ; } } ; //U p C a s tl o ic b n : P e t f o o d* n( ){ r e t u r n& b f ; }t i n : B i r d F o o db f ; } ; l pC t :P e t{ p u b l i c : c h u il o i( )c o n s t{ r e t u r n" C t " ; } l pm o ,g i as c :c n gP e t f o o d{ c n g : c h u if o o d T y p e ( )c o n s t{ r e t u r n" c h i m " ; } } ; //T r v l o ic h n hx ct h a yv : *m o ,g i as c n( ){ r e t u r n& c f ; }t i n : m o , g i as cx e m ; } ; i n tm a i n( ){ c h i mb ; M oc ; V tn u i*p[ ]={ &b ,v c } ; f o r( i n ti=0 ;i< s i z e o fp/s i z e o f*p ;i++ ) c o u t< <p [ i ]>g ( )< <" n " < <P[ i ]> n( )>f o o d T y p e( )< <e n d l ; //c t h q u a yt r l ic cl o ic h n hx c : M o: :m o ,g i as c*c f=c . e a t s( ) ; C h i m: :B i r d F o o d*b f ; //K h n gt h t r l il o ic h n hx c : // ! b f=b . e a t s( ) ; //P h in h nx u n g : b f=d y n a m i c _ c a s t< B i r d : : B i r d F o o d * >( b . e a t s( ) ) ; }/// :~

C c v t n u i n: : (c h c n n gt h n hv i nt r v m t c o nt r t i m t ) P e t f o o d. T r o n gB i r d, c h c n n gc a t h n h v i nn yb q u t i c h n hx c n h t r o n gl pc s , t r o n g c k i ut r v . l , c h i m: : n(u p c a s t s c c ) B i r d F o o dm t P e t f o o d. Nh n gt r o n gC t , k i ut r v c a n( )l m t c o nt r nm o , g i a s c , m t l o i c n g u ng c t P e t f o o d. T h c t l k i ut r v c t h a h n gt k i ut r v c a c c c h c n n gc s n gc pl l d od u yn h t n yb i nd c h . B n gc c h , c c h p n gv n c h o nt h n h ; n( ) l u nl u nt r v m t P e t f o o dc o nt r . N ub nn g h r n gp o l y mo r p h i c a l l y , i un yd n gn h k h n gc nt h i t . T i s a o k h n g c h n e ml n t t c c c l o i t r l i P e t f o o d* , g i n gn h c h i m: : n( l m? ) n yt h n gl m t g i i p h pt t , n h n gv oc u i c h n h( ) , b ns t h ys k h c b i t : C t : : n(c t h t r l i c h n hx c l o i ) P e t f o o d, t r o n gk h i g i t r t r l i c h i m: : n( p h i n h nx u n g c c ) l o i c h n hx c . V v y , c t h q u a yt r l i c c l o i c h n hx c l m t c h t c h u n gh n , v k h n gb m t n h n gl o i t h n gt i nc t h b n gc c ht n gu p c a s t i n g . T u yn h i n , t r v c c l o i h n hc s n i c h u n gs g i i q u y t v n c a b nv v y yl m t t n hn n gk h c b i t .

c h cn n g ov x yd n g
K h i m t i t n gc c h a c c c h c n n g o c t or a , V P T Rc a n p h i c k h i t o t r nc c v t a b l e t h c hh p . i un yp h i c t h c h i nt r c k h i c b t k k h n n gg i m t c h c n n g o . Nh b nc t h
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 261/320

08/10/2013

Suy ngh trong C + +, Vol 1

o n , b i v c c n h x yd n gc c c n gv i c a m t i t n gv os t nt i , n c n gl c n gv i c c a n h x yd n g t h i t l pc c V P T R . T r n hb i nd c hb m t c h nm v op h n uc a x yd n gm k h i t oV P T R . V n h mt t r o n gC h n g1 4 , n ub nk h n gr r n gt or a m t n h x yd n gc h om t l ph c , t r n hb i nd c h s t n gh pc h ob n . N ul pc c h c n n g o , c c n h x yd n gt n gh ps b a og mc c m k h i V P T Rt h c h h p . i un yc n h i un g h a . Hi uq u m i q u a nt m ut i n . L d oc h on i t u y nc h c n n gl g i mc h i p h g i i nc h oc c c h c n n g n h . N uC++k h n gc u n gc pn i t u y nc h c n n g , t i nx l c t h c s d n g t or a n h n g" ma c r o " . T u yn h i n , t i nx l k h n gc k h i n i mv t r u yc ph o c c c l ph c , v d o k h n gt h c s d n g t o c c ma c r oc h c n n gt h n hv i n . Ng o i r a , v i n h t h up h i c m nc h nv ob i t r n hb i nd c h , m t v m t i nx l s k h n gl mv i c t t c . B np h i l uk h i s nb nc h ol h i uq u m t r n hb i nd c h c c h nm nv oc h c n n gx yd n gc a b n . K h n gc h n p h i k h i t oV P T R , n c n gp h i k i mt r a g i t r c a i un y( t r o n gt r n gh pc c n h i u h n hmi t r v s k h n g ) v k ug i x yd n gc s n gc p . T ml i , m n yc t h n hh n g nn h n gg b nn g h l m t c u c g i c h c n n gn h n i t u y n . c b i t , k c ht h c c a c c n h x yd n gc t h p oc c k h o nt i t k i mb nn h n c t g i mc h i p h c h c n n gc u c g i . N ub nt h c h i nr t n h i uc u c g i x yd n g n i t u y n , k c ht h c m c a b nc t h p h t t r i nm k h n gc b t k l i c hv t c . T t n h i n , b nc t h s k h n gl mc h ot t c c c n h t h un h n o n i n l i n e n g a yl pt c , b i v c h n gd d n gh n n h i u v i t n h i n l i n e s . Nh n gk h i b n a n g i uc h n hm c a b n , h yn h x e mx t l o i b c c n h t h un i t u y n .

T h t c ac cc u cg i x yd n g
C c k h a c n ht h v t h h a i c a n h t h uv c c c h c n n g ol i nq u a n nt h t c a c c c u c g i x yd n gv c c hc u c g i o c t h c h i nt r o n gx yd n g . T t c c c n h x yd n gl pc s l u nl u n c g i t r o n gc c n h x yd n gc h om t l pk t h a . N yc n g h a b i v c c n h x yd n gc m t c n gv i c c b i t : t h yr n gc c i t n g c x yd n g n gc c h . M t l p h c c n g u ng c c q u y nt r u yc pc h oc c t h n hv i nr i n gc a m n h , v k h n gn h n gc a l pc s . C h c x y d n gc s n gc p n gc c hc t h k h i t oc c y ut r i n gc a m n h . D o n l i uc nt h i t m t t c c c n h t h uc c g i l , n uk h n gt o nb i t n gs k h n g c x yd n g n g . l l d ot i s a oc c t r n h b i nd c ht h c t h i m t c u c g i x yd n gc h ot t c c c p h nc a m t l pd nx u t . Ns g i c o n s t r u c t o r m c n h n ub nk h n gr r n gg i m t c o n s t r u c t o r l pc s t r o n gd a n hs c hk h i t ox yd n g . N uk h n gc c o n s t r u c t o r m c n h , t r n hb i nd c hs k h i un i . T h t c a c c c u c g i x yd n gl r t q u a nt r n g . K h i b nt h a k , b nb i t t t c v c c l pc s v c t h t r u y c pb t k c n gv b ov c c t h n hv i nc a l pc s . i un yc n g h a l b np h i c k h n n gg i n hr n g t t c c c t h n hv i nc a l pc s c g i t r k h i b n a n g t r o n gl pd nx u t . T r o n gm t h mt h n hv i nb n h t h n g , x yd n g x yr a , v v yt t c c c t h n hv i nc a t t c c c p h nc a i t n g c x yd n g . T r o n g c c n h x yd n g , t u yn h i n , b np h i c k h n n gg i n hr n gt t c c c t h n hv i nm b ns d n g c x yd n g . C c hd u yn h t mb o i un yl d n hc h oc c n h x yd n gl pc s c g i l ut i n . S a u , k h i b n a n g t r o n gc c n h x yd n gc n g u ng c t n gc p , t t c c c t h n hv i n , b nc t h t r u yc p t r o n gl pc s c k h i t o . " B i t t t c c c t h n hv i nc g i t r " b nt r o n gc c n h x yd n gc n gl n h n g l d o , b t c k h i n oc t h , b nn nk h i t ot t c c c i t n gt h n hv i n( c n g h a l , c c i t n g t t r o n gc c l ph c s d n gt h n hp h n ) t r o n gd a n hs c hk h i t ox yd n g . N ub nl mt h e ot h c h n hn y , b n c t h g i n hr n gt t c c c t h n hv i nl pc s v i t n gt h n hv i nc a i t n gh i n c k h i t o .

H n hv i c ac h cn n g ot r o n gx yd n g

H t h n gc pb c c a c c c u c g i x yd n gs t r v m t t n ht r n gk h x t h v . Nh n gg s x yr a n ub n a n g t r o n gm t n h x yd n gv b ng i m t h m o ? B nt r o n gm t h mt h n hv i nb n ht h n g , b nc t h t n gt n gn h n gg s x yr a c c c u c g i o c g i i q u y t t r o n gt h i g i a nc h yb i v i t n gk h n gt h b i t l i un t h u c v l pc h c n n gt h n hv i nl t r o n g , h o c m t s l pb t n g u nt n . t h n gn h t , b nc t h n g h r n g yl n h n gg x yr a b nt r o n gn h x yd n g . yk h n gp h i l t r n gh p . N ub ng i m t h m ob nt r o n gm t n h x yd n g , c h c p h i nb n a p h n g c a c c c h c n n g c s d n g . C n g h a l , c c h ok h n gl mv i c t r o n gc c n h x yd n g . H n hv i n yc n g h a v h a i l d o . K h i n i m, c n gv i c c a n h x yd n gl ma n gl i c h oc c i t n gv os t nt i ( m h un h k h n gm t k b n ht h n g ) . T r o n gb t k n h x yd n g , c c i t n gc h c t h c h n ht h n h m t p h nb nc h c t h b i t r n gc c i t n gl pc s c k h i t o , n h n gb nk h n gt h b i t c c c l p h c c t h a h n gt b n . M t c u c g i c h c n n g o , t u yn h i n , t n" c h u y nt i p " h o c " r a n g o i " v oh t h n gp h nc pt h a k . Ng i m t c h c n n gt r o n gm t l ph c c n g u ng c . N ub nc t h l m i un yt r o n g m t n h x yd n g , b nmu n c g i m t c h c n n gm c t h t h a ot c c c t h n hv i n k h n g c k h i t on o , m t c n gt h c c h c c h nt h mh a . L d ot h h a i l m t c m t . K h i m t n h x yd n g c g i l , m t t r o n gn h n g i u ut i nn l ml k h i t o V P T Rc a n . T u yn h i n , n c h c t h b i t r n gn l c a " h i nt i " l o i l o i c c n h x yd n g c v i t c h o . M x yd n gl h o nt o nk h n gb i t c h a yk h n g i t n gl t r o n gc c c s c a l pk h c . K h i t r n hb i nd c ht or a

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

262/320

08/10/2013

Suy ngh trong C + +, Vol 1

m c h ox yd n gm , n t or a m c h om t n h x yd n gc a l p , k h n gp h i l m t l pc s v k h n gp h i l m t l pd nx u t t n ( v m t l ph c k h n gt h b i t n g i t h a k n ) . V v y , c c V P T Rn s d n gp h i c c h o v t a b l e c a r n g l p . C c V P T Rv nk h i t ov i v t a b l e c h op h nc nl i c a c u c i c a i t n gt r k h i yk h n g p h i l c u c g i c u i c n gx yd n g . N um t n h x yd n gc n g u ng c t h n c g i l s a u , n h x yd n g a r a V P T R n v t a b l e , v n h v y , c h o nk h i c c n h x yd n gh o nt h i nc u i c n g . T r n gt h i c a V P T R c x c n hb i c c n h x yd n g c g i l c u i c n g . yl m t l d ot i s a oc c n h x yd n g c g i l t h e ot h t t c s c h oh uh t c n g u ng c t . Nh n gt r o n gk h i t t c c c d n gn yc a c c c u c g i x yd n g a n gd i nr a , m i n h x yd n g t h i t l pc c V P T R v t a b l e r i n gc a m n h . N un s d n gc c c c h oc h oc c c u c g i c h c n n g , n s s nx u t c h c m t c u c g i t h n gq u a v t a b l e r i n gc a m n h , k h n gp h i l h uh t c n g u ng c t v t a b l e ( n h s l t r n gh ps a u k h i t t c c c n h x yd n g c g i l ) . Ng o i r a , n h i ut r n hb i nd c hn h nr a r n gm t c u c g i c h c n n g o a n g c t h c h i nt r o n gm t n h x yd n g , v t h c h i n ur n gb u c b i v h b i t r n gc u i r n gb u c s t or a m t c u c g i c h c h c n n g a p h n g . T r o n gc h a i t r n gh p , b ns k h n gc c k t q u b a n ub nc t h mo n g i t m t c u c g i c h c n n g ob nt r o n gm t n h x yd n g .

H mh yv h mh y o

B nk h n gt h s d n got k h a v i n h t h u , n h n gc t h h yv t h n gp h i l o . C c n h x yd n gc c c n gv i c c b i t c a v i c a m t i t n gc n gm n ht n gm n h , ut i nb n g c c hg i x yd n gc b n , s a u c c n h x yd n gc n g u ng c h nt h e ot h t t h a k ( n c n gp h i g i t h u t h n hv i n i t n gt r n n g i ) . T n gt n h v y , c c d e s t r u c t o r c m t c n gv i c c b i t : n p h i t h o r i m t i t n gc t h t h u c v m t h t h n gp h nc pc a c c l ph c . l m i un y , t r n hb i nd c ht or a m m c c c u c g i t t c c c h mh y , n h n gt r o n g o n g c t h t m c h n g c g i l b i c c n h x y d n g . l , h yb t u l ph uh t c n g u ng c t v l mv i c t h e oc c hc a m n hx u n gl pc s . yl i ua nt o nv mo n gmu nl mv m t h u h i nt i l u nl u nc t h b i t r n gc c t h n hv i nl pc s c n s n gv h o t n g . N ub nc np h i g i m t h mt h n hv i nl pc s t r o n gd e s t r u c t o r c a b n , n l a nt o n l mn h v y . Nh v y , c t h h yn h i mv d nd pr i n gc a m n h , s a u g i d e s t r u c t o r t i pt h e ox u n g , s t h c h i nn d nd pr i n g , v vM i h yb i t n h n gg c c l ph c c n g u ng c t , n h n gk h n gg c n g u ng c t n .

B nn ng h i n h r n gd n gv h mh yl n h n gn i d u yn h t m h t h n gp h nc pn yc a c u c g i p h i x y r a ( v d o h t h n gp h nc pt h c hh p c t n gt or a b i c c t r n hb i nd c h ) . T r o n gt t c c c c h c n n g k h c , c h c c h c n n gs c g i l ( v k h n gp h i p h i nb nc s n gc p ) , c h od l oh a yk h n g . C c h d u yn h t c h oc c p h i nb nc s n gc pc a c c c h c n n gt n gt c g i l t r o n gc h c n n gb n ht h n g ( oh a yk h n g ) l n ub nm t c c h r r n g g i l c h c n n g . T h n gt h n g , c c h n h n gc a d e s t r u c t o r l k h y . Nh n gn h n gg s x yr a n ub nmu nt h a ot c m t i t n gt h n gq u a m t c o nt r t i l pc s c a n ( c n g h a l , t h a ot c c c i t n gt h n gq u a g i a od i nc h u n gc a n ) ? Ho t n gn yl m t m c t i uq u a nt r n gt r o n gl pt r n hh n g i t n g . V n x yr a k h i b nmu nx a m t c o nt r k i un yc h om t i t n g c t or a t r nh e a pv i mi . N uc o nt r t i l pc s , t r n hb i nd c h c h c t h b i t g i c h op h i nb nc s n gc pc a m t h u t r o n gq u t r n hx a . mt h a n hq u e nt h u c ? yl v n t n gt c c h c n n g o c t or a g i i q u y t c h ot r n gh pt n gq u t . Ma ym nt h a y , c h c n n g ol m v i c c h oh mh yk h i h l mc h ot t c c c c h c n n gk h c n g o i t r n h x yd n g .
// :C 1 5 :V i r t u a l D e s t r u c t o r s . c p p //H n hv ic ad e s t r u c t o r os ov ik h n g o #I n c l u d eu s i n gn a m e s p a c es t d ; l pB a s e 1{ p u b l i c : ~B a s e 1( ){ c o u t< <" ~B a s e 1( )\n " ; } } ; l pD e r i v e d 1 :B a s e 1{ p u b l i c : ~D e r i v e d 1( ){ c o u t< <" ~D e r i v e d 1( )\n " ; } } ; l pB a s e 2{ p u b l i c : v i r t u a l~B a s e 2( ){ c o u t< <" ~B a s e 2( )\n " ; } } ; l pD e r i v e d 2 :c n gB a s e 2{ p u b l i c : ~D e r i v e d 2( ){ c o u t< <" ~D e r i v e d 2( )\n " ; } } ; i n tm a i n( ){ B a s e 1*b p=n e wD e r i v e d 1 ;//u p C a s t x ab p ; B a s e 2*b 2 p=n e wD e r i v e d 2 ;//u p C a s t x ab 2 p ; }/// :~

K h i b nc h yc h n gt r n h , b ns t h yr n gx a b pc h g i d e s t r u c t o r l pc s , t r o n gk h i x a b 2 pg i d e s t r u c t o r c n g u ng c t l pt i pt h e ol l pc s h y , l h n hv i c h n gt a mo n gmu n . Qu n i l mc h om t d e s t r u c t o r ol m t l i n g mn g mb i v n t h n gk h n gt r c t i p n hh n g nh n hv i c a c c c h n gt r n h c a b n , n h n gn l n gl c t h g i i t h i um t r r b n h . Ng o i r a , t h c t l m t s t np h a n gx yr a c t h t i pt c c h e d uv n .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 263/320

08/10/2013

Suy ngh trong C + +, Vol 1

M c d h y , n h c c n h x yd n g , l m t " c b i t " c h c n n g , c t h c h oc c d e s t r u c t o r l ob i v i t n g b i t n l l o i g ( t r o n gk h i n k h n g t r o n gt h i g i a nx yd n g ) . K h i m t i t n g c x yd n g , V P T Rc a n c k h i t o , c c c u c g i c h c n n g oc t h x yr a .

H m h y ot i n hk h i t
T r o n gk h i h mh y ot i n hk h i t l h pp h pt r o n gt i uc h u nC++ , c m t h nc h g i a t n gk h i s d n gc h n g : b np h i c u n gc pc h oc q u a nc h c n n gc h oc c d e s t r u c t o r ot i n hk h i t . i un yc v p h nt r c g i c ,n h t h n om t c h c n n g oc t h c " t i n hk h i t " n un c nc m t c q u a nc h c n n g ? Nh n gn ub ng h i n h r n gd n gv h mh yl h o t n g c b i t n c n g h a h n , c b i t l n ub nn h r n gt t c c c h mh y t r o n gm t h t h n gp h nc pl pl u nl u n c g i . N ub n c t h b c c p h n n hn g h a c h om t d e s t r u c t o r t h u n o , n h n gc h c n n gc t h s c g i t r o n gt h i g i a nt n p h ? D o , n h o nt o nc nt h i t m c c t r n hb i nd c hv m i l i nk t t h c t h i s t nt i c a m t c q u a nc h c n n gc h om t d e s t r u c t o r ot i n hk h i t . N u l t i n hk h i t , n h n gn p h i c m t c q u a nc h c n n g , g i t r c a n l g ? S k h c b i t d u yn h t b ns t h yg i a c c d e s t r u c t o r ot i n hk h i t v k h n gt h u nt yl d e s t r u c t o r ot i n hk h i t k h n gg yr a c c l pc s l t r ut n g , v v yb nk h n gt h t or a m t i t n gc a l pc s ( m c d i un yc n gs l n gn uc h m t h n hv i nk h c c a l pc s l ot i n hk h i t ) . i un yl m t c h t b i r i , t u yn h i n , k h i b nt h a k m t l pt m t t r o n g c m t d e s t r u c t o r ot i n hk h i t . K h n gg i n gn h c c c h c n n gt h u n ok h c , b nk h n g c nt h i t c u n gc pm t n hn g h a c a m t d e s t r u c t o r o t i n hk h i t t r o n gl pc n g u ng c . T h c t l s a ub i nd c hv l i nk t l b n gc h n g :
// :C 1 5 :U n A b s t r a c t . c p p //H mh y ot i n hk h i t //D n gn h c x r tl l pA b s t r a c t B a s e{ p u b l i c : o~A b s t r a c t B a s e( )=0 ; } ; A b s t r a c t B a s e: :~A b s t r a c t B a s e( ){ } l pd nx u t :A b s t r a c t B a s ec n g{ } ; //K h n gb a ot r mc ad e s t r u c t o rc nt h i t ? i n tm a i n( ){ n g u ng cd ; }/// :~

T h n gt h n g , m t c h c n n gt h u n ot r o n gm t l pc s s g yr a c c l pd nx u t l t r ut n g , t r k h i n ( v t t c c c c h c n n gt h u n ok h c ) c a r a m t n hn g h a . Nh n g y , i un yd n gn h k h n gp h i l t r n gh p . T u yn h i n , h yn h r n gc c t r n hb i nd c ht n g t or a m t n hn g h a h mh yc h om i l pn ub n k h n gt or a m t . l n h n gg a n gx yr a yl ph yc s a n g c l n gl t h a y i , v d o n hn g h a a n g c c u n gc pb i t r n hb i nd c hv n g u ng c l k h n gt h c s t r ut n g . i un ys t r v m t c uh i t h v : i mc a m t d e s t r u c t o r ot i n hk h i t l g ? K h n gg i n gn h m t c h c n n g t h u n ob n ht h n g , b n p h i c u n gc pc h on m t c q u a nc h c n n g . T r o n gm t l ph c c n g u ng c , b nk h n gb t b u c c u n gc pm t n hn g h a k h i t r n hb i nd c ht n gh pc c d e s t r u c t o r c h ob n . V v y , s k h c b i t g i a m t d e s t r u c t o r ob n ht h n gv m t d e s t r u c t o r ot i n hk h i t l g ? S k h c b i t c h x yr a k h i b nc m t l ph c m c h c d u yn h t c h c n n gt h u n o : d e s t r u c t o r . T r o n gt r n gh p n y , t c d n gd u yn h t c a s t h u nk h i t c a c c d e s t r u c t o r l n g nc h ni n s t a n t i a t i o nc a l pc s . N uc b t k c h c n n gt h u n ok h c , h s n g nc h ni n s t a n t i a t i o nc a l pc s , n h n gn uk h n gc n h n gn g i k h c , s a u d e s t r u c t o r ot i n hk h i t s l m i u . V v y , t r o n gk h i v i c b s u n gm t d e s t r u c t o r ol i uc nt h i t , c h od l t i n hk h i t h a yk h n gk h n gp h i l q u q u a nt r n g . K h i b nc h yc c v d s a u y , b nc t h t h yr n gc c c q u a nc h c n n gt h u n o c g i l s a uk h i p h i nb n l pd nx u t , c n gn h v i b t k h yk h c :
// :C 1 5 :P u r e V i r t u a l D e s t r u c t o r s . c p p //H mh y ot i n hk h i t //Y uc uc q u a nc h cn n g#i n c l u d eu s i n gn a m e s p a c es t d ; l pP e t{ p u b l i c : v i r t u a l~P e t( )=0 ; } ; V tn u i: :~P e t( ){ c o u t< <" ~P e t( ) "< <e n d l ; } c l a s sD o g :P e t{ p u b l i c : ~D o g( ){ c o u t< <" ~D o g( ) "< < e n d l ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 264/320

08/10/2013

Suy ngh trong C + +, Vol 1

} } ; i n tm a i n( ){ V tn u i*p=n e wc h ;//u p C a s t

x ap ;//g ih mh y o }/// :~

Nh h n gd n , b t c l c n ob nc m t h m ot r o n gm t l ph c , b nn nn g a yl pt c t h m m t d e s t r u c t o r o( n g a yc k h i n k h n gc g ) . B n gc c hn y , b n mb oc h n gl i b t k b t n g s a u .

V i r t u a l st r o n gh m h y

C i ug x yr a t r o n gt h i g i a nt np h m b nc t h k h n gn g a yl pt c mo n g i . N ub n a n g t r o n g m t h mt h n hv i nb n ht h n gv b ng i m t h m o , c h c n n g c g i l s d n gc c h c u i r n gb u c . i un yk h n g n gv i h mh y , oh a yk h n g . B nt r o n gm t h mh y , c h c p h i nb n" a p h n g " c a c c h mt h n hv i n c g i l , c c h o c b q u a .

// :C 1 5 :V i r t u a l s I n D e s t r u c t o r s . c p p C u cg i// ob nt r o n gh mh y #I n c l u d eu s i n gn a m e s p a c es t d ; c l a s sB a s e{ p u b l i c : o~c s ( ){ c o u t< <" B a s e 1( )\n " ; f( ) ; } ov o i df( ){ c o u t < <" B a s e: :f( )\n " ; } } ; l pD e r i v e d :p u b l i cB a s e{ c n gc n g : ~N g u ng c( ){ c o u t< <" ~n g u ng c( )\n " ; } v o i df( ){ c o u t< <" n g u ng c: :f ( )\n " ; } } ; i n tm a i n( ){ C s *b p=n e wn g u ng c ;//u p C a s t x ab p ; }/// :~

T r o n gk h i g i h y , n g u ng c : : f (l ) k h n g c g i l , m c d f ( ) l o . T i s a o i un y ? G i s c c h o c s d n gb nt r o n gh mh y . S a u , n s c t h c h oc c c u c g i o g i i q u y t nm t c h c n n g l " x a h n " ( c n g u ng c h n ) t r nh t h n gp h nc pt h a k h nm t h u h i n t i . Nh n gh mh y c g i l t " b nn g o i t r o n g " ( t h yh uh t c n g u ng c t x u n gh yc s ) , d o c g i l c h c n n gt h c t s d a t r nc c p h nc a m t i t n g b t i ud i t ! T h a yv o , t r n hb i nd c hg i i q u y t c c c u c g i t i t h i g i a nb i nd c hv c c c u c g i c h c p h i nb n" a p h n g " c a c c c h c n n g . C h r n g i un yc n g n gc h oc c n h x yd n g( n h mt t r n ) , n h n gt r o n gt r n gh pn h x yd n gc c l o i h n ht h n gt i nl k h n gc s n , t r o n gk h i t r o n gd e s t r u c t o r t h n gt i n( c n g h a l , c c V P T R ) l c , n h n gl k h n g n gt i nc y.

T or a m th t h n gp h nc pd at r n i t n g
M t v n c t i d i nt r o n gs u t c u ns c hn yt r o n gc c c u c b i ut n hc a c c l pc h a n g nx pv S t a s hl " v n q u y ns h u . " C c " c h s h u " l n g i h o c n h n gg l t r c hn h i mk ug i x a c c i t n g c t or a t n g( s d n gmi ) . C c v n k h i s d n gc c c o n t a i n e r l h c np h i l i n hh o t c h a c c l o i k h c n h a uc a c c i t n g . l m i un y , c c c o n t a i n e r t c h c k h o n gt r n gc o nt r v v v yh k h n gb i t nc c l o i i t n gh c t c h c . X a m t k h o n gt r n gc o nt r k h n gg i d e s t r u c t o r , d o c h a k h n gt h c h ut r c hn h i mc h ov i c l ms c h i t n gc a n . M t g i i p h p c t r n hb yt r o n gv d C 1 4 : I n h e r i t S t a c k . c p p, t r o n g n g nx p c t h a h n gv om t l ph c m i c c h pn h nv c h s nx u t c h u i c o nt r . V n b i t r n gn c t h c h g i c o nt r nc h u i i t n g , n n gc c hc t h x a c h n g . yl m t g i i p h pt t p , n h n gn i h i b np h i k t h a m t l p c o n t a i n e r m i c h om i l o i m b nmu ng i t r o n gc o n t a i n e r . ( M c d i un yc v t n h t b yg i , n t h c s s l mv i c k h t t t r o n gC h n g1 6 , k h i m u c g i i t h i u . ) V n l b nmu nc c c o n t a i n e r g i n h i ul o i , n h n gb nk h n gmu ns d n gk h o n gt r n gc o nt r . M t g i i p h pk h c l s d n g a h n hb n gc c hb u c t t c c c i t n g c t c h c t r o n gc c c o n t a i n e r c t h a k t l pc b ng i n gn h a u . l , c c t h n gc h a g i c c i t n gc a l pc s , v s a u b nc t h g i c h c n n g o c b i t , b nc t h g i h mh y o g i i q u y t v n q u y ns h u . G i i p h pn ys d n gn h n gg c g i l m t h t h n g p h nc p nl b t n g u nt h o c m t h t h n g p h nc p d a t r n i t n g ( v l pt h m c g c c a h t h n gp h nc pt h n g c t t nl " i t n g " ) . Nc h r a r n gc r t n h i ul i c hk h c s d n gm t h t h n g nl c nc , t r o n gt h c t , t t c c c n g nn g h n g i t n gk h c n h n gC++t h c t h i v i c s d n gm t h t h n gp h nc pn h v yk h i b nt om t l p , b ns c t n gk t h a t r c t i ph o c g i nt i pt m t l pc s , l pc s c t h n hl pb i n h n gn g i s n gt oc a n g nn g . T r o n gC+ + , n g i t a n g h r n gv i c s d n gt h c t h i c a l pn yc s t h n gt h n gs g yr a q u n h i uc h i p h , v v yn p h i n g i n g o i . T u yn h i n , b nc t h c h n s d n gm t l pc s t r o n gd nc a r i n gb n , v c h n ys c x e mx t t h mt r o n gt p2 c a c u ns c hn y . g i i q u y t v n q u y ns h u , c h n gt a c t h t or a m t c c hv c n g ng i n i t n gc h oc c l pc s , t r o n g c d u yn h t m t d e s t r u c t o r o . C c n g nx ps a u c t h t c h c c c l pk t h a t i t n g:
// :C 1 5 :O S t a c k . h //S d n gm th t h n g nl b tn g u nt
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 265/320

08/10/2013

Suy ngh trong C + +, Vol 1

#I f n d e fO S T A C K _ H#x c n hO S T A C K _ H l p it n g{ p u b l i c : o~O b j e c t( )=0 ; } ; //Y uc u n hn g h a :n it u y n it n g: :~O b j e c t( ){ } l pS t a c k{ c ut r cl i nk t{ it n g*d l i u ; L i nk t*t i pt h e o ; L i nk t( it n g*d a t ,*L i nk tN X T ) : d l i u( d a t ) ,t i pt h e o( N X T ){ } }* u ,c n gc h n g : N g nx p( ) : u( 0 ){ } ~S t a c k( ){ t r o n gk h i( u ) x ap o p( ) ; } t r n g y( O b j e c t*d a t ){ u=n e wl i nk t( d a t ,n g i n g u ) ; } it n g*( )c o n s t{ ut r l i ? u >d l i u :0 ; } it n g*p o p( ){ i f( u= =0 )r e t u r n0 ; it n g*k t q u = u >d l i u , l i nk t*o l d H e a d= u ; u= u >t i p t h e o ; x ao l d H e a d , k tq u t r v ; } } ; #E n d i f//O S T A C K _ H/// :~

ng i nh a b n gc c hg i t t c m i t h t r o n gc c t pt i nt i u , ( b t b u c ) n hn g h a c h od e s t r u c t o r ot i n h k h i t c i n l i n e dv oc c t pt i nt i u , v p o p( ) ( m c t h c c o i l q u l nc h on i t u y n ) c n gi n l i n e d . L i nk t i t n gb yg i g i c o nt r nOb j e c t h nl k h o n gt r n gc o nt r , v n g nx ps c h c h pn h nv t r l i i t n gc o nt r . B yg i s t a c kl n h i ul i n hh o t h n , v n s t c h c r t n h i ul o i k h c n h a un h n gc n gs t i ud i t b t k i t n gc ns t l i t r nc c n g nx p. G i i h nm i ( m c u i c n gs c l o i b k h i m u c p d n gc h oc c v n t r o n gC h n g1 6 ) l b t c t h g c t t r nn g nx pp h i c t h a h n gt i t n g. l t t n ub n a n gb t ul ph c c a b nt u , n h n gn h n gg n ub n c m t l pn h c h u i m b nmu n c t h a v oc c n g nx p? T r o n gt r n gh pn y , c c l ph c m i p h i c c m t c h u i v m t i t n g, c n g h a l n p h i c t h a h n gt c h a i l p . i un y c g i l a k t h a v n l c h c a m t c h n gt r o n g T p2 c a c u ns c hn y( t i v t w w w . B r u c e E c k e l . c o m) . K h i b n c c h n gn y , b ns t h yr n g a k t h a c t h c yp h c t p , v l m t t n hn n gm b nn ns d n gm t c c ht i t k i m. T r o n gt r n gh pn y , t u yn h i n , t t c m i t h ng i nl m c h n gt i k h n g i q u a b t k n h i uc mb yt h a k :
// :C 1 5 :O S t a c k T e s t . c p p //{ T }O S t a c k T e s t . c p p #B a og m" O S t a c k . h " #B a og m" . ./R e q u i r e . h " #B a og m< f s t r e a m > #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; //S d n g ak t h a .C h n gt im u n //c m tc h u iv m t it n g : l pM y S t r i n g :c h u ic n gc n g , it n g{ p u b l i c : ~M y S t r i n g( ){ c o u t< <" x a c h u i : "< <*n y< <e n d l ; } M y S t r i n g( s t r i n gs ) :s t r i n g( s ){ } } ; i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ r e q u i r e A r g s( a r g c ,1 ) ;//t pt i nt nl t h a m s t r o n gi f s t r e a m( a r g v[ 1 ] ) ; mb o( t r o n g ,a r g v[ 1 ] ) ; s t a c kt e x t l i n e s ; n g d y ; // ct pt i nv d n gl ut r t r o n gn g nx p : t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) t e x t l i n e s . p u s h( m iM y S t r i n g( d n g ) ) ; //P o pm ts d n gt c h n g : M y S t r i n g*s ; f o r( i n ti=0;i< 1 0 ;i++ ){ i f( ( s=( M y S t r i n g* )t e x t l i n e s . p o p( ) )= =0 )b r e a k ; c o u t< <*s< <e n d l ; x as ; } c o u t< <" C h od e s t r u c t o rl mp h nc nl i :" < <E n d l ; }/// :~

M c d i un yc n gt n gt n h c c p h i nb nt r c c a c h n gt r n ht h n g h i mc h on g nx p, b ns n h n t h yr n gc h c 1 0 y ut c x u t h i nt n g , c n g h a l c t h c m t s i t n gc nl i . B i v c c n g n x pb i t r n gn g i i t n gs , h y n gc c hc t h l ms c hn h n gt h l n , v b ns t h y i un yt r o n g
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 266/320

08/10/2013

Suy ngh trong C + +, Vol 1

ur a c a c h n gt r n h , k t k h i My S t r i n g i t n gi nt h n g i pn h h b p h h y . T oc o n t a i n e r m g i i t n gk h n gp h i l m t c c ht i pc nh pl n ub nc m t h t h n g nl b t n g u nt ( t h c t h i b n gn g nn g h o c b n gc c hy uc ur n gt t c c c l pk t h a t i t n g) . T r o n gt r n g h p , t t c m i t h c mb o c m t i t n gv d o , n k h n gp h i l r t p h c t p s d n gc c c o n t a i n e r . T r o n gC++ , t u yn h i n , b nk h n gt h mo n g i i un yt m i t n gl p , d o , b n a n gb r n g b u c i q u a a k t h a n ub nc c c ht i pc nn y . B ns t h yt r o n gC h n g1 6 r n gm ug i i q u y t v n m t c c h ng i nh nn h i uv t a on h h n .

i uh n hq u t i

B nc t h l mc h oc c n h k h a i t h c og i n gn h c h c n n gt h n hv i nk h c . T h c h i nok h a i t h c t h n gt r t h n hk h h i u , t u yn h i n , b i v b nc t h h o t n gt r nh a i i t n g , c v i c c l o i k h n gr . i un y t h n gl t r n gh pv i c c t h n hp h nt o nh c ( m b nt h n gx u y nq u t i k h a i t h c ) . V d , h yx e mx t m t h t h n gg i a od c hv i ma t r n , v e c t v c c g i t r v h n g , t t c b a t r o n gs c n g u ng c t l pT o n :

// :C 1 5 :O p e r a t o r P o l y m o r p h i s m . c p p // ah n hv in h n gh o t n gq u t i #I n c l u d e s d n gt nm i nk h n gg i a nt i uc h u n ; l pM a t r i x ;l pv h n g ;l pV e c t o r , l pT o n{ p u b l i c : T o n ov i uh n h*( T o n&r v )=0 ; T o n o&n h n( M a t r i x* )=0 ; T o n o&n h n( v h n g* )=0 ; T o n o&n h n( V e c t o r* )=0 ; o~T o n( ){ } } ; l pM a t r i x :T o n{ p u b l i c : T o nh cv n h i uh n h*( T o n&r v ){ r v . m u l t i p l yt r l i( n y ) ;//2c n gv n } T o nh c&n h n( M a t r i x* ){ c o u t< <" M at r n*M at r n "< <e n d l ; *t r l in y ; } T o nh c&n h n( v h n g* ){ c o u t< <" v h n g*M at r n "< <e n d l ; *t r l in y ; } T o nh c&n h n( V e c t o r* ){ c o u t< <" V e c t o r*M at r n "< <e n d l ; *t r l in y ; } } ; l pv h n g :T o nc n g { p u b l i c : T o nh cv n h i uh n h*( T o n&r v ){ r v . m u l t i p l yt r l i( n y ) ;//2c n gv n } T o nh c&n h n( M a t r i x* ){ c o u t< <" M at r n*v h n g "< <e n d l ; *t r l in y ; } T o nh c&n h n( v h n g* ){ c o u t< <" v h n g*v h n g "< <e n d l ; *t r l i n y ; } T o nh c&n h n( V e c t o r* ){ c o u t< <" V e c t o r*v h n g "< <e n d l ; * t r l in y ; } } ; c l a s sV e c t o r :T o nc n g { p u b l i c : T o nh cv n h i uh n h*( T o n&r v ){ r v . m u l t i p l yt r l i( n y ) ;//2c n g v n } T o nh c&n h n( M a t r i x* ){ c o u t< <" M at r n*V e c t o r "< <e n d l ; *t r l in y ; } T o nh c&n h n( v h n g* ){ c o u t< <" v h n g*V e c t o r "< <e n d l ; * t r l in y ; } T o nh c&n h n( V e c t o r* ){ c o u t< <" V e c t o r*V e c t o r "< <e n d l ; *t r l in y ; } } ; i n tm a i n( ){ M at r nm ;V e c t o rv ;v h n gs ; T o n*t o nh c[ ]={ &m ,&v ,&s } ; f o r( i n ti=0 ;i< 3 ;i++ ) f o r( i n tj=0 ;j< 3 ;j++ ){ t o n&m 1=*t o nh c[ i ] ; T o n&m 2=*t o nh c[ j ] ; m 1* m 2 ; } }/// :~

ng i n , c h c i uh n h* b q u t i . M c c hl c t h n h nb t k h a i m nT o n i t n gv s nx u t c c k t q u mo n gmu nv l ur n gn h nm t ma t r nc a m t v e c t o r l m t h o t n gr t k h c s ov i n h nm t
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 267/320

08/10/2013

Suy ngh trong C + +, Vol 1

v e c t o r n h m t ma t r n . V n l , t r o n gma i n( ) , b i ut h c m1 * m2 c h a h a i n e ml n T o nt i l i ut h a mk h o , v d o h a i i t n g t h u c l o i k h n gr . M t c h c n n g oc h c k h n n gt h c h i nm t c n gv nd u yn h t l , x c n hk i u c a m t i t n gk h n gr . x c n hc h a i l o i m t k t h u t c g i l n h i up h i c s d n gt r o n gv d n y , t h e o n h n gg d n gn h l m t n ok t q u c u c g i c h c n n gt r o n gm t c u c g i ot h h a i . B i t h i g i a nc u c g i t h h a i n y c t h c h i n , b n x c n hc h a i l o i i t n g , v c t h t h c h i nc c h o t n gt h c hh p . Nk h n gmi n hb c h ut i n , n h n gn ub nn h nc h mc h mv ov d c h om t l c n s b t uc n g h a . C h n y c k h a i t h c s uh nt r o n gc c m ut h i t k c h n gt r o n gt p2 , m b nc t h t i v t i w w w . B r u c e E c k e l . c o m.

Do wn c a s t i n g

Nh b nc t h o n , k t k h i c m t i un h v yn h u p c a s t i n gd i c h u y nl nm t h t h n gp h nc pt h a k c n gn n d o w n c a s t i n g d i c h u y nx u n gm t h t h n gp h nc p . Nh n gu p c a s t i n gl d d n gv k h i b nd i c h u y nl n m t h t h n gp h nc pt h a k c c l ph c l u nl u nh i t nc c l ph c t n gq u t h n . l , k h i b nu p C a s t b nl u nc n g u ng c r r n gt m t l pt t i n( t h n gc h c m t , n g o i t r t r o n gt r n gh pc a n h i ut h a k ) n h n gk h i b nn h nx u n gt h n gc n h i uk h n n gm b nc t h c . C t h h n , m t mi l m t l o i h n h( l n e ml n ) , n h n g n u b n c g n g n h n x u n g m t h n hd n gn c t h l m t mi , Qu n g t r n g, T a mg i c , v vV v y , t i nt h o i l n gn a nl t mr a m t c c h a nt o n m m. ( T u yn h i n , m t v n q u a nt r n gh nl t h i t i s a ob n a n gd o wn c a s t i n g n i ut i nt h a yv c h s d n g a h n h t n g t mr a n gl o i . C c t r n hd o wn c a s t i n g c c pt r o n gt p2 c a c u ns c hn y . ) C++c u n gc pm t c b i t d i nv i nr r n g ( g i i t h i ut r o n gc h n g3 ) c g i l d y n a mi c _ c a s t l m t m ml o i a nt o nh o t n g . K h i b ns d n gd y n a mi c _ c a s t c g n gn mx u n gm t l o i c b i t , g i t r t r v s l m t c o nt r nk i umo n gmu nc h k h i c c d i nv i nl p h h pv t h n hc n g , n uk h n gn s t r l i b n g c h r a r n g i un yl k h n g n gl o i . yl m t v d n h :

// :C 1 5 :D y n a m i c C a s t . c p p#i n c l u d eu s i n gn a m e s p a c es t d ; l pP e t{ p u b l i c :v i r t u a l~P e t( ){ } } ;c l a s sD o g :P e tc n g{ } ;l pC t :P e t c n g{ } ; i n tm a i n( ){ V tn u i*b=n e wC t ;//u p C a s t //H yt h q u n gc h oc h * : C o nc h *d 1=d y n a m i c _ c a s t< D o g * >( b ) ; //H yt h b n v o*C t : C t*d 2=d y n a m i c _ c a s t< C a t * >( b ) ; c o u t< <" d 1= "< <( d i )d 1<< e n d l ; c o u t< <" d 2= "< <( d i )d 2< <e n d l ; }/// :~

K h i b ns d n gd y n a mi c _ c a s t , b np h i l mv i c v i m t h t h n gp h nc p a h n hs t h t m t v i c h c n n g ov d y n a mi c _ c a s t s d n gt h n gt i nl ut r t r o n gv t a b l e x c n hc c l o i t h c t . y , c c l pc s c c h a m t h mh y ov p n g . T r o n gma i n( ) , m t C t c o n t r l n e ml n m t v t n u i , v s a u n h nx u n gl c g n g c m t c o nc h c o nt r v m t C t c o nt r . C h a i c o nt r c i n , v b ns t h yk h i b nc h yc h n gt r n h m b u nm i m t k h n gc h n hx c t or a m t k t q u k h n g . T t n h i n , b t c k h i n ob nb u nm i m t b nc t r c h n h i mk i mt r a mb or n gc c k t q u c a c c d i nv i nl k h c k h n g . Ng o i r a , b nk h n gn nc h or n gc o n t r s g i n gh t n h a u , b i v i k h i i uc h n hc o nt r d i nr a t r o n gu p c a s t i n gv d o wn c a s t i n g( c b i t , v i n h i ud i s n ) . M t d y n a mi c _ c a s t i h i m t c h t t h mp h c h y , k h n gn h i u , n h n gn ub n a n gl mr t n h i u d y n a mi c _ c a s t i n g( t r o n gt r n gh pn yb nn n t c uh i n g h i mt c t h i t k c h n gt r n hc a b n ) n yc t h t r t h n hm t v n h i us u t . T r o n gm t s t r n gh p , b nc t h b i t i ug c b i t t r o n gd o wn c a s t i n gc h o p h pb nn i c h c c h nn h n gg l o i b n a n gx l , t r o n gt r n gh pn y , c h i p h t h mc a d y n a mi c _ c a s t t r n n k h n gc nt h i t , v b nc t h s d n gm t s t a t i c _ c a s t t h a yt h . yl c c hn c t h l mv i c :
// :C 1 5 :S t a t i c H i e r a r c h y N a v i g a t i o n . c p p //D u y tp h nc pl pv is t a t i c _ c a s t #I n c l u d e#i n c l u d e< t y p e i n f o >s d n gt nm i nk h n gg i a nt i u c h u n ; l pS h a p e{ p u b l i c :v i r t u a l~S h a p e( ){ } ; } ;l pC i r c l e :H n hd n gc n g{ } ;l pS q u a r e : H n hd n gc n g{ } ;l pk h c{ } ; i n tm a i n( ){ V n gt r nc ; H n hd n g*s=& c ;//u p C a s t :b n ht h n gv O K //r r n gh nn h n gk h n g c nt h i t : s=s t a t i c _ c a s t< S h a p e * >( &c ) ; //( T u p c a s t i n gl m ta nt o nv p h b i n //H o t n g ,c cd i nv i nt r n nl nx n ) V n gt r n*c p=0 ; V u n g*s p=0 ; //D a n hm ct n hc ap h nc pl p //y uc ul o it h n gt i nt h m : n u( t y p e i d
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 268/320

08/10/2013

Suy ngh trong C + +, Vol 1

( s )= =t y p e i d( c p ) )//C++R T T I c p=s t a t i c _ c a s t< C i r c l e * >( s ) , n u( t y p e i d ( s )= =t y p e i d( s p ) ) s p=s t a t i c _ c a s t< S q u a r e * >( s ) ; !n u( c p=0 ) c o u t< <" l m tv n gt r n ! "< <E n d l ; i f( !s p=0 ) c o u t< <" N l m th n hv u n g ! "< <E n d l ; //C h u y nh n gt n hl c h m th a c kh i uq u ; //d y n a m i c _ c a s tl u nl u nl a nt o nh n . T u yn h i n : //K h c*o p=s t a t i c _ c a s t< O t h e r * >( s ) ; //T h u n ar am tt h n gb ol i ,t r o n gk h i K h c*o p 2=( k h c* )s ; //K h n g }/// :~

T r o n gc h n gt r n hn y , m t t n hn n gm i c s d n gm k h n g c mt y c h o nk h i t p2 c a c u n s c hn y , t r o n g m t c h n g c t r a oc h oc h n y : C++' s t h n g t i nk i ut h i g i a nc h y ( R T T I ) c c h . R T T I c h op h pb nk h mp h c c l o i t h n gt i n b m t b i u p c a s t i n g . C c d y n a mi c _ c a s t t h c s l m t h n ht h c R T T I . y , t y p e i dt k h a ( c k h a i b ot r o n gt pt i nt i u < t y p e i n f o >) c s d n g p h t h i nc c l o i c a c o nt r . B n c t h t h y r n g c c l o i c a n e ml n H n h d n gc o nt r l i nt c s ov i m t v n gc o nt r v Qu n gt r n gc o nt r x e mn uc m t t r n u . C n h i u n R T T I h nt y p e i d, v b nc n gc t h t n gt n gr n gn s l k h d d n g t h c h i nh t h n gt h n gt i nk i u r i n gc a b nb n gc c hs d n gc h c n n g o . M t v n gt r n i t n g c t o r a v a c h l n e ml n m t h n hc o nt r , p h i nb nt h h a i c a b i ut h c c h o t h yc c hb nc t h s d n gs t a t i c _ c a s t c r r n g h n v n e ml n . T u yn h i n , k t k h i m t n e ml n l u n l u n c a nt o nv l m t i up h b i n l m, t i x e mx t m t d i nv i nr r n gc h ou p c a s t i n gl l nx nv k h n gc nt h i t . R T T I c s d n g x c n hl o i , v s a u s t a t i c _ c a s t c s d n g t h c h i nb u nm i m t . Nh n gn h nt h y r n gt r o n gt h i t k n yq u t r n hn yl c h i uq u t n gt n h s d n gd y n a mi c _ c a s t , v c c l pt r n hk h c hh n g p h i l m m t s x t n g h i m k h mp h c c d i nv i n t h c s t h n hc n g . B nt h n gs mu nc m t t n h h u n g l h nx c n hh nt r o n gv d t r nt r c k h i s d n gs t a t i c _ c a s t h nl d y n a mi c _ c a s t ( v , m t l nn a , b n mu nc nt h nk i mt r a t h i t k c a b nt r c k h i s d n gd y n a mi c _ c a s t ) . N um t h t h n gp h nc pl p k h n gc oc h c n n g( m l m t v n t h i t k ) , h o c n ub nc t h n gt i n k h c c h op h pb nm t c c ha nt o nn h nx u n g , l m t c h t n h b n h a n hh n l mb u nm i m t t n hh nv i d y n a mi c _ c a s t . Ng o i r a , s t a t i c _ c a s t s k h n gc h op h pb nb r a k h i h t h n gp h nc p , n h c c d i nv i nt r u y n t h n gs , v v yn a nt o nh n . T u yn h i n , i uh n gt n hp h nc pl pl u nl u nl n g u yh i mv b nn ns d n gd y n a mi c _ c a s t t r k h i b nc m t t n hh u n g c b i t .

T mt t

a h n ht h c h i nt r o n gC++v i c h c n n g oc n g h a l " h n ht h c k h c n h a u . " T r o n gl pt r n hh n g i t n g , b nc k h u nm t g i n gn h a u( g i a od i np h b i nt r o n gc c l pc s ) v c c h n ht h c k h c n h a us d n gk h u nm t : c c p h i nb nk h c n h a uc a c c c h c n n g o . B n n h nt h yt r o n gc h n gn yl n k h n gt h h i u c , h o c t h mc h t o , m t v d v a h n hm k h n g s d n gd l i ut r ut n gv t h a k . a h n hl m t t n hn n gm k h n gc t h c x e mt r o n gs c l p( n h c o n s t h o c c h u y n i t u y nb , v d ) , n h n gt h a yv c h h o t n gt r o n gb u i h a n h c , n h m t p h nc a m t " b c t r a n h " c a c c m i q u a nh l p . M i n g i t h n gn h ml nb n gc c hk h c , t n hn n gk h n gh n g i t n gc a C++ , n h q u t i v i s m c n h , m i k h i c t r n hb yn h l h n g i t n g . n g b l a , n un k h n gp h i l c u i r n gb u c , n k h n gp h i l a h n h . S d n g a h n hv d o , c c k t h u t h n g i t n gc h i uq u t r o n gc c c h n gt r n hc a b n , b np h i m r n gt mn h nc a b nc a c h n gt r n hb a og mk h n gc h c c t h n hv i nv t h n g i pc a m t l ph c c n h n , m c nl s t n g n gg i a c c l pv c c m i q u a nh c a h v i n h a u . M c d i un y i h i n l c n gk , l m t c u c ut r a n hx n g n g , b i v k t q u p h t t r i nn h a n hh nc h n gt r n h , t c h c c o d e t t h n , c c c h n gt r n hm r n gv b ot r m d d n gh n . a h n hh o nt t c c t n hn n gh n g i t n gc a n g nn g , n h n gc t h mh a i t n hn n gc h n ht r o n gC++ : m u( c g i i t h i ut r o n gc h n g1 6 v t r n hb yc h i t i t h nt r o n gt p2 ) , v x l n g o i l ( c c pt r o n g t p2 ) . Nh n gt n hn n gn yc u n gc pc h ob nn h k h c t h t n gs c m n hl pt r n hn h t n gt n hn n g h n g i t n g : n hm yt r ut n gd l i u , t h a k , v a h n h .


C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

B i t p
.1

T om t ng i n" h n hd n g " h t h n gp h nc p : m t l pc s c g i l h n hd n gv l pt h a k c g i l v n g, Qu n gt r n g, v T a mg i c . T r o n gl pc s , t h c h i nm t c h c n n g og i l h a ( ) , v g h i l n i un yt r o n gc c l pd nx u t . L mc h om t m n gc a c c c o nt r n hh n h i t n gm b nt or a t r nh e a p( v d o t h c h i nu p c a s t i n gc a c o nt r ) , v g i h a ( ) t h n gq u a c c c o nt r l pc s , x c
269/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

2. 3. .4 5. .6

7. .8 9.

10. 11. 12. 13. 14. 15. 16. 17. 18.

19. 20.

21. 22.

23. 24. 25.

mi n hh n hv i c a c c c h c n n g o . N ug r i c a b nh t r n , nb c q u a m . S a t p1 v ( ) l m t c h c n n gt h u n o . C g n gt or a m t i t n gc a l o i h n h. C g n gg i h m t h u n ot r o n gc c n h x yd n gv x e mn h n gg s x yr a . l i n n h m t ot i n hk h i t , c u n gc pc h ov ( ) n hn g h a . M r n gt r nB i t p2 , t or a m t c h c n n gm p h i m t m t h n h i t n gt h e o g i t r v c g n g n e ml n m t i t n gc n g u ng c t r o n gl mt h a ms . X e mn h n gg s x yr a . S a c h a c c c h c n n gb n gc c h l ym t t h a mc h i u nc c h n hd n g i t n g . S a i C 1 4 : C o mb i n e d . c p p f ( ) l ot r o n gl pc s . T h a y i c h n h( ) t h c h i n m t n e ml n v m t c u c g i o . S a i I n s t r u me n t 3 . c p pb n gc c ht h m m t c h u nb o() c h c n n g . G i c h u nb ( ) t r o n gg i a i i u( ) . T om t h t h n gp h nc pt h a k c a n gv t g m n h m : C h u t , Ge r b i l , Ha ms t e r , v vT r o n gc c l pc s , c u n gc pp h n gp h pc h u n gc h ot t c c c n gv t g m n h m , v x c n hl i n h n gt r o n gc c l p c t h a t h c h i nh n hv i k h c n h a ut yt h u c v ol o i h n hc t h c a n gv t g m n h m . T or a m t m n gc a c o nt r n n gv t g m n h m , i nv on v i c c l o i c t h k h c n h a uc a n gv t g m n h m , v g i c c p h n gt h c l pc s c a b n x e mn h n gg s x yr a . S a i t p6 b ns d n gm t < R o d e n t * >v e c t o r t h a yv m t m n gc a c o nt r . H yc h c c h nr n gb n h c l ms c h n gc c h . B t uv i t r c n gv t g m n h m h t h n gp h nc p , t h a k B l u e Ha ms t e r t Ha ms t e r ( c , c m t i u n h v y , t i c m t t r o n gk h i t i l m t a t r ) , g h i l nc c p h n gp h pl pc s , v c h ot h yc c m m c c c u c g i l pc s p h n gp h pk h n gc np h i t h a y i t h c h n gv i l o i m i . B t uv i t r c n gv t g m n h m h t h n gp h nc p , t h m m t d e s t r u c t o r k h n g o , t or a m t i t n g c a l pHa ms t e r s d n gmi , n e ml n c o n t r n m t n gv t g m n h m * , v x a c c c o nt r c h r a r n gn k h n gg i t t c c c h mh yt r o n gh t h n gp h nc p. T h a y i d e s t r u c t o r l ov c h n gmi n h r n gh n hv i b yg i l n g . B t uv i t r c n gv t g m n h m h t h n gp h nc p , s a i n gv t g m n h m n l m t l pc s t r ut n gt i n hk h i t . T om t h t h n gk i ms o t k h n gl uv i c s c pm yb a yv c c l o i c n g u ng c k h c n h a u . T or a m t T h pl ph c v i m t < A i r c r a f t * >v e c t o r s g i c c t h n g i pp h h pv i c c m yb a yk h c n h a ud i s k i ms o t c a n . T om t mh n hc a m t n h k n hb n gc c hk t h a n h i ul o i t h c v t v c c h x yd n gv oh i u n gn h k n hc a b nc h ms c c a c c n h m y . T r o n gE a r l y . c p p, l mc h ot h n u i m t l pc s t r ut n gt i n hk h i t . T r o n gA d d i n g V i r t u a l s . c p p, l mc h ot t c c c c h c n n gt h n hv i nc a P e t i u ot i n hk h i t , n h n gc u n g c pm t n hn g h a c h ot n( ) . S a c h a c h k h i c nt h i t , b n gc c hs d n g n hn g h a l pc s c a t n( ) . V i t m t c h n gt r n hn h t h ys k h c b i t g i a g i m t h m ob nt r o n gm t h mt h n hv i nb n h t h n gv g i m t h m ob nt r o n gm t n h x yd n g . C h n gt r n hp h i c h n gmi n hr n gh a i c u c g i t o r a k t q u k h c n h a u . S a i V i r t u a l s I n De s t r u c t o r s . c pb n gc c hk t h a m t l ppt n g u ng c v q u a nt r n gh nf ( ) v h m h y . T r o n gma i n( ) , t o r a v n e ml n m t i t n g k i u m i c a b n , s a u x a n . H yt p1 6 v t h mc c c u c g i nf ( ) t r o n gm i h y . G i i t h c hn h n gg x yr a . T om t l pc m t t h n hv i nd l i uv m t l pd nx u t c t h m m t t h n hv i nd l i u . V i t m t h m k h n gt h n hv i nm p h i m t m t i t n gc a l pc s c a g i t r v i nr a k c ht h c c a i t n gs d n gs i z e o f . T r o n gma i n( ) t or a m t i t n gc a l pd nx u t , i nr a k c ht h c c a n , v s a u g i c h c n n gc a b n . G i i t h c hn h n gg x yr a . T om t v d ng i nc a m t c u c g i c h c n n g ov t or a s nl n gl pr p . X c n hv t r m l pr p c h oc c c u c g i ov t h e od i v g i i t h c hc c m . V i t m t l pv i m t c h c n n g ov m t c h c n n gn o n v i r t u a l . K t h a m t l pm i , l mc h om t i t n g c a l p n y , v n e ml n n m t c o n t r c a k i u c s n g c p . S d n g n gh ( ) c h c n n gt mt h y t r o n g< c t i me >( b ns c np h i x e mx t i un yt r o n g a p h n gc a b nh n gd nt h v i nC ) o l n gs k h c b i t g i a m t c u c g i ov c u c g i k h n g o . B ns c np h i t h c h i nn h i uc u c g i n t n gc h c n n gt r o n gv n gt h i g i a nc a b n t h ys k h c b i t . S a i C 1 4 : Or d e r . c p pb n gc c ht h m m t h m ot r o n gl pc s c a Nh mv m( c n i nm t c i g ) v b n gc c hl mc h od e s t r u c t o r o . L mc h oc c i t n gc a l pc o nk h c n h a uv u p C a s t h t i l pc s . X c mi n hr n gc c h n hv i oh o t n gv x yd n gt h c hh pv t i uh yd i nr a . V i t m t l ph c v i b a c h c n n g oq u t i . K t h a m t l pm i t n yv g h i l nm t t r o n gn h n gc h c n n g . T or a m t i t n gc a l pd nx u t c a b n . B nc t h g i t t c c c c h c n n gl pc s t h n gq u a c c i t n gc n g u ng c t l p ? N e ml n a c h c a i t n g v o c s . B nc t h g i c b a c h c n n g t h n gq u a c c c s ? L o i b c c n hn g h a g h i t r o n gl pd nx u t . C t h b yg i b n g i t t c c c c h c n n gl pc s t h n gq u a c c i t n gc n g u ng c t l p ? S a i V a r i a n t R e t u r n . c p p c h ot h yr n gh n hv i c a n l mv i c v i c c t i l i ut h a mk h oc n gn h c o n t r . T r o n gE a r l y . c p p, l mt h n ob nc t h c h ob i t c c t r n hb i nd c hl mc h oc c c u c g i s d n gs mh o c mu nr n gb u c ? X c n hc c t r n gh pc h ot r n hb i nd c hc a r i n gb n . T om t l pc s c c h a m t b ns a o( ) h mt r v m t c o nt r t i m t b ns a o c a i t n gh i nt i . L yh a i l pc o ng h i l nb ns a o( ) t r l i b ns a oc a l o i h n hc t h c a h . T r o n gma i n( ) , t or a v u p C a s t i t n gc a h a i l o i n g u ng c c a b n , s a u g i c l o n e ( ) c h om i v x c mi n hr n gc c b ns a on h nb n
270/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

26. 27. 28.

29.

30.

31. 32. 33. 34. 35. 36.

v t n hl p h nn h mc h n hx c . T h n g h i mv i c c b nc l o n e ( ) c h c n n g b nq u a yt r l i c c l o i h n h c s , s a u c g n gq u a yt r l i c c l o i c n g u ng c c h n hx c . B nc t h n g h v t n hh u n gt r o n g c c ht i pc nt h h a i l c nt h i t ? S a i OS t a c k T e s t . c p pb n gc c ht or a l ph c c a r i n gc a b n , s a u n h n k t h a n v i i t n g t or a m t c i g c t h c t v on g nx p. K i mt r a l ph c c a b nt r o n gma i n( ) . T h m m t l o i c g i l T e n s o r Op e r a t o r P o l y mo r p h i s m. c p. p ( T r u n gc p ) T oc s l pXk h n gc t h n hv i nd l i uv k h n gx yd n g , n h n gv i m t c h c n n g o . T o r a m t Yl p c t h a k t X, n h n gm k h n gc m t n h x yd n gr r n g . T or a c c m l pr pv k i mt r a n x c n hx e m m t n h x yd n g c t or a v k ug i X, v n un h v y , n h n gm n o . G i i t h c hn h n gg b nk h mp h . Xk h n gc c o n s t r u c t o r m c n h , v yt i s a ok h n gt r n hb i nd c hk h i u n i ? ( T r u n gc p ) S a i t p2 8 b n gc c hv i t x yd n gc h oc l ph c m i c o n s t r u c t o r g i m t c h c n n g o . T or a c c m l pr p . X c n hn i V P T R a n g c p h nc n gt r o n gt n gx yd n g . L c c h o c s d n gb i t r n hb i nd c hc a b nb nt r o n gc c n h x yd n g ? T h i t l pl d ot i s a oc c p h i nb n a p h n gc a c c c h c n n gv n a n g c g i . ( n n gc a o ) N uc h c n n gc u c g i nm t i t n gt h n gq u a g i t r k h n g ub r n gb u c , m t c u c g i oc t h t r u yc pc c b p h nk h n gt nt i . N yl c t h ? V i t m t s m b u c m t c u c g i o , v x e mn u i un yg yr a m t v t a i n n . g i i t h c hh n hv i , k i mt r a n h n gg s x yr a k h i b nv t q u a m t i t n gt h e og i t r . ( n n gc a o ) T mh i uc h n hx c b a on h i ut h i g i a nh nl c nt h i t c h om t c u c g i c h c n n g ob n gc c h v ol pr pt h n gt i nn g nn g x l c a b nh o c h n gd nk t h u t k h c v t mr a s c a c c q u c g i a n gh c nt h i t c h om t c u c g i ng i ns ov i s l n gc nt h i t c h oh n gd nc h c n n g o . X c n hs i z e o f c c V P T Rt h c h i nc a b n . B yg i n h n t h a k h a i l pc c h a c c c h c n n g o . B n c c m t V P T Rh o c h a i t r o n gl pb t n g u n ? T om t l pv i c c t h n hv i nd l i uv c h c n n g o . V i t m t c h c n n gm n h nv ob n h t r o n gm t i t n gc a l ph c c a b nv i nr a c c p h nk h c n h a uc a n . l m i un y , b ns c np h i t h n g h i m v l p i l pl i k h mp h n i V P T Rn mt r o n g i t n g . C c h or n gc h c n n g ok h n gt nt i , v s a i I n s t r u me n t 4 . c p p n s d n gd y n a mi c _ c a s t l mc h o t n g n gv i c c c u c g i o . G i i t h c hl d ot i s a o yl m t t n gt i . S a i S t a t i c Hi e r a r c h y Na v i g a t i o n . c p t h a yv ps d n gC++R T T I b nt oR T T I c a r i n gb nt h n gq u a m t h m ot r o n gl pc s c g i l wh a t A mI ( ) v m t k i ue n u m{ C i r c l e s , S q u a r e s . } ; B t uv i P o i n t e r T o Me mb e r Op e r a t o r . c pt C h n gp1 2 v t h yr n g a h n hv nh o t n gv i c o nt r n c c t h n hv i n , n g a yc k h i i uh n h >* b q u t i .

M c d C++m ul m t c n gc l pt r n hc m c c hc h u n g , k h i h c g i i t h i ut r o n gn g nn g , h d n g n h k h u y nk h c hv i c s d n gc c h t h n gp h nc pc o n t a i n e r l pd a t r n i t n g( t h h i n p h nc u i c a c h n g1 5 ) . V d , t i uc h u n C++c o n t a i n e r v c c t h u t t o n( g i i t h c ht r o n gh a i c h n gc a T p2 c a c u ns c hn y , t i v t w w w . B r u c e E c k e l . c o m) c t or i n gc h om uv l t n g i d d n gc h oc c l pt r n hv i ns d n g . C h n gn yk h n gc h t h h i nn h n g i uc b nc a m u , n c n gl m t g i i t h i uv c c t h n gc h a , l n h n gt h n hp h nc b nc a l pt r n hh n g i t n gv g nn h h o nt o nt h c h i nt h n gq u a c c c o n t a i n e r t r o n gt i uc h u nC++T h v i n . B ns t h yr n gc u ns c hn y c s d n gv d c o n t a i n e r c c S t a s hv n g nx pt r o n gs u t , c h n hx c g i pb nt h o i m i v i c o n t a i n e r , t r o n gc h n gn y , k h i n i mv l p c n g s c t h mv o . M c d c o n t a i n e r l n h n gv d l t n g s d n gv i c c m u , t r o n gt p2 ( t r o n g c m t c h n gm ut i nt i n ) , b ns b i t r n gc r t n h i uc n gd n gk h c c h oc c m ul t t .

C o n t a i n e r

G i s b nmu nt or a m t c h n g , n h c h n gt i l mt r o n gs u t c u ns c h . L pn yc h n gs t c h c i n t s , g i c h on ng i n :

// :C 1 6 :I n t S t a c k . c p p // ng i nn g nx ps n g u y n //{ L }f i b o n a c c i #B a og m" f i b o n a c c i . h " #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d" /r e q u i r e . h . . " ; l pI n t S t a c k{ e n u m{ s s i z e=1 0 0 } ; i n ts t a c k[ s s i z e ] ;


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 271/320

08/10/2013

Suy ngh trong C + +, Vol 1

i n t u ; c n gc n g : I n t S t a c k( ) : u( 0 ){ } t r n gp u s h( i n ti ){ y uc u( u< s s i z e ," Q u n h i u p u s h( )e s " ) ; c h n g[ ut r a n g++ ]=i ; } i n tp o p( ){ y uc u( t r n >0 ," Q u n h i uc as p o p( )s " ) ; t r l in g nx p[ - ut r a n g ] ; } } ; i n tm a i n( ){ I n t S t a c kl ; //T h mm ts c o ns F i b o n a c c i ,q u a nt m : f o r( i n ti=0 ;i< 2 0 ;i++ ) i s . p u s h( f i b o n a c c i( i ) ) ; //P o p v i nc h n g : f o r( i n tk=0 ;k< 2 0 ;k++ ) c o u t< <i s . p o p( )< <e n d l ; }/// :~

L pI n t S t a c kl m t v d n h c a m t yx u n gs t a c k . V ng i nn c t or a yv i m t k c ht h c c n h , n h n gb nc n gc t h s a i n t n gm r n gb n gc c hp h nb b n h r a k h i n g , n h t r o n gc c n g nx pl ph c c k i mt r a t r o n gs u t c u ns c h . ma i n( ) c h ob i t t h m m t s n g u y nv os t a c k , v b t c h n gr a m t l nn a . l mv d t h v h n , c c s n g u y n c t or a v i f i b o n a c c i ( ) c h c n n g , t or a n h n gc o ns t h s i n hs nt r u y nt h n g . yl t pt i nt i u m t u y n b c h c n n g :
// :C 1 6 :f i b o n a c c i . h//F i b o n a c c is m yp h t i ni n tf i b o n a c c i( i n t n ) ;/// :~

yl v i c t h c h i n :
// :C 1 6 :f i b o n a c c i . c p p{ O } #B a og m" . ./R e q u i r e . h " i n tf i b o n a c c i( i n tn ){ i n ts z=1 0 0 ; y uc u( n< s z ) ; t n hi n tf[ S Z ] ;// k h it ob n gk h n g e[ 0 ]=f[ 1 ]=1 ; //Q u tc h oc cp h nt m n gk h n gh n : i n ti ; f o r( i=0 ;i< s z ;i++ ) i f( f[ i ]= =0 )b r e a k ; t r o n gk h i( i< =n ){ f[ i ]=f[i 1 ]+f[ i 2 ] ; i++ ; } t r l ie[ n ] ; }/// :~

yl m t t h c h i nt n g i h i uq u , b i v n k h n gb a og i t or a n h n gc o ns n h i uh nm t l n . Ns d n gm t t n hm n gc a i n t , v d a t r nt h c t l t r n hb i nd c hs k h i t om t t n hm n gk h n g . L n g i u t i nc h ov n gd i c h u y nc h s t i nn i m c c p h nt m n g ut i nl s k h n g , s a u m t t r o n gk h i v n g l pc h ob i t t h ms F i b o n a c c i v om n gc h o nk h i c c y ut mo n gmu n t c . Nh n gn h nt h yr n gn u c c c o ns F i b o n a c c i t h n gq u a y ut n c k h i t o , n b q u a t r o n gk h i v n gl ph o nt o n .

S c nt h i t i v i c cc o n t a i n e r

R r n g , m t s n g u y nn g nx pk h n gp h i l m t c n gc r t q u a nt r n g . Nh uc ut h c s i v i c c c o n t a i n e r nk h i b nb t ul mc h oc c i t n gt r n n gs d n gmi v p h h yc h n gv i x a . T r o n gc c v n l pt r n hc h u n g , b nk h n gb i t b a on h i u i t n gm b ns c nt r o n gk h i b n a n gv i t c h n gt r n h . V d , t r o n gh t h n gk i ms o t k h n gl ub nk h n gmu ng i i h ns l n gm yb a yh t h n gc a b nc t h x l . B nk h n gmu nc h n gt r n h h yb c h v b nq u m t s s . T r o n gm t t h i t k h t h n gm yt n hh t r , b n a n gl mv i c v i n h i uh n hd n g , n h n gc h c n g i d n gx c n h( t i t h i g i a nc h y ) c h n hx c b a on h i u h n hd n gb ns c n . M t k h i b nn h nt h yx uh n gn y , b ns k h mp h r a r t n h i uv d t r o n gt n hh u n g l pt r n hc a r i n gb n . L pt r n hCn g i d a v ob n h o x l " q u nl b n h " c a h t h n gt mt h yn h n gt n gmi , x a , v c c l pc o n t a i n e r l mp h i n . R r n g , m t t h c t t r o n gCl t or a m t m n gt o nc ur t l n , l nh nb t c i ug c h n gt r n hs x u t h i nn h uc u . i un yc t h k h n g i h i n h i us u yn g h ( h o c n h nt h c c a ma l l o c ( ) v mi np h ( ) ) , n h n gn t or a c c c h n gt r n hm k h n gl mc n gt t v c h e g i ul i v i t . Ng o i r a , n ub nt om t m n gt o nc ur t l nc a c c i t n gt r o n gC++ , c c n h x yd n gv c h i p h h y c t h l mc h m i ux u n g n gk . C++p h n gp h pl mv i c t t h nn h i u : K h i b nc nm t i t n g , t o r a n v i mi , v t c o nt r c a n t r o n gm t c o n t a i n e r . S a u , c n r a v l m i ug v i n . B n gc c h n y , b nt or a c h c c c i t n gb nh o nt o nc n . V t h n gb nk h n gc t t c c c i uk i nk h i t oc s nt i k h i n gc a c h n gt r n h . mi c h op h pb nc h i c h o nk h i m t c i g x yr a t r o n gm i t r n g t r c k h i b nt h c s c t h t or a c c i t n g . V v y , t r o n gt n hh n hp h b i nn h t , b ns t h c h i nm t c o n t a i n e r c h a c o nt r nm t s i t n gq u a n t m. B ns t or a n h n g i t n gs d n gmi v a c o nt r k t q u t r o n gc o n t a i n e r ( c k h n n gu p c a s t i n g n t r o n gt i nt r n h ) , k on r a s a u k h i b nmu nl m i ug v i c c i t n g . K t h u t n ys nx u t l i n h h o t n h t , s px pc h u n gc a c h n gt r n h .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

272/320

08/10/2013

Suy ngh trong C + +, Vol 1

T n gq u a nv m u

B yg i l m t v n p h t s i n h . B nc m t I n t S t a c k, m g i n g u y n . Nh n gb nmu nc m t n g nx p g i h n hd n gh o c m yb a yh o c n h m yh a yc i g k h c . T i c ut r c m n g u nc a b nm i k h i k h n gc v n h m t c c ht i pc nr t t h n gmi n hv i m t n g nn g c h oh n gc t h d n gl i . C p h i l m t c c ht t h n .

C b a k t h u t c h om n g u nt i s d n gt r o n gt n hh u n gn y : c c hC , t r n hb y yc h o t n gp h n , c c h t i pc nS ma l l t a l k , m b n hh n g n gk C++v C++ , c c ht i pc n : m u . C c g i i p h pC. T t n h i nb n a n gc g n g c c t p h n gp h pt i pc nCv n l nx nv d b l i v h o nt o nk h n gt h a n hn h a . T r o n gp h n gp h pn y , b ns a oc h pm n g u nc h om t n g nx pv s a i b n g t a y , g i i t h i uc c l i m i t r o n gq u t r n hn y . i un yc h c c h nk h n gp h i l m t k t h u t r t h i uq u . C c S ma l l t a l ks o l u t i o. S ma l l t a l k( v J a v a , t h e og n gc a n ) ns d n gp h n gp h p ng i nv d h i u : B n mu ns d n gl i m , v v ys d n gt h a k . t h c h i n i un y , m i l pc o n t a i n e r n mg i c c m t h n gc a c c l pc s c h u n g i t n g( t n gt n h v d p h nc u i c a c h n g1 5 ) . Nh n gv c c t h v i nt r o n gS ma l l t a l kc t mq u a nt r n gc b nn h v y , b nk h n gb a og i t or a m t l ph c t u . T h a yv o , b np h i l u nl u nk t h a t m t l ph c h i nc . B nt mt h ym t l pc n gg nc n gt t m t t r o n gn h n gb nmu n , k t h a t n , v t h c h i nm t v i t h a y i . R r n g , yl m t l i t h v n g i mt h i un l c c a b n( v g i i t h c hl d ot i s a ob n d n hn h i ut h i g i a nh c t pc c l pt h v i nt r c k h i t r t h n hm t l pt r n hS ma l l t a l kc h i uq u ) . Nh n gn c n gc n g h a l t t c c c l ph c t r o n gS ma l l t a l kk t t h c l m t p h nc a m t c yt h a k d u yn h t . B n p h i k t h a t m t c h i n h n hc a c yn yk h i t om t l pm i . H uh t c c c yl c ( l c c l pt h v i n S ma l l t a l k ) , v t i t h m c g c c a c yl m t l p c g i l i t n gc n gl pm m i c o n t a i n e r S ma l l t a l kg i . [ 5 6 ] yl m t t h t h u t t i n hv i b i v n c n g h a l m i t n gl pt r o n gS ma l l t a l k( v J a v a ) h t h n gc pb c l ph c c n g u ng c t i t n g, d o , m i l pc t h c t c h c t r o n gm i c o n t a i n e r ( t r o n g c c h a c h n hn ) . y l l o i h t h n gp h nc p nc yd a t r nm t l o i c h u n gc h u n gc b n( t h n g c t t n i t n g, c n gl t r n gh pt r o n gJ a v a ) c g i l m t " i t n gd a t r nh t h n gp h nc p . " B nc t h n g h e t h u t n g n yv c h or n g l m t s m i k h i n i mc b nt r o n gOOP , n h a h n h . Nc h ng i n c p nm t h t h n gp h n c pl pv i i t n g( h o c m t s t nt n gt ) t i g c c a n v l pc o n t a i n e r m g i i t n g. B i v c c l pt h v i nS ma l l t a l kc m t l c hs d i h nn h i uv k i n hn g h i m n gs a un n h i uh ns ov i C++ , v b i v b ng c C++t r n hb i nd c h k h n g c t h v i nl pc o n t a i n e r , n d n gn h l m t t n gt t s a oc h p [ 5 7 ] t h v i nS ma l l t a l kt r o n gC++ . i un y c t h c h i nn h m t t h n g h i mv i m t uC++t h c h i n , v b i v n i d i nc h om t c t h n gk c a m , n h i un g i b t us d n gn . T r o n gq u t r n hc g n gs d n g c c l pc o n t a i n e r , h p h t h i nr a m t v n . V n l t r o n gS ma l l t a l k( v h uh t c c n g nn g h n g i t n gk h c m t i b i t ) , t t c c c l ph c s c t n gb t n g u nt m t h t h n gd u yn h t , n h n g i un yk h n g n gt r o n gC++ . B nc t h c h t h n gc pb c pd a t r n i t n gc a b nv i c c l pb n hc h a , n h n gs a u b nc t h mu a m t t pc c l ph n hd n gh o c c c l ph c m yb a yt m t n h c u n gc pn g i k h n gs d n gh t h n gp h nc p . ( i v i m t i u , s d n gh t h n gp h nc p p t t r nc a o , m c c l pt r n hv i nCt r n hn . ) L mt h n o b nc h nm t c yl ph c r i n g b i t v ol pc o n t a i n e r t r o n gh t h n gp h nc pd a t r n i t n gc a b n ? yl n h n gg c c v n h n hn h :

V C++h t r n h i uh t h n gp h nc p c l p , h t h n gp h nc p i t n gd a t r nS ma l l t a l kc a k h n gl mv i c r t t t . C c g i i p h pc v h i nn h i n . N ub nc t h c n h i up h nc pt h a k , s a u b ns c t h k t h a t n h i uh n m t l p : Nh i ut h a k s g i i q u y t v n . V v y , b nl mn h s a u( m t v d t n gt c a r a v oc u i c h n g1 5 ) : B yg i OS h a p e c h n hd n g c i m' s v h n hv i , n h n gb i v n c n gc n g u ng c t i t n gn c t h c t t r o n gc o n t a i n e r . T h a k t h mv oOC i r c l e , OS q u a r e , v v l c n t h i t n h n g l p h c c t h n em l nv oOS h a p e v d o g i l i c c h n hv i n g . B nc t h t h yr n gm i t h n h a n hc h n gn h n c l nx n . C c n h c u n gc pt r n hb i nd c hp h t mi n hv a i t n gd a t r nh t h n gp h nc pc o n t a i n e r l ph c c a r i n gc a h , h uh t t r o n gs c t h a yt h b i p h i nb nm u . B nc t h t r a n hl u nr n g a k t h a l c n t h i t g i i q u y t c c v n l pt r n hn i c h u n g , n h n gb ns t h yt r o n gt p2 c a c u ns c hn yl p h c t pc a n t t n h t l t r n hn g o i t r t r o n gt r n gh p c b i t .

C cg i i p h p m u

M c d m t h t h n gp h nc pd a t r n i t n gv i a k t h a l k h i n i m ng i n , n h a r a l a u n
273/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

[ 5 8 ] s d n g . T r o n gc u ns c hb a n uc a m n h S t r o u s t r u p c h n gmi n hn h n gg n gx e ml m t l a c h n t h c hh ph n h t h n gp h nc pd a t r n i t n g . L pc o n t a i n e r c t or a n h ma c r ot i nx l l nv i l u nc c t h c t h a yt h b n gl o i mo n gmu nc a b n . K h i b nmu nt or a m t c o n t a i n e r t c h c m t l o i h n hc t h , b n t h c h i nm t v i c u c g i v m . T h t k h n gma y , p h n gp h pn y n h ml nb i t t c c c t i l i uS ma l l t a l kh i nc v k i n hn g h i ml pt r n h , v l m t c h t k h s d n g . V c b n , k h n ga i n h nn . T r o n gk h i , S t r o u s t r u pv ++n h m Ct i B e l l L a b s s a i c c ht i pc nv mb a n uc a m n h , ng i nh a [ 5 9 ] n v d i c h u y nn t t nmi nc a t i nx l v ot r n hb i nd c h . T h i t b m t h a yt h m i n y c g i l mu , v n i d i nc h om t c c hh o nt o nk h c n h a u s d n gl i m . T h a yv s d n gl i m i t n g , n h v i d i s nv t h n hp h n , m t m ut i s d n gn g u n a n g . C o n t a i n e r k h n gc nn mg i m t l pc s c h u n g c g i l i t n g, n h n gt h a yv n g i m t t h a ms k h n gx c n h . K h i b ns d n gm t m u , c c t h a ms c t h a yt h b i t r n h b i nd c h , g i n gn h c c ht i pc nv mc , n h n gs c hh nv d d n gh n s d n g . B yg i , t h a yv l ol n gv t h a k , t h n hp h nk h i b nmu ns d n gm t l pc o n t a i n e r , b nn nt nd n gp h i nb n m uc a c o n t a i n e r v d pt t m t p h i nb nc t h c h ov n c t h c a b n , n h t h n y :

T r n hb i nd c hl mv i c c h ob n , v b nk t t h c v i c h n hx c c o n t a i n e r b nc np h i l mc n gv i c c a b n , c h k h n gp h i l m t h t h n gp h nc pt h a k k h s d n g . T r o n gC++ , c c m ut h c h i nc c k h i n i mv m t k i u t h a ms . M t l i c hc a p h n gp h pt i pc nm ul c c l pt r n hv i nm i l mq u e nv i n h n gn g i c t h k h n g q u e nt h u c h o c k h n gt h o i m i v i t h a k v nc t h s d n gc c l pc o n t a i n e r n gh pn g a yl pt c ( n h c h n g t i l mv i v e c t o r t r o n gs u t c u ns c h ) .

C p h p m u

C c mut k h a c h ot r n hb i nd c hm n hn g h a l ps a u ys v nd n gm t h o c n h i ul o i k h n gx c n h . n gt h i m l ph c t h c t c t or a t c c m u , c c l o i p h i c x c n h t r n hb i nd c hc t h t h a yt h c h n g . c h n gmi n hc p h p , yl m t v d n h m t or a m t m n gg i i h nk i mt r a l i :

// :C 1 6 :A r r a y . c p p #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d" /r e q u i r e . h . . " ; t e m p l a t eT >l pA r r a y{ e n u m{ s i z e=1 0 0 } ; h t r k t h u t [ s i z e ] ;c n gc n g : T&o p e r a t o r[ ]( i n ti n d e x ){ y uc u( c h s >=0& &i n d e x< k c ht h c , " C h s r ak h ip h mv i " ) ; t r l iA[ i n d e x ] ; } } ; i n tm a i n( ){ m n g< i n t >i a ; m n g< f l o a t >f a ; f o r( i n ti= 0 ;i< 2 0 ;i++ ){ i a[ i ]=i*i ; f a[ i ]=f l o a t( i)*1 , 4 1 4 ; } f o r( i n tj=0 ;j< 2 0 ;j++ ) c o u t< <j< <" : "< <i a[ j ] < <" , "< <f a[ j ]< <e n d l ;}/// :~

B nc t h t h yr n gn t r n gg i n gn h m t l ph c b n ht h n g , n g o i t r d n gt e m p l a t eT > m n i r n gTl t h a ms t h a yt h , v n i d i nc h om t l o i t n . Ng o i r a , b nn h nt h yT c s d n g k h p m i n i t r o n gl ph c n i b nt h n gt h yc c l o i h n hc t h c c t h n gc h a g i . T r o n gmn g, c c y ut c a v ov t r c hx u t v i c c c h c n n gt n gt : s q u t i t o nt [ ] . Nt r v m t t i l i ut h a mk h o , v v yn c t h c s d n gt r nc h a i m t c a m t d ub n g( c n g h a l , n h c m t g i t r t r i v m t r v a l u e ) . C h r n gn uc h s v t q u g i i h n , c c y uc u( ) c h c n n g c s d n g i nm t t h n gb o . K t k h i n h i uh n h[ ] l m tn i t u y n, b nc t h s d n gp h n gp h pn y mb or n gk h n g a r r a y b o u n d s x yr a v i p h m, s a u l o i b c c y uc u( ) c h om v nc h u y n . T r o n gma i n( ) , b nc t h t h yd d n gl t or a mn gs m c h a c c l o i k h c n h a uc a c c i t n g . K h i b n n i


M n g< i n t >i a ; M n g< f l o a t >f a ;

t r n hb i nd c hm r n gmn gm u( i un y c g i l i n s t a n t i a t i o n) h a i l n , t or a h a i m i c c l p h c c t o r a , m b nc t h n g h n h A r r a y _ i n t v A r r a y _ f l o a t .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 274/320

08/10/2013

Suy ngh trong C + +, Vol 1

n hn g h ac h cn n gk h n gn i t u y n

( T r n hb i nd c hk h c n h a uc t h t r a n gt r c c t nt h e on h n gc c hk h c n h a u . ) yl l ph c g i n gn h n h n g n g i b n c t h s nx u t n ub n t h c h i nt h a yt h b n gt a y , n g o i t r c c t r n hb i nd c ht or a c h n gc h o b nn h b nx c n hc c i t n gi a v f a . C n gl ur n gc c n hn g h a l pt r n gl ph o c l t r n h c b n g c c t r n hb i nd c hh o c s pn h pb i c c m i l i nk t . T t n h i n , c n h n gl c b ns mu nc n h n g n hn g h a c h c n n gk h n gn i t u y nt h n hv i n . T r o n gt r n g h pn y , t r n hb i nd c hc n x e m muk h a i b ot r c k h i n hn g h a h mt h n hv i n . D i yl n h n gv d t r n , s b i n i h i nt h c c n hn g h a t h n hv i nk h n gn i t u y n :
// :C 1 6 :A r r a y 2 . c p p //K h n gn it u y n n hn g h am u #B a og m" . ./R e q u i r e . h " t e m p l a t eT >l pA r r a y{ e n u m{ s i z e=1 0 0 } ; h t r k t h u t [ s i z e ] ;c n gc n g : T&o p e r a t o r[ ]( i n ti n d e x ) ; } ; t e m p l a t eT > T&m n g< T >: :o p e r a t o r[ ]( i n ti n d e x ){ y uc u( c h s >=0& &i n d e x< k c h t h c , " C h s r ak h ip h mv i " ) ; t r l iA[ i n d e x ] ; } i n tm a i n( ){ m n g< f l o a t >f a ; f a[ 0 ]=1 , 4 1 4 ; }// / :~

B t k t h a mc h i u nt nl pc a m up h i k mt h e od a n hs c h i s m uc a n , n h t r o n gmn g< T >: : o p e r a t o r [ . B nc t h ] t n gt n gr n gt r o n gn i b , t nl p a n g c t r a n gt r v i c c i s t r o n gc c m u d a n hs c h i s t or a m t n hd a n ht nl pd u yn h t c h om i t e mp l a t e . T pt i nt i u Ng a yc k h i b nt or a c c n hn g h a c h c n n gk h n gn i t u y n , b ns t h n gmu n t t t c k h a i b ov n h n g h a c h om t m uv om t t pt i nt i u . i un yc t h d n gn h v i p h mc c q u yt c t h n gt h n gt i u t pt i nc a " n g b t c i ug t r o n g p h nb l ut r , " ( t r o n g n g nc h nn h i u n hn g h a l i t i t h i g i a nl i nk t ) , n h n g n hn g h a m ul c b i t . B t c i ug t r c b i t e mp l a t e < . . . >c n g h a l t r n hb i nd c h s k h n gp h nb l ut r c h on v ot h i i m , n h n gt h a yv o s c h i c h o nk h i n n i n( b i m t t e mp l a t e ) , v m t n i n o t r o n gc c t r n hb i nd c hv m i l i nk t c m t c c h l o i b n h i u n hn g h a c a m t m ug i n gh t n h a u . V v y , b ns h un h l u nl u n t t o nb t k h a i m uv n hn g h a t r o n gt pt i n t i u , d s d n g . C l nk h i b nc t h c np h i t c c n hn g h a t r o n gm t m ur i n gb i t c p pt pt i n p n gn h uc u c b i t ( v d , b u c m uc c b i uh i nt nt i t r o n gc h c m t Wi n d o ws d u yn h t d l l f i l e ) . H uh t c c t r n hb i n d c hc m t s c c h c h op h p i un y , b ns p h i i ut r a c c t i l i ut r n hb i nd c hc t h c a b n s d n gn . M t s n g i c mt h yr n gv i c a t t c c c m n g u n t h c h i nc a b nt r o n gm t t pt i nt i u l mc h on c t h c h om i n g i nc pv s a i m c a b nn uh mu a m t t h v i nc a b n . i un yc t h l m t v n , n h n gn c t h p h t h u c v oc c hb nn h nv oc c v n : C p h i h mu a m t s np h mh o c m t d c hv ? N u l m t s np h m, s a u b np h i l m m i t h c t h b ov n , v c l b nk h n gmu nc u n gc p c h om n g u n , m b i nd c h . Nh n gn h i un g i n h nt h yp h nm mn h m t d c hv , v t h mc h h nt h n a , m t d c hv t h u b a o . K h c hh n gmu nc h u y nm nc a b n , h mu nb nt i pt c d u yt r o nm n yc t h d n gl i h k h n gc np h i h c t h t pt r u n gv ov i c c a h h o nt h n hc n gv i c . C n h nt i n g h r n gh uh t k h c hh n gs i x v i b nn h m t n g u nt i n g u y nc g i t r v s k h n gmu ng yn g u yh i m c h om i q u a nh c a h v i b n . i v i n h n gn g i mu n nc pc h k h n gp h i l mu a h o c l mc n gv i c b a n u , c l h k h n gt h t h e ok pv i b na n y wa y .

I n t S t a c kn h m tm u

// :C 1 6 :S t a c k T e m p l a t e . h // ng i nc h n gm u #I f n d e fS T A C K T E M P L A T E _ H #X c n hS T A C K T E M P L A T E _ H #B a og m" . ./R e q u i r e . h " t e m p l a t eT >l pS t a c k T e m p l a t e{ e n u m{ s s i z e=1 0 0 } ; Ts t a c k [ s s i z e ] ; i n t u ,c n gc h n g : S t a c k T e m p l a t e( ) : u( 0 ){ } k h o n gt r n g y( c o n s tT&i ){ y uc u( u < s s i z e ," Q u n h i up u s h( )e s " ) ; c h n g[ ut r a n g++ ]=i ; } Tp o p( ){ y uc u( t r n >0 ," Q u n h i uc as p o p( )s " ) ; t r l i n g nx p[ - ut r a n g ] ; } i n ts i z e( ){ r e t u r n u ; } } ; #E n d i f//S T A C K T E M P L A T E _ H/// :~
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

yl c c c o n t a i n e r v l pt I n t S t a c k . c p p, t h c h i nn h m t l pc o n t a i n e r c h u n gs d n gc c m u :

275/320

08/10/2013

Suy ngh trong C + +, Vol 1

C h r n gm t k h u nm ul mc h om t s g i n hv i t n gm n a n gn mg i . V d , S t a c k T e mp l a t e g i n hc m t s l o i h o t n gc h u y nn h n gc h oTb nt r o n gp u s h( ) c h c n n g . B nc t h n i r n gm t m u" c n g h a l m t g i a od i n " c h oc c l o i n c k h n n gn mg i . M t c c hk h c n i i un yl m uc u n gc pm t l o i g y uc c h c h oC++ , l b n ht h n gm t m n hm , n hm y n g nn g . T h a yv y uc um t i t n gc m t s l o i c h n hx c c t h c h pn h n c , n hm yy uc h y u c ur n gc c c h c n n gt h n hv i nm n mu ng i l c s nc h om t i t n gc t h . D o , m m t c c hy u t , n hm yc t h c pd n gc h ob t k i t n gc t h c h pn h nn h n gt h n hv i nc u c g i c h c n n g , v d o [ 6 0 ] l i n hh o t h nn h i u . D i yl v d s a i k i mt r a c c m u :


// :C 1 6 :S t a c k T e m p l a t e T e s t . c p p //K i mt r a ng i nc h n gm u //{ L }f i b o n a c c i #B a og m" f i b o n a c c i . h " #B a og m" S t a c k T e m p l a t e . h " #I n c l u d e #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ S t a c k T e m p l a t e< i n t >l ; f o r( i n ti=0 ;i< 2 0 ;i++ ) i s . p u s h( f i b o n a c c i( i ) ) ; f o r( i n tk=0 ;k< 2 0 ;k++ ) c o u t< <i s . p o p( )< < e n d l ; i f s t r e a mt r o n g( " S t a c k T e m p l a t e T e s t . c p p " ) ; mb o( t r o n g " S t a c k T e m p l a t e T e s t . c p p " ) ; n gd y ; C h u i< s t r i n g >S t a c k T e m p l a t e ; t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) s t r i n g s . p u s h( l i n e ) ; t r o n gk h i( s t r i n g s . s i z e( ) >0 ) c o u t< <s t r i n g s . p o p ( )< <e n d l ; }/// :~

S k h c b i t d u yn h t l t r o n gv i c t or a l . B nt r o n gm ud a n hs c h i s b nc h n hc c l o i i t n gn g n x pv l pn ng i . c h n gmi n hg e n e r i c n e s s c a m u , m t S t a c k T e mp l a t e c n g c t or a g i c h u i . yl t h n g h i mb n gc c h c t r o n gd n gt t pt i nm n g u n .

H n gs t r o n g m u

i s m uk h n gb g i i h nc c l o i l p , b nc n gc t h s d n g c x yd n gt r o n gc c l o i . C c g i t r c a n h n gl pl u nn ys a u t r t h n hh n gs t h i g i a nb i nd c hc h or n gi n s t a n t i a t i o nc t h c a m u . B nt h m c h c t h s d n gc c g i t r m c n hc h oc c i s . V d s a u yc h op h pb nt h i t l pk c ht h c c a mn g l pt r o n gi n s t a n t i a t i o n , n h n gc n gc u n gc pm t g i t r m c n h :

// :C 1 6 :A r r a y 3 . c p p //X yd n gt r o n gc cl o in h m u is #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d" /r e q u i r e . h . . " ; t e m p l a t eT ,i n ts i z e=1 0 0 >l pA r r a y{ Ta r r a y[ s i z e ] ;c n gc n g : T&o p e r a t o r[ ]( i n ti n d e x ){ y uc u( c h s >=0& &i n d e x< k c ht h c , " C h s r ak h ip h mv i " ) ; m n gt r l i[ i n d e x ] ; } i n tc h i ud i( )c o n s t{ k c ht h ct r l i ; } } ; l pS { f l o a tf ;c n gc n g : S ( f l o a tf f=0 . 0 f ) :f( f f ){ } S &o p e r a t o r=( c o n s tS &n ){ f= n f ; *t r l in y ; } i uh n hn i( )c o n s t{ r e t u r nf ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tS &x ){ t r l ih i uh n h< <x f ; } } ; t e m p l a t eT ,i n ts i z e=2 0 >C h l p{ m n g< T ,s i z e >*n p ;c n g c n g : G i ( ) :n p( 0 ){ } T& i uh n h[ ]( i n ti ){ y uc u( 0< =i& &i < k c ht h c ) ; i f( n p )n p=n e wA r r a y< T ,s i z e > ; t r l in p >n h i u h n h[ ]( i ) ; } i n tc h i ud i( )c o n s t{ k c ht h ct r l i ; } ~C h ( ){ x an p ; } } ; i n tm a i n( ){ C h < N u m b e r >h ; f o r( i n ti=0 ;i< 2 0 ;i++ ) h[ i ]=i ; f o r( i n tj=0 ;j< 2 0 ;j++ ) c o u t< <h[ j ]< < e n d l ; }/// :~

Nh t r c y , mn gl m t m n gc a c c i t n gk i mt r a v n g nc h nb nl pc h m c n g o i g i i h n . L p C h l g i n gn h mn gn g o i t r v i c n c m t c o nt r nm t mn gt h a yv m t i t n gn h n gk i umn g . C o nt r n yk h n g c k h i t ot r o n gc c n h x yd n g , k h i t ob t r h o nc h o nk h i t r u yc p ut i n . i un y c g i l k h i l i b i n g , b nc t h s d n gm t k t h u t n h t h n yn ub n a n gt or t n h i u i t n g , n h n gk h n gt r u yc pv ot t c , v mu nl ut r .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 276/320

08/10/2013

Suy ngh trong C + +, Vol 1

B ns n h nt h yr n gc c k c ht h c g i t r t r o n gc h a i m ul k h n gb a og i c l ut r n i b t r o n gl p , n h n gn c s d n gn h t h n l m t t h n hv i nd l i ub nt r o n gh mt h n hv i n .

Ng nx pv s t a s hn h m u

C c n hk " q u y ns h u " c c v n v i S t a s hv n g nx pl pc o n t a i n e r c x e mx t l i t r o n gs u t c u ns c hn yx u t p h t t t h c t l c c c o n t a i n e r k h n gt h b i t c h n hx c n h n gg l o i h n mg i . G n n h t h nl c c n g nx p" c o n t a i n e r c a i t n g" c n h nt h y p h nc u i c a c h n g1 5 t r o n g OS t a c k T e s t . c p p.

N uc c l pt r n hk h c hh n gk h n gl o i b m t c c hr r n gt t c c c c o nt r nc c i t n g c t c h c t r o n g c c c o n t a i n e r , s a u c c t h n gc h a c t h x a m t c c hc h n hx c n h n gc o nt r . l n i , c o n t a i n e r " s h u " b t k i t n g k h n g c g b , v d o c h ut r c hn h i ml ms c hc h n g . C c t r n g i c d nd pm i h i p h i b i t c c l o i i t n g , v t or a m t l pc o n t a i n e r c h u n g i h i k h n g b i t l o i i t n g . V i c c m u , t u yn h i n , c h n gt a c t h v i t m m k h n gb i t l o i i t n g , v d d n gt om t p h i nb nm i c a m c h a c h o t t c c c l o i m c h n gt a mu nc . C c c o n t a i n e r k h i t oc n h nl mb i t l o i c c i t n gm h n mg i v d o c t h g i d e s t r u c t o r n g( g i s , t r o n gt r n gh p i nh n h , n i a h n hc l i nq u a n , m m t d e s t r u c t o r o c c u n gc p ) . i v i c c n g nx pn yh a r a l k h ng i nv t t c c c c h c n n gt h n hv i nc t h c i n l i n e dh pl :
// :C 1 6 :T S t a c k . h //S t a c kn h m tm u #I f n d e fT S T A C K _ H #X c n hT S T A C K _ H t e m p l a t eT >l pS t a c k{ c ut r cl i nk t{ T*d l i u ; L i nk t*t i pt h e o ; L i nk t( T*d a t ,*L i nk tN X T ) : d l i u( d a t ) ,t i pt h e o( N X T ){ } }* u ,c n gc h n g : N g nx p( ) : u( 0 ){ } ~S t a c k( ){ t r o n gk h i( u ) x ap o p( ) ; } t r n gp u s h( T*d a t ){ u=n e wl i nk t( d a t ,n g i n g u ) ; } T*( )c o n s t{ ut r l i ? u >d l i u :0 ; } T*p o p( ){ i f( u= =0 )r e t u r n0 ; T*k tq u = u >d l i u , l i nk t*o l d H e a d= u ; u= u >t i p t h e o ; x ao l d H e a d , k tq u t r v ; } } ; #E n d i f//T S T A C K _ H/// :~

N ub ns os n hv i c c OS t a c k . hv d c u i c h n g1 5 , b ns t h yr n gn g nx pl h un h g i n gh t n h a u , n g o i t r i t n g c t h a yt h b n gT. C h n gt r n ht h n g h i mc n gg ng i n gn h a u , n g o i t r s c nt h i t c h on h n k t h a t c h u i v i t n g( v t h mc h c s c nt h i t c a i t n gc h n hn ) c l o i b . B yg i k h n gc My S t r i n gl pt h n gb oh yd i t c a n , d o , m t l ph c n h m i c t h mv o h i nt h m t n g n x pc h a l ms c h i t n gc a n :
// :C 1 6 :T S t a c k T e s t . c p p //{ T }T S t a c k T e s t . c p p #B a og m" T S t a c k . h " #B a og m" . ./R e q u i r e . h " #B a og m< f s t r e a m > #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; c l a s sX{ c n gc n g : o~X( ){ c o u t< <" ~X "< <e n d l ; } } ; i n tm a i n( i n ta r g c ,c h a r*a r g v[ ] ){ r e q u i r e A r g s( a r g c ,1 ) ;//T nt pt i nl t r a n hl u n i f s t r e a mt r o n g( a r g v[ 1 ] ) ; mb o( t r o n g ,a r g v[ 1 ] ) ; t e x t l i n e s < s t r i n g >n g nx p ; n gd y ; // ct pt i nv d n gl ut r t r o n gS t a c k : t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) t e x t l i n e s . p u s h( c h u im i( d n g ) ) ; //P o pm ts d n gt c h n g : c h u i*s ; f o r ( i n ti=0;i< 1 0 ;i++ ){ i f( ( s=( s t r i n g* )t e x t l i n e s . p o p( ) )= =0 )b r e a k ; c o u t< <*s< <e n d l ; x as ; }//C ch yx a ic cd yk h c . //H i nt h m h yd i tc h n hx cx yr a : n g nx p< X >x x ; f o r( i n tj=0 ;j
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 277/320

08/10/2013

Suy ngh trong C + +, Vol 1

< 1 0 ;j++ )

x x . p u s h( m iX ) ; }/// :~

D e s t r u c t o r c h oXl o , k h n gp h i v n l c nt h i t y , n h n gv x x s a u c t h c s d n g g i c c i t n gc n g u ng c t X. Nh nt h yc c hd d n gl t or a c c l o i k h c n h a uc a s t a c ks c h oc h u i v c h oX. D om u , b n c t t n h t c a c h a i t h g i i : s d d n gs d n gc c n g nx pl pc n gv i d nd pt h c hh p .

T e mp l a t i z e dc o nt r S t a sh
T c h c l i P S t a s hm v om t m ul k h n gh o nt o n ng i nn h v yb i v c m t s c h c n n gt h n hv i n k h n gn n c i n l i n e d . T u yn h i n , n h m t k h u nm u n hn g h a n h n gc h c n n gv nt h u c v c c t pt i n t i u ( t r n hb i nd c hv m i l i nk t c h ms c c a b t k v n n h i u n hn g h a ) . M n yt r n gk h g i n gv i b n ht h n gP S t a s hn g o i t r v i c b ns n h nt h yk c ht h c c a t n g( s d n gt n gl n( ) c t e mp l a t i z e d n h m t t h a ms k h n gl ph c v i m t g i t r m c n h , t n gk c ht h c c t h c t h a y i t h e o i mc a i n s t a n t i a t i o n( t h n gb or n g i un yc n g h a l k c ht h c t n gl c n h , b nc n gc t h l pl u nr n gk c h t h c t n gn n c t h a y i t r o n gs u t c u c i c a i t n g ) :

// :C 1 6 :T P S t a s h . h #I f n d e fT P S T A S H _ H #X c n hT P S T A S H _ H t e m p l a t eT ,i n ti n c r=1 0 >l pP S t a s h{ i n ts l n g ;//S c h l ut r i n tt i pt h e o ;/ /k h n gg i a nt r n gT i p T* *l ut r ; t r n gt h ip h n g( i n tt n g=i n c r ) ,c n gc h n g : P S t a s h( ) :s l n g( 0 ) ,t i pt h e o( 0 ) ,l ut r ( 0 ){ } ~P S t a s h( ) ; i n ta d d( T*p h nt ) ; T*t o nt [ ]( i n ti n d e x )c o n s t ;//L y //H yb c ct il i ut h a mk h ot P S t a s hn y : T*l o ib ( i n ti n d e x ) ; //S p h nt t r o n gS t a s h : i n tc o u n t( )c o n s t{ r e t u r n t i pt h e o ; } } ; t e m p l a t eT ,i n ti n c r >i n tP S t a s h< T ,i n c r >: :a d d( T*y ut ){ i f( s a u >=s l n g ) t n gl n( i n c r ) ; l ut r [ t i pt h e o++ ]=y ut ; t r l i( t i pt h e o-1 s //C h s ; ) } //Q u y ns h uc ac cc o nt r c nl i : t e m p l a t eT ,i n ti n c r >P S t a s h< T ,i n c r >: :~P S t a s h( ){ f o r( i n ti=0 ;i< t i pt h e o ;i++ ) { x al ut r [ i ] ;//N u l lc o nt r O K l ut r [ i ]=0 ;//C h c n ca nt o n } x a[ ]l ut r ; } t e m p l a t eT ,i n ti n c r > T*P S t a s h< T ,i n c r >: :o p e r a t o r[ ]( i n ti n d e x )c o n s t{ y uc u( c h s >=0 , " P S t a s h: :o p e r a t o r[ ]c h s t i uc c " ) ; i f( i n d e x >=t i pt h e o ) t r v 0 ;// c h ot h yc u ic n g !y uc u( l ut r [ i n d e x ]=0 , " P S t a s h: :o p e r a t o r[ ]t r l iv g i t r c o nt r " ) ; //S nx u tc o nt r np h nt m o n gm u n : t r v l ut r [ i n d e x ] ; } t e m p l a t eT ,i n ti n c r >T*P S t a s h< T ,i n c r >: :r e m o v e( i n ti n d e x ){ //N h i uh n h[ ]t h ch i nk i mt r at n hh pl : T*v= i uh n h[ ]( i n d e x ) ; //" H yb "c o nt r : n u( v=0 ! )l ut r [ i n d e x ]=0 ; t r l iv ; } t e m p l a t eT ,i n ti n c r >t r n gP S t a s h< T ,i n c r >: :t h ip h n g( i n tt n g ){ c o n s ti n t p s z=s i z e o f( T* ) ; T* *s t=n e wT*[ s l n g+t n g ] ; m e m s e t(s t ,0 ,( s l n g +T n g )*p s z ) ; m e m c p y( s t ,l ut r ,s l n g*p s z ) ; s l n g+=t n g ; x a[ ] l ut r ;//l ut r C l ut r =s t ;// i mt ib n h m i } #E n d i f//T P S T A S H _ H/// :~

K c ht h c t n gm c n hs d n g yl n h mb or n gc c c u c g i nt h i p h n g( ) x yr a . B n gc c hn y c h n gt a c t h c h c c h nr n gn h o t n gc h n hx c . k i mt r a k i ms o t q u y ns h uc a t e mp l a t i z e dP S t a s h, l ps a us b oc os n gt ov t np h c a c h n hn , v c n g mb or n gt t c c c i t n g c t or a c n g b p h h y . B s c h c h op h pc c i t n gc a l o i h n hc a n c t or a t r ns t a c k :
// :C 1 6 :A u t o C o u n t e r . h #I f n d e fA U T O C O U N T E R _ H #X c n hA U T O C O U N T E R _ H #B a og m" . ./R e q u i r e . h "
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 278/320

08/10/2013

Suy ngh trong C + +, Vol 1

#I n c l u d e #B a og m< s e t >//T i uc h u nC++T h v i nc h a #I n c l u d e l pB { s t a t i ci n tc o u n t ; i n ti d ; l pC l e a n u p C h e c k{ s t d: :s e t < A u t o C o u n t e r * >d uv t , c n gc n g : l mm th i ul ct h m( B *a p ){ t r a c e . i n s e r t( a p ) ; } t r n gl o ib ( B *a p ){ y uc u( t r a c e . e r a s e( a p )= =1 , " C g n g x a B h a il n " ) ; } ~C l e a n u p C h e c k( ){ s t d: :c o u t< <" ~C l e a n u p C h e c k( ) "< <s t d: :e n d l ; y uc u ( t r a c e . s i z e( )= =0 , " T tc c c it n gB k h n gs c h " ) ; } } ; x cm i n hC l e a n u p C h e c kt n h ; B ( ) :i d( t n h++ ){ v e r i f i e r . a d d( n y ) ;// n gk t s t d: :c o u t< <" t or a[ "< <i d< <" ] " < <S t d: :e n d l ; } //N g nc h nc h u y nn h n gv b ns a o x yd n g : B ( c o n s tB & ) ; k h o n gt r n g i uh n h= ( c o n s tB & ) ;c n gc n g : //B nc h c t h t oc c it n gv i i un y : t n hB *t o( ){ t r l im iB ( ) ; } ~B ( ){ s t d: :c o u t< <" p h h y[ "< <i d < <" ] "< <s t d: :e n d l ; v e r i f i e r . r e m o v e( n y ) ; } //I nc h a i it n gv c o nt r : b ns t d: :o s t r e a m&o p e r a t o r< <( s t d: :o s t r e a m& o s ,c o n s tB &a c ){ t r l io s< <" B "< <a c . i d ; } b ns t d: :o s t r e a m&o p e r a t o r< <( s t d: :o s t r e a m&o s ,c o n s tB *a c ){ t r l io s< <" B "< <a c >i d ; } } ; #E n d i f//A U T O C O U N T E R _ H/// :~

C c B l ph i nh a i i u . ut i n , n s l i nt c t n gt r n gh pc a B : g i t r c a s n y c g i t r o n gi d, v c o n s n y c t or a b n gc c hs d n gt n ht h n hv i nd l i us . T h h a i , v p h c t ph n , m t t n hd ( g i l k i m n h) c a l pl n gC l e a n u p C h e c kt h e od i t t c c c B i t n g c t or a v b p h h y , v b oc ol i c h ob nn ub nk h n gl ms c ht t c c h n gl n( n g h a l n uc m t r r b n h ) . H n hv i n y c t h c h i nb n gc c hs d n gb l pt t i uc h u nC++T h v i n , l m t v d t u y t v i v m ut h i t k t t c t h l mc h oc u c s n gd d n g( b nc t h t mh i uv t t c c c s np h mt i c c t i u c h u nC++T h v i nt r o n gt p2 c a c u ns c hn y , c s nt r c t u y n ) . C c b l p c t e mp l a t i z e dv ol o i m n n mg i ; yn c k h i t o g i B c o nt r . M t b s c h op h pc h c m t t h h i nc a t n g i t n gr i n gb i t c t h mv o , t r o n ga d d( ) , b nc t h t h y i un yx yr a v i c c b : : c h n(c h c n n g . ) c h n( ) t h c s t h n gb oc h ob nv i g i t r t r v c a n n ub n a n gc g n gt h m m t c i g c t h mv o , t u yn h i n , k t k h i a c h i t n g c t h mv oc h n gt a c t h d a v oC++' s m b or n gt t c c c i t n gc a c h d u yn h t . T r o n gl o i b ( ) , b : : x a ( c s d n g l o i b m t ) B c o nt r t c c b . G i t r t r v c h ob nb i t b a on h i u t r n gh pc ac c y ut c g b , t r o n gt r n gh pc ac h n gt i , c h n gt i c h mo n g i k h n gh o c m t . N ug i t r l s k h n g , t u yn h i n , n c n g h a l i t n gn y c x ak h i b v b n a n gc g n g x an m t l nt h h a i , l m t l i l pt r n hs c b oc ot h n gq u a y uc u( ) . D e s t r u c t o r c h oC l e a n u p C h e c kh i nm t k i mt r a c u i c n gb n gc c hl mc h oc h c c h nr n gk c ht h c c a b l s k h n g i un yc n g h a r n gt t c c c i t n g c l ms c h n gc c h . N un k h n gp h i k h n g , b nc m t r r b n h , c b oc ot h n gq u a y uc u( ) . C c n h x yd n gv h mh yc h oB n gk v h y n gk t v i x c mi n h i t n g . C h r n gc c n h x y d n g , s a oc h p x yd n g , v p h nc n g i uh n hl r i n gt , n nc c hd u yn h t b nc t h t or a m t i t n g v i t ot n h() c h c n n gt h n hv i n yl m t v d ng i nc a m t n h m y s nx u t , v n mb or n gt t c c c i t n g c t or a t r nh e a p , x c mi n hs k h n gb l nl nh nb i t pv s a oc h pc n gt r n hx yd n g . V t t c c c c h c n n gt h n hv i n c s px pt h e oh n gl d od u yn h t c h oc c t pt i nt h c t h i l c c c n h n g h a t h n hv i nd l i ut n h :


// :C 1 6 :A u t o C o u n t e r . c p p{ O } // n hn g h ac ac ct h n hv i nl pt n h #B a og m" A u t o C o u n t e r . h "
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 279/320

08/10/2013

Suy ngh trong C + +, Vol 1

B : :C l e a n u p C h e c kB : :x cm i n h ;i n tB : :c o u n t=0 ;/// :~

V i B t r o n gt a y , c h n gt a c t h k i mt r a c c c s c a P S t a s h. V d s a u yk h n gc h c h ot h yr n gc c P S t a s h h yd nd pt t c c c i t n gm m n h a n gs h u , n h n gn c n gt h h i nn h t h n oB l pp h t h i nc c i t n g k h n g c l ms c h :
// :C 1 6 :T P S t a s h T e s t . c p p //{ L }B #B a og m" A u t o C o u n t e r . h " #B a og m" T P S t a s h . h " #I n c l u d e#i n c l u d e< f s t r e a m >s d n gt nm i nk h n gg i a nt i u c h u n ; i n tm a i n( ){ P S t a s h< A u t o C o u n t e r >a c S t a s h ; f o r( i n ti=0 ;i< 1 0 ;i++ ) a c S t a s h . a d d( B : :c r e a t e( ) ) ; c o u t< <" L o ib 5t h : "< <e n d l ; f o r( i n tj=0 ;j< 5 ;j++) x aa c S t a s h . r e m o v e( j ) ; c o u t < <" H yb h a im k h n gx ac h n g : " < <E n d l ; //. . . t or ac ct h n gb ol id nd p . c o u t< <a c S t a s h . r e m o v e( 5 )< <e n d l ; c o u t< <a c S t a s h . r e m o v e( 6 )< <e n d l ; c o u t< < " h yd nd pp h nc nl i : " < <E n d l ; //L pl it h n g h i mt c h n gt r c : i f s t r e a mt r o n g( " T P S t a s h T e s t . c p p " ) ; mb o( t r o n g" T P S t a s h T e s t . c p p " ) ; P S t a s hs t r i n g S t a s h< s t r i n g > ; n gd y , t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) s t r i n g S t a s h . a d d( c h u im i( d n g ) ) ; //I nr ac h u i : f o r( i n tu=0 ;s t r i n g S t a s h[ u ]u++ ) c o u t< <" s t r i n g S t a s h[ "< <u< <" ]= " < <*S t r i n g S t a s h[ u ]< <e n d l ; }/// :~

K h i B y ut 5 v 6 c x a P S t a s h, h t r t h n ht r c hn h i mc a n g i g i , n h n gk t k h i n g i g i k h n gb a og i d nd pc h n gg yr r b n h , s a u c p h t h i nb i B t i t h i g i a nc h y . K h i b nc h yc h n gt r n h , b ns t h yt h n gb ol i k h n gp h i l c b i t k h i n c t h c . N ub ns d n g c h n gt r n h c t r n hb yt r o n gB p h t h i nr r b n h t r o n gh t h n gc a b n , c t h b ns mu nc n i n r a t h n gt i nc h i t i t h nv c c i t n g k h n g c l ms c h . T p2 c a c u ns c hn yc h ot h yn h n gc c h t i n hv i h n l m i un y .

C h u y nq u y ns h uv t t

C h n gt a h yt r l i v n q u y ns h u . C o n t a i n e r m g i c c i t n gt h e og i t r t h n gk h n gl ol n gv q u y ns h uv h r r n gs h uc c i t n gm h c . Nh n gn uc o n t a i n e r c a b ng i c o nt r ( c p h b i n h nv i C++ , c b i t l v i a h n h ) , s a u n r t c k h n n gn h n gc o nt r c n gc t h c s d n g m t n i k h c t r o n gc h n gt r n h , v b nk h n gn h t t h i t mu nx a c c i t n gb i v s a u c c k h c c o nt r t r o n g c h n gt r n hs c t h a mc h i um t i t n gb p h h y . n g nc h n i un yx yr a , b np h i x e mx t k h i t h i t k q u y ns h uv s d n gm t c o n t a i n e r .

Nh i uc h n gt r n h ng i nh nn h i us ov i i un y , v k h n gg pp h i v n q u y ns h u : M t c o n t a i n e r c h a c o nt r n i t n gm c h c s d n gb i c o n t a i n e r . T r o n gt r n gh pn ys h ul r t ng i n : C c c o n t a i n e r s h u i t n gc a n . P h n gp h pt t n h t x l c c v n s h ul c u n gc pc h oc c l pt r n hv i nk h c hh n gm t s l a c h n . i un yt h n g c t h c h i nb n gm t c u c t r a n hl u nx yd n gm m c n h c h r a q u y ns h u( t r n gh p ng i n ) . Ng o i r a c t h c " c " v " t h i t l p " c h c n n g x e mv c h n hs a c c q u y ns h uc a c c c o n t a i n e r . N uc o n t a i n e r c c h c n n g l o i b m t i t n g , n h n c s h ut h n g n hh n g nv i c l o i b , v v y b nc n gc t h t mt h yt yc h n k i ms o t p h h yt r o n gc c c h c n n gl o i b . B nc t h h n hd u n g c t h m d l i uq u y ns h uc h ot n gy ut t r o n gc o n t a i n e r , d o , m i v t r s b i t l i un c np h i c p h h y , yl m t b i nt h c a t n ht h a mk h o ,n g o i t r c c c o n t a i n e r v k h n gp h i l i t n gb i t s l n gt i l i uc h v o m t i t n g.


// :C 1 6 :O w n e r S t a c k . h //S t a c kv iq u y ns h uc o n r o l l a b l et h ig i a nc h y #I f n d e fO W N E R S T A C K _ H #X c n hO W N E R S T A C K _ H t e m p l a t eT >l pS t a c k{ c ut r cl i nk t{ T*d l i u ; L i nk t*t i pt h e o ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 280/320

08/10/2013

Suy ngh trong C + +, Vol 1

L i nk t( T*d a t ,*L i nk tN X T ) :D l i u( d a t ) ,t i pt h e o( N X T ){ } }* u ; b o o lr i n g ,c n gc n g : N g nx p( b o o lr i n g=t r u e ) : u( 0 ) ,r i n g( c a ){ } ~S t a c k( ) ; t r n gp u s h( T*d a t ){ u=n e wl i nk t( d a t , n g i n g u ) ; } T*( )c o n s t{ ut r l i ? u >d l i u :0 ; } T*p o p( ) ; b o o ls h u( )c o n s t{ r e t u r nr i n g ; } t r n gs h u ( n e w o w n e r s h i pb o o l ){ r i n g=n e w o w n e r s h i p ; } //T n gc h u y n il o ih n h : n gn uk h n gc s np h mn o : b o o lo p e r a t o r( )c o n s t { ut r l i=0 ; } } ; t e m p l a t eT >T*s t a c k< T >: :p o p( ){ i f( u= =0 )r e t u r n0 ; T*k t q u = u >d l i u , l i nk t*o l d H e a d= u ; u= u >t i pt h e o, x ao l d H e a d , k tq u t r v ; } t e m p l a t eT >s t a c k< T >: :~S t a c k( ){ n ut r l i( r i n g ) , t r o n gk h i ( u ) x ap o p( ) ; } #E n d i f//O W N E R S T A C K _ H/// :~

H n hv i m c n hl d n hc h oc c c o n t a i n e r t i ud i t i t n gc a n n h n gb nc t h t h a y i i un yb n g c c ht h a y i t h a ms n h x yd n gh o c b n gc c hs d n gs h u( ) c /g h i h mt h n hv i n . Nh v i h uh t c c m ub n a n gc k h n n gt h y , t o nb t h c h i n c c h a t r o n gc c t pt i nt i u . D i y l m t t h n g h i mn h t h c h i nq u y ns h uk h n n g :
// :C 1 6 :O w n e r S t a c k T e s t . c p p //{ L }B #B a og m" A u t o C o u n t e r . h " #B a og m" O w n e r S t a c k . h " #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ N g nx p< A u t o C o u n t e r >a c//Q u y ns h ut r n N g nx p< A u t o C o u n t e r >A C 2( f a l s e ) ;//T tn i B *a p ; f o r( i n ti=0 ;i< 1 0 ; i++ ){ a p=B : :c r e a t e( ) ; a c . p u s h( a p ) ; i f(i %2= =0 ) a c 2 . p u s h( a p ) ; } t r o n gk h i( A C 2 ) c o u t< <a c 2 . p o p( )< <e n d l ; //K h n gc nt h i t v p h h y //A c" s h u "t tc c c it n g }/// :~

C c A C 2 i t n gk h n gs h uc c i t n gb n a v on , d o a c l c o n t a i n e r " c h " m c h ut r c hn h i m v q u y ns h u . N u , p a r t wa yt h n gq u a c u c i c a m t c o n t a i n e r , b nmu nt h a y i d m t c o n t a i n e r s h u i t n gc a n , b nc t h l mn h v yb n gc c hs d n gs h u( ) . Nc n gs c t h t h a y i c c c h i t i t c a c c c h s h u n t r nc s i t n gc a i t n g , n h n gm c l s l mc h oc c g i i p h pc h ov n q u y ns h up h c t ph nv n .

G i i t n gt h e og i t r

T h c s t or a m t b ns a oc a c c i t n gb nt r o n gm t c o n t a i n e r c h u n gc h u n gl m t v n p h c t pn u b nk h n gc m u . V i c c m u ,

i un yl t n g i ng i nb nc h c nn i r n gb n a n gn mg i i t n gc h k h n gp h i l c o nt r :
// :C 1 6 :V a l u e S t a c k . h //G i it n gt h e og i t r t r o n gm tS t a c k #I f n d e fV A L U E S T A C K _ H #X c n hV A L U E S T A C K _ H #B a og m" . ./R e q u i r e . h " t e m p l a t eT ,i n ts s i z e=1 0 0 >l pS t a c k{ //M c n hx yd n gt h ch i n it n g //K h it oc h om ip h nt t r o n gm n g : Ts t a c k[ s s i z e ] ; N g nx p( ) : u( 0 ){ }
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

i n t u ,c n gc h n g :
281/320

08/10/2013

Suy ngh trong C + +, Vol 1

//B nC o p y x yd n g it n gv om n g : k h o n gt r n g y( c o n s tT&x ){ y u c u( u< s s i z e ," Q u n h i up u s h( )e s " ) ; c h n g[ ut r a n g++ ]=x ; } T( )c o n s t{ r e t u r nc h n g[ ut r a n g ] ; } // it n gv nc nt nt ik h ib nb tn ; //n c h l k h n gc s nn a : Tp o p( ){ y uc u( t r n >0 ," Q u n h i uc as p o p( )s " ) ; t r l in g n x p[ - ut r a n g ] ; } } ; #E n d i f//V A L U E S T A C K _ H/// :~

C c n h x yd n gb ns a oc h oc c i t n gc h i nh uh t c c c n gv i c b n gc c h i q u a v q u a yt r l i c c i t n gt h e og i t r . T r o n gp u s h( ) , l ut r c a i t n gv on g nx pm n g c t h c h i nv i T: : o p e r a t o r =. mb or n gn h o t n g , m t l p c g i l S e l f C o u n t e r t h e od i n h n g i t n gs n gt ov s a oc h pc n g t r n hx yd n g :
// :C 1 6 :S e l f C o u n t e r . h #I f n d e fS E L F C O U N T E R _ H #X c n hS E L F C O U N T E R _ H #B a og m" V a l u e S t a c k . h " #I n c l u d e l pS e l f C o u n t e r{ s t a t i ci n tt r u yc p ; i n ti d ;c n gc n g : S e l f C o u n t e r( ) :i d( t r u yc p++ ){ s t d: :c o u t< <" t o : "< <i d< <s t d: :e n d l ; } S e l f C o u n t e r( c o n s tS e l f C o u n t e r&r v ) :i d( r v . i d ){ s t d: :c o u t< <" S a oc h p : "< <i d< <s t d: : e n d l ; } S e l f C o u n t e ro p e r a t o r=( c o n s tS e l f C o u n t e r&r v ){ s t d: :c o u t< <" p h nc n g "< <r v . i d< <" " < <i d< <s t d: :e n d l ; t r l i*n y ; } ~S e l f C o u n t e r( ){ s t d: :c o u t< <" b p h h y : "< <i d< <s t d: :e n d l ; } b ns t d: :o s t r e a m&o p e r a t o r< <( s t d: :o s t r e a m&o s ,c o n s tS e l f C o u n t e r&s c ){ t r l io s< <" S e l f C o u n t e r : "< <s c . i d ; } } ; #E n d i f//S E L F C O U N T E R _ H/// :~ // :C 1 6 :S e l f C o u n t e r . c p p{ O }#b a og m" S e l f C o u n t e r . h "i n tS e l f C o u n t e r: :t r u yc p=0 ; /// :~ // :C 1 6 :V a l u e S t a c k T e s t . c p p //{ L }S e l f C o u n t e r #B a og m" V a l u e S t a c k . h " #B a og m" S e l f C o u n t e r . h "#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ s px p< S e l f C o u n t e r >s c ; f o r( i n ti=0 ;i< 1 0 ;i++ ) s c . p u s h ( S e l f C o u n t e r( ) ) ; //O K p e e k( ) ,k tq u l t mt h i : c o u t< <s c . p e e k( )< <e n d l ; f o r( i n tk=0 ;k< 1 0 ;k++ ) c o u t< <s c . p o p( ) < <e n d l ;}/// :~

K h i m t n g nx pc o n t a i n e r c t or a , c c n h x yd n gm c n hc a i t n gc h a c g i l c h ot n g i t n gt r o n gm n g . B a n ub ns t h y1 0 0 S e l f C o u n t e r i t n g c t or a k h n gc l d or r n g , n h n g i un yc h l k h i t om n g . i un yc t h t nk m m t c h t , n h n gk h n gc c c hn ox u n gq u a n hn t r o n gm t t h i t k ng i nn h t h n y . M t t n hh u n gp h c t ph np h t s i n hn ub nt h c h i nc c n g nx p c h u n gh nb n gc c hc h op h pk c ht h c p h t t r i nn n g n g , b i v t r o n gv i c t h c h i nh i nt h t r nn y s l i nq u a n nv i c t or a m t m n gm i ( l nh n ) , s a oc h pc c m n gc s a n gm i , v p h h yc c c m n g ( yl , t r nt h c t , n h n gg c c t i uc h u nC++T h v i nv e c t o r l pn o ) .

V n gl pg i i t h i u

M t b i nl p l m t i t n gd i c h u y nq u a m t t h n gc h a c a c c i t n gk h c v c h nc h n gc n gm t l c , m k h n gc u n gc pt r u yc pt r c t i p nv i c t h c h i nc o n t a i n e r . V n gl pc u n gc pm t c c ht i uc h u n t r u yc pv oc c y ut , c h o c k h n gm t c o n t a i n e r c u n gc pm t c c h t r u yc pc c y ut t r c t i p . B ns t h yv n gl p c s d n gt h n gx u y nn h t t r o n gh i ph i v i c c l pc h a , v v n gl pl m t k h i n i mc b nt r o n gv i c t h i t k v s d n gc c t i uc h u nC++c o n t a i n e r , c mt y t r o n gt p2 c a c u ns c h n y( t i v t w w w . B r u c e E c k e l . c o m) . M t b i nl pc n gl m t l o i m ut h i t k , l c h c a m t c h n g t r o n gT p2 . B n gn h i uc c h , m t b i nl pl m t " c o nt r t h n gmi n h " , v t r o n gt h c t , b ns n h nt h yr n gv n gl p


282/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

t h n gb t c h c h uh t c c h o t n gc a c o nt r . K h n gg i n gn h m t c o nt r , t u yn h i n , c c b i nl p c t h i t k c a nt o n , v v yb ns t c k h n n gl mt n g n gv i i b r a k h i c u i c a m t m n g( h o c n ub nl mt h , b nt mh i uv n d d n gh n ) .
// :C 1 6 :I t e r I n t S t a c k . c p p //S n g u y n ng i ns t a c kv iv n gl p //{ L }f i b o n a c c i #B a og m" f i b o n a c c i . h " #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d" /r e q u i r e . h . . " ; l pI n t S t a c k{ e n u m{ s s i z e=1 0 0 } ; i n ts t a c k[ s s i z e ] ; i n t u , c n gc h n g : I n t S t a c k( ) : u( 0 ){ } t r n gp u s h( i n ti ){ y uc u( u< s s i z e ," Q u n h i up u s h( ) e s " ) ; c h n g[ ut r a n g++ ]=i ; } i n tp o p( ){ y uc u( t r n >0 ," Q u n h i uc as p o p( )s " ) ; t r l in g n x p[ - ut r a n g ] ; } b nl pI n t S t a c k I t e r ; } ; //I t e r a t o rA ng i n gn h m t" t h n gm i n h "c o nt r :c l a s sI n t S t a c k I t e r{ I n t S t a c k&s , i n ti n d e x ;c n gc n g : I n t S t a c k I t e r( I n t S t a c kv l ) :s( l ) ,c h s ( 0 ){ } i n to p e r a t o r++( ){ //T i nt y u c u( c h s < s . t o p , " l pd ic h u y nr ak h ip h mv i " ) ; s . s t a c kt r l i[ ++c h s ] ; } i n to p e r a t o r++( i n t ){ //P o s t f i x y uc u( c h s < s . t o p , " l pd i c h u y nr ak h ip h mv i " ) ; s . s t a c kt r l i[ c h s ++ ] ; } } ; i n tm a i n( ){ I n t S t a c kl ; f o r( i n ti=0 ;i< 2 0 ;i++ ) i s . p u s h( f i b o n a c c i( i ) ) ; //T r a v e r s ev im ti t e r a t o r : I n t S t a c k I t e rn ( l ) ; f o r( i n tj=0 ;j< 2 0 ;j++ ) c o u t< < n ++< <e n d l ; }/// :~

H yx e mx t v d ut i nt r o n gc h n gn y . y l v i m t l p ng i nn i t h m:

C c I n t S t a c k I t e r c t or a c h l mv i c v i m t I n t S t a c k. C h r n gI n t S t a c k I t e r l m t n g i b nc a I n t S t a c k, c h op h pn t r u yc pv ot t c c c t i ny ut c a I n t S t a c k. Nh m t c o nt r , I n t S t a c k I t e r c n gv i c l d i c h u y nq u a m t I n t S t a c kv l yg i t r . T r o n gv d n y ng i n , I n t S t a c k I t e r c t h d i c h u y nc h v p h a t r c ( s d n gc t i nv c c h n ht h c h ut c a c c n h i uh n h++) . T u yn h i n , k h n gc r a n hg i i v i c c ht h c m t b i nl pc t h c x c n h , t r n h n g p t b i c c r n gb u c c a c c c o n t a i n e r n l mv i c v i . Nl h o nt o nc h pn h n c ( t r o n gg i i h nc a c c c o n t a i n e r n mb nd i ) c h om t i t e r a t o r d i c h u y nt r o n gb t k c c hn ot r o n gc o n t a i n e r l i nq u a nc a n v g yr a c c g i t r c c s a i . Nl p h o n gt c m m t b i nl p c t or a v i m t n h x yd n gg nn v om t i t n gc o n t a i n e r d u yn h t , v r n gl pk h n gg nl i nv i m t c o n t a i n e r k h c n h a ut r o n gs u t c u c i c a n . ( V n gl pt h n gn h v g i r , v v yb nc t h d d n gl mc h on g i k h c . ) V i s l p , b nc t h i q u a c c y ut c a c h n gm k h n gx u t c h n g , c n gg i n gn h m t c o nt r c t h d i c h u y nt h n gq u a c c y ut c a m t m n g . T u yn h i n , l pb i t c ut r c c b nc a n g nx pv l mt h n o i q u a c c y ut , v v yn g a yc k h i b n a n gd i c h u y nq u a c h n gb n gc c hg i v " t n gm t c o nt r , " n h n gg a n gx yr a b nd i l t h a mg i a n h i uh n . l c h a k h a c h os l p : N c t r ut n gh a q u t r n hp h c t p c a d i c h u y nt m t y ut c o n t a i n e r nt i pt h e ov om t c i g t r n gg i n gn h m t c o nt r . M c c hl m i l pt r o n gc h n gt r n hc a b nc c n gm t g i a od i n c h ob t k m m s d n gl pk h n gq u a nt mn h n g g n t r nn c h b i t r n gn c t h t l i v t r t t c v n gl pc n gm t c c h , v v yc c t h n gc h a c c i m l pl k h n gq u a nt r n g . B n gc c hn yb nc t h v i t m l n ht n gq u t h n . T t c c c c o n t a i n e r v c c t h u t t o nt r o n gc c t i uc h u nC++T h v i n c d a t r n n g u y nt c n yc a v n gl p . h t r t r o n gv i c a r a n h n g i uc h u n gc h u n gh n , n s c t t p c t h n i " m i c o n t a i n e r c m t l p k t h p c g i l l p, " n h n g i un yt h n gs g yr a v n t t n . G i i p h pl t h m m t l n gn h a ul pl p h c m i c o n t a i n e r ( c h r n gt r o n gt r n gh pn y , " l p" b t uv i m t c h t h n g n p h h pv i p h o n g c c hc a c h u nC++T h v i n ) . yl I t e r I n t S t a c k . c p pv i m t l n gn h a ul p:


// :C 1 6 :N e s t e d I t e r a t o r . c p p //N e s t i n gm tI t e r a t o rb nt r o n gc o n t a i n e r //{ L }f i b o n a c c i #B a og m" f i b o n a c c i . h " #B a og m" . ./R e q u i r e . h " #I n c l u d e#i n c l u d eu s i n gn a m e s p a c es t d ; l pI n t S t a c k{ e n u m{ s s i z e=1 0 0 } ; i n ts t a c k[ s s i z e ] ;
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 283/320

08/10/2013

Suy ngh trong C + +, Vol 1

i n t u ,c n gc h n g : I n t S t a c k( ) : u( 0 ){ } t r n gp u s h( i n ti ){ y uc u( u< s s i z e ," Q u n h i u p u s h( )e s " ) ; c h n g[ ut r a n g++ ]=i ; } i n tp o p( ){ y uc u( t r n >0 ," Q u n h i uc as p o p( )s " ) ; t r l in g nx p[ - ut r a n g ] ; } l pl p ; b nl pl p ; l pl p{ I n t S t a c k&s , i n ti n d e x ; c n gc n g : l p( I n t S t a c kv l ) :s( l ) , c h s ( 0 ){ } // t oc c" k tt h cS e n t i n e l "l p : I t e r a t o r( I n t S t a c k&l ,s h o r t ) :s( l ) ,c h s ( s . t o p ){ } i n th i nt i( )c o n s t { r e t u r ns . s t a c k[ i n d e x ] ; } i n to p e r a t o r++( ){ //T i nt y uc u( c h s < s . u ," l p d ic h u y nr ak h ip h mv i " ) ;s . s t a c kt r l i[ ++i n d e x ] ; } i n to p e r a t o r++( i n t ){ //P o s t f i x y uc u( c h s < s . t o p , " l pd ic h u y nr ak h ip h mv i " ) ; s . s t a c kt r l i[ c h s ++ ] ; } //C h u y nm ti t e r a t o rv p h at r c l p&o p e r a t o r+=( i n tl n g ){ y uc u ( c h s +s l n g< s . t o p , " I n t S t a c k: :l p: :o p e r a t o r+=( ) " " c g n g d ic h u y nr ak h ig i ih n " ) , c h s +=s l n g; t r l i*n y ; } // x e mb n a n gc u i : b o o lo p e r a t o r= =( c o n s tl p&r v )c o n s t{ t r l ic h s = =r v . i n d e x ; } b o o lo p e r a t o r=( c o n s tl p&r v )c o n s t{ ! c h s l in h u n=r v . i n d e x ! ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s tl pv n ){ t r l ih i u h n h< <i t . c u r r e n t( ) ; } } ; l pb t u( ){ l pl i( *t h i s ) ; } //T ok tt h c" t r n g i m " : l pc u i( ){ l pl i( *n y ,t r u e ) ; } } ; i n tm a i n( ){ I n t S t a c kl ; f o r( i n ti=0 ;i< 2 0 ;i++ ) i s . p u s h( f i b o n a c c i ( i ) ) ; c o u t< <" iq u ac cI n t S t a c kt o nb \n " ; I n t S t a c k: :l pn =i s . b e g i n( ) ; t r o n gk h i( i t=i s . e n d( ) ) c o u t< <n ++< <e n d l ; c o u t< <" iq u am tp h nc aI n t S t a c k\n " ; I n t S t a c k: :l p b t u=i s . b e g i n ( ) ,k tt h c=i s . b e g i n( ) ; b t u+=5 ,k tt h c+=1 5 ; c o u t< <" b t u=" < < b t u< <e n d l ; c o u t< <" k tt h c= "< <c u i< <e n d l ; t r o n gk h i( b t u=k t t h c ! ) c o u t< <b t u++< <e n d l ; }/// :~

K h i t h c h i nm t l n gn h a ub nl p , b np h i i q u a q u t r n h ut i nt u y nb t nc a l p , s a u t u y nb n n h l m t n g i b n, s a u x c n hc c l ph c . N uk h n g , t r n hb i nd c hs b l nl n . M t s x o nm i c t h mv oc c b i nl p . C c h i nt h i ( ) c h c n n gt h n hv i ns nx u t c c p h nt t r o n g c o n t a i n e r l ph i n a n gl a c h n . B nc t h " n h y " m t i t e r a t o r v p h a t r c b i m t s t yc a c c y ut s d n g t o nt +=. Ng o i r a , b ns t h yh a i n h k h a i t h c q u t i : = =v = ! m s s os n hm t l pv i n h a u . yc t h s o s n hb t k h a i I n t S t a c k: : i t e r a t os , n h n gh r c h y u c d n hn h l m t t h n g h i m x e mn ul pl p h nc u i c a m t c h u i t r o n gc n gm t c c hm " t h c s " t i uc h u nC++T h v i nl mv n gl p . t n gl h a i v n gl px c n hp h mv i , b a og mc c c y ut ut i n c t r nb i b i nl p ut i nv l n nn h n gk h n g b a og mc c p h nt c u i c n gt r nb i b i nl pt h h a i . V v y , n ub nmu nd i c h u y nt h n gq u a c c p h mv i x c n hb i h a i v n gl p , b nn i i ug n h t h n y :


t r o n gk h i( b t u=k tt h c ! ) c o u t< <b t u++< <e n d l ;

n i b t uv k t t h c l h a i v n gl pt r o n gp h mv i . L ur n gc u i l p , m c h n gt a t h n gg i l c c t r n g i m c u i , k h n gd e r e f e r e n c e dv c c h c h ob nb i t r n gb n a n g c u i c a c h u i . V v y , n i d i nc h o" m t q u k h c u i c n g . " P h nl nt h i g i a nb ns mu nd i c h u y nt h n gq u a t o nb c h u i t r o n gm t c o n t a i n e r , d o c h a c nm t s c c h t or a v n gl pc h ot h ys b t uc a c h u i v c c t r n g i mk t t h c . y , n h t r o n gt i uc h u nC++T h v i n , c c v n gl p c s nx u t b i c c t h n hv i nc h a c h c n n gb t u( ) v k t t h c ( ) . b t u( ) s d n g u t i nl px yd n gm m c n hl c h v o uc a c c c o n t a i n e r ( yl y ut ut i n yv os t a c k ) . T u yn h i n , m t n h x yd n gt h h a i , c s d n gb i k t t h c ( ) , l c nt h i t t or a c c t r n g i mc u i l p. L " c u i " c n g h a l c h v o uc a n g , b i v ul u nl u nc h ot h yc s nk t i pn h n gk h n gs d n gk h n gg i a nt r n s t a c k . i un yl px yd n gm t i s t h h a i c k i ub o o l , m l m t g i p h nb i t h a i n h x yd n g . C c s F i b o n a c c i c s d n gm t l nn a l p yI n t S t a c kt r o n gma i n( ) , v l ps c s d n g d i c h u y n q u a t o nb I n t S t a c kv c n gt r o n gm t p h mv i h pc a d y . B c t i pt h e o , t t n h i n , l l mc h oc h u n gm c a t e mp l a t i z i n gn v ol o i m n n mg i , d o t h a yv b b u c p h i t c h c c h c i n t s b nc t h g i b t k l o i :


// :C 1 6 :I t e r S t a c k T e m p l a t e . h // ng i nc h n gm uv il pl n gn h a u #I f n d e fI T E R S T A C K T E M P L A T E _ H #X c n hI T E R S T A C K T E M P L A T E _ H
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 284/320

08/10/2013

Suy ngh trong C + +, Vol 1

#B a og m" . ./R e q u i r e . h " #I n c l u d e t e m p l a t eT ,i n ts s i z e=1 0 0 >l pS t a c k T e m p l a t e{ Ts t a c k[ s s i z e ] ; i n t u ,c n gc h n g : S t a c k T e m p l a t e( ) : u( 0 ){ } k h o n gt r n g y( c o n s tT&i ){ y uc u( u < s s i z e ," Q u n h i up u s h( )e s " ) ; c h n g[ ut r a n g++ ]=i ; } Tp o p( ){ y uc u( t r n >0 ," Q u n h i uc as p o p( )s " ) ; t r l in g nx p[ - ut r a n g ] ; } l pl p ;//T u y nb y uc u n g ib nl pl p ;//L mc h on m tn g ib n l p l p{ //B yg i n hn g h an S t a c k T e m p l a t e&s , i n ti n d e x ; c n gc n g : I t e r a t o r( S t a c k T e m p l a t e&s t ) :s( s t ) ,c h s ( 0 ){ } // t or a" k tt h cS e n t i n e l "l p : I t e r a t o r( S t a c k T e m p l a t e&s t ,s h o r t ) :S( s t ) ,c h s ( s . t o p ){ } T i uh n h*( )c o n s t{ r e t u r ns . s t a c k[ i n d e x ] ; } To p e r a t o r++( ){ h n ht h c//T i nt y uc u( c h s < s . t o p , " l pd ic h u y nr ak h ip h mv i " ) ; s . s t a c kt r l i[ ++ c h s ] ; } To p e r a t o r++( i n t ){ //P o s t f i xh n ht h c y uc u( c h s < s . t o p , " l pd ic h u y nr ak h ip h mv i " ) ; s . s t a c kt r l i[ c h s ++ ] ; } //C h u y nm ti t e r a t o rv p h at r c l p&o p e r a t o r+=( i n tl n g ){ y uc u( c h s +s l n g< s . t o p , " S t a c k T e m p l a t e: :l p: :o p e r a t o r+=( ) " " c g n g d ic h u y n r ak h ig i ih n " ) , c h s +=s l n g; t r l i*n y ; } // x e mb n a n gc u i : b o o lo p e r a t o r= =( c o n s tl p&r v )c o n s t{ t r l ic h s = =r v . i n d e x ; } b o o lo p e r a t o r=( c o n s tl p&r v )c o n s t{ ! c h s l in h u n=r v . i n d e x ! ; } b ns t d: :o s t r e a m&o p e r a t o r< <( s t d: :o s t r e a m&o s ,c o n s tl pv n ){ t r l ih i uh n h< <*n ; } } ; l pb t u( ) { l pl i( *t h i s ) ; } //T ok t t h c" t r n g i m " : c u i I t e r a t o r( ){ l pl i( *n y ,t r u e ) ; } } ; #E n d i f//I T E R S T A C K T E M P L A T E _ H/// :~

B nc t h t h yr n gv i c c h u y n i t m t l ph c t h n gx u y n nm t mul h pl mi n hb c h . P h n gp h p n y ut i nt or a v g l i m t l ph c b n ht h n g , s a u l mc h on t h n hm t b nm u , t h n g c c o i l d d n gh ns ov i v i c t or a c c m ut u . Nh nt h yr n gt h a yv c h n i : b nl p ;//L mc h on m tn g ib n M n yc : n g ib nl pl p ;//L mc h on m tn g ib n i un yl q u a nt r n gb i v t n" l p " l c t r o n gp h mv i , t m t t pt i nb a og m. T h a yv h i nt i ( ) c h c n n gt h n hv i n , l pc m t n h i uh n h* c h np h nt h i nh n h , m l mc h ol p t r n gg i n gn h m t c o nt r v l m t t h c t p h b i n . D i yl v d s a i k i mt r a c c m u :


// :C 1 6 :I t e r S t a c k T e m p l a t e T e s t . c p p //{ L }f i b o n a c c i #B a og m" f i b o n a c c i . h " #B a og m" I t e r S t a c k T e m p l a t e . h " #I n c l u d e #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ S t a c k T e m p l a t e< i n t >l ; f o r( i n ti=0 ;i< 2 0 ;i++ ) i s . p u s h( f i b o n a c c i( i ) ) ; //T r a v e r s ev im ti t e r a t o r : c o u t< < " T r a v e r s ec S t a c k T e m p l a t e\n" ; S t a c k T e m p l a t e< i n t >: :I t e r a t o rn = i s . b e g i n( ) ; t r o n gk h i( i t=i s . e n d( ) ) c o u t< <n ++< <e n d l ; c o u t< <" iq u am tp h n\n " ; S t a c k T e m p l a t e<i n t >: :l p b t u=i s . b e g i n( ) ,k tt h c=i s . b e g i n( ) ; b t u+=5 ,k tt h c+= 1 5 ; c o u t< <" b t u= "< <b t u< <e n d l ; c o u t< <" k tt h c=" < < c u i< <e n d l ; t r o n gk h i( b t u=k tt h c ! ) c o u t< <b t u++ < <e n d l ; i f s t r e a mt r o n g( " I t e r S t a c k T e m p l a t e T e s t . c p p " ) ; mb o ( t r o n g" I t e r S t a c k T e m p l a t e T e s t . c p p " ) ; n gd y ; C h u i< s t r i n g >S t a c k T e m p l a t e ; t r o n gk h i( g e t l i n e( t r o n g ,d n g ) ) s t r i n g s . p u s h ( l i n e ) ; S t a c k T e m p l a t e< s t r i n g >: :l p s b=s t r i n g s . b e g i n( ) ,s e=s t r i n g s . e n d
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 285/320

08/10/2013

Suy ngh trong C + +, Vol 1

( ) ;

!t r o n gk h i( s b=s e )

c o u t< <s b++< <e n d l ; }/// :~

V i c s d n g ut i nc a b i nl pc h c u c t u nh n hn t u nc u i ( v c h ot h yr n gt r n g i mk t t h c h o t n gt t ) . T r o n gv i c s d n gt h h a i , b nc t h t h yv n gl pc h op h pb nd d n gx c n hm t l o t c c y ut ( c c t h n gc h a v v n gl pt r o n gt i uc h u nC++s d n gT h v i nk h i n i mn yc a d yg nn h k h pm i n i ) . S q u t i t o nt +=d i c h u y nb t uv k t t h c v n gl pv t r g i a p h mv i c a c c y ut t r o n gl , v n h n gy ut n y c i nr a . T h n gb ot r o n g ur a m c c t r n g i mc u i c n gl k h n g b a og mt r o n gp h mv i , d o n c t h l m t q u k h k t t h c c a p h mv i c h ob nb i t b n v t q u a c u i c n gn h n gb nk h n g c h t i c hc c t r n g i mc u i , h o c n g i n ok h c b nc t h k t t h c d e r e f e r e n c i n gm t c o nt r n u l l . ( T i t b ov t r o n gS t a c k T e mp l a t e : : i t e r a t o, n h n gr t r o n gt i uc h u nC++c o n t a i n e r T h v i nv v n gl pk h n gc m n h v yv l d oh i uq u v v yb np h i c h . ) C u i c n g , x c mi n hr n gS t a c k T e mp l a t e l mv i c v i l p c c i t n g , m t c k h i t oc h oc h u i v c h a yn h n gd n gt t pt i nm n g u n , s a u c i nr a .

S t a c kv i v n gl p
C h n gt a c t h l pl i q u t r n hn yv i c c n gc k c ht h c n g nx pl ph c c s d n gn h l m t v d t r o n gs u t c u ns c h . D i yl c c n g nx pl ph c v i m t l pl n gn h a ux pv oh nh p :
// :C 1 6 :T S t a c k 2 . h S t a c k//T e m p l a t i z e dv il pl n gn h a u #I f n d e fT S T A C K 2 _ H #X c n hT S T A C K 2 _ H t e m p l a t eT >l pS t a c k{ c ut r cl i nk t{ T*d l i u ; L i nk t*t i pt h e o ; L i nk t( T*d a t ,*L i nk tN X T ) :D l i u( d a t ) ,t i pt h e o( N X T ){ } }* u ,c n gc h n g : N g nx p( ) : u( 0 ){ } ~S t a c k( ) ; t r n gp u s h( T*d a t ){ u =n e wl i nk t( d a t ,n g i n g u ) ; } T*( )c o n s t{ ut r l i ? u >d l i u :0 ; } T*p o p( ) ; //L pl pl n gn h a u : l pl p ;//T u y nb y uc u n g ib nl pl p ;//L mc h on m tn g ib n l pl p{ //B yg i n hn g h an s t a c k: :L i nk t*p ; c n gc n g : I t e r a t o r( c o n s ts t a c k< T >&t l ) :p( t l . h e a d ){ } //C o p y x yd n g : l p( c o n s t l p&t l ) :p( t l . p ){ } //K tt h cl pt r n g i m : I t e r a t o r( ) :p( 0 ){ } //N h i uh n h++t r v b o o l e a nc u ic h : b o o lo p e r a t o r++( ){ i f( p >t i p t h e o ) p=p >t i pt h e o ; k h cp=0 ;//C h ob i tc u id a n hs c h t r l ib o o l ( p ) ; } b o o lo p e r a t o r++( i n t ){ t r l i i uh n h++( ) ; } T*h i nt i( )c o n s t{ i f( p )t r v 0 ; t r l ip >d l i u ; } //C o nt r t o nt t h a mc h i u : T*o p e r a t o r >( )c o n s t{ !y uc u( p= 0 , " P S t a c k: :l p: :o p e r a t o r >t r v 0 " ) ; t r l ih i nt i( ) ; } T* i uh n h*( )c o n s t{ r e t u r nh i nt h i( ) ; } /c h u y n i/b o o lc h ok i mt r a i uk i n : b o o lo p e r a t o r( )c o n s t{ r e t u r nb o o l( p ) ; } //S os n h k i mt r ak tt h c : b o o lo p e r a t o r= =( c o n s tl p& )c o n s t{ t r l ip= =0 ; } b o o lo p e r a t o r= ( c o n s tl p& )c o n s t{ ! t r l ip=0 ! ; } } ; l pb t u( )c o n s t{ l pl i( *n y ) ; } l pc u i( )c o n s t{ l pl i( ) ; } } ; t e m p l a t eT >s t a c k< T >: :~S t a c k( ){ t r o n gk h i( u ) x ap o p( ) ; } t e m p l a t eT >T*s t a c k< T >: :p o p( ){ i f( u= =0 )r e t u r n0 ; T*k tq u = u > d l i u , l i nk t*o l d H e a d= u ; u= u >t i pt h e o ; x ao l d H e a d , k tq u t r v ; } #E n d i f//T S T A C K 2 _ H/// :~

B nc n gs n h nt h yc c l ph c c t h a y i h t r q u y ns h u , h o t n gt i v l pb i t c c l o i c h n h x c ( h o c t n h t l c c l o i h n hc b n , m s l mv i c g i n hh mh y o c s d n g ) . M c n hl c h oc c c o n t a i n e r t i ud i t i t n gc a n n h n gb nc t r c hn h i m i v i b t k g i r n gb nb t ( ) . I t e r a t o r l ng i n , v t h c h t r t n h k c ht h c c a m t c o nt r d u yn h t . K h i b nt or a m t b i nl p, n k h i t o
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 286/320

08/10/2013

Suy ngh trong C + +, Vol 1

c h on g i n g ud a n hs c hl i nk t , v b nc h c t h t n gn v p h a t r c t h n gq u a d a n hs c h . N ub nmu n b t ul i t u , b nt om t b i nl pm i , v n ub nmu ng h i n h m t v t r t r o n gd a n hs c h , b nt or a m t b i n l pm i t l ph i nt i c h v ov t r n y( b n gc c hs d n gc a l ps a oc h px yd n g ) . g i c h c n n gc h o i t n g c g i b i l p , b nc t h s d n gh i nt i ( ) c h c n n g , c c n h i uh n h* , h o c t i c hc a c o nt r i uh n h >( r t p h b i nt r o n gv n gl p ) . S a un yc t h c h i n i u t r n g g i n gv i h i nt i ( ) b i v n s t r v m t c o nt r n i t n gh i nt i , n h n gl k h c n h a u , v c c t o nt t h a mc h i uc o nt r t h c h i nc pt h md e r e f e r e n c i n g( x e mC h n g1 2 ) . S l pl pt h e oh n ht h c b n t h yt r o n gv d t r c . l pl p c l n gv ob nt r o n gl pc o n t a i n e r , n c h a x y d n g t or a c m t b i nl pc h v om t y ut t r o n gc o n t a i n e r v m t " k t t h c S e n t i n e l " l p , v c c l pc o n t a i n e r c s b t u( ) v k t t h c ( ) p h n gp h p t or a n h n gv n gl p . ( K h i b nt mh i ut h mv c c t i uc h u nC+ +T h v i n , b ns t h yr n gc c t nl p, b t u( ) , v k t t h c ( ) c s d n g y c n n gl nr r n gc c l pc o n t a i n e r t i uc h u n . K t t h c c h n gn y , b ns t h yr n g i un yc h op h pc c l pc o n t a i n e r s c s d n g n h l c c h u nC++T h v i nl pc o n t a i n e r . ) T o nb t h c h i n c c h a t r o n gc c t pt i nt i u , d o , k h n gr i n gc p pt pt i n . D i yl m t t h n g h i m n h m c c b i t pl p :


// :C 1 6 :T S t a c k 2 T e s t . c p p#b a og m" T S t a c k 2 . h " #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< f s t r e a m >#i n c l u d eu s i n gn a m e s p a c es t d ; i n tm a i n( ){ i f s t r e a mt pt i n( " T S t a c k 2 T e s t . c p p " ) ; mb o( t pt i n , " T S t a c k 2 T e s t . c p p " ) ; N g nx pt e x t l i n e s< s t r i n g > ; // ct pt i nv d n gl ut r t r o n gS t a c k : n gd y , t r o n gk h i( g e t l i n e( t p t i n ,d n g ) ) t e x t l i n e s . p u s h( c h u im i( d n g ) ) ; i n ti=0 ; //S d n gl p i nd n gt d a n hs c h : N g nx p< s t r i n g >: :I t e r a t o rn =t e x t l i n e s . b e g i n( ) ; s t a c k< s t r i n g >: :l p*i t 2=0 ; t r o n gk h i( !n =t e x t l i n e s . e n d( ) ){ c o u t< <n >c _ s t r( )< <e n d l ; n ++ ; i f( ++i= =1 0 )//G h id n g1 0 i t 2=n e w< s t r i n g >s t a c k: :l p( n ) ; } c o u t< <( *i t 2 )>c _ s t r( )< <e n d l ; x ai t 2 ; }/// :~

M t n g nx p c k h i t o g i c h u i c c i t n gv y n gt m t t pt i n . S a u , m t b i nl p c t or a v c s d n g d i c h u y nq u a c c t r n ht . D n gt h m i c n h nb n gc c hs a oc h p x yd n gm t l p t h h a i t ut i n , s a u d n gn y c i nv l pt n gs i n hr a b p h h y . y , i t n gs n gt on n g n g , c s d n g k i ms o t t h i g i a ns n gc a i t n g .

P S t a s hv i v n gl p

i v i h uh t c c l pc o n t a i n e r n l mc h ot i n ht h n c m t b i nl p . D i yl m t l pt h mv oP S t a s h l p :
// :C 1 6 :T P S t a s h 2 . h P S t a s h//T e m p l a t i z e dv il pl n gn h a u #I f n d e fT P S T A S H 2 _ H #X c n hT P S T A S H 2 _ H #B a og m" . ./R e q u i r e . h " #B a og m< c s t d l i b > t e m p l a t eT ,i n ti n c r=2 0 >l pP S t a s h{ i n ts l n g ; i n tt i pt h e o ; T* *l ut r ; t r n gt h ip h n g( i n tt n g=i n c r ) ,c n gc h n g : P S t a s h( ) :s l n g( 0 ) ,l ut r ( 0 ) ,t i pt h e o( 0 ){ } ~P S t a s h( ) ; i n ta d d( T*p h nt ) ; T*t o nt [ ]( i n ti n d e x )c o n s t ; T*l o ib ( i n ti n d e x ) ; i n tc o u n t( )c o n s t{ r e t u r nt i pt h e o ; } // l pl pl n gn h a u : l pl p ;//T u y nb y uc u n g ib nl pl p ;//L mc h on m tn g ib n l pl p{ //B yg i n hn g h an P S t a s h&p s ; i n ti n d e x ; c n gc n g : I t e r a t o r( P S t a s h&p S t a s h ) :p s( p S t a s h ) ,c h s ( 0 ){ } // t ot r n g i mk tt h c : l p( P S t a s h&p S t a s h ,s h o r t ) :P s( p S t a s h ) ,c h s ( p s . n e x t ){ } //C o p y x yd n g : I t e r a t o r( c o n s tl p&r v ) :p s( r v . p s ) ,c h s ( r v . i n d e x ){ } l p& o p e r a t o r=( c o n s tl p&r v ){ p s=r v . p s ; i n d e x=r v . i n d e x ; *t r l in y ; } l p&o p e r a t o r++( ){ y uc u( ++c h s < =p s . n e x t , " P S t a s h : :l p: :o p e r a t o r++ " " d ic h u y nc h s n g o ig i ih n " ) ; *t r l in y ; } l p&o p e r a t o r++( i n t ){ i uh n ht r l i++( ); } l p& i uh n h-( ){ y uc u( -c h s >=0 , " P S t a s h: :l p: : n h i uh n h" " d ic h u y nc h s n g o ig i ih n " ) ; *t r l in y ; } l p& i uh n h-( i n t ){ t r l i i uh n h-( ) ; }
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 287/320

08/10/2013

Suy ngh trong C + +, Vol 1

//C h u y ni n t e r a t o rv p h at r ch o cp h as a u : l p&o p e r a t o r+=( i n tl n g ){ y uc u( c h s +s l n g< p s . n e x t& & c h s +s l n g >=0 , " P S t a s h: :l p: :o p e r a t o r+= " " c g n g c h s n g o ig i ih n" ) ; c h s + =s l n g ; *t r l in y ; } l pv n h i uh n h=( i n tl n g ){ y u c u( c h s -S t i n< p s . n e x t& & c h s -s l n g >=0 , " P S t a s h: :l p: : o p e r a t o r = " " c g n g c h s n g o ig i ih n " ) , c h s -=s l n g ; * t r l in y ; } //T om tb i nl pm i a n gd ic h u y nv p h at r c l p i uh n h+( i n tl n g )c o n s t{ r e tl p( *n y ) ; r e t+=s l n g ;//o p+=k h n gk i mt r ag i ih n t r l i r e t ; } T*h i nt i( )c o n s t{ t r l ip s . s t o r a g e[ i n d e x ] ; } T* i uh n h*( )c o n s t{ r e t u r nh i nt h i( ) ; } T*o p e r a t o r >( )c o n s t{ y uc u ( p s . s t o r a g e[ i n d e x ]=0 , ! " P S t a s h: :l p: :o p e r a t o r >t r v 0 " ) ; h i nt i( )t r l i ; } //H yb c cy ut h i n : T*l o ib ( ){ t r l ip s . r e m o v e( c h s ) ; } /K i mt r a/S os n hc h oc u i : b o o lo p e r a t o r= =( c o n s tl p&r v )c o n s t{ c h s l i n h u n= =r v . i n d e x ; } b o o lo p e r a t o r=( c o n s tl p&r v )c o n s t{ ! c h s l in h u n=r v . i n d e x ! ; } } ; l pb t u( ){ l pl i( *t h i s ) ; } l pc u i( ){ l pl i( *n y ,t r u e ) ; } } ; //T i uh u c cv tc h a : t e m p l a t eT ,i n ti n c r >P S t a s h< T ,i n c r >: :~P S t a s h( ){ f o r( i n ti=0 ;i< t i pt h e o ;i++ ) { x al ut r [ i ] ;//N u l lc o nt r O K l ut r [ i ]=0 ;//C h c n ca nt o n } x a[ ]l ut r ; } t e m p l a t eT ,i n ti n c r >i n tP S t a s h< T ,i n c r >: :a d d( T*y ut ){ i f( s a u >=s l n g ) t n gl n( ) ; l ut r [ t i pt h e o++ ]=y ut ; t r l i( t i pt h e o-1 ) ;/ /s I n d e x } t e m p l a t eT ,i n ti n c r >n it u y nT*P S t a s h< T ,i n c r >: :o p e r a t o r[ ]( i n ti n d e x )c o n s t{ y uc u ( c h s >=0 , " P S t a s h: :o p e r a t o r[ ]c h s t i uc c " ) ; i f( i n d e x >=t i pt h e o ) t r v 0 ;// c h ob i tk tt h cc c y uc u( l ut r [ i n d e x ]=0 , ! " P S t a s h: :o p e r a t o r[ ]t r l iv g i t r c o nt r " ) ; l ut r t r l i[ i n d e x ] ; } t e m p l a t eT ,i n ti n c r >T*P S t a s h< T ,i n c r >: :r e m o v e( i n ti n d e x ){ //N h i uh n h[ ]t h ch i nk i mt r at n hh pl : T*v= i uh n h[ ]( i n d e x ) ; //" H yb "c o nt r : l ut r [ i n d e x ]=0 ; t r l iv ; } t e m p l a t eT ,i n ti n c r >t r n gP S t a s h< T ,i n c r >: :t h ip h n g( i n tt n g ){ c o n s ti n t T s z=s i z e o f( T* ) ; T* *s t=n e wT*[ s l n g+t n g ] ; m e m s e t(s t ,0 ,( s l n g +T n g )*T s z ) ; m e m c p y( s t ,l ut r ,s l n g*T s z ) ; s l n g+=t n g ; x a[ ] l ut r ;//l ut r C l ut r =s t ;// i mt ib n h m i } #E n d i f//T P S T A S H 2 _ H/// :~

H uh t c c t pt i nn yl m t b nd c hk h ng i nc a c h a i t r c P S t a s hv l n gn h a ul pv om t b nm u . T h i g i a nn y , t u yn h i n , c c n h k h a i t h c t r l i t h a mc h i u nc c b i nl ph i nt i , l c c ht i pc n i nh n hh n v l i n hh o t t h c h i n . D e s t r u c t o r g i x a c h ot t c c c c o nt r c h a , v b i v c c l o i b b t b i c c m u , t i uh yp h h ps d i nr a . B n n nb i t r n gn uc o n t a i n e r c h a c o nt r nm t l o i c s n gc p , l o i n nc m t oh y mb ol ms c h t h c h h p c a c c i t n g c n g u n g c c a c h c n e ml n k h i a c h n g v o m t c o n t a i n e r . C c P S t a s h: : i t e r a t ot h e omh n hl pc a l i nk t nm t r i t n gc o n t a i n e r d u yn h t c h oc u c i c a m n h . Ng o i r a , c o p y c o n s t r u c t o r c h op h pb nt h c h i nm t b i nl pm i c h v oc n gm t v t r n h l ph i nt i m b n t or a n t , t h c h i nc h i uq u m t n hd uv oc o n t a i n e r . C c n h i uh n h+=v n h i uh n h=h m t h n hv i nc h op h pb nd i c h u y nm t i t e r a t o r b i m t s i m, t r o n gk h i t nt r n gc c r a n hg i i c a c o n t a i n e r . V i c t n gv g i mb t k h a i t h c q u t i d i c h u y nl pb i m t n i . C c n h i uh n h+t or a m t b i nl pm i a n g d i c h u y nv p h a t r c b i s l n gc c p h . Nh t r o n gv d t r c , c c n h k h a i t h c t i c hc a c o nt r c s d n g h o t n gt r nc c y ut l p c c p n , v l o i b ( ) p h h yc c i t n gh i nt i b n gc c hg i c a c o n t a i n e r l o i b ( ) .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 288/320

08/10/2013

Suy ngh trong C + +, Vol 1

C n gm t l o i m n h t r c ( a l a t i uc h u nC++T h v i nc o n t a i n e r ) c s d n g t or a c c t r n g i mk t t h c : m t n h x yd n gt h h a i , c a c o n t a i n e r e n d( ) c h c n n gt h n hv i n , v t o nt = =v n h i uh n h= ! s o s n h . V d s a u yt or a v t h n g h i mh a i l o i k h c n h a uc a S t a s h i t n g , m t c h om t l pm i g i l I n t r n g t h n gb ox yd n gv t np h c a n v m t g i c c i t n gc a t i uc h u nt h v i nc h u i l p .
// :C 1 6 :T P S t a s h 2 T e s t . c p p #B a og m" T P S t a s h 2 . h " #B a og m" . ./R e q u i r e . h " #I n c l u d e #B a og m< v e c t o r >#i n c l u d eu s i n gn a m e s p a c es t d ; l pI n t{ i n ti ;c n gc n g : I n t( i n ti i=0 ) :i( i i ){ c o u t< <" > "< <i< <' ' ; } ~I n t( ){ c o u t< <" ~ "< <i< <' ' ; } i uh n hi n t( )c o n s t{ r e t u r ni ; }b no s t r e a m &o p e r a t o r< <( o s t r e a m&o s ,c o n s ti n t&x ){t r l io s< <" I n t:" < <x i ; } b no s t r e a m& o p e r a t o r< <( o s t r e a m&o s ,c o n s ti n t*x ){ t r l i o s< <" I n t : "< <x >i ; } } ; i n tm a i n( ){ { //B u ch yc u cg i P S t a s h< i n t >i n t s ; f o r( i n ti=0 ;i < 3 0 ;i++ ) i n t s . a d d( m iI n t( i ) ) ; c o u t< <e n d l ; P S t a s h< i n t >: :I t e r a t o rn =i n t s . b e g i n( ) ; n +=5 ; P S t a s h< i n t >: :l pi t 2=n +1 0 ; f o r( ;n =i t 2 ,n ++ ! ) x ai t . r e m o v e ( ) ;//M c n hl o ib c o u t< <e n d l ; c h o( n =i n t s . b e g i n( ) ,n =i n t s . e n d( ) , n ++ ) ! n u( *n )//R e m o v e( )g yr a" l h n g " c o u t< <*n < <e n d l ; }//" s n g u y n "h yg i y c o u t< <" \n--\n" ; i f s t r e a m t r o n g( " T P S t a s h 2 T e s t . c p p " ) ; mb o( t r o n g" T P S t a s h 2 T e s t . c p p " ) ; //K h ic h oS t r i n g : P S t a s h<s t r i n g >d y , n gd y ; k h i( g e t l i n e( t i ,d n g ) ) s t r i n g s . a d d( m i s t r i n g( d n g ) ) ; P S t a s h< s t r i n g >: :l pn g i=s t r i n g s . b e g i n( ) ; c h o( ;n g i=s t r i n g s . e n d( ) ; !n g i+ + ) c o u t< <* *n g i< <e n d l ; n g i=s t r i n g s . b e g i n( ) ; i n tn=2 6 ; n g i+=n ; f o r( ;n g i=s t r i n g s . e n d( ) ;n g i++ ) c o u t< <n++< <" : "< <* *n g i< <e n d l ; }/ // :~

t h u nt i n , I n t c l i nq u a no s t r e a mo p e r a t o r < <c h oc m t I n t &v m t I n t * . K h i ut i nc a m t r o n gma i n( ) c b a oq u a n hb i d un g o c b u c t i uh u c a < i n t >P S t a s hv d o l m s c ht n gb n gc c hh y . M t l o t c c y ut c l o i b v x a b n gt a y c h ot h yr n gc c P S t a s hd n d pp h nc nl i . i v i c h a i t r n gh pc a P S t a s h, m t b i nl p c t or a v c s d n g d i c h u y nq u a c c t h n g c h a . Nh nt h ys s a n gt r n g c s nx u t b n gc c hs d n gc ut r c n y , b nk h n gc h t r c hv i c c c h i t i t t h c h i nb n gc c hs d n gm t m n g . B nn i v i c o n t a i n e r v c c i t n gl p n h n g g l m, k h n gn h t h n o . i un yl mc h oc c g i i p h pd d n gh n k h i n i mh a , x yd n g v s a i .

T i s a ov n gl p ?

C h o nb yg i b n n h nt h yc c c c h v n gl p , n h n gs h i ub i t l d ot i s a oh l n h v yq u a nt r n g c nm t v d p h c t ph n . Np h b i n x e m a h n h , i t n gs n gt on n g n g , v c o n t a i n e r c s d n gc n gn h a ut r o n gm t c h n gt r n hh n g i t n gt h c s . C o n t a i n e r v c c i t n gs n gt on n g n gg i i q u y t v n c a k h n gb i t b a on h i uh o c l o i i t n gm b ns c n . V n uc o n t a i n e r c c uh n h g i c o nt r n i t n g l p c s , m t n e ml n x y r a m i k h i b n a m t c o n t r c n g u n g c t l p v o c o n t a i n e r ( v i m t c h c l i nq u a nv l i c hm r n g ) . Nh m c u i c n gt r o n gT p1 c a c u ns c hn y , v d n yc n gs k o n h a uk h a c n hk h c n h a uc a t t c m i t h b n h c c c h o nn a yn ub nc t h l mt h e ov d n y , s a u b n s ns n gc h oT p2 . G i s b n a n gt or a m t c h n gt r n hc h op h pn g i d n gc h n hs a v s nx u t c c l o i k h c n h a uc a b n v . M i l nr t l m t i t n gc c h a m t b s ut pc c h n hd n g i t n g :

// :C 1 6 :S h a p e . h #I f n d e fS H A P E _ H #X c n hS H A P E _ H #I n c l u d e #I n c l u d e
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 289/320

08/10/2013

Suy ngh trong C + +, Vol 1

l pS h a p e{ p u b l i c : v i r t u a lv o i dh a( )=0 ; v i r t u a lv o i dx a( )=0 ; o~S h a p e( ){ } } ; l pC i r c l e :S h a p e{ p u b l i c : C i r c l e( ){ } ~C i r c l e( ){ s t d: :c o u t< <" C i r c l e: :~m i\n " ; } t r n gh a( ){ s t d: :c o u t< <" C i r c l e : :h a\n " ; } t r n gx a( ){ s t d ::c o u t< <" C i r c l e: :x a\n " ; } } ; l pS q u a r e :S h a p e{ p u b l i c : Q u n gt r n g( ){ } ~Q u n gt r n g( ){ s t d: :c o u t< <" Q u n gt r n g: :~Q u n gt r n g\n " ; } t r n gh a( ) { s t d: :c o u t< <" Q u n gt r n g: :h a\n " ; } t r n gx a( ){ s t d ::c o u t< <" Q u n gt r n g: : x a\n " ; } } ; l pL i n e :S h a p e{ p u b l i c : L i n e( ){ } ~L i n e( ){ s t d: :c o u t< <" L i n e: :~d n g\n " ; } t r n gh a( ){ s t d: :c o u t< <" L i n e : :v \n " ; } t r n gx a( ){ s t d ::c o u t< <" L i n e: :x a\n " ; } } ; #E n d i f//S H A P E _ H/// :~

N ys d n gc ut r c c i nc a c c c h c n n g ot r o n gl pc s c g h i t r o n gl pd nx u t . Nh nt h yr n gc c h n hl pb a og m m t oh y , m t c i g b ns t n gt h mv oc c l pv i oc h c n n g . N um t c o n t a i n e r c h a c o nt r h o c t h a mc h i u nh n hd n g i t n g , s a u k h i c c oh mh y c g i l c h oc c i t n gt t c m i t h s c l ms c h n gc c h . M i l o i k h c n h a uc a b nv t r o n gc c v d s a u yl mc h ov i c s d n gm t l o i k h c n h a uc a t e mp l a t i z e dl p c o n t a i n e r : c c P S t a s hv n g nx p c x c n ht r o n gc h n gn y , v v e c t o r l pt t i uc h u nC++T h v i n . " S d n g " ' c a c o n t a i n e r l c c k ng i n , v n i c h u n gt h a k c t h k h n gp h i l p h n gp h pt t n h t ( t h n h p h nc t h l mc h ot i n ht h nn h i uh n ) , n h n gt r o n gt r n gh pn yt h a k l m t c c ht i pc n ng i nv n k h n gl mg i mc c i m c t h c h i nt r o n gv d .


// :C 1 6 :D r a w i n g . c p p #B a og m< v e c t o r >//S d n gv e c t o rt i uc h u nq u ! #B a og m" T P S t a s h 2 . h " #B a og m" T S t a c k 2 . h "#b a og m" S h a p e . h "u s i n gn a m e s p a c es t d ; //AV c h y ul m tc o n t a i n e rc ah n hd n g : l pV :c n gP S t a s h< S h a p e >{ p u b l i c : ~V ( ){ c o u t< <" ~V "< <e n d l ; } } ; //K h o c hAl m tc o n t a i n e rk h cn h a uc ah n hd n g : l pK h o c h :S t a c k< S h a p e >{ p u b l i c : ~K h o c h( ){ c o u t< <" ~K h o c h "< <e n d l ; } } ; //AS l m tc o n t a i n e rk h cn h a uc ah n hd n g : S l p :v e c t o r< S h a p e * >{ p u b l i c : ~S ( ){ c o u t< <" ~ "< <e n d l ; } } ; //M th mm u :t e m p l a t eI t e r >t r n gd r a w A l l( I t e rb t u ,I t e rc u i ){ t r o n gk h i( !b t u=c u i ){ ( *b t u )>v ( ) ; b t u++ ; } } i n tm a i n( ){ //M il o ic o n t a i n e rc //m tg i a od i nk h cn h a u : V d ; d . a d d( m it r n ) ; d . a d d( Q u n gt r n gm i ) ; d . a d d( d n gm i ) ; K h o c hp ; p . p u s h( d n gm i ) ; p . p u s h( Q u n gt r n gm i ) ; p . p u s h( m it r n ) ; S s ; s . p u s h _ b a c k( Q u n gt r n gm i ) ; s . p u s h _ b a c k( m it r n ) ; s . p u s h _ b a c k( d n gm i ) ; H n hd n g*s a r r a y[ ]={ m iT r n ,V u n g
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 290/320

08/10/2013

Suy ngh trong C + +, Vol 1

m i ,m id n g } ; //C cv n gl pv c h cn n gm u //c h op h ph c i ut r t n gq u t : c o u t< <" V d : "< <e n d l ; d r a w A l l( d . b e g i n( ) ,d . e n d( ) ) ; c o u t< <" K h o c hp : " < <e n d l ; d r a w A l l( p . b e g i n( ) ,p . e n d( ) ) ; c o u t< <" s : "< <e n d l ; d r a w A l l ( s . b e g i n( ) ,s . e n d( ) ) ; c o u t< <" m n gs a r r a y : "< <e n d l ; //N g a yc l mv i cv i m n gc o nt r : d r a w A l l( s a r r a y , s a r r a y+s i z e o f( s a r r a y )/s i z e o f( *s a r r a y ) ) ; c o u t< <" K tt h cc h n h "< <e n d l ; }/// :~

C c l o i k h c n h a uc a c c t h n gc h a t t c c c t c h c c o nt r nh n hd n gv c o nt r nu p C a s t i t n gc a c c l ph c c n g u ng c t S h a p e . T u yn h i n , d o a h n h , h n hv i t h c hh pv nx yr a k h i c h c n n gn y c g i l o . L ur n gs a r r a y, c c m n gh n h* , c n gc t h c c o i n h l m t c o n t a i n e r .

C h cn n g m u

T r o n gd r a wA l l ( ) m b nn h nt h ym t c i g m i . C h o nn a yt r o n gc h n gn y , c h n gt i c s d n g c h l p m u, m k h i t oc c l ph c m i d a t r nm t h o c n h i ut h a ms k i u . T u yn h i n , b nc t h d d n g t or a c c c h c n n g m u, m t or a c c c h c n n gm i d a t r nc c t h a ms k i u . L d ob nt or a m t h m m u l l d om b ns d n gc h om t l ph c m u : B n a n gc g n g t or a m l n ht n gq u t , v b nl m i un y b n gc c ht r h o nc c c i mk t h u t c a m t h o c n h i ul o i . B nc h mu nn i r n gn h n gt h a ms k i uh t r h o t n gn h t n h , k h n gc h n hx c n h n gg l o i h a n gc . H m m ud r a wA l l ( ) c t h c c o i n h m t t h u t t o n ( V yl n h n gg h uh t c c m uc h c n n gt r o n gc c t i uc h u nC++T h v i n c g i l ) . Nc h n i n h t h n o l m m t c i g v n gl p c mt m t l o t c c y ut , mi nl c c v n gl pc t h c d e r e f e r e n c e d , t n gl n , v s os n h . yl n h n gc h n hx c c c l o i v n gl pc h n gt i c p h t t r i nt r o n g c h n gn y , v c n gc k h n gt n hc l o i v n gl p c s nx u t b i c c c o n t a i n e r t r o n gt i uc h u nC++T h v i n , b n gc h n gl v i c s d n gc c v e c t o r t r o n gv d n y . C h n gt i c n gmu nd r a wA l l ( ) l m t t h u t t o nc h u n g c h u n g , d o , c c c o n t a i n e r c t h c b t k l o i t t c v c h n gt i k h n gc np h i v i t m t p h i nb nm i c a t h u t t o nc h ot n gl o i k h c n h a uc a c c c o n t a i n e r . yl n i m c c m uc h c n n gl r t c nt h i t , b i v h s t n gt or a c c m c t h c h ot n gl o i k h c n h a u c a c c c o n t a i n e r . Nh n gm k h n gc s g i nt i pt h m c c u n gc pb i c c v n gl p , g e n e r i c n e s s n ys k h n gt h t h c h i n c . l l d ot i s a ov n gl pl r t q u a nt r n g , h c h op h pb nv i t m m c c hc h u n g c l i nq u a n nc o n t a i n e r m k h n gb i t c ut r c c b nc a c o n t a i n e r . ( C h r n g , t r o n gC++ , v n gl pv c c t h u t t o nc h u n gc h u n gy uc um uc h c n n g l mv i c . ) B ns n h nt h yb n gc h n gv i un yt r o n gma i n( ) , k t k h i d r a wA l l ( ) h o t n gk h n gt h a y i v i t n g l o i k h c n h a uc a c c c o n t a i n e r . V t h mc h c nt h v h n , d r a wA l l ( ) c n gl mv i c v i c o nt r n uv c u i c a m n gs a r r a y. K h n n gn y i ut r c c m n gn h c o n t a i n e r c t c hh pv oc c t h i t k c a t i u c h u nC++T h v i n , c c c t h u t t o nt mk i mn h i un h d r a wA l l ( ) . V l pc o n t a i n e r m uh i mk h i c h us k t h a v u p c a s t i n gb nn h nt h yv i c c l ph c " b n ht h n g " , b ns g nn h k h n gb a og i n h nt h yoc h c n n gt r o n gl pc o n t a i n e r . C h a l pt i s d n g c t h c h i nv i c c m u , k h n gc t h a k .

T mt t

L pc o n t a i n e r l m t p h nt h i t y uc a l pt r n hh n g i t n g . H l m t c c hk h c ng i nh a v n c c c h i t i t c a m t c h n gt r n hv t n gt c q u t r n hp h t t r i nc h n gt r n h . Ng o i r a , h c u n gc pr t a n t o nv l i n hh o t b n gc c ht h a yt h c c m n gn g u y nt h yv k t h u t c ut r c d l i ut n g i t h t mt h y t r o n gC . B i v c c l pt r n hk h c hh n gc nc o n t a i n e r , n l i uc nt h i t m h c t h d d n gs d n g . yl n i m c c muc i nV i c c m uc p h p t i s d n gm n g u n( n h t r i n g c v i o b j e c t c o d e t i s d n g c c u n gc pb i t h a k v s n gt c ) t r n n t mt h n gc h on g i d n gm i l mq u e n . T r o n gt h c t , s d n g l i m v i c c m ul n gc h d d n gh nl t h a k v t h n hp h n . M c d b n h c c v v i c t oc o n t a i n e r v l pc c l ph c t r o n gc u ns c hn y , t r o n gt h c t n n h i uh n t h c h c c c t h n gc h a v v n gl pt r o n gCc h u n+T h v i n+ , v b nc t h mo n g i h s s ns n gv i t t c c c t r n hb i nd c h . Nh b ns t h yt r o n gt p2 c a c u ns c hn y( t i v t w w w . B r u c e E c k e l . c o m) , c c c o n t a i n e r v c c t h u t t o nt r o n gc c t i uc h u nC++T h v i ns h un h l u nl u n p n gn h uc uc a b n , d o b nk h n gc np h i t or a n h n gc i m i c h om n h . C c v n l i nq u a n nt h i t k c o n t a i n e r l p c c p nt r o n gc h n gn y , n h n gb nc t h t h u t h p c r n gh c t h t i nx a h nn a . M t t h v i nc h a l pp h c t pc t h b a og mt t c c c l o i v n k h c , b a og mc x l a l u n g , k i nt r v t h ug o mr c t h i .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

291/320

08/10/2013

Suy ngh trong C + +, Vol 1

B i t p
1. 2. 3. 4.

C c g i i p h p l ac h nc c b i t pc t h c t mt h yt r o n gc c t i l i u i nt C c t d u yt r o n gC++Hn gd nG i i p h pc h t h c h, s ns n gc h om t k h o np h n h t www. B r u c e E c k e l . c o m.

5. 6.

7. 8. 9. 10. 11. 12. 13.

15. 16. 17. 18. 19. 20. 21. 22.

23. 24. . 25

T h c h i np h nc pk t h a t r o n gOS h a p e s t r o n gc h n gn y . S a i c c k t q u c a B i t p1 t C h n g1 5 s d n gn g nx pv l pt r o n gT S t a c k 2 . ht h a yv m t l o t c c h n hd n gc o nt r . T h mh y h t h n gp h nc pl p , d o b nc t h t h yr n gh n hd n g i t n gb p h h yk h i n g nx p i r a k h i p h mv i . S a i T P S t a s h . h c c g i t r t h n gd c s d n gb i t n gl n( ) c t h c t h a y i t r o n gs u t c u c i c a m t i t n gc o n t a i n e r c b i t . S a i T P S t a s h . h c c g i t r t h n gd c s d n gb it h i p h n g( ) t n gt h a y i k c ht h c b n t h n g i ms l nn c np h i c g i . V d , m i l nn c g i l n c t h t n gg p i g i t r t h n g d s d n gt r o n gc c c u c g i t i pt h e o . T h h i nc h c n n gn yb n gc c hb oc ob t c k h i n om t t n gl n( ) c g i , v v i t m k i mt r a t r o n gc h n h( ) . T e mp l a t i z e c c f i b o n a c c i ( ) c h c n n gv ol o i g i t r m n t or a ( v v yn c t h s nx u t d i , p h a o, v v t h a yv c h i n t ) . S d n gc c t i uc h u nC++T h v i nv e c t o r n h l m t t h c c b n , t or a m t S e t l pm uc h pn h nc h m t t r o n gm i l o i i t n gm b n a v on . L mc h om t l n gn h a ul pl pc h t r " k t t h c S e n t i n e l " k h i n i mt r o n gc h n gn y . V i t m k i mt r a c h ob nT h i t l pt r o n gc h n h( ) , v s a u t h a y t h c c t i uc h u nC++T h v i nt ph pm u x c mi n hr n gh n hv i n yl c h n hx c . S a i A u t o C o u n t e r . h n c t h c s d n gn h m t i t n gt h n hv i nt r o n gb t k l ph c c s n g t ov p h h yb nmu nt h e od i . T h m m t c h u i t h n hv i n g i t nc a l p . K i mt r a c n gc n y t r o n gm t l ph c r i n gc a b n . T om t p h i nb nc a Own e r S t a c k . hm s d n gm t t i uc h u nC++T h v i nv e c t o r n h t h c h i nc b n c a n . B nc t h c np h i x e mx t m t s c c c h c n n gt h n hv i nc a v e c t o r l m i un y( h o c c h c nn h nv o< v e c t o r >t pt i nt i u ) . S a i V a l u e S t a c k . h n t n gm r n gk h i b np u s h( ) i t n gh nv n c h yr a k h i k h n gg i a n . T h a y i V a l u e S t a c k T e s t . c p p k i mt r a c c c h c n n gm i . L pl i b i t p9 n h n gs d n gm t t i uc h u nC++T h v i nv e c t o r n h v i c t h c h i nn i b c a V a l u e S t a c k. C h c c hd d n gh nn h i un yl . S a i V a l u e S t a c k T e s t . c p p n s d n gm t t i uc h u nC++T h v i nv e c t o r t h a yv m t n g nx p t r o n gma i n( ) . T h n gb oc c h n hv i c h yt h e ot h i g i a n : C c c v e c t o r t n gt or a m t l o t c c i t n gm c n hk h i n c t or a ? S a i T S t a c k 2 . h n s d n gm t t i uc h u nC++T h v i nv e c t o r n h t h c h i nc b nc a n . H y c h c c h nr n gb nk h n gt h a y i g i a od i n , T S t a c k 2 T e s t . c p ph o t n gk h n gt h a y i . L pl i b i t p1 2 s d n gm t t i uc h u nC++T h v i nn g nx pt h a yv m t v e c t o r ( b nc t h c np h i t mk i mt h n gt i nv c h n g, h o c i s nq u a < s t a c k >t pt i nt i u ) . 14. S a i T P S t a s h 2 . h n s d n gm t t i uc h u nC++T h v i nv e c t o r n h t h c h i nc b nc a n . H yc h c c h nr n gb n k h n gt h a y i g i a od i n , T P S t a s h 2 T e s t . c p ph o t n gk h n gt h a y i . T r o n gI t e r I n t S t a c k . c p p, s a i I n t S t a c k I t e r c h on m t k t t h c " t r n g i m" x yd n g , v t h mt o nt = =v i uh n h ! =. T r o n gma i n( ) , s d n gm t b i nl p d i c h u y nq u a c c y ut c a c c c o n t a i n e r c h o nk h i b n t nt r n g i mk t t h c . S d n gT S t a c k 2 . h, T P S t a s h 2 . h, v S h a p e . h, k h i t on g nx pv P S t a s hc o n t a i n e r c h oS h a p e * , i nh u c m t l o i n e ml n h n hd n gc o nt r , s a u s d n gv n gl p d i c h u y nq u a m i c o n t a i n e r v k ug i h a ( ) c h om i i t n g . T e mp l a t i z e c c I n t l pt r o n gT P S t a s h 2 T e s t . c p p n n mg i b t k l o i i t n g( c mt h yt d o t h a y i t nc a l pm t c i g t h c hh ph n ) . T e mp l a t i z e c c I n t A r r a yl pt r o n g I o s t r e a mOp e r a t o r Ov e r l o a d i n g . c pt C h n g1 2 , pt e mp l a t i z i n gc c c l o i i t n g c c h a v k c h t h c c a m n gn i b . B t Ob j C o n t a i n e r t r o n g Ne s t e d S ma r t P o i n t e r . c pt pC h n g1 2 v om t b nm u . T h n g h i mn v i h a i l pk h c n h a u . S a i C 1 5 : OS t a c k . hv C 1 5 : OS t a c k T e s t . c p pb i t e mp l a t i z i n gl pS t a c k n t n gn h nt h a k t l p c h a v t i t n g. V i c t or a n g nx pn nc h pn h nv c h s nx u t c o nt r c a k i ud l i u . L pl i b i t p2 0 s d n gv e c t o r t h a yv n g nx p. T h a k m t l pS t r i n g V e c t o r t v e c t o r < v o i d * >v x c n hl i p u s h _ b a c k( ) v n h i uh n h[ ] c h c n n g t h n hv i nc h pn h nv c h s nx u t c h u i * ( v t h c h i nv i c c t h c hh p ) . B yg i t or a m t k h u nm u m s t n gt om t l pc o n t a i n e r l m i ut n gt c h oc o nt r nb t k l o i . K t h u t n yt h n g c s d n g l mg i ms n gl nc o d e t q u n h i uc c b i uh i nm u . T r o n gT P S t a s h 2 . h, t h mv k i mt r a m t n h i uh n h P S t a s h: : i t e r a t o, t h e ol o g i c c a r +n h i uh n h. T r o n gDr a wi n g . c p p, t h mv t h n g h i m m t m uc h c n n gg i x a ( ) h mt h n hv i n . ( n n gc a o ) S a i c c n g nx pl pt r o n gT S t a c k 2 . hc h op h pg r a n u l a r i t y y q u y ns h u : T h m m t l c c h om i l i nk t c h r a l i ul i nk t s h uc c i t n gn t r t i , v h t r t h n gt i nn yt r o n gp u s h( ) c h c n n gv h mh y . B s u n gc h c n n gt h n hv i n c v t h a y i q u y ns h uc h om i l i nk t .
292/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

26.

( n n gc a o ) S a P o i n t e r T o Me mb e r Op e r a t o r . c ppt C h n g1 2 c c F u n c t i o n Ob j e c v t h n h >* c t e mp l a t i z e d l mv i c v i b t k k i ut r v ( i v i n h i uh n h >* , b ns p h i s d n gm ut h n h v i n, c mt t r o n gK h i l n g2 ) . T h mv k i mt r a h t r c h ok h n g , m t v h a i i s t r o n gC h h m t h n hv i n .

M c d n h i un g i t r o n gs n h n gv n n y c g i i t h i ut r o n gs u t c u ns c h , p h l c n yx u t h i n c u i n c t h c g i n hr n gt t c c c c h l t r c h i c n gb n g , v n ub nk h n gh i u i ug b nc t h t mn t r o n gp h nt h c hh p . T t c c c q u y t n hv p h o n gc c hm h a t r o n gc u ns c hn y c c t n hx e mx t v t h c h i n , i k h i t r o n gk h o n gt h i g i a nn m. T t n h i n , m i n g i uc l d oc a h t c h c m t h e oc c hh l m, v t i c h c g n g c h ob nb i t l mt h n ot i nt i v n h n gh nc h v y ut m i t r n g a t i nq u y t n h .

C h u n g

T r o n gc c v nb nc a c u ns c hn y , n hd a n h( c h c n n g , b i n , v t nl p ) c t h i t l pt r o n g m . H uh t c c t k h a c n gs c t h i t l pi n m, n g o i t r c h oc c t k h a c s d n gr t n h i um c c b o l d i n gc t h t r n nt n h t , c h n gh nn h " n gc p " v " o " . T i s d n gm t p h o n gc c hm h a c b i t i v i c c v d t r o n gc u ns c hn y . N c p h t t r i nt r o n g m t s n m, v c l yc mh n gm t p h nb i p h o n gc c hB j a r n e S t r o u s t r u pt r o n gm n hg c C++N g nn g [ 6 1 ] l p t r n h . C c c h c a p h o n gc c h n hd n gl t t c h og i c a c u c t r a n hl u nn n g , v v yt i s c h n i t i k h n gc g n g r a l n hp h o n gc c hc h n hx c t h n gq u a v d c a t i , t i c n gl c r i n gc a m n h s d n gp h o n gc c hm t i l m. B i v C++l m t n g nn g l pt r n hd n gt d o , b nc t h t i pt c s d n gb t c p h o n gc c hb nt h yt h o i m i . i u n i r n g , t i s l ur n g i uq u a nt r n gl p h i c m t p h o n gc c h n hd n gp h h pt r o n gm t d n . N ub nt mk i mt r nI n t e r n e t , b ns t mt h ym t s c n gc c t h c s d n g n hd n gl i t t c c c m t r o n gd nc a b n t c s n h t q u nn yc g i t r . C c c h n gt r n ht r o n gc u ns c hn yl c c t pt i n c t n gt r c ht v nb nc a c u ns c h , c h op h ph c k i mt r a mb or n gh l mv i c m t c c hc h n hx c . D o , c c t pt i nm i nt r o n gc u ns c ht t c n nl mv i c m k h n gc l i t h i g i a nb i nd c hk h i b i nd c hv i t h c h i n i u p h h pv i t i uc h u nC+ +( l ur n gk h n gp h i t t c c c t r n hb i nd c hh t r t t c c c t n hn n gn g nn g ) . C c l i m n ng yr a t h n gb ol i t h i g i a nb i nd c h c n h nx t r a v i l i n h nx t / / ! v v yh c t h d d n gp h t h i nv t h n g h i ms d n gp h n gt i nt n g . L i c p h t h i nv b oc oc h ot c g i s x u t h i n ut i nt r o n gp h i nb n i nt c a c u ns c h( t i w w w . B r u c e E c k e l . c o m) v s a u t r o n gb nc pn h t c a c u ns c h .

M t t r o n gn h n gt i uc h u nt r o n gc u ns c hn yl t t c c c c h n gt r n hs b i nd c hv l i nk t m k h n gc l i ( m c d h i k h i s g yr a c n hb o ) . k t t h c n y , m t s c h n gt r n h , t r o n g c h n gmi n hc h l m t v d mh av k h n g i d i nc h oc h n gt r n h c l p , s c s np h mn oc h n h( ) c h c n n g , n h t h n y
i n tm a i n( ){ }

i un yc h op h pc c m i l i nk t h o nt t m k h n gc l i . C c t i uc h u nc h oc h n h( ) l t r l i m t i n t , n h n gt i uc h u nC++n i r n gn uk h n gc t r l i t u y nb t r o n gma i n( ) , t r n hb i nd c hs t n gt or a m t r v 0 . T yc h nn y( k h n gt r l i t u y nb t r o n g c h n h( ) ) s c s d n gt r o n gc u ns c hn y( m t s t r n hb i nd c hv nc t h t or a c c c n hb oc h o i u n y , n h n gn h n gn g i k h n gp h h pv i t i uc h u nC++ ) .

T nt pt i n

T r o n gC , n c t r u y nt h n g t t nc h ot pt i nt i u ( b a og mt k h a i ) v i m t p h nm r n gc a . hv t h c h i nc c t pt i n( m n g u y nn h nl ut r c p h nb v m c t or a ) v i m t p h nm r n gc a . c . C
293/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

++ t r i q u a m t q u t r n ht i nh a . Nl n ut i n c p h t t r i nt r nU n i x , n i m c c h i uh n h n h nt h c c c h h o a v c h t r o n gt nt pt i n . C c t nt pt i nb a n uc h ng i nh o a c c p h i nb nc a c c p h nm r n gC : . Hv C . . i un yt t n h i nk h n gl mv i c c h oh i uh n hm k h n gp h nb i t c h h o a v c h t h n g , c h n gh nn h h i uh n hD OS . D OS C++ , c c n h c u n gc ps d n gp h nm r n gc a h x x v c x x c h oc c t pt i nt i u v c c t pt i nt h c h i n , t n g n g , h o c h p pv c p p. S a u , m t n g i n o t mr a r n gl d od u yn h t b nc nm t p h nm r n gk h c n h a uc h om t t pt i nq u t r n hb i nd c hc t h x c n hl i u b i nd c hn n h l m t Ch o c C++t pt i n . V t r n hb i nd c hk h n gb a og i b i ns o nt pt i nt i u t r c t i p , c h c p h nm r n gt pt i nt h c t h i c np h i c t h a y i . C c t yc h n h , t r nh un h t t c c c h t h n g , t r t h n hs d n gc p pc h oc c t pt i nt h c t h i v hc h oc c t pt i nt i u . L ur n gk h i b a og mc t i uc h u nC++t pt i nt i u , t yc h nk h n gc p h nm r n gt nt pt i n c s d n g , v d : #i n c l u d e .

B t uv k t t h ct h c o mme n t

M t v n r t q u a nt r n gv i c u ns c hn yl t t c c c m m b nn h nt h yt r o n gc u ns c hp h i c x c n h nl n g( c t n h t m t t r n hb i nd c h ) . N y c t h c h i nb n gc c ht n gg i i n nc c t pt i nt c u n s c h . t o i uk i nn y , t t c m m c n g h a l c b i nd c h( n h t r i n g c v i c c o nm , t r o n g c r t t ) c t h b n hl u n uv c u i . C c t h c s d n gb i c c c n gc m k h a i t h c E x t r a c t C o d e . c p p t r o n gt p2 c a c u ns c hn y( m b nc t h t mt h yt r nt r a n gwe bw w w . B r u c e E c k e l . c o m) k om i d a n h s c hm t r o n gp h i nb n n gb n gv nb nA S C I I c a c u ns c hn y. T h k t t h c n i my t c h c nn i v i E x t r a c t C o d e . c p pr n g l c u i d a n hs c h , n h n gc c t k h a b t u n i my t T i pt h e ol t h n gt i nv n h n gt h m c t pt i nt h u c v ( t h n g c t c h c b i c h n g , d o , m t t pt i nt h u c t r o n gC h n g8 s c m t t h c a C 0 8 ) , t h e os a ul m t d uh a i c h mv t nc a t pt i nt r o n gd a n h s c h . V E x t r a c t C o d e . c p pc n gt or a m t ma k e f i l e c h om i t h m c c o n , t h n gt i nv c c ht h c m t c h n gt r n h c t h c h i nv c c d n gl n h c s d n g k i mt r a n c n g c a v od a n hs c h . N um t c h n g t r n h c l p( n k h n gc np h i c l i nk t v i b t c i ug k h c ) n k h n gc t h n gt i nt h m. i un y c n g n gc h oc c t pt i nt i u . T u yn h i n , n un k h n gc m t c h n h( ) v c n g h a l c l i nk t v i m t c i g k h c , s a u n c m t { O} s a ut nt pt i n . N ub n gl i t k n y c h i ul c h n gt r n hc h n h n h n gc np h i c l i nk t v i c c t h n hp h nk h c , c m t d n gr i n gb i t b t uv i / / { L } v t i pt c v i t t c c c t pt i nm c n c k t n i ( k h n gc p h nm r n g , k t k h i n h n gn g i c t h k h c n h a ut n nt n g nn nt n g ) . B nc t h t mt h yv d t r o n gs u t c u ns c h . N um t t pt i nc n c t r c hx u t n h n gb t uv k t t h c c c t h k h n gn n c b a og mt r o n gc c t p t i nk h a i t h c ( v d , n u l m t t pt i nd l i ut h n g h i m) , s a u b t u t a gl n g a yl pt c t h e os a ul m t ' ! ' .

Ng o c , n i n gr n g , v t h t ud n g

B nc t h n h nt h yp h o n gc c h n hd n gt r o n gc u ns c hn yl k h c n h a ut n h i up h o n gc c hCt r u y n t h n g . T t n h i n , t t c m i n g i n g h r n gp h o n gc c hr i n gc a h l h pl n h t . T u yn h i n , p h o n gc c hs d n g yc m t l o g i c ng i n n gs a un , s c t r n hb y yt r nl nv i t n gv l d ot i s a o m t s c c p h o n gc c hk h c p h t t r i n .

P h o n gc c h n hd n g c t h c yb i m t i u : t r n hb y , c h a i t r o n gi n nv t r o n gc c c u c h i t h ot r c t i p . B nc t h c mt h yn h uc uc a b nl k h c n h a ub i v b nk h n gl mc h or t n h i ub i t h u y t t r n h . T u yn h i n , m l mv i c c c n h i uh nn c v i t , v v v yn p h i c d d n gc h on g i c c m n h n c . Ha i t i uc h q u a nt r n gn h t c a t i l " s c a n n a b i l i t y " ( c c hd d n gl c h on g i c h i u n g h a c a m t d n g n ) v s d n gc t h p h h pt r nm t t r a n g . S a un yn g h e c v b u nc i , n h n gk h i b n a n g a r a m t b i t h u y t t r n ht r c t i p , l r t m t t pt r u n gc h oc c i t n gn un g i t r n hb y p h i n g un h i nq u a l i g i a c c s l i d e , v m t v i d n gl n gp h c t h g yr a i un y . T t c m i n g i d n gn h n gr n gm b nt r o n gn i n gr n gn n c t h t v o . Nh n gg m i n g i k h n g n gv l n i c s k h n gt h n gn h t t r o n gh uh t c c k i u n hd n gl i un y : T r n gh pk h n gm n g o c i ? M t c uh i n y , t i n g h , l n h n gg g yr a s t h a y i n h v yt r o n gs c c k i um h a ( l i t k t t c c c k i um h a , t h yC++L pt r n hH n gd n , T o m Ma i v D a nS a k s , Ma i s n hn m1 9 9 1 . ) T i s c g n gt h u y t p h c b nr n gn h i up h o n gc c hm h a n g yn a y nt c c r n gb u c Ct r c t i uc h u n( t r c k h i n g u y nm u c h c n n g ) v d o k h n gt h c hh pb yg i . ut i n , c ut r l i c at i c h or n gc uh i q u a nt r n g : c c d un g o c mn nl u nl u n i t r nc n gm t d n gl " t i nt h n " ( d o t i c n g h al " b t c i ug c t h l v : m t l p , c h c n n g , x c n h i t n g , n ut u y nb , v v " ) . yl m t d u yn h t , n g u y nt c n h t q u nt i pd n gc h ot t c c c m t i v i t , v n l mc h o n hd n g n g i nh nn h i u . Nl mc h o" s c a n n a b i l i t y " d d n gh nk h i b nn h nv od n gn y : i n tf u n c( i n ta ) ;


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 294/320

08/10/2013

Suy ngh trong C + +, Vol 1

B nc b i t , b i d uc h mp h yc u i d n g , r n g yl m t t u y nb v n i x a h n , n h n gk h i b nn h nt h y d n g : i n tf u n c( i n ta ){ b nn g a yl pt c b i t l m t n hn g h a b i v n h n gd n gk t t h c v i m t d un g o c m , k h n gm t d uc h m p h y . B n gc c hs d n gp h n gp h pn y , k h n gc s k h c b i t t r o n gn i t d um n g o c c h om t n hn g h a n h i u n g :
i n tf u n c( i n ta ){ i n tb=a+1 ; t r l ib*2 ; }

v c h om t n hn g h a m t d n gt h n g c s d n gc h oi n l i n e s : i n tf u n c( i n ta ){ r e t u r n( a+1 )*2 ; } T n gt n h v y , c h om t l ph c :
l pT h i n g ;

l m t t u y nb t nl p , v l pT h i n g{ l m t n hn g h a l p . B nc t h c h ob i t b n gc c hn h nv od n gd u yn h t t r o n gt t c c c t r n gh pc h od l m t t u y nb h o c n hn g h a . V t t n h i n , t m n g o c t r nc n gm t d n g , t h a yv m t d n gc a c h n hn , c h o p h pb n p h h pv i n h i ud n gt r nm t t r a n g . V v y , t i s a oc h n gt a c r t n h i up h o n gc c hk h c ? c b i t , b ns n h nt h yr n gh uh t m i n g i t or a c c l ph c t h e op h o n gc c ht r n ( M S t r o u s t r u ps d n gt r o n gt t c c c p h i nb nc a c u ns c hc a n gC++N g nn g l p t r n h t A d d i s o n We s l e y ) n h n gt or a n hn g h a c h c n n gb n gc c hm n g o c t r nm t d n gc a c h n hn ( m c n gs a n hr a n h i u p h o n gc c ht h t ud n gk h c n h a u ) . S t r o u s t r u pt h c h i n i un y , n g o i t r c h c n n gn i t u y nn g n . V i c c h t i pc nt i mt y , t t c m i t h l p h h pb nt nn l g ( l p, c h c n n g , e n u m, v v ) v t r nc n gm t d n gb n t d un g o c m c h ob i t r n gc t h c h o i un yl v l mt h e o . Ng o i r a , c c d un g o c m l n h n h a uc h oi n l i n e s n g nv n hn g h a c h c n n gb n ht h n g . T i k h n g n hr n gp h o n gc c hc a n hn g h a c h c n n g c s d n gb i n h i uf o l k s nt t r c c h c n n gt o m uC , t r o n g b n k h n gk h a i b oc c i s b nt r o n gd un g o c n , n h n gt h a yv g i a n g o c n gv m x o nc p( i un yc h ot h yl pr pCn g nn g g c ) :
k h o n gt r n gt h a n h( ) { /*C t h y*/ } i n tx ; f l o a ty ;

y , n s l k h v d u y n t d un g o c m t r nc n gm t d n g , v v yk h n ga i l mn . T u yn h i n , h a r a q u y t n hk h c n h a uv v i c l i uc c n i n gr n gn n c t h t v ov i c t h c a m h o c l i uh c n n c c p c a c c " t i nc h t . " V v y , c h n gt i c n h i uk i u n hd n gk h c n h a u . C n h n gl pl u nk h c c h ov i c t n pl n n gn g a ys a uk h i t u y nb ( c a m t l p , c ut r c , c h c n n g , v v ) . S a u y nt m t n g i c , v c t r n hb y y b nb i t n h n gg c c v n n yl : K i n hn g h i m' v i ' ( v i m) n g i d n gb i t r n gc c h n hm y' ] ' h a i l ns a n g i s d n g ns x u t h i nt i p t h e oc a ' { ' ( h a y^L ) t r o n gc t 0 . T n hn n gn yr t h u c ht r o n gv i c i uh n gm ( n h y nc h c n n gt i p t h e oh o c n hn g h a l p ) . [ B n hl u nc a t i : k h i t i b c ul mv i c t r nU n i x , G NUE ma c s c h x u t h i nv t i t r t h n hv n gm c t r o n g . K t q u l , ' v i ' c h a b a og i c n g h a v i t i , v d o t i k h n gs u yn g h v " c t 0 v t r . " T u yn h i n , c m t i n g c n gb n gc a n g i s d n g' v i ' t r nm n g , v h b n hh n gb i i un yv n . ] t ' { ' t r nd n gt i pt h e ol o i b m t s m k h h i ut r o n g i uk i np h c t p , g i p t r o n gc c s c a n n a b i l i t y . V d :
i f( c o n d 1 & &c o n d 2 & &c o n d 3 ){ t u y nb ; }

T r n[ k h n g n hn g i c ] c s c a n n a b i l i t yn g h o . T u yn h i n ,
i f( c o n d 1& &c o n d 2 & &C o n d 3 ){ t u y nb ; }

p h v l n' n u ' k h i c t h , d n nk h n n g c t t h n . [ k i n c a b nv v i c n yl n gs t h t s k h c n h a ut yt h u c v on h n gg b n a n gs d n g . ] C u i c n g , n d d n gh n s px pt r c q u a nn i n gr n gk h i c h n g c l i nk t t r o n gc n gm t c t . H t r c q u a n" d n hr a " t t h nn h i u . [ K t t h c n g i c b n hl u n ]


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 295/320

08/10/2013

Suy ngh trong C + +, Vol 1

V n n i t c c m x o nc pc l l v n n g h c hn h t . T i h c c q u t c h a i h n ht h c , v c u i c n gn i x u n g nn h n gg b n p h t t r i nt h o i m i . T u yn h i n , t i l ur n gJ a v a t i uc h u nc h n ht h c m h a ( t mt h yt r n T r a n gwe bJ a v a c a S u n ) l c h i uq u t n gt n h m t t r o n gn h n gt i c m t yk t f o l k s h n a n gb t u c h n gt r n ht r o n gc h a i n g nn g , s t h n gn h t g i a c c k i um h a c t h h u c h . C c ht i pc nt i s d n gl o i b t t c c c t r n gh pn g o i l v t r n gh p c b i t , v h pl t or a m t p h o n g c c hd u yn h t c a t h t ud n gl t t . Ng a yc t r o n gm t c q u a nc h c n n g , s t h n gn h t t c h c , n h t r o n g :
f o r( i n ti=0 ;i< 1 0 0 ;i++ ){ < <e n d l ; } c o u t< <i< <e n d l ; c o u t< <x*i

P h o n gc c hr t d d n g g i n gd yv n h b ns d n gd u yn h t , n g u y nt c p h h pc h ot t c c c n hd n gc a b n , k h n gm t c h oc c l ph c , h a i c h oc c c h c n n g( i n l i n e s m t d n gs ov i n h i ud n g ) , v c t h n h n gn g i k h c c h ov n g , n ub oc o , v vn h t q u nm t m n h , t i n g h r n g , l mc h on n gx e mx t . T r nt t c , C++l m t n g nn g m i h ns ov i C , v m c d c h n gt a p h i l mn h i un h n gb C , c h n gt a k h n gn nma n gq u n h i u t ot c v i c h n gt i g yr a v n t r o n gt n gl a i . V n n h n h nv i n h i ud n gm t r t h n hv n l n . k i mt r a k l n gc a i t n g , m c d t r o n gC , x e mK i u : T i uc h u nv h n g d n, D a v i dS t r a k e r ( P r e n t i c e Ha l l , 1 9 9 2 ) . C c h nc h k h c t i p h i l mv i c d i l c h i ur n g n g , k t k h i c u ns c hc m t g i i h n5 0 k t . Nh n gg s x yr a k h i m t c i g l q u d i p h h pt r nm t d n g ? V n g , m t l nn a t i c g n g c m t c h n hs c h p h h pc h oc c hd n g c c h i a , h c t h d d n gx e m. Mi nl m t c i g l m t p h nc a m t n hn g h a d u yn h t , d a n hs c h i s , v v , d n gt i pt c n n c t h t v om t m c t r o n gt u n hn g h a , d a n hs c h i s v v

T n n hd a n h

Nh n gn g i q u e nt h u c v i J a v a t h s n h nt h yr n gt i c h u y ns a n gs d n gc c p h o n gc c hJ a v a t i u c h u nc h ot t c c c t n n hd a n h . T u yn h i n , t i k h n gt h h o nt o np h h p yb i v c c n hd n gt i u c h u nCv C++ , t h v i nk h n gt h e op h o n gc c hn y .

P h o n gc c hk h ng i n . C c c h c i ut i nc am t n hd a n h c c h n hv nn u l m t l ph c . N u n l m t c h c n n gh o c b i n , s a u c c c h c i ut i nl c h t h n g . P h nc nl i c ab n h nd i nb a og m m t h o c n h i ut , c h yl i v i n h a un h n gp h nb i t b n gc c ht nd n gm i t . V v y , m t l pt r n gn h t h n y : l pF r e n c h V a n i l l a :c n gI c e C r e a m{ m t n hd a n h i t n gn h s a u :
F r e n c h V a n i l l am y I c e C r e a m C o n e( 3 ) ;

v m t c h c n n gn h s a u : k h o n gt r n ge a t I c e C r e a m C o n e( ) ; ( Ho c l m t c h c n n gt h n hv i nh o c m t c h c n n gt h n gx u y n ) . C m t n g o i l l h n gs t h i g i a nb i nd c h( c o n s t h o c #x c n h) , t r o n g t t c c c k t t r o n g n hd a n h l c h h o a . G i t r c a p h o n gc c hl v nc n g h a b nc t h n h nt h yt c c c h c i ut i nc h od b n a n gn i v m t l ph c h o c m t i t n g/p h n gp h p . i un y c b i t h u c hk h i t n ht h n hv i nl p c t r u y c p . T i u c t r o n g n t h n gt " c t h n h t c h u n gn h t . " l , b t k t pt i nt i u t r o n gt h m c a p h n gb a og m ut i n , s a u b t k c a r i n gt i " c n gc " t i u , c h n gh nn h r e q u i r e . h, s a u b t k t h b a t i u t h v i nc a b n , s a u c c t i uc h u nC++ , t i u t h v i n , v c u i c n gl t i u t h v i nC . S b i nmi n hc h o i un yx u t p h t t J o h nL a k o s t r o n gq u y m l nC++T h i t k p h nm m( A d d i s o n We s l e y , 1 9 9 6 ) : L i s d n g t i mnc t h t r n h c b n g c c h mb o r n g h t p t i nc a m t t h n h p h np h nt c h c a c h n h n . M k h n g c nk h a i b o b nn g o i , c u n g c p h o c c c n h n g h a . . . B a o g mc c c t p t i nh . N h d n g ut i nc a t p t i nc . mb o r n g k h n g c t h n h p h nq u a nt r n g c a t h n g t i nn i t i g i a o d i nv t l c a c c t h n h p h n l m t t c h t c c t p t i nh . ( H o c , n uc , b ns t mh i uv n n g a y k h i b nc g n g b i nd c h c c t p t i nc . ) . N ut h t b a og mt i u i " t c t h n h t c h u n gn h t " , s a u n c n h i uk h n n gn ut i u c a b n k h n gp h nt c hc a c h n hn , b ns t mh i uv n s mh nv n g nn g a p h i nt o i x u n g n g .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 296/320

T h t b a og mt i u

08/10/2013

Suy ngh trong C + +, Vol 1

B a og mb ov t r nc ct pt i nt i u

B a o g mb o v l u n c s d n gt r o n gt pt i nt i u n g nc h nn h i ub a og m m t t pt i nt i u t r o n g v i c b i ns o nm t nc p p . t pt i n . B a og mb ov c t h c h i nb n gc c hs d n gt i nx l #x c n hv k i mt r a t h yr n gm t t n c h a c x c n h . T n c s d n g b ov d a t r nt nc a c c t pt i n t i u , v i t t c c c c h c i c a t nt pt i nc h h o a v t h a yt h ' . ' v i d ug c hd i . V d :

//I n c l u d e G u a r d . h #I f n d e fI N C L U D E G U A R D _ H #X c n hI N C L U D E G U A R D _ H //B o d yc at pt i nt i u y. . . #E n d i f//I N C L U D E G U A R D _ H

n hd a n ht r nd n gc u i c n g c b a og mc h or r n g . M c d m t s p r e p r o c e s s o r s b q u a b t k k t s a uk h i m t #e n d i f , k h n gp h i l h n hv i t i uc h u nv d o , n h nd n gl n h nx t .

S d n gk h n gg i a nt n

T r o n gt pt i nt i u , b t k " n h i m" c a k h n gg i a nt nt r o n g t i u c b a og mp h i c nt r n gt r n h . C n g h a l , n ub nt h a y i t nmi nk h n gg i a nb nn g o i c a m t h mh o c l ph c , b ns g yr a s t h a y i x yr a c h ob t k t pt i nb a og mt i u c a b n , d n nt t c c c l o i v n . K h n gs d n gt k h a i c a b t c l o i n o c p h pb nn g o i c c n hn g h a c h c n n g , v k h n gt o nc us d n gc h c c h o p h pt r o n gt pt i nt i u . T r o n gc p pf i l e , b t k t o nc us d n gc h t h s c h n h h n g nt pt i n , v n h v yt r o n gc u ns c hn y h t h n g c s d n g s nx u t ma e a s i l y r e a d a b l e h n , c b i t l t r o n gc c c h n gt r n hn h .

S d n gc cy uc u( )v mb o( )

C c y uc u( ) v m b o( ) c h c n n gx c n ht r o n gr e q u i r e . h c s d n gt h n gn h t t r o n gh uh t c c c u ns c h , h n gc c hc t h b oc ov n . N ub n q u e nt h u c v i c c k h i n i mv i uk i nt i nq u y t v h u( c g i i t h i ub i B e r t r a n dMe y e r ) , b ns n h nr a r n gv i c s d n gc c y uc u( ) v m b o( ) n h i uh nh o c t h nc u n gc p i uk i nt i nq u y t ( t h n g ) v h u( t h n ht h o n g ) . V v y , k h i b t um t c h c n n g , t r c k h i b t k " c t l i " c a c c c h c n n g c t h c t h i , i uk i nt i nq u y t c k i m t r a c h c c h nr n gt t c m i t h l n gv r n gt t c c c i uk i nc nt h i t l c h n hx c . S a u l " c t l i " c a c c c h c n n g c t h c t h i , v i k h i m t s h u c k i mt r a mb or n gt r n gt h i m i c a d l i u t r o n gc c t h n gs x c n h . B ns n h nt h yr n gv i c k i mt r a h ul r t h i mt r o n gc u ns c hn y , v m b o( ) c s d n gc h y u mb or n gc c t pt i n m t h n hc n g .

c n gt n h n gh i ub i t c a b nb t r o n g c D a nS a k s ( n gt c g i v i T o m Ma i c a C++L p t r n h h n g d n, t h h a i Ma i Ha l l , 1 9 9 1 ) , S c o t t Me y e r s ( t c g i c a h i uq u C++, 2 p h i nb n , A d d i s o n We s l e y , 1 9 9 8 ) , v R o bMu r r a y ( t c g i c a C++C h i nl c v c h i nt h u t , A d d i s o n We s l e y , 1 9 9 3 ) . Ng o i r a , n h i ul i k h u y n c t n gh pt c c t r a n gc a t d u y t r o n g C++. 1. ut i nl mc h on l mv i c , s a u l mc h on n h a n h . i un y n gn g a yc k h i b nc h c c h nr n gm t o nm t h c s q u a nt r n gv n s l m t n t c c h a i c h n ht r o n gh t h n gc a b n . K h n gl m i u . C c h t h n g i ut i nv i m t t h i t k ng i nc n gt t . S a u n un l s k h n g n h a n h , c uh n hn . B ns g nn h l u nl u nk h mp h r a r n gn t c c h a i " c a b n " k h n gp h i l v n . T i t k i mt h i g i a nc a b nc h on h n gt h t h c s q u a nt r n g . E l e g a n c e l u nl u nt r t i n i . Nk h n gp h i l m t s t h e o u i p h p h i m. Nk h n gc h c u n gc pc h ob n m t c h n gt r n hd d n gh n x yd n gv g l i , n h n gn c n gd d n gh n h i uv d u yt r , v l n i m c c g i t r t i c h n hn m. T h i i mn yc t h m t m t s k i n hn g h i m t i n , b i v n c t h c v r n gt r o n gk h i b n a n gt h c h i nm t o nm t h a n hl c h , b ns k h n g c s nx u t . N n gs u t nk h i m l i nm c ht c hh pv oh t h n gc a b n , v t h mc h n h i uh nn h v yk h i m h o c h t h n g c s a i . H yn h " c h i a t r " n g u y nt c . N uv n b n a n gt mk i ml q u k h h i u , h yt h t n gt n gn h n gg c c h o t n gc b nc a c h n gt r n hs c , c h os t nt i c a m t " m n h " ma t h u t x l c c p h nc n g . R n g" m n h " l m t i t n gv i t m c s d n gc c i t n g , s a u n h nv o i t n gv n gg i c a p h nc n gt h n hc c i t n gk h c , v v
297/320

2.

3.

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

4.

n gt n gg h i l i t t c c c m Ch i nt i c a b nt r o n gC++ , t r k h i b nc nt h a y i n gk c h c n n gc a n ( c n g h a l , k h n gs a c h a n n un k h n gb h n g ) . b i nd c h Ct r o n gC++l m t h o t n gc g i t r b i v n c t h t i t l l i n . T u yn h i n , d n gm Cm h o t n gt t v v i t l i n t r o n gC++k h n gc t h s d n gt t n h t t h i g i a nc a b n , t r k h i C++p h i nb ns c u n gc pr t n h i uc h i t i s d n gn h m t l ph c . N ub nc m t c t h l nc c m Cc nt h a y i , ut i nc l pc c p h nc a m s k h n g c s a i , c t h g i c c c h c n n gt r o n gm t " l pA P I " n h h mt h n hv i nt n h . S a u t pt r u n gv oc c m m s c t h a y i , s px pv oc c l ph c t o i uk i nd d n gt h a y i n h t i nb ot r c a b n . R i n gt c g i l pt n g i s d n gl p( l p t r n h v i nk h c h h n g ) . Ng i s d n gl pl " k h c hh n g " v k h n g c nh o c mu nb i t n h n gg a n gx yr a n gs a uh ut r n gc a l p . Ng i t or a l pp h i c c c c h u y n g i a t r o n gt h i t k l ph c v v i t c c l ph c n c t h c s d n gb i c c l pt r n hv i nm i n h t c t h , n h n gv nh o t n gm n hm t r o n gc c n gd n g . S d n gt h v i ns d d n gc h k h i n mi n hb c h . K h i b nt or a m t l ph c , l mc h ot nc a b nc n gr r n gc n gt t . M c t i uc a b nn n c l mc h o g i a od i nl pt r n hc a k h c hh n gk h i n i m ng i n . C g n g l mc h ot nc a b n r r n gr n gk i n l k h n gc nt h i t . k t t h c n y , s d n gc h c n n gq u t i v i s m c n h t or a m t t r c q u a n , d s d n gg i a od i n . K i ms o t t r u yc pc h op h pb n( t c g i l p ) t h a y i c n gn h i uc n gt t t r o n gt n gl a i m k h n gc m s k h c hh n gl mh h i t r o n g c c l p c s d n g . T r o n g n hs n gn y , g i t t c m i t h n h t i nc n g t t , v l mc h oc h c g i a od i nl pc n gc h n g, l u nl u ns d n gc c c h c n n gc h k h n gp h i l d l i u . L mc h od l i uc n gc n gk h i b u c . N un g i s d n gl pk h n gc np h i t r u yc pv om t c h c n n g , l m c h on t i n. N um t p h nc a l ph c c a b np h i c t i px c v i n h n gn g i t h a k n h b ov , c u n g c pm t g i a od i nc h c n n gc h k h n gp h i t i px c v i c c d l i ut h c t . B n gc c hn y , n h n gt h a y i t h c h i ns c t c n gt i t h i ut r nl pd nx u t . n gr i v ot l i t p h nt c h . C m t s i um b nk h n gh c c h o nk h i b nb t uv i t m v n h n c m t s l o i h t h n gl mv i c . C++ c x yd n gt r o n gt n gl a , h y h l mv i c c h ob n . S a i l mc a b nt r o n gm t l ph c h a ym t t ph pc c l ph c s k h n gp h h yt n ht o nv nc a t o nb h t h n g .

5.

6.

7.

8.

9.

10. p h nt c hv t h i t k c a b np h i s nx u t , m c t i t h i u , c c l ph c t r o n gh t h n gc a b n , g i a od i nc n g c n gc a h , v m i q u a nh c a h nc c l ph c k h c , c b i t l l pc s . N up h n gp h pt h i t k c a b ns nx u t n h i uh nt h , h yt h i n ut t c c c m n h c s nx u t b n gp h n gp h pc g i t r t r o n g s u t c u c i c a c h n gt r n h . N uh k h n gl m, d u yt r h s c h i p h b n . C c t h n hv i nc a n h mp h t t r i nc x uh n gk h n gd u yt r b t c i ug m k h n gg pp h nv on n gs u t c a h , i un yl m t t h c t c a c u c s n gm n h i up h n gp h pt h i t k k h n gc h i m. 11. V i t m t h n g h i m ut i n( t r c k h i b nv i t c c l p ) , v g i n v i c l p . T n gh a c c h o t n gc a c c b i k i mt r a c a b nt h n gq u a m t ma k e f i l e h o c c n gc t n gt . B n gc c hn y , b t k t h a y i c t h c t n gx c n h nb n gc c hc h ym t h n g h i m, v b ns n g a yl pt c p h t h i nr a l i . B i v b nb i t r n gb nc m n gl i a nt o nc a k h u n gt h n g h i mc a b n , b ns m n hd nh nv v i c t h a y i s ur n g k h i b np h t h i nr a n h uc u . H yn h r n gn h n gc i t i nl nn h t t r o n gn g nn g nt c x yd n gt r o n g k i mt r a k i uk i mt r a , x l n g o i l , v v , c u n gc p , n h n gc c t n hn n g a b nc h c c h o nn a y . B np h i i p h nc nl i c a n gt r o n gv i c t or a m t h t h n gm n hm b n gc c h i nv oc c b i k i mt r a x c mi n ht n hn n gc t h nl ph o c c h n gt r n hc a b n . 12. V i t m t h n g h i m ut i n( t r c k h i b nv i t c c l p ) x c mi n hr n gt h i t k l ph c c a b nh o nt t . N u b nk h n gt h v i t m k i mt r a , b nk h n gb i t n h n gg l ph c c a b nn h t h n o . Ng o i r a , c c h n h n g c a v i c v i t m k i mt r a s t h n gt u nr a t n hn n gb s u n gh o c h nc h m b nc nt r o n gl pc c t n hn n gh o c h nc h k h n gl u nl u nx u t h i nt r o n gq u t r n hp h nt c hv t h i t k . [ 6 2 ] 13. H yn h m t n g u y nt c c b nc a c n gn g h p h nm m : T t c c c v n t h i t k p h nm mc t h c ng i nh a b n g c c h g i i t h i um t c p t h mv m n h k h i n i m . m t t n gn yl c s t r ut n g , t n hn n g c h n hc a l pt r n hh n g i t n g . 14. H yh c n h n g u y nt c n gt t , l , c u n gc pc h om i l pm t d u yn h t , m c c hr r n g . N ul ph c c a b nh o c t h i t k h t h n gc a b nt r n nq u p h c t p , p h v l pp h c t pt h n hn h n gc i ng i n . C h s r r n gn h t c a i un yl k c ht h c t u y t i : n um t l ph c l l n , r t c t h l n l mq u n h i uv n n c c h i a . 15. X e mc h oc c n hn g h a c h c n n gl ut h n hv i n . M t c h c n n gm l l ud i v p h c t pl k h k h nv t n k m d u yt r , v c l l c g n gl mq u n h i ut t c c a c h n hn . N ub nt h ym t c h c n n gn h v y , n c h r a r n g , t n h t , n p h i c c h i a t h n hn h i uc h c n n g . Nc n gc t h n g h v i c t or a m t l pm i . 16. X e mc h od a n hs c h i s d i . C h c n n gc u c g i s a u t r n nk h k h n v i t , c v d u yt r . T h a yv o , c g n gd i c h u y nc h c n n gt h n hv i nc h om t l o i m n c ( t h m) t h c hh p , v /h o c t h n gq u a c c i t n gt r o n gn h c c i s .


file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 298/320

08/10/2013

Suy ngh trong C + +, Vol 1

17. n gl pl i c h n hm n h . N um t o nm l n hk t r o n gn h i uc h c n n gt r o n gc c l pt h a k , t m v om t c h c n n gd u yn h t t r o n gl pc s v g i n l t c c c h c n n gc n g u ng c t n gc p . K h n gc h l mb nt i t k i mk h n gg i a nm , b nc u n gc pc h oc n gt c t u y nt r u y nd d n gt h a y i . B nc t h s d n gm t h mn i t u y nc h oh i uq u . i k h i v i c p h t h i nr a m t h n gt h n gn ys b s u n gt h mc h c n n gc g i t r c h og i a od i nc a b n . 18. X e mc h oc h u y n i b oc oh o c x c hi f e l s e k h o n . i un yt h n gl m t c h s v k i uk i mt r a m h a , c n g h a l b n a n gl a c h nn h n gm t h c h i nd a t r nm t s l o i l o i t h n gt i n( l o i c h n hx c c t h k h n g c r r n gl c ut i n ) . B nt h n gc t h t h a yt h l o i m v i t h a k v a h n h , m t c u c g i c h c n n g a h n hs t h c h i nv i c k i mt r a k i uc h ob n , v c h op h p n gt i nc yh nv d d n gh nm r n g . 19. T m t q u a n i mt h i t k , t mk i mv n h n gt h r i n gb i t m t h a y i t n h n g i um l i n h v y . l , t mk i mc c y ut t r o n gm t h t h n gm b nc t h mu nt h a y i m k h n gb u c m t t h i t k l i , s a u n gg i c c y ut t r o n gc c l ph c . B nc t h t mh i ut h m n gk v k h i n i mn yt r o n gc c m u t h i t k c h n gt r o n gt p2 c a c u ns c hn y , c s nt i w w w . B r u c e E c k e l . c o m. 20. X e mr a c h o n g . Ha i i t n gn g n g h a k h c n h a uc t h c n h n gh n h n gg i n gh t n h a u , h o c t r c h n h i m, v c m t s c md t n h i n c g n gl mc h om t m t l pc o nc a n g i k h c c h c h n gl i t t h a k . i un y c g i l k h n g n g , n h n gk h n gc b i nmi n ht h c t b u c m t m i q u a nh c h a /l pc o nm n k h n gt nt i . M t g i i p h pt t h nl t or a m t l pc s c h u n gl t or a m t g i a od i nc h o c l pn h c n g u ng c n i h i n h i uk h n gg i a nh nm t c h t , n h n gb nv n c h n gl i t t h a k v c t h s t h c h i nm t k h mp h q u a nt r n gv t h i t k . 21. X e mr a c h oh nc h t r o n gq u t r n ht h a k . C c m ut h i t k r r n gt h mc c k h n n gm i c h on h n gn g i t h a k . M t t h i t k n gn g l o i b k h n n gc t r o n gq u t r n ht h a k m k h n gc nt h mn h n gc i m i . Nh n gq u y n hn y c t h c h i n b p h v , v n ub n a n gl mv i c t m t t h v i nl ph c c , n c t h c h i uq u h n h nc h m t l ph c h i nc t r o n gp h nl pc a n h nn s c c c ul i h t h n g p h nc pn nl pm i c a b np h h pv i v t r c a n t r o n g , t r nl pc . 22. n gm r n gc h c n n gc b nc a l pc o n . N um t p h nt g i a od i nl i uc nt h i t c h om t l pn p h i t r o n gl pc s , k h n g c t h mv ot r o n gn g u ng c . N ub n a n gt h mc h c n n gt h n hv i nb n gc c h k t h a , c l b nn ns u yn g h l i v t h i t k . 23. t l n h i uh n . B t uv i m t g i a od i nt i t h i u m t l ph c , n h l n h v ng i nn h b nc np h i g i i q u y t v n b nt a y , n h n gk h n gc g n g d o nt t c c c c c hm l ph c c a b nc t h c s d n g . Nh c c l p c s d n g , b ns k h mp h c c hb np h i m r n gg i a od i n . T u yn h i n , m t k h i m t l p c s d n gb nk h n gt h t h un h g i a od i nm k h n gc m s k h c hh n gl on g i . N ub nc nt h m n h i uc h c n n gh n , l t t , n s k h n gl mp h i nm , t r b u c r e c o mp i l e s . Nh n gn g a yc k h i c h c n n g t h n hv i nm i t h a yt h c c c h c n n gc a c i c , l i g i a od i nh i nt i m t m n h( b nc t h k t h pc c c h c n n gt r o n gv i c t h c h i nc b nn ub nmu n ) . N ub nc np h i m r n gg i a od i nc a m t c h c n n g h i nc b n gc c ht h mt h a ms h n , l i c c i s h i nc h i nt i c a h , v t g i t r m c n ht r nt t c c c i s m i , t h e oc c hn yb ns k h n gl mp h i nb t k c u c g i h i nc c h c n n g . 24. c l ph c c a b nl nt i n g c h c c h nr n gc h n gh pl , c p nm i q u a nh g i a m t l pc s v l p d nx u t n h " i s a " v c c i t n gt h n hv i nl " c m t . " 25. K h i q u y t n h g i a d i s n v t h n h p h n , y u c u , n u b n c n p h i n e ml n k i u c s . N uk h n g , t h c h t h n hp h n( i t n gt h n hv i n ) t h a k . i un yc t h l o i b s c nt h i t p h i n h nt h c c h o a k t h a . N u b n t h a k , n g i d n g s n g h r n g h c n g h a v p h i n e ml n . 26. i k h i b nc np h i k t h a t r u yc pb ov c c t h n hv i nc a l pc s . i un yc t h d n nm t n h u c un h nt h c c h o a k t h a . N u b n k h n g c n p h i n e ml n , u t i n x u t m t l p m i t h c h i n c c t r u yc p c b ov . S a u l mc h or n gl pm i m t i t n gt h n hv i nt r o n gb t k l ph c m c np h i s d n gn , c h k h n gp h i k t h a . 27. T h n gt h n g , m t l pc s s c s d n gc h y u t or a m t g i a od i n nc c l ph c b t n g u nt n . V v y , k h i b nt or a m t l pc s , m c n h t h c h i nc c c h c n n gt h n hv i n ot i n hk h i t . D e s t r u c t o r c n gc t h l ot i n hk h i t ( b u c n g i t h a k g h i l nn m t c c hr r n g ) , n h n gn h c u n gc p c h oh ym t c q u a nc h c n n g , b i v t t c c c h mh yt r o n gm t h t h n gp h nc pl u nl u n c g i . 28. K h i b n t m t oc h c n n gt r o n gm t l ph c , l mc h ot t c c c c h c n n gt r o n g l ph c o, v t t r o n g m t oh y . C c ht i pc nn yn g nc nb t n g t r o n gh n hv i c a g i a od i n . C h b t ul o i b c c ot k h a k h i b n a n g i uc h n hc h oh i uq u v h s c a b n c h b nt h e oh n gn y . 29. S d n gc c t h n hv i nd l i uc h os t h a y i t r o n gg i t r v oc h c n n gc h os t h a y i t r o n gh n hv i . C n g h a l , n ub nt mt h ym t l pc s d n gb i nt r n gt h i c n gv i c c c h c n n gt h n hv i nr n gh n hv i c h u y n i d a t r nc c b i n , c t h b nn nt h i t k l i n t h h i ns k h c b i t t r o n gh n hv i t r o n gl pc o n v g h i oc h c n n g .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 299/320

08/10/2013

Suy ngh trong C + +, Vol 1

30. N ub np h i l m i ug n o n p o r t a b l e , l mc h om t t r ut n gc h od c hv v a p h n gh a n t r o n g m t l p . yl c p t h mv m n hn g nc nk h n gd i n gt c p h np h i t r o n gs u t c h n gt r n hc a b n . 31. T r n h a k t h a . l c c h a b nr a k h i t n hh u n gx u , c b i t l s a c h a g i a od i nl p , t r o n g b n k h n gc q u y nk i ms o t c a l pb h n g( x e mT p2 ) . B np h i l m t l pt r n hv i nc k i n hn g h i mt r c k h i t h i t k a k t h a v oh t h n gc a b n . 32. K h n gs d n gt i nt h a k . M c d l t r o n gn g nn g v d n gn h c c h c n n gt h n gx u y n , n g i i t h i uk h n gr r n gc n g h a k h i k t h pv i t h i g i a nc h yx c n hl o i . T om t i t n gt h n hv i nt n h nt h a yv s d n gt h a k t n h n . 33. N uh a i l p c l i nk t v i n h a ut r o n gm t s c c hc h c n n g( n h c o n t a i n e r v v n gl p ) , c g n gl mc h o m t m t c n gl n gn h a ub nl pk h c , n h c c t i uc h u nC++T h v i nh i nv i v n gl pb nt r o n g c o n t a i n e r ( v d c a i un yl t h h i nt r o n gp h ns a uc a c h n g1 6 ) . i un yk h n gc h n h nm n h ns l i nk t g i a c c l p , n h n gn c h op h pt nl p c t i s d n gb n gc c hl mt n b nt r o n gm t l p k h c . T i uc h u nC++T h v i nt h c h i n i un yb n gc c h n hn g h a m t l n gn h a ul pl pt r o n gm i l p c o n t a i n e r , q u a c u n gc pc c c o n t a i n e r v i m t g i a od i nc h u n g . L d ok h c m b ns mu nl mt m t l p l n h m t p h nc a t n h nt h c h i n . y , l mt c l i c h ot h c h i n nh nl s k t h pl ph c v p h n gn g a n h i mk h n gg i a nt n n i t r n . . 34 i uh n hq u t i c h l " c p h p n g : " m t c c hk h c n h a u t h c h i nc u c g i c h c n n g . N uq u t i m t n h i uh n hk h n gl mc h og i a od i nl pr r n gh nv d d n gh n s d n g , k h n gl m i u . T or a c h c m t n h i uh n ht n gc h u y n i l o i h n hc h om t l ph c . N i c h u n g , h yl mt h e oc c h n gd nv n hd n g c a r a t r o n gC h n g1 2 k h i q u t i k h a i t h c . 35. n gr i v ot r n gt h i t i uh a s m. B n gc c h n m i nr . c b i t , n gl ol n gv c c hv i t ( h o c t r n h ) n i t u y nc h c n n g , t h c h i nm t s c h c n n gk h n go, h o c m t i n hc h n h c h i uq u k h i b n l n ut i nx yd n gh t h n g . M c t i uc h n hc a b nn n c c h n gmi n ht h i t k , t r k h i t h i t k i h i m t h i uq u n h t n h . 36. T h n gt h n g , k h n g c h oc c t r n hb i nd c ht or a c c n h x yd n g , h mh y , h o c c c n h i uh n h= c h ob n . T h i t k l pn nl u nl u nn i c h n hx c n h n gg l pn nl mv g i l ph c h o nt o nd i s k i ms o t . N ub nk h n gmu nc m t c o p y c o n s t r u c t o r h o c n h i uh n h=, k h a i b on h t i n. H yn h r n gn ub nt or a b t k x yd n g , n n g nc nc c n h x yd n gm c n ht c t n gh p . 37. N ul pc a b nc c h a c o nt r , b np h i t oc c c o p y c o n s t r u c t o r , i uh n h=, v h yc a l ph c l mv i c n gc c h . 38. K h i b nv i t m t b ns a o x yd n gc h om t l ph c c n g u ng c , n h g i c c l pc s s a oc h px yd n g m t c c hr r n g( c n gl p h i nb nt h n hv i n i t n g ) . ( X e mC h n g1 4 . ) N ub nk h n g , c c n h x y d n gm c n hs c g i c h oc c l pc s ( h o c i t n gt h n hv i n ) v c l k h n gp h i l n h n gg b nmu n . g i c c c s c pb ns a o x yd n g , q u a i t n gc n g u ng c t b n a n gs a oc h pt : N g u ng c( c o n s tn g u ng c&d ) :c s ( d ){ //. . . 39. K h i b nv i t m t t o nt g nc h om t l ph c c n g u ng c , n h g i c c p h i nb nc s n gc pc a c c n h i uh n hp h nc n gr r n g . ( X e mC h n g1 4 . ) N ub nk h n g , s a u k h n gc g s x yr a ( i un yc n g n gc h oc c i t n gt h n hv i n ) . k ug i c c n h i uh n hp h nl pc s , s d n gt nc s n gc p v p h ng i i p h mv i : C n g u ng c&o p e r a t o r=( c o n s tn g u ng c&d ){ C s : :o p e r a t o r=( d ) ; 40. N ub nc np h i g i mt h i ur e c o mp i l e s t r o n gq u t r n hp h t t r i nc a m t d nl n , s d n gl px l / C h e s h i r e k t h u t m ot h h i nt r o n gC h n g5 , v l o i b n c h c h i uq u n ut h i g i a nc h yl m t v n . 41. T r n ht i nx l . L u nl u ns d n gc o n s t s d n gq u y nt h a yg i t r v n i t u y ns c h oc c ma c r o . 42. G i p h mv i c n gn h c n gt t n nk h n n gh i nt h v t u i t h c a c c i t n gc a b nc n gn h c n gt t . i un yl mg i mc h i c a v i c s d n gm t i t n gt r o n gb i c n hs a i v g i um t k h k h n t mt h y l i . V d , g i s b nc m t c o n t a i n e r v m t o nm l pq u a n . N ub ns a oc h pm s d n gv i m t c o n t a i n e r m i , b nc t h v t n hk t t h c b n gc c hs d n gk c ht h c c a c o n t a i n e r c n h t r nr n g b u c c a c c m i . T u yn h i n , n uc o n t a i n e r c l r a k h i p h mv i , l i n ys b b t t i t h i g i a nb i nd c h . 43. T r n hb i nt o nc u . L u nl u np h n u a d l i ub nt r o n gc c l ph c . C h c n n gt o nc uc n h i u k h n n gx yr a m t c c ht n h i nh ns ov i c c b i nt o nc u , m c d b ns a un yc t h p h t h i nr a r n g m t c h c n n gt o nc uc t h p h h ph nn h m t t n ht h n hv i nc a m t l p .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 300/320

08/10/2013

Suy ngh trong C + +, Vol 1

44. N ub nc np h i k h a i b om t l ph o c c h c n n gt m t t h v i n , l u nl u nl mn h v yb n gc c hb a og m m t t pt i nt i u . V d , n ub nmu nt or a m t c h c n n g g h i v om t o s t r e a m, k h n gb a og i t u y n b o s t r e a m m n hs d n gm t l o i c i mk t h u t k h n g y n h t h n y , l po s t r e a m ; C c ht i pc nn yl i m c a b nd b t nt h n gv i n h n gt h a y i t r o n gb i ud i n . ( V d , o s t r e a mt h c s c t h l m t t y p e d e f ) . T h a yv o , l u nl u ns d n gc c t pt i nt i u : #I n c l u d e K h i t oc c l ph c c a r i n gb n , n um t t h v i nl n , c u n gc pc h on g i d n gc a b nm t h n ht h c v i t t t c a t pt i nt i u v i t h n gs k t h u t l o i k h n g y ( c n g h a l , k h a i b ot nl p ) i v i t r n gh ph c np h i s d n gc h c c o nt r . ( Nc t h t n gt c b i nd c h . ) 45. K h i c h nk i ut r v c a m t n h i uh n hq u t i , h yx e mx t n h n gg s x yr a n ub i ut h c l c h u i l i v i n h a u . T r v m t b ns a oh o c t h a mc h i u nc c g i t r t r i ( t r l i * n y) n c t h c s d n g t r o n gm t b i ut h c c h u i ( A=B=C) . K h i x c n h i uh n h=, n h x =x . 46. K h i v i t m t c h c n n g , v t q u a i s c a c o n s t t h a mc h i un h l l a c h n ut i nc a b n . Mi nl b n k h n gc np h i s a i i t n g c t h n gq u a , t h c t i un yl t t n h t b i v n c s ng i nc a c p h pp a s s b y g i t r n h n gk h n gy uc uc n gt r n hx yd n gt nk mv t np h t or a m t i t n g a p h n g , x yr a k h i i q u a g i t r . T h n gt h n gb nk h n gmu n c l ol n gq u n h i uv c c v n h i u q u k h i t h i t k v x yd n gh t h n gc a b n , n h n gt h i q u e nn yl m t c h i nt h n gc h c c h n . 47. H yn h nb i t t mt h i . K h i i uc h n h t h c h i n , x e mr a t ot mt h i , c b i t l v i n h i uh n hq u t i . N ud n gv h mh yc a b nr t p h c t p , c h i p h c a v i c t or a v p h h yt mt h i c t h c a o . K h i t r v m t g i t r t m t c h c n n g , l u nl u nc g n gx yd n gc c i t n g" t i c h " v i m t c u c g i x yd n g t r o n gc c t u y nb t r l i : t r M y T y p e( i ,j ) ;h n M y T y p ex( i ,j ) ; t r v x ; C c t u y nb t r l i c ( c i g i l t i uh a l i n h u nc g i t r ) s b m t g h s a oc h px yd n gv k ug i h y . 48. K h i t ox yd n g , x e mx t t r n gh pn g o i l . T r o n gt r n gh pt t n h t , c c n h x yd n gs k h n gl mb t c i ug m n m m t n g o i l . T r o n gk c hb nt i pt h e ot t n h t , c c l ph c s c s n gt c v k t h a t c c l ph c m n hm d u yn h t , d o h s t n gl ms c hv nl nd nt r c k h i m t n g o i l c n m. N ub np h i c c o nt r t h n g , b nc t r c hn h i m n hb t n g o i l c a r i n gm n hv d e a l l o c a t i n gb t k t i n g u y nc h t r c k h i b nn m m t n g o i l t r o n gx yd n gc a b n . N um t n h x yd n gp h i t h t b i , h n h n gt h c hh pl n m m t n g o i l . 49. c h l mn h n gg l t i t h i uc nt h i t t r o n gx yd n gc a b n . i un yk h n gc h t or a m t c h i p h t h ph n c h oc c c u c g i x yd n g( n h i ut r o n gs c t h k h n g c k i ms o t c a b n ) n h n g n h t h uc a b nl s a u t c k h n n gn mn g o i l h o c g yr a v n . 50. T r c hn h i mc a c c d e s t r u c t o r l g i i p h n gc c n g u nl c c p h nb t r o n gs u t t h i g i a nc a i t n g , k h n gc h t r o n gq u t r n hx yd n g . 51. S d n gh t h n gp h nc pn g o i l , t t n h t l c n g u ng c t c c t i uc h u nC++ , h t h n gp h nc pn g o i l v l n gn h a un h c c l ph c n ot r o n gl p n mn h n gt r n gh pn g o i l . Ng i n hb t c c t r n gh p n g o i l s a u c t h b t c c l o i h n hc t h c a t r n gh pn g o i l , t i pt h e ol c c l o i c s . N ub nt h m n g o i l m i c n g u ng c , m s k h c hh n gh i nt i v ns b t c c n g o i l t h n gq u a c c l o i h n hc s . 52. N mn g o i l b i g i t r v b t n g o i l b n gc c ht h a mc h i u . H y c h oc c h x l n g o i l q u nl b n h x l . N ub nn mc o nt r nc c i t n gn g o i l c t or a t r nh e a p , n g i b t p h i b i t t i ud i t c c n g o i l , l k h pn i x u . N ub nb t n g o i l b i g i t r , b nl mc n gt r n hx yd n gt h mv t np h ; t i t h n , c c p h nc n g u ng c t c c i t n gn g o i l c a b nc t h t h i l t t r o n gu p c a s t i n gg i t r . 53. n gv i t c c l pm ur i n gc a b n , t r k h i b np h i . X e mx t ut i nt r o n gt i uc h u nC++T h v i n , s a u c c n h c u n gc pn h n gn g i t or a c c c n gc c h u y nd n g . T r n nt h n ht h ov i v i c s d n gc a h v b nr t n h i us l mt n gn n gs u t c a b n . 54. K h i t om u , x e m m s k h n gp h t h u c v ol o i v t m t r o n gm t l pc s k h n gm u n g nc h n k h n gc nt h i t s n gl nm . S d n gt h a k , t h n hp h n , b nc t h t or a c c m ut r o n g p h nl nc c m h c l l o i p h t h u c v ov d o c nt h i t . 55. K h n gs d n g< c s t d i o >c h c n n g , c h n gh nn h p r i n t f ( ) . H c c c hs d n gi o s t r e a ms t h a yv , h l l o i a n t o nv k i um r n g , v n gk m n hm h n . ut c a b ns c k h e nt h n gt h n gx u y n . N i c h u n g , l u nl u ns d n gC ++ , t h v i nt r o n g ut i nc h oc c t h v i nC .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 301/320

08/10/2013

Suy ngh trong C + +, Vol 1

56. T r n hc c l o i c x yd n gt r o n gC . H c h t r t r o n gC++t n gt h c hn g c , n h n gc h n g t m n hm h ns ov i C++l ph c , v v yt h i g i a nl i s nb nc a b ns t n gl n . 57. B t c k h i n ob ns d n g c x yd n gt r o n gc c l o i n h t o nc c h o c s t n g , k h n gx c n hc h o n k h i b nc n gc t h k h i t oc h n g . X c n hc c b i nm i d n gc n gv i k h i t oc a h . K h i x c n hc o nt r , t ' * ' b nc n ht nl o i . B nc t h l m i un ym t c c ha nt o nn ub n n hn g h a m t b i nt r nm i d n g . P h o n gc c hn yc x uh n g t g yn h ml nc h on g i c . 58. b ol n h k h i x yr a t r o n gt t c c c k h a c n hc a m c a b n . T h c h i nt t c k h i t ot h n hv i nt r o n g d a n hs c hk h i t ox yd n g , t h mc h c x yd n gt r o n gc c l o i ( s d n gc c c u c g i g i x yd n g ) . S d n gd a n hs c hk h i t ox yd n gt h n gl h i uq u h nk h i k h i t os u b o b j e c t s , n uk h n gc c n h x y d n gm c n h c g i l , v b ns c h g i h mt h n hv i nk h c ( c t h l n h i uh n h=) t r n c c k h i t on ob nmu n . 59. K h n gs d n gc c h n ht h c My T y p e a =b x c n hm t i t n g . N y, m t t n hn n gl m t n g u n c h n hc a s n h ml nv n g i m t n h x yd n gt h a yv i uh n h=. C h or r n g , l u nl u n c c t h v s d n gc c h n ht h c My T y p e mt ( b ) t h a yt h . K t q u , g i n gh t n h a u , n h n gc c l pt r n hv i nk h c s k h n gb n h ml n . 60. S d n gc c d i nv i nr r n gmt t r o n gC h n g3 . M t d i nv i ng h i l nh t h n g n hm yb n ht h n g v l m t i ml i t i mn n g . K t k h i c c d i nv i nr r n gc h i a Cc a m t d i nv i n k h n g t t c v oc c l p h c c a d i nv i nc n g c n hd u , b t c a i g l i v d u yt r m c t h d d n gt mt h yt t c n h n gn i m c c l i l o g i c c n h i uk h n n gx yr a . 61. i v i m t c h n gt r n h c m n hm , m i t h n hp h np h i c m n hm . S d n gt t c c c c n gc c c u n gc pb i C++ : k i ms o t t r u yc p , t r n gh pn g o i l , c o n s t c h n hx c , k i mt r a k i u , v n h v y t r o n gm i l ph c m b nt or a . B n gc c h b nc t h a nt o nc h u y ns a n gc p t i pt h e oc a t r ut n g k h i x yd n gh t h n gc a b n . 62. X yd n gt r o n gc o n s t c h n hx c . i un yc h op h pt r n hb i nd c h c h r a l i m n uk h n gs c t i n ht v r t k h t m. T h c h n hn yc m t c h t k l u t v p h i c s d n gt h n gn h t t r o n gc c l ph c c a b n , n h n gn s c n p . 63. S d n gl i t r n hb i nd c hk i mt r a l i t h c a b n . T h c h i nt t c c c b i nd c hv i c c c n hb o y , v s a c h a m c a b n l o i b t t c c c c n hb o . V i t m m s d n gc c l i t h i g i a nb i nd c hv c n hb o c h k h n gp h i l g yr a l i t h i g i a nc h y( v d , k h n gs d n gd a n hs c h i s v a r i a d i c , m v h i uh a t t c c c k i mt r a k i u ) . S d n gk h n g n h( ) g l i , n h n gs d n gc c n g o i l c h ol i t h i g i a nc h y . 64. t h c ht h i g i a nb i nd c hl i l i t h i g i a nc h y . C g n g x l m t l i n h g n n i mx u t h i nc a n c n g t t . T h c h i p h v i c c l i t i i m n m m t n g o i l . N mb t b t k t r n gh pn g o i l t r o n gx l g nn h t c t h n gt i n i p h v i c h n g . L mn h n gg b nc t h n g o i t r m c h i nt i , n uk h n g g i i q u y t v n , r e t h r o wn g o i l . ( X e mT p2 b i t t h mc h i t i t . ) 65. N ub n a n gs d n gk t h u t n g o i l ( x e mt p2 c a c u ns c hn y , t i v t w w w . B r u c e E c k e l . c o m, t m h i uv x l n g o i l ) , c i t r i n gc a b nb t n g (c h c n n g) s d n gs e t _ u n e x p e c t e d( . c a b n) k h n gmo n gmu n( n n n gn h p) l i v r e t h r o wc c n g o i l h i nh n h . B n gc c h , n um t c h c n n gh i nc c g h i v b t un mn g o i l , b ns c m t k l c c a t h p h mv c t h s a i m g i c a b n x l c c t r n gh pn g o i l . 66. T om t n g i d n gx c n hc h m d t ( ) ( c h r a m t l i l pt r n h ) n gn h pc c l i g yr a n g o i l , s a u p h t h n ht i n g u y nh t h n g , v t h o t k h i c h n gt r n h . 67. N um t d e s t r u c t o r g i b t k c h c n n g , n h n gc h c n n gc t h n mn g o i l . M t d e s t r u c t o r k h n gt h n m m t n g o i l ( i un yc t h d n nm t c u c g i nc h m d t ( ) , m c h r a m t l i l pt r n h ) , v v yb t k h ym c c c u c g i c h c n n gp h i n mb t v q u nl c c t r n gh pn g o i l c a r i n gm n h . . 68 n gt or a r i n g" t r a n gt r " t nt h n hv i nd l i uc n h nc a b n( t h mv ot r c n h nm n h , k h i u Hu n g a r y , v v ) , t r k h i b nc r t n h i ug i t r t o nc u c t t r c , n uk h n g , c h oc c l ph c v k h n gg i a n t nl mt nP h mv i c h ob n. 69. X e mc h q u t i . M t c h c n n gk h n gn nc i uk i nt h c t h i m d a t r ng i t r c a m t c u c t r a n hc i , m c n hh a yk h n g . T r o n gt r n gh pn y , b nn nt oh a i h o c n h i uc h c n n gq u t i t h a yt h . 70. nc o nt r c a b nb nt r o n gl pc o n t a i n e r . Ma n gl i c h oh r a c h k h i b ns n g a yl pt c t h c h i nc c h o t n gt r nc h n g . C o nt r l u nl u nc c m t n g u nc h n hc a l i . K h i b ns d n gmi , c g n gt h c o nt r k t q u v om t c o n t a i n e r . t h c hr n gm t c o n t a i n e r " s h u " c o nt r c a n v v yn c h ut r c hn h i md n d p . T h mc h t t h n , q u nm t c o nt r b nt r o n gm t l p , n ub nv nmu nn t r n gg i n gn h m t c o nt r , t n ht r n gq u t i n h i uh n h >v i uh n h* . N ub np h i c m t c o nt r t d o n g , l u nl u nk h i t on , t t n h t l nm t a c h i t n g , n h n gb n gk h n gn uc nt h i t . t n v ok h n gk h i b nx a n
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 302/320

08/10/2013

Suy ngh trong C + +, Vol 1

n g nc h nt n hc n h i ux a b . . 71 n gq u t i t o nc umi v x a , l u nl u nl m i un yt r nc s l ph c t h e ol p . Qu t i c c p h i nb n t o nc u n hh n g nt o nb d nl pt r n hc a k h c hh n g , m t c i g c h c n h n gn g i s n gt oc a m t d nn nk i ms o t . K h i q u t i mi v x a c h oc c l ph c , n gc h or n gb nb i t k c ht h c c a i t n g , m t n g i n o c t h c k t h a t b n . D n gt h a ms c c u n gc p . N ub nl mb t c i ug c b i t , x e mx t n hh n gc a n c t h c t r nn h n gn g i t h a k . 72. Ng nc h n i t n gc t . N h u n h k h n g b a o g i c n g h a n e ml n m t i t n g t h e o g i t r . n g nc h nu p c a s t i n gt h e og i t r , t c h c n n gt h u n ot r o n gl pc s c a b n .

73. t ph p i k h i ng i nk h n g c c n gv i c . M t " h t h n gp h c v h n hk h c h " t r nm t h n gh n gk h n g b a og mc c y ut n g t k t n i : c h n g i , m yl n h , v i d e o , v v , n h n gb nc np h i t or a n h i ut r o n gs n y t r o n gm t c h i c m yb a y . b nt h c h i nt h n hv i nt n h nv x yd n gm t g i a od i nh o nt o nm i ? K h n gt r o n gt r n gh pn y , c c t h n hp h nc n gl m t p h nc a g i a od i nc n gc n g , v v yb nn nt o c c i t n gt h n hv i nc n gc n g . C c i t n gc v i c t h c h i nr i n gc a h , m v na nt o n . H yn h n b i t r n gs k t h p ng i nk h n gp h i l m t g i i p h p c s d n gt h n gx u y n , n h n gn x yr a .

S u yn g h t r o n gC : C s c h oJ a v av C +, b i C h u c kA l l i s o n( a+Mi n d V i e w, I n cH i t h o o n C DR OM, 2 0 0 0 , b r n gb u c v om t s a uc a c u ns c hn yv c n gc s nt i w w w . B r u c e E c k e l . c o m) . yl m t k h a h c b a og mc c b i g i n gv t r n hb yt r o n gc c c s c ac c n g nn g C c h u nb c h ob n h c J a v a , C++ . yk h n gp h i l m t k h a h c y t r o n gC , c h c n h n gn h uc u c h u y ns a n gc c n g nn g k h c c b a og m. P h nn g nn g c t h g i i t h i ut h mt n hn n gc h oC++h a yJ a v al pt r n h t o b e . i uk i nt i n q u y t : m t s k i n hn g h i mv i m t n g nn g l pt r n hc pc a o , c h n gh nn h P a s c a l , B A S I C , F o r t r a n , h o c L I S P ( n c t h ut r a n ht h n gq u a c c a C Dm k h n gn nt n gn y , n h n gt t n h i nl k h n g c t h i t k g i i t h i uv n h n g i uc b nc a l pt r n h ) .

C h u n gC+ +

C++Ng nn g l pt r n h , r dp h i nb n3 , b i B j a r n e S t r o u s t r u p( A d d i s o n We s l e y , 1 9 9 7 ) . M c n o , m c c hc a c u ns c hm b n a n gn mg i l c h op h pb ns d n gc u ns c hB j a r n e n h m t t i l i ut h a m k h o . K t k h i c u ns c hc a n gb a og mc c mt c a n g nn g c a t c g i c a n g nn g , n t h n gl n i m b ns i ng i i q u y t b t k s k h n gc h c c h nv n h n gg C++l h o c k h n gp h i l m. K h i b nn h n c n h n gs t r n gc a n g nn g v s ns n g c c n g h i mt r n g , b ns c n nn .
t h b C++P r i me r , 3 n, b i S t a n l e yL i p p ma nv J o s e e L a j o i e ( A d d i s o n We s l e y1 9 9 8 ) . K h n gc n h i uc a m t m i n a ; . Np h t t r i nt h n hm t c u ns c hd y yv i r t n h i uc h i t i t , v m t t r o n g t i t i pc nv i c n g v i S t r o u s t r u pk h i c g n gg i i q u y t m t v n t d u y t r o n g C++n nc u n gc pm t c s c h os h i ub i t C+ +P r i m e r n h c n gn h c u ns c hS t r o u s t r u pc a .

C& C++M C a p s u l e , b i C h u c kA l l i s o n( P r e n t i c e Ha l l , 1 9 9 8 ) . s c u ns c hn yg i n hr n gb n b i t Cv C++ , v b a og m m t s c c v n m b nc t h g t r n , h o c b nc t h k h n gn h n c n gl n ut i n . C u ns c hn yl p yn h n gk h o n gt r n gt r o n gCc n gn h C++k h o n gt r n g . C++t i uc h u n. yl t i l i um yb a n l mv i c r t c h mc h c h ot t c n h n gn m . i un yl k h n g mi np h , k h n gma y . Nh n g t n h t b nc t h mu a d i d n g i nt P D Fc h oc h c $ 1 8 t i w w w . c s s i n f o . c o m.

Da n hs c hr i n gc at i v c u ns c h
c l i t k t h e ot h t x u t b n . K h n gp h i t t c t r o n gs n yh i n a n gc s n . Gi a od i n m yt n hv iP a s c a l& ( t x u tb nt h n gq u aC E i s y sd u n , n m 1 9 8 8 . C h c t h n gq u a w w w . B r u c e E c k e l . c o m) . G i i t h i uv t h i t b i nt t p h as a uk h i C P/M v nc nv u av D OSl m t m i n i . T i s d n gn g nn g c pc a ov t h n gl c n gs o n gs o n gc am yt n h i uk h i nc c d n i nt k h c n h a u . C h u y nt h t c t c at i t r o n gt pc h ut i nv t t n h t mt i v i t c h o , Mi c r o C o r n u c o p i a( d i n g i i L a r r yO' B r i e n , b i nt pv i nl un mc a T pc h P h t t r i np h nm m : c c t pc h m yt n ht t n h t c x u t b nh t h mc h c k h o c h x yd n gm t r o b o t t r o n gm t h o a n i ! ) T h a n i , Mi c r oCt r t h n hm t l ut r c k h i I n t e r n e t x u t h i n . T or a c u ns c hn yl m t k i n hn g h i mx u t b nv c n gt h a m n .
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 303/320

08/10/2013

Suy ngh trong C + +, Vol 1

S d n gC++( Os b o r n e/Mc G r a wHi l l 1 9 8 9 ) . M t t r o n gn h n gc u ns c h ut i nt r nC++ . yl i nr av t h a yt h b n gp h i nb nt h h a i c a n , l i t nC++I n s i d e & Ou. t


t h p C++I n s i d e & Ou( Os b o r n e /Mc G r a wHi l l 1 9 9 3 ) . Nh n i , t t h c s l 2 h i nb nc a S d n gC ++. C++t r o n gc u ns c hn yl k h c h n hx c , n h n g l v ok h o n gn m1 9 9 2 v t d u y t r o n gC++ ct h i tk t h a yt h n . B nc t h t m h i ut h mv c u ns c hn yv t iv m n g u nt i w w w . B r u c e E c k e l . c o m.

S u yn g h t r o n gC++ , s1 t p h i nb n( P r e n t i c e Ha l l , 1 9 9 5 ) . B l a c kB e l t C++ , c o l l e c t i oc a T h y, B r u c e E c k e l , b i nt pv i n( M & TnS c h1 9 9 4 ) . I nr a . M t b s ut pc c c h n gk h c n h a uc aC++u yt nd at r nc c b i t h u y t t r n hc ah t r o n gC++t h e od i t i H i n g h p h t t r i np h nm m, mt i c h t r . T r a n gb at r nc u ns c hn yk c ht h c ht i g i n hq u y nk i ms o t t t c c c t h i t k b a t n gl a i .


n dp T d u yt r o n gJ a v a , 2 h i nb n( P r e n t i c e Ha l l , 2 0 0 0 ) . nb n ut i nc a c u ns c hn y g i n hP h t t r i n p h nm mT p c h G i i t h n gN n gs u t v p h t t r i nJ a v a c a T p c h C h o i c e A wa r db i nt pv i nt r o n gn m 1 9 9 9 . T i v t w w w . B r u c e E c k e l . c o m.

s uv g ct i

Nh n gc u ns c hn y i s uh nv oc h n g nn g , v g i pb nt r n hn h n gc mb yt h n gv nc t r o n g v i c p h t t r i nC++c h n gt r n h .
n dE Hi uq u C++( 2 d i t i o n , A d d i s o n We s l e y1 9 9 8 ) v h i uq u h nC++( A d d i s o n We s l e y1 9 9 6 ) , S c o t t Me y e r s . C i n , p h i c v nb nc h og i i q u y t v n v m t h i t k n g h i mt r n gt r o n gC++ . T i c g n g n mb t v t h h i nn h i uk h i n i mt n h n gc u ns c hn yt r o n gt d u y t r o n g C++, n h n gt i k h n g n h l a b nt h nm n ht r o n gs u yn g h r n gt i t h n hc n g . N ub nd n hn h i ut h i g i a nn g h i mt r n gv i C++ , b ns k t t h c v i n h n gc u ns c hn y . C n gc s nt r n a C D R OM.

S u yn g m v C++, A n d r e wK o e n i gv B a r b a r a Mo o( A d d i s o n We s l e y , 1 9 9 6 ) . A n d r e w l mv i c t r c t i p v i S t r o u s t r u pt r nn h i uk h a c n hc a n g nn g C++v l m t c q u a nc c k n gt i nc y . T i c n gt m t h yc c i n c i s i v e n e s s c a n h n gh i ub i t c a m n h c l m m i , v h c c r t n h i ut a n h y , c h a i t r o n gi n nv t r o n gn g i , t r o n gn h n gn mq u a . Qu yml nC ++P h nm m d e s i g, J o h nL a k o s n( A d d i s o n We s l e y , 1 9 9 6 ) . B a og mc c v n v t r l i c u h i b ns g pp h i t r o n gv i c t or a c c d nl n , n h n gn h n gn g i t h n gn h h nl t t . C++Ge ms , S t a nL i p p ma n , b i nt pv i n( S I Gx u t b n , 1 9 9 6 ) . M t l a c h nc c b i v i t t C++B o c o . T h i t k & Di nb i nc a C+, b i B j a r n eS t r o u s t r u p( A d d i s o n +We s l e y1 9 9 4 ) . Hi ub i t s us c t c c n h p h t mi n hc a C++v l d ot i s a o n g q u y t n ht h i t k k h c n h a u . K h n gc nt h i t , n h n gt h v .

P h nt c hv t h i t k

L pt r n hc c Gi i t h c hb i K e n t B e c k( A d d i s o n We s l e y2 0 0 0 ) . T i y uc u ns c hn y . C , t i c x uh n g c m t c c ht i pc nt r i t i un h n gt i l u nl u nc mt h yr n gc t h c m t q u t r n hp h t t r i n c h n gt r n ht t h nn h i uk h c n h a u , v t i n g h r n gX P i k mk h d a r ng n . C u ns c hd u yn h t m c t c n gt n gt n h t r nt i P e o p l e w a r e ( mt d i y ) , m n i c h y uv m i t r n gv i p h v i v n h a d o a n hn g h i p . t r n h c c G i i t h c h n i v l pt r n h , v b i nh uh t m i t h , t h mc h " p h t h i n " , g n y t r nc a h t a i . H t h mc h c n i x a n h v y n i r n gh n h n hl OKmi nl b nk h n gd n hq u n h i u t h i g i a nt r nh v s ns n gn mc h n g i . ( B ns n h nt h yr n gc u ns c hn yk h n g c " U MLd uc a c h n h " t r nb a c a n . ) T i c t h t h yq u y t n hl mv i c c h om t c n gt yc h d a v ov i c h s d n gX P . C u ns c h n h , c h n gn h , d d n g c , t h v s u yn g h v . B nb t ut n gt n gm n hl mv i c t r o n gm t b u k h n gk h n h v yv n ma n gl i t mn h nc a m t t h g i i h o nt o nm i .


t h h a i U MLc h n gc t c a Ma r t i nF o wl e r ( 2 p h i nb n , A d d i s o n We s l e y , 2 0 0 0 ) . K h i b nl n ut i ng pp h i U ML , n l k h k h nb i v c r t n h i us v c h i t i t . T h e oF o wl e r , h uh t c c c n gc n yl k h n gc n t h i t v v ya n hc t t h n gq u a c c y ut c nt h i t . i v i h uh t c c d n , b nc h c nb i t m t v i c n gc b i u , v m c t i uc a F o wl e r l nv i m t t h i t k t t h nl l ol n gv t t c c c h i nv t n h n c . M t t t p , m n g , c u ns c hc t h c c , n g i ut i nb ns n h n c n ub nc np h i h i uU ML .

P h t t r i np h nm m t h n gn h t t h t c b i I v a r J a c o b s e n , s s G r a d yB o o c h , v J a me s R u mb a u g h( A d d i s o n We s l e y , 1 9 9 9 ) . T i i v oc h u nb y k h n gt h c hc u ns c hn y . Nd n gn h c t t c v i c l mc a m t v nb n i h c n h mc h n . T i n g c n h i nc h t i c a c u ns c hc l i g i i t h c hc v n h t h n h n gk h i n i mk h n gr r n g i v i c c t c g i . P h nl nc ac u ns c hl k h n gc h r r n g , n h n gt h v . V t t n h t c at t c , q u t r n h
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 304/320

08/10/2013

Suy ngh trong C + +, Vol 1

n yl mc h or t n h i un g h at h i t t h c . Nk h n gp h i l t r n hc c ( v k h n gc s r r n gc ah v t h n g h i m) n h n gn c n gl m t p h nc aU MLn h n g a yc k h i b nk h n gt h c c X Pt h n gq u a , h uh t m i n g i l e ol nt r nc h i c " U MLl t t " b a n d wa g o n( k h n gp h nb i t c a h t h c t m c k i n hn g h i mv i n ) v v v yb n c t h l mc h on t h n gq u a . T i n g h r n gc u ns c hn yn n c k h mc a U ML , v m t t r o n gn h n gb nc t h c s a uk h i F o wl e r U MLc h n g c t k h i b nmu nb i t t h mc h i t i t . T r c k h i b nc h np h n gp h pn o , n r t h u c h t c q u a n i mt n h n gn g i k h n gc g n gb nm t . T h t d d n g pd n gm t p h n gp h pm k h n gt h c s h i un h n gg b nmu nr a k h i n h o c n h n gg n s l mc h ob n . Nh n gn g i k h c a n gs d n gn , m c v n h m t l d ot h u y t p h c . T u yn h i n , c o nn g i c m t c h t n h n g a t ml k l : N uh mu nt i nr n gm t c i g s g i i q u y t v n c a h , h s c g n gn . ( yl t h n g h i m, l t t . ) Nh n gn un k h n gg i i q u y t v n c a h , h c t h t n gg p i n l c c a h v b t uc n gb m g l m t i ut u y t v i m h p h t h i nr a . ( yl t c h i , l k h n gt t . ) G i n h yc t h l n ub nc t h c n h n gn g i k h c t r o n gc n gm t t h u y n , b ns k h n gc n , n g a yc k h i n i v oh k h n g( h o c c h m) . yk h n gp h i l c h ot h yr n gt t c c c p h n gp h p i u , n h n gm b nn n c t r a n gb nt nr n gv i c c c n gc t i n ht h ng i pb n c h t h n g h i m( " Nk h n gl mv i c , c h n gt a h yt h c i g k h c " ) v r a k h i c h t c h i ( " K h n gc , l k h n gt h c s l m t v n . M i t h ut u y t v i , c h n gt i k h n gc np h i t h a y i " ) . T i n g h r n gc u ns c hs a u y , c t r c k h i b nl a c h nm t p h n gp h p , s c u n gc pc h ob nn h n g c n gc n y . P h nm m s n gt o, R o b e r t t h yt i n h( P r e n t i c e Ha l l , 1 9 9 5 ) . yl c u ns c ht t n h t m t i n h nt h yr n gt h o l u nv q u a n i mv v n t o nb p h n gp h pl u n . l m t b s ut pc c b i l u nn g nv c c g i yt m G l a s s v i t v i k h i mu a ( P J P l a u g e r l m t n gg p ) , p h n n hn h i un ms u yn g h v n g h i nc uv c h n yc a m n h . H g i i t r v c h d i n i n h n gg c nt h i t , n gk h n gd n gd i v ma n gb n . A n h yk h n gc h t h i k h i , h o c l , c h n gt r mt i l i ut h a mk h o g i yt v c c n g h i nc uk h c . T t c c c l pt r n hv i nv c c n h q u nl n n c c u ns c hn yt r c k h i l i x u n gb np h n gp h pl u n . R u n a wa y sp h n m m: Mo n u me n t a l Di s a s t p h nm m , R o b e r t e r st h yt i n h( P r e n t i c e Ha l l , 1 9 9 7 ) . Nh n g i u t u y t v i v c u ns c hn yl n ma n g nc h oc c v t r h n g un h n gg c h n gt i k h n gn i v : c b a on h i ud nk h n gc h t h t b i , n h n gk h n gn g o nm c . T i t h yr n gh uh t c h n gt av nn g h " i u k h n gt h x yr a v i t i " ( h o c " i u k h n gt h x yr a m t l nn a " ) v t i n g h r n g i un y t c h n gt av ot h b t l i . B n g c c hg i t r o n gt mt r r n gm i t h l u nl u nc t h i s a i , b n a n gt r o n gm t v t h t t h n l mc h oh i n g . B i h c i t n gc a T o mT n hy u( S I GB o o k s , 1 9 9 3 ) . K h c t t " q u a n i m" c u ns c h .
t h h a i P e o p l e wa r e , T o mD e Ma r c ov T i mo t h yL i s t e r ( D o r s e t Ho u s e , 2 nb nn m1 9 9 9 ) . M c d h c l l c ht r o n g p h t t r i np h nm m, c u ns c hn yl v c c d nv c c i n i c h u n g . Nh n gt pt r u n gv on h n gn g i v n h u c uc a h c h k h n gp h i l c n gn g h v n h uc uc a m n h . H n i v v i c t or a m t m i t r n gm m i n g i s c h n hp h c v h i uq u , c h k h n gp h i q u y t n hn h n gg q u yt c n h n gn g i n nl mt h e o c c c t h n hp h n y c a m t m yt n h . T h i s a un y , t i n g h , l n gg pl nn h t c h oc c l pt r n hm mc i v g t uk h i p h n gp h pX Y Z c t h n gq u a v s a u l n gl l mb t c i ug h l u nl u nt h c h i n .

P h c t p, b i M. Mi t c h e l l Wa l d r o p( S i mo n&S c h u s t e r , 1 9 9 2 ) . B i nn i ns n y nv i n h a uc a m t n h mc c n h k h o a h c t c c n g n hk h c n h a u S a n t a F e , Ne w Me x i c o , t h ol u nv c c v n t h c s m c c n g u y nt c r i n gk h n gt h g i i q u y t ( t h t r n gc h n gk h o nt r o n gn nk i n ht , s h n ht h n hb a n uc a c u c s n gt r o n gs i n h h c , t i s a om i n g i l mn h n gg h l mt r o n gx h i h c , v v . ) B n gc c hv t q u a v t l , k i n ht , h a h c , t o n h c , k h o a h c m yt n h , x h i h c , v n h n gn g i k h c , m t c c ht i pc n a n g n h n h n gv n n y a n gp h t t r i n . Nh n gq u a nt r n gh n , m t c c hk h c s u y n g h v n h n gv n c c k p h c t p a n gn i l n : R a k h i n h m n ht o nh c v ot n gr n gb nc t h v i t m t p h n gt r n hd o nt t c c c h n hv i v h n gt i ut i n q u a ns t v t mk i m m t mh n hv c g n g mp h n gmh n hm b n gm i c c h . ( C c b i nn i ns s c h , v d , s x u t h i nc a t h u t t o nd i t r u y n . ) L o i s u yn g h n y , t i t i nr n g , r t h u c hk h i c h n gt a q u a ns t c c h q u n l h nv p h c t ph nd np h nm m.

C h s
1 5 6 , 1 6 3 1 6 4 ! 1 6 3 ! = 1 5 8 # , T i nx l i uh n hs t r i n g i z e 1 9 6 #X c n h 1 9 4 , 2 4 5 , 3 3 5 , 3 5 3 #E n d i f 2 4 5 , 7 5 7 #I f d e f 1 9 4 , 2 4 5 #I f n d e f 2 4 6 #B a og m 8 5 #U n d e f 1 9 4 $ < , T r o n gma k e f i l e s 2 0 6

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

305/320

08/10/2013

Suy ngh trong C + +, Vol 1

1 5 6 % &1 3 4 , 1 6 4 & & , H pl v 1 5 8 & , B i t wi s e v 1 5 9 &=B i t wi s e 1 6 0 ( ) , Q u t i c c n h i uh n hc h c n n gg i 5 1 4 * 1 5 6 ; q u t i n h i uh n h 7 2 7 , 7 3 0 ; c o nt r t i c h 1 3 6 , V i c o nt r 1 9 2 , V i c o nt r 1 9 2 . t h n hv i n i uh n hl a c h n 2 3 7 . . . b i nd a n hs c h i s 1 1 4 ; v a r a r g s 2 4 3 / 1 5 6 : : 2 3 2 , 4 2 9 ; i uh n h p h ng i i p h mv i , v k h n gg i a nt n 4 1 7 : B c b a n u k h c 1 6 4 [ ] : M n gl pc h m c 1 0 5 ; q u t i n h i uh n hl pc h m c 5 1 9 , 6 9 8 ^B i t wi s e c q u y nh o c 1 5 9 ^=B i t wi s e 1 6 0 | , T r nb i t h o c 1 5 9 || , H pl h a y 1 5 8 |=B i t wi s e 1 6 0 ~B i t wi s e k h n g /n h n gn g i b s u n g 1 5 9 ~ , H y 2 8 7 1 5 6 , 1 6 3 , v i c o nt r 1 9 2 ++ 1 6 4 ; v i c o nt r 1 9 0 < 1 5 8 < < 1 6 0 ; q u t i c h oi o s t r e a ms 5 1 8 < <= 1 6 0 < = 1 5 8 =1 6 6 ; i uh n h , n h m t c h c n n gr i n g 5 3 3 ; t or a t n g 5 3 2 ; i uh n h , n h m t c h c n n gr i n g 7 0 9 ; q u t i 5 2 1 = = 1 5 8 , 1 6 6 > 1 5 8 > : Q u t i t o nt c o nt r t h n gmi n h 5 0 9 , l a c h nt h n hv i nc ut r c t h n gq u a c o nt r 1 7 8 >* , Q u t i 5 1 4 >= 1 5 8 > > 1 6 0 ; i o s t r e a ms ; i uh n h 1 0 6 ; q u t i 5 1 8 => > 1 6 0

Mt
h yb ( ) 4 0 9 t r ut n g : l pc s v t h u n o c h c n n g 6 4 6 ; k i ud l i u 1 2 9 , 2 3 9 t r ut n g 2 2 t r u yc p : k i ms o t 2 6 0 ; t h i g i a nc h y 2 7 5 ; c h c n n g 3 7 9 ; s p e c i f i e r s 2 9 , 2 6 1 , v i t n gb t r 2 6 9 ; c h o 2 6 3 t r u yx u t 3 8 0 d i nv i n , t r o n gt r n gh ps d n g 5 0c n g( + ) 1 5 6 a c h : c o n s t 3 3 9 , m i i t n gp h i c m t ac h d u yn h t 2 4 1 ; y ut 1 3 4 ; c h c n n g 1 9 8 , 3 9 1 , b n h 1 3 3 ; 2 6 5 i t n g ; v t q u a n h t i l i ut h a mk h oc o n s t 4 7 3 ; i q u av q u a yt r l i v i c o n s t 3 4 9 ; c ut r c i t n g 1 7 8 a c h c a ( & ) 1 6 4 t n gh p 1 0 5 ; c o n s t u n 3 3 7 ; k h i 2 0 1 , 3 0 1 , v c c c ut r c 3 0 2 t ph p 3 0 t h u t t o n , t i uc h u nC++T h v i n 7 4 2 r n gc a : n a me s p a c e 4 1 5 ; g i i q u y t v i t n ht h a mk h ov c o p y o n v i t 5 2 7 A l l i s o n , C h u c k 2 , 7 7 6 p h nb : c pp h t b n h n g 2 2 3 , 5 4 8 , b n h , v h i uq u 5 6 6 ; l ut r 2 9 2 c i mk t h u t l i nk t t h a yt h 4 4 2 2 4 4 m h , t r o n gk h i t n gc h u y n i l o i h n h 5 4 0 , v i k h n gg i a nt n 4 2 0 p h nt c h : v t h i t k , h n g i t n g 4 4 ; l i t 4 5 , p h nt c hy uc u 4 8 : &B i t wi s e 1 5 9 , 1 6 6 ; l o g i c & & 1 5 8 , 1 6 6 ; l o g i c & &v 1 7 3 a n d _ e q , &=( p h pt o nv p h nc n g ) 1 7 3 v d a n hc n g o n 3 2 0 A NS I t i uc h u nC++ 1 4 a r g c 1 8 7 i s : h n gd nl u n q u a 4 5 5 ; d n gl n h 1 8 7 , 2 5 2 ; c o n s t 3 4 4 ; x yd n g 2 8 6 ; m c n h3 1 0 , 3 1 1 , 3 2 1 , l pl u nn h m t l c 3 2 9 ; h y 2 8 7 ; d a n hs c h i s t r n g , Cs ov i C++ 1 1 4 ; c h c n n g 8 1 , 1 3 8 , d a n hk h n gx c n h 1 1 4 ; v m 3 7 4 ; t ng h i n h 8 3 ; t nt r a n gt r 3 1 2 , q u t i s ov i i s m c n h 3 2 4 ; q u a 4 5 0 , g i c h 3 2 3 ; p h n gp h p a t h c hc h ol pl u nq u a 3 5 1 ; t i l i ut h a mk h o 4 5 1 ; g i t r t r l i , i uh n h q u t i 5 0 5 ; d uv m c n h 3 2 2 ; v d a n h 1 1 4 ; d a n hs c h i s b i n 1 1 4 , 2 4 3 , k h n gc n hd a n h 3 2 3 a r g v 1 8 7 s h c , c o nt r 1 9 0 m n g 1 8 2 ; t n g m 3 0 1 ; g i i h n , k i mt r a , s d n gc c m u 6 9 7 ; t n ht o nk c ht h c 3 0 2 , n hn g h a , h nc h 3 3 8 , l pc h m c , i uh n hq u t i [ ] 6 9 8 ; k h i t o k h n g 3 0 1 , b nt r o n gm t l ph c 3 5 3 , l mc h om t c i n h nc o nt r n h m t m n g 5 6 4 ; m i v x a 5 6 3 ; c a c o nt r 1 8 7 ; c a c o nt r nc h c n n g 2 0 1 ; o f f b y m t t r o n gn h n gl i 3 0 1 ; q u t i m i v x a c h om n g 5 7 3 ; c o nt r v 1 8 4 ; t n h 6 9 2 ; k h i t ot n h 4 2 5 a s c t i me ( ) 3 8 4 l pr pn g nn g : a s mt r o n gd n ga s s e mb l y l a n g u a g e t k h a 1 7 3 ; C A L L 4 5 8 ; m c h om t c u c g i c h c n n g 4 5 6 , m c t or a b i m t h m o 6 4 2 ; R E T U R N 4 5 8 k h n g n h( ) : v mt r o n gt i uc h u nC 1 9 7 , 2 2 3 , 3 9 6 p h n 1 5 6 , 3 0 1 , k h n gc h op h p 5 3 3 ; me mb e r wi s e 5 3 2 , 6 0 0 ; i uh n h 5 0 5 ; q u t i 5 2 1 ; c o nt r , c o n s t v k h n gc o n s t 3 4 3 ; t p h nc n g t r o n g i uh n hq u t i 5 2 3 mb o( ) 7 5 7 ; t r e q u i r e . h 2 3 7 a t e x i t ( ) 4 0 9 a t o f ( ) 1 8 8 , 1 8 9 a t o i ( ) 1 8 8 a t o l ( ) 1 8 8 t n gk h a 1 4 9 , 4 1 4 t n gl n gg i m i uh n h1 2 8 n h i uh n ht n gt n g 1 0 6 , 1 2 8 t n g : m, v m n g 3 0 1 , s n gt oc a n h i uh n h= 5 3 2 ; c u c g i h y 2 9 7 ; l o i c h u y n i 2 2 8 , 5 3 3 ; c mb y 5 3 9 ; n g nc h nv i t k h a r r n g 5 3 4 ; b i n 4 2 , 1 4 9 , 1 5 3

B
d ug c hc h on g c 9 5p h ml i 9 5b a d _ a l l o c 5 7 2c s : l pc s t r ut n gv t i n hk h i t c h c n n g o 6 4 6 ; g i a od i nl pc s 6 3 3 ; mo n gma n h v n c s n gc p 2 7 6 ; l o i 3 2 ; t k h a ot r o n gt k h a i d e r i v e d c l a s s 6 3 2 k h i n i mc b nc a h n g i t n g l pt r n h( O O P ) 2 2 Ng nn g B A S I C 6 8 , 7 7B e c k , K e n t 7 7 9 2 1 9n h k h a i t h c h n hv i n h p h n 1 6 0 ; v d c a t t c c c q u t i 4 9 3 ; q u t i 4 8 7r n gb u c : n n g n gr n gb u c 6 3 1 , u 3 8 , 6 4 4 ; c h c n n gg i r n gb u c 6 3 1 , 6 4 1 ; c u i

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

306/320

08/10/2013

Suy ngh trong C + +, Vol 1

3 8 , 6 3 1 , t h i g i a nc h yr n gb u c 6 3 1 b i t x 1 6 2 b i t a n d , &( b i t wi s ev ) 1 7 3 b i t c o p y 4 6 8b i t c o p y , s ov i k h i 4 6 0 b i t o r , |( b i t wi s eh o c ) 1 7 3 b i t c h u y nd c h 1 6 2 B i t wi s e : v i uh n h& 1 5 9 , 1 6 6 ; c o n s t 3 6 2 ; c q u y nh o c , x o r ^ 1 5 9 ; r r n gt r nb i t v k h a i t h c h pl 1 7 3 ; k h n g ~ 1 5 9 ; k h a i t h c 1 5 9 ; h o c i uh n h| 1 5 9 , 1 6 6 s n gl n , m 3 9 1 k h i : t r u yc p 2 6 9 v c pp h t b n h 2 9 2 ; n hn g h a 2 8 9 B o o c h , G r a d y 7 7 9 c u ns c h : t h i t k v s nx u t 1 8 ; l i , b oc o 1 6 b o o l 1 2 5 , 1 9 5 B o o l e a n 1 1 7 , 1 5 8 , 1 6 3 , i s 1 5 9 ; v d uc h m n g 1 5 9 ; b o o l , n gv s a i 1 3 1 g i i h n , k i mt r a m n g , v i c c m u 6 9 7 g i n g h , t k h a 1 2 2 t h n g , b i t 1 6 2 l i : c mb yp h b i nv i c c n h k h a i t h c 1 6 6 ; t mk i m 2 9 2 ; t p h i 1 6 8 ; v i t mt h i 3 4 8 c x yd n gt r o n gl o i 1 2 9 ; c b n 1 2 9 ; k h i t oc h om t b i nt n h 4 0 8 ; p s e u d o c o n s t r u c t o r , c c c u c g i c h o 5 8 9 ; h n ht h c c h ox yd n gt r o n gc c l o i 3 8 1 1 3 3 b y t e

C
C 2 8 9 ; #x c n h 3 4 0 , t n gt h c hn g c 7 3 ; l pt r n hCh c C++ 6 2 8 , C++t n gt h c h 2 3 5 ; b i nd c hv i C++ 3 0 5 ; k h i n i m 2 ; c o n s t 3 3 8 ; c h u y n i t Cs a n gC++ 2 3 0 , 7 6 0 , k h c b i t v i C++ , k h i x c n hc c b i n 1 4 5 ; d a n hs c h i s t r n g , Cs ov i C++ 1 1 4 ; t m k i mc c v n t r o n gm c 7 0 ; t h v i nc h c n n g 1 1 6 ; n g u y nt c c b n 1 1 2 ; n g 5 5 0 ; l t r o n gh t h n gk i u , q u a v o i d* 4 5 0 ; t i uc h u nI S OC 1 4 ; t h v i n 8 9 , 2 1 9 ; l i nk t 3 3 8 ; l i nk t b i nd c hm Cv i C++ 4 4 2 ; t nv a c h m 6 8 ; k h a i t h c v s d n g 1 5 6 ; i q u a v q u a yt r l i c c b i nt h e og i t r 4 5 5 ; c mb y 2 2 7 ; t i nx l 3 3 4 ; l a nt o nt r o n gq u t r n hl i nk t 3 1 4 ; c h c n n gt h v i nc h u n , h yb ( ) 4 0 9 ; a t e x i t ( ) 4 0 9 ; e x i t ( ) 4 0 9 ; t d u yt r o n gC C DR O M 7 7 6 C++ : t n gt y p e d e f c h oc ut r c v l p 2 3 1 ; Ct n gt h c h 2 3 5 , l pt r n hCh c C++ 6 2 8 ; c f r o n t , b a nC++ 2 3 7 ; b i nd c hC 3 0 5 ; c h u y n i t C s a n gC++ 2 3 0 , 7 6 0 , d l i u 1 2 9 ; k h c b i t v i Ck h i x c n hc c b i n 1 4 5 ; h i uq u 6 6 ; d a n hs c h i s t r n g , Cs ov i C ++ 1 1 4 ; p h i r r n g 1 6 7 ; t ml i Cb n gc c hb i nd c hl i b n gC++ 3 1 4 ; c h n gt r n h ut i n 9 0 ; b i nd c hG NU 7 1 ; l a i h n g i t n gn g nn g , v b n 2 6 9 ; a c h c ut r c n g m i q u a 2 3 1 ; l i nk t b i nd c hmCv i C ++ 4 4 2 ; t n hn n gn g nn g c h n h 6 8 2 ; n g h ac a t nn g nn g 1 2 9 ; d a t r n i t n gC ++ 6 2 8 ; m t q u yt c n hn g h a 2 4 4 ; k h a i t h c v s d n g 1 5 6 ; h n gd nl pt r n h 7 6 0 ; t i uc h u nC ++ 1 4 ; U b a nT i uc h u n 1 4 ; c h i nl c c h u y n i s a n g 6 8 ; l o i n g h i mn g t k i mt r a 2 2 7 ; n g nn g m n hm n hm y 4 5 0 , t i s a on t h n hc n g 6 4 t n ht o nk c ht h c m n g 3 0 2 C A L L , l pr pn g nn g 4 5 8 g i m t h mt h n hv i nc h om t i t n g 2 3 9c a l l o c ( ) * 2 2 3 , 5 5 0 , 5 5 4C a r o l a n , J o h n 2 7 7C a r r o l l , L e wi s 2 7 7t r n gh p 1 2 4c a s s e r t t pt i nt i u t i uc h u n 1 9 7d i nv i n 4 0 , 1 3 5 , 1 6 4 , 2 7 6 , 5 5 2 , 6 3 0 , C++d i nv i nr r n g 1 6 7 ; c i c o n s t n e s s 3 6 3 ; c c o nt r v o i d 2 3 5 ; c o n s t _ c a s t 1 7 0 ; d i nv i nr r n gc h ou p c a s t i n g 6 8 1 ; t k h a r r n g 6 7 8 ; k h a i t h c 1 6 6 c o nt r c h u y nn h n g 3 4 3 ; d i ng i i d i nv i n 1 7 1 ; s t a t i c _ c a s t 1 6 9 c o nm o , C h e s h i r e 2 7 7 b t k h o n 5 7 2 C DR O M: h i t h ot r nC D R O Mt Mi n d V i e w 1 6 ; t d u yt r o n gC , C s c h oJ a v a v C++( n gg i v i c u ns c h ) 2 , 1 5 , 1 1 2 c f r o n t , b a nC++ 2 3 7 c h n gt n gq u a n 7 c h a r 9 6 , 1 3 0 , 1 3 2 , 1 7 3 n h nv t s i z e o f 1 5 4 ; c h m n g 3 4 3 ; n h nv t m n gn i 9 6 ; h n g 1 5 5 c i m 2 1 9 k i mt r a t p h nc n gt r o n g i uh n h q u t i 5 0 5 c o nm oC h e s h i r e 2 7 7 c i n 9 7c u c n g , t n 2 2 9 l p2 5 , 7 6 , 2 7 1 , l pc s t r ut n gv t i n hk h i t c h c n n g o 6 4 6 ; t h mc h c n n g om i t r o n gl pb t n g u n 6 5 2 ; t n gk h i 3 0 2 ; l p n hn g h a v c h c n n gn i t u y n 3 7 8 ; t h i g i a nb i nd c hh n gs t r o n g 3 5 3 , 3 5 6 , 3 5 8 , t h n h p h n , v c o p y c o n s t r u c t o r 4 6 9 ; c o n s t v e n u mt r o n g 3 5 3 ; l pc o n t a i n e r m uv c h c n n g o 7 4 3 , n g i s n gt o 2 8 ; k h a i 2 7 7 ; c a m t l pn g i b n l n gn h a u 5 1 4 ; x c n hg i a od i n 6 2 ; n hn g h a 2 7 7 ; s k h c b i t g i a n g h i p o nv m t l p 3 1 9 ; n hn g h al pt r n gl pv c c m u 6 9 9 ; mo n g ma n hv n c s n gc p 2 7 6 ; t or ab i v m 5 9 4 ; l p c t or ac h oc c m u 6 9 9 ; l px l 2 7 5 ; t h a k v x yd n gs a oc h p 4 7 1 ; s 6 1 7 ; k h i t o , me mb e r wi s e 4 7 1 ; t h h i nc a 2 4 ; t k h a 3 1 ; ap h n g 4 2 8 ; l n g 4 2 8 ; l p 5 1 2 , 7 2 1 , q u t i m i v x a c h om t l ph c 5 7 0 ; c o nt r t r o n g , v q u t i t o nt = 5 2 4 , c c i t n gl pt n ht r o n gc h c n n g 4 0 8 ; t n ht h n hv i nd l i u 4 2 3 ; h mt h n hv i nt n h 4 2 9 ; m u 7 4 2 ; s d n g c o n s t v i 3 5 2 l pc h ut r c hn h i m, h pt c ( C R C ) t h 5 2 d nd p 2 2 7 , 6 6 6 , c c c u c g i d e s t r u c t o r t n gv i d i s nv t h n hp h n 5 9 2 ; k h i t ov d nd pt r n n g 5 4 8 l pt r n hk h c hh n g 2 8 , 2 6 0 m : l pr pc h om t c u c g i c h c n n g 4 5 6 ; s n gl n 3 9 1 ; t h c o mme n t t r o n gd a n hs c h 7 5 0 ; t v n , t v n , t h i t k v wa l k t h r o u g h s m t Mi n d V i e w 1 6 ; m yp h t i n 7 9 ; t c h c 2 4 8 ; t i u c c t pt i n 2 4 4 ; c ut r c c h n gt r n hk h i v i t m 9 3 ; t i s d n g 5 8 3 ; n g u ns n 1 2 ; b n g i uk h i n 2 0 1 b s ut p 5 1 0 , 7 1 9 t h u , r c 4 2 v a c h m, k t n i 2 4 4 n h i uh n hd up h y 1 6 5 , 5 0 8 d n gl n h 2 5 2 ; l u n 1 8 7 b n hl u nt a g : k t n i 1 4 8 ; t r o n gn g u n d a n hs c hm 7 5 0 k i n , ma k e f i l e 2 0 4 b a n , C++t i uc h u n 1 4 g i a od i np h b i n 6 4 7 n nc h t , n g 2 2 5 t n gt h c h : C&C++ 2 3 5 ; v i C 9 8 b i nd c h : k h n g c nt h i t 2 7 6 ; q u t r n h 7 9 ; r i n gb i t 7 8 ; r i n gb i t , v l mc h o 2 0 2 b i nd c hh n gs t h i g i a nb i nd c h 3 3 5 7 6 , 7 7 ; t or a m c n h x yd n g 3 0 4 ; g c C++c f r o n t 2 3 7 ; c h y 9 5 ; h t r 1 5 b i nd c hCv i C++ 3 0 5 c o mp l , ~n h n gn g i b s u n g 1 7 3 p h c t p : k h a i b ov n hn g h a 1 9 9 ; b i ut h c , v i uh n hq u t i 4 8 8 t n gh p : m n g 1 8 2 ; l o i t o 1 7 4 t h n hp h n 3 0 , 5 8 4 , 6 0 7 , k t h pt h n hp h nv t h a k 5 9 1 ; c o p y c o n s t r u c t o r 4 6 9 ; t h n hv i n i t n gk h i t o 5 8 9 ; s ov i t h a k 6 0 4 , 6 2 0 , 7 4 0 n i , n h nv t m n g 9 6 k h i n i m, c a o 4 8 n h i uh n hc i uk i n 1 6 4 c i uk i n , t r o n gv n gl p 1 2 1 c o n s t 1 5 3 , 3 3 4 , a c h c a 3 3 9 ; u n 3 3 7 ; c x a 3 6 3 ; n h nv t m n gc h 3 4 3 ; h n gc o mp i l e t i me t r o n gl p 3 5 6 ; c h c n n gt h a mc h i uc o n s t l u n 3 5 1 ; n g n 3 6 7 ; e n u mt r o n g l p 3 5 3 , i m n hg i 3 3 7 ; e x t e r n 3 3 9 ; c h c n n g i s v g i t r t r l i 3 4 4 , t r o n gC 3 3 8 ; k h i t ot h n hv i nd l i u 3 5 5 ; h pl 3 6 2 ; c h c n n gt h n hv i n 3 5 2 ; v c c i t n g 3 5 9 ; c o t h t h a y i 3 6 2 ; a c h v t q u a n h t i l i u t h a mk h o c o n s t 4 7 3 ; c o n t r n c o n s t 1 7 1 ; c o n t r 3 4 0 ; t h a mk h o 3 4 5 , 4 5 3 , v i uh n hq u t i 5 0 5 ; t r l i g i t r n h c o n s t 3 4 5 v i uh n hq u t i 5 0 7 ; a nt o n 3 3 6 ; t mt h i s c t n g c o n s t 3 4 7 c o n s t _ c a s t 1 7 0 1 5 3 l i nt c , n h nv t 1 5 5 ; c o mp i l e t i me 3 3 5 ; l pb nt r o n g 3 5 8 ; g p3 3 5 , 3 3 9 ; t n 1 5 3 ; m u , c c h n gs t r o n g 7 0 3 ; g i t r 1 5 4 x yd n g 2 8 5 , 5 4 8 , 5 5 1 , 6 6 5 , i s 2 8 6 ; l o i c h u y n i t n g 5 3 4 ; h n hv i c a c h c n n g ot r o n gx yd n g 6 6 4 ; s a oc h px yd n g 4 3 2 , 4 5 0 , 4 5 5 , 4 6 3 , 6 5 7 , t h a yt h c h o 4 7 1 ; v s n h i uh n h= 5 2 1 ; t or a m t i t n gm i t m t i t n gh i n 4 6 2 ; m c n h3 0 4 , 3 2 7 , 4 0 8 , 4 7 0 , 5 6 3 , t h a k 6 6 3 ; t n gh pt r n hb i nd c h 3 0 4 ; k h n gt n g c h n g 6 0 0 ; h i uq u 6 6 3 , i t n gt o nc u 4 1 0 ; k h i t ov d nd pt r n n g 5 4 8 ; d a n h s c hk h i t o 3 5 3 , 5 8 9 , 6 6 4 ; p s e u d o c o n s t r u c t o r s 5 8 9 ; n i t u y n 3 9 2 ; c i t V P T R 6 4 3 ; me mb e r wi s e k h i 6 0 0 ; t n 2 8 5 ; i uh n hm i , b n h k i t s c 5 7 6 ; t x yd n gv i t h a k 6 6 5 , t h t c a c c c u c g i x yd n g 6 6 3 , v c c c u c g i d e s t r u c t o r 5 9 2 ; q u t i 3 1 0 , 3 1 9 ; t i n 7 0 9 ; g i x yd n g 5 6 2 ; g i t r t r v 2 8 7 ; s n gt ot h e od i v t np h 7 0 9 ; c h c n n g ov x yd n g 6 6 2 t v n , t v n , t h i t k v wa l k t h r o u g h s m t Mi n d V i e w 1 6 t h n g 5 1 0 , 7 1 9 ; l pc o n t a i n e r m uv c h c n n g o 7 4 3 ; x a 6 7 1 ; v n gl p 6 9 0 ; m i , x a , v c o n t a i n e r 6 9 2 ; s h u5 5 5 , 6 7 1 , 7 1 3 ; a h n h 7 3 8 ; t i uc h u n C++T h v i n 1 0 4 ; v e c t o r 1 0 2 b i c n h , v q u t i 3 1 0 t i pt c , t nmi nk h n gg i a n 4 1 5 c nt i pt c t k h a 1 2 2 K i ms o t : t r u yc p 2 9 , 2 6 0 , t h i g i a nc h y 2 7 5 ; t r u yc ps p e c i f i e r s 2 6 1 , b i uh i n , c s d n gv i m t v n gl p 1 0 6 k i ms o t : t h c h i n 1 1 7 ; l i nk t 4 1 2 c h u y n i : t n gc h u y n i l o i h n h 5 3 3 ; c h u y n i t h uh p 1 7 0 ; c mb yt n gc h u y n i l o i h n h 5 3 9 ; n g nc h nl o i c h u y n i t n gv i c c t k h a r r n g 5 3 4 ; nc c s t c h a r * 1 8 8 c h u y n i t Cs a n gC++ 2 3 0 , 7 6 0 b ns a o x yd n g 4 3 2 , 4 5 0 , 4 5 5 , 4 6 3 , 5 0 8 ,

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

307/320

08/10/2013

Suy ngh trong C + +, Vol 1

6 5 7 , 7 3 0 , l a c h nt h a yt h 4 7 1 ; t h n hp h n 4 6 9 ; m c n h 4 6 8 ; t h a k 4 7 1 ; t i n 4 7 1 , 7 0 9 ; u p c a s t i n gv s a oc h px yd n g 6 1 7 ; s ov i n h i u h n h= 5 2 1 c o nt r s a oc h pt r o n gc c l ph c 5 2 4 c o p y o n v i t ( C O W) 5 2 7 t h n gb ob nq u y n , m n g u n 1 2 c h n hx c , c o n s t 3 6 7 c h i p h , k h i n g 7 1 t n h : t n g , v m n g 3 0 1 ; t i l i ut h a mk h o 5 2 6 9 0 , 9 1 b a og mt h i t k , c u ns c hc o u t 1 7 C R C , t h l pc h ut r c hn h i m, h pt c 5 2 t or a : c c c h c n n gt r o n gCv C++ 1 1 2 ; i t n gm i t m t i t n gh i n 4 6 2 , c c i t n gt r nh e a p 5 5 4 c u c k h n gh o n g , p h nm m 8 t pt i nt i u t i uc h u nc s t d l i b 1 8 8 c s t r i n gt i uc h u nt pt i nt i u 2 6 9 c vv n gl o i 3 6 6

D
d l i u : x c n hl ut r c h oc c t h n hv i nt n h 4 2 4 ; k h i t ot h n hv i nc o n s t 3 5 5 , d i nt c ht n h 4 0 6 , c c t h n hv i nt n ht r o n gm t l p 4 2 3 k i ud l i u : t r ut n g 1 2 9 , 2 3 9 , c x yd n gt r o n g 1 2 9 ; t n g n gv i l p 2 6 ; d n gx c n h 1 2 9 g l i 7 8 ; k h n g n h( ) v m 1 9 7 ; c 1 9 4 ; c t i nx l 1 9 4 ; r e q u i r e . h 3 9 6 ; t h i g i a nc h y 1 9 5 , b n gc c hs d n gt i nx l 3 9 5 c p h pk h a i b o ; 1 5 4 k h a i 8 1s t h pp h n , t t c c c k t h pc t h 1 4 1 ; p h nt c hp h c t p 1 9 9 ; v n hn g h a 2 4 3 ; l p 2 7 7 ; b nl n gn h a u 5 1 4 ; c o n s t 3 4 0 ; v p h at r c 1 5 1 ; c h c n n g 1 1 6 , 2 3 3 , 3 1 3 8 2 ; k h n gc nt h i t t r o n gC 2 2 8 ; t pt i nt i u 2 4 2 , 2 4 4 , c ut r c 2 6 5 , s d n g , c h ok h n g g i a nt n 4 2 1 b i n , c p h pk h a i b o 8 3 ; i mk k h a i v p h mv i 1 4 5 ; o 6 3 2 ; l pc s t k h a i 6 3 2 ; d e r i v e d c l a s s t k h a i 6 3 2 t r a n gt r , t n 2 3 0 , 2 3 1 , 2 3 7 , 4 4 2 ; q u t i 3 1 1 t c h 6 2 8 ; q u a a h n h 3 9 l n gg i m1 2 8 , 1 6 4 , v t n g k h a i t h c 5 0 6 ; q u t i n h i uh n h 4 9 3 m c n h : i s 3 1 0 , 3 1 1 , 3 2 1 , n h m t l c 3 2 9 ; s ov i q u t i 3 2 4 ; x yd n g 3 0 4 , 3 2 7 , 4 0 8 , 4 7 0 , 5 6 3 , t h a k 6 6 3 ; s a oc h px yd n g 4 6 8 ; g i t r m c n ht r o n gm u 7 0 3 ; t k h a 1 2 4 x c n h : c h c n n gc o nt r 1 9 8 ; k h i t o n gt h i 2 9 0 ; k h i t o b i n 1 3 0 ; b i n 1 4 5 ; b t c n i n ot r o n gp h mv i 1 4 5 n hn g h a 8 1 ; m n g 3 3 8 ; k h i 2 8 9 ; l p 2 7 7 ; n hn g h a c h c n n gp h c t p 1 9 8 ; c o n s t 3 4 0 ; k h a i 2 4 3 ; n hn g h a l pt r n gl pv c c m u 6 9 9 ; n hn g h a c o nt r n hd n g 3 4 2 ; c h c n n g 8 3 ; n o n i n l i n e m ut h n hv i n n hn g h a c h c n n g 6 9 9 ; 2 8 5 i t n g , c h c n n g ot i n hk h i t n hn g h a 6 5 1 ; l ut r c h oc c t h n hv i nd l i ut n h 4 2 4 ; n hn g h a c ut r c t r o n gm t t pt i nt i u 2 3 4 x a 1 6 4 , 2 2 3 , 5 5 3 , k ug i x a c h ok h n g 3 2 7 ; x a b i uh i n 5 5 3 , 5 6 6 ; t k h a 4 2 ; n h i ux a b c a c n gm t i t n g 5 5 3 ; m i v c o n t a i n e r 6 9 2 ; c h om n g 5 6 3 ; q u t i m i v x a 5 6 6 ; m n g 5 7 3 ; l p 5 7 0 ; t o nc u 5 6 8 ; v o i d* , x a l m t l i 5 5 5 ; k h n gc o nt r 5 5 3 D e ma r c o , T o m 7 8 1 p h t h u c : ma k e f i l e 2 0 4 ; t n h k h i 4 3 2 k h uh a o , c a ++v i m t l c b o o l 1 3 1 t i c h : * 1 6 4 ; d e r e f e r e n c i n gc o nt r h m 2 0 0 ; c o nt r 1 3 7 n g u ng c : t h mc h c n n gm i ot r o n gl pb t n g u n 6 5 2 ; l o i 3 2 ; t k h a ot r o n gt k h a i n g u ng c t l p 6 3 2 t h i t k : P h nt c hv t h i t k , o b j e c t o r i e n t e d 4 4 ; c u ns c h , b a 1 7 , t h i t k v s nx u t 1 8 ; t v n , t v n , t h i t k v a n gwa l k t h r o u g h s t Mi n d V i e w 1 6 ; n mg i a i o nc a i t n gt h i t k 5 4 ; i n l i n e s 3 8 0 ; s a i l m 2 7 9 ; m u , l p 7 1 9 ; m u 5 9 , 7 0 h y 2 8 7 ; c u c g i d e s t r u c t o r t n g 2 9 7 ; v i d i s nv t h n hp h n 5 9 2 ; k h n gt n g c h n g 6 0 0 ; r r n gc u c g i h y 5 7 9 ; k h i t ov d nd pt r n n g 5 4 8 ; i n l i n e s 3 9 2 ; t x yd n gv h yc u c g i 5 9 2 ; t i n hk h i t d e s t r u c t o r o 6 6 8 ; p h mv i 2 8 8 ; t n h i t n g 4 1 0 ; t h e od i s n gt ov t np h 7 0 9 ; d e s t r u c t o r o 6 6 5 , 7 0 7 , 7 3 6 , 7 4 0 ; oc h c n n gc u c g i t r o n gh mh y 6 7 0 p h t t r i n , g i a t n g 6 1 4 s : s t h a k l p 6 1 7 ; t h a k 4 0 ; t r n gh ps d n g 4 9 c h t h : t i nx l 7 9 ; s d n g , k h n gg i a nt n 9 2 , 4 1 8 ; t pt i nt i u 2 4 7 t r c t i pt r u yc pv oc ut r c 2 4 0 k h n gc h op h pc h u y nn h n g 5 3 3 p h i , i /n h i u 6 7 5 c h i a ( / ) 1 5 6 1 5 5 i ; p h i , v n h i up h i 6 7 5 ; i c h n hx c d uc h m n g 1 3 0 ; n hd n gn i b 1 8 9 l mt r o n gk h i 1 2 0 n h nx u n g : s t a t i c _ c a s t 6 8 1 ; l o i a nt o n 6 7 8 n hn g h a l pt r n gl pv c c m u 6 9 9 n g : r n gb u c 6 3 1 ; c pp h t b n h 2 2 3 , 5 4 8 , i t n gs n gt o 4 2 , 5 4 7 , 7 3 2 , 7 3 8 ; k i mt r a k i u 8 0 d y n a mi c _ c a s t 6 7 8

E
ur n gb u c 3 8 , 6 3 1 , 6 4 1 , 6 4 4 p h i nb n , 2 t h , n h n gg m i t r o n g 2 h i uq u 3 7 1 , C++ 6 6 ; x yd n g 6 6 3 ; t ov t r v i t n g 5 0 7 ; i n l i n e s 3 9 2 ; c pp h t b n h 5 6 7 ; t i l i ut h a mk h o 4 5 5 ; b yc a t i uh a s m 3 2 9 ; c h c n n g o 6 4 5 s a n gt r n g , t r o n gc h n gt r n h 6 0 E l l i s , Ma r g a r e t 4 3 3 1 1 8 n h n gk h c : i t n g 5 8 5 , h t h n g n gg i 5 7 7 2 3 9 , 2 7 0 k t t h c S e n t i n e l , l p 7 2 4 , 7 2 8 , 7 3 6e n u m: c o n s t v t r o n gc cl ph c 3 5 3 ; c h n gt r n hl mr v i 1 7 9 ; t h u 3 5 8 ; i n c r e me n t i n g 1 8 0 ; t k h a 1 7 9 ; k i mt r ak i u 1 8 0 ; u n t a g g e d 3 2 0 , 3 5 8 t n g n g 1 6 6 1 5 8 = = l i : x l n g o i l 4 3 ; o f f b y m t 3 0 1 ; n g nc h nv i c c t pt i nt i u p h b i n 2 4 4 ; b oc os a i s t t r o n gc u ns c h 1 6 ; c ut r c k h a i b ol i 2 4 5 t r n ht t h o t r a 9 4 n hg i , n i t u y n 3 9 1 t i nh a , p h t t r i nc h n gt r n h 5 8 n g o i l x l 4 3 , 5 6 5 , s d n g ng i n 5 7 2 m t h c h i n : s a uk h i t h o t k h i c h n h( ) 4 1 1 , t r c k h i b c v oc h n h( ) 4 1 1 t h c h i n : k i ms o t 1 1 7 ; i m 5 4 9 g i i p h pt pt h d c 1 2 e x i t ( ) 3 9 7 , 4 0 9 r r n g : d i nv i n 6 7 8 , C++ 1 6 7 ; c h ou p c a s t i n g 6 8 1 ; t k h a n g n c h nl o i c h u y n i t n g 5 3 4 m 1 5 4 ; k h i u 1 3 0 l yt h a , k h n g i uh n h 5 1 7 b i ut h c , p h c t p , v i uh n hq u t i 4 8 8 m r n gm t l ph c t r o n gq u t r n ht h a k 3 4 c h n gt r n hm r n g 6 3 3 e x t e r n 8 4 , 1 4 7 , 1 5 1 , 3 3 5 , 3 3 9 , 4 1 2 ; c o n s t 3 3 5 , 3 4 0 , l i nk t m C 4 4 2 b nn g o i : l i nk t 1 5 2 , 3 3 8 , 3 3 9 , 4 1 2 , t i l i ut h a mk h o , t r o n gq u t r n hl i nk t 2 2 8 v t v I n s e r t e r , q u t i c h oi o s t r e a ms 5 1 8 E x t r e me P r o g r a mmi n g( X P ) 6 1 , 6 1 5 , 7 7 9

F
n h m ys nx u t , m ut h i t k 7 1 2 s a i 1 5 8 , 1 6 3 , 2 4 6 , v t h c s , t r o n g i uk i n 1 1 7 ; b o o l , n gv s a i 1 3 1 f a nh m m r a , c h u y n i l o i h n ht n g 5 4 0 F i b o n a c c i 7 2 5 f i b o n a c c i ( ) 6 9 1 t pt i n : t i u 2 3 3 , 2 4 2 , 3 2 3 , m t c h c 2 4 8 ; c o n s t 3 3 5 ; k h n gg i a nt n 4 2 3 ; t n 7 4 9 , c v v i t 1 0 0 ; p h mv i 1 5 0 , 1 5 2 , 4 1 2 ; t n h 1 5 0 , 2 4 4 , 4 1 4 , n hn g h a c ut r c t r o n gm t t p t i nt i u 2 3 4 c , g l i 1 9 4 d uc h m n g : f l o a t 1 3 0 , 1 5 5 ; f l o a t . h 1 2 9 ; n hd n gn i b 1 8 9 , k c ht h c h t h n gp h nc ps 1 3 2 ; s 1 3 0 , 1 5 4 , n gv s a i 1 5 9 c h o : x c n hc c b i nt r o n gb i ut h c k i ms o t 1 4 5 ; v n g 1 0 6 , 1 2 1 ; v n gt r u yc p , c x c n ht r o n gb i uh i nk i ms o t 2 9 1 ; b i nc u c i t r o n g v n gl pf o r 2 9 2 n hd n g n hn g h a c o nt r 3 4 2v p h a t r c : k h a i 1 5 1 ; t i l i ut h a mk h o , n i t u y n 3 9 1 F o wl e r , Ma r t i n 4 5 , 5 8 , 7 7 9 mo n gma n hv n c s n g c p 2 7 6 p h nm n h , n g 2 2 5 , 5 6 7 mi np h c a h n g 5 4 9 mi np h ( ) 2 2 3 , 5 5 0, 5 5 3 , 5 5 5 , 5 6 9 t i l i ut h a mk h omi np h n g 4 5 1 n g i b n 2 6 3 , 5 5 4 , t u y nb c a m t l pn g i b nl n gn h a u 5 1 4 ; c h c n n gt o nc u 2 6 4 ; t i mv ok h n gg i a nt n 4 1 7 ; c h c n n gt h n hv i n 2 6 4 ; c ut r c l n g

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

308/320

08/10/2013

Suy ngh trong C + +, Vol 1

n h a u 2 6 6 ; c ut r c 2 6 4 f s t r e a m 1 0 0 c h c n n g 8 1 ; l pc s t r ut n gv t i n hk h i t c h c n n g o 6 4 6 ; t r u yc p 3 7 9 ; b s u n gt h mv om t t h i t k 2 8 0 ; t h mc h c n n g o m i t r o n gl pb t n g u n 6 5 2 ; ac h 1 9 8 , 3 9 1 ; l u n 1 3 8 ; c o n s t 3 4 4 ; c o n s t t h a mk h o 3 5 1 ; t h a mk h o 4 5 1 ; m n gc a c o nt r n 2 0 1 ; ml pr p n g nn g t or a , c h c n n gg i 4 5 6 ; c h c n n g og i 6 4 2 ; r n gb u c , c h om t c u c g i c h c n n g 6 3 1 , 6 4 1 , c t h 8 3 ; t h v i nC 1 1 6 ; i uh n hc u c g i ( ) 5 1 4 ; c u c g i t r nk h n g 3 7 2 , 3 7 7 , g i l c h ot c d n gp h 3 1 3 ; n hn g h ac h c n n gp h c t p 1 9 8 , x yd n g , h o t n gc a c c c h c n n g o b nt r o n g 6 6 4 ; t o 1 1 2 ; k h a i 1 1 6 , 2 4 5 , 3 1 3 , k h n gc nt h i t t r o n gC 2 2 8 ; y uc u 2 3 3 ; c p h p 8 2 ; n hn g h a 8 3 ; d a n hs c h i s t r n g , Cs ov i C ++ 1 1 4 , mr n gg i a od i nc h c n n g 3 3 0 ; t o nc u 2 3 4 ; b n 2 6 4, t r g i p , l pr p 4 5 7 ; n i t u y n 3 7 2 , 3 7 7 , 6 4 6 , c c t pt i nt i u 3 9 6 ; l p a p h n g( l p n hn g h a b nt r o n gm t c h c n n g ) 4 2 8 ; c h c n n gt h n hv i n 2 8 , 2 3 0 , g i i nt h o i , m t c h c n n gt h n hv i n 2 3 9 ; m t c h c n n gt h n hv i nt b nt r o n gm t h mt h n hv i n 2 3 4 ; c h c n n gc s n gc p 5 8 8 ; c o n s t 3 5 2 , 3 5 9 ; b n 2 6 4 , t h a k v c c c h c n n gt h n hv i nt n h 6 0 4 ; q u t i n h i uh n h 4 8 7 , l a c h n 2 3 4 , c c i t n g 5 1 5 ; q u t i 3 1 0 ; i uh n h 4 8 6 ; s d n gk k h a i , k h n gg i a nt n 4 2 1 ; t r n g 3 5 ; q u a c c i t n gt h a mc h i uv t mt h i 4 5 3 , c o nt r , x c n h 1 9 8 ; c h c n n gt h n hv i n 4 7 5 ; s d n gm t c o nt r h m 2 0 0 ; c h c n n g a h n hc u c g i 6 3 7 ; m u 1 1 3 ; t h u n o n hn g h a c h c n n g 6 5 1 ; n hn g h a l i t r o n gt h a k 5 8 8 ; g i t r t r v ; t h a mk h o 4 5 1 , t r v g i t r 1 1 5 ; l o i 5 9 7 ; t r n g 1 1 5 ; c h k 5 9 7 ; k h u n gn g nx pc h om t c u c g i c h c n n g 4 5 8 ; t n h , c c i t n gl pt r o n gc h c n n g 4 0 8 ; t h n hv i n 3 6 6 , 4 2 9 , 4 6 5 , c c i t n gb nt r o n gc h c n n g 4 3 7 , c c b i nb nt r o n gc h c n n g 4 0 6 ; m u 7 4 2 ; l o i 3 9 0 ; n hd a n hd u yn h t c h om i 3 1 0 ; b i nd a n hs c h i s 1 1 4 ; c h c n n g o 6 2 7 , 6 2 9 , x yd n g 6 6 2 ; t r n g 6 3 2 ; p i c t u r i n g 6 3 9

G
t h ug o mr c 4 2 , 5 6 6 t h u t t o nc h u n g 7 4 2 n h nv t h i t l pc c c h c n n g 3 8 1 n h n c ( ) 4 7 2 g e t l i n e ( ) v c h u i 5 6 2 ; t i o s t r e a ms t h v i n 1 0 0 t h yt i n h , R o b e r t 7 8 0t o nc u : c c h mb nb 2 6 4 ; c h c n n g 2 3 4 ; m i v x a , q u t i 5 6 8 ; x yd n g i t n g 4 1 0 ; i uh n h , q u t i 4 8 7 , p h ng i i p h mv i 2 5 3 ; p h t h u c k h i t ot n hc a c c i t n gt o nc u 4 3 2 ; b i n 1 4 7 G NUC++ 7 1 G o r l e n , K e i t h 6 9 4 g o t o 1 2 5 , 2 8 8 , 2 9 3 , k h n g a p h n g 2 8 8 l nh n : > 1 5 8 ; h o c b n g( >= ) 1 5 8 mb ok h i 2 9 4 , 5 4 8 n h nv i n , b a og m, t r nt p t i nt i u 7 5 7 h n gd n: i s i q u a 4 5 5 , C++l pt r n hh n gd n 7 6 0 , p h t t r i n i t n g 5 6

H
h a c k , e n u m 3 5 8 l px l 2 7 5 , 2 7 7 c m t 3 0 ; t h n hp h n 6 0 4 t pt i nt i u 8 5 , 1 1 6 , 1 2 9 , 2 3 3 , 2 4 2 , 3 2 3 , 3 3 5 , t c h c m 2 4 8 , s d n gt h c t h i c a C+ + 2 4 3 ; t i uc h u n n hd n g 2 4 6 ; t mq u a nt r n gc a v i c s d n gm t t pt i nt i u p h b i n 2 4 2 , b a og mb ov 2 4 6 ; n hn g h a n i t u y n 3 7 7 ; n i b l i nk t 4 1 2 ; n h i ub a og m 2 4 4 ; k h n gg i a nt n 4 2 3 ; t pt i nm i b a og m n hd n g 8 6 ; t h t b a og m 7 5 6 ; n hn g h a c ut r c t r o n gm t t p t i nt i u 2 3 4 ; m u 7 0 0 , 7 0 7 , s d n gc h t h 2 4 8 n g 4 2 , 2 2 3 , C n g 5 5 0 ; n n 2 2 5 , c c i t n gt or a 5 5 4 ; p h nm n h 2 2 5 , 5 6 7 , mb or n gt t c c c i t n g c t or a t r nh e a p 7 1 2 ; c p p h t b n h 5 4 9 , h t h n gv d ng i n 5 7 0 c h c n n gt r g i p , l pr p 4 5 7 1 5 4 h t h pl c p h n n : t nc h c n n gb nt r o n gm t c ut r c 2 3 0 ; t h c h i n 2 8 , 2 6 0 , 2 7 0 , 2 7 5 ; t n , t r o n gk h i t h a k 5 9 5 , t r o n gk h i q u t i 6 5 8 ; b i nt p h mv i b a o 2 9 2 h t h n gp h nc p , s i n g l y r o o t e d / o b j e c t b a s e d 6 7 2 , 6 9 4 k h i n i mc a o 4 8 n g nn g l pr pc pc a o 1 1 3 l pt r n hv i nt h c h 2 7 6 l a i : C++ , l a i n g nn g h n g i t n g , v n g i b n 2 6 9 , n g nn g l pt r n ho b j e c t o r i e n t e d 7

Ti

n hd a n h : d u yn h t c h om i c h c n n g 3 1 0 ; d u yn h t c h om i i t n g 2 3 8 T i uc h u nI E E Ec h os d uc h m n g 1 3 0 , 1 8 9 n u k h c 1 1 8 ; x c n hc c b i nb nt r o n g c i uk i n 1 4 5 ; t u y nb 1 6 4 ; b a y ut : 1 6 4 i f s t r e a m 1 0 0 , 6 0 6 t h c h i n 2 7 , 2 4 1 , v g i a od i n , t c h 2 9 , 2 6 1 , 2 7 1 , 3 8 0 ; n 2 8 , 2 6 0 , 2 7 0 , 2 7 5 , t h i g i a nb i nd c hc h 2 7 5 k i un g mc h u y n i 1 5 4 t r o n gc h c n n gn i t u y nt i c h 3 9 4 b a og m 8 5 ; b a og mb ov , t r o n gt pt i nt i u 2 4 6 , 7 5 7 , b a og m n hd n gm i 8 6 l o i c i mk t h u t k h n g y 2 6 5 , 2 7 7 t n g1 2 8 , 1 6 4 , v c c n h k h a i t h c l n gg i m 5 0 6 ; t n gv l i t k 1 8 0 ; q u t i t o nt ++ 4 9 3 g i a t n g : p h t t r i n 6 1 4 ; l pt r n h 6 1 4 d a n hs c h i s k h n gx c n h 1 1 4 l pc h m c : m n g , s d n g[ ] 1 0 5 , 1 8 3 ; k h n g 1 8 3 t h a k 3 1 , 5 8 4 , 5 8 6 , 6 1 5 , l a c h nt h n hp h ns ov i k t h a 6 0 4 ; s t h a k l p 6 1 7 ; k t h pt h n hp h nv t h a k 5 9 1 ; c o p y c o n s t r u c t o r 4 7 1 ; s 4 0 ; m r n gm t l ph c t r o n gt h i g i a n 3 4 ; m r n g 6 3 3 , c h c n n g n hn g h a l i 5 8 8 ; k h i 6 6 3 ; l m t 6 0 0 , 6 1 5 ; n h i u 5 8 6 , 6 1 3 , 6 2 1 , 6 7 3 , 6 9 5 ; t n n 6 5 8 ; i uh n hq u t i v t h a k 6 1 2 ; t x yd n g 6 6 5 ; t h a k r i n gt 6 0 9 ; t h a k b ov 6 1 1 ; t h a k c n g 5 8 7 ; h mt h n hv i n t n h 6 0 4 ; s u b t y p i n g 6 0 6 ; oc h c n n gc u c g i t r o n gh mh y 6 7 0 ; s ov i t h n hp h n 6 2 0 , 7 4 0 ; v t a b l e 6 5 2 k h i 2 2 7 , 3 5 6 , t n gh p 2 0 1 , 3 0 1 ; m n g ; y ut 3 0 1 ; k h n g 3 0 1 , c c t h n hv i nd l i uc o n s t 3 5 5 ; c o n s t t r o n gl p 3 5 3 ; x yd n g 2 8 5 ; d a n hs c hk h i t ox yd n g 3 5 3 , 5 8 9 , 6 6 4 , n hn g h a , n gt h i 2 9 0 ; c h ov n gl p 1 0 6 , 1 2 1 ; mb o 2 9 4 , 5 4 8 , t r o n gk h i t h a k 6 6 3 ; k h i t ov d nd pt r n n g 5 4 8 ; k h i t oc h om t b i nt n hc a m t b u i l t i nl o i 4 0 8 ; l i b i n g 7 0 4 ; i t n gk h i t ot h n hv i n 5 8 9 ; me mb e r wi s e 4 7 1 , 6 0 0 ; i t n gs d n g= 5 2 1 ; t n h ; m n g 4 2 5 ; c o n s t 3 5 6 ; p h t h u c 4 3 2 ; 4 2 5 t h n hv i n , k h n gk h i t ob i c c h l i n k i n g l o a d i n g 4 3 3 ; b i nv ot h i i mc a n hn g h a 1 3 0 ; v s b i t c o p y 4 6 0 t i m, b nv ok h n gg i a nt n 4 1 7 n i t u y n 3 9 4 , 6 6 2 ; l p n hn g h a 3 7 8 ; x yd n gh i uq u 6 6 3 ; x yd n g 3 9 2 ; t i n 3 9 3 , n hn g h a v c c t pt i nt i u 3 7 7 ; h y 3 9 2 , h i uq u 3 9 0 ; h i uq u 3 9 2 , c h c n n g 3 7 2 , 3 7 7 , 6 4 6 , c c t pt i nt i u 3 9 6 ; t i c h 3 9 4 ; h nc h 3 9 0 ; k h n gn i t u y n m ut h n hv i n n hn g h a c h c n n g 6 9 9 ; t n hg i 3 9 1 ; m u 7 0 7 t r o n gb n h l p 7 8 uv o : c l i n i 1 0 6 ; t i uc h u n 9 7 c h n( ) 1 0 4 I n s e r t e r v g i i n n , q u t i c h o i o s t r e a ms 5 1 8 t h h i nc a m t l ph c 2 4 i n s t a n t i a t i o n , m u 6 9 9 i n t 1 3 0 2 4 1 g i a od i n , g i a od i nl pc s 6 3 3 ; g i a od i np h b i n 6 4 7 ; n hl p 6 2 ; m r n gc h c n n gg i a od i n 3 3 0 ; c h om t i t n g 2 5 ; t h c h i n , t c h 2 9 , 2 6 1 , 2 7 1 , 3 8 0 ; n g c a m t m u 7 0 1 , n g i s d n g 5 1 n i b l i nk t 1 5 2 , 3 3 5 , 3 3 9 , 4 1 2 p h i nd c h 7 7 g i n o nd c hv t h n gx u y n( I S R ) 3 6 6 , 4 5 8 i o s t r e a ms 9 0 ; g e t ( ) 4 7 2 ; g e t l i n e ( ) 1 0 0 ; t o nc uq u t i m i v x a , t n gt c v i 5 7 2 ; h nc h c a 5 6 9 ; t h a ot c 9 6 ; q u t i < <v > > 5 1 8 , c v v i t c c t pt i n 1 0 0 , c uv o 9 7 ; s e t f ( ) 4 6 6 ; d yv i i o s t r e a ms 1 0 0 ; c h i ur n g( ) 4 6 6 l a : t h a k 6 0 4 , 6 1 5 ; v s l n h m t m i q u a nh 3 5 T i uc h u nI S O : C 1 4 ; n g u y nt c c b n 1 1 2 ; C++ 1 4 ; t pt i nt i u 2 4 5 i s t r e a m, q u t i n h i uh n h> > 5 2 0 l p i l pl i , t r o n gp h t t r i nc h n gt r n h 5 7 l p 5 0 9 , 7 1 9 , 7 3 0 ; c o n t a i n e r 6 9 0 ; n gl c 7 3 8 ; l n gl p 5 1 2 ; T i uc h u nC++T h v i n 7 2 4

J
J a c o b s e n , I v a r 7 7 9 J a v a 3 , 1 5 , 6 5 , 7 1 , 7 4 , 5 8 8 , 6 4 5 , 6 9 4 , 8 1 6

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

309/320

08/10/2013

Suy ngh trong C + +, Vol 1

K
K&RC 1 1 2 t k h a : #x c n h 2 4 5 , 3 3 5 ; #e n d i f 2 4 5 , 7 5 7 ; #i f d e f 2 4 5 ; #b a og m 8 5 ; & 1 3 4 ; ( ) , C h c n n g i uh n hc u c g i q u t i 5 1 4 * 1 3 6 , 1 6 4 ; . * 4 7 4 ; : : 2 3 2 , 2 5 3 ; ' . ' ( i uh n hl a c h nt h n hv i n ) 2 3 7 ; =1 5 6 ; q u t i 5 0 5 , 5 2 1 ; > 1 6 4 ; q u t i 5 0 9 ; c ut r c l a c h nt h n hv i nt h n gq u a c o nt r 1 7 8 ; >* 4 7 4 ; q u t i 5 1 4 ; a s mc h on i n g nn g l pr pd n g 1 7 3 ; t n g 1 4 9 , 4 1 4 ; b o o l 1 2 5 ; n gv s a i 1 3 1 , p h v 1 2 2 ; t r n gh p 1 2 4 ; b t 5 7 2 ; c h a r 9 6 , 1 3 0 , 1 3 2 ; l p2 5 , 3 1 , 2 7 1 ; c o n s t 1 5 3 , 3 3 3 , 4 5 3 ; c o n s t _ c a s t 1 7 0 , t i pt c 1 2 2 ; m c n h 1 2 4 ; x a 4 2 , 2 2 3 ; l m 1 2 0 ; i 1 3 0 , 1 3 2 ; d y n a mi c _ c a s t 6 7 8 ; k h c 1 1 8 ; e n u m 1 7 9 , 3 5 8 ; u n t a g g e d 3 2 0 ; r r n g 5 3 4 ; e x t e r n 8 4 , 1 4 7 , 1 5 1 , 3 3 5 , 3 3 9 , 4 1 2 , t h a yt h c h ol i nk t 4 4 2 ; s a i 1 1 7 , 1 3 1 ; f l o a t 1 3 0 , 1 3 2 ; c h o 1 0 6 , 1 2 1 ; b n 2 6 3 ; g o t o 1 2 5 , 2 8 8 , 2 9 3 , n u 1 1 8 ; n i t u y n 3 9 4 , 6 6 2 ; i n t 1 3 0 ; d i 1 3 2 ; d i i 1 3 2 ; p h a od i ( k h n g h pp h p ) 1 3 2 ; c o t h t h a y i 3 6 3 ; t n m i n k h n g g i a n 9 1 , 4 1 4 , 7 5 7 ; m i 4 2 , 2 2 3 ; i u h n h 4 8 6 ; t i n 2 6 2 , 2 7 0 , 3 8 0 , 6 1 0 , b ov 2 6 3 , 2 7 0 , 6 1 0 , c n gc h n g 2 6 1 ; n gk 1 4 9 , 4 1 4 ; r e i n t e r p r e t _ c a s t 1 7 1 ; t r l i 1 1 5 ; n g n 1 3 2 ; k 1 3 2 ; k c h a r 1 3 2 ; s i z e o f 1 3 2 , 1 7 2 , 5 8 7 , v i c ut r c 2 4 0 ; t n h 1 4 9 , 3 5 0 , 4 0 6 ; s t a t i c _ c a s t 1 6 9 , 6 7 9 ; c ut r c 1 7 5 , 2 6 0 ; c h u y n i 1 2 3 , 2 9 3 ; m u 6 8 9 , 6 9 6 ; n y 2 3 4 , 2 8 6 , 3 6 3 , 3 8 0 , 4 2 9 ; n m 5 7 2 ; t h t 1 1 7 , 1 3 1 , c g n g 5 7 2 ; t y p e d e f 1 7 4 ; t y p e i d 6 8 0 ; o n1 8 1 , 3 1 8 ; v d a n h 3 2 0 ; u n s i g n e d 1 3 2 ; s d n g 9 2 , 4 1 7 ; o 3 9 , 5 9 5 , 6 2 7 , 6 3 2 , 6 3 7 , 6 4 6 , 6 6 5 ; t r n g 1 1 4 v o i d&( b t h pp h p ) 1 4 3 ; v o i d* 1 4 2 , 4 5 0 ; b i n n g 1 5 5 , t r o n gk h i 1 0 1 , 1 1 9 K o e n i g , A n d r e w 3 7 6 , 7 6 2 , 7 7 8

L
L a j o i e , J o s e e 7 7 6 L a k o s , J o h n 7 5 6 , 7 7 8n g nn g : C++l m t n g nn g m n hm n hm yh n 4 5 0 , C++ , n g nn g l a i o b j e c t o r i e n t e d , v n g i b n 2 6 9 ; l a i t h e o n hh n g i t n gn g nn g l pt r n h 7 c c c h n gt r n hl n , t or a 7 8 v oc u i r n gb u c 3 8 , 6 3 1 , t h c h i n 6 3 6 b t r , i t n g , v k i ms o t t r u yc p 2 6 9 7 0 4 l i b i n gk h i t oh n g ug c hd i , t r n n hd a n h ( D p h n g ) 3 8 1 r r , b n h 2 2 4 , 3 0 0 t r i c a i uh n h< < 1 6 0 t h n : < 1 5 8 ; h o c b n g< =1 5 8 t h v i n 7 6 , 8 0 , 8 8 , 2 1 8 , C 2 1 9 , m 7 8 ; t oc a r i n gb nv i c c t h v i n 1 1 7 ; v n v i c c t r n hb i nd c hk h c n h a u 3 1 2 ; c h u nCc h c n n g , h yb ( ) 4 0 9 ; a t e x i t ( ) 4 0 9 ; e x i t ( ) 4 0 9 i : c h ob i nv n gl p 2 9 2 ; i t n g4 2 , 5 4 7 , c c i t n gt mt h i 4 6 8 1 2 9 l i mi t s . h l i nk t 1 5 2 , 4 0 6 ; t h a yt h l i nk t c i mk t h u t 4 4 2 ; k i ms o t 4 1 2 ; b nn g o i 3 3 8 , 3 3 9 , 4 1 2 ; n i b 3 3 5 , 3 3 9 , 4 1 2 , k h n gc m i l i nk t 1 5 3 , 4 1 2 , l o i a nt o n 3 1 3 d a n hs c hl i nk t 2 4 8 , 2 7 5 , 2 9 8 k t n i 7 8 , 7 9 , 8 7 , v a c h m 2 4 4 ; t i l i ut h a mk h ob nn g o i 2 2 8 ; i t n gt pt i n 8 8 ; t r c e mp t i n gm t c h c n n gt h v i n 8 9 ; t h v i nt mk i m 8 8 , 1 1 7 ; c h a c g i i q u y t t i l i ut h a mk h o 8 8 L i p p ma n , S t a n l e y 7 7 6d a n hs c h : x yd n gk h i t o 3 5 3 , 5 8 9 ; l i nk t 2 4 8 , 2 7 5 , 2 9 8 L i s t e r , T i mo t h y 7 8 1 a p h n g : m n g 1 8 6 ; l p 4 2 8 ; i t n gt n h 4 1 0 ; b i n 1 3 8 , 1 4 9 l o g a r i t 4 6 6 h pl : v & & 1 6 6 ; c o n s t 3 6 2 ; r r n gt r nb i t v k h a i t h c h pl 1 7 3 ; k h n g ! 1 6 3 ; k h a i t h c 1 5 8 , 5 0 5 , h o c || 1 6 6 d i 1 3 2 , 1 3 5 d i i 1 3 2 , 1 5 5 l o n g j mp( ) 2 8 8 v n gl p : f o r 1 0 6 ; v n gt r u yc p , c x c n ht r o n gb i uh i n k i ms o t 2 9 1 ; i b i nt r o n gc h ov n g 2 9 2 , t r o n gk h i 1 0 1 T n hy u , T o m 7 8 1 g i t r t r i 1 5 6 , 3 4 6 , 6 9 8

M
h n gd nm y 7 6v m : l l u n 3 7 4 ; ma k e f i l e 2 0 5 ; t i nx l 1 5 8 , 1 9 2 , 3 7 2 ; ma c r ov i n h i ut h a ms , t h a yv m u 6 9 6 ; k h n ga nt o n 3 9 9 ; t o r a c c l p 5 9 4 c o ns ma t h u t , t r n h 3 3 4 ma i n( ) : h n ht h c c b n 9 3 ; m t h c h i n s a uk h i t h o t k h i 4 1 1 ; m t h c h i nt r c k h i v o 4 1 1 b ot r , c h n gt r n h 5 8 l m 2 0 2 ; p h t h u c 2 0 4 ; ma c r o 2 0 5 ; q u y n hh ut 2 0 5 ; h ut 2 0 6 ma k e f i l e 2 0 3 , 7 5 0 ma l l o c ( ) * 2 2 3 , 5 5 0 , 5 5 2 , 5 5 4 , 5 6 9 , h n hv i , k h n gx c n ht r o n gt h i g i a n 5 5 5 t r n g i q u nl 7 1 ma n g l i n g , t n 2 3 0 , 2 3 1 , 2 3 7 , v q u t i 3 1 1 n h k h a i t h c t o nh c 1 5 6Ma t s o n , K r i s C . 1 2 6t h n hv i n : x c n hl ut r c h oc c t h n hv i nd l i ut n h 4 2 4 ; k h i c o n s t t h n hv i nd l i u 3 5 5 ; c h c n n gt h n hv i n 2 8 , 2 3 0 , g i i nt h o i 2 3 9 ; g i m t c h c n n gt h n hv i nt b nt r o n gm t h mt h n hv i n 2 3 4 ; c o n s t 3 5 2 , 3 5 9 , b nt h n hv i n c h c n n gt r n hb i nd c ht n gh p 6 1 9 ; b n 2 6 4 ; n o n i n l i n e m ut h n hv i n n hn g h a c h c n n g 6 9 9 ; k i ut r 5 9 7 , l ac h n 2 3 4 ; c h k 5 9 7 ; t n h 3 6 6 , 4 2 9 , 4 6 5 ; v t h ak 6 0 4 ; 3 0 i t n g ; i t n gk h i t o 5 8 9 ; q u t i n h i uh n ht h n hv i n 4 8 7 ; c o nt r t i c c t h n hv i n 4 7 3 ; i uh n h l a c h n 2 3 7 ; t h n hv i nd l i ut n ht r o n gm t l ph c 4 2 3 ; s ov i t h n hv i nk h n g i uh n h 5 1 8 me mb e r wi s e : c h u y nn h n g 5 3 2 , 6 0 0 ; c o n s t 3 6 2 ; k h i 4 7 1 , 6 0 0 me mc p y( ) 5 6 0 ; t i uc h u nc h c n n gt h v i nC 3 2 6 b n h 1 3 3 ; p h nb v h i uq u 5 6 6 ; c pp h t b n h n g 2 2 3 , 5 4 8 ; r r 2 2 4 , 3 0 0 , v i c t mk i mv i q u t i m i v x a 5 7 3 , t x a v o i d* 5 5 7 , q u nl , v d v 3 2 4 ; t n ht h a m k h o 5 2 6 , b n h q u nl c h i p h 5 5 4 ; c h c ( R O M) 3 6 4 , h t h n gp h nb l ut r ng i n 5 7 0 me ms e t ( ) * 2 6 9 , 3 2 6 , 3 5 6 , 5 6 0 c v n : v ot o 7 1 , 7 3 ; t v n , t v n , t h i t k v wa l k t h r o u g h s m t Mi n d V i e w 1 6 t i nn h n ,g i 2 5 , 2 3 9 , 6 3 6 p h n gp h pl u n , p h nt c hv t h i t k 4 4 Me y e r s , S c o t t 2 8 , 7 6 0 , 7 7 8 Mi n d V i e w: c n gt h c h n hh i t h o ot o 1 6 , h i t h o o n C D R O M 1 6 k c ht h c t i t h i uc a m t c ut r c 2 4 1 t u y nb n h i mv 4 7s a i l m, v t h i t k 2 7 9m u n( %) 1 5 6Mo o , B a r b a r a 7 7 8 Mo r t e n s e n , O we n 4 7 7 l pt r n hmu l t i p a r a d i g m 2 4 n h i u : p h i 6 7 5 , b a og mc c t pt i nt i u 2 4 4 , t h a k 5 8 6 , 6 1 3 , 6 2 1 , 6 7 3 , 6 9 5 , n h i uv n k k h a i 2 4 4 p h pn h n( * ) 1 5 6 a n h i mv d b a yh i 3 6 5 n h i u c c h l a c h n 1 2 4 Mu r r a y , R o b 5 2 0 , 7 6 0 c o t h t h a y i 3 6 3 ; p h pt o n s o v i l o g i c c o n s t 3 6 2 c h n g t b i n 3 8 0

N
t n : c u c n g 2 2 9 ; v a c h m, t r o n gC 6 8 ; t r a n gt r 2 3 0 , 2 3 1 , 2 3 7 , 4 4 2 , k h n gc t i uc h u nc h o 3 1 2 , q u t i v 3 1 1 ; t pt i n 7 4 9 ; n , t r o n gk h i t h a k 5 9 5 ; ma n g l i n g 2 3 0 , 2 3 1 , 2 3 7 ; v q u t i 3 1 1 t nl i nt c 1 5 3 t nmi nk h n gg i a n 9 1 , 4 1 4 , 7 5 7 ; r n gc a 4 1 5 ; m h 4 2 0 ; t i pt c 4 1 5 ; t pt i nt i u 3 9 9 ; t i mc a b nb 4 1 7 ; c p nt nt r o n g 4 1 7 ; t nd u yn h t k h n gg i a nc h oc c c h c n n gt r o n gC 2 2 9 ; t i uc h u n 9 2 ; v d a n h 4 1 6 ; s d n g 4 1 7 ; k h a i 4 2 1 v q u t i 4 2 2 ; c h t h 4 1 8 , v t pt i nt i u 2 4 7 t t nc h oc c n h x yd n g 2 8 5 c h u y n i t h uh p 1 7 0 1 9 8 ND E B U G k h n gc nb i nd c hl i 2 7 6 l n gn h a u : l p 4 2 8 ; c ut r c b n 2 6 6 ; l pl p 5 1 2 , 7 2 1 ; p h mv i 1 4 4 ; c ut r c 2 4 8 m i 1 6 4 , 2 2 3 , v x a c h om n g 5 6 3 ; m n gc a c o nt r 5 5 8 ; x a v c o n t a i n e r 6 9 2 ; t k h a 4 2 ; n e we x p r e s s i o n 2 2 3 , 5 5 2 , 5 6 6 , m i x l 5 6 5 ; i uh n h m i 5 5 2 ; x yd n g , b n h k i t s c 5 7 6 ; l ut r m t m i 5 6 5 ; v t r c t 5 7 7 ; q u t i , c t h c n h i u i s 5 7 7 ; m i v x a 5 6 6 ; c h om t l ph c 5 7 0 ; c h om n g 5 7 3 ; t o nc u

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

310/320

08/10/2013

Suy ngh trong C + +, Vol 1

5 6 8 x u n gd n g 9 4 k h n gl i nk t 1 5 3 , 4 1 2 g o t ok h n g a p h n g 2 8 8 k h n g : B i t wi s e 1 5 9 , t n g n g= 1 5 8 ; h pl ! k h n g ! 1 7 3 n o t _ e q , ! =( l o g i c k h n gt n g n g ) 1 7 3 s c t h i , v q u t i 3 1 0 t i l i ut h a mk h oNU L L 4 5 1 , 4 7 9 s , c h u y n i s t c h a r * 1 8 8

O
i t n g2 3 , 7 9 , a c h c a 2 6 5 ; h mt h n hv i nh n g 3 5 9 ; t or a m t i t n gm i t m t i t n gh i n 4 6 2 ; t or a t r nh e a p 5 5 4 ; n hn g h a c a 2 3 8 ; i mx c n h 2 8 5 ; p h h yt n h 4 1 0 , i t n gs n gt on n g n g 4 2 , 7 3 8 ; t pt i n 2 2 8 ; t r t t t r o n gl i nk t 8 8 ; n mg i a i o nc a i t n g t h i t k 5 4 , c c i t n gc h c n n g 5 1 5 ; x yd n gt o nc u 4 1 0 ; h n gd n p h t t r i n i t n g 5 6 ; g i a od i n 2 5 ; b t r , v k i ms o t t r u yc p 2 6 9 ; i c a m t i t n g 4 2 , 5 4 7 ; a p h n gt n h 4 1 0 ; t h n hv i n 3 0 ; m u n 7 9 ; d a t r n i t n g 2 3 8 , d a t r n i t n gC++ 6 2 8 ; b n n g o i 1 3 9 ; i q u a g i t r 4 6 2 ; i q u a v q u a yt r l i c c i t n gl n 4 5 7 ; p h mv i , i r a n g o i 1 4 3 , k c ht h c 5 5 4 ; b u c p h i k h c k h n g 6 3 9 ; c t 6 5 0 , 6 5 5 ; t n h , c c i t n gl pt r o n gc h c n n g 4 0 8 , 4 3 7 ; p h t h u c k h i t o 4 3 2 ; t mt h i 3 4 7 , 4 5 3 , 4 6 8 , 5 3 5 , a c h d u yn h t , m i i t n g 2 4 1 h t h n gc pb c o b j e c t b a s e d / s i n g l y r o o t e d 6 7 2 , 6 9 4 i t n g : p h nt c hv t h i t k 4 4 ; k h i n i mc b nc a l pt r n hh n g i t n g( O O P ) 2 2 ; C++ , l a i n g nn g h n g i t n g , v n g i b n 2 6 9 , n g nn g l pt r n hh n g i t n gl a i 7 t r n g i , q u nl 7 1b t p h n 1 5 4 o f f b y m t t r o n gn h n gl i 3 0 1 o f s t r e a m 1 0 0 , 5 9 4 , n h l m t i t n gt n h 4 1 1 m t n hn g h a q u yt c 8 2 , 2 4 4 n g i i uh n hb s u n g 1 5 9 O O P 2 7 1 , p h nt c hv t h i t k 4 4 ; c i mc b n 2 4 ; k h i n i mc b nc a l pt r n hh n g i t n g 2 2 ; S i mu l a n g nn g l pt r n h 2 5 ; k h n n g t h a yt h 2 4 ; t mt t 2 3 9 i uh n h 1 5 6 ; & 1 3 4 ; ( ) , c h c n n gg i 5 1 4 * 1 3 6 , 7 2 7 , 7 3 0 ; : b c b a n u k h c 1 6 4 ; [ ] 5 0 8 , 5 5 9 , 6 9 8 ; ++ 4 9 3 ; < <q u t i s d n gv i o s t r e a m 5 5 4 ; =5 0 5 , n h m t t i nc h c n n g 5 3 3 ; t or a t n g 5 3 2 ; h n hv i c a 5 2 2 ; k h n gt n g c h n g 6 0 0 ; me mb e r wi s e n h n g 6 0 0 ; t i n 7 0 9 ; s ov i s a oc h px yd n g 5 2 1 ; >c o nt r t h n g mi n h 5 0 9 ; >* c o nt r t h n hv i n 5 1 4 ; > >v i o s t r e a ms 1 0 6 ; c h u y nn h n g 5 0 5 ; t n gt h n gd ++ 1 0 6 ; n h p h n , c c n h k h a i t h c 1 6 0 ; q u t i 4 8 7 ; v d q u t i 4 9 3 ; B i t wi s e 1 5 9 ; h n hv i b o o l c x yd n gv i c c n h k h a i t h c 1 3 1 ; C&C++ 1 2 7 ; c a s t i n g1 6 6 ; l a c h ng i a c c t h n h v i nv q u t i k h n gp h i t h n hv i n , h n gd n 5 2 0 ; d up h y 1 6 5 , 5 0 8 ; b i ut h c p h c t pv i n h i uh n hq u t i 4 8 8 ; r r n gt r nb i t v k h a i t h c h pl 1 7 3 ; f a nh m m t r o n gl o i c h u y n i t n g 5 4 0 ; t o nc u ; q u t i 4 8 7 , p h ng i i p h mv i : : 2 5 3 ; t n g++v g i mb t 5 0 6 ; h pl 1 5 8 , 5 0 5 , l a c h nt h n hv i n 2 3 7 ; t h n hv i ns ov i k h n gt h n hv i n 5 1 8 ; m i 5 5 2 ; l ut r m t m i 5 6 5 ; m i t h h i n 5 5 2 ; v t r c t 5 7 7 , k h n gc l yt h a 5 1 7 , k h n gc n g i s d n gx c n h 5 1 7 ; n h n g b s u n g 1 5 9 ; k h a i t h c b nc t h k h n gq u t i 5 1 7 ; q u t i 9 1 , 4 5 0 , 4 8 5 , 7 3 2 ; [ ] 5 1 9 ; i s v g i t r t r l i 5 0 5 ; k i mt r a t p h n 5 0 5 ; t h a k 6 1 2 ; c h c n n gt h n hv i n 4 8 7 , c c n h k h a i t h c c t h c q u t i 4 8 8 ; p h nx 5 3 6 ; t r l i l o i 4 8 8 ; c h c n n g o 6 7 5 ; c mb y 1 6 6 ; p o s t f i xi n c r e me n t v d e c r e me n t 4 9 3 ; ut i n 1 2 7 ; t i nt t n g v l n gg i m 4 9 3 ; t i nx l i uh n hs t r i n g i z e # 1 9 6 ; q u a nh 1 5 8 , p h ng i i p h mv i : : 2 3 2 , 2 5 3 , 4 2 9 , v k h n gg i a nt n 4 1 7 ; g i c h c n n gc s n gc p 5 8 8 ; t h a y i 1 6 0 ; s i z e o f 1 7 2 ; c h u y n i l o i h n hq u t i 5 3 5 ; n g u y np h n 1 5 9 , 1 6 3 ; q u t i 4 8 7 ; v d q u t i 4 8 9 ; b t t h n gq u t i 5 0 8 t i uh a : i n l i n e s 3 7 9 ; t r l i g i t r t i uh a 5 0 7 t i uh a : t o nc u 7 9 ; p e e p h o l e 7 9 h o c : |B i t wi s e 1 5 9 ; ||h pl 1 5 8 , 1 6 6 , 1 7 3 o r _ e q , |=( b i t wi s e h o c p h nc n g ) 1 7 3 : t r u yc ps p e c i f i e r s 2 6 3 ; x yd n gv h yc u c g i 5 9 2 ; x yd n g c u c g i 6 6 3 t c h c , m 2 4 8 ; t pt i nt i u 2 4 4 o s t r e a m 3 2 7 ; q u t i t o nt < < 5 2 0 , 5 5 4 ur a , t i uc h u n 9 0 i t n gb nn g o i 1 3 9 t r n : m l pr pn g nn g t or a b i m t c h c n n g o 6 4 2 ; c h c n n gg i 3 7 2 , 3 7 7 , q u nl b n h 5 5 4 , k c ht h c t r nc c c h c n n g o 6 3 7 q u t i 9 5 ; < <v > >c h oi o s t r e a ms 5 1 8 ; c h u y nn h n g 5 2 1 ; l a c h ng i a c c t h n hv i nv k h n gt h n hv i n , h n gd n 5 2 0 ; x yd n g 3 1 9 ; i s m c n h , s k h c b i t v i q u t i 3 2 4 ; q u t r a t r o n gt n gc h u y n i l o i h n h 5 4 0 ; c h c n n g 3 1 0 ; c h c n n g i uh n hc u c g i ( ) 5 1 4 ; k h a i t h c t o nc u , s ov i c c n h k h a i t h c t h n hv i n 5 3 6 , k h n gg i a nt n , s d n gk h a i 4 2 1 m i v x a 5 6 6 ; m i v x a ; m n g 5 7 3 ; l p 5 7 0 ; t o nc u 5 6 8 ; t r ng i t r t r l i 3 1 2 ; i uh n h 9 1 ; [ ] 5 1 9 ; ++ 4 9 3 ; < < s d n gv i o s t r e a m 5 5 4 ; > i uh n ht h n gmi n hc o nt r 5 0 9 ; >* c o nt r n t h n hv i n 5 1 4 , t h a k 6 1 2 ; c c n h k h a i t h c c t h c q u t i 4 8 8 ; k h a i t h c m k h n gt h c q u t i 5 1 7 ; q u t i p h nx 5 3 6 ; l o i c h u y n i 5 3 5 ; c h c n n g o 6 7 5 ; i uh n h 4 5 0 ; t r n g , k h c b i t 6 5 8 ; c mb yt n gc h u y n i l o i h n h 5 3 9 t r n g 6 3 2 ; v q u t i 6 5 8 ; t r o n gq u t r n ht h a k 5 9 5 ; c h c n n g 3 5 t n gq u a n , c h n g 7 s h u5 9 9 , 7 0 9 , 7 1 3 , 7 3 0 , v c o n t a i n e r 2 9 9 , 5 5 5 , 6 7 1 , 7 0 5

P
l pt r n hc p 6 3 t l i t , p h nt c h 4 5 p h nt c h 7 9 ; c yp h nt c hc p h p 7 9 p a s s b y t h a mk h o 1 4 0 p a s s b y g i t r 1 3 7 , 4 6 2 , v m n g 1 8 6 q u a : v t r v ; a c h 3 4 4 , a c h , v i c o n s t 3 4 9 ; g i t r , C 4 5 5 , c c i t n gl n 4 5 7 ; g i t r 3 4 4 , , 6 5 7 ; t mt h i 3 5 1 mh n h , t h i t k 5 9 , 7 0 ; l p 7 1 9 v n h i us u t 7 2 P e r l 8 9 c mb y : t n gc h u y n i l o i h n h 5 3 9 ; C , C c n h k h a i t h c 1 6 6 ; t i nx l 3 7 2 i s g i c h 3 2 3 v t r ,v t r i uh n hm i s p e c i f i e r 5 7 7 l pk h o c h , p h t t r i np h nm m 4 7 P l a u g e r , P J 7 8 0 Ma i , T o m 3 9 4 , 7 5 1 , 7 6 0 i m, t r n ht 2 8 6 , 2 9 3 c o nt r 1 3 6 , 1 5 3 , 1 6 4 , 2 7 6 , 4 5 0 , l pl u nq u a , s o v i t i l i ut h a mk h o 3 5 1 ; s h c 1 9 0 ; m n g 1 8 4 , l mc h om t c i n h nc o nt r n h m t m n g 5 6 4 ; c a c o nt r 1 8 7 ; b i t p , c o n s t v k h n gc o n s t 3 4 3 ; l pc h a , v q u t i t o nt = 5 2 4 ; c o n s t 1 7 1 , 3 4 0 , n hn g h a n hd n g 3 4 2 ; g i i t h i u 1 3 3 ; t h n hv i n , c o nt r n 4 7 3 ; c h c n n g 4 7 5 ; q u t i 5 1 4 ; c o nt r &t h a mk h ou p c a s t i n g 6 2 2 ; c o nt r nc h c n n g ; m n g 2 0 1 ; x c n h 1 9 8 ; s d n g 2 0 0 ; t h a mc h i u nc o nt r 4 5 4 , t i l i ut h a mk h o , s k h c b i t 1 4 0 ; c o nt r t h n gmi n h 7 3 0 ; d un g o c v u n g 1 8 5 ; c h n g 2 9 4 ; c ut r c , l a c h nt h n hv i nv i > 1 7 8 ; u p c a s t i n g 6 3 1 ; t r n g 4 5 0 , 5 5 5 , 5 5 9 , 5 6 2 ; v o i d* 1 4 2 ; t i l i ut h a mk h o , s ov i k h i s a i i t n gb nn g o i 4 7 2 a h n h 3 7 , 5 9 7 , 6 2 7 , 6 8 1 , 7 1 3 , 7 4 1 ; c o n t a i n e r 7 3 8 ; c h c n n g a h n hc u c g i 6 3 7 ; v s d o wn c a s t i n g 6 7 8 h u 7 5 8 b i l n gg i m1 2 8 p o s t f i x t o nt t n gv l n gg i m 4 9 3 s a ut n g++1 2 8 ut i n , i uh n h 1 2 7 7 5 8 i uk i nt i nq u y t t r c k h i l n gg i m1 2 8 t i nt t o nt t n gv l n gg i m 4 9 3 t r c t n g++1 2 8 t i nx l 7 9 , 8 5 , 1 5 3 ; #d e f i n e , #i f d e f v #e n d i f 2 4 5 ; v P h mv i 3 7 6 ; g l i c 1 9 4 ; v m 1 5 8 , 1 9 2 , 3 7 2 , k h n ga nt o n 3 9 9 ; c mb y 3 7 2 ; v n 3 7 2 ; n i c h u i 3 9 5 ; s t r i n g i z i n g 3 9 5 ; m t h n gb od n 3 9 5 , g i t r t h a yt h 3 3 4 i uk i nt i nq u y t , c u ns c hn y 2 2 p h n gl o i c h u y n i t n g v i t k h a r r n g 5 3 4 p r i n t f ( ) 5 6 9 t i n 2 9 , 2 6 2 , 2 7 0 , 3 7 7 , 3 8 0 , 6 1 0 , s a oc h p x yd n g 4 7 1 ; t h a k t i n 6 0 9 v n k h n gg i a n 2 3 3 6 5 q u t r n hs nx u t , v c u ns c ht h i t k 1 8 c h n gt r n h : b ot r 5 8 ; c ut r c k h i v i t m 9 3 l pt r n hv i n , k h c hh n g 2 8 , 2 6 0 l pt r n h : c c k h i n i mc b nc a l pt r n ho b j e c t o r i e n t e d( O O P ) 2 2 ; E x t r e me P r o g r a mmi n g( X P ) 6 1 , 6 1 5 , 7 7 9 , t r o n g l n 6 8 ; q u t r n hg i a t n g 6 1 4 ; mu l t i p a r a d i g m 2 4 ; c p 6 3 c h n gt r n h , g i k h c 9 8 c n gc x yd n gd n 2 0 3 2 2 8 k h u y nm i , l o i t n g c h u y n i 5 3 3 b ov 2 9 , 2 6 3 , 2 7 0 , 6 1 0 , t h a k 6 1 1 m u : c h c n n g 1 1 3 ; n h a n h 5 9 p s e u d o c o n s t r u c t o r , c h ox yd n gt r o n gc c l o i 3 8 1 , 5 6 2 , 5 8 9 c n g 2 9 , 2 6 1 ; t h a k 5 8 7 , h i t h o 5 t i n hk h i t : l pc s t r ut n gv c h c n n g ot i n hk h i t 6 4 6 , C++ , n g nn g l a i o b j e c t o r i e n t e d , v n g i b n 2 6 9 ; t h a yt h 3 5 ; d e s t r u c t o r o 6 6 8 ; n hn g h a c h c n n g o 6 5 1 p u s h _ b a c k( ) , c h ov e c t o r 1 0 4 yx u n g n g 2 7 5 p u t c ( ) 3 7 6 p u t s ( ) 5 6 9 P y t h o n 5 4 , 7 4 , 7 7 , 7 8 , 8 9 , 6 4 5 , 7 0 2

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

311/320

08/10/2013

Suy ngh trong C + +, Vol 1

Q
v n gl o i , c v 3 6 6

R
p h mv i , s d n gb n gc o n t a i n e r v v n gl pt r o n g T i uc h u nC++T h v i n 7 2 8 n h a n hc h n gt om u 5 9 c : c c t pt i n 1 0 0 ; uv ob n gl i n i 1 0 6 b n h c h c ( R O M) 3 6 4 r e a l l o c ( ) * 2 2 3 , 5 5 0 , 5 5 4 b i nd c hl i c h n gt r n hCt r o n gC++ 2 3 6 q u y 1 2 6 , 4 5 9 , v c c c h c n n gn i t u y n 3 9 2 k k h a i l i c a c c l ph c , n g nc h n 2 4 4 x c n hl i t r o n gq u t r n ht h a k 5 9 5 2 7 6 g i mb i nd c hl i t i n gk d t h i 4 5 8 r e f a c t o r i n g 5 8 t i l i u t h a mk h o 1 5 3 , 4 5 0 , 4 5 1 , C++ 1 4 0 ; c o n s t 3 4 5 , 4 5 3 , v i uh n hq u t i 5 0 5 ; c h ol pl u n i q u a 3 5 1 ; h i uq u 4 5 5 ; b nn g o i , t r o n gq u t r n hl i nk t 2 2 8 ; mi np h n g 4 5 1 ; c h c n n g 4 5 2 ; NU L L 4 5 1 , 4 7 9 , i q u a c o n s t 4 7 3 ; c o nt r &t i l i ut h a mk h ou p c a s t i n g 6 2 2 ; c o nt r , t h a mc h i u nm t c o nt r 4 5 4 ; t h a mk h o m 5 2 6 , 7 1 4 ; q u yt c 4 5 1 ; u p c a s t i n g 6 3 0 v o i dt h a mc h i u( b t h pp h p ) 1 4 3 ; s ov i c o nt r k h i s a i i t n gb nn g o i 4 7 2 p h nx , t r o n g i uh n hq u t i 5 3 6 n gk 4 1 4 ; b i n 1 4 9 r e i n t e r p r e t _ c a s t 1 7 1 n h k h a i t h c q u a nh 1 5 8 b oc os a i s t t r o n gc u ns c h 1 6 y u c u , t r o n gO O P 2 5 y uc u( ) * 6 9 8 , 7 1 1 , 7 5 7 r e q u i r e . h 2 3 7 , 2 5 2 , 7 5 6 , 7 5 7 , n hn g h a c h c n n g 3 9 6 r e q u i r e A r g s ( ) , t r e q u i r e . h 2 5 2 y uc up h nt c h 4 8 p h ng i i , p h mv i : t o nc u 2 5 3 ; l n gn h a u c ut r c 2 7 8 ; i uh n h: : 2 3 2 g i i q u y t c c t i l i ut h a mk h o 8 0 t r l i : g i t r 4 5 0 ; g i t r n h h n g , v i uh n hq u t i 5 0 7 ; c o n s t g i t r 3 4 5 ; g i t r t r v x yd n g 2 8 7 ; h i u q u k h i t ov t r v i t n g 5 0 7 ; g i t r t r l i c h c n n g , t i l i ut h a mk h o 4 5 1 ; t k h a 1 1 5 ; i uh n h ; q u t i t r l i l o i 4 8 8 ; q u t i i s v g i t r t r l i 5 0 5 ; q u t i t r ng i t r t r l i 3 1 2 , i q u a v t r v g i t r , C 4 5 5 ; i q u a v q u a yt r l i c c i t n gl n 4 5 7 ; t i l i ut h a mk h oc h oc c i t n g a p h n g 4 5 2 ; l o i 5 9 7 , g i t r 8 1 , t m t c h c n n g 1 1 5 ; t i uh a 5 0 7 ; n g n g h a 3 5 0 ; t r n g 1 1 5 R E T U R N, l pr pn g nn g 4 5 8 c t h d n gl i 2 9 t i s d n g 5 5 ; t i s d n gm 5 8 3 ; l ph c h i nc t h v i n 7 0 ; t i s d n gm n g u nv i c c m u 6 9 6 ; m u 6 8 9 i uh n hp h i t h a y i ( > > ) 1 6 0 R O M, b n h c h c , R O Ma b i l i t y 3 6 4 x o a y 1 6 2 ; t h a ot c b i t 1 6 2 R T T I , t h i g i a nc h yl o i x c n h 6 5 5 , 6 8 0 q u yt c , ma k e f i l e 2 0 4 R u mb a u g h , J a me s 7 7 9 t h i g i a nc h y : k i ms o t t r u yc p 2 7 5 ; r n gb u c 6 3 1 ; g l i c 1 9 5 ; l o i x c n h( R T T I ) 6 5 5 , 6 8 0 r v a l u e 1 5 6 , 6 9 8

S
o na nt o n 3 1 9 S a k s , D a n 6 6 , 3 9 4 , 7 5 1 , 7 6 0 k c hb n 4 9 l c ht r n h 5 1S c h wa r z , J e r r y 4 3 4 p h mv i 1 4 3 , 2 8 8 , 3 3 9 , 5 5 4 ; c o n s t s 3 3 7 t pt i n* 3 3 9 , 4 1 2 , i r a n g o i 1 4 3 ; g i ub i nt p h mv i b a o 2 9 2 ; t i nx l 3 7 6 ; b i ns c o p e d , p h ng i i , t o nc u 2 5 3 ; c ut r c l n gn h a u 2 7 8 ; i uh n h: : 2 3 2 , 4 2 9 , v k h n gg i a nt n 4 1 7 ; g i c h c n n gc s n gc p 5 8 8 4 2 ; t h n hv i nt n hk h i 4 2 5 ; c pp h t b n h Mu l t i wa y 1 2 4 ; c h c n n gt h n hv i n 2 3 4 : ; 5 4 9 t r n gh ps d n g 5 7 nb nt h h a i , m i 2 7 6 2 l a c h nb om t l n h n gg t p h nc n g , k i mt r a t r o n g i uh n h q u t i 5 0 5 , 5 2 3 n g n g h a , g i t r t r v 3 5 0 h i t h o : t r n a C D R O M, t Mi n d V i e w 1 6 ; c n g 5 , h i t h o ot ot Mi n d V i e w 1 6 g i m t t h n g i p 2 5 , 2 3 9 , 6 3 6 t r n g i m, k t t h c 7 2 8 , 7 3 6 b i nd c hr i n gb i t 7 8 , 8 0 , v l mc h o 2 0 2 t c hg i a od i nv t h c h i n 2 9 , 2 6 1 , 2 7 1 i mt r n ht 2 8 6 , 2 9 3 b : t i uc h u n< s e t >t pt i nt i u 7 1 1 ; v c c h c n n g 3 8 1 ; l pc o n t a i n e r t c c t i uc h u nC++T h v i n 7 1 1 s e t f ( ) , i o s t r e a ms 4 6 6s e t j mp( ) 2 8 8 S G I ( S i l i c o nG r a p h i c s ) S T Ld n 1 0 3 h n hd n g : v d 3 2 ; h t h n gp h nc p 6 8 2 n h k h a i t h c d c hc h u y n 1 6 0 n g n t c d n gp h 1 3 2 1 5 6 , 1 6 4c h k 5 9 7 k 1 3 2 ; c h a r 1 3 2S i l i c o nG r a p h i c s ( S G I ) S T Ld n 1 0 3n g nn g l pt r n hS i mu l a 2 5 , 2 7 1 d uc h m n gc h n hx c n 1 3 0 6 7 2 s i n g l y r o o t e d / o b j e c t b a s e dh t h n gp h nc p , 6 9 4 k c ht h c : c x yd n gt r o n gc c l o i 1 2 9 ; 5 5 4 i t n g ; b u c c k h c k h n g 6 3 9 ; s i z e _ t 5 6 8 ; l ut r 2 2 0 ; c ut r c 2 4 0 ; t 1 3 3 s i z e o f 1 3 2 , 1 7 2 , 3 0 2 , 5 8 7 ; c h a r 1 7 3 ; c ut r c 2 4 0 c t : i t n gc t 6 5 5S ma l l t a l k 2 4 , 8 0 , 6 4 5 , 6 9 4 , 7 0 2 i uh n ht h n gmi n hc o nt r > 5 0 9 , 7 3 0 p h nm m: c u c k h n gh o n g 8 , p h t t r i n p h n gp h pl u n 4 5 k h n gg i a ng i i p h p 2 3 g i i p h p , t pt h d c s nm 1 2 n g u n 1 2 n g u nc ps a l i 7 8 k h n gg i a n : v n 2 3 ; g i i p h p 2 3 c i mk t h u t : l o i k h n g y 2 6 5 , 2 7 7 , c i mk t h u t h t h n g 4 8 s p e c i f i e r : t r u yc ps p e c i f i e r s 2 9 , 2 6 1 , k h n gc t r t t c nt h i t t r o n gm t l ph c 2 6 3 ; s a i c b n c x yd n gt r o n gc c l o i 1 3 2 q u y n hc t h c pp h t b n h 1 4 7 s s t r e a mt pt i nt i u t i uc h u n 5 2 0 n g nx p4 1 , 2 4 8 , 2 9 4 , 5 4 9 , c h c n n gg i s t a c kk h u n g 4 5 8 ; c o nt r 4 0 6 ; y x u n g 2 7 5 ; c pp h t b n h 5 4 9 ; b i nt r ns t a c k 2 2 5 V d l pn g nx p 2 4 8 , 2 7 4 , 2 9 8 , 3 8 8 , 5 9 7 , 6 7 2 , 6 9 0 , 7 0 5 , 7 2 8 T i uc h u nC++T h v i n : c c t h u t t o n 7 4 2 ; c h n( ) 1 0 4 ; p u s h _ f r o n t ( ) 1 0 4 ; p h mv i , s d n gb n gc o n t a i n e r v v n gl p 7 2 8 t i uc h u nc h om i t pt i nh e a d e r c a l p 2 4 6 uv ot i uc h u nt h v i nc h u n 9 7 8 9 t i uc h u nt pt i nt i u t h v i n : c a s s e r t 1 9 7 ; c s t d l i b 1 8 8 ; c s t r i n g 2 6 9 ; b 7 1 1 ; s s t r e a m 5 2 0 ; T y p e I n f o 6 8 0 ur a t i uc h u n 9 0 S t a n d a r dT e mp l a t e L i b r a r y( S T L ) 1 0 3 t i uc h u n , C++ yb a n 1 4 c h i p h k h i n g 7 1 m u nk h i n g 8 9 S t a s hv d l p 2 1 9 , 2 3 0 , 2 7 4 , 2 9 4 , 3 1 4 , 3 2 2 , 3 8 5 , 5 5 8 , 7 0 7 t u y nb : t i pt c t r nn h i ud n g 9 7 ; n h i mv 4 7 t n h1 4 9 , 4 0 6 , 7 1 1 ; m n g 6 9 2 ; k h i 4 2 5 , c c i t n gl pt r o n gc h c n n g 4 0 8 ; n h ml nk h i s d n g 4 1 2 ; c o n s t 3 5 6 ; d l i u ; k h uv c 4 0 6 , c c t h n hv i nt r o n gm t l ph c 4 2 3 , 4 3 0 , x c n hl ut r c h o 4 2 4 ; t i uh u n h n gv t 4 1 0 ; t pt i n 4 1 4 ; k h i p h t h u c 4 3 2 ; k h i t o k h n g 4 3 3 ; k h i t om t b i nc a m t l o i d n gs n 4 0 8 ; i t n g a p h n g 4 1 0 ; c h c n n gt h n hv i n 3 6 6 , 4 2 9 , 4 6 5 , t h a k v 6 0 4 , c c i t n gb nt r o n gc h c n n g 4 3 7 ; l ut r 4 1 , 4 0 6 , d i nt c h 5 4 9 ; k i mt r a k i u 8 0 ; b i nt r o n gc c c h c n n gn h g i t r t r l i 3 5 0 ; b i nb nt r o n gc h c n n g 4 0 6 s t a t i c _ c a s t 1 6 9 , 6 7 9 ; n h nx u n g 6 8 1 n a me s p a c e s t d 9 2 b c , t r o n gv n gl p 1 2 1 S T L : S i l i c o nG r a p h i c s ( S G I ) S T Ld n 1 0 3 ; S t a n d a r dT e mp l a t e L i b r a r y 1 0 3 l ut r : p h nb 2 9 2 ; c o n s t v e x t e r n 3 3 6 ; t n gl ut r l ps p e c i f i e r 4 1 4 ; c o n s t , t r o n gCs ov i C++ 3 3 9 ; x c n hl ut r t n ht h n hv i nd l i u 4 2 4 ; e x t e r nl ut r l ps p e c i f i e r 4 1 2 ; n gk l ut r l ps p e c i f i e r 4 1 4 ; h t 5 6 5 , h t h n gp h nb ng i n 5 7 0 ; k c ht h c 2 2 0 ; t n h 4 1 , 4 0 6 , d i nt c h 5 4 9 ; l ut r l ps p e c i f i e r 4 1 2 ; l pl ut r 4 1 2 l ut r c c l o i t h n gt i n 6 3 7 S t r a k e r , D a v i d 7 5 5 c h u i 9 4 , 2 2 7 ; l p , t i uc h u nC++ 9 9 ; n i 9 6 ; s a oc h pm t t pt i nv o 1 0 2 ; g e t l i n e ( ) 5 6 2 ; t i nx l # b i nm t t nb i nt h n hm t c h u i 1 9 6 ; t i nx l n i c h u i 3 9 5 s t r i n g i z i n g , t i nx l 3 9 5 ; ma c r o 1 9 2 ; i uh n h#1 9 6 s t r i n g s t r e a m 5 2 0 g m n h , C++l m t n g nn g m n hm n hm yh n 4 5 0 S t r o u s t r u p , B j a r n e 4 , 4 3 3 , 6 9 6 , 7 4 8 , 7 7 6 , 7 7 9 c ut r c 1 7 5 , 2 1 9 , 2 3 8 , 2 6 0 , t n gh p k h i 3 0 2 ; m n g 1 8 3 ; g i ut nc h c n n gb nt r o n g 2 3 0 , k c ht h c t i t h i u 2 4 1 , l a c h nc o nt r t h n hv i nv i > 1 7 8 , k c ht h c c a 2 4 0

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

312/320

08/10/2013

Suy ngh trong C + +, Vol 1

c ut r c : t n gk h i t ov c ut r c 3 0 2 ; k h a i 2 4 5 , 2 6 5 , n hn g h a t r o n gm t t pt i nt i u 2 3 4 ; b n 2 6 4 ; l n g 2 4 8 ; r e d e c l a r i n g 2 4 5 s u b o b j e c t 5 8 5 , 5 8 7 , 5 8 8 , 6 0 4 t h a yt h , t r o n gO O P 2 4 t h a yt h : n g u y nt c 3 5 , g i t r 3 3 4 t r ( ) 1 5 6 s u b t y p i n g 6 0 6 q u y n hh ut , ma k e f i l e 2 0 5 h ut , ma k e f i l e 2 0 6 n g , c p h p* 4 8 5 c h u y n i 1 2 3 , 2 9 3 , x c n hc c b i nt r o n gc c t u y nb c h n 1 4 5 c p h p : c p h pc h c n n gk k h a i 8 2 ; c p h pk h a i b ob i n 8 3 ; i uh n hq u t i 4 8 7 , n g , v i n h i uh n hq u t i 4 8 5 t n gh p : x yd n gm c n h , h n hv i c a 3 0 5 ; h mt h n hv i nc t h t n gt or a b i t r n hb i nd c h 6 0 0 , 6 1 9 h t h n g c i mk t h u t 4 8 h t h n g( ) 9 8

t a b 9 5 m b n g i uk h i n 2 0 1 2 2 0 t nt h t a g , b n hl u n k t n i m u1 4 8 6 8 9 , 6 9 6 , d a n hs c h i s 7 0 0 ; s d n gc b n 1 0 4 ; l p 7 4 2 ; h n gs v g i t r m c n ht r o n gm u 7 0 3 ; c h a l pm uv c h c n n g o 7 4 3 ; c h c n n g 7 4 2 ; c c l ph c c t or a 6 9 9 ; p h n ut pt i n 7 0 0 , 7 0 7 , c n g h a l m t g i a od i n 7 0 1 ; n i t u y n 7 0 7 ; i n s t a n t i a t i o n 6 9 9 ; n h i u n hn g h a 7 0 0 ; m u n hn g h a h mk h n gt h n hv i nn i t u y n 6 9 9 ; ma c r ot i nx l v i n h i ut h a ms , t h a yv m u 6 9 6 ; S t a n d a r dT e mp l a t e L i b r a r y( S T L ) 1 0 3 ; S t a s hv s px pv d n h m u 7 0 5 ; g y u 7 0 1 i t n gt mt h i 3 4 7 , 4 6 8 , 5 3 5 ; l i 3 4 8 ; t i l i ut h a mk h oc h c n n g 4 5 3 ; i q u am t i t n gt mt h i nm t c h c n n g 3 5 1 ; g i t r t r v 5 0 8 b a y ut i uh n h 1 6 4 t h n g h i m: t n g 6 2 ; E x t r e me P r o g r a mmi n g( X P ) 6 1 S u yn g h t r o n gC : C s c h oJ a v a v C++C DR O M 2 , 1 1 2 , 7 7 6 S u yn g h t r o n gC++T p2 , n h n gg t r o n g v l mt h n o c c n 3 n y 2 8 6 , 3 6 3 , 3 8 0 , 4 2 9 , 4 6 8 , 5 5 2 , 6 4 2 ; a c h c a i t n gh i nt i 2 3 4 n m 5 7 2l n , t i uc h u nt h v i nC 3 8 4t i me _ t 3 8 4m t h n gb od n , t i nx l 3 9 5t o u p p e r ( ) , k t q u b t n g 3 7 6 i s c h s a uc t h l m c n h 3 2 2 ot o 6 9 ; v t v n 7 1 , 7 3 ; h i t h ot Mi n d V i e w 1 6 nv d c h 2 2 8 , 4 3 2 t h c s 1 5 8 , 1 6 3 , 1 6 6 , 2 4 6 , v s a i , t r o n g i uk i n 1 1 7 ; b o o l , n gv s a i 1 3 1 c g n gn g nc h n 5 7 2 l o i : k i ud l i ut r ut n g 2 3 9 ; t n gc h u y n i l o i h n h 5 3 3 ; n g nc h nv i t k h a r r n g 5 3 4 ; v i n h i uh n hq u t i 5 3 5 ; c s 3 2 ; c b nt c hh p 1 2 9 ; d i nv i n 1 3 5 ; k i mt r a 8 0 , 8 3 , 1 5 3 , 1 6 7 , c h t c h h nt r o n gC++ 2 2 7 ; c h u y n i 2 2 8 ; n g m 1 5 4 , s n gt o , h p 1 7 4 ; k i ud l i ut n g n gv i l p 2 6 ; n g u ng c 3 2 ; c h c n n gl o i 3 9 0 , c i t h i nv i c k i mt r a k i u 2 3 6 ; l o i c i mk t h u t k h n g y 2 6 5 , 2 7 7 , t h a k , l m t 6 1 5 ; k h i t o c x yd n gt r o n gc c l o i v i ' x yd n g ' 3 5 4 ; t h i g i a nc h yx c n hl o i ( R T T I ) 6 5 5 , 6 8 0 , l ut r t h n gt i n l o i 6 3 7 ; v i c k i mt r a k i u, v l i t k 1 8 0 ; L i nh i p 1 8 1 ; l o i a nt o nl i nk t 3 1 3 , n g i d n g n hn g h a 7 6 , 2 3 9 , g y u 3 8 , 7 0 2 ; C++t h n gq u am u 7 0 1t y p e d e f 1 7 4 , 1 7 7 , 2 2 0 , 2 3 1 , 4 1 4 k i uc h , c u ns c h 1 8t y p e i d 6 8 0T y p e I n f ot pt i nt i u t i uc h u n 6 8 0 l o i a nt o n m m 6 7 8

U
U ML 5 4 ; c h ot h yt h n hp h n 3 0 ; U n i f i e dMo d e l i n gL a n g u a g e 2 7 , 7 7 9 n g u y np h n : v d c a t t c c c n h k h a i t h c n g u y np h nq u t i 4 8 9 ; t r 1 6 3 ; k h a i t h c 1 5 9 , 1 6 3 ; q u t i 4 8 7 , c n gv i 1 6 3 + g c hd i , h n g u , t r n n hd a n h( d p h n g ) 3 8 1 U n i f i e dMo d e l i n gL a n g u a g e ( U ML ) 2 7 7 7 9 c n g o n : k i mt r at h m 1 8 1l o i ; v d a n h 3 2 0 ; p h mv i t pt i n 3 2 1 , s k h c b i t g i a n g h i p o nv m t l p 3 1 9 ; h mt h n hv i nv k i m s o t t r u yc p 3 1 8 ; a nt o n 3 1 9 , b n h t i t k i mv i 1 8 1 nv , d c h 2 2 8 v d a n h : l pl u n 1 1 4 ; k h n gg i a nt n 4 1 6 t i l i ut h a mk h oc h a c g i i q u y t , t r o n gq u t r n hl i nk t 8 8 u n s i g n e d 1 3 2 u n t a g g e de n u m 3 2 0 , 3 5 8 i uh n hk h c t h n gq u t i 5 0 8 u p c a s t i n g 4 0 , 6 1 5 , 6 2 9 , 6 3 6 , 6 7 8 , 7 3 8 , g i t r 6 4 4 ; s a oc h px yd n g 6 1 7 ; d i nv i nr r n gc h ou p c a s t i n g 6 8 1 ; 6 3 1 c o nt r , v t h a mc h i uu p c a s t i n g 6 2 2 ; 6 3 0 t i l i ut h a mk h o , l o i t h n gt i n , m t 6 2 2 t r n gh ps d n g 4 9 ; l p 5 7 ; p h mv i g i a od i nn g i d n g5 7 n g i d n g n hn g h a k i ud l i u5 1 7 6 , 1 2 9 , 2 3 9 s d n gt k h a , c h o k h n gg i a nt n 9 2 , 4 1 7 ; k h a i 4 2 1 , 7 5 7 ; c h t h 9 2 , 4 1 8 , 7 5 7 ; t pt i nt i u 2 4 7 ; n a me s p a c e s t d 2 4 7

V
g i t r : l i nt c 1 5 4 ; t i t h i uv t i a c h ox yd n gt r o n gc c l o i 1 2 9 ; p a s s b yg i t r 1 3 7 , g i t r t i nx l t h a yt h 3 3 4 ; t r l i 8 1 ; t r v g i t r 3 5 2 v a r a r g s 2 4 3 ; d a n hs c h i s b i n 2 4 3 b i n : d a n hs c h i s 1 1 4 ; v a r a r g s 2 4 3 ; t n g 4 2 , 1 4 9 , 1 5 3 , c p h pk h a i b o 8 3 ; x c n h 1 4 5 ; p h mv i t pt i n 1 5 0 ; t o nc u 1 4 7 ; i r a k h i p h mv i 1 4 3 ; nt p h mv i b a o 2 9 2 ; k h i t oc h om t b i nt n hc am t b u i l t i nl o i 4 0 8 ; i , t r o n gv n gl pf o r 2 9 2 ; ap h n g 1 3 8 , 1 4 9 ; i mc a n h n g h a 2 8 9 ; n gk 1 4 9 ; s c o p e d 4 2 ; c h n g 2 2 5 ; c h u y nt nt h n hm t c h u i 1 9 6 v e c t o r 7 4 0 ; c h u y nn h n g 1 0 8 ; t h a y i 5 9 ; p u s h _ b a c k( ) 1 0 4 ; t i uc h u nC++ T h v i n 1 0 2 od e s t r u c t o r 6 6 5 , 7 0 7 , 7 3 6 , 7 4 0 ; d e s t r u c t o r ot i n hk h i t 6 6 8 c h c n n g o 5 9 5 , 6 2 7 , 6 2 9 , 6 4 6 , 7 4 1 , t h mc h c n n g om i t r o n gl pb t n g u n 6 5 2 ; v d y n a mi c _ c a s t 6 7 9 ; m l pr pn g nn g t or a b i m t c h c n n g o 6 4 2 , x yd n g , h o t n gc a c c c h c n n g ob nt r o n g 6 6 2 , 6 6 4 ; h y , h n hv i c a c h c n n g ob nt r o n g 6 7 0 ; h i uq u 6 4 5 ; c u i r n gb u c 6 3 7 ; i uh n hq u t i v c h c n n g o 6 7 5 ; t r n g 6 3 2 ; t r nk c ht h c , h n hd u n gc h c n n g o 6 3 9 ; h m ot h u nt u , v c c l pc s t r ut n g 6 4 6 ; n hn g h a 6 5 1 c c c h c n n g o 6 3 7 ; t k h a o 3 9 , 6 3 2 , t r o n gt k h a i c s n g c p 6 3 2 ; t r o n gt k h a i n g u ng c t l p 6 3 2 b n h o 5 5 2 4 0 6 t mn h nk h o n gt r n g : d a n hs c h i s 1 1 4 ; c c o nt r v o i d 2 3 5 ; t k h a 1 1 4 ; c o nt r 2 2 0 , 4 5 0 , 5 5 5 , 5 5 9 , 5 6 2 , t h a mk h o ( B t h pp h p ) 1 4 3 v o i d* 1 4 2 , 1 7 0 , 2 2 0 ; l i 2 3 5 ; c o n t a i n e r v q u y ns h u 6 7 1 ; x a , m t l i 5 5 5 b i n n g 1 5 5 , 3 6 5 ; c v i c o n s t _ c a s t 1 7 0 T p 2 , t d u yt r o n gC++ 3 v p o i n t e r , v i t t t l V P T R 6 3 7 V P T R 6 3 7 , 6 4 0 , 6 4 2 , 6 6 2 , 6 6 5 , c i t b i c c n h x yd n g 6 4 3 V t a b l e 6 3 7 , 6 4 0 , 6 4 2 , 6 4 8 , 6 5 3 , 6 6 2 , 6 6 5 , t h a k v v t a b l e 6 5 2

W
Wa l d r o p , M. Mi t c h e l l 7 8 1 y u : n hm y 7 0 2 , t r o n gC++t h n gq u a m u 7 0 1 ; t i n gg y u 3 8 t r o n gk h i v n gl p 1 0 1 , 1 1 9 ; b i nx c n h t r o n gb i ut h c k i ms o t 1 4 5 c h i ur n g( ) , i o s t r e a ms 4 6 6 wi l d c a r d 4 6 Wi l l Ha r r i s , D a n i e l 1 7 , 1 8 k c ht h c t 1 3 3 t pt i nv nb n 1 0 0

X
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 313/320

08/10/2013

Suy ngh trong C + +, Vol 1

X O R^B i t wi s e c q u y nh o c 1 5 9 , 1 7 3 x o r _ e q , ^=B i t wi s e c q u y nh o c p h nc n g 1 7 3 X P , L pt r n hc c 6 1

Z
k h n gl pc h m c 1 8 3

C n g C + + H i t h o
Kim tra www. B r u c e E c k e l . c o m bit chi tit chuyn su v ngy v a im tip theo: Ha n d s On C + + H i t h o D a t r nc u ns c hn y C c m t n nt n gv n gc h c t r o n gt i uc h u nC++c b n B a og mc c b i t pl pt r n ht r o n gl p s c h c a c n h nt r o n gc c b i t p T r u n gg i a n C + + H i t h o D a t r nt p2 c a c u ns c hn y( t i v t i www. B r u c e E c k e l . c o m) b oh i mc h u y ns uc a t i uc h u nC++T h v i n D y , c o n t a i n e r , v n gl p , c c t h u t t o n m uc h u y ns uv x l n g o i l N n gc a oC + + c h C nc v oc h n n gc a ot r o n gt p2 c a c u ns c hn y T h i t k m u X yd n gh t h n gm n hm T ot h n g h i mv g l i c c k h u nk h T h e od i c cb nt i n mi np h s ct n gt h n gb o c ah i t h os p t i

C n gg h t h m www. B r u c E c k e l . c o mc h o :
C D c hv o n s u l t i n g "! Ex e r c i s eS o l ut i o n sc h ob o on yk "!

H i t h o o n C DR OM

N ub nt h c h T hinking trong C H i t h o o n C D n gg i v i c u ns c hn y , s a u b nc n gs t h c h:

B r u c eE c k e l c a Ha n d s On C + + H i t h o ap h n gt i nC DR OM N ging nh n vi hi tho! C sn ti www. B r u c e E c k e l . c o m


s l i d e t r nc a ov n gb h a mt h a n hg h i l i b i B r u c e E c k e l T t c c c b i g i n gt Ha n d s OnC++H i t h o D a t r nc u ns c hn y C c m t n nt n gv n gc h c t r o n gt i uc h u nC++c b n C h c nc h i n x e mv n g h e c c b i g i n g ! C c b i g i n g c l pc h m c , d o b nc t h n h a n hc h n gx c n hv t r c c c u c t h ol u nv c h b t k C c c h i t i t v b i g i n gm uc t h c t mt h yt r nc c t r a n gwe b
314/320

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

08/10/2013

Suy ngh trong C + +, Vol 1

X e m www. B r u c e E c k e l . c o m
Cc Trung cp C + + Hi tho nng cao C + + ch

c h oc cH i t h o o n C DR OM

Tha thun Giy php Ngi dng Cui cho phn mm Microsoft QUAN TRNG-C K: y Microsoft tha thun cp php ngi dng cui ("EULA") l mt tha thun php l gia bn (mt c nhn hoc mt thc th duy nht) v tp on Microsoft cho cc sn phm phn mm ca Microsoft bao gm trong gi ny, trong bao gm phn mm my tnh v c th bao gm phng tin truyn thng lin quan, ti liu in n, v "trc tuyn" hoc in t ti liu ("SN PHM PHN MM"). Sn phm phn mm cng bao gm cc bn cp nht, b sung cc sn phm phn mm ban u cung cp bi Microsoft. Bng cch ci t, sao chp, ti v, truy cp hoc s dng cc sn phm phn mm, bn ng b rng buc bi cc iu khon ca EULA ny. Nu bn khng ng vi cc iu khon ca EULA ny, khng ci t, sao chp hoc s dng cc sn phm phn mm. SN PHM PHN MM PHP Sn phm phn mm c bo v bi lut bn quyn v cc hip c bn quyn quc t, cng nh cc lut s hu tr tu v cc iu c. Sn phm phn mm c cp php, khng c bn. 1. CP GIY PHP. EULA ny cho php bn c cc quyn sau y: 1.1 Giy php Grant. Microsoft cp cho bn nh mt c nhn, mt giy php khng c quyn c nhn thc hin v s dng bn sao ca sn phm phn mm cho cc mc ch duy nht ca vic nh gi v hc cch s dng cc sn phm phn mm, nh c th c hng dn i km trong cc n phm, ti liu hng dn. Bn c th ci t phn mm trn mt s khng gii hn ca my tnh vi iu kin bn l c nhn ch s dng cc sn phm phn mm. 1.2 S dng hc. Bn c phi l mt "ti gio dc tiu chun" s dng cc sn phm phn mm theo cch m t trong phn ny. xc nh xem bn l mt gio dc ti iu kin, xin vui lng lin h vi Trung tm Thng tin Kinh doanh Microsoft / Mt Microsoft Way / Redmond, WA 98052-6399 hoc cng ty con ca Microsoft phc v t nc ca bn. Nu bn l mt gio dc ti iu kin, bn c th: (I) Thc hin cc quyn c cp trong mc 1.1, hoc (ii) nu bn c nh s dng cc sn phm phn mm ch duy nht cho mc ch ging dy trong kt ni vi mt lp hc hoc chng trnh gio dc khc, EULA ny cho php bn c cc m hnh thay th giy php sau: (A) trung bnh mi my tnh mu. i vi mi giy php hp l bn c c cho sn phm phn mm, bn c th ci t mt bn sao duy nht ca sn phm phn mm trn mt my tnh duy nht truy cp v s dng bi mt s lng khng gii hn ca ngi s dng sinh vin ti c s gio dc ca bn, vi iu kin l tt c ngi dng cui nh vy thc hin vi tt c cc iu khon khc ca ny EULA, HOC (B) trung bnh mi Giy php Model. Nu bn c nhiu giy php cho cc PHN MM SN PHM, sau bt c lc no bn c th c nhiu bn sao ca sn phm phn mm c s dng l bn c giy php, vi iu kin l vic s dng c gii hn trong sinh vin hoc ngi s dng ging vin ti c s gio dc ca bn v cung cp cho tt c ngi dng cui nh vy tun th tt c khc iu khon ca EULA ny. Cho cc mc ch ca tiu mc ny, cc sn phm phn mm l "s dng" trn my tnh khi n c np vo b nh tm thi (v d, b nh RAM) hoc ci t vo b nh vnh vin (v d, a cng, CD ROM, hoc thit b lu tr khc) ca my tnh, ngoi tr mt bn sao c ci t trn mt my ch mng cho mc ch duy nht phn phi cc my tnh khc khng phi l "s dng". Nu s d on ca ngi s dng cc sn phm phn mm s vt qu s lng giy php c p dng, sau bn phi c mt c ch hp l hoc qu trnh thc hin m bo rng s ngi s dng cc sn phm phn mm ng thi khng vt qu s lng giy php. 2. M t QUYN V GII HN KHC. Hn ch v K thut o ngc, dch ngc, v tho. Bn khng th o ngc k s, dch ngc, hay r cc sn phm phn mm, ngoi tr v ch trong phm vi hot ng c s cho php ca php lut p dng mc d hn ch ny. Tch cc thnh phn. Sn phm phn mm c cp php nh mt sn phm duy nht. B phn cu thnh ca n c th khng th tch ri s dng trn nhiu my tnh. Cho thu. Bn khng th thu, cho thu, cho mn cc sn phm phn mm. Nhn hiu hng ho. EULA ny khng cp cho bn bt k quyn no trong kt ni vi bt k nhn hiu hoc nhn hiu dch v ca Microsoft. Phn mm chuyn. Ngi s dng ban u ca sn phm phn mm c th lm cho mt chuyn vnh vin mt ln ca EULA ny v SN PHM PHN MM ch trc tip n ngi dng cui. Chuyn giao ny phi bao gm tt c cc sn phm phn mm (bao gm tt c cc thnh phn, cc phng tin truyn thng v ti liu in n, bt k nng cp, EULA ny, v, nu c, giy chng nhn tnh xc thc). Chuyn nhng nh vy c th khng bng cch gi hng hoc bt k chuyn gin tip khc. Bn nhn chuyn giao tng b phi ng tun th cc iu khon ca EULA ny, trong c ngha v khng c tip tc chuyn EULA ny v SN PHM PHN MM. Khng h tr. Microsoft s khng c ngha v phi cung cp bt k h tr sn phm cho cc sn phm phn mm. Chm dt. Khng nh hng n bt k quyn no khc, Microsoft c th chm dt EULA ny nu bn khng tun th cc iu khon v iu kin ca EULA ny. Trong trng hp , bn phi tiu dit tt c cc bn sao ca cc sn phm phn mm v tt c cc b phn cu thnh ca n. 3. BN QUYN. Tt c cc danh hiu v quyn s hu tr tu trong v i vi sn phm phn mm (bao gm nhng khng gii hn i vi bt k hnh nh, hnh nh, hnh nh ng, video, m thanh, m nhc, vn bn, v "applet" c a vo cc sn phm phn mm), cc ti liu in nh km v bn sao ca sn phm phn mm thuc s hu ca Microsoft hay cc nh cung cp ca n. Tt c cc danh hiu v quyn s hu tr tu trong v ni dung c th c truy cp thng qua vic s dng cc sn phm phn mm l ti sn ca ch s hu ni dung tng ng v c th c bo v bi lut bn quyn p dng hoc php lut s hu tr tu v cc iu c. EULA ny khng cho bn quyn s dng ni dung . Tt c cc quyn li khng c cp u c bo v bi Microsoft. 4. Sao lu bn sao. Sau khi ci t mt bn sao ca sn phm phn mm theo EULA ny, bn c th gi cho cc phng tin thng tin ban u m cc sn phm phn mm c cung cp bi Microsoft ch duy nht cho mc ch sao lu hoc lu tr. Nu cc phng tin truyn thng ban u l cn thit s dng cc sn phm phn mm trn my tnh, bn c th to mt bn sao ca sn phm phn mm ch duy nht cho mc ch sao lu hoc lu tr. Tr khi c cung cp trong EULA ny, bn c th khng nu khng lm
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 315/320

08/10/2013

Suy ngh trong C + +, Vol 1

bn sao ca sn phm phn mm hoc cc ti liu in i km vi sn phm phn mm. 5. CHNH PH HOA K HN CH QUYN. SOFTWARE HNG v ti liu c cung cp vi QUYN GII HN. S dng, sao chp, hoc tit l ca Chnh ph chu hn ch nh quy nh ti im (c) (1) (ii) cc quyn trong Thng s k thut v khon Phn mm my tnh ti DFARS 252.227-7013 hoc im (c) (1) v (2) ca my tnh thng mi quyn phn mm, hn ch ti 48 CFR 52.227-19, nu c. Nh sn xut l Tp on Microsoft / Mt Microsoft Way / Redmond, WA 98052-6399. 6. XUT HN CH. Bn ng rng bn s khng xut khu hoc ti xut sn phm phn mm, bt k phn no, hoc bt k qu trnh hoc dch v m l sn phm trc tip ca cc sn phm phn mm ( ni trn gi chung l cc "thnh phn b hn ch"), bt c nc no, ngi , t chc hoc kt thc i tng ngi dng hn ch xut khu ca M. Bn c bit ng khng xut khu hoc ti xut khu bt k ca cc thnh phn b hn ch (i) bt k nc no m M cm vn hoc hn ch xut khu hng ho, dch v m hin nay bao gm, nhng khng nht thit phi gii hn Cuba, Iran, Iraq, Libya, Bc Triu Tin, Sudan v Syria, hoc bt k quc gia ca bt c nc no nh vy, bt c ni no t, c nh truyn ti hoc vn chuyn cc thnh phn b hn ch tr v nc , (ii) cho bt k ngi dng cui nhng ngi bn bit hoc c l do bit s s dng cc hn ch

848 Cc thnh phn trong thit k, pht trin, sn xut ht nhn, ha hc hoc v kh sinh hc, hoc (iii) cho bt k ngi dng cui b cm tham gia vo cc giao dch xut khu ca M bi bt k c quan lin bang ca chnh ph M. Bn bo m l khng nhng BXA cng nh bt k c quan lin bang khc ca Hoa K b nh ch, thu hi hoc b t chi quyn u i xut khu ca bn. 7. LU V JAVA H TR. SN PHM PHN MM C TH CHA H TR CHO CHNG TRNH vit bng Java. JAVA CNG NGH IS Khng chu ng li v khng c thit k, SN XUT, HOC S DNG HOC BN AS ON-LINE THIT B KIM SOT TRN MI TRNG NGUY HIM CN THC HIN FAIL-SAFE, NH TRONG HOT NG CA C S HT NHN, MY BAY NAVIGATION HOC H THNG TRUYN THNG, kim sot khng lu, TRC TIP MY H TR CUC SNG, HOC H THNG V KH, M S THT BI CA JAVA CNG NGH C TH DN TRC TIP N T VONG, THNG TCH C NHN HOC THIT HI NGHIM TRNG TH HOC MI TRNG. KHC Nu bn mua sn phm ny ti Hoa K, EULA ny c iu chnh bi lut php ca tiu bang Washington. Nu bn mua sn phm ny Canada, EULA ny c iu chnh bi php lut ca tnh Ontario, Canada. Mi cc bn lin quan khng th hy b attorns s xt x ca cc ta n ca tnh Ontario v cng ng bt u bt k tranh chp c th pht sinh sau y trong cc ta n nm qun t php ca York, tnh Ontario. Nu sn phm ny c mua li bn ngoi Hoa K, sau lut php a phng c th p dng. Nu bn c bt k cu hi lin quan n EULA ny, hoc nu bn mun lin h vi Microsoft v l do no, xin vui lng lin h Microsoft, hoc vit: Microsoft Trung tm Thng tin Kinh doanh / Mt Microsoft Way / Redmond, WA 98052-6399. BO HNH BO HNH. Microsoft m bo rng (a) cc sn phm phn mm s thc hin c bn ph hp vi cc ti liu km theo vn bn trong thi hn chn mi (90) ngy, k t ngy nhn c, v (b) bt k dch v h tr cung cp bi Microsoft c ng k nh c m t trong ti liu vn bn p dng cung cp bi Microsoft, v k s h tr Microsoft s lm cho nhng n lc thng mi hp l gii quyt bt k vn . Trong phm vi cho php ca php lut p dng, bo m ng trn sn phm phn mm, nu c, c gii hn chn mi (90) ngy. Mt s quc gia / khu vc php l khng cho php gii hn thi gian ca mt s bo m no, do hn ch trn c th khng p dng cho bn. BIN PHP KHCH HNG. Ca Microsoft v ton b trch nhim nh cung cp v bin php khc phc c quyn ca bn c, ty theo la chn ca Microsoft, hoc l (a) tr li ca gi thanh ton, nu c, hoc (b) sa cha hoc thay th cc sn phm phn mm khng p ng Bo hnh ca Microsoft v c tr v cho Microsoft mt bn sao bin lai ca bn. Bo hnh c gii hn ny khng c hiu lc nu tht bi ca cc sn phm phn mm l kt qu ca v tai nn, lm dng hoc s dng sai. Bt k thay th SN PHM PHN MM s c bo hnh trong thi gian cn li ca thi hn bo hnh gc hoc ba mi (30) ngy, no l lu hn. Bn ngoi nc M, khng nhng bin php khc phc cng nh bt k dch v h tr sn phm c cung cp bi Microsoft c sn m khng c bng chng mua hng t mt ngun quc t c thm quyn. KHNG BO HNH KHC. M RNG RA THEO LUT HIN HNH, MICROSOFT V NH CUNG CP KHNG CHU TRCH NHIM BO M V IU KIN, R RNG HAY NG , BAO GM NHNG KHNG GII HN, BO M HOC IU KIN THNG MI, PH HP VI MT C TH MC CH, DCH V V NHNG VI PHM LIN QUAN N SN PHM PHN MM, V S D PHNG HOC THT BI CUNG CP DCH V H TR. BO HNH GII HN CHO BN CC QUYN HP PHP C TH. BN C TH C KHC, m thay i t nh nc / THM QUYN NH NC / THM QUYN. GII HN TRCH NHIM. M RNG RA THEO LUT HIN HNH, TRONG BT C TRNG HP MICROSOFT NHNG NH CUNG CP CA N CHU TRCH NHIM CHO MI C BIT, TIP, HOC HU QU NO (BAO GM NHNG KHNG GII HN, THIT HI LI NHUN KINH DOANH, KINH DOANH GIN ON, MT THNG TIN KINH DOANH, HOC KHC MT TIN BC) PHT SINH BN NGOI VIC S DNG HAY KHNG C KH NNG S DNG SN PHM PHN MM HOC THT BI TRONG CUNG DCH V H TR, ngay c khi Microsoft C KHUYN V KH NNG THIT HI. Trong mi trng hp, MICROSOFT TRCH NHIM TON B DI BT C IU KHON CA EULA NY S GII HN s ln hn ca s thc chi BN CHO SN PHM PHN MM HOC 5,00 US $; tuy nhin, NU BN C Mt H TR HP NG DCH V MICROSOFT, TRCH NHIM TON B MICROSOFT V H TR DCH V c p dng theo cc iu khon ca Hip nh. V MT VI / QUYN KHNG CHO PHP
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 316/320

08/10/2013

Suy ngh trong C + +, Vol 1

850 LOI TR HOC GII HN TRCH NHIM, NHNG HN CH TRN C TH KHNG P DNG VI BN. 0495 Phn th 64.358 THA THUN CHO PHP MindView, Inc t duy trong C: C s cho C + + v Java CD-ROM ca Chuck Allison CD ny c cung cp cng vi cun sch "Suy ngh trong C + + phin bn th 2, Tp 1." C THA THUN NY TRC KHI S DNG "t duy trong C: C s cho C + + v Java "(Sau y gi l" CD "). S DNG CD BN NG VI NHNG IU KHON V IU KIN THA THUN NY. NU BN KHNG NG VI CC IU KIN CA HP NG NY, NGAY LI CD KHNG S DNG CHO HON TON V TIN LNG, NU C. 2000 MindView Inc Tt c cc quyn. In M YU CU PHN MM Mc ch ca CD ny l cung cp ni dung, khng phi l phn mm lin quan cn thit xem c ni dung. Ni dung ca CD ny l trong HTML xem vi Microsoft Internet Explorer 4 hoc mi hn, v s dng codec m thanh c sn trong Microsoft Windows Media Player ca Microsoft cho Windows hoc Macintosh. l trch nhim ca bn ci t mt cch chnh xc phn mm thch hp Microsoft cho h thng ca bn. Cc vn bn, hnh nh, v cc phng tin khc bao gm trn CD ny ("Ni dung") v bin son ca h c cp php cho bn theo cc iu khon v iu kin ca Hip nh ny MindView Inc, c mt a im kinh doanh ti 5343 Valle Vista, La Mesa , CA 91941. Quyn s dng cc chng trnh khc v cc ti liu c trong a CD cng c iu chnh bi cc tha thun phn phi ring bit vi cc chng trnh v cc ti liu trn a CD (cc "Hip nh khc"). Trong trng hp khng thng nht gia Hip nh ny v cc Hip nh khc, Hip nh ny s chi phi. Bng cch s dng a CD ny, bn ng b rng buc bi cc iu khon v iu kin ca Hip nh ny. MindView Inc s hu danh hiu vi ni dung v tt c cc quyn s hu tr tu trong , ngoi tr trng hp v n c cha vt liu c c quyn cc nh cung cp bn th ba. Tt c cc quyn trong cc ni dung ngoi tr nhng cp cho bn trong Hip nh ny c dnh ring MindView Inc v cc nh cung cp nh quyn li ca h c th xut hin. 1. PHP GII HN MindView Inc cho php bn c gii hn, khng c quyn, khng chuyn nhng giy php s dng ni dung trn mt my vi tnh chuyn dng (khng bao gm cc my ch mng). Hip nh ny v di y quyn li ca bn s t ng chm dt nu bn khng tun th bt k quy nh ny

852 Hip nh hoc bt k ca cc Hip nh khc. Khi chm dt nh vy, bn ng ph hy cc a CD v tt c cc bn sao ca a CD, cho d hp php hay khng, l s hu ca bn hoc di s kim sot ca bn. 2. HN CH B SUNG mt. Bn s khng (v khng cho php ngi hoc t chc khc ) trc tip hoc gin tip, bi in t hoc cc phng tin khc, sao chp (ngoi tr cho mc ch lu tr theo php lut cho php), xut bn, phn phi, cho thu, cho thu, bn, cp php, chuyn nhng, hoc nu khng chuyn ni dung hoc bt k phn no. b. Bn s khng (v khng cho php ngi hoc t chc khc) s dng ni dung hay bt k phn no cho bt k mc ch thng mi hoc hp nht, sa i, to ra tc phm phi sinh, hoc dch cc ni dung. c. Ngi s khng (v khng cho php ngi hoc t chc khc) che khut MindView hoc cc nh cung cp bn quyn, nhn hiu hng ho, hoc quyn s hu khc hoc huyn thoi t bt k phn no ca ni dung hay bt c ti liu lin quan. 3. PHP mt. Ngoi tr nh nu trong cc ni dung ca a CD, bn phi i x vi phn mm ny ging nh mt cun sch. Tuy nhin, bn c th sao chp n vo mt my tnh c s dng v bn c th to cc bn sao lu tr ca phn mm cho mc ch duy nht ca vic sao lu cc phn mm v bo v u t ca bn khi mt mt. Bng cch ni, "ging nh mt cun sch," MindView, Inc c ngha l, v d, rng phn mm ny c th c s dng bi bt k s lng ngi v c th c t do di chuyn t mt a im my tnh khc, min l khng c kh nng n ang c s dng ti mt a im hoc trn mt my tnh trong khi n ang c s dng ti mt. Cng ging nh mt cun sch khng th c c bi hai ngi khc nhau hai ni khc nhau cng mt lc, khng phi l phn mm c th c s dng bi hai ngi khc nhau hai ni khc nhau cng mt lc. b. Bn c th hin th hoc th hin cc ni dung cha sa i trong mt bi thuyt trnh trc tip, hi tho trc tip, hoc biu din trc tip min l bn cho rng tt c vt cht ca ni dung MindView, Inc c. quyn cng nhn quyn s dng ca a CD khc phi c ly trc tip t MindView, Inc ti http://www.MindView.net. (Bn sao s lng ln ca a CD cng c th c mua ti trang web ny.) T CHI BO HNH Ni dung v CD c cung cp "nh l" khng c bo hnh no, th hin r rng hay ng , bao gm nhng khng gii hn, bt c bo hnh v kh nng bn v ph hp cho mt mc ch c th. Ton b ri ro v kt qu v hiu sut ca a CD v ni dung l gi nh ca bn. MindView Inc v cc nh cung cp ca n khng chu trch nhim cho cc khuyt tt trong cc CD, tnh chnh xc ca ni dung, hoc thiu st trong CD hoc ni dung. MindView Inc v cc nh cung cp khng m bo, m bo, hoc kin ngh v vic s dng, hoc kt qu ca vic s dng, cc sn phm v tnh chnh xc, tin cy, currentness, hay ni cch khc, hoc l ni dung s p ng nhu cu ca bn, hoc hot ng ca a CD s khng b gin on hoc khng c li, hoc khim khuyt ca CD hoc ni dung s c sa cha. MindView Inc v cc nh cung cp ca n khng chu trch nhim cho bt k tn tht, thit hi, hay chi ph pht sinh t vic s dng cc a CD hoc gii thch cc ni dung. Mt s tiu bang khng cho php loi tr hoc gii hn cc bo m ng hoc gii hn trch nhim bi thng thit hi ngu nhin hoc do hu qu, v vy tt c nhng hn ch hoc loi tr trn c th
file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm 317/320

08/10/2013

Suy ngh trong C + +, Vol 1

khng p dng cho bn. Khng c trng hp MindView Inc hoc tng trch nhim nh cung cp ' bn cho tt c cc thit hi, mt mt, v nguyn nhn ca hnh ng (cho d l trong hp ng, sai lm c nhn, hay cch khc) vt qu s tin bn chi tr cho cc a CD. MindView, Inc, v Prentice-Hall, Inc c bit t chi nhn warrantees kh nng thng mi v ph hp cho mt mc ch c th. Khng c thng tin bng ming hoc bng vn bn hoc li khuyn ca MindView, Inc, PrenticeHall, Inc, i l ca h, cc nh phn phi, i l hoc nhn vin s to ra mt bo hnh. Bn c th c cc quyn khc, ty theo tng tiu bang. Khng MindView, Inc, Bruce Eckel, Chuck Allison, Prentice Hall, cng khng phi bt k ai khc tham gia vo vic to ra, sn xut, phn phi cc sn phm phi chu trch nhim cho bt k trc tip, gin tip, thit hi do hu qu, hoc ngu nhin (bao gm c thit hi cho mt li nhun kinh doanh, gin on kinh doanh, mt thng tin kinh doanh, v cc loi tng t) pht sinh t vic s dng hoc khng c kh nng s dng sn phm ngay c khi MindView, Inc, c thng bo v kh nng thit hi. Bi v mt s tiu bang khng cho php loi tr hoc gii hn trch nhim bi thng thit hi do hu qu hoc ngu nhin, hn ch trn c th khng p dng cho bn.

854 CD ny c cung cp nh l mt b sung cho cun sch "T duy trong C + + phin bn th 2." Trch nhim duy nht ca Prentice-Hall s c cung cp mt a CD thay th trong trng hp mt m n vi cun sch l khim khuyt. Bo hnh thay th ny s c hiu lc trong khong thi gian su mi ngy k t ngy mua. MindView, Inc khng chu bt k trch nhim b sung cho CD. KHNG H TR K THUT C CUNG CP VI NY CD ROM Sau y l cc nhn hiu ca cc cng ty ti M v c th c bo v nh cc thng hiu trong nc khc: Mt tri v Logo Sun, Sun Microsystems, Java, tt c cc tn da trn Java v biu tng v c ph Cup Java l cc nhn hiu ca Sun Microsystems; Internet Explorer, Windows Media Player, h iu hnh DOS, Windows 95 v Windows NT l cc thng hiu ca Microsoft.

S u yn g h t r o n gC : C s c h oJ a v av C + +
Hi tho a phng tin-on-CD ROM 2000 MindView, Inc Tt c cc quyn.
C h : T r ck h i mG I D I S C , C K N HN G I UK HO NV I UK I NC A HP N GG I YP H P & WA R A N T E EG I I H N c ct r a n gt r c .

C DR OM k mv i c u ns c hn yl m t h i t h o a p h n gt i nb a og mc c s l i d e b i g i n gv n gb h a m t h a n h . M c t i uc a h i t h on yl g i i t h i ub n nc c k h a c n hc a C l c nt h i t b nc t h c h u y n s a n gC++h a yJ a v a , l i n h n gp h nk h c h um c c l pt r n hv i nCp h i i p h v i t r nm t c s n g yh m n a yn h n gm C++v J a v a n g nn g h n gb n i x a . a C Dc n gc c u ns c hn yd i d n gHT MLc n gv i m n g u nc h oc u ns c h . N yC DR OM s l mv i c v i Wi n d o ws ( v i m t h t h n g mt h a n h ) v Ma c i n t o s h . T u yn h i n , q u v p h i : 1 .C i t p h i nb nm i n h t c a I n t e r n e t E x p l o r e r c a Mi c r o s o f t . V n h n gt n hn n g c c u n gc pt r n a C D , n s k h n gl mv i c v i Ne t s c a p e Na v i g a t o r . C c p h nm m I n t e r n e t E x p l o r e r c h oc Ma c i n t o s hv Wi n d o ws 9 X / NT c b a og m t r n a C D. 2 .C i t c a Mi c r o s o f t Wi n d o w s Me d i a P l a y e r . T h t k h n gma y i un yc h c p h pp h np h i t r c t i pt t r a n gwe bc a Mi c r o s o f t , d o n l k h n gb a og mt r n a C D . B ns c np h i i n h t t p : / / www. mi c r o s o f t . c o m/ wi n d o ws / me d i a p l a yv t h e oe r c c h n gd nh o c l i nk t t i v v c i t Me d i a P l a y e r c h on nt n gc t h c a b n( b nc t h c np h i t mv t h e om t l i nk t t h mc h op h i nb n Ma c i n t o s h ) . X i nl ur n gMi c r o s o f t i k h i t h a y i v t r c a c c t r a n gwe bt r nt r a n gwe bc a h v t r o n g t r n gh p b ns c np h i s d n gk h n n gt mk i mc a h t mc c m yn g h e n h c p h n gt i nt r u y n t h n g .

856

L c n y , b ns c t h c h i c c b i g i n gt r n a C D . S d n gt r n hd u y t we bI n t e r n e t E x p l o r e r , m c c t pt i n i n s t a l l . h t ml m b ns t mt h yt r n a C D . i un ys g i i t h i uv i b n a C Dv c u n gc ph n gd nt h mv v i c s d n gc c a C D .

[ 1 ] [ 2 ]

B j a r n e S t r o u s t r u p , C++N g nn g l p t r n h , A d d i s o n We s l e y , 1 9 8 6 ( nb n ut i n ) . S d n g C++, O s b o r n e /Mc G r a wHi l l n m1 9 8 9 .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

318/320

08/10/2013

Suy ngh trong C + +, Vol 1

[ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ]

S d n g C++v C++I n s i d e &O u t , O s b o r n e /Mc G r a wHi l l n m1 9 9 3 . X e mm u l t i p a r a d i g mL p t r n h t r o n g L e d a b i T i mo t h yB u d d( A d d i s o n We s l e y , 1 9 9 5 ) . B nc t h t mt h ym t t h c h i nt h v v v n n yt r o n gt p2 c a c u ns c hn y , c s nt i www. B r u c e E c k e l . c o m. M t s n g i l mc h om t s k h c b i t , n i r n gq u y t n hl o i g i a od i nt r o n gk h i l ph c l m t t h c h i nc t h c a g i a od i n . T i m c n b nb S c o t t Me y e r s c a t i c h ot h u t n g n y .

i un yt h n gl c h i t i t c h oh uh t c c s , v b nk h n gc np h i c c t h v v i c l i ub n a n gs d n gk t h ph o c t h n h p h n . M t v d t u y t v i c a v i c n yl U MLc h n g c t , Ma r t i nF o wl e r ( A d d i s o n We s l e y2 0 0 0 ) , l mg i mq u t r n hU ML i k h i p o t p c o n .

[ 1 0 ] [ 1 1 ]

Q u yt c c a n g nt a yc i c t n hc c d nn h : N uc n h i uh nm t t h h o a n gd , t h mc h k h n gc g n g c k h o c hb a ol u n s m t h o c b a on h i un s c h i p h c h o nk h i b n t or a m t n g u y nm ul mv i c . C q u n h i ub c t d o . Nh s g i p t J a me s HJ a r r e t t .

T h n gt i nt h mv t r n gh ps d n gc t h c t mt h yt r o n gn g d n g T r n g h p s d n g c a S c h n e i d e r & M a n g( A d d i s o n We s l e y1 9 9 8 ) v T r n g h p s d n g D r i v e n i t n g m h n h h a v i U MLc a R o s e n b e r g( A d d i s o n We s l e y , 1 9 9 9 ) .

[ 1 2 ]

[ 1 3 ] [ 1 4 ] [ 1 5 ] [ 1 6 ] [ 1 7 ] [ 1 8 ] [ 1 9 ] [ 2 0 ] [ 2 1 ] [ 2 2 ] [ 2 3 ] [ 2 4 ] [ 2 5 ] [ 2 6 ] [ 2 7 ] [ 2 8 ] [ 2 9 ]

c n h nc a t i c t r nn y t h a y i g n y . T n gg p i v t h m1 0 p h nt r ms c u n gc pc h ob nm t c t n hk h c h n hx c ( g i s k h n gc q u n h i uy ut wi l d c a r d ) , n h n gb nv np h i l mv i c k h c h mc h h o nt h n ht r o n gt h i g i a n . N ub nmu nc t h i g i a n t h c s l mc h on t h a n hl c hv h a m n hv oq u t r n hn y , c c n h n n gl g i n gn h b a h o c b nl n , t i t i n . b t u , t i n g h n i t r nU MLc h n g c t . P y t h o n( www. P y t h o n . o r g ) t h n g c s d n gn h " g i t h c t h i . " M c d i un yc t h l m t q u a n i m Mh n , n h n gc uc h u y nc a Ho l l y wo o d t k h pm i n i .

T r o n g ( c b i t l ) c c h t h n gP A . T i t n gl mv i c t r o n gm t c n gt yk h n g n ht r np h t s n gt t c c c c u c g i i nt h o i nc h om i i uh n h , v n l i nt c b g i n o ns nx u t c a c h n gt i ( n h n gc c n h q u nl k h n gt h b t un h nt h c n g t n g t n h m t d c hv q u a nt r n gn h P A ) . C u i c n g , k h i k h n gc a i a n gn h nt i b t us n i p p i n gd yl o a . T i n i " c t h " b i v , d os p h c t pc a C++ , n t h c s c t h r h n d i c h u y n nJ a v a . Nh n gq u y t n hc a n g nn g l a c h nc n h i uy ut , v t r o n gc u ns c hn y , t i s g i n hr n gb n c h nC++ . T u yn h i n , n h nv oc t D a nS a k s ' t r o n gC/ C++T p c h c a n g i s d n g i v i m t s i ut r a q u a nt r n gv oC++t h c h i nt h v i n . D oc i t h i nn n gs u t c a n , l n g nn g J a v a c n gc n c x e mx t y . T r o n g , t i k h u y nb nn nn h nJ a v a ( h t t p : / / j a v a . s u n . c o m) v P y t h o n( h t t p : / / www. P y t h o n . o r g ) .

C c r a n hg i i g i a c c t r n hb i nd c hv p h i nd c hc t h c x uh n gt r t h n hm t c h t m , c b i t l v i P y t h o n , t r o n g c n h i u t n hn n gv s c m n hc a m t n g nn g b i nd c hn h n gq u a yv n gn h a n hc h n gc a m t n g nn g g i i t h c h . P y t h o nl i l m t n g o i l , v n c n gc u n gc pb i nd c hr i n gb i t .

T i s k h u y nb nn ns d n gP e r l h a yP y t h o n t n gh a n h i mv n yn h m t p h nc a q u t r n ht h v i n n gg i c a b n ( x e m www. P e r l . o r gh o c www. P y t h o n . o r g ) . T h c t , c m t s b i nt h c a g e t l i n e ( ) , s c t h ol u nk t r o n gc h n gi o s t r e a ms t r o n gT p2 .

N ub n c b i t mo n gmu nn h nt h yt t c n h n gg c t h c t h c h i nv i c c t h v i nv c c t h n hp h nt i uc h u nk h c , x e mt p2 c a c u ns c hn yt i www. B r u c e E c k e l . c o m, v c n gwww. d i n k u mwa r e . c o m. L ur n gt t c c c c n g c d n gn h k t t h c s a uk h i c c t h a t h u ns px pm t s v t l md i nr a . S m ut h u ng i a p h o n gc c h c a m n hd n gl b t t n . X e mP h l c A mt v p h o n gc c hm h a c a c u ns c hn y . Nh K r i s C . Ma t s o nc h ot h yc h b i t pn y .

T r k h i b nc c c ht i pc nr t n g h i mn g t r n g" t t c c c t h a ms i q u a t r o n gC/C++l g i t r , v " g i t r " c a m t m n gl n h n gg c s nx u t b i c c n hd a n hm n g : . a c h l " i un yc t h c n h nt h yl n gt h e oq u a n i mc a h i n gn g nn g , n h n gt i k h n gn g h r n gn s g i pk h i c g n gl mv i c v i c c k h i n i mc a oc p . V i c b s u n gc c t i l i ut h a mk h ot r o n gC++l mc h o" t t c i q u a l b i g i t r " i k h h i uh n , nm c t i c mt h yn c c hh n s u yn g h v v i c " i n g a n gq u a g i t r " v " i q u a a c h . "

[ 3 0 ] [ 3 1 ] [ 3 2 ]

T h u t n g n yc t h g yr a c u c t r a n hl u n . M t s n g i s d n gn n h n hn g h a y , n h n gn g i k h c s d n gn mt i u k h i nt r u y c p , t h ol u nt r o n gc h n gs a u . v i t m t n hn g h a c h c n n gc h om t c h c n n gm p h i m t m t d a n hs c h i s b i nt h n hs t h t , b np h i s d n gv a r a r g s , m c d n yn nt r n ht r o n gC++ . B nc t h t mt h yc h i t i t v v i c s d n gv a r a r g s t r o n gs t a yCc a b n . T u yn h i n , t r o n gt i uc h u nC++t pt i nt n hl m t t n hn n gp h n .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

319/320

08/10/2013

Suy ngh trong C + +, Vol 1

[ 3 3 ] [ 3 4 ] [ 3 5 ] [ 3 6 ]

Nh n i , i k h i k i ms o t t r u yc p c g i l n gg i .

t nn yl d oJ o h nC a r o l a n , m t t r o n gn h n gn g i t i np h o n g ut r o n gC++ , v t t n h i n , L e wi s C a r r o l l . K t h u t n yc n gc t h c x e mn h l m t h n ht h c c a " c un i " m ut h i t k , c mt t r o n gT p2 . C 9 9 , P h i nb nc pn h t c c t i uc h u nC , c h op h pc c b i n c q u y n ht i b t k i mn ot r o n gm t p h mv i , n h C++ .

M t l nl pt r c c a C++ , d t h ot i uc h u nc h ob i t t u i t h b i nk od i nh t p h mv i m k mt h e oc c c h ov n gl p . M t s t r n hb i nd c hv nt h c h i n i u , n h n gn k h n gp h i l c h n hx c d o , m c a b ns c h c c mt a yn ub ng i i h np h mv i nc h o v n gl p .

[ 3 7 ]

[ 3 8 ] [ 3 9 ]

Ng nn g J a v a c o i yl m t t n gt i m n c m n h v yl m t l i .

O K , c t h b nc t h b n gc c hl a x u n gq u a n hv i c o nt r , n h n gb ns r t , r t x u .

T r o n gt p2 c a c u ns c hn y( c s nmi np h t i www. B r u c e E c k e l . c o m) , b ns t h ym t t n hg ng n gh nc a m t k c ht h c m n gs d n gc c m u .

[ 4 0 ]

[ 4 1 ] [ 4 2 ] [ 4 4 ]

M t s n g i i x a n h n i r n gt t c m i t h t r o n gCl i q u a g i t r , k t k h i b nv t q u a m t c o nt r m t b ns a o c t h c h i n( v v yb n a n g i q u a c o nt r v g i t r ) . T u yn h i nc h n hx c n yc t h c , t i n g h r n gn t h c s b i r i v n . T i t h i i mv i t b i n y , k h n gp h i t t c c c t r n hb i nd c hh t r t n hn n gn y . A n d r e wK o e n i g i v oc h i t i t h nt r o n gc u ns c hc a n gCb y v c mb y ( A d d i s o n We s l e y , 1 9 8 9 ) .

[ 4 3 ]

n gt c g i v i T o m Ma i c a C++L p t r n h h n g d n, Ma i Ha l l , 1 9 9 1 .

[ 4 5 ] [ 4 6 ] [ 4 7 ] [ 4 8 ] [ 4 9 ] [ 5 0 ]

B j a r n e S t r o u s t r u pv Ma r g a r e t E l l i s , C c c h t h c h C++R e f e r e n c e Ma n u a l , A d d i s o n We s l e y , 1 9 9 0 , t r a n g2 0 2 1 . Nh O we nMo r t e n s e nc h ov d n y R o bMu r r a y , C++C h i nl c v c h i nt h u t , A d d i s o n We s l e y , 1 9 9 3 , t r a n g4 7 .

C m t c p h p c b i t c g i l v t r m i c h op h pb ng i m t n h x yd n gc h om t m n ht r c k h i p h nb b n h . N y c g i i t h i us a ut r o n gc h n gn y . T r o n gJ a v a , t r n hb i nd c hs k h n gc h op h pb nl mg i mk h n n gt i pc nc a m t t h n hv i nt r o n gq u t r n ht h a k .

t mh i ut h mv t n gn y , x e mt r n h c c g i i t h c h , b i K e n t B e c k( A d d i s o n We s l e y2 0 0 0 ) . X e mT i c ut r c : C i t h i nt h i t k c a l u t h i nh n h c a Ma r t i nF o wl e r ( A d d i s o n We s l e y1 9 9 9 ) .

[ 5 1 ]

[ 5 2 ] [ 5 4 ]

T r n hb i nd c hc t h t h c h i nh n hv i ob t k c c hn oh mu n , n h n gc c ht h c m n c mt yl m t c c ht i pc ng nn h p h q u t .

M t s t r n hb i nd c hc t h c v n v k c ht h c yn h n gn s c q u h i m.

[ 5 3 ]

S ma l l t a l k , J a v a v P y t h o n , v d , s d n gp h n gp h pn yr t t h n hc n g .

T i B e l l L a b s , n i C++ c p h t mi n h , c r t n h i ul pt r n hv i nC . L mc h oc h n gt t c c c h i uq u h n , t h mc h c h c nm t c h t , t i t k i m c n gt yn h i ut r i u .

[ 5 5 ]

[ 5 6 ] [ 5 7 ]

T r nt h c t , k h n gp h i t t c c o nt r c c n gk c ht h c t r nt t c c c m y . T r o n gb i c n hc a c u c t h ol u nn y , t u yn h i n , c h n gc t h c c o i l g i n gn h a u . V i s n g o i l , t r o n gJ a v a , c c k i ud l i un g u y nt h y . C h n g c t h c h i nk h n g i t n gs c h oh i uq u . C c O O P S t h v i n , K e i t hG o r l e nt r o n gk h i n g NI H. C++N g nn g l p t r n h b i B j a r n e S t r o u s t r u p( 1 p h i nb n , A d d i s o n We s l e y , 1 9 8 6 ) .

[ 5 8 ] [ 5 9 ] [ 6 0 ]

C c n g u nc mh n gc h oc c m ud n gn h l t h u c g e n e r i c A D A .

T t c c c p h n gp h pt r o n gc h a i S ma l l t a l kv P y t h o n c y u n hm y , v d o , n h n gn g nn g k h n gc nm t c c h m u . T r o n gt h c t , b nn h n c c c m uk h n gc m u .

[ 6 1 ]

[ 6 2 ]

Nh t r n .

G i i t h c hc h ot i b i A n d r e wK o e n i g .

file:///C:/Users/thanh_000/Desktop/Thinking in C++ 1nd.htm

320/320

You might also like