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%20ban8/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.htm8/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 (¶m == 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 = ▭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 = ▭
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 = ▭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 = ▭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