c++ can ban [nguyen minh thang]

Upload: dang-nguyen

Post on 05-Apr-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    1/109

    C++ CN BN(Ngi dch: Nguyn Minh Thng [Homepage])

    [Ti liu tham kho: http://www.cplusplus.com/doc/tutorial/]

    1. C bn v C++o Cu trc mt chng trnh C++o Cc bin, kiu v hngo Cc ton to Giao tip vi console

    2. Cc cu trc iu khin v hmo Cc cu trc iu khino Hm (I)o Hm (II)

    3. D liu nng cao

    o Mngo Xu k to Con tro B nh ngo Cc cu trco Cc kiu d liu do ngi dng nh ngha. (typedef, union, enum)

    4. Lp trnh hng i tngo Cc lp. Constructors v Destructors. Con tr ti cc lpo Qu ti cc ton t. Cc thnh phn this, Statico Quan h gia cc lp: bn b, tha ko Cc phn o. a hnh

    5. Phn nng caoo Templateso Namespaceso Exception handling

    Bi 1.1

    Cu trc ca mt chng trnh C++

    C l mt trong nhng cch tt nht bt u hc mt ngn ng lp trnh l bng mt chngtrnh. Vy y l chng trnh u tin ca chng ta :

    // my first program in C++#include

    Hello World!

    mailto:[email protected]?subject=[DDTH]%20-%20Tute:%20C++%20can%20banhttp://www.hackervn.net/http://www.cplusplus.com/doc/tutorial/http://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai1_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai1_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai1_3.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai1_4.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai2_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai2_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai2_3.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_3.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_4.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_5.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_6.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_3.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_4.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai5_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai5_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai5_3.htmhttp://www.hackervn.net/http://www.cplusplus.com/doc/tutorial/http://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai1_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai1_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai1_3.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai1_4.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai2_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai2_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai2_3.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_3.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_4.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_5.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai3_6.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_3.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_4.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai5_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai5_2.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai5_3.htmmailto:[email protected]?subject=[DDTH]%20-%20Tute:%20C++%20can%20ban
  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    2/109

    int main (){cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    3/109

    thc bnh thng ca mt chng trnh khng c mt li no trong qu trnh thc hin. Nh bns thy trong cc v d tip theo, y l mt cch ph bin nht kt thc mt chng trnh C++.

    Chng trnh c cu trc thnh nhng dng khc nhau n tr nn d c hn nhng hon

    ton khng phi bt buc phi lm vy. V d, thay v vitint main (){

    cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    4/109

    Bi 1.2

    Cc bin, kiu v hng s

    Identifiers

    Mt tn (indentifiers) hp l l mt chui gm cc ch ci, ch s hoc k t gch di. Chiu di ca mt tn l khng gii hn.

    K t trng, cc k t nh du u khng th c mt trong mt tn. Ch c ch ci, ch s v k t gch di l c cho php.Thm vo , mt tn bin lun phi bt u bng mt ch ci. Chng cng c th bt u bng k t gch di ( _ ) nhng k tny thng c dnh cho cc lin kt bn ngoi (external link). Khng bao gi chng bt u bng mt ch s.

    Mt lut na m bn phi quan tm n khi to ra cc tn ca ring mnh l chng khng c trng vi bt k t kho no cangn ng hay ca trnh dch, v d cc tn sau y lun lun c coi l t kho theo chun ANSI-C++ v do vy chng khngth c dng t tn

    asm, car, bool, break, marry, catch, to char, class, const, const_cast, continue, default, delete,do, double, dynamic_cast, else, enum, explicit, extern, false, float, for, friend, goto, if, inline,

    int, long, mutable, namespace, new, operator, private, protected, public, to register,reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, template, this,throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile,wchar_t

    Thm vo , mt s biu din khc ca cc ton t (operator) cng khng c dng lm tn vchng l nhng t c dnh ring trong mt s trng hp.

    and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq

    Trnh dch ca bn c th thm mt t dnh ring c trng khc. V d, rt nhiu trnh dch 16bit (nh cc trnh dch cho DOS) cn c th cc t kho far, huge v near.

    Ch : Ngn ng C++ l "case sensitive" c ngha l phn bit ch hoa ch thng. Do vy bin RESULT khc vi result cngnh Result.

    Cc kiu d liu

    Khi lp trnh, chng ta lu tr cc bin trong b nh ca my tnh nhng my tnh phi bitchng ta mun lu tr g trong chng v cc kiu d liu khc nhau s cn lng b nh khcnhau.

    B nh ca my tnh chng ta c t chc thnh cc byte. Mt byte l lng b nh nh nht m chng ta c th qun l. Mt

    byte c th dng lu tr mt loi d liu nh nh l kiu s nguyn t 0 n 255 hay mt k t. Nhng my tnh c th x lcc kiu d liu phc tp hn bng cch gp nhiu byte li vi nhau, nh s nguyn di hay s thp phn. Tip theo bn s cmt danh sch cc kiu d liu c bn trong C++ cng nh min gi tr m chng c th biu din

    Tn S byte M t Min gi tr

    char 1 K t hay kiu s nguyn 8-bitc du: -128 to 127khng du: 0 to 255

    short 2 kiu s nguyn 16-bit c du: -32763 to 32762

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    5/109

    khng du: 0 to 65535

    long 4 kiu s nguyn 32-bitc du:-2147483648 to2147483647khng du: 0 to 4294967295

    int *S nguyn. di ca n ph thuc vo hthng, nh trong MS-DOS n l 16-bit, trnWindows 9x/2000/NT l 32 bit...

    Xem short, long

    float 4 Dng du phy ng 3.4e + / - 38 (7 digits)

    double 8Dng du phy ng vi chnh xc gpi

    1.7e + / - 308 (15 digits)

    longdouble

    10Dng du phy ng vi chnh xc hnna

    1.2e + / - 4932 (19 digits)

    bool 1Gi tr logic. N mi c thm vo chunANSI-C++. Bi vy khng phi tt c cc

    trnh dch u h tr n.

    true hoc false

    Ngoi cc kiu d liu c bn ni trn cn tn ti cc con tr v cc tham s khng kiu (void) m chng ta s xem xt sau.

    Khai bo mt bin

    c th s dng mt bin trong C++, u tin chng ta phi khai bo n, ghi r n l kiu dliu no. Chng ta ch cn vit tn kiu (nh int, short, float...) tip theo sau l mt tn binhp l. V d

    int a;

    float mynumber;

    Dng u tin khai bo mt bin kiu int vi tn l a. Dng th hai khai bo mt bin kiu floatvi tn mynumber. Sau khi c khai bo, cc bin trn c th c dng trong phm vi cachng trong chng trnh.

    Nu bn mun khai bo mt vi bin c cng mt kiu v bn mun tit kim cng sc vit bn c th khai bo chng trn mtdng, ngn cch cc tn bng du phy. V d

    int a, b, c;

    khai bo ba bin kiu int (a,b v c) v hon ton tng ng vi :

    int a;int b;int c;

    Cc kiu s nguyn (char, short, long and int) c th l s c du hay khng du tu theo min gi tr m chng ta cnbiu din. V vy khi xc nh mt kiu s nguyn chng ta t t kho signedhoc unsignedtrc tn kiu d liu. Vd:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    6/109

    unsigned short NumberOfSons;signed int MyAccountBalance;

    Nu ta khng ch r signedorunsignedn s c coi l c du, v vy trong khai bo th hai chng ta c th vit :

    int MyAccountBalance

    cng hon ton tng ng vi dng khai bo trn. Trong thc t, rt t khi ngi ta dng n t kho signed. Ngoi l duynht ca lut ny kiu char. Trong chun ANSI-C++ n l kiu d liu khc vi signed char v unsigned char.

    c th thy r hn vic khai bo trong chng trnh, chng ta s xem xt mt on m C++ v d nh sau:

    // operating with variables#include int main (){ // declaring variables:

    int a, b;int result;

    // process:a = 5;b = 2;a = a + 1;result = a - b;

    // print out the result:cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    7/109

    int a (0);

    C hai cch u hp l trong C++.

    Phm vi hot ng ca cc bin

    Tt c cc bin m chng ta s s dng u phi c khai bo trc. Mt im khc bit giaCv C++ l trong C++ chng ta c th khai bo bin bt k ni no trong chng trnh, thmch l ngay gia cc lnh thc hin ch khng ch l u khi lnh nh trong C.

    Mc d vy chng ta vn nn theo cch ca ngn ng C khi khai bo cc bin bi v n s rt hu dng khi cn sa cha mtchng trnh c tt c cc phn khai bo c gp li vi nhau. Bi vy, cch thng dng nht khai bo bin l t n trong

    phn bt u ca mi hm (bin cc b) hay trc tip trong thn chng trnh, ngoi tt c cc hm (bin ton cc).

    Global variables (bin ton cc) c th c s dng bt k u trong chng trnh, ngay saukhi n c khai bo.

    Tm hot ng ca local variables (bin cc b) b gii hn trong phn m m n c khai bo. Nu chng c khai bo umt hm (nh hm main), tm hot ng s l ton b hm main. iu c ngha l trong v d trn, cc bin c khai botrong hm main() ch c th c dng trong hm , khng c dng bt k u khc.

    Thm vo cc bin ton cc v cc b, cn c cc bin ngoi (external). Cc bin ny khng nhng c dng trong mt file mngun m cn trong tt c cc file c lin kt trong chng trnh.

    Trong C++ tm hot ng ca mt bin chnh l khi lnh m n c khai bo (mt khi lnh l mt tp hp cc lnh c gpli trong mt bng cc ngoc nhn { } ). Nu n c khai bo trong mt hm tm hot ng s l hm , cn nu c khai botrong vng lp th tm hot ng s ch l vng lp ....

    Cc hng s

    Mt hng s l bt k mt biu thc no mang mt gi tr c nh, nh:

    Cc s nguyn

    1776707-273

    chng l cc hng mang gi tr s. Ch rng khi biu din mt hng kiu s chng ta khng cnvit du ngoc kp hay bt k du hiu no khc.

    Thm vo nhng s h c s 10 ( ci m tt c chng ta u bit) C++ cn cho php s dng cc hng s c s 8 v 16. biu din mt s h c s 8 chng ta t trc n k t 0, biu din s h c s 16 chng ta t trc n hai k t 0x. V d:

    75 // C s 100113 // c s 80x4b // c s 16

    Cc s thp phn (dng du phy ng)Chng biu din cc s vi phn thp phn v/hoc s m. Chng c th bao gm phn thp phn, k t e (biu din 10 m...).

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    8/109

    3.14159 // 3.141596.02e23 // 6.02 x 1023

    1.6e-19 // 1.6 x 10-19

    3.0 // 3.0

    K t v xu k t

    Trong C++ cn tn ti cc hng khng phi kiu s nh:'z''p'"Hello world""How do you do?"

    Hai biu thc u tin biu din cc k t n, cc k t c t trong du nhy n ('), haibiu thc tip theo biu thc cc xu k t c t trong du nhy kp (").

    Khi vit cc k t n hay cc xu k t cn phi chng trong cc du nhy phn bit vi cc tn bin hay cc t kho. Ch:

    x'x'

    x tr n bin x trong khi 'x' l k t hng 'x'.

    Cc k t n v cc xu k t c mt tnh cht ring bit l cc m iu khin. Chng l nhng k t c bit m khng th cvit bt k u khc trong chng trnh nh l m xung dng (\n) hay tab (\t). Tt c u bt u bng du x ngc (\).Sau y l danh sch cc m iu khin :

    \n xung dng

    \r li v u dng

    \t k t tab\v cn thng theo chiu dc

    \b backspace

    \f sang trang

    \a Ku bp

    \' du nhy n

    \" du nhy kp

    \ du hi

    \\ k t x ngc

    V d:

    '\n''\t'"Left \t Right""one\ntwo\nthree"

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    9/109

    Thm vo , biu din mt m ASCII bn cn s dng k t x ngc (\) tip theo l m ASCII vit trong h c s 8 hayc s 16. Trong trng hp u m ASCII c vit ngay sau du s ngc, trong trng hp th hai, s dng s trong h cs 16 bn cn vit k t x trc s (v d \x20 hay \x4A).

    Cc hng chui k t c th c vit trn nhiu dng nu mi dng c kt thc bng mt du s ngc (\):

    "string expressed in \two lines"

    Bn c th ni mt vi hng xu k t ngn cch bng mt hay vi du trng, k t tab, xungdng hay bt k k t trng no khc.

    "we form" "a unique" "string" "of characters"

    nh ngha cc hng (#define)

    Bn c th nh ngha cc hng vi tn m bn mun c th s dng thng xuyn m khng

    mt ti nguyn cho cc bin bng cch s dng ch th #define. y l dng ca n:

    #define identifier value

    V d:

    #define PI 3.14159265#define NEWLINE '\n'#define WIDTH 100

    chng nh ngha ba hng s mi. Sau khi khai bo bn c th s dng chng nh bt k cchng s no khc, v d

    circle = 2 * PI * r;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    10/109

    const int width = 100;const to char tab = '\t';const zip = 12440;

    Trong trng hp kiu khng c ch r (nh trong v d cui) trnh dch s coi n l kiu int.

    Bi 1.3

    Cc ton t

    Qua bi trc chng ta bit n s tn ti ca cc bin v cc hng. Trong C++, thao tcvi chng ta s dng cc ton t, l cc t kho v cc du khng c trong bng ch cinhng li c trn hu ht cc bn phm trn th gii. Hiu bit v chng l rt quan trng v yl mt trong nhng thnh phn c bn ca ngn ng C++.

    Ton t gn (=).

    Ton t gn dng gn mt gi tr no cho mt bin

    a = 5;

    gn gi tr nguyn 5 cho bin a. V tri bt buc phi l mt bin cn v phic th l bt k hng, bin hay kt qu ca mt biu thc.

    Cn phi nhn mnh rng ton t gn lun c thc hin t tri sang phi vkhng bao gi o ngc

    a = b;

    gn gi tr ca bin a bng gi tr ang cha trong bin b. Ch rngchng ta ch gn gi trca b cho a v s thay i ca b sau skhng nh hng n gi tr ca a.

    Mt thuc tnh ca ton t gn trong C++ gp phn gip n vt ln cc ngnng lp trnh khc l vic cho php v phi c th cha cc php gn khc. V d:

    a = 2 + (b = 5);

    tng ng vi

    b = 5;a = 2 + b;

    V vy biu thc sau cng hp l trong C++

    a = b = c = 5;

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    11/109

    gn gi tr 5 cho c ba bin a, b v c

    Cc ton t s hc ( +, -, *, /, % )

    Nm ton t s hc c h tr bi ngn ng l:

    +cng

    - tr

    * nhn

    / chia

    %ly phn d (trong phpchia)

    Th t thc hin cc ton t ny cng ging nh chng c thc hin trong ton hc.iu duy nht c v hi l i vi bn l php ly phn d, k hiu bng du phn trm(%). y chnh l php ton ly phn d trong php chia hai s nguyn vi nhau. V d,nu a = 11 % 3;, bin a s mang gi tr 2 v 11 = 3*3 +2.

    Cc ton t gn phc hp (+=, -=, *=, /=, %=, >>=,

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    12/109

    a++;a+=1;a=a+1;

    Mt tnh cht ca ton t ny l n c th l tin thoc hu t, c ngha l c th vit

    trc tn bin (++a) hoc sau (a++) v mc d trong hai biu thc rt n gin n ccng ngha nhng trong cc thao tc khc khi m kt qu ca vic tng hay gim cs dng trong mt biu thc th chng c th c mt khc bit quan trng v ngha:Trong trng hp ton t c s dng nh l mt tin t (++a) gi tr c tng trckhi biu thc c tnh v gi tr tng c s dng trong biu thc; trong trng hpngc li (a++) gi tr trong bin a c tng sau khi tnh ton. Hy ch s khc bit:

    V d 1 V d 2

    B=3;

    A=++B;

    // A is 4, B is 4

    B=3;

    A=B++;

    // A is 3, B is 4

    Cc ton t quan h ( ==, !=, >, =, Ln hn

    < Nh hn

    > =Ln hn hoc

    bng

    < =Nh hn hocbng

    V d:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    13/109

    (7 == 5)s tr gi trfalse

    (6 >= 6)s tr gi trtrue

    tt nhin thay v s dng cc s, chng ta c th s dng bt c biuthc no. Cho a=2,b=3 v c=6

    (a*b >= c)s tr gi trtrue.

    (b+4 < a*c)s tr gi trfalse

    Cn ch rng = (mt du bng) lf hon ton khc vi == (hai du bng).

    Du u tin l mt ton t gn ( gn gi tr ca biu thc bn phi cho bin bn tri) v du cn li (==) l mt ton t quan h nhm so snh xem haibiu thc c bng nhau hay khng.

    Trong nhiu trnh dch c trc chun ANSI-C++ cng nh trong ngn ng C,cc ton t quan h khng tr v gi tr logic true hoc false m tr v gi trint vi 0 tng ng vi false cn gi tr khc 0 (thng l 1) th tng ng vitrue.

    Cc ton t logic ( !, &&, || ).

    Ton t! tng ng vi ton t logic NOT, n ch c mt i s pha bnphi v vic duy nht m n lm l i ngc gi tr ca i s ttrue sangfalse hoc ngc li. V d:

    !(5 == 5)tr v false v biu thc bn phi (5 == 5) c gitrtrue.

    !(6

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    14/109

    i s thnht

    a

    i s thhaib

    Kt qua && b

    Kt qua || b

    true true true true

    true false false true

    false true false true

    false false false false

    V d:

    ( (5 == 5) && (3 > 6) ) tr v false( true && false ).( (5 == 5) || (3 > 6)) tr v true( true || false ).

    Ton t iu kin ( ? ).

    Ton t iu kin tnh ton mt biu thc v tr v mt gi tr khc tu thucvo biu thc l ng hay sai. Cu trc ca n nh sau:

    condition ?result1 : result2

    Nu condition l true th gi tr tr v s l result1, nu khng gi tr tr vl result2.

    7==5 ? 4 : 3 tr v 3 v 7 khng bng5.

    7==5+2 ? 4 : 3 tr v 4 v 7 bng 5+2.

    5>3 ? a : b tr v a, v 5 ln hn 3.

    a>b ? a : btr v gi tr ln hn, ahocb.

    Cc ton t thao tc bit ( &, |, ^, ~, ).Cc ton t thao tc bit thay i cc bit biu din mt bin, c ngha l thayi biu din nh phn ca chng

    tont

    asm M t

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    15/109

    &AND

    Logical AND

    | OR Logical OR

    ^ XOR Logical exclusiveOR

    ~NOT

    o ngc bit

    >SHR

    Dch bit sangphi

    Cc ton t chuyn i kiu

    Cc ton t chuyn i kiu cho php bn chuyn i d liu t kiu nysang kiu khc. C vi cch lm vic ny trong C++, cch c bn nhtc tha k t ngn ng C l t trc biu thc cn chuyn i tn kiu dliu c bc trong cp ngoc n (), v d:

    int i;float f = 3.14;i = (int) f;

    on m trn chuyn s thp phn 3.14 sang mt s nguyn (3). y, tont chuyn i kiu l (int). Mt cch khc lm iu ny trong C++ l sdng cc constructors ( mt s sch thut ng ny c dch l cu tnhng ti thy n c v khng xui tai lm) thay v dng cc ton t : ttrc biu thc cn chuyn i kiu tn kiu mi v bao bc biu thc giamt cp ngoc n.

    i = int ( f );

    C hai cch chuyn i kiu u hp l trong C++. Thm vo ANSI-C++cn c nhng ton t chuyn i kiu mi c trng cho lp trnh hng itng.

    sizeof()

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    16/109

    Ton t ny c mt tham s, c th l mt kiu d liu hay l mt bin vtr v kch c bng byte ca kiu hay i tng .

    a = sizeof (char);

    a s mang gi tr 1 v kiu char lun c kch c 1 byte trn mi h thng. Gitr tr v ca sizeofl mt hng s v vy n lun lun c tnh trc khichng trnh thc hin.

    Cc ton t khc

    Trong C++ cn c mt s cc ton t khc, nh cc ton t lin quan ncon tr hay lp trnh hng i tng. Chng s c ni n c th trongcc phn tng ng.

    Th t u tin ca cc ton t

    Khi vit cc biu thc phc tp vi nhiu ton hng cc bn c th t hi ton hngno c tnh trc, ton hng no c tnh sau. V d nh trong biu thc sau:

    a = 5 + 7 % 2

    c th c hai cch hiu sau:

    a = 5 + (7 % 2) vi kt qu l 6, hoc

    a = (5 + 7) % 2 vi kt qu l 0

    Cu tr li ng l biu thc u tin. V nguyn nhn ni trn, ngn ng C++ thit lp mt th t u tin gia cc ton t, khng ch ring cc ton t s hc mtt c cc ton t c th xut hin trong C++. Th t u tin ca chng c lit ktrong bng sau theo th t t cao xung thp.

    Tht

    Ton t M tAssociativity

    1 :: scope Tri

    2 () [ ] -> . sizeof Tri

    3 ++ -- tng/gim Phi

    ~ o ngc bit

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    17/109

    ! NOT

    & * Ton t con tr

    (type) Chuyn i kiu

    + - Dng hoc m

    4 * / % Ton t s hc Tri

    5 + - Ton t s hc Tri

    6 > Dch bit Tri

    7 < >= Ton t quan h Tri

    8 == != Ton t quan h Tri

    9 & ^ |Ton t thao tcbit

    Tri

    10 && || Ton t logic Tri

    11 ?: Ton t iu kinPhi

    12= += -= *= /= %=

    >>=

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    18/109

    Trong th vin iostream ca C++, cc thao tc vo ra c bn ca mt chng trnh c h trbi hai dng d liu : cin nhp d liu v cout xut. Thm vo , cn c cerr v clog lhai dng d liu dng hin th cc thng bo li trn thit b ra chun (thng l mn hnh)hoc ra mt file. Thng thng cout c gn vi mn hnh cn cin c gn vi bn phm.

    S dng hai dng d liu ny bn s c th giao tip vi ngi s dng v bn c th hin th ccthng bo ln mn hnh cng nh nhn d liu t bn phm.

    Xut d liu (cout)

    Dng cout c s dng vi ton t qu ti

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    19/109

    Thm vo , xung dng bn c th s dng tham s endl. V d

    cout age;

    khai bo bin age c kiu int v i nhp d liu t cin (bn phm) lu tr n trong binkiu nguyn ny.

    cin ch bt u s l d liu nhp t bn phm sau khi phm Enter c g. V vy d bn chnhp mt k t th cin vn s kin nhn ch cho n khi bn g phm Enter.

    // i/o example#include int main (){int i;cout > i;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    20/109

    khng phi l nhng g m chng trnh mong i t ngi dng. Bi vy khi bn s dng dliu nhp vo t cin bn phi tin chc rng ngi dng s hon ton hp tc v rng anh ta skhng nhp tn ca mnh khi chng trnh yu cu nhp s nguyn. Sau ny, khi nghin cu vics dng cc xu k t chng ta s xem xt cc gii php kh thi gii quyt cc li loi ny.

    Bn c th dng cin nhp mt lc nhiu d liu t ngi dng:cin >> a >> b;

    tng ng vi

    cin >> a;cin >> b;

    Trong c hai trng hp ngi s dng phi cung cp hai d liu, mt cho bin a v mt chobinb v c ngn cch bi mt du trng hp l: mt du cch, du tab hay k t xung dng.

    Trong trng hp kiu khng c ch r (nh trong v d cui) trnh dch s coi n l kiu int.

    Bi 2.1

    Cc cu trc iu khin.

    Mt chng trnh thng khng ch bao gm cc lnh tun t ni tip nhau. Trong qu trnhchy n c th r nhnh hay lp li mt on m no . lm iu ny chng ta s dng cccu trc iu khin.

    Cng vi vic gii thiu cc cu trc iu khin chng ta cng s phi bit ti mt khi nimmi: khi lnh, l mt nhm cc lnh c ngn cch bi du chm phy (;) nhng cgp trong mt khi gii hn bi mt cp ngoc nhn: { v }.

    Hu ht cc cu trc iu khin m chng ta s xem xt trong chng ny cho php s dng mtlnh n hay mt khi lnh lm tham s, tu thuc vo chng ta c t n trong cp ngoc nhnhay khng.

    Cu trc iu kin: if v else

    Cu trc ny c dng khi mt lnh hay mt khi lnh ch c thc hin khi mt iu kinno tho mn. Dng ca n nh sau:

    if (condition) statement

    trong condition l biu thc s c tnh ton. Nu iu kin l true, statement cthc hin. Nu khng statement b b qua (khng thc hin) v chng trnh tip tc thc hinlnh tip sau cu trc iu kin.

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    21/109

    V d, on m sau y s vit x is 100 ch khi bin x cha gi tr 100:

    if (x == 100)cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    22/109

    // custom countdown using while#include int main (){int n;cout > n;while (n>0) {

    cout 0) cn c tho mn.

    Chng ta cn phi nh rng vng lp phi kt thc mt im no , v vy bntrong vng lp chng ta phi cung cp mt phng thc no buccondition tr thnh sai nu khng th n s lp li mi mi. Trong v d trnvng lp phi c lnh --n; lm cho condition tr thnh sai sau mt s lnlp.

    Vng lp do-whileDng thc:

    do statement while (condition);

    Chc nng ca n l hon ton ging vng lp while ch tr c mt iu l iu kin iukhin vng lp c tnh tonsau khistatement c thc hin, v vy statement sc thc hin t nht mt ln ngay c khi condition khng bao gi c tho mn. Vd, chng trnh di y s vit ra bt k s no m bn nhp vo cho n khi bn nhps 0.

    // number echoer#include int main (){unsigned long n;

    do {cout > n;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    23/109

    Vng lp do-while thng c dng khi iu kin kt thc vng lp nm trong vnglp, nh trong v d trn, s m ngi dng nhp vo l iu kin kim tra kt thcvng lp. Nu bn khng nhp s 0 trong v d trn th vng lp s khng bao gi chmdt.

    Vng lpfor.Dng thc:

    for (initialization; condition; increase) statement;

    v chc nng chnh ca n l lp li statement chng no condition cn mang gi trng, nh trong vng lp while. Nhng thm vo , for cung cp ch dnh cho lnhkhi to v lnh tng. V vy vng lp ny c thit k c bit lp li mt hnh ngvi mt s ln xc nh.

    Cch thc hot ng ca n nh sau:1, initialization c thc hin. Ni chung n t mt gi kh ban u chobin iu khin. Lnh ny c thc hin ch mt ln.2, condition c kim tra, nu n l ng vng lp tip tc cn nu khngvng lp kt thc v statement c b qua.3, statement c thc hin. N c th l mt lnh n hoc l mt khi lnhc bao trong mt cp ngoc nhn.4, Cui cng, increase c thc hin tng bin iu khin v vng lp quaytr li bc 2.

    Sau y l mt v d m ngc s dng vngfor.// countdown using a for loop#include int main (){for (int n=10; n>0; n--) {

    cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    24/109

    {// ci g y cng c...}

    Vng lp ny s thc hin 50 ln nu nh n v i khng b thay i trong thn vnglp:

    Cc lnh r nhnh v lnh nhy

    Lnh break.S dng breakchng ta c th thot khi vng lp ngay c khi iu kin n kt thccha c tho mn. Lnh ny c th c dng kt thc mt vng lp khng xc

    nh hay buc n phi kt thc gia chng thay v kt thc mt cch bnh thng. V d,chng ta s dng vic m ngc trc khi n kt thc:// break loop example#include int main (){int n;for (n=10; n>0; n--) {

    cout 0; n--) {if (n==5) continue;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    25/109

    Lnh ny cho php nhy v iu kin ti bt k im no trong chng trnh. Ni chungbn nn trnh dng n trong chng trnh C++. Tuy nhin chng ta vn c mt v ddng lnh goto m ngc:

    // goto loop example#include int main (){int n=10;loop: ;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    26/109

    Cui cng, nu gi tr biu thc khng bng bt k hng no c ch nh trn (bn c th chnh bao nhiu cu lnh case tu thch), chng trnh s thc hin cc lnh trong phn default:nu n tn ti v phn ny khng bt buc phi c.

    Hai on m sau l tng ng:

    v d switch if-else tng ng

    switch (x) {case 1:

    cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    27/109

    type name ( argument1, argument2, ...) statement

    trong :type l kiu d liu c tr v ca hmname l tn gi ca hm.

    arguments l cc tham s (c nhiu bao nhiu cng c tu theo nhu cu). Mt tham s baogm tn kiu d liu sau l tn ca tham s ging nh khi khai bo bin (v d int x) vng vai tr bn trong hm nh bt k bin no khc. Chng dng truyn tham s cho hm khin c gi. Cc tham s khc nhau c ngn cch bi cc du phy.statement l thn ca hm. N c th l mt lnh n hay mt khi lnh.

    Di y l v d u tin v hm:

    // function example#include int addition (int a, int b)

    {int r;r=a+b;return (r);

    }int main (){int z;z = addition (5,3);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    28/109

    Dng lnh sau:

    return (r);

    kt thc hm addition, v tr li quyn iu khin cho hm no gi n (main) v tip tc

    chng trnh ci im m n b ngt bi li gi n addition. Nhng thm vo , gi trc dng vi lnh return (r) chnh l gi tr c tr v ca hm.\

    Gi tr tr v bi mt hm chnh l gi tr ca hm khi n c tnh ton. V vy bin z s c cgi tr c tr v bi addition (5, 3), l 8.

    Phm vi hot ng ca cc bin [nhc li]

    Bn cn nh rng phm vi hot ng ca cc bin khai bo trong mt hm hay bt k mt khilnh no khc ch l hm hay khi lnh v khng th s dng bn ngoi chng. V d, trongchng trnh v d trn, bn khng th s dng trc tip cc bin a,b hay r trong hmmain vchng l cc bin cc b ca hm addition. Thm vo bn cng khng th s dng bin ztrc tip bn trong hm addition v n lm bin cc b ca hmmain.

    Tuy nhin bn c th khai bo cc bin ton cc c th s dng chng bt k u, bn tronghay bn ngoi bt k hm no. lm vic ny bn cn khai bo chng bn ngoi mi hm haycc khi lnh, c ngha l ngay trong thn chng trnh.

    y l mt v d khc v hm:

    // function example#include int subtraction (int a, int b){int r;r=a-b;return (r);

    }

    int main (){int x=5, y=3, z;z = subtraction (7,2);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    29/109

    subtraction (x,y)

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    30/109

    chng ta c th vit:

    z = subtraction (x,y) + 4;

    cng hon ton cho kt qu tng ng. Ch rng du chm phy c t cui biu thcch khng cn thit phi t ngay sau li gi hm.

    Cc hm khng kiu. Cch s dng void.

    Nu bn cn nh c php ca mt li khai bo hm:

    type name ( argument1, argument2...) statement

    bn s thy r rng rng n bt u vi mt tn kiu, l kiu d liu s c hm tr v bilnh return. Nhng nu chng ta khng mun tr v gi tr no th sao ?

    Hy tng tng rng chng ta mun to ra mt hm ch hin th mt thng bo ln mnhnh. N khng cn tr v mt gi tr no c, hn na cng khng cn nhn tham s no ht. Vvy ngi ta ngh ra kiu d liu voidtrong ngn ng C. Hy xem xt chng trnh sau:

    // void function example#include void dummyfunction (void){cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    31/109

    Hm (II).

    Truyn tham s theo tham s gi trhay tham s bin.

    Cho n nay, trong tt c cc hm chng ta bit, tt c cc tham s truyn chohm u c truyn theo gi tr. iu ny c ngha l khi chng ta gi hm vi cctham s, nhng g chng ta truyn cho hm l cc gi tr ch khng phi bn thncc bin. V d, gi s chng ta gi hm addition nh sau:

    int x=5, y=3, z;z = addition ( x , y );

    Trong trng hp ny khi chng ta gi hm addition th cc gi tr 5 and 3 ctruyn cho hm, khng phi l bn thn cc bin.

    n y cc bn c th hi ti: Nh vy th sao, c nh hng g u ? iu ng ni y lkhi cc bn thay i gi tr ca cc bin a hayb bn trong hm th cc bin x v y vn khngthay i v chng u c c truyn cho hm ch cgi tr ca chng c truyn m thi.

    Hy xt trng hp bn cn thao tc vi mt bin ngoi bn trong mt hm. V vy bn s phitruyn tham s di dng tham s bin nh trong hm duplicate trong v d di y:

    // passing parameters by reference#include void duplicate (int& a, int& b, int&c){a*=2;b*=2;c*=2;

    }int main (){int x=1, y=3, z=7;duplicate (x, y, z);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    32/109

    iu u tin lm bn ch l trong khai bo ca duplicate theo sau tn kiu ca mi tham su l du v (&), bo hiu rng cc tham s ny c truyn theo tham s bin ch khngphi tham s gi tr.

    Khi truyn tham s di dng tham s bin chng ta ang truyn bn thn bin v bt k s

    thay i no m chng ta thc hin vi tham s bn trong hm s nh hng trc tip nbin .

    Trong v d trn, chng ta lin kt a,b v c vi cc tham s khi gi hm (x, y v z) v mi sthay i vi a bn trong hm s nh hng n gi tr ca xv hon ton tng t vib v y, cv z.

    Kiu khai bo tham s theo dng tham s bin s dng du v (&) ch c trong C++.Trong ngn ng C chng ta phi s dng con tr lm vic tng t nh th.

    Truyn tham s di dng tham s bin cho php mt hm tr v nhiu hn mt gi tr. V d,y l mt hm tr v s lin trc v lin sau ca tham s u tin.

    // more than one returning value#include void prevnext (int x, int& prev, int&

    next){prev = x-1;next = x+1;

    }int main (){int x=100, y, z;prevnext (x, y, z);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    33/109

    ca tham s vn c ch nh khi gi hm th gi tr mc nh s b b qua. Vd:

    // default values in functions#include

    int divide (int a, int b=2){int r;r=a/b;return (r);

    }int main (){cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    34/109

    }float divide (float a, float b){return (a/b);

    }

    int main (){int x=5,y=2;float n=5.0,m=2.0;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    35/109

    // factorial calculator#include long factorial (long a){if (a > 1)

    return (a * factorial (a-1));elsereturn (1);

    }int main (){long l;cout > l;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    36/109

    N khng c bt k lnh no cho hm. iu ny c ngha l n khng baogm thn hm vi tt c cc lnh thng c bc trong cp ngoc nhn { }.

    N kt thc bng du chm phy (;). Trong phn lit k cc tham s ch cn vit kiu ca chng l . Vic vit

    tn ca cc tham s trong phn khai bo mu l khng bt buc.

    V d:

    // prototyping#include void odd (int a);void even (int a);int main (){int i;do {cout > i;odd (i);

    } while (i!=0);return 0;

    }void odd (int a){if ((a%2)!=0) cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    37/109

    hm phi c khi bo mu l trong oddc mt li gi n even v trong even cmt li gi n odd. V vy nu khng c hm no c khai bo trc th li chcchn s xy ra.

    Rt nhiu lp trnh vin kinh nghim khuyn rng tt c cc hm nn c khai bo mu.

    cng l li khuyn ca ti, nht l trong trng hp c nhiu hm hoc chng rt di, khi vickhai bo tt c cc hm cng mt ch cho php chng ta bit phi gi cc hm nh th no, vvy tit kim c thi gian.

    Bi 3.1

    Mng

    Mng l mt dy cc phn t c cng kiu c t lin tip trong b nh v c th truy xutn tng phn t bng cch thm mt ch s vo sau tn ca mng.

    iu ny c ngha l, v d, chng ta c th lu 5 gi tr kiu int m khng cn phi khai bo 5bin khc nhau.V d, mt mng cha 5 gi tr nguyn kiu int c tn l billy c th c biudin nh sau:

    trong mi mt trng biu din mt phn t ca mng, trong trng hp ny lcc gi tr nguyn kiu int. Chng c nh s t0 n 4 v phn t u tin ca

    mng lun l 0 bt k di ca n l bao nhiu.

    Nh bt k bin no khc, mt mng phi c khai bo trc khi c th s dng.Mt khai bo in hnh cho mt mng trong C++ nh sau:

    type name [elements];

    trong type l mt kiu d liu hp l (int, float...), name l mt tn bin hp l vtrng elements ch nh mng s cha bao nhiu phn t

    V vy, khai bo billynh trnh by trn chng ta ch cn mt dng n ginnh sau:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    38/109

    int billy [5];

    Ch : Trng elements bn trong cp ngoc [] phi l mt gi tr hng khi khaibo mt mng, v mng l mt khi nh tnh c kch c xc nh v trnh bin dchphi c kh nng xc nh xem cn bao nhiu b nh cp pht cho mng trckhi cc lnh c th c thc hin.

    Khi to mt mng.

    Khi khai bo mt mng vi tm hot ng a phng (trong mt hm), theo mcnh n s khng c khi to, v vy ni dung ca n l khng xc nh cho nkhi chng ra lu cc gi tr ln .

    Nu chng ta khai bo mt mng ton cc (bn ngoi tt c cc hm) n s ckhi to v tt c cc phn t c t bng 0. V vy nu chng ta khai bo mngton cc:

    int billy [5];

    mi phn t ca billys c khi to l 0:

    Nhng thm vo , khi chng ta khai bo mt mng, chng ta c th gn cc gitr khi to cho tng phn t ca n. V d:

    int billy [5] = { 16, 2, 77, 40, 12071 };

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    39/109

    lnh trn s khai bo mt mng nh sau:

    S phn t trong mng m chng ta khi to vi cp ngoc nhn { } phi bng sphn t ca mng c khai bo vi cp ngoc vung [ ]. Bi v iu ny c thc coi l mt s lp li khng cn thit nn C++ cho php trng gia cpngoc vung, kch thc ca mng c xc nh bng s gi tr gia cp ngocnhn.

    Truy xut n cc phn t ca mng.

    bt k im no ca chng trnh trong tm hot ng ca mng, chng ta c th truy xuttng phn t ca mng c hay chnh sa nh l i vi mt bin bnh thng. Cu trc can nh sau:

    name[index]

    Nh trong v d trc ta c mng billygm 5 phn t c kiu int, chng ta c thtruy xut n tng phn t ca mng nh sau:

    V d, lu gi tr 75 vo phn t th ba ca billyta vit nh sau:

    billy[2] = 75;

    v, v d, gn gi tr ca phn t th 3 ca billy cho bin a, chng ta vit:

    a = billy[2];

    V vy, xt v mi phng din, biu thcbilly[2] ging nh bt k mt bin kiuint.

    Ch rng phn t th ba cabilly lbilly[2], v mng bt u t ch s 0. V vy, phn tcui cng s lbilly[4]. V vy nu chng ta vitbilly[5], chng ta s truy xut n phn tth 6 ca mng v vt qu gii hn ca mng.

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    40/109

    Trong C++, vic vt qu gii hn ch s ca mng l hon ton hp l, tuy nhin n c th gyra nhng vn thc s kh pht hin bi v chng khng to ra nhng li trong qu trnh dchnhng chng c th to ra nhng kt qu khng mong mun trong qu trnh thc hin. Nguynnhn ca vic ny s c ni n k hn khi chng ta bt u s dng con tr.

    Cn phi nhn mnh rng chng ta s dng cp ngoc vung cho hai tc v: u tin l t kchthc cho mng khi khai bo chng v th hai, ch nh ch s cho mt phn t c th camng khi xem xt n n.

    int billy[5]; // khai bo mt mng mi.billy[2] = 75; // truy xut n mt phn t ca mng.

    Mt vi thao tc hp l khc vi mng:

    billy[0] = a;billy[a] = 75;b = billy [a+2];

    billy[billy[a]] = billy[2] + 5;

    // v d v mng#include int billy [] = {16, 2, 77, 40, 12071};int n, result=0;int main (){for ( n=0 ; n

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    41/109

    int jimmy [3][5];

    v, v d, cch truy xut n phn t th hai theo chiu dc v th t theo chiungang trong mt biu thc nh sau:

    jimmy[1][3]

    (hy nh rng ch s ca mng lun bt u t 0).

    Mng nhiu chiu khng b gii hn bi hai ch s (hai chiu), Chng c th chabao nhiu ch s ty thch mc d t kh cn phi dng n mng ln hn 3 chiu.

    Hy th xem xt lng b nh m mt mng c nhiu ch s cn n. V d:char century [100][365][24][60][60];

    gn mt gi tr char cho mi giy trong mt th k, phi cn n hn 3 t gi trchars! Chng ta s phi cn khong 3GB RAM khai bo n.

    Mng nhiu chiu thc ra l mt khi nim tru tng v chng ta c th c kt qu tng t vimng mt chiu bng mt thao tc n gin gia cc ch s ca n:

    int jimmy [3][5]; tng ng vi

    int jimmy [15]; (3 * 5 = 15)

    Di y l hai v d vi cng mt kt qu nh nhau, mt s dng mng hai chiuv mt s dng mng mt chiu:

    // multidimensional array#include #define WIDTH 5#define HEIGHT 3int jimmy [HEIGHT][WIDTH];

    int n,m;int main (){for (n=0;n

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    42/109

    } return 0;}

    khng mt chng trnh no vit g ra mn hnh nhng c hai u gn gi tr vo khi nh c tnjimmy theo cch sau:

    Chng ta nh ngha hng (#define) n gin ha nhng chnh sa sau nyca chng trnh, v d, trong trng hp chng ta quyt nh tng kch thc camng vi chiu cao l 4 thay v l 3, chng ta ch cn thay i dng:

    #define HEIGHT 3

    thnh

    #define HEIGHT 4

    v khng phi c thm s thay i no na i vi chng trnh.

    Dng mng lm tham s.

    Vo mt lc no c th chng ta cn phi truyn mt mng ti mt hm nh l

    mt tham s. Trong C++, vic truyn theo tham s gi tr mt khi nh l khnghp l, ngay c khi n c t chc thnh mt mng. Tuy nhin chng ta li cphp truyn a ch ca n, vic ny cng to ra kt qu thc t ging thao tc trn nhng li nhanh hn nhiu v hiu qu hn.

    c th nhn mng l tham s th iu duy nht chng ta phi lm khi khai bo hm l ch nhtrong phn tham s kiu d liu c bn ca mng, tn mng v cp ngoc vung trng. V d,hm sau:

    void procedure (int arg[])

    nhn vo mt tham s c kiu "mng ca char" v c tn arg. truyn tham scho hm ny mt mng c khai bo:

    int myarray [40];

    ch cn gi hm nh sau:

    procedure (myarray);

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    43/109

    Di y l mt v d c th

    // arrays as parameters#include void printarray (int arg[], int

    length) {for (int n=0; n

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    44/109

    Trong tt c cc chng trnh chng ta thy cho n gi, chng ta ch s dng cc bin kius, ch dng biu din cc s. Nhng bn cnh cc bin kiu s cn c cc xu k t, chngcho php chng ta biu din cc chui k t nh l cc t, cu, on vn bn... Cho n gichng ta mi ch dng chng di dng hng ch cha quan tm n cc bin c th chachng.

    Trong C++ khng c kiu d liu c bn lu cc xu k t. c th tha mn nhu cu ny,ngi ta s dng mng c kiu char. Hy nh rng kiu d liu ny (char) ch c th lu trmt k t n, bi vy n c dng to ra xu ca cc k t n.

    V d, mng sau (hay l xu k t):

    char jenny [20];

    c th lu mt xu k t vi di cc i l 20 k t. Bn c th tng tng n nh sau:

    Kch thc cc i ny khng cn phi lun lun dng n. V d, jenny c th lu xu"Hello" hay "Merry christmas". V cc mng k t c th lu cc xu k t ngn hn dica n, trong C++ c mt quy c kt thc mt ni dung ca mt xu k t bng mt k tnull, c th c vit l '\0'.

    Chng ta c th biu din jenny (mt mng c 20 phn t kiu char) khi lu tr xu k t"Hello" v "Merry Christmas" theo cch sau:

    Ch rng sau ni dung ca xu, mt k t null ('\0') c dng bo hiu kt thc xu.Nhng mu xm biu din nhng gi tr khng xc nh.

    Khi to cc xu k t.

    V nhng xu k t l nhng mng bnh thng nn chng cng nh cc mng khc. V d, nuchng ta mun khi to mt xu k t vi nhng gi tr xc nh chng ta c th lm iu tng t nh vi cc mng khc:

    char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

    Tuy nhin, chng ta c th khi to gi tr cho mt xu k t bng cch khc: s dng cc hngxu k t.

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    45/109

    Trong cc biu thc chng ta s dng trong cc v d trong cc chng trc cc hng xu kt xut hin vi ln. Chng c biu din trong cp ngoc kp ("), v d:

    "the result is: "

    l mt hng xu k t chng ta s dng mt s ch.

    Khng ging nh du nhy n (') cho php biu din hng k t, cp ngoc kp (") l hngbiu din mt chui k t lin tip, v cui chui mt k t null ('\0') lun c t ng thmvo.

    V vy chng ta c th khi to xumystring theo mt trong hai cch sau y:

    char mystring [] = { 'H', 'e', 'l', 'l', 'o', '\0' };char mystring [] = "Hello";

    Trong c hai trng hp mng (hay xu k t)mystring c khai bo vi kch thc 6 k t: 5

    k t biu din Hello cng vi mt k t null.Trc khi tip tc, ti cn phi nhc nh bn rng vic gn nhiu hng nh vic s dng dungoc kp (") ch hp l khi khi to mng, tc l lc khai bo mng. Cc biu thc trongchng trnh nh:

    mystring = "Hello";mystring[] = "Hello";

    l khng hp l, c cu lnh di y cng vy:

    mystring = { 'H', 'e', 'l', 'l', 'o', '\0' };

    Vy hy nh: Chng ta ch c th "gn" nhiu hng cho mt mng vo lc khi to n. Nguynnhn l mt thao tc gn (=) khng th nhn v tri l c mt mng m ch c th nhn mt trongnhng phn t ca n. Vo thi im khi to mng l mt trng hp c bit, v n khngthc s l mt lnh gn mc d n s dng du bng (=).

    Gn gi tr cho xu k t

    V v tri ca mt lnh gn ch c th l mt phn t ca mng ch khng th l c mng, chngta c th gn mt xu k t cho mt mng kiu char s dng mt phng php nh sau:

    mystring[0] = 'H';mystring[1] = 'e';mystring[2] = 'l';mystring[3] = 'l';mystring[4] = 'o';mystring[5] = '\0';

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    46/109

    Nhng r rng y khng phi l mt phng php thc t. gn gi tr cho mt xu k t,chng ta c th s dng lot hm kiu strcpy (string copy), hm ny c nh ngha trongstring.h v c th c gi nh sau:

    strcpy (string1, string2);

    Lnh ny copy ni dung ca string2 sang string1. string2 c th l mt mng, con tr haymt hng xu k t, bi vy lnh sau y l mt cch ng gn xu hng "Hello" cho

    mystring:

    strcpy (mystring, "Hello");

    V d:

    // setting value to string#include #include

    int main (){char szMyName [20];strcpy (szMyName,"J. Soulie");cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    47/109

    Mt phng thc thng dng khc gn gi tr cho mt mng l s dng trc tip dng nhpd liu (cin). Trong trng hp ny gi tr ca xu k t c gn bi ngi dng trong qutrnh chng trnh thc hin.

    Khi cin c s dng vi cc xu k t n thng c dng vi phng thc getline ca n,

    phng thc ny c th c gi nh sau:cin.getline ( char buffer[], int length, char delimiter= ' \n');

    trong buffer(b m) l a ch ni s lu tr d liu vo (nh l mt mng chng hn),length l di cc i ca b m (kch thc ca mng) v delimiterl k t c dng kt thc vic nhp, mc nh - nu chng ta khng dng tham s ny - s l k t xung dng('\n').

    V d sau y lp li tt c nhng g bn g trn bn phm. N rt n gin nhng l mt v dcho thy bn c th s dng cin.getline vi cc xu k t nh th no:

    // cin with strings#include

    int main (){char mybuffer [100];cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    48/109

    6. N ch c th nhn nhng t n (khng nhn c c cu) v phng thc ny s dngk t trng(bao gm c du cch, du tab v du xung dng) lm du hiu kt thc..

    7. N khng cho php ch nh kch thc cho b m. Chng trnh ca bn c th chykhng n nh nu d liu vo ln hn kch c ca mng cha n.

    V nhng nguyn nhn trn, khi mun nhp vo cc xu k t bn nn s dng cin.getlinethay v cin >>.

    Chuyn i xu k t sang cc kiu khc.

    V mt xu k t c th biu din nhiu kiu d liu khc nh dng s nn vic chuyn i nidung nh vy sang dng s l rt hu ch. V d, mt xu c th mang gi tr "1977"nhng lmt chui gm 5 k t (k c k t null) v khng d g chuyn thnh mt s nguyn. V vy thvin cstdlib (stdlib.h) cung cp 3 macro/hm hu ch sau:

    atoi: chuyn xu thnh kiu int. atol: chuyn xu thnh kiu long. atof: chuyn xu thnh kiu float.

    Tt c cc hm ny nhn mt tham s v tr v gi tr s (int, long hoc float). Cc hm nykhi kt hp vi phng thc getline ca cin l mt cch ng tin cy hn phng thc cin>>c in khi yu cu ngi s dng nhp vo mt s:// cin and ato* functions#include #include

    int main ()

    { char mybuffer [100];float price;int quantity;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    49/109

    strcmp: int strcmp (const char* string1, const char* string2);So snh hai xustring1 vstring2. Tr v 0 nu hai xu l bng nhau.

    strcpy: char* strcpy (char* dest, const char* src);Copy ni dung casrc cho dest. Tr v dest.

    strlen: size_t strlen (const char* string);

    Tr v di castring.

    Ch : char* hon ton tng ng vi char[]

    Bi 3.3

    Con tr

    Chng ta bit cc bin chnh l cc nh m chng ta c th truy xut di cc tn. Cc binny c lu tr ti nhng ch c th trong b nh. i vi chng trnh ca chng ta, b nhmy tnh ch l mt dy gm cc nh 1 byte, mi c mt a ch xc nh.

    Mt s m hnh tt i vi b nh my tnh chnh l mt ph trong mt thnh ph. Trn mt phtt c cc ngi nh u c nh s tun t vi mt ci tn duy nht nn nu chng ta ni ns 27 ph Trn Hng o th chng ta c th tm c ni m khng lm ln v ch c mtngi nh vi s nh vy.

    Cng vi cch t chc tng t nh vic nh s cc ngi nh, h iu hnh t chc b nhthnh nhng s n nht, tun t, nn nu chng ta ni n v tr 1776 trong b nh chng ta bitchnh xc nh v ch c mt v tr vi a ch nh vy.

    Ton t ly a ch (&).

    Vo thi im m chng ta khai bo mt bin th n phi c lu tr trong mt vtr c th trong b nh. Ni chung chng ta khng quyt nh ni no bin ct - tht may mn rng iu c lm t ng bi trnh bin dch v h iuhnh, nhng mt khi h iu hnh gn mt a ch cho bin th chng ta c thmun bit bin c lu tr u.

    iu ny c th c thc hin bng cch t trc tn bin mt du v (&), c ngha l "a ch

    ca". V d:

    ted = &andy;

    s gn cho bin teda ch ca bin andy, v khi t trc tn bin andy du v (&)chng ta khng cn ni n ni dung ca bin m ch ni n a ch ca ntrong b nh.

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    50/109

    Gi s rng bin andy c t nh c a ch 1776 v chng ta vit nh sau:

    andy = 25;fred = andy;ted = &andy;

    kt qu s ging nh trong s di y:

    Chng ta gn cho fredni dung ca bin andy nh chng ta lm rt ln nhiukhc trong nhng phn trc nhng vi bin tedchng ta gn a chm h iuhnh lu gi tr ca bin andy, chng ta va gi s n l 1776.

    Nhng bin lu tr a ch ca mt bin khc (nh ted trong v d trc) c gi l con tr.Trong C++ con tr c rt nhiu u im v chng c s dng rt thng xuyn, Tip theochng ta s thy cc bin kiu ny c khai bo nh th no.

    Ton t tham chiu (*)

    Bng cch s dng con tr chng ta c th truy xut trc tip n gi tr c lutr trong bin c tr bi n bng cch trc tn bin con tr mt du sao (*) - y c th c dch l "gi tr c tr bi". V vy, nu chng ta vit:

    beth = *ted;

    (chng ta c th c n l: "beth bng gi tr c tr bi ted"beth s mang gi tr25, v tedbng 1776 v gi tr tr bi 1776 l 25.

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    51/109

    Bn phi phn bit c rng tedc gi tr 1776, nhng *ted(vi mt du sao ngtrc) tr ti gi tr c lu tr trong a ch 1776, l 25. Hy ch s khc bitgia vic c hay khng c du sao tham chiu.

    beth = ted; // beth bng ted ( 1776 )beth = *ted; // beth bnggi tr c tr bi( 25 )

    Ton t ly a ch (&)N c dng nh l mt tin t ca bin v c th c dch l "a ch ca", vvy &variable1 c th c c l "a ch ca variable1".

    Ton t tham chiu (*)N ch ra rng ci cn c tnh ton l ni dung c tr bi biu thc c coi nh l mt ach. N c th c dch l "gi tr c tr bi"..*mypointer c c l "gi tr c tr bi mypointer".

    Vo lc ny, vi nhng v d vit trn

    andy = 25;ted = &andy;

    bn c th d dng nhn ra tt c cc biu thc sau l ng:

    andy == 25&andy == 1776ted == 1776*ted == 25

    Khai bo bin kiu con tr

    V con tr c kh nng tham chiu trc tip n gi tr m chng tr ti nn cnthit phi ch r kiu d liu no m mt bin con tr tr ti khai bo n. V vy,khai bo ca mt bin con tr s c mu sau:

    type * pointer_name;

    trong type l kiu d liu c tr ti, khng phi l kiu ca bn thn con tr. Vd:

    int * number;

    char * character;float * greatnumber;

    l ba khai bo ca con tr. Mi bin u tr ti mt kiu d liu khc nhau nhngc ba u l con tr v chng u chim mt lng b nh nh nhau (kch thcca mt bin con tr ty thuc vo h iu hnh). nhng d liu m chng tr tikhng chim lng b nh nh nhau, mt kiu int, mt kiu char v ci cn li kiufloat.

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    52/109

    Ti phi nhn mnh li rng du sao (*) m chng ta t khi khai bo mt con tr ch c ngharng: l mt con tr v hon ton khng lin quan n ton t tham chiu m chng ta xemxt trc . n gin ch l hai tc v khc nhau c biu din bi cng mt du.

    // my first pointer

    #include

    int main (){int value1 = 5, value2 = 15;int * mypointer;

    mypointer = &value1;*mypointer = 10;mypointer = &value2;*mypointer = 20;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    53/109

    value2=="

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    54/109

    int * p;p = numbers; *p = 10;p++; *p = 20;p = &numbers[2]; *p = 30;p = numbers + 3; *p = 40;p = numbers; *(p+4) = 50;

    for (int n=0; n

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    55/109

    trong trng hp ny mt khi nh tnh c dnh cha "hello" v mt con trtr ti k t u tin ca khi nh ny ( l k t h') c gn cho terry. Nu"hello" c lu ti a ch 1702, lnh khai bo trn c th c hnh dung nh thny:

    cn phi nhc li rng terry mang gi tr 1702 ch khng phi l 'h' hay "hello".

    Bin con tr terry tr ti mt xu k t v n c th c s dng nh l i vi mt mng (hy

    nh rng mt mng ch n thun l mt con tr hng). V d, nu chng ta mun thay k t 'o'bng mt du chm than, chng ta c th thc hin vic bng hai cch:

    terry[4] = '!';*(terry+4) = '!';

    hy nh rng vit terry[4] l hon ton ging vi vit *(terry+4) mc d biu thcthng dng nht l ci u tin. Vi mt trong hai lnh trn xu do terry tr n sc gi tr nh sau:

    Cc php tnh s hc vi pointer

    Vic thc hin cc php tnh s hc vi con tr hi khc so vi cc kiu d liu snguyn khc. Trc ht, ch php cng v tr l c php dng. Nhng c cng vtr u cho kt qu ph thuc vo kch thc ca kiu d liu m bin con tr tr

    ti.

    Chng ta thy c nhiu kiu d liu khc nhau tn ti v chng c th chim ch nhiu hn hoct hn cc kiu d liu khc. V d, trong cc kiu s nguyn, charchim 1 byte,shortchim 2byte v longchim 4 byte.

    Gi s chng ta c 3 con tr sau:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    56/109

    char *mychar;short *myshort;long *mylong;

    v chng ln lt tr ti nh 1000, 2000 and 3000.

    Nu chng ta vit

    mychar++;myshort++;mylong++;

    mychar - nh bn mong i - s mang gi tr 1001. Tuy nhin myshort s mang gi tr2002 v mylong mang gi tr 3004. Nguyn nhn l khi cng thm 1 vo mt con trth n s tr ti phn t tip theo c cng kiu m n c nh ngha, v vykch thc tnh bng byte ca kiu d liu n tr ti s c cng thm vo bincon tr.

    iu ny ng vi c hai php ton cng v tr i vi con tr. Chng ta cng honton thu c kt qu nh trn nu vit:

    mychar = mychar + 1;myshort = myshort + 1;mylong = mylong + 1;

    Cn phi cnh bo bn rng c hai ton t tng (++) v gim (--) u c quyn u

    tin ln hn ton t tham chiu (*), v vy biu thc sau y c th dn ti kt qusai:

    *p++;*p++ = *q++;

    Lnh u tin tng ng vi *(p++) iu m n thc hin l tngp (a ch nhm n tr ti ch khng phi l gi tr tr ti).

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    57/109

    Lnh th hai, c hai ton t tng (++) u c thc hin sau khi gi tr ca *q c gn cho *pv sau c q v p u tng ln 1. Lnh ny tng ng vi:

    *p = *q;p++;q++;

    Nh ni trong cc bi trc, ti khuyn cc bn nn dng cc cp ngoc n trnh nhng kt qu khng mong mun.

    Con tr tr ti con tr

    C++ cho php s dng cc con tr tr ti cc con tr khc ging nh l tr ti dliu. lm vic chng ta ch cn thm mt du sao (*) cho mi mc thamchiu.

    char a;char * b;char ** c;a = 'z';b = &a;c = &b;

    gi s rng a,b,c c lu cc nh 7230, 8092 and 10502, ta c th m t onm trn nh sau:

    im mi trong v d ny l bin c, chng ta c th ni v n theo 3 cch khcnhau, mi cch s tng ng vi mt gi tr khc nhau:

    c l mt bin c kiu (char **) mang gi tr 8092*c l mt bin c kiu (char*) mang gi tr 7230**c l mt bin c kiu (char) mang gi tr 'z'

    Con tr khng kiuCon tr khng kiu l mt loi con tr c bit. N c th tr ti bt k loi d liuno, t gi tr nguyn hoc thc cho ti mt xu k t. Hn ch duy nht ca n ld liu c tr ti khng th c tham chiu ti mt cch trc tip (chng takhng th dng ton t tham chiu * vi chng) v di ca n l khng xc nhv v vy chng ta phi dng n ton t chuyn kiu d liu hay php gn chuyn con tr khng kiu thnh mt con tr tr ti mt loi d liu c th.

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    58/109

    Mt trong nhng tin ch ca n l cho php truyn tham s cho hm m khng cn ch r kiu

    // integer increaser#include

    void increase (void* data, int type)

    {switch (type){case sizeof(char) :

    (*((char*)data))++; break;case sizeof(short):

    (*((short*)data))++; break;case sizeof(long) :

    (*((long*)data))++; break;}

    }

    int main ()

    { char a = 5;short b = 9;long c = 12;increase (&a,sizeof(a));increase (&b,sizeof(b));increase (&c,sizeof(c));cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    59/109

    int operation (int x, int y, int(*functocall)(int,int)){int g;g = (*functocall)(x,y);

    return (g);}

    int main (){int m,n;m = operation (7, 5, &addition);n = operation (20, m, minus);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    60/109

    pointer= new type [elements]

    Biu thc u tien c dng cp pht b nh cha mt phn t c kiu type.Lnh th hai c dng cp pht mt khi nh (mt mng) gm cc phn t kiutype.V d:

    int * bobby;bobby = new int [5];

    trong trng hp ny, h iu hnh dnh ch cho 5 phn t kiu int trong b nhv tr v mt con tr tr n u ca khi nh. V vy lc nybobby tr n mtkhi nh hp l gm 5 phn tint.

    Bn c th hi ti l c g khc nhau gia vic khai bo mt mng vi vic cp phtb nh cho mt con tr nh chng ta va lm. iu quan trng nht l kch thcca mt mng phi l mt hng, iu ny gii hn kch thc ca mng n kchthc m chng ta chn khi thit k chng trnh trong khi cp pht b nh ngcho php cp pht b nh trong qu trnh chy vi kch thc bt k.

    B nh ng ni chung c qun l bi h iu hnh v trong cc mi trng a nhim c th

    chy mt lc vi chng trnh c mt kh nng c th xy ra l ht b nh cp pht. Nu iuny xy ra v h iu hnh khng th cp pht b nh nh chng ta yu cu vi ton t new, mtcon tr null (zero) s c tr v. V vy cc bn nn kim tra xem con tr tr v bi ton t newc bng null hay khng:

    int * bobby;bobby = new int [5];if (bobby == NULL) { // error assigning memory. Take measures.};

    Ton tdelete.

    V b nh ng ch cn thit trong mt khong thi gian nht nh, khi n khng cn dng nna th n s c gii phng c th cp pht cho cc nhu cu khc trong tng lai. thchin vic ny ta dng ton t delete, dng thc ca n nh sau:

    deletepointer;

    hoc

    delete []pointer;

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    61/109

    Biu thc u tin nn c dng gii phng b nh c cp pht cho mtphn t v lnh th hai dng gii phng mt khi nh gm nhiu phn t(mng). Trong hu ht cc trnh dch c hai biu thc l tng ng mc d chngl r rng l hai ton t khc nhau.

    // rememb-o-matic#include #include

    int main (){char input [100];int i,n;long * l, total = 0;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    62/109

    Hm mallocy l mt hm tng qut cp pht b nh ng cho con tr. Cu trc ca n nh sau:

    void * malloc (size_t nbytes);

    trong nbytes l s byte chng ta mun gn cho con tr. Hm ny tr v mt contr kiu void*, v vy chng ta phi chuyn i kiu sang kiu ca con tr ch, vd:

    char * ronny;ronny = (char *) malloc (10);

    on m ny cp pht cho con tr ronny mt khi nh 10 byte. Khi chng ta muncp pht mt khi d liu c kiu khc char (ln hn 1 byte) chng ta phi nhn sphn t mong mun vi kch thc ca chng. Tht may mn l chng ta c ton tsizeof, ton t ny tr v kch thc ca mt kiu d liu c th.

    int * bobby;bobby = (int *) malloc (5 * sizeof(int));

    on m ny cp pht cho bobby mt khi nh gm 5 s nguyn kiu int, kch cca kiu d liu ny c th bng 2, 4 hay hn ty thuc vo h thng m chngtrnh c dch.

    Hm calloc.calloc hot ng rt ging vi malloc, s khc nhau ch yu l khai bo mu ca n:

    void * calloc (size_t nelements, size_t size);

    n s dng hai tham s thay v mt. Hai tham s ny c nhn vi nhau cc kch thc tng cng ca khi nh cn cp pht. Thng thng tham s utin (nelements) l s phn t v tham s thc hai (size) l kch thc ca mi phnt. V d, chng ta c th nh ngha bobby vi calloc nh sau:

    int * bobby;bobby = (int *) calloc (5, sizeof(int));

    Mt im khc nhau na giamalloc v calloc l calloc khi to tt c cc phn tca n v 0.

    Hm realloc.N thay i kch thc ca khi nh c cp pht cho mt con tr.

    void * realloc (void *pointer, size_t size);

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    63/109

    tham spointernhn vo mt con tr c cp pht b nh hay mt con trnull, v size ch nh kch thc ca khi nh mi. Hm ny s cp pht size byteb nh cho con tr. N c th phi thay i v v tr ca khi nh c th chcho kch thc mi ca khi nh, trong trng hp ny ni dung hin thi ca khinh c copy ti v tr mi m bo d liu khng b mt. Con tr mi tr ti

    khi nh c hm tr v. Nu khng th thay i kch thc ca khi nh th hms tr v mt con tr null nhng tham spointerv ni dung ca n s khng bthay i.

    Hmfree.Hm ny gii phng mt khi nh ng c cp pht bimalloc, callochoc realloc.

    void free (void *pointer);

    Hm ny ch c dng gii phng b nh c cp pht bi cc hmmalloc, callocandrealloc.

    Bi 3.5

    Cc cu trc

    Cc cu trc d liu.

    Mt cu trc d liu l mt tp hp ca nhng kiu d liu khc nhau c gp livi mt ci tn duy nht. Dng thc ca n nh sau:

    struct model_name { type1 element1; type2 element2; type3 element3;..

    }object_name;trong model_name l tn ca mu kiu d liu v tham s ty chn object_namemt tn hp l cho i tng. Bn trong cp ngoc nhn l tn cc phn t ca cutrc v kiu ca chng.

    Nu nh ngha ca cu trc bao gm tham s model_name (tu chn), tham s ny tr thnh mt

    tn kiu hp l tng ng vi cu trc. V d:

    struct products {char name [30];float price;

    } ;

    products apple;products orange, melon;

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    64/109

    Chng ta nh ngha cu trcproducts vi hai trng: name vprice, mi trngc mt kiu khc nhau. Chng ta cng s dng tn ca kiu cu trc (products) khai bo ba i tng c kiu : apple, orange vmelon.

    Sau khi c khai bo,products tr thnh mt tn kiu hp l ging cc kiu c bn nh int,

    charhayshort.

    Trng tu chn object_name c th nm cui ca phn khai bo cu trc dng khai botrc tip i tng c kiu cu trc. V d, khai bo cc i tng apple, orange vmelonnh lm phn trc chng ta cng c th lm theo cch sau:

    struct products {char name [30];float price;

    } apple, orange, melon;Hn na, trong trng hp ny tham s model_name tr thnh tu chn. Mc d numodel_name khng c s dng th chng ta s khng th khai bo thm cc itng c kiu mu ny.

    Mt iu quan trng l cn phn bit r rng u l kiu mu cu trc, u l i tng cutrc. Nu dng cc thut ng chng ta s dng vi cc bin, kiu mu l tn kiu d liu cni tng l cc bin.

    Sau khi khai bo ba i tng c kiu l mt mu cu trc xc nh (apple, orange andmelon) chng ta c th thao tc vi cc trng to nn chng. lm vic ny chng ta s dng

    mt du chm (.) chn gia tn i tng v tn trng. V d, chng ta c th thao tc vi btk phn t no ca cu trc nh l i vi cc bin chun :

    apple.nameapple.priceorange.nameorange.pricemelon.namemelon.price

    mi trng c kiu d liu tng ng: apple.name, orange.name vmelon.name c kiuchar[30], v apple.price, orange.price vmelon.price c kiu float.

    Chng ta tm bit apples, oranges v melons n vi mt v d v cc b phim:

    // example about structures#include #include #include

    struct movies_t {char title [50];int year;

    Enter title: AlienEnter year: 1979

    My favourite movie is:

    2001 A Space Odyssey (1968)

    And yours:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    65/109

    } mine, yours;

    void printmovie (movies_t movie);

    int main (){

    char buffer [50];

    strcpy (mine.title, "2001 A SpaceOdyssey");mine.year = 1968;

    cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    66/109

    } films [N_MOVIES];

    void printmovie (movies_t movie);

    int main (){

    char buffer [50];int n;for (n=0; n

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    67/109

    };

    int main (){char buffer[50];

    movies_t amovie;movies_t * pmovie;pmovie = & amovie;

    cout title,50);cout year = atoi (buffer);

    cout title v (*movies).title u hp l v chng u dng tham chiu n phn ttitle ca cu trc c tr bimovies. Bn cn phnbit r rng vi:

    *movies.title

    n tng ng vi

    *(movies.title)

    lnh ny dng tnh ton gi tr c tr bi phn ttitle ca cu trcmovies,trong trng hp ny (title khng phi l mt con tr) n chng c ngha g nhiu.Bn di y tng kt tt c cc kt hp c th c gia con tr v cu trc:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    68/109

    Biu thc M tTng ngvi

    movies.title Phn ttitle ca cu trcmovies

    movies->title Phn ttitleca cu trc c tr bimovies

    (*movies).title

    *movies.titleGi tr c tr bi phn ttitle ca cu trc

    movies*(movies.title)

    Cc cu trc lng nhau

    Cc cu trc c th c t lng nhau v vy mt phn t hp l ca mt cu trc

    c th l mt cu trc khc.struct movies_t {char title [50];int year;

    }

    struct friends_t {char name [50];char email [50];movies_t favourite_movie;} charlie, maria;

    friends_t * pfriends = &charlie;

    V vy, sau phn khai bo trn chng ta c th s dng cc biu thc sau:

    charlie.namemaria.favourite_movie.titlecharlie.favourite_movie.yearpfriends->favourite_movie.year

    (trong hai biu thc cui cng l tng ng).

    Cc khi nim c bn v cu trc c cp n trong phn ny l hon ton ging vi ngnng C, tuy nhin trong C++, cu trc c m rng thm cc chc nng ca mt lp vi tnh

    cht c trng l tt c cc phn t ca n u l cng cng (public). Bn s c thm cc thngtin chi tit trong phn 4.1, Lp.

    Bi 3.6

    Cc kiu d liu t nh ngha.

    http://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_1.htmhttp://www.diendantinhoc.net/tute/laptrinh/c/cpp-nmthang/bai4_1.htm
  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    69/109

    Trong bi trc chng ta xem xt mt loi d liu c nh ngha bi ngi dng (ngi lptrnh): cu trc. Nhng c cn nhiu kiu d liu t nh ngha khc:

    T nh ngha cc kiu d liu (typedef).

    C++ cho php chng ta nh ngha cc kiu d liu ca ring mnh da trn cckiu d liu c. c th lm vic chng ta s s dng t kho typedef, dngthc nh sau:

    typedef existing_type new_type_name ;

    trong existing_type l mt kiu d liu c bn hay bt k mt kiu d liu nh ngha v new_type_name l tn ca kiu d liu mi. V d

    typedef char C;typedef unsigned int WORD;

    typedef char * string_t;typedef char field [50];

    Trong trng hp ny chng ta nh ngha bn kiu d liu mi: C,WORD, string_tv fieldkiu char, unsigned int, char* kiu char[50], chng ta hon ton c th sdng chng nh l cc kiu d liu hp l:

    C achar, anotherchar, *ptchar1;WORD myword;string_t ptchar2;field name;

    typedef c th hu dng khi bn mun nh ngha mt kiu d liu c dng lp ilp li trong chng trnh hoc kiu d liu bn mun dng c tn qu di v bnmun n c tn ngn hn.

    Union

    Union cho php mt phn b nh c th c truy xut di dng nhiu kiu d liukhc nhau mc d tt c chng u nm cng mt v tr trong b nh. Phn khaibo v s dng n tng t vi cu trc nhng chc nng th khc hon ton:

    union model_name { type1 element1; type2 element2; type3 element3;..

    }object_name;Tt c cc phn t ca union u chim cng mt ch trong b nh. Kch thc can l kch thc ca phn t ln nht. V d:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    70/109

    union mytypes_t {char c;int i;float f;} mytypes;

    nh ngha ba phn t

    mytypes.cmytypes.imytypes.f

    mi phn t c mt kiu d liu khc nhau. Nhng v tt c chng u nm cngmt ch trong b nh nn bt k s thay i no i vi mt phn t s nh hngti tt c cc thnh phn cn li.

    Mt trong nhng cng dng ca union l dng kt hp mt kiu d liu c bn vi mt mnghay cc cu trc gm cc phn t nh hn. V d:

    union mix_t{long l;struct {

    short hi;short lo;} s;

    char c[4];} mix;nh ngha ba phn t cho php chng ta truy xut n cng mt nhm 4 byte:

    mix.l,mix.s vmix.c m chng ta c th s dng tu theo vic chng ta mun truyxut n nhm 4 byte ny nh th no. Ti dng nhiu kiu d liu khc nhau,mng v cu trc trong union bn c th thy cc cch khc nhau m chng ta

    c th truy xut d liu.

    Cc unions v danh

    Trong C++ chng ta c th s dng cc unions v danh. Nu chng ta tmt union trong mt cu trc m khng tn (phn i sau cp ngocnhn { }) union s tr thnh v danh v chng ta c th truy xut trc

    tip n cc phn t ca n m khng cn n tn ca union (c cn cng khngc). V d, hy xem xt s khc bit gia hai phn khai bo sau y:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    71/109

    union union v danh

    struct {char title[50];char author[50];union {float dollars;int yens;

    } price;} book;

    struct {char title[50];char author[50];union {float dollars;int yens;

    };} book;

    S khc bit duy nht gia hai on m ny l trong on m u tin chng ta t tn cho union(price) cn trong ci th hai th khng. Khi truy nhp vo cc phn t dollars v yens, trongtrng hp th nht chng ta vit:

    book.price.dollarsbook.price.yens

    cn trong trng hp th hai:

    book.dollarsbook.yens

    Mt ln na ti nhc li rng v n l mt union, hai trng dollars v yens uchim cng mt ch trong b nh nn chng khng th gi hai gi tr khc nhau.

    Kiu lit k (enum)

    Kiu d liu lit k dng to ra cc kiu d liu cha mt ci g hi c bitmt cht, khng phi kiu s hay kiu k t hoc cc hng true v false. Dng thcca n nh sau:

    enummodel_name{ value1, value2, value3,..

    } object_name;V d, chng ta c th to ra mt kiu d liu mi c tn color lu tr cc mu

    vi phn khai bo nh sau:enum colors_t {black, blue, green, cyan, red, purple, yellow, white};

    Ch rng chng ta khng s dng bt k mt kiu d liu c bn no trong phnkhai bo. Chng ta to ra mt kiu d liu mi m khng da trn bt k kiu dliu no c sn: kiu color_t, nhng gi tr c th ca kiu color_t c vit trongcp ngoc nhn {}. V d, sau khi khai bo kiu lit k, biu thc sau s l hp l:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    72/109

    colors_t mycolor;mycolor = blue;if (mycolor == green) mycolor = red;

    Trn thc t kiu d liu lit k c dch l mt s nguyn v cc gi tr ca n l

    cc hng s nguyn c ch nh. Nu iu ny khng oc ch nh, gi tr nguyntng ng vi phn t u tin l 0 v cc gi tr tip theo c th tng ln 1, Vvy, trong kiu d liu colors_t m chng ta nh ngha trn,white tng ngvi 0,blue tng ng vi 1, green tng ng vi 2 v c tip tc nh th.

    Nu chng ta ch nh mt gi tr nguyn cho mt gi tr no ca kiu d liu lit k (trong vd ny l phn t u tin) cc gi tr tip theo s l cc gi tr nguyn tip theo, v d:

    enum months_t { january=1, february, march, april,may, june, july, august,september, october, november, december} y2k;

    trong trng hp ny, bin y2k c kiu d liu lit kmonths_t c th cha mttrong 12 gi tr tjanuary n december v tng ng vi cc gi tr nguyn t1n 12, khng phi 0 n 11 v chng ta t january bng 1.

    Bi 4.1

    Cc lp

    Lp l mt phng thc logic t chc d liu v cc hm trong cng mt cu trc. Chng c khaibo s dng t kho class, t ny c chc nng tng t vi t kho ca C struct nhng c khnng gp thm cc hm thnh vin.

    Dng thc ca n nh sau:

    class class_name{permission_label_1: member1;permission_label_2: member2;...}object_name;

    trong class_name l tn ca lp ( kiu ngi dng t nh ngha) v trng mc nhobject_name l mt hay mt vi tn i tng hp l. Phn thn ca khai bo cha cc thnh vin

    ca lp, c th l d liu hay cc hm v c th l cc nhn cho php (permission labels) lmt trong nhng t kho sau y:private:,public: hocprotected:.

    8. Cc thnh vinprivate ca mt lp ch c th c truy xut t cc thnh vin khc ca lphoc t cc lp "bn b".

    9. Cc thnh vinprotectedc th c truy xut t cc thnh vin trong cng mt lp vcc lp bn b, thm vo l t cc thnh vin ca cc lp tha k

    10.Cui cng, cc thnh vinpublic c th c truy xut t bt k ch no m lp nhn thy.

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    73/109

    Nu chng ta khai bo cc thnh vin ca mt lp trc khi thm vo cc nhn cho php th cc thnhvin c coi lprivate.

    V d:

    class CRectangle {

    int x, y;public:void set_values (int,int);int area (void);

    } rect;

    Khai bo lp CRectangle v mt i tng c tn rect c kiu l lp CRectangle. Lp ny chabn thnh vin: hai vin c kiu int (x v y) trong phnprivate (v private l s cho php mcnh) v hai hm trong phnpublic: set_values() v area(), y chng ta ch mi khai bomu.

    Hy ch s khc bit gia tn lp v tn i i tng: Trong v d trc, CRectangle l tn lpcn rect l tn mt i tng c kiu CRectangle.

    Trong cc phn tip theo ca chng trnh chng ta c th truy xut n cc thnh vin public ca itng rect nh l i vi cc hm hay cc bin thng thng bng cch t tn ca i tng risau l mt du chm v tn thnh vin ca lp (nh chng ta lm vi cc cu trc ca C). Vd:

    rect.set_value (3,4);myarea = rect.area();

    nhng chng ta khng c kh nng truy xut n x hay y v chng l cc thnh vin private ca lpv chng ch c th c truy xut t cc thnh vin ca cng mt lp. Bi ri? y l v d y vlp CRectangle:

    // classes example

    #include

    class CRectangle {int x, y;

    public:void set_values (int,int);int area (void) {return (x*y);}

    };

    void CRectangle::set_values (int a,int b) {x = a;y = b;

    }

    int main () {CRectangle rect;rect.set_values (3,4);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    74/109

    y hm area() ngay bn trong lp trong khi hm set_values() mi ch c khai bo mucn nh ngha ca n nm ngoi lp. Trong phn khai bo ngoi ny chng ta bt buc phi dngton t::.

    S khc bit duy nht gia vic khai bo y mt hm bn trong lp v vic ch khai bo mu ltrong trng hp th nht hm s c t ng coi l inline bi trnh dch, cn trong trng hp th

    hai n s l mt hm thnh vin bnh thng.

    L do khin chng ta khai bo x v y l cc thnh vinprivate v chng ta nh ngha mt hm thtc vi chng (set_values()) v khng c l do g truy nhp trc tip n cc bin ny. Cl trong v d rt n gin ny bn khng thy c mt tin ch ln khi bo v hai bin ny nhngtrong cc d n ln hn n c th l rt quan trng khi m bo c rng cc gi tr khng bthay i mt cch khng mong mun.

    Mt ch li na ca lp l chng ta c th khai bo mt vi i tng khc nhau t n. V d, tip sauy l v d trc v lp CRectangle, ti ch thm phn khai bo thm i tng rectb.

    // class example#include

    class CRectangle {int x, y;

    public:void set_values (int,int);int area (void) {return (x*y);}

    };

    void CRectangle::set_values (int a,int b) {x = a;y = b;

    }

    int main () {CRectangle rect, rectb;rect.set_values (3,4);rectb.set_values (5,6);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    75/109

    Ni chung cc i tng cn phi khi to cc bin hoc cp pht b nh ng trong qu trnh to rachng c th hot ng tt v trnh c vic tr v cc gi tr khng mong mun. V d, iu gs xy ra nu chng ta gi hm area() trc khi gi hm set_values?C l kt qu s l mt gitr khng xc nh v cc thnh vin x v y cha c gn mt gi tr c th no.

    trnh iu ny, mt lp cn c mt hm c bit: mt constructor, hm ny c th c khai bo

    bng cch t tn trng vi tn ca lp. N s c gi t ng khi mt khai bo mt i tng mihoc cp pht mt i tng c kiu l lp . Chng ta thm mt constructorvo lp CRectangle:

    // classes example#include

    class CRectangle {int width, height;

    public:CRectangle (int,int);int area (void) {return

    (width*height);}};

    CRectangle::CRectangle (int a, int b){width = a;height = b;

    }

    int main () {CRectangle rect (3,4);CRectangle rectb (5,6);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    76/109

    // example on constructors anddestructors#include

    class CRectangle {int *width, *height;

    public:CRectangle (int,int);~CRectangle ();int area (void) {return (*width *

    *height);}};

    CRectangle::CRectangle (int a, int b){width = new int;height = new int;*width = a;*height = b;

    }

    CRectangle::~CRectangle () {delete width;delete height;

    }

    int main () {CRectangle rect (3,4), rectb (5,6);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    77/109

    Constructor rngy l mt constructor khng c tham s. N chng lm g c.

    CExample::CExample () { };

    Copy constructor

    y l mt constructor c mt tham s cng kiu vi lp. N thc hin mt vic l gn tt ccc bin thnh vin khng tnh (nonstatic) ca lp gi tr ca bin tng ng ca i tngtham s.

    CExample::CExample (const CExample& rv) {

    a=rv.a; b=rv.b; c=rv.c;}

    Cn phi nhn mnh rng cc constructor mc nh ny ch tn ti nu khng c constructor ckhai bo.

    Tt nhin l bn c th qu ti constructor ca n cung cp cc constructor khc nhau cho cc mcch khc nhau:

    // overloading class constructors#include

    class CRectangle {int width, height;

    public:CRectangle ();CRectangle (int,int);int area (void) {return

    (width*height);}};

    CRectangle::CRectangle () {

    width = 5;height = 5;

    }

    CRectangle::CRectangle (int a, int b){width = a;height = b;

    }

    int main () {CRectangle rect (3,4);CRectangle rectb;

    cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    78/109

    Ch rng nu chng ta khai bo mt i tng mi v khng mun truyn tham s cho n th khngcn phi cp ngoc n ():

    CRectangle rectb; // ngCRectangle rectb(); // sai!

    Con tr ti lpTo con tr tr ti cc lp l hon ton hp l, c th lm vic ny chng ta hiu rng mt khi c khai bo, lp tr thnh mt kiu d liu hp l, v vy chng ta c dng tn lp l kiu cho contr. V d:

    CRectangle * prect;

    l mt con tr tr ti mt i tng ca lp CRectangle.

    Tng t vi cu trc, tham chiu trc tip ti mt thnh vin ca mt i tng c tr bi mtcon tr bn nn dng ton t->. y l mt v d:

    // pointer to classes example#include

    class CRectangle {int width, height;

    public:void set_values (int, int);int area (void) {return (width *

    height);}};

    void CRectangle::set_values (int a,int b) {width = a;height = b;

    }

    int main () {CRectangle a, *b, *c;CRectangle * d = new CRectangle[2];b= new CRectangle;c= &a;a.set_values (1,2);b->set_values (3,4);d->set_values (5,6);

    d[1].set_values (7,8);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    79/109

    cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    80/109

    Nhng cn phi cm n kh nng qu ti ton t ca C++, chng ta c th lm cho cc i tng kiunh trn c th chp nhn cc ton t m khng lm thay i ngha ca n i vi cc kiu dliu c bn. Di y l danh sch tt c cc ton t c th c qu ti:

    + - * / = < > += -= *= /= >= == != = ++ -- % & ^ ! |~ &= ^= |= && || %= [] () new delete lm qu ti mt ton t chng ta ch cn vit mt hm thnh vin ca lp c tn operator theosau l ton t chng ta mun lm qu ti. Mu nh sau:

    typeoperatorsign(parameters);

    Di y l v d v vic qu ti ton t+. Chng ta chun b tnh tng hai vector hai chiu a(3,1)

    vb(1,2). Php cng gia hai vector hai chiu ch n gin l cng hai to x ly to kt

    qu x , cng hai to y ly to kt qu y. Trong trng hp ny kt qu s l (3+1,1+2) =

    (4,3).

    // vectors: v d v qu ti ton t

    #include

    class CVector {public:int x,y;CVector () {};CVector (int,int);CVector operator + (CVector);

    };

    CVector::CVector (int a, int b) {x = a;y = b;

    }

    CVector CVector::operator+ (CVectorparam) {CVector temp;temp.x = x + param.x;temp.y = y + param.y;return (temp);

    }

    int main () {CVector a (3,1);CVector b (1,2);CVector c;

    c = a + b;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    81/109

    CVector operator+ (CVector); // Hm operator+ tr v kiu CVectorHm operator+ ca lp CVector c dng qu ti ton t s hc +. Hm ny c th c gibng mt trong cc cch:

    c = a + b;c = a.operator+ (b);

    Hy ch rng chng ta thm vo constructor rng (khng c tham s) v chng ta nh ngha nvi mt khi lnh cng rng nt:

    CVector () { };

    iu ny l cn thit v cn c mt constructor khc,

    CVector (int, int);

    v v vy cc constructors mc nh khng tn ti trong CVector nu chng ta khng khai n mtcch r rng. Khai bo sau y s l khng hp l:

    CVector c;

    D th no chng na, ti cn phi cnh bo rng mt khi lnh rng khng nn to mtconstructor v n khng tho mn chc nng ti thiu m mt constructor nn c, l vic khi tott c cc bin trong lp. Trong trng hp ca chng ta constructor ny cc bin x v y lkhng xc nh. V vy mt khai bo thch hp hn s l mt ci g ging nh th ny:

    CVector () { x=0; y=0; };

    cho n gin ti khng vit vo trong v d trn.

    Cng vi vic to mt constructor rng v mt copy constructor, C++ cn mc nh nh ngha tont gn(=) gia hai lp c cng mt kiu. N copy ton b ni dung ca cc thnh vin khng tnh(non-static) ca i tng bn phi php gn cho i tng bn tri. Tt nhin bn c th nh nghali n thc hin chc nng khc m bn mun, v d nh ch copy mt s thnh vin no calp.

    Vic qu ti cc ton t khng bt buc hot ng ca n phi lin quan n ngha thng thngca n mc d iu ny l nn lm. V d c v khng logic lm nu s dng ton t + tr hai lphay ton t== in s 0 vo mt lp mc d iu l hon ton hp l.

    Mc d khai bo mu ca hm operator+ l kh hin nhin v n ly phn bn phi ca ton t lmtham s cho hm operator+, cc ton t khc khng phi ci no cng r rng nh th. y

    chng ta c mt bng tng kt v vic cc hm operator phi c khai bo nh th no (thay th@bng cc ton t tng ng):

    Biu thc Ton t (@) Hm thnh vin Hm ton cc

    @a+ - * & ! ~ ++

    --A::operator@() operator@(A)

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    82/109

    a@ ++ -- A::operator@(int) operator@(A, int)

    a@b+ - * / % ^ & |< > == != => && || ,

    A::operator@(B) operator@(A, B)

    a@b= += -= *= /=%= ^= &= |= = [ ]A::operator@(B) -

    a(b, c...) () A::operator()(B, C...) -

    a->b -> A::operator->() -

    * trong a l mt i tng ca lpA,b l mt i tng ca lp B v c l mt i tng ca lp C.

    Nh bn c th thy trong bng ny, c hai cch qu ti cc ton t ca lp: nh l mt hmthnh vin v nh l mt hm ton cc. Khc nhau gia chng khng r rng tuy nhin ti cn phi

    nhc li rng cc hm khng phi l thnh vin ca mt lp khng th truy xut n cc thnh vin lprivate hoc protected ca lp tr phi hm ton cc l bn ca lp (thut ng ny s c cp n bi sau).

    T kho thisT kho this bn trong mt lp i din cho i tng ca lp ang c thc hin trong bnh. N l mt con tr lun c gi tr l a ch ca i tng.

    N c th c dng kim tra xem tham s c truyn cho mt hm thnh vin c phi chnh bnthn i tng hay khng. V d:

    // this#include

    class CDummy {public:int isitme (CDummy& param);

    };

    int CDummy::isitme (CDummy& param){if (&param == this) return 1;else return 0;

    }

    int main () {CDummy a;CDummy* b = &a;if ( b->isitme(a) )cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    83/109

    N cng thng c dng trong hm thnh vin operator= m tr v a ch i tng (trnh vics dng i tng tm thi). Tip theo v d v vector u bi chng ta c th vit mt hmoperator= nh sau:

    CVector& CVector::operator= (const CVector& param){

    x=param.x;y=param.y;return *this;

    }Trong thc t y chnh l on m c mc nh to ra nu chng ta khng vit hm thnh vinoperator=.

    Cc thnh vin tnhMt lp c th cha cc thnh vin tnh, c d liu v cc hm.

    Cc d liu tnh cn c gi l "bin ca lp" v ni dung ca chng khng ph thuc vo mt itng no. Ch c mt gi tr duy nht cho tt c cc i tng trong cng mt lp.

    V d, n c th c trong trng hp bn mun c mt bin cha s i tng thuc lp ckhai bo:

    // static members in classes#include

    class CDummy {public:static int n;CDummy () { n++; };~CDummy () { n--; };

    };

    int CDummy::n=0;

    int main () {CDummy a;CDummy b[5];CDummy * c = new CDummy;cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    84/109

    cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    85/109

    CRectangle rectres;rectres.width = rectparam.width*2;rectres.height = rectparam.height*2;return (rectres);

    }

    int main () {CRectangle rect, rectb;rect.set_values (2,3);rectb = duplicate (rect);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    86/109

    int main () {CSquare sqr;CRectangle rect;sqr.set_side(4);rect.convert(sqr);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    87/109

    class derived_class_name: publicbase_class_name;

    trong derived_class_name l tn ca lp con (lp c tha k) v base_class_name l tnca lp c s.public c th c thay th biprotectedhocprivate, n xc nh quyn truyxut i vi cc thnh vin c tha k nh chng ta s thy v d ny:

    // derived classes

    #include

    class CPolygon {protected:int width, height;

    public:void set_values (int a, int b)

    { width=a; height=b;}};

    class CRectangle: public CPolygon {public:int area (void)

    { return (width * height); }};

    class CTriangle: public CPolygon {public:int area (void)

    { return (width * height / 2); }};

    int main () {CRectangle rect;CTriangle trgl;rect.set_values (4,5);trgl.set_values (4,5);

    cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    88/109

    Khng phi l thnh vin c khng khng

    trong "khng phi l thnh vin" i din cho bt k s tham chiu no t bn ngoi lp, v d nhl tmain(), t mt lp khc hay t bt k hm no.

    Trong v d ca chng ta, cc thnh vin c tha k bi CRectangle v CTriangle cng tuntheo cc quyn truy xut nh i vi lp c s CPolygon:

    CPolygon::width // protected accessCRectangle::width // protected access

    CPolygon::set_values() // public accessCRectangle::set_values() // public access

    C iu ny v chng ta tha k mt lp t mt lp khc vi quyn truy xutpublic, hy nh:

    class CRectangle:public CPolygon;

    t khopublic i din cho mc bo v ti thiu m cc thnh vin c tha k ca lp c s(CPolygon) phi c c trong lp mi (CRectangle). Mc ny i vi cc thnh vin c tha

    k c th c thay i nu thay v dngpublic chng ta s dngprotectedhayprivate, v d,gi s rng daughter l mt lp c tha k tmother, chng nh ngha nh th ny:

    class daughter: protected mother;

    iu ny s thit lpprotectedl mc truy xut ti thiu cho cc thnh vin ca daughter ctha k t lp c s. C ngha l tt c cc thnh vinpublic trongmother s tr thnhprotectedtrong daughter. Tt nhin, iu ny khng cn tr daughter c th c cc thnh vinpublic caring n. Mc ti thiu ny ch p dng cho cc thnh vin c tha k tmother.

    Nu khng c mc truy xut no c ch nh,private c dng vi cc lp c to ra vi tkho class cnpublic c dng vi cc cu trc.

    Nhng g c tha k t lp c s?V nguyn tc tt c cc thnh vin ca lp u c tha k tr:

    1. Constructor v destructor2. Thnh vin operator=()3. Bn b

    Mc d constructor v destructor ca lp c s khng c tha k, constructor mc nh (constructorkhng c tham s) v destructor ca lp c s lun lun c gi khi mt i tng ca lp c tha

    k c to lp hay ph hu.

    Nu lp c s khng c constructor mc nh hay bn mun mt constructor qu ti c gi khimt i tng mi ca lp c tha k c to lp, bn c th ch nh n mi nh ngha caconstructor trong lp c tha k:

    derived_class_name (parameters) : base_class_name (parameters) {}

    V d:

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    89/109

    // constructors and derivated classes#include

    class mother {public:mother ()

    { cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    90/109

    y l v d y :

    // a tha k#include

    class CPolygon {protected:

    int width, height;public:void set_values (int a, int b)

    { width=a; height=b;}};

    class COutput {public:void output (int i);

    };

    void COutput::output (int i) {cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    91/109

    int a::b(c) {}; // Cc lp (Bi 4.1)a->b // Con tr v i tng (Bi 4.2)class a: public b; // Quan h gia cc lp(Bi 4.3)

    Con tr ti lp c sMt trong nhng li th ln ca vic tha k cc lp l mt con tr tr ti mt lp c tha k ltng thch v kiu vi mt con tr tr ti lp c s ca n. Bi ny s cp y n victn dng tnh nng mnh m ny ca C++. V d, chng ta s vit li chng trnh ca chng ta vhnh ch nht v hnh tam gic trong chng trc xem xt tnh nng ny:

    // con tr ti lp c s#include

    class CPolygon {protected:int width, height;

    public:void set_values (int a, int b)

    { width=a; height=b; }};

    class CRectangle: public CPolygon {public:int area (void)

    { return (width * height); }};

    class CTriangle: public CPolygon {public:

    int area (void){ return (width * height / 2); }};

    int main () {CRectangle rect;CTriangle trgl;CPolygon * ppoly1 = &rect;CPolygon * ppoly2 = &trgl;ppoly1->set_values (4,5);ppoly2->set_values (4,5);cout

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    92/109

    CRectangle v CTriangle c tha k tCPolygon. V nguyn nhn chng ta khng th gin thnh vin area()khi dng *ppoly1 v *ppoly2.

    cc con tr c th truy xut n area() nh l mt thnh vin hp l, cn phi khai bo thnhvin ny trong lp c s ch khng ch trong cc lp tha k.

    Cc thnh vin oNu mun khai bo mt phn t trong mt lp m chng ta mun nh ngha li n trong cc lp thak th chng ta phi t trc n t kho virtual vic s dng con tr ti cc i tng thuc lpny l thch hp.

    Hy xem v d sau:

    // cc thnh vin o#include

    class CPolygon {protected:int width, height;

    public:void set_values (int a, int b)

    { width=a; height=b; }virtual int area (void)

    { return (0); }};

    class CRectangle: public CPolygon {public:int area (void)

    { return (width * height); }};

    class CTriangle: public CPolygon {public:int area (void)

    { return (width * height / 2); }};

    int main () {CRectangle rect;CTriangle trgl;CPolygon poly;CPolygon * ppoly1 = &rect;

    CPolygon * ppoly2 = &trgl;CPolygon * ppoly3 = &poly;ppoly1->set_values (4,5);ppoly2->set_values (4,5);ppoly3->set_values (4,5);cout area()

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    93/109

    }

    By gi c ba lp (CPolygon, CRectangle v CTriangle) u c cng cc thnh vin:width,height, set_values() v area().

    area() c nh ngha l virtual v n s c nh ngha li trong cc lp tha k. Bn c thkim tra li rng nu bn b t kho v thc hin chng trnh th kt qu s l 0 cho c 3 a gicthay v 20,10,0. Nguyn nhn l do thay v gi hm area() tng ng vi mi i tng(CRectangle::area(), CTriangle::area() v CPolygon::area()), CPolygon::area() sc gi cho tt c thng qua mt con tr ti CPolygon.

    Tru tng ho lp c sCc lp tru trng l mt ci g rt ging vi lp lp CPolygon trong v d trc ca chng ta. S

    khc bit duy nht l trong v d chng ta nh ngha hm area() cho cc i tng thuc lp

    CPolygon (ging nh i tngpoly), trong khi trong mt lp tru tng c s chng ta c th

    b qua vic nh ngha hm ny bng cch thm=0

    (bng khng) vo phn khai bo hm.

    Lp CPolygon c th c nh ngha nh sau:

    // abstract class CPoligonclass CPolygon {protected:

    int width, height;public:

    void set_values (int a, int b){ width=a; height=b; }

    virtual int area (void) =0;};

    Hy ch cch chng ta thm =0 vo virtual int area (void) thay v nh ngha y chohm. Kiu hm ny c tn l lpure virtual function (hm o thun tu) v tt c cc lp cha bt kmt hm o thun tu no u c coi l lp tru tng c s.

    S khc bit ln ca mt lp tru tng c s l khng th to c cc i tng thuc lp. Nhngchng ta c th to cc con tr tr n chng. V vy mt khai bo nh sau:

    CPolygon poly;

    s l khng hp l cho lp tru tng c s c khai bo trn. Tuy nhin con tr:

    CPolygon * ppoly1;

    CPolygon * ppoly2

    l hon ton hp l. C iu ny v hm tru tng thun tu m n c khng c nh ngha vkhng th to c mt i tng nu nh cha nh ngha tt c cc thnh vin ca n. Tuy nhinmt con tr tr ti mt i tng thuc lp tha k m hm ny c nh ngha l hon ton hpl.

    Di y chng ta c mt v d y :

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    94/109

    // cc thnh vin o.#include

    class CPolygon {protected:int width, height;

    public:void set_values (int a, int b){ width=a; height=b; }

    virtual int area (void) =0;};

    class CRectangle: public CPolygon {public:int area (void)

    { return (width * height); }};

    class CTriangle: public CPolygon {public:

    int area (void){ return (width * height / 2); }

    };

    int main () {CRectangle rect;CTriangle trgl;CPolygon * ppoly1 = &rect;CPolygon * ppoly2 = &trgl;ppoly1->set_values (4,5);ppoly2->set_values (4,5);cout area()

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    95/109

    class CRectangle: public CPolygon {public:int area (void)

    { return (width * height); }};

    class CTriangle: public CPolygon {public:int area (void)

    { return (width * height / 2); }};

    int main () {CRectangle rect;CTriangle trgl;CPolygon * ppoly1 = &rect;CPolygon * ppoly2 = &trgl;ppoly1->set_values (4,5);ppoly2->set_values (4,5);

    ppoly1->printarea();ppoly2->printarea();return 0;

    }

    Hy nh rng this biu din mt con tr tr n i tng ang c thc hin.

    Cc lp tru tng v cc thnh vin o cung cp cho C++ tnh nng a hnh khin cho vic lp trnhhng i tng tr thnh mt cng c hu dng. Tt nhin chng ta thy cch n gin nht s dng nhng tnh nng ny, nhng hy tng tng nu nhng tnh nng ny c p dng cho ccmng cc i tng hay cc i tng c cp pht thng qua b nh ng.

    Bi 5.1

    Templates

    Templates (mu) l mt tnh nng mi c gii thiu bi chun ANSI-C++. Nu bn s dngmt trnh bin dch C++ cha tng thch vi chun ny th bn khng th s dng mu.

    Cc mu hmCc mu cho php to cc hm c th chp nhn bt k kiu d liu no lm tham s v tr v gi trm khng phi lm qu ti hm vi tt c cc kiu d liu c th. Khai bo mu ca n c th l mttrong hai kiu sau:

    template function_declaration;template function_declaration;

  • 8/2/2019 C++ Can Ban [Nguyen Minh Thang]

    96/109

    s khc bit duy nht gia hai kiu khai bo mu ny l vic s dng t kho class hay typename,s khc nhau gia chng l khng r rng v c hai u c cng mt ngha v u cho mt kt qunh nhau.

    V d, to mt hm mu tr