You are on page 1of 186

HC VIN CNG NGH BU CHNH VIN THNG

NGN NG LP TRNH C++


(Dng cho sinh vin h o to i hc t xa)
Lu hnh ni b









H NI - 2006
















NGN NG LP TRNH C++

PGS.TS. Trn nh Qu
KS. Nguyn Mnh Hng















Lp trnh nng cao vi C++
Lp trnh hng i tng vi C++

2
3
GII THIU

C++ l ngn ng lp trnh hng i tng c m rng t ngn ng C. Do vy, C++ c u
im l k tha c cc im mnh truyn thng ca ngn ng C nh uyn chuyn, tng thch
vi cc thit b phn cng. Hin nay, C++ l mt ngn ng lp trnh ph bin, c ging dy ti
cc trng i hc trong nc v trn th gii v c bit c s dng rng ri cho nhu cu pht
trin ca cng nghip phn mm hin nay. Ti liu ny khng nhng nhm gii thiu cho sinh
vin ngn ng lp trnh C++, m cn mong mun qua sinh vin c th hiu c t tng ca
phng php lp trnh hng i tng ni chung. Ni dung ca ti liu bao gm hai phn chnh:
Phn th nht l lp trnh nng cao vi C++, bao gm lp trnh C++ vi con tr v mng,
cc kiu d liu c cu trc cng cc thao tc vo ra trn tp.
Phn th hai l lp trnh hng i tng vi C++, bao gm cc nh ngha v cc thao
tc trn lp i tng, tnh k tha v tng ng bi trong C++, cch s dng mt s lp
c bn trong th vin C++.
Ni dung ti liu c t chc thnh 7 chng:
Chng 1: Gii thiu tng quan v cc phng php lp trnh
Trnh by cc phng php lp trnh tuyn tnh, lp trnh cu trc v c bit, lm quen
vi cc khi nim trong lp trnh hng i tng.
Chng 2: Con tr v mng
Trnh by cch khai bo v s dng cc kiu con tr v mng trong ngn ng C++.
Chng 3: Kiu d liu c cu trc
Trnh by cch biu din v ci t mt s kiu cu trc d liu tru tng trong C++. Sau
, trnh by cch p dng cc kiu d liu ny trong cc ng dng c th.
Chng 4: Vo ra trn tp
Trnh by cc thao tc c, ghi d liu trn cc tp tin khc nhau: tp tin vn bn v tp tin
nh phn. Trnh by cc cch truy nhp tp tin trc tip.
Chng 5: Lp i tng
Trnh by cc khi nim m u cho lp trnh hng i tng trong C++, bao gm cch
khai bo v s dng lp, cc thuc tnh ca lp; cch khi to v hu b i tng, cc
quy tc truy nhp n cc thnh phn ca lp.
Chng 6: Tnh k tha v tng ng bi
Trnh by cch thc k tha gia cc lp trong C++, cc nguyn tc truy nhp trong k
tha, nh ngha np chng cc phng thc v tnh a hnh trong lp trnh hng i
tng vi C++.
Chng 7: Mt s lp quan trng
Trnh by cch s dng mt s lp c sn trong th vin chun ca C++, bao gm cc lp:
lp tp hp, lp chui, lp ngn xp, lp hng i v lp danh sch lin kt.
c c cun sch ny, sinh vin phi quen bit cc khi nim c bn v lp trnh, c mt s
k nng lp trnh vi ngn ng C hoc C++. Cun sch ny cng c th dng ti liu tham kho
cho nhng sinh vin mun tm hiu cc k thut lp trnh nng cao v lp trnh hng i tng
4
vi C++. Cun sch ny c km theo mt a chng trnh cha ton b cc chng trnh c
ly lm minh ho v cc bi tp trong cun sch.
Mc d cc tc gi c nhiu c gng trong vic bin son ti liu ny, song khng th trnh
khi nhng thiu st. Rt mong nhn c nhng kin ng gp qu bu t cc sinh vin v cc
bn ng nghip.

Chng 1: Gii thiu v cc phng php lp trnh

5
CHNG 1
GII THIU V CC PHNG PHP LP TRNH

Ni dung ca chng ny tp trung trnh by cc phng php lp trnh:
Phng php lp trnh tuyn tnh
Phng php lp trnh hng cu trc
Phng php lp trnh hng i tng.
1.1 LP TRNH TUYN TNH
c trng c bn ca lp trnh tuyn tnh l t duy theo li tun t. Chng trnh s c thc
hin theo th t t u n cui, lnh ny k tip lnh kia cho n khi kt thc chng trnh.
c trng
Lp trnh tuyn tnh c hai c trng:
n gin: chng trnh c tin hnh n gin theo li tun t, khng phc tp.
n lung: ch c mt lung cng vic duy nht, v cc cng vic c thc hin tun t
trong lung .
Tnh cht
u im: Do tnh n gin, lp trnh tuyn tnh c ng dng cho cc chng trnh n
gin v c u im d hiu.
Nhc im: Vi cc ng dng phc tp, ngi ta khng th dng lp trnh tuyn tnh
gii quyt.
Ngy nay, lp trnh tuyn tnh ch tn ti trong phm vi cc modul nh nht ca cc phng php
lp trnh khc. V d trong mt chng trnh con ca lp trnh cu trc, cc lnh cng c thc
hin theo tun t t u n cui chng trnh con.
1.2 LP TRNH HNG CU TRC
1.2.1 c trng ca lp trnh hng cu trc
Trong lp trnh hng cu trc, chng trnh chnh c chia nh thnh cc chng trnh con v
mi chng trnh con thc hin mt cng vic xc nh. Chng trnh chnh s gi n chng
trnh con theo mt gii thut, hoc mt cu trc c xc nh trong chng trnh chnh.
Cc ngn ng lp trnh cu trc ph bin l Pascal, C v C++. Ring C++ ngoi vic c c trng
ca lp trnh cu trc do k tha t C, cn c c trng ca lp trnh hng i tng. Cho nn
C++ cn c gi l ngn ng lp trnh na cu trc, na hng i tng.
c trng
c trng c bn nht ca lp trnh cu trc th hin mi quan h:
Chng 1: Gii thiu v cc phng php lp trnh

6
Chng trnh = Cu trc d liu + Gii thut
Trong :
Cu trc d liu l cch t chc d liu cho vic x l bi mt hay nhiu chng trnh
no .
Gii thut l mt quy trnh thc hin mt cng vic xc nh
Trong chng trnh, gii thut c quan h ph thuc vo cu trc d liu:
Mt cu trc d liu ch ph hp vi mt s hn ch cc gii thut.
Nu thay i cu trc d liu th phi thay i gii thut cho ph hp.
Mt gii thut thng phi i km vi mt cu trc d liu nht nh.
Tnh cht
Mi chng trnh con c th c gi thc hin nhiu ln trong mt chng trnh chnh.
Cc chng trnh con c th c gi n thc hin theo mt th t bt k, tu thuc
vo gii thut trong chng trnh chnh m khng ph thuc vo th t khai bo ca cc
chng trnh con.
Cc ngn ng lp trnh cu trc cung cp mt s cu trc lnh iu khin chng trnh.
u im
Chng trnh sng sa, d hiu, d theo di.
T duy gii thut r rng.
Nhc im
Lp trnh cu trc khng h tr mnh vic s dng li m ngun: Gii thut lun ph
thuc cht ch vo cu trc d liu, do , khi thay i cu trc d liu, phi thay i gii
thut, ngha l phi vit li chng trnh.
Khng ph hp vi cc phn mm ln: t duy cu trc vi cc gii thut ch ph hp vi
cc bi ton nh, nm trong phm vi mt modul ca chng trnh. Vi d n phn mm
ln, lp trnh cu trc t ra khng hiu qu trong vic gii quyt mi quan h v m gia
cc modul ca phn mm.
Vn
Vn c bn ca lp trnh cu trc l bng cch no phn chia chng trnh chnh thnh cc
chng trnh con cho ph hp vi yu cu, chc nng v mc ch ca mi bi ton. Thng
thng, phn r bi ton trong lp trnh cu trc, ngi ta s dng phng php thit k trn
xung (top-down).
1.2.2 Phng php thit k trn xung (top-down)
Phng php thit k top-down tip cn bi ton theo hng t trn xung di, t tng qat n
chi tit. Theo , mt bi ton c chia thnh cc bi ton con nh hn. Mi bi ton con li
c chia nh tip, nu c th, thnh cc bi ton con nh hn na. Qu trnh ny cn c gi l
qu trnh lm mn dn. Qu trnh ny s dng li khi cc bi ton con khng cn chia nh thm
Chng 1: Gii thiu v cc phng php lp trnh

7
na. Ngha l khi mi bi ton con u c th gii quyt bng mt chng trnh con vi mt gii
thut n gin.
V d, s dng phng php top-down gii quyt bi ton xy mt cn nh mi. Chng ta c
th phn r bi ton theo cc bc nh sau:
mc th nht, chia bi ton xy nh thnh cc bi ton nh hn nh lm mng, ct,
trn, xy tng, lp mi.
mc th hai, phn r cc cng vic mc th nht nh vic lm mng nh c th phn
r tip thnh cc cng vic o mng, gia c nn, lm khung st, b tong; cng vic
ct c phn r thnh
mc th ba, phn r cc cng vic ca mc th hai nh vic o mng c th phn chia
tip thnh cc cng vic nh o c, cm mc, chng dy, o v kim tra mng. Vic gia
c nn c phn r thnh
Qu trnh phn r c th dng mc ny, bi v cc cng vic con thu c nh o c, cm
mc, chng dy, o c th thc hin c ngay, khng cn chia nh thm na.
Lu :
Cng s dng phng php top-down vi cng mt bi ton, nhng c th cho ra nhiu
kt qu khc nhau. Nguyn nhn l do s khc nhau trong tiu ch phn r mt bi ton
thnh cc bi ton con.
V d, vn p dng phng php top-down gii quyt bi ton xy nh, nhng nu s dng
mt cch khc phn chia bi ton, ta c th thu c kt qu khc bit so vi phng php ban
u:
mc th nht, chia bi ton xy nh thnh cc bi ton nh hn nh lm phn g, lm
phn st, lm phn b tng v lm phn gch.
mc th hai, phn r cc cng vic mc th nht l lm phn g c th chia thnh cc
cng vic nh x g, gia cng g, to khung, lp vo nh. Vic lm st c th chia nh
thnh
R rng, vi cch lm mn th ny, ta s thu c mt kt qu khc hn vi cch thc thc
hin phn trn.
1.3 LP TRNH HNG I TNG
1.3.1 Lp trnh hng i tng
Trong lp trnh hng i tng:
Ngi ta coi cc thc th trong chng trnh l cc i tng v sau tru tng ho i
tng thnh lp i tng.
D liu c t chc thnh cc thuc tnh ca lp. Ngui ta ngn chn vic thay i tu
tin d liu trong chng trnh bng cc cch gii hn truy nhp nh ch cho php truy
nhp d liu thng qua i tng, thng qua cc phng thc m i tng c cung
cp
Quan h gia cc i tng l quan h ngang hng hoc quan h k tha: Nu lp B k
tha t lp A th A c gi l lp c s v B c gi l lp dn xut.
Chng 1: Gii thiu v cc phng php lp trnh

8
Ngn ng lp trnh hng i tng ph bin hin nay l Java, C++, C#...Mc d C++ cng c
nhng c trng c bn ca lp trnh hng i tng nhng vn khng phi l ngn ng lp
trnh thun hng i tng.
c trng
Lp trnh hng i tng c hai c trng c bn:
ng gi d liu: d liu lun c t chc thnh cc thuc tnh ca lp i tng. Vic
truy nhp n d liu phi thng qua cc phng thc ca i tng lp.
S dng li m ngun: vic s dng li m ngun c th hin thng qua c ch k
tha. C ch ny cho php cc lp i tng c th k tha t cc lp i tng khc. Khi
, trong cc lp dn xut, c th s dng cc phng thc (m ngun) ca cc lp c s
m khng cn phi nh ngha li.
u im
Lp trnh hng i tng c mt s u im ni bt:
Khng cn nguy c d liu b thay i t do trong chng trnh. V d liu c ng
gi vo cc i tng. Nu mun truy nhp vo d liu phi thng qua cc phng thc
c cho php ca i tng.
Khi thay i cu trc d liu ca mt i tng, khng cn thay i m ngun ca cc i
tng khc, m ch cn thay i mt s thnh phn ca i tng dn xut. iu ny hn
ch s nh hng xu ca vic thay i d liu n cc i tng khc trong chng
trnh.
C th s dng li m ngun, tit kim ti nguyn, chi ph thi gian. V nguyn tc k
tha cho php cc lp dn xut s dng cc phng thc t lp c s nh nhng phng
thc ca chnh n, m khng cn thit phi nh ngha li.
Ph hp vi cc d n phn mm ln, phc tp.
1.3.2 Mt s khi nim c bn
Trong mc ny, chng ta s lm quen vi mt s khi nim c bn trong lp trnh hng i
tng. Bao gm:
Khi nim i tng (object)
Khi nim ng gi d liu (encapsulation)
Khi nim k tha (inheritance)
Khi nim a hnh (polymorphism)
i tng (Object)
Trong lp trnh hng i tng, i tng c coi l n v c bn nh nht. Cc d diu v
cch x l ch l thnh phn ca i tng m khng c coi l thc th. Mt i tng cha cc
d liu ca ring n, ng thi c cc phng thc (hnh ng) thao tc trn cc d liu :
i tng = d liu + phng thc
Chng 1: Gii thiu v cc phng php lp trnh

9
Lp (Class)
Khi c nhiu i tng ging nhau v mt d liu v phng thc, chng c nhm li vi nhau
v gi chung l lp:
Lp l s tru tng ho ca i tng
i tng l mt th hin ca lp.
ng gi d liu (Encapsulation)
Cc d liu c ng gi vo trong i tng. Mi d liu c mt phm vi truy nhp
ring.
Khng th truy nhp n d liu mt cch t do nh lp trnh cu trc
Mun truy nhp n cc d liu c bo v, phi thng qua cc i tng, ngha l
phi s dng cc phng thc m i tng cung cp mi c th truy nhp n d liu
ca i tng .
Tuy nhin, v C++ ch l ngn ng lp trnh na i tng, cho nn C++ vn cho php nh ngha
cc bin d liu v cc hm t do, y l kt qu k tha t ngn ng C, mt ngn ng lp trnh
thun cu trc.
K tha (Inheritance)
Tnh k tha ca lp trnh hng i tng cho php mt lp c th k tha t mt s lp tn
ti. Khi , lp mi c th s dng d liu v phng thc ca cc lp c s nh l ca mnh.
Ngoi ra, lp dn xut cn c th b sung thm mt s d liu v phng thc. u im ca k
tha l khi thay i d liu ca mt lp, ch cn thay i cc phng thc trong phm vi lp c s
m khng cn thay i trong cc lp dn xut.
a hnh (Polymorphsim)
a hnh l khi nim lun i km vi k tha. Do tnh k tha, mt lp c th s dng li cc
phng thc ca lp khc. Tuy nhin, nu cn thit, lp dn xut cng c th nh ngha li mt
s phng thc ca lp c s. l s np chng phng thc trong k tha. Nh s np chng
phng thc ny, ta ch cn gi tn phng thc b np chng t i tng m khng cn quan
tm l i tng ca lp no. Chng trnh s t ng kim tra xem i tng l thuc kiu
lp c s hay thuc lp dn xut, sau s gi phng thc tng ng vi lp . l tnh a
hnh.
1.3.3 Lp trnh hng i tng trong C++
V C++ l mt ngn ng lp trnh c m rng t mt ngn ng lp trnh cu trc C nn C++
c xem l ngn ng lp trnh na hng i tng, na hng cu trc.
Nhng c trng hng i tng ca C++
Cho php nh ngha lp i tng.
Cho php ng gi d liu vo cc lp i tng. Cho php nh ngha phm vi truy nhp
d liu ca lp bng cc t kho phm vi: public, protected, private.
Chng 1: Gii thiu v cc phng php lp trnh

10
Cho php k tha lp vi cc kiu k tha khc nhau tu vo t kho dn xut.
Cho php lp dn xut s dng cc phng thc ca lp c s (trong phm vi quy nh).
Cho php nh ngha chng phng thc trong lp dn xut.
Nhng hn ch hng i tng ca C++
Nhng hn ch ny l do C++ c pht trin t mt ngn ng lp trnh thun cu trc C.
Cho php nh ngha v s dng cc bin d liu t do.
Cho php nh ngha v s dng cc hm t do.
Ngay c khi d liu c ng gi vo lp, d liu vn c th truy nhp trc tip nh d
liu t do bi cc hm bn, lp bn (friend) trong C++.
TNG KT CHNG 1
Chng 1 trnh by tng quan v cc phng php lp trnh hin nay. Ni dung tp trung vo
ba phng php lp trnh c lin quan trc tip n ngn ng lp trnh C++:
Lp trnh tuyn tnh
Lp trnh hng cu trc
Lp trnh hng i tng.
C++ l ngn ng lp trnh c m rng t ngn ng lp trnh cu trc C. Do , C++ va c
nhng c trng ca lp trnh cu trc, va c nhng c trng ca lp trnh hng i tng.
Chng 2: Con tr v mng

11
CHNG 2
CON TR V MNG

Ni dung ca chng ny tp trung trnh by cc vn c bn lin quan n cc thao tc trn
kiu d liu con tr v mng trong C++:
Khi nim con tr, cch khai bo v s dng con tr.
Mi quan h gia con tr v mng
Con tr hm
Cp pht b nh cho con tr
2.1 KHI NIM CON TR
2.1.1 Khai bo con tr
Con tr l mt bin c bit cha a ch ca mt bin khc. Con tr c cng kiu d liu vi kiu
d liu ca bin m n tr ti. C php khai bo mt con tr nh sau:
<Kiu d liu> *<Tn con tr>;
Trong :
Kiu d liu: C th l cc kiu d liu c bn ca C++, hoc l kiu d liu c cu trc,
hoc l kiu i tng do ngi dng t nh ngha.
Tn con tr: Tun theo qui tc t tn bin ca C++:
- Ch c bt u bng mt k t (ch), hoc du gch di _.
- Bt u t k t th hai, c th c kiu k t s.
- Khng c du trng (space bar) trong tn bin.
- C phn bit ch hoa v ch thng.
- Khng gii hn di tn bin.
V d, khai bo mt bin con tr c kiu l int v tn l pointerInt, ta vit nh sau:
int *pointerInt;
Lu
C th vit du con tr * ngay sau kiu d liu, ngha l hai cch khai bo sau l tng
ng:
int *pointerInt;
int* pointerInt;
Cc cch khai bo con tr nh sau l sai c php:
*int pointerInt; // Khai bo sai con tr
int pointerInt*; // Khai bo sai con tr
2.1.2 S dng con tr
Con tr c s dng theo hai cch:
Chng 2: Con tr v mng

12
Dng con tr lu a ch ca bin thao tc
Ly gi tr ca bin do con tr tr n thao tc
Dng con tr lu a ch ca bin
Bn thn con tr s c tr vo a ch ca mt bin c cng kiu d liu vi n. C php ca
php gn nh sau:
<Tn con tr> = &<tn bin>;
Lu
Trong php ton ny, tn con tr khng c du *.
V d:
int x, *px;
px = &x;
s cho con tr px c kiu int tr vo a ch ca bin x c kiu nguyn. Php ton &<Tn bin>
s cho a ch ca bin tng ng.
Ly gi tr ca bin do con tr tr n
Php ly gi tr ca bin do con tr tr n c thc hin bng cch gi tn:
*<Tn con tr>;
Lu
Trong php ton ny, phi c du con tr *. Nu khng c du con tr, s tr thnh
php ly a ch ca bin do con tr tr ti.
V d:
int x = 12, y, *px;
px = &y;
*px = x;
Qu trnh din ra nh sau:

con tr px vn tr ti a ch bin y v gi tr ca bin y s l 12.
Php gn gia cc con tr
Cc con tr cng kiu c th gn cho nhau thng qua php gn v ly a ch con tr:
<Tn con tr 1> = <Tn con tr 2>;
Lu
Trong php gn gia cc con tr, bt buc phi dng php ly a ch ca bin do con tr
tr ti (khng c du * trong tn con tr) m khng c dng php ly gi tr ca
bin do con tr tr ti.
x = 12 y = 0 px null
int x = 12, y, *px;
px = &y;
x = 12 y = 0 px
px = x;
x = 12 y=x =12 px
Chng 2: Con tr v mng

13
Hai con tr phi cng kiu. Trong trng hp hai con tr khc kiu, phi s dng cc
phng thc p kiu tng t nh trong php gn cc bin thng thng c kiu khc
nhau.
V d:
int x = 12, *px, *py;
px = &x;
py = px;

con tr py cng tr vo a ch ca bin x nh con tr px. Khi *py cng c gi tr 12 ging nh
*px v l gi tr ca bin x.
Chng trnh 2.1 minh ho vic dng con tr gia cc bin ca mt chng trnh C++.

Chng trnh 2.1
#include <stdio.h>
#include <conio.h>
void main(void){
int x = 12, *px, *py;
cout << x = << x << endl;

px = &x; // Con tr px tr ti a ch ca x
cout << px = &x, *px = << *px << endl;

*px = *px + 20; // Ni dung ca px l 32
cout << *px = *px+20, x = << x << endl;

py = px; // Cho py tr ti ch m px tr: a ch ca x
*py += 15; // Ni dung ca py l 47
cout << py = px, *py +=15, x = << x << endl;
}

Trong chng trnh 2.1, ban u bin x c gi tr 12. Sau , con tr px tr vo a ch ca bin x
nn con tr px cng c gi tr 12. Tip theo, ta tng gi tr ca con tr px thm 20, gi tr ca con
tr px l 32. V px ang tr n a ch ca x nn x cng c gi tr l 32. Sau , ta cho con tr py
tr n v tr m px ang tr ti (a ch ca bin x) nn py cng c gi tr 32. Cui cng, ta tng
gi tr ca con tr py thm 15, py s c gi tr 37. V py cng ang tr n a ch ca x nn x
cng c gi tr 37. Do , v d 2.1 s in ra kt qu nh sau:
x = 12 px py null
int x = 12, *px, *py;
px = &x;
x = 12 px
py = px;
x = 12 px py
py null
null
Chng 2: Con tr v mng

14
x = 12
px = &x, *px = 12
*px = *px + 20, x = 32
py = px, *py += 15, x = 37
2.2 CON TR V MNG
2.2.1 Con tr v mng mt chiu
Mng mt chiu
Trong C++, tn mt mng c coi l mt kiu con tr hng, c nh v ti mt vng nh xc
nh v a ch ca tn mng trng vi a ch ca phn t u tin ca mng.
V d khai bo:
int A[5];
th a ch ca mng A (cng vit l A) s trng vi a ch phn t u tin ca mng A (l
&A[0]) ngha l:
A = &A[0];
Quan h gia con tr v mng
V tn ca mng c coi nh mt con tr hng, nn n c th c gn cho mt con tr c cng
kiu.
V d khai bo:
int A[5] = {5, 10, 15, 20, 25};
int *pa = A;

th con tr pa s tr n mng A, tc l tr n a ch ca phn t A[0], cho nn hai khai bo sau
l tng ng:
pa = A;
pa = &A[0];
Vi khai bo ny, th a ch tr ti ca con tr pa l a ch ca phn t A[0] v gi tr ca con tr
pa l gi tr ca phn t A[0], tc l *pa = 5;
Php ton trn con tr v mng
Khi mt con tr tr n mng, th cc php ton tng hay gim trn con tr s tng ng vi php
dch chuyn trn mng.
V d khai bo:
int A[5] = {5, 10, 15, 20, 25};
A[0]=5 A
int A[5] = {5, 10, 15, 20, 25};
int *pa = A;
pa
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25
Chng 2: Con tr v mng

15
int *pa = &A[2];
th con tr pa s tr n a ch ca phn t A[2] v gi tr ca pa l: *pa = A[2] = 15.
Khi , php ton:
pa = pa + 1;
s a con tr pa tr n a ch ca phn t tip theo ca mng A, l a ch ca A[3]. Sau ,
php ton:
pa = pa 2;
s a con tr pa tr n a ch ca phn t A[1].

Lu :
Hai php ton pa++ v *pa++ c tc dng hon ton khc nhau trn mng, pa++ l thao
tc trn con tr, tc l trn b nh, n s a con tr pa tr n a ch ca phn t tip
theo ca mng. *pa++ l php ton trn gi tr, n tng gi tr hin ti ca phn t mng
ln mt n v.
V d:
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[2];
th pa++ l tng ng vi pa = &A[3] v *pa = 20.
nhng *pa++ li tng ng vi pa = &A[2] v *pa = 15+1 = 16, A[2] = 16.
A[0]=5 A
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[2];
pa
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25
pa = pa + 1;
pa
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25
pa = pa - 2;
pa
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25
Chng 2: Con tr v mng

16

Trong trng hp:
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[4];
th php ton pa++ s a con tr pa tr n mt a ch khng xc nh. L do l A[4] l
phn t cui ca mng A, nn pa++ s tr n a ch ngay sau a ch ca A[4], a ch
ny nm ngoi vng ch s ca mng A nn khng xc nh. Tng t vi trng hp
pa=&A[0], php ton pa-- cng a pa tr n mt a ch khng xc nh.


V mng A l con tr hng, cho nn khng th thc hin cc php ton trn A m ch c
th thc hin trn cc con tr tr n A: cc php ton pa++ hoc pa--l hp l, nhng cc
php ton A++ hoc A--l khng hp l.
Chng trnh 2.2a minh ho vic ci t mt th tc sp xp cc phn t ca mt mng theo cch
thng thng.

A[0]=5 A
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[2];
pa
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25
pa ++;
pa
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25
pa = &A[0];
pa
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25
null
pa --;
pa
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 null
A[0]=5 A
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[2];
pa
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25
pa ++;
pa
A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25
Nhng *pa ++;
pa
A[0]=5 A A[1]=10 A[2]=16 A[3]=20 A[4]= 25
Chng 2: Con tr v mng

17
Chng trnh 2.2a
void SortArray(int A[], int n){
int temp;
for(int i=0; i<n-1; i++)
for(int j=i+1; j<n; j++)
if(A[i] > A[j]){
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}

Chng trnh 2.2b ci t mt th tc tng t bng con tr. Hai th tc ny c chc nng hon
ton ging nhau.

Chng trnh 2.2b
void SortArray(int *A, int n){
int temp;
for(int i=0; i<n-1; i++)
for(int j=i+1; j<n; j++)
if(*(A+i) > *(A+j)){
temp = *(A+i);
*(A+i) = *(A+j);
*(A+j) = temp;
}
}

Trong chng trnh 2.2b, thay v dng mt mng, ta dng mt con tr tr n mng cn sp
xp. Khi , ta c th dng cc thao tc trn con tr thay v cc thao tc trn cc phn t mng.
2.2.2 Con tr v mng nhiu chiu
Con tr v mng nhiu chiu
Mt cu hi t ra l nu mt ma trn mt chiu th tng ng vi mt con tr, vy mt mng
nhiu chiu th tng ng vi con tr nh th no?
Xt v d:
int A[3][3] = {
{5, 10, 15},
{20, 25, 30},
{35, 40, 45}
};
Chng 2: Con tr v mng

18
Khi , a ch ca ma trn A chnh l a ch ca hng u tin ca ma trn A, v cng l a ch
ca phn t u tin ca hng u tin ca ma trn A:
a ch ca ma trn A: A = A[0] = *(A+0) = &A[0][0];
a ch ca hng th nht: A[1] = *(A+1) = &A[1][0];
a ch ca hng th i: A[i] = *(A+i) = &A[i][0];
a ch phn t &A[i][j] = (*(A+i)) + j;
Gi tr phn t A[i][j] = *((*(A+i)) + j);
Nh vy, mt mng hai chiu c th thay th bng mt mng mt chiu cc con tr cng kiu:
int A[3][3];
c th thay th bng:
int (*A)[3];
Con tr tr ti con tr
V mt mng hai chiu int A[3][3] c th thay th bng mt mng cc con tr int (*A)[3]. Hn
na, mt mng int A[3] li c th thay th bng mt con tr int *A. Do vy, mt mng hai chiu
c th thay th bng mt mng cc con tr, hoc mt con tr tr n con tr. Ngha l cc cch
vit sau l tng ng:
int A[3][3];
int (*A)[3];
int **A;
2.3 CON TR HM
Mc d hm khng phi l mt bin c th nn khng c mt a ch xc nh. Nhng trong khi
chy, mi mt hm trong C++ cng c mt vng nh xc nh, do vy, C++ cho php dng con
tr tr n hm. Con tr hm c dng truyn tham s c dng hm.
Khai bo con tr hm
Con tr hm c khai bo tng t nh khai bo nguyn mu hm thng thng trong C++,
ngoi tr vic c thm k hiu con tr * trc tn hm. C php khai bo con tr hm nh sau:
<Kiu d liu tr v> (*<Tn hm>)([<Cc tham s>]);
Trong :
Kiu d liu tr v: l cc kiu d liu thng thng ca C++ hoc kiu do ngi dng
t nh ngha.
Tn hm: tn do ngi dng t nh ngha, tun th theo quy tc t tn bin trong C++.
Cc tham s: c th c hoc khng (phn trong du [] l tu chn). Nu c nhiu tham
s, mi tham s c phn cch nhau bi du phy.
V d khai bo:
int (*Calcul)(int a, int b);
l khai bo mt con tr hm, tn l Calcul, c kiu int v c hai tham s cng l kiu int.
Lu :
Chng 2: Con tr v mng

19
Du () bao bc tn hm l cn thit ch ra rng ta ang khai bo mt con tr hm.
Nu khng c du ngoc n ny, trnh bin dch s hiu rng ta ang khai bo mt hm
thng thng v c gi tr tr v l mt con tr.
V d, hai khai bo sau l khc nhau hon ton:
// Khai bo mt con tr hm
int (*Calcul)(int a, int b);
// Khai bo mt hm tr v kiu con tr
int *Calcul(int a, int b);
S dng con tr hm
Con tr hm c dng khi cn gi mt hm nh l tham s ca mt hm khc. Khi , mt hm
c gi phi c khun mu ging vi con tr hm c khai bo.
V d, vi khai bo:
int (*Calcul)(int a, int b);
th c th gi cc hm c hai tham s kiu int v tr v cng kiu int nh sau:
int add(int a, int b);
int sub(int a, int b);
nhng khng c gi cc hm khc kiu tham s hoc kiu tr v nh sau:
int add(float a, int b);
int add(int a);
char* sub(char* a, char* b);
Chng trnh 2.3 minh ho vic khai bo v s dng con tr hm.

Chng trnh 2.3
#include <ctype.h>
#include <string>

// Hm c s dng con tr hm nh tham s
void Display(char[] str, int (*Xtype)(int c)){
int index = 0;
while(str[index] != \0){
cout << (*Xtype)(str[index]); // S dng con tr hm
index ++;
}
return;
}

// Hm main, dng li gi hm n con tr hm
void main(){
char input[500];
cout << Enter the string: ;
cin >> input;
Chng 2: Con tr v mng

20

char reply;
cout << Display the string in uppercase or lowercase (u,l): ;
cin >> reply;
if(reply == l) // Hin th theo dng lowercase
Display(str, tolower);
else // Hin th theo dng uppercase
Display(str, toupper);
return;
}

Chng trnh 2.3 khai bo hm Display() c s dng con tr hm c khun mu
int (*Xtype)(int c);
Trong hm main, con tr hm ny c gi bi hai th hin l cc hm tolower() v hm
toupper(). Hai hm ny c khai bo trong th vin ctype.h vi mu nh sau:
int tolower(int c);
int toupper(int c);
Hai khun mu ny ph hp vi con tr hm Xtype trong hm Display() nn li gi hm
Display() trong hm main l hp l.

2.4 CP PHT B NH NG
Xt hai trng hp sau y:
Trng hp 1, khai bo mt con tr v gn gi tr cho n:
int *pa = 12;
Trng hp 2, khai bo con tr n phn t cui cng ca mng ri tng thm mt n v
cho n:
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[4];
pa++;
Trong c hai trng hp, ta u khng bit thc s con tr pa ang tr n a ch no trong b
nh: trng hp 1 ch ra rng con tr pa ang tr ti mt a ch khng xc nh, nhng li cha
gi tr l 12 do c gn vo. Trng hp 2, con tr pa tr n a ch ngay sau a ch phn t
cui cng ca mng A, cng l mt a ch khng xc nh. Cc a ch khng xc nh ny l
cc a ch nm vng nh t do cn tha ca b nh. Vng nh ny c th b chim dng bi
bt k mt chng trnh no ang chy.
Do , rt c th cc chng trnh khc s chim mt cc a ch m con tr pa ang tr ti. Khi
, nu cc chng trnh thay i gi tr ca a ch , gi tr pa cng b thay i theo m ta
khng th kim sot c. trnh cc ri ro c th gp phi, C++ yu cu phi cp pht b nh
mt cch tng minh cho con tr trc khi s dng chng.
Chng 2: Con tr v mng

21
2.4.1 Cp pht b nh ng cho bin
Cp pht b nh ng
Thao tc cp pht b nh cho con tr thc cht l gn cho con tr mt a ch xc nh v a a
ch vo vng b chim dng, cc chng trnh khc khng th s dng a ch . C php
cp pht b nh cho con tr nh sau:
<tn con tr> = new <kiu con tr>;
V d, khai bo:
int *pa;
pa = new int;
s cp pht b nh hp l cho con tr pa.
Lu :
Ta c th va cp pht b nh, va khi to gi tr cho con tr theo c php sau:
int *pa;
pa = new int(12);
s cp pht cho con tr pa mt a ch xc nh, ng thi gn gi tr ca con tr *pa = 12.
Gii phng b nh ng
a ch ca con tr sau khi c cp pht bi thao tc new s tr thnh vng nh b chim
dng, cc chng trnh khc khng th s dng vng nh ngay c khi ta khng dng con tr
na. tit kim b nh, ta phi hu b vng nh ca con tr ngay sau khi khng dng n con
tr na. C php hu b vng nh ca con tr nh sau:
delete <tn con tr>;
V d:
int *pa = new int(12); // Khai bo con tr pa, cp pht b nh
// v gn gi tr ban u cho pa l 12.
delete pa; // Gii phng vng nh va cp cho pa.
Lu :
Mt con tr, sau khi b gii phng a ch, vn c th c cp pht mt vng nh mi
hoc tr n mt a ch mi:
int *pa = new int(12); // Khai bo con tr pa, cp pht b nh
// v gn gi tr ban u cho pa l 12.
delete pa; // Gii phng vng nh va cp cho pa.
int A[5] = {5, 10, 15, 20, 25};
pa = A; // Cho pa tr n a ch ca mng A
Nu c nhiu con tr cng tr vo mt a ch, th ch cn gii phng b nh ca mt con
tr, tt c cc con tr cn li cng b gii phng b nh:
int *pa = new int(12); // *pa = 12
int *pb = pa; // pb tr n cng a ch pa.
*pb += 5; // *pa = *pb = 17
delete pa; // Gii phng c pa ln pb
Chng 2: Con tr v mng

22
Mt con tr sau khi cp pht b nh ng bng thao tc new, cn phi phng b nh trc
khi tr n mt a ch mi hoc cp pht b nh mi:
int *pa = new int(12); // pa c cp b nh v *pa = 12
*pa = new int(15); // pa tr n a ch khc v *pa = 15.
// a ch c ca pa vn b coi l bn
2.4.2 Cp pht b nh cho mng ng mt chiu
Cp pht b nh cho mng ng mt chiu
Mng mt chiu c coi l tng ng vi mt con tr cng kiu. Tuy nhin, c php cp pht b
nh cho mng ng mt chiu l khc vi c php cp pht b nh cho con tr thng thng:
<Tn con tr> = new <Kiu con tr>[< di mng>];
Trong :
Tn con tr: tn do ngi dng t, tun th theo quy tc t tn bin ca C++.
Kiu con tr: Kiu d liu c bn ca C++ hoc l kiu do ngi dng t nh ngha.
di mng: s lng cc phn t cn cp pht b nh ca mng.
V d:
int *A = new int[5];
s khai bo mt mng A c 5 phn t kiu int c cp pht b nh ng.
Lu :
Khi cp pht b nh cho con tr c khi to thng thng, ta dng du (), khi cp pht
b nh cho mng, ta dng du []. Hai lnh cp pht sau l hon ton khc nhau:
// Cp pht b nh v khi to cho mt con tr int
int *A = new int(5);
// Cp pht b nh cho mt mng 5 phn t kiu int
int *A = new int[5];
Gii phng b nh ca mng ng mt chiu
gii phng vng nh c cp pht cho mt mng ng, ta dng c php sau:
delete [] <tn con tr>;
V d:
// Cp pht b nh cho mt mng c 5 phn t kiu int
int *A = new int[5];
// Gii phng vng nh do mng A ang chim gi.
delete [] A;
Chng trnh 2.4 minh ho hai th tc khi to v gii phng mt mng ng mt chiu.

Chng trnh 2.4
void InitArray(int *A, int length){
A = new int[length];
for(int i=0; i<length; i++)
Chng 2: Con tr v mng

23
A[i] = 0;
return;
}

void DeleteArray(int *A){
delete [] A;
return;
}
2.4.3 Cp pht b nh cho mng ng nhiu chiu
Cp pht b nh cho mng ng nhiu chiu
Mt mng hai chiu l mt con tr n mt con tr. Do vy, ta phi cp pht b nh theo tng
chiu theo c php cp pht b nh cho mng ng mt chiu.
V d:
int **A;
const int length = 10;
A = new int*[length]; // Cp pht b nh cho s dng ca ma trn A
for(int i=0; i<length; i++)
// Cp pht b nh cho cc phn t ca mi dng
A[i] = new int[length];
s cp pht b nh cho mt mng ng hai chiu, tng ng vi mt ma trn c kch thc
10*10.

Lu :
Trong lnh cp pht A = new int*[length], cn phi c du * ch ra rng cn cp
pht b nh cho mt mng cc phn t c kiu l con tr int (int*), khc vi kiu
int bnh thng.
Gii phng b nh ca mng ng nhiu chiu
Ngc li vi khi cp pht, ta phi gii phng ln lt b nh cho con tr tng ng vi ct v
hng ca mng ng.
V d:
int **A;
; // cp pht b nh

for(int i=0; i<length; i++)
delete [] A[i]; // Gii phng b nh cho mi dng
delete [] A; // Gii phng b nh cho mng cc dng
s gii phng b nh cho mt mng ng hai chiu.
Chng trnh 2.5 minh ho vic dng mng ng hai chiu tnh tng ca hai ma trn.

Chng 2: Con tr v mng

24
Chng trnh 2.5
#include<stdio.h>
#include<conio.h>

/* Khai bo nguyn mu hm */
void InitArray(int **A, int row, int colum);
void AddArray(int **A, int **B, int row, int colum);
void DisplayArray(int **A, int row, int colum);
void DeleteArray(int **A, int row);

void InitArray(int **A, int row, int colum){
A = new int*[row];
for(int i=0; i<row; i++){
A[i] = new int[colum];
for(int j=0; j<colum; j++){
cout << Phan tu [ << i << , << j << ] = ;
cin >> A[i][j];
}
return;
}

void AddArray(int **A, int **B, int row, int colum){
for(int i=0; i<row; i++)
for(int j=0; j<colum; j++)
A[i][j] += B[i][j];
return;
}

void DisplayArray(int **A, int row, int colum){
for(int i=0; i<row; i++){
for(int j=0; j<colum; j++)
cout << A[i][j] << ;
cout << endl; // Xung dng
return;
}

void DeleteArray(int **A, int row){
for(int i=0; i<row; i++)
delete [] A[i];
delete [] A;
return;
}

Chng 2: Con tr v mng

25
void main(){
clrscr();
int **A, **B, row, colum;
cout << So dong: ;
cin >> row;
cout << So cot: ;
cin >> colum;

/* Khi to cc ma trn */
cout << Khoi tao mang A: << endl;
InitArray(A, row, colum);

cout << Khoi tao mang B: << endl;
InitArray(B, row, colum);

// Cng hai ma trn
AddArray(A, B, row, colum);

// Hin th ma trn kt qu
cout << Tong hai mang A va mang B: << endl;
DisplayArray(A, row, colum);

// Gii phng b nh
DeleteArray(A, row);
DeleteArray(B, row);
return;
}
TNG KT CHNG 2
Ni dung chng 2 trnh by cc vn lin quan n vic khai bo v s dng con tr v
mng trong ngn ng C++:
Con tr l mt kiu bin c bit, n tr n a ch ca mt bin khc. C hai cch truy
nhp n con tr l truy nhp n a ch hoc truy nhp n gi tr ca a ch m con tr
tr n.
Con tr c th tham gia vo cc php ton nh cc bin thng thng bng php ly gi
tr.
Mt con tr c s tng ng vi mt mng mt chiu c cng kiu.
Mt ma trn hai chiu c th thay th bng mt mng cc con tr hoc mt con tr tr n
con tr.
Mt con tr c th tr n mt hm, khi , n c dng gi mt hm nh l mt
tham s cho hm khc.
Chng 2: Con tr v mng

26
Mt con tr cn phi tr vo mt a ch xc nh hoc phi c cp pht b nh qua
php ton new v gii phng b nh sau khi dng bng thao tc delete.
CU HI V BI TP CHNG 2
1. Trong cc khai bo con tr sau, nhng khai bo no l ng:
a. int A*;
b. *int A;
c. int* A, B;
d. int* A, *B;
e. int *A, *B;
2. Vi khai bo:
int a = 12;
int *pa;
Cc php gn no sau y l hp l:
a. pa = &a;
b. pa = a;
c. *pa = &a;
d. *pa = a;
3. Vi khai bo:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A+2;
Khi , *pa = ?
a. 10
b. 20
c. 30
d. 40
e. 50
4. Vi on chng trnh:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
*pa += 2;
Khi , *pa = ?
a. 10
b. 12
c. 30
d. 32
5. Vi on chng trnh:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
Chng 2: Con tr v mng

27
pa += 2;
Khi , *pa = ?
a. 10
b. 12
c. 30
d. 32
6. Vi on chng trnh:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
pa += 2;
Khi , pa = ?
a. &A[0]
b. A[2]
c. &A[2]
d. Khng xc nh
7. Vi on chng trnh:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
pa -= 2;
Khi , pa = ?
a. &A[0]
b. &A[2]
c. &A[4]
d. Khng xc nh
8. Vi on chng trnh:
int A[3][3] = {
{10, 20, 30},
{40, 50, 60},
{70, 80, 90}
};
int *pa;
Khi , c c kt qu *pa = 50, cc lnh no sau y l ng?
a. pa = A + 4;
b. pa = (*(A+1)) + 1;
c. pa = &A[1][1];
d. pa = *((*(A+1)) + 1);
9. Gi s ta khai bo mt hm c s dng con tr hm vi khun mu nh sau:
int Calcul(int a, int b, int (*Xcalcul)(int x, int y)){}
V ta c ci t mt s hm nh sau:
Chng 2: Con tr v mng

28
int add(int a, int b);
void cal(int a, int b);
int squere(int a);
Khi , li gi hm no sau y l ng:
a. Calcul(5, 10, add);
b. Calcul(5, 10, add(2, 3));
c. Calcul(5, 10, cal);
d. Calcul(5, 10, squere);
10. Ta mun cp pht b nh cho mt con tr kiu int v khi u gi tr cho n l 20. Lnh
no sau y l ng:
a. int *pa = 20;
b. int *pa = new int{20};
c. int *pa = new int(20);
d. int *pa = new int[20];
11. Ta mun cp pht b nh cho mt mng ng kiu int c chiu di l 20. Lnh no sau
y l ng:
a. int *pa = 20;
b. int *pa = new int{20};
c. int *pa = new int(20);
d. int *pa = new int[20];
12. Xt on chng trnh sau:
int A[5] = {10, 20, 30, 40, 50};
int *pa = A;
pa = new int(2);
Khi , *pa = ?
a. 10
b. 30
c. 2
d. Khng xc nh
13. Xt on chng trnh sau:
1> int A[5] = {10, 20, 30, 40, 50};
2> int *pa = A;
3> pa += 15;
4> delete pa;
on chng trnh trn c li dng no?
a. 1
b. 2
c. 3
d. 4
Chng 2: Con tr v mng

29
14. Vit chng trnh thc hin cc php ton cng, tr, nhn, chia trn a thc. Cc a thc
c biu din bng mng ng mt chiu. Bc ca a thc v cc h s tng ng c
nhp t bn phm.
15. Vit chng trnh thc hin cc php ton cng, tr, nhn hai ma trn kch thc m*n.
Cc ma trn c biu din bng mng ng hai chiu. Gi tr kch c ma trn (m, n) v
gi tr cc phn t ca ma trn c nhp t bn phm.

Chng 3: Kiu d liu cu trc

30
CHNG 3
KIU D LIU CU TRC

Ni dung chng ny tp trung trnh by cc vn lin quan n kiu d liu c cu trc trong
C++:
nh ngha mt cu trc
S dng mt cu trc bng cc php ton c bn trn cu trc
Con tr cu trc, khai bo v s dng con tr cu trc
Mng cc cu trc, khai bo v s dng mng cc cu trc
Mt s kiu d liu tru tng khc nh ngn xp, hng i, danh sch lin kt.
3.1 NH NGHA CU TRC
Kiu d liu c cu trc c dng khi ta cn nhm mt s bin d liu lun i km vi nhau.
Khi , vic x l trn mt nhm cc bin c thc hin nh trn cc bin c bn thng thng.
3.1.1 Khai bo cu trc
Trong C++, mt cu trc do ngi dng t nh ngha c khai bo thng qua t kho struct:
struct <Tn cu trc>{
<Kiu d liu 1> <Tn thuc tnh 1>;
<Kiu d liu 2> <Tn thuc tnh 2>;

<Kiu d liu n> <Tn thuc tnh n>;
};
Trong :
struct: l tn t kho khai bo mt cu trc, bt buc phi c khi nh ngha cu trc.
Tn cu trc: l tn do ngi dng t nh ngha, tun th theo quy tc t tn bin trong
C++. Tn ny s tr thnh tn ca kiu d liu c cu trc tng ng.
Thuc tnh: mi thuc tnh ca cu trc c khai bo nh khai bo mt bin thuc kiu
d liu thng thng, gm c kiu d liu v tn bin tng ng. Mi khai bo thuc tnh
phi kt thc bng du chm phy ; nh mt cu lnh C++ thng thng.
V d, qun l nhn vin ca mt cng ty, khi x l thng tin v mi nhn vin, ta lun phi x
l cc thng tin lin quan nh:
Tn
Tui
Chc v
Lng
Do , ta s dng cu trc lu gi thng tin v mi nhn vin bng cch nh ngha mt cu
trc c tn l Employeee vi cc thuc tnh nh sau:
Chng 3: Kiu d liu cu trc

31
struct Employeee{
char name[20]; // Tn nhn vin
int age; // Tui nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
};
Lu :
Cu trc ch cn nh ngha mt ln trong chng trnh v c th c khai bo bin cu
trc nhiu ln. Khi cu trc c nh ngha, vic khai bo bin ln khc trong
chng trnh c thc hin nh khai bo bin thng thng:
<Tn cu trc> <tn bin 1>, <tn bin 2>;
V d, sau khi nh ngha cu trc Employeee, mun c bin myEmployeee, ta khai
bo nh sau:
Employee myEmployeee;
3.1.2 Cu trc lng nhau
Cc cu trc c th c nh ngha lng nhau khi mt thuc tnh ca mt cu trc cng cn c
kiu l mt cu trc khc. Khi , vic nh ngha cu trc cha c thc hin nh mt cu trc
bnh thng, vi khai bo v thuc tnh l mt cu trc con:
struct <Tn cu trc cha>{
<Kiu d liu 1> <Tn thuc tnh 1>;
// C kiu cu trc
<Kiu cu trc con> <Tn thuc tnh 2>;

<Kiu d liu n> <Tn thuc tnh n>;
};
V d, vi kiu cu trc Employee, ta khng quan tm n tui nhn vin na, m quan tm n
ngy sinh ca nhn vin. V ngy sinh cn c cc thng tin lun i vi nhau l ngy sinh, thng
sinh, nm sinh. Do , ta nh ngha mt kiu cu trc con cho kiu ngy sinh:
struct Date{
int day;
int month;
int year;
};
khi , cu trc Employee tr thnh:
struct Employee{
char name[20]; // Tn nhn vin
Date birthDay; // Ngy sinh ca nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
};

Chng 3: Kiu d liu cu trc

32

Lu :
Trong nh ngha cc cu trc lng nhau, cu trc con phi c nh ngha trc cu trc
cha m bo cc kiu d liu ca cc thuc tnh ca cu trc cha l tng minh ti thi
im n c nh ngha.
3.1.3 nh ngha cu trc vi t kho typedef
trnh phi dng t kho struct mi khi khai bo bin cu trc, ta c th dng t kha typedef
khi nh ngha cu trc:
typedef struct {
<Kiu d liu 1> <Tn thuc tnh 1>;
<Kiu d liu 2> <Tn thuc tnh 2>;

<Kiu d liu n> <Tn thuc tnh n>;
} <Tn kiu d liu cu trc>;
Trong :
Tn kiu d liu cu trc: l tn kiu d liu ca cu trc va nh ngha. Tn ny s
c dng nh mt kiu d liu thng thng khi khai bo bin cu trc.
V d, mun c kiu d liu c cu trc nhn vin, c tn l Employee, ta dng t kho typedef
nh ngha cu trc nh sau:
typedef struct {
char name[20]; // Tn nhn vin
int age; // Tui nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;
Khi , mun c hai bin l myEmployee1 v myEmployee2 c kiu cu trc Employee, ta ch
cn khai bo nh sau m khng cn t kho struct:
Employee myEmployee1, myEmployee2;
Trong v d khai bo lng cu trc Employee, dng t kho typedef cho kiu Date:
typedef struct {
int day;
int month;
int year;
} Date;
cu trc Employee tr thnh:
typedef struct {
char name[20]; // Tn nhn vin
Date birthDay; // Ngy sinh ca nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;
Chng 3: Kiu d liu cu trc

33

Lu :
Khi khng dng t kho typedef, tn cu trc (nm sau t kho struct) c dng khai
bo bin. Trong khi , khi c t kho typedef, tn kiu d liu cu trc (dng cui cng
trong nh ngha) mi c dng khai bo bin.
Khi dng t kho typedef th khng th khai bo bin ng thi vi nh ngha cu trc.
3.2 THAO TC TRN CU TRC
Cc thao tc trn cu trc bao gm:
Khai bo v khi to gi tr ban u cho bin cu trc
Truy nhp n cc thuc tnh ca cu trc
3.2.1 Khi to gi tr ban u cho cu trc
Khi to bin c cu trc n
Bin cu trc c khai bo theo cc cch sau:
<Tn kiu d liu cu trc> <tn bin>;
Ngoi ra, ta c th khi to cc gi tr cho cc thuc tnh ca cu trc ngay khi khai bo bng cc
c php sau:
<Tn kiu d liu cu trc> <tn bin> = {
<gi tr thuc tnh 1>,
<gi tr thuc tnh 2>,

<gi tr thuc tnh n>
};
Trong :
Gi tr thuc tnh: l gi tr khi u cho mi thuc tnh, c kiu ph hp vi kiu d
liu ca thuc tnh. Mi gi tr ca thuc tnh c phn cch bng du phy ,.
V d, vi nh ngha cu trc:
typedef struct {
char name[20]; // Tn nhn vin
int age; // Tui nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;
th c th khai bo v khi to cho mt bin nh sau:
Employee myEmployee1 = {
Nguyen Van A,
27,
Nhan vien,
300f
Chng 3: Kiu d liu cu trc

34
};
Khi to cc bin c cu trc lng nhau
Trong trng hp cc cu trc lng nhau, php khi to cng thc hin nh thng thng vi
php khi to cho tt c cc cu trc con.
V d vi khai bo cu trc nh sau:
typedef struct {
int day;
int month;
int year;
} Date;
v:
typedef struct {
char name[20]; // Tn nhn vin
Date birthDay; // Ngy sinh ca nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;
Th khai bo v khi to mt bin c kiu Employee c th thc hin nh sau:
Employee myEmployee1 = {
Nguyen Van A,
{15, 05, 1980}, // Khi to cu trc con
Nhan vien,
300f
};
3.2.2 Truy nhp n thuc tnh ca cu trc
Vic truy nhp n thuc tnh ca cu trc c thc hin bng c php:
<Tn bin cu trc>.<tn thuc tnh>
V d, vi mt bin cu trc kiu Employee n:
Employee myEmployee1 = {
Nguyen Van A,
27,
Nhan vien,
300f
};
ta c th truy xut nh sau:
cout << myEmployee1.name; // hin th ra Nguyen Van A
myEmployee1.age += 1; // Tng s tui ln 1
i vi kiu cu trc lng nhau, php truy nhp n thuc tnh c thc hin ln lt t cu trc
cha n cu trc con.
V d, vi mt bin cu trc kiu Employee lng nhau:
Chng 3: Kiu d liu cu trc

35


Employee myEmployee1 = {
Nguyen Van A,
{15, 05, 1980},
Nhan vien,
300f
};
ta c th truy xut nh sau:
cout << myEmployee1.name; // hin th ra Nguyen Van A
myEmployee1.birthDay.day = 16; // Sa li ngy sinh thnh 16
myEmployee1.birthDay.month = 07; // Sa li thng sinh thnh 07
Chng trnh 3.1a minh ho vic to lp v s dng cu trc Employee n, khng dng t kho
typedef.

Chng trnh 3.1a
#include<stdio.h>
#include<conio.h>
#include<string.h>

struct Employee{
char name[20]; // Tn nhn vin
int age; // Tui nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
};

/* Khai bo khun mu hm */
void Display(Employee myEmployee);

void Display(Employee myEmployee){
cout << Name: << myEmployee.name << endl;
cout << Age: << myEmployee.age << endl;
cout << Role: << myEmployee.role << endl;
cout << Salary: << myEmployee.salary << endl;
return;
}

void main(){
clrscr();
// Hin th gi tr mc nh
Employee myEmployee =
Chng 3: Kiu d liu cu trc

36
{Nguyen Van A, 27, Nhan vien, 300f};
cout << Thng tin mc nh: << endl;
Display(myEmployee);

// Thay i gi tr cho cc thuc tnh
cout << Name: ;
cin >> myEmployee.name;
cout << Age: ;
cin >> myEmployee.age;
cout << Role: ;
cin >> myEmployee.role;
cout << Salary: ;
cin >> myEmployee.salary;

cout << Thng tin sau khi thay i: << endl;
Display(myEmployee);
return;
}

Chng trnh 3.1b minh ho vic to lp v s dng cu trc Employee lng nhau, c dng t
kho typedef.

Chng trnh 3.1b
#include<stdio.h>
#include<conio.h>
#include<string.h>

typedef struct {
int day;
int month;
int year;
} Date;

typedef struct {
char name[20]; // Tn nhn vin
Date birthDay; // Ngy sinh ca nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;

/* Khai bo khun mu hm */
void Display(Employee myEmployee);
Chng 3: Kiu d liu cu trc

37

void Display(Employee myEmployee){
cout << Name: << myEmployee.name << endl;
cout << Birth day: << myEmployee.birthDay.day << /
<< myEmployee.birthDay.month << /
<< myEmployee.birthDay.year << endl;
cout << Role: << myEmployee.role << endl;
cout << Salary: << myEmployee.salary << endl;
return;
}

void main(){
clrscr();
// Hin th gi tr mc nh
Employee myEmployee =
{Nguyen Van A, {15, 5, 1980}, Nhan vien, 300f};
cout << Thng tin mc nh: << endl;
Display(myEmployee);

// Thay i gi tr cho cc thuc tnh
cout << Name: ;
cin >> myEmployee.name;
cout << Day of birth: ;
cin >> myEmployee.birthDay.day;
cout << Month of birth: ;
cin >> myEmployee.birthDay.month;
cout << Year of birth: ;
cin >> myEmployee.birthDay.year;
cout << Role: ;
cin >> myEmployee.role;
cout << Salary: ;
cin >> myEmployee.salary;

cout << Thng tin sau khi thay i: << endl;
Display(myEmployee);
return;
}
Chng 3: Kiu d liu cu trc

38
3.3 CON TR CU TRC V MNG CU TRC
3.3.1 Con tr cu trc
Con tr cu trc l mt con tr tr n a ch ca mt bin c kiu cu trc. Cch khai bo v s
dng con tr cu trc c thc hin nh con tr thng thng.
Khai bo con tr cu trc
Con tr cu trc c khai bo theo c php:
<Tn kiu cu trc> *<Tn bin>;
V d, vi kiu khai bo cu trc:
typedef struct {
int day;
int month;
int year;
} Date;
v:
typedef struct {
char name[20]; // Tn nhn vin
Date birthDay; // Ngy sinh ca nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;
th ta c th khai bo mt con tr cu trc nh sau:
Employee *ptrEmployee;
Lu :
Cng nh khai bo con tr thng thng, du con tr * c th nm ngay trc tn bin
hoc nm ngay sau tn kiu cu trc.
Cng ging con tr thng thng, con tr cu trc c s dng khi:
Cho n tr n a ch ca mt bin cu trc
Cp pht cho n mt vng nh xc nh.
Gn a ch cho con tr cu trc
Mt con tr cu trc c th tr n a ch ca mt bin cu trc c cng kiu thng qua php gn:
<Tn bin con tr> = &<Tn bin thng>;
V d, khai bo v php gn:
Employee *ptrEmployee, myEmployee;
ptrEmployee = &myEmployee;
s a con tr ptrEmployee tr n a ch ca bin cu trc myEmployee.
Chng 3: Kiu d liu cu trc

39
Cp pht b nh ng cho con tr cu trc
Trong trng hp ta mun to ra mt con tr cu trc mi, khng tr vo mt bin cu trc c sn
no, s dng con tr mi ny, ta phi cp pht vng nh cho n. C php cp pht vng nh
cho con tr cu trc:
<Tn bin con tr> = new <Kiu cu trc>;
V d, cu trc Employee c khai bo bng t kho typedef, ta c th cp pht vng nh cho
con tr cu trc nh sau:
Employee *ptrEmployee;
ptrEmployee = new Employee;
hoc cp pht ngay khi khai bo:
Employee *ptrEmployee = new Employee;
Sau khi cp pht vng nh cho con tr bng thao tc new, khi con tr khng c dng na, hoc
cn tr sang mt a ch khc, ta phi gii phng vng nh va c cp pht cho con tr bng
thao tc:
delete <Tn bin con tr>;
V d:
Employee *ptrEmployee = new Employee;

// Thc hin cc thao tc trn con tr

delete ptrEmployee;
Lu :
Thao tc delete ch c thc hin i vi con tr m trc , n c cp pht b nh
ng thng qua thao tc new:
Employee *ptrEmployee = new Employee;
delete ptrEmployee; //ng
m khng th thc hin vi con tr ch tr n a ch ca mt bin cu trc khc:
Employee *ptrEmployee, myEmployee;
ptrEmployee = &myEmployee;
delete ptrEmployee; //li
Truy nhp thuc tnh ca con tr cu trc
Thuc tnh ca con tr cu trc c th c truy nhp thng qua hai cch:
Cch 1:
<Tn bin con tr> -> <Tn thuc tnh>;
Cch 2:
(*<Tn bin con tr>).<Tn thuc tnh>;
V d, thuc tnh tn nhn vin ca cu trc Employee c th c truy nhp thng qua hai cch:
Employee *ptrEmployee = new Employee;
cin >> ptrEmployee -> name;
hoc:
Chng 3: Kiu d liu cu trc

40
cin >> (*ptrEmployee).name;
Lu :
Trong cch truy nhp th hai, phi c du ngoc n () quanh tn con tr v php ton
truy nhp thuc tnh . c u tin cao hn php ton ly gi tr con tr *.
Thng thng, ta dng cch th nht cho n gin v thun tin.
Chng trnh 3.2 ci t vic khi to v hin th ni dung ca mt con tr cu trc.

Chng trnh 3.2
#include<stdio.h>
#include<conio.h>
#include<string.h>

typedef struct {
int day;
int month;
int year;
} Date;

typedef struct {
char name[20]; // Tn nhn vin
Date birthDay; // Ngy sinh ca nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;

/* Khai bo khun mu hm */
void InitStruct(Employee *myEmployee);
void Display(Employee *myEmployee);

void InitStruct(Employee *myEmployee){
myEmployee = new Employee;
cout << Name: ;
cin >> myEmployee->name;
cout << Day of birth: ;
cin >> myEmployee->birthDay.day;
cout << Month of birth: ;
cin >> myEmployee->birthDay.month;
cout << Year of birth: ;
cin >> myEmployee->birthDay.year;
cout << Role: ;
cin >> myEmployee->role;
cout << Salary: ;
Chng 3: Kiu d liu cu trc

41
cin >> myEmployee->salary;
}

void Display(Employee myEmployee){
cout << Name: << myEmployee->name << endl;
cout << Birth day: << myEmployee->birthDay.day << /
<< myEmployee->birthDay.month << /
<< myEmployee->birthDay.year << endl;
cout << Role: << myEmployee->role << endl;
cout << Salary: << myEmployee->salary << endl;
return;
}

void main(){
clrscr();
Employee *myEmployee;
InitStruct(myEmployee);
Display(myEmployee);
return;
}
3.3.2 Mng cu trc
Khi cn x l nhiu i tng c dng kiu d liu cu trc, ta c th s dng mng cc cu trc.
V mt mng mt chiu l tng ng vi mt con tr c cng kiu. Do , c th khai bo
mng theo hai cch: Khai bo mng tnh nh thng thng hoc khai bo mng ng thng qua
con tr.
Khai bo mng tnh cc cu trc
Khai bo mng tnh cc cu trc theo c php:
<Tn kiu cu trc> <Tn bin mng>[<S phn t mng>];
V d:
Employee employees[10];
l khai bo mt mng tn l employees gm 10 phn t c kiu l cu trc Employee.
Khai bo mng ng cc cu trc
Khai bo mt mng ng cc cu trc hon ton tng t khai bo mt con tr cu trc cng kiu:
<Tn kiu cu trc> *<Tn bin>;
V d, khai bo:
Employee *employees;
va c th coi l khai bo mt con tr thng thng c cu trc Employee, va c th coi l khai
bo mt mng ng cc cu trc c kiu cu trc Employee.
Chng 3: Kiu d liu cu trc

42
Tuy nhin, cch cp pht b nh ng cho mng cc cu trc khc vi mt con tr. y l cch
chng trnh nhn bit ta ang dng mt con tr cu trc hay mt mng ng c cu trc. C
php cp pht b nh cho mng ng nh sau:
<Tn bin mng> = new <Kiu cu trc>[<S lng phn t>];
V d, khai bo:
Employee *employees = new Employee[10];
s cp pht b nh cho mt mng ng employees c 10 phn t kiu cu trc Employee.
Truy nhp n phn t ca mng cu trc
Vic truy nhp n cc phn t ca mng cu trc c thc hin nh truy cp n phn t ca
mng thng thng. V d mun truy nhp n thuc tnh tn nhn vin phn t nhn vin th i
trong mng cu trc, ta vit nh sau:
Employee *employees = new Employee[10];
employees[i].name;
Chng trnh 3.3 ci t vic khi to mt mng cc nhn vin ca mt phng trong mt cng ty.
Sau , chng trnh s tm v in ra thng tin v nhn vin c lng cao nht v nhn vin c
lng thp nht trong phng.

Chng trnh 3.3
#include<stdio.h>
#include<conio.h>
#include<string.h>

typedef struct {
int day;
int month;
int year;
} Date;

typedef struct {
char name[20]; // Tn nhn vin
Date birthDay; // Ngy sinh ca nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;

/* Khai bo khun mu hm */
void InitArray(Employee *myEmployee, int length);
Employee searchSalaryMax(Employee *myEmployee, int length);
Employee searchSalaryMin(Employee *myEmployee, int length);
void Display(Employee myEmployee);

Chng 3: Kiu d liu cu trc

43
void InitArray(Employee *myEmployee, int length){
myEmployee = new Employee[length];
for(int i=0; i<length; i++){
cout << Nhan vien thu << i << endl;
cout << Name: ;
cin >> myEmployee[i].name;
cout << Day of birth: ;
cin >> myEmployee[i].birthDay.day;
cout << Month of birth: ;
cin >> myEmployee[i].birthDay.month;
cout << Year of birth: ;
cin >> myEmployee[i].birthDay.year;
cout << Role: ;
cin >> myEmployee[i].role;
cout << Salary: ;
cin >> myEmployee[i].salary;
}
return;
}

Employee searchSalaryMax(Employee *myEmployee, int length){
int index = 0;
int maxSalary = myEmployee[0].salary;
for(int i=1; i<length; i++)
if(myEmployee[i].salary > maxSalary){
maxSalary = myEmployee[i].salary;
index = i;
}
return myEmployee[index];
}

Employee searchSalaryMin(Employee *myEmployee, int length){
int index = 0;
int minSalary = myEmployee[0].salary;
for(int i=1; i<length; i++)
if(myEmployee[i].salary < minSalary){
minSalary = myEmployee[i].salary;
index = i;
}
return myEmployee[index];
}

void Display(Employee myEmployee){
Chng 3: Kiu d liu cu trc

44
cout << Name: << myEmployee.name << endl;
cout << Birth day: << myEmployee.birthDay.day << /
<< myEmployee.birthDay.month << /
<< myEmployee.birthDay.year << endl;
cout << Role: << myEmployee.role << endl;
cout << Salary: << myEmployee.salary << endl;
return;
}

void main(){
clrscr();
Employee *myEmployee, tmpEmployee;
int length = 0;
cout << So luong nhan vien: ;
cin >> length;

// Khi to danh sch nhn vin
InitArray(myEmployee);

// Nhn vin c lng cao nht
tmpEmployee = searchSalaryMax(myEmployee, length);
Display(tmpEmployee);

// Nhn vin c lng thp nht
tmpEmployee = searchSalaryMin(myEmployee, length);
Display(tmpEmployee);

// Gii phng vng nh
delete [] myEmployee;
return;
}
3.4 MT S KIU D LIU TRU TNG
Ni dung phn ny tp trung trnh by vic ci t mt s cu trc d liu tru tng, bao gm:
Ngn xp (stack)
Hng i (queue)
Danh sch lin kt (list)
Chng 3: Kiu d liu cu trc

45
3.4.1 Ngn xp
Ngn xp (stack) l mt kiu danh sch cho php thm v bt cc phn t mt u danh sch,
gi l nh ca ngn xp. Ngn xp hot ng theo nguyn l: phn t no c a vo sau, s
c ly ra trc.
nh ngha cu trc ngn xp
V ta ch cn quan tm n hai thuc tnh ca ngn xp l:
Danh sch cc phn t ca ngn xp
V tr nh ca ngn xp
nn ta c th nh ngha cu trc ngn xp nh sau (cc phn t ca ngn xp c kiu int):
typedef SIZE 100;
typedef struct {
int top; // V tr ca nh
int nodes[SIZE]; // Danh sch cc phn t
} Stack;
Tuy nhin, nh ngha ny tn ti mt vn , l kch thc (SIZE) ca danh sch cha cc
phn t l tnh. Do :
Nu ta chn SIZE ln, nhng khi gp ng dng ch cn mt s t phn t cho ngn xp th
rt tn b nh.
Nu ta khai bo SIZE nh, th khi gp bi ton cn ngn xp c nhiu phn t, ta s khng
thm c cc phn t mi vo, chng trnh s c li.
khc phc hn ch ny, ta c th s dng b nh ng (mng ng thng qua con tr) lu
danh sch cc phn t ca ngn xp. Khi , nh ngha cu trc ngn xp s c dng nh sau:
typedef struct {
int top; // V tr ca nh
int *nodes; // Danh sch cc phn t
} Stack;
Ta s s dng nh ngha ny trong cc chng trnh ng dng ngn xp.
Cc thao tc trn ngn xp
i vi cc thao tc trn ngn xp, ta quan tm n hai thao tc c bn:
Thm mt phn t mi vo nh ngn xp, gi l push.
Ly ra mt phn t t nh ngn xp, gi l pop.
Khi thm mt phn t mi vo ngn xp, ta lm cc bc nh sau:
1. S phn t trong ngn xp c l (top+1). Do , ta cp pht mt vng nh mi lu
c (top+1+1) = (top+2) phn t.
2. Sao chp (top+1) phn t c sang vng mi. Nu danh sch ban u rng (top = -1) th
khng cn thc hin bc ny.
3. Thm phn t mi vo cui vng nh mi
4. Gii phng vng nh ca danh sch c
Chng 3: Kiu d liu cu trc

46
5. Cho danh sch nodes tr vo vng nh mi.
Chng trnh 3.4a ci t th tc thm mt phn t mi vo ngn xp.

Chng trnh 3.4a
void push(Stack *stack, int node){
int *tmpNodes = new int[stack->top + 2];// Cp pht vng nh mi
stack->top ++; // Tng ch s ca node nh
for(int i=0; i<stack->top; i++) // Sao chp sang vng nh mi
tmpNodes[i] = stack->nodes[i];
tmpNodes[stack->top] = node; // Thm node mi vo nh
delete [] stack->nodes; // Gii phng vng nh c
stack->nodes = tmpNodes; // Tr vo vng nh mi
return;
}

Khi ly ra mt phn t ca ngn xp, ta lm cc bc nh sau:
Kim tra xem ngn xp c rng (top = -1) hay khng. Nu khng rng th thc hin cc
bc tip theo.
Ly phn t nh ngn xp ra
Cp pht mt vng nh mi c (top+1) -1 = top phn t
Sao chp top phn t t danh sch c sang vng nh mi (tr phn t nh).
Gii phng vng nh c
Cho con tr danh sch tr vo vng nh mi.
Tr v gi tr phn t nh ly ra.
Chng trnh 3.4b ci t th tc ly mt phn t t ngn xp.

Chng trnh 3.4b
int pop(Stack *stack){
if(stack->top < 0){ // Kim tra ngn xp rng
cout << Stack is empty! << endl;
return 0;
}
int result = stack->nodes[stack->top];// Lu gi gi tr nh
int *tmpNodes = new int[stack->top];// Cp pht vng nh mi
for(int i=0; i<stack->top; i++) // Sao chp sang vng nh mi
tmpNodes[i] = stack->nodes[i];
stack->top --; // Gim ch s ca node nh
delete [] stack->nodes; // Gii phng vng nh c
stack->nodes = tmpNodes; // Tr vo vng nh mi
return result; // Tr v gi tr node nh
Chng 3: Kiu d liu cu trc

47
}

p dng
Ngn xp c s dng trong cc ng dng tho mn nguyn tc: ci no t vo trc s c
ly ra sau. Chng trnh 3.4c minh ho vic dng ngn xp o ngc mt xu k t c nhp
vo t bn phm.

Chng trnh 3.4c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct {
int top; // V tr node nh
int *nodes; // Danh sch phn t
} Stack;

/* Khai bo nguyn mu hm */
void init(Stack *stack);
void push(Stack *stack, int node);
int pop(Stack *stack);
void release(Stack *stack);

void init(Stack *stack){
stack = new Stack; // Cp pht vng nh cho con tr
stack->top = -1; // Khi to ngn xp rng
}

void push(Stack *stack, int node){
int *tmpNodes = new int[stack->top + 2];// Cp pht vng nh mi
stack->top ++; // Tng ch s ca node nh
for(int i=0; i<stack->top; i++) // Sao chp sang vng nh mi
tmpNodes[i] = stack->nodes[i];
tmpNodes[stack->top] = node; // Thm node mi vo nh
delete [] stack->nodes; // Gii phng vng nh c
stack->nodes = tmpNodes; // Tr vo vng nh mi
return;
}

int pop(Stack *stack){
if(stack->top < 0){ // Kim tra ngn xp rng
Chng 3: Kiu d liu cu trc

48
cout << Stack is empty! << endl;
return 0;
}
int result = stack->nodes[stack->top];// Lu gi gi tr nh
int *tmpNodes = new int[stack->top];// Cp pht vng nh mi
for(int i=0; i<stack->top; i++) // Sao chp sang vng nh mi
tmpNodes[i] = stack->nodes[i];
stack->top --; // Gim ch s ca node nh
delete [] stack->nodes; // Gii phng vng nh c
stack->nodes = tmpNodes; // Tr vo vng nh mi
return result; // Tr v gi tr node nh
}

void release(Stack *stack){
delete [] stack->nodes; // Gii phng vng danh sch
delete stack; // Gii phng con tr
return;
}

void main(){
clrscr();
Stack *stack;
init(stack); // Khi to ngn xp
char strIn[250];
// Nhp chui k t t bn phm
cout << Nhap chuoi: ;
cin >> strIn;
for(int i=0; i<strlen(strIn); i++) // t vo ngn xp
push(stack, strIn[i]);
while(stack->top > -1) // Ly ra t ngn xp
cout << pop(stack);
release(stack); // Gii phng b nh
return;
}
3.4.2 Hng i
Hng i (queue) cng l mt cu trc tuyn tnh cc phn t. Trong , cc phn t lun c
thm vo mt u, gi l u cui hng i, v vic ly ra cc phn t lun c thc hin
u cn li, gi l u mt ca hng i. Hng i hot ng theo nguyn l: phn t no c
a vo trc, s c ly ra trc.
Chng 3: Kiu d liu cu trc

49
nh ngha cu trc hng i
Hng i c cc thuc tnh:
Mt danh sch cc phn t c mt trong hng i.
Ch s ca phn t ng u ca danh sch (front).
Ch s phn t cui ca danh sch (rear).
Nu dng cu trc tnh nh ngha, hng i c cu trc nh sau:
typedef SIZE 100;
typedef struct {
int front, rear; // V tr ca nh u, nh cui
int nodes[SIZE]; // Danh sch cc phn t
} Queue;
Nu dng b nh ng lu gi hng i, th phn t front lun l phn t th 0 ca danh sch.
V rear s bng di danh sch tr i 1. Cu trc ng ca hng i:
typedef struct {
int front, rear; // V tr ca nh u, nh cui
int *nodes; // Danh sch cc phn t
} Queue;
Thao tc trn hng i
Thm mt phn t vo cui hng i
Ly mt phn t v tr u ca hng i
Thao tc thm mt phn t vo cui hng i vi b nh ng c thc hin tng t vi ngn
xp. Chng trnh 3.5a ci t th tc thm mt phn t vo cui hng i ng.

Chng trnh 3.5a
void insert(Queue *queue, int node){
int *tmpNodes = new int[queue->rear + 2];// Cp pht vng nh mi
queue->rear ++; // Tng ch s ca node ui
if(queue->front == -1) // Nu hng i c rng
queue->front = 0; // th cp nht front
for(int i=0; i<queue->rear; i++) // Sao chp sang vng nh mi
tmpNodes[i] = queue->nodes[i];
tmpNodes[queue->rear] = node; // Thm node mi vo ui
delete [] queue->nodes; // Gii phng vng nh c
queue->nodes = tmpNodes; // Tr vo vng nh mi
return;
}

Thao tc ly ra mt phn t u ca hng i thc hin theo cc bc:
1. Kim tra tnh rng (front = rear = -1) ca hng i. Nu khng rng mi thc hin tip
Chng 3: Kiu d liu cu trc

50
2. Ly phn t nodes[0] ra.
3. Sao chp danh sch cn li sang vng nh mi
4. Gii phng vng nh c
5. a danh sch tr vo vng nh mi
6. Tr v gi tr phn t ly ra
Chng trnh 3.5b ci t th tc ly ra mt phn t ca hng i ng.

Chng trnh 3.5b
int remove(Queue *queue){
if((queue-front < 0)||(queue-rear < 0)){// Kim tra hng i rng
cout << Queue is empty! << endl;
return 0;
}
// Lu gi gi tr phn t u
int result = queue->nodes[queue->front];
int *tmpNodes;
if(queue->rear > 0){ // Nu c hn 1 phn t
tmpNodes = new int[queue->rear];// Cp pht vng nh mi
for(int i=0; i<queue->rear; i++)// Sao chp sang vng nh mi
tmpNodes[i] = queue->nodes[i];
}else // Nu ch c 1 phn t
queue->front --; // Hng i thnh rng
queue->rear --; // Gim ch s ca node ui
delete [] queue->nodes; // Gii phng vng nh c
queue->nodes = tmpNodes; // Tr vo vng nh mi
return result; // Tr v gi tr node u
}

p dng
Hng i c p dng trong cc bi ton cn c ch qun l ci no vo trc s c ly ra
trc. Chng trnh 3.5c minh ho c ch qun l tin trnh n gin nht ca h iu hnh: cc
tin trnh c qun l theo m tin trnh, khi xut hin, tin trnh c a vo cui ca mt hng
i. Khi no CPU rnh th s ly tin trnh u hng i ra thc hin.

Chng trnh 3.5c
#include<stdio.h>
#include<conio.h>

typedef struct {
int front, rear; // V tr ca nh u, nh cui
Chng 3: Kiu d liu cu trc

51
int *nodes; // Danh sch cc phn t
} Queue;

/* Khai bo cc nguyn mu hm */
void init(Queue *queue);
void insert(Queue *queue, int node);
int remove(Queue *queue);
void travese(Queue *queue);
void release(Queue *queue);

void init(Queue *queue){
queue = new Queue; // Cp pht b nh cho con tr
queue->front = -1; // Khi to danh sch rng
queue->rear = -1;
return;
}

void insert(Queue *queue, int node){
int *tmpNodes = new int[queue->rear + 2];// Cp pht vng nh mi
queue->rear ++; // Tng ch s ca node ui
if(queue->front == -1) // Nu hng i c rng
queue->front = 0; // th cp nht front
for(int i=0; i<queue->rear; i++) // Sao chp sang vng nh mi
tmpNodes[i] = queue->nodes[i];
tmpNodes[queue->rear] = node; // Thm node mi vo ui
delete [] queue->nodes; // Gii phng vng nh c
queue->nodes = tmpNodes; // Tr vo vng nh mi
return;
}

int remove(Queue *queue){
if((queue-front < 0)||(queue-rear < 0)){// Kim tra hng i rng
cout << Queue is empty! << endl;
return 0;
}
// Lu gi gi tr phn t u
int result = queue->nodes[queue->front];
int *tmpNodes;
if(queue->rear > 0){ // Nu c hn 1 phn t
tmpNodes = new int[queue->rear];// Cp pht vng nh mi
for(int i=0; i<queue->rear; i++)// Sao chp sang vng nh mi
tmpNodes[i] = queue->nodes[i];
}else // Nu ch c 1 phn t
Chng 3: Kiu d liu cu trc

52
queue->front --; // Hng i thnh rng
queue->rear --; // Gim ch s ca node ui
delete [] queue->nodes; // Gii phng vng nh c
queue->nodes = tmpNodes; // Tr vo vng nh mi
return result; // Tr v gi tr node u
}

void travese(Queue *queue){
if(queue->front < 0){ // Khi danh sch rng
cout << Danh sach rong! << endl;
return;
}
for(int i=queue->front; i<=queue.rear; i++)
cout << queue->nodes[i] << ;// Lit k cc phn t
cout << endl;
return;
}

void release(Queue *queue){
if(queue->front > -1) //Nu danh sch khng rng th
delete [] queue->nodes; //gii phng vng nh ca danh sch
delete queue; //Gii phng vng nh ca con tr
}

void main(){
clrscr();
Queue *queue;
init(queue); // Khi to hng i
int function;
do{
clrscr();
cout << CAC CHUC NANG: << endl;
cout << 1: Them mot tien trinh vao hang doi << endl;
cout << 2: Dua mot tien trinh trinh vao thuc hien << endl;
cout<<3: Xem tat ca cac tien trinh trong hang doi << endl;
cout << 5: Thoat! << endl;
cout << ========================================= << endl;
cout << Chon chuc nang: << endl;
cin >> function;
switch(function){
case 1: // Thm vo hng i
int maso;
cout << Ma so tien trinh vao hang doi: ;
Chng 3: Kiu d liu cu trc

53
cin >> maso;
insert(queue, maso);
break;
case 2: // Ly ra khi hng i
cout << Tien trinh duoc thuc hien: <<
remove(queue) << endl;
break;
case 3: // Duyt hng i
cout<<Cac tien trinh dang o trong hang doi la:
<<endl;
travese(queue);
break;
}while(function != 5);
release(queue); // Gii phng hng i
return;
}
3.4.3 Danh sch lin kt
Danh sch lin kt l mt kiu d liu bao gm mt dy cc phn t c th t, cc phn t c
cng cu trc d liu, ngoi tr node u tin ca danh sch l node lu thng tin v danh sch.
C hai loi danh sch lin kt:
Danh sch lin kt n: mi node c mt con tr tr n node tip theo trong danh sch
Danh sch lin kt kp: mi node c hai con tr, mt tr vo node trc, mt tr vo node
tip theo trong danh sch.
Trong phn ny s trnh by danh sch lin kt n. Danh sch lin kt kp c coi nh l mt
bi tp m rng t danh sch lin kt n.
nh ngha danh sch n
Mi node ca danh sch n cha d liu ca n, ng thi tr n node tip theo trong danh
sch, cu trc mt node nh sau:
struct simple{
Employee employee; // D liu ca node c kiu Employee
struct simple *next; // Tr n node k tip
};
typedef struct simple SimpleNode;
Node u ca danh sch n c cu trc ring, n khng cha d liu nh node thng m cha
cc thng tin:
S lng node trong danh sch (khng k bn thn n node u)
Con tr n node u tin ca danh sch
Con tr n node cui cng ca danh sch
Do vy, cu trc node u ca danh sch n l:
Chng 3: Kiu d liu cu trc

54
typedef struct{
int nodeNumber; // S lng cc node
SimpleNode *front, *rear;// Tr n node u v cui danh sch
} SimpleHeader;
Cc thao tc trn danh sch lin kt n
Cc thao tc c bn trn danh sch n bao gm:
Chn thm mt node vo v tr th n trong danh sch
Loi ra mt node v tr th n trong danh sch
Vic chn thm mt node vo v tr th n trong danh sch c thc hin theo cc bc:
1. Nu n<=0, chn vo u. Nu n>s phn t ca danh sch, chn vo cui. Trng hp
cn li, chn vo gia.
2. Tm node th n: gi vt ca hai node th n-1 v th n.
3. To mt node mi: cho node th n-1 tr tip vo node mi v node mi tr tip vo node
th n.
Chng trnh 3.6a ci t th tc chn mt node vo v tr th n ca danh sch.

Chng trnh 3.6a
void insert(SimpleHeader *list, int position, int value){
SimpleNode *newNode = new SimpleNode;
newNode->value = value;
if(position <= 0){ // Chn vo u ds
newNode->next = list->front; // Chn vo trc node u
list->front = newNode; // Cp nht li node u ds
if(list->nodeNumber == 0) // Nu ds ban u rng th
list->rear = newNode; // node ui trng vi node u
}else if(position >= list->nodeNumber){// Chn vo cui ds
list->rear->next = newNode; // Chn vo sau node cui
list->rear = newNode; // Cp nht li node cui ds
if(list->nodeNumber == 0) // Nu ds ban u rng th
list->front = newNode; // node u trng node ui
}else{ // Chn vo gia ds
SimpleNode *prev = list->front, *curr = list->front;
int index = 0;
while(index < position){ // tm node n-1 v n
prev = curr;
curr = curr->next;
index++;
}
newNode->next = curr; // chn vo trc node n
prev->next = newNode; // v chn vo sau node n-1
}
Chng 3: Kiu d liu cu trc

55
list->nodeNumber++; // Cp nht s lng node
return;
}

Vic xo mt node v tr th n trong danh sch c thc hin theo cc bc:
1. Nu n<0 hoc n>s phn t ca danh sch, khng xo node no.
2. Tm node th n: gi vt ca ba node th n-1, th n v th n+1.
3. Cho node th n-1 tr tip vo node th n+1, xo con tr ca node th n.
4. Tr v node th n.
Chng trnh 3.6b ci t th tc xo mt node v tr th n ca danh sch.

Chng trnh 3.6b
SimpleNode* remove(SimpleHeader *list, int position){
if((position < 0)||(position >= list->nodeNumber))
return NULL; // Khng xo node no c
SimpleNode* result;
if(position == 0){ // Xo node u
result = list->front; // Gi node cn xo
list->front = list->front->next;// Cp nht node u
if(list->nodeNumber == 1) // Nu ds ch c 1 node th
list->rear = list->front;// Cp nht node cui ds
}else if(position == list->nodeNumber 1){
result = list->rear; // Gi node cn xo
SimpleNode *curr = list->front;
while(curr->next != list->rear)
curr = curr->next; // Tm node trc ca node cui
curr->next = NULL; // Xo node rear hin ti
list->rear = curr; // Cp nht node cui ds
}else{
SimpleNode *prev = list->front, *curr = list->front;
int index = 0;
while(index < position){ // Tm node n-1 v n
prev = curr;
curr = curr->next;
index++;
}
result = curr; // Gi node cn xo
prev->next = curr->next; // Cho node n-1 tr n node n+1
}
list->nodeNumber --; // Cp nht s lng node
return result; // Tr v node cn xo
Chng 3: Kiu d liu cu trc

56
}

p dng
Chng trnh 3.6c minh ho vic dng danh sch lin kt n qun l nhn vin vn phng vi
cc thng tin rt n gin: tn, tui v tin lng ca mi nhn vin.

Chng trnh 3.6c
#include<stdio.h>
#include<conio.h>
#include<string.h>

typedef struct{
char name[25]; // Tn nhn vin
int age; // Tui nhn vin
float salary; // Lng nhn vin
} Employee;

struct simple{
Employee employee; // D liu ca node
struct simple *next; // Tr n node k tip
};
typedef struct simple SimpleNode;

typedef struct{
int nodeNumber; // S lng cc node
SimpleNode *front, *rear; // Tr n node u v cui ds
} SimpleHeader;



/* Khai bo cc nguyn mu hm */
void init(SimpleHeader *list);
void insert(SimpleHeader *list, int position, Employee employee);
SimpleNode* remove(SimpleHeader *list);
void travese(SimpleHeader *list);
void release(SimpleHeader *list);

void init(SimpleHeader *list){
list = new list; // Cp pht b nh cho con tr
list->front = NULL; // Khi to danh sch rng
list->rear = NULL;
Chng 3: Kiu d liu cu trc

57
list->nodeNumber = 0;
return;
}

void insert(SimpleHeader *list, int position, Employee employee){
SimpleNode *newNode = new SimpleNode;
newNode->employee = employee;
if(position <= 0){ // Chn vo u ds
newNode->next = list->front; // Chn vo trc node u
list->front = newNode; // Cp nht li node u ds
if(list->nodeNumber == 0) // Nu ds ban u rng th
list->rear = newNode; // node ui trng vi node u
}else if(position >= list->nodeNumber){// Chn vo cui ds
list->rear->next = newNode; // Chn vo sau node cui
list->rear = newNode; // Cp nht li node cui ds
if(list->nodeNumber == 0)// Nu ds ban u rng th
list->front = newNode; // node u trng node ui
}else{ // Chn vo gia ds
SimpleNode *prev = list->front, *curr = list->front;
int index = 0;
while(index < position){// tm node n-1 v n
prev = curr;
curr = curr->next;
index++;
}
newNode->next = curr; // chn vo trc node n
prev->next = newNode; // v chn vo sau node n-1
}
list->nodeNumber++; // Cp nht s lng node
return;
}

SimpleNode* remove(SimpleHeader *list, int position){
if((position < 0)||(position >= list->nodeNumber))
return NULL; // Khng xo node no c
SimpleNode* result;
if(position == 0){ // Xo node u
result = list->front; // Gi node cn xo
list->front = list->front->next;// Cp nht node u
if(list->nodeNumber == 1) // Nu ds ch c 1 node th
list->rear = list->front;// Cp nht node cui ds
}else if(position == list->nodeNumber 1){
result = list->rear; // Gi node cn xo
Chng 3: Kiu d liu cu trc

58
SimpleNode *curr = list->front;
while(curr->next != list->rear)
curr = curr->next;// Tm node trc ca node cui
curr->next = NULL; // Xo node rear hin ti
list->rear = curr; // Cp nht node cui ds
}else{
SimpleNode *prev = list->front, *curr = list->front;
int index = 0;
while(index < position){// Tm node n-1 v n
prev = curr;
curr = curr->next;
index++;
}
result = curr; // Gi node cn xo
prev->next = curr->next;// Cho node n-1 tr n node n+1
}
list->nodeNumber --; // Cp nht s lng node
return result; // Tr v node cn xo
}

void travese(SimpleHeader *list){
if(list->nodeNumber <= 0){ // Khi danh sch rng
cout << Danh sach rong! << endl;
return;
}
SimpleNode *curr = list->front;
while(curr != NULL){
cout << curr->employee.name <<
<< curr->employee.age <<
<< curr->employee.salary << endl;// Lit k cc phn t
curr = curr->next;
}
return;
}

void release(SimpleHeader *list){
SimpleNode* curr = remove(list, 0);
while(curr != NULL){
delete curr; //Gii phng vng nh ca node
curr = remove(list, 0);
}
delete list; //Gii phng vng nh ca con tr
}
Chng 3: Kiu d liu cu trc

59

void main(){
clrscr();
SimpleHeader *list;
init(list); // Khi to ds
int function;
do{
clrscr();
cout << CAC CHUC NANG: << endl;
cout << 1: Them mot nhan vien << endl;
cout << 2: Xoa mot nhan vien << endl;
cout << 3: Xem tat ca cac nhan vien trong phong << endl;
cout << 5: Thoat! << endl;
cout << ======================================= << endl;
cout << Chon chuc nang: << endl;
cin >> function;
switch(function){
case 1: // Thm vo ds
int position;
Employee employee;
cout << Vi tri can chen: ;
cin >> position;
cout << Ten nhan vien: ;
cin >> employee.name;
cout << Tuoi nhan vien: ;
cin >> employee.age;
cout << Luong nhan vien: ;
cin >> employee.salary;
insert(list, position, employee);
break;
case 2: // Ly ra khi ds
int position;
cout << Vi tri can xoa: ;
cin >> position;
SimpleNode* result = remove(list, position);
if(result != NULL){
cout << Nhan vien bi loai: << endl;
cout << Ten: << result->employee.name
<< endl;
cout << Tuoi: << result->employee.age
<< endl;
cout << Luong:
<< result->employee.salary << endl;
Chng 3: Kiu d liu cu trc

60
}
break;
case 3: // Duyt ds
cout<<Cac nhan vien cua phong:<<endl;
travese(list);
break;
}while(function != 5);
release(list); // Gii phng ds
return;
}
TNG KT CHNG 3
Ni dung chng 3 trnh by cc vn lin quan n cc kiu d liu c cu trc trong C++:
Khai bo cu trc thng qua t kho struct
T nh ngha kiu d liu cu trc bng t kho typedef.
Khai bo mt bin c kiu d liu cu trc
Khai bo cc cu trc lng nhau.
Truy nhp n cc thuc tnh ca cu trc
Khai bo con tr cu trc, cp pht v gii phng b nh ng ca con tr cu trc. Truy
nhp n cc thuc tnh ca con tr cu trc.
Khai bo v s dng mng cu trc
Khai bo mng cu trc bng con tr cu trc. Cp pht v gii phng vng nh ca mng
ng cc cu trc.
Ci t mt s cu trc c bit:
- Ngn xp
- Hng i
- Danh sch lin kt
CU HI V BI TP CHNG 3
1. nh ngha mt cu trc sinh vin c tn l Sinhvien, gm c tn v tui sinh vin.
nh ngha no sau y l ng:
a. struct Sinhvien{
char name[20];
int age;
};
b. struct {
char name[20];
int age;
} Sinh vien;
Chng 3: Kiu d liu cu trc

61
c. typedef struct Sinhvien{
char name[20];
int age;
};
2. Mt cu trc c nh ngha nh sau:
struct Employee{
char name[20];
int age;
};
Khi , cch khai bo bin no sau y l ng:
a. struct Employee myEmployee;
b. struct employee myEmployee;
c. Employee myEmployee;
d. employee myEmployee;
3. Mt cu trc c nh ngha nh sau:
typedef struct employee{
char name[20];
int age;
} Employee;
Khi , cch khai bo bin no sau y l ng:
a. Employee myEmployee;
b. employee myEmployee;
c. struct Employee myEmployee;
d. struct employee myEmployee;
4. Vi cu trc c nh ngha nh trong bi 3. Khi , cch khi to bin no sau y l
ng:
a. Employee myEmployee = {A, 27};
b. Employee myEmployee = {A, 27};
c. Employee myEmployee = (A, 27);
d. Employee myEmployee = (A, 27);
5. Vi cu trc c nh ngha nh trong bi 3. Khi , cc cch cp pht b nh cho bin
con tr no sau y l ng:
a. Employee *myEmployee = new Employee;
b. Employee *myEmployee = new Employee();
c. Employee *myEmployee = new Employee(10);
d. Employee *myEmployee = new Employee[10];

6. nh ngha mt cu trc v mn hc ca mt hc sinh c tn Subject, bao gm cc thng
tin:
Chng 3: Kiu d liu cu trc

62
Tn mn hc, kiu char[];
im tng kt mn hc, kiu float;
7. nh ngha cu trc v hc sinh tn l Student bao gm cc thng tin sau:
Tn hc sinh, kiu char[];
Tui hc sinh, kiu int;
Lp hc sinh, kiu char[];
Danh sch im cc mn hc ca hc sinh, kiu l mt mng cc cu trc Subject
c nh ngha trong bi tp 6.
Xp loi hc lc, kiu char[];
8. Khai bo mt bin c cu trc l Student nh ngha trong bi 7. Sau , thc hin tnh
im trung bnh ca tt c cc mn hc ca hc sinh , v vit mt th tc xp loi hc
sinh da vo im trung bnh cc mn hc:
Nu im tb nh hn 5.0, xp loi km
Nu im tb t 5.0 n di 6.5, xp loi trung bnh.
Nu im tb t 6.5 n di 8.0, xp loi kh
Nu im tb t 8.0 tr ln, xp loi gii.
9. Vit mt chng trnh qun l cc hc sinh ca mt lp, l mt dy cc cu trc c kiu
Stupid nh ngha trong bi 7. S dng th tc ci t trong bi 8 thc hin cc thao
tc sau:
Khi to danh sch v im ca cc hc sinh trong lp.
Tnh im trung bnh v xp loi cho tt c cc hc sinh.
Tm tt c cc hc sinh theo mt loi nht nh
10. S dng cu trc ngn xp nh ngha trong bi i mt s t kiu thp phn sang
kiu nh phn: Chi s nguyn cho 2, mi cho n khi thng <2, lu cc s d vo ngn
xp. Sau , c cc gi tr d t ngn xp ra, ta s thu c chui nh phn tng ng.
11. M rng cu trc hng i nh ngha trong bi tr thnh hng i c u tin:
Cho mi node thm mt thuc tnh l u tin ca node
Khi thm mt node vo hng i, thay v thm vo cui hng i nh thng
thng, ta tm v tr c u tin ph hp chn node vo, sao cho dy cc node
trong hng i l mt danh sch c u tin ca cc node l gim dn.
Vic ly ra l khng thay i: ly ra phn t u hng i, chnh l phn t c
u tin cao nht.
12. p dng hng i c u tin trong bi 11 xy dng chng trnh qun l tin trnh
c u tin ca h iu hnh, m rng ng dng trong bi ngn xp.
13. M rng cu trc danh sch lin kt n trong bi thnh danh sch lin kt kp:
Mi node c thm mt con tr prev tr n node trc n
i vi node header, cng cn 2 con tr: tr n node u tin v node cui cng
ca danh sch
Chng 3: Kiu d liu cu trc

63
Ring vi node u tin (front) ca danh sch, con tr prev ca n s tr n
NULL. Ging nh con tr next ca node rear.
14. Ci t li hai tho tc thm vo mt node v xo mt node mt v tr xc nh trong
mt cu trc danh sch lin kt kp nh ngha trong bi 13.
15. p dng cc nh ngha v thao tc trong cc bi 13 v 14. Ci t li chng trnh qun l
nhn vin chng trnh 3.6c bng danh sch lin kt kp.
Chng 4: Vo ra trn tp

64
CHNG 4
VO RA TRN TP

Ni dung chng ny tp trung trnh by cc vn lin quan n cc thao tc trn tp d liu
trong ngn ng C++:
Khi nim tp, tp vn bn v tp nh phn
Cc thao tc vo ra trn tp
Phng thc truy nhp tp trc tip
4.1 KHI NIM TP
4.1.1 Tp d liu
Trong C++, khi thao tc vi mt tp d liu, cn thc hin tun t theo cc bc nh sau:
1. M tp tin
2. Thc hin cc thao tc c, ghi trn tp tin ang m
3. ng tp tin
thc hin cc thao tc lin quan n tp d liu, C++ cung cp mt th vin <fstream.h>
cha cc lp v cc hm phc v cho cc thao tc ny. Do vy, trong cc chng trnh lm vic
vi tp tin, ta cn khai bo ch th dng th vin ny ngay t u chng trnh:
#include<fstream.h>
Khai bo bin tp
Trong C++, khi khai bo mt bin tp, ng thi ta s m tp tng ng theo c php tng qut
bng cch dng kiu fstream nh sau:
fstream <Tn bin tp>(<Tn tp>, <Ch m tp>);
Trong :
Tn bin tp: c tnh cht nh mt tn bin thng thng, n s c dng thc hin
cc thao tc vi tp gn vi n. Tn bin tp cng phi tun th theo quy tc t tn bin
trong C++.
Tn tp: l tn tp d liu m ta cn thao tc trn n.
Ch m tp: l cc hng kiu bt c nh ngha sn bi C++. N ch ra rng ta
ang m tp tin ch no: c hoc ghi, hoc c c ln ghi.
V d, khai bo:
fstream myFile(abc.txt, ios::in);
l khai bo mt bin tp, c tn l myFile, dng m tp tin c tn l abc.txt v tp tin ny c
m ch c d liu (bt ch th ios::in).
Lu :
Chng 4: Vo ra trn tp

65
Tn tp tin c dng mt chui k t, nu khai bo tn tp c ng dn th mc \ th
mi du \ phi c vit thnh \\ trnh b nhm ln vi cc k t c bit trong C
nh \n, \d
V d, mun m mt tp tn l abc.txt trong th mc myDir c, ta phi khai bo nh sau:
fstream myFile(myDir\\abc.txt, ios::in);
Cc ch m tp tin
Cc ch m tp tin c nh ngha bi cc bt ch th:
ios::in: M mt tp tin c.
ios::out: M mt tp tin c sn ghi.
ios::app: M mt tp tin c sn thm d liu vo cui tp.
ios::ate: M tp tin v t con tr tp tin vo cui tp.
ios::trunc: Nu tp tin c sn th d liu ca n s b mt.
ios::nocreate: M mt tp tin, tp tin ny bt buc phi tn ti.
ios::noreplace: Ch m tp tin khi tp tin cha tn ti.
ios::binary: M mt tp tin ch nh phn.
ios::text: M mt tp tin ch vn bn.
Lu :
Khi mun m mt tp tin ng thi nhiu ch khc nhau, ta kt hp cc bt ch th
tng ng bng php ton hp bt |.
V d, mun m mt tp tin abc.txt c (ios::in) ng thi vi ghi (ios::out) di ch vn
bn (ios::text), ta khai bo nh sau:
fstream myFile(abc.txt, ios::in|ios::out|ios::text);
4.1.2 Tp vn bn
m mt tp tin di ch vn bn, ta dng c php sau:
fstream <Tn bin tp>(<Tn tp>, ios::text);
Khi , cc thao tc c, ghi trn bin tp c thc hin theo n v l cc t, c phn cch
bi du trng (space bar) hoc du xung dng (enter).
V d, mun m tp tin baitho.txt di ch vn bn, ta khai bo nh sau:
fstream myBaiTho(baitho.txt, ios::text);
4.1.3 Tp nh phn
m mt tp tin di ch nh phn, ta dng c php sau:
fstream <Tn bin tp>(<Tn tp>, ios::binary);
Khi , cc thao tc c, ghi trn bin tp c thc hin theo n v byte theo kch thc cc
bn ghi (cu trc) c ghi trong tp.
V d, mun m tp tin baitho.txt di ch nh phn, ta khai bo nh sau:
fstream myBaiTho(baitho.txt, ios::binary);
Chng 4: Vo ra trn tp

66
4.2 VO RA TRN TP
4.2.1 Vo ra tp vn bn bng >> v <<
Ghi tp vn bn bng <<
Cc bc thc hin ghi d liu vo mt tp tin nh sau:
1. M tp tin theo ch ghi bng i tng ofstream (m tp tin ch ghi):
ofstream <Tn bin tp>(<Tn tp tin>, ios::out);
2. Ghi d liu vo tp bng thao tc <<:
<Tn bin tp> << <D liu>;
3. ng tp tin bng lnh close():
<Tn bin tp>.close();
Chng trnh 4.1 minh ho vic ghi d liu vo tp tin:
Tn tp tin c ngi dng t nhp vo t bn phm.
Chng trnh s ghi vo tp cc k t do ngi dng g vo t bn phm, mi k t c
phn cch nhau bi du trng (space bar).
Chng trnh dng li khi ngi dng nhp k t e. V tp tin c kt thc bng mt
du xung dng endl.

Chng trnh 4.1
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>

const int length = 25; // di ti a tn tp tin

void main(){
clrscr();
char fileName[length], input;
cout << Ten tep tin: ;
cin >> setw(length) >> fileName; // Nhp tn tp tin

/* M tp tin */
ofstream fileOut(fileName, ios::out);// Khai bo v m tp tin
if(!fileOut){ // Khng m c tp
cout << Khong the tao duoc tep tin << fileName << endl;
exit(1);
}

/* Ghi d liu vo tp tin */
Chng 4: Vo ra trn tp

67
do{
cin >> input; // c k t t bn phm
fileOut << input << ; // Ghi k t vo tp tin
}while((input != e)&&(fileOut));
fileOut << endl; // Xung dng cui tp tin

/* ng tp tin */
fileOut.close(); // ng tp tin
return;
}
c d liu t tp vn bn bng >>
Cc bc thc hin c d liu t mt tp tin nh sau:
1. M tp tin theo ch c bng i tng ifstream (m tp tin ch c):
ifstream <Tn bin tp>(<Tn tp tin>, ios::in);
2. c d liu t tp bng thao tc >>:
<Tn bin tp> >> <Bin d liu>;
3. ng tp tin bng lnh close():
<Tn bin tp>.close();
Chng trnh 4.2 minh ho vic c d liu t tp tin va s dng trong chng trnh 4.1 ra mn
hnh:
Tn tp tin c ngi dng t nhp vo t bn phm.
Chng trnh s c cc k t trong tp v hin th ra mn hnh, mi k t c phn cch
nhau bi du trng (space bar).
Chng trnh dng li khi kt thc tp tin.

Chng trnh 4.2
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>

const int length = 25; // di ti a tn tp tin

void main(){
clrscr();
char fileName[length], output;
cout << Ten tep tin: ;
cin >> setw(length) >> fileName; // Nhp tn tp tin

/* M tp tin */
Chng 4: Vo ra trn tp

68
ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin
if(!fileIn){ // Khng m c tp
cout << Khong the mo duoc tep tin << fileName << endl;
exit(1);
}

/* c d liu t tp tin ra mn hnh */
while(fileIn){
fileIn >> output; // c k t t tp tin
cout << output; // Ghi k t ra mn hnh
}
cout << endl; // Xung dng trn mn hnh

/* ng tp tin */
fileIn.close(); // ng tp tin
return;
}

Chng trnh 4.3 minh ho vic copy ton b ni dung ca mt tp tin sang mt tp tin mi:
Tn tp tin ngun v tp tin ch c nhp t bn phm bi ngi dng.
Tp tin ngun c m ch c.
Tp tin ch c m ch ghi.
c tng k t t tp tin ngun v ghi ngay vo tp tin ch.
ng cc tp tin khi kt thc.

Chng trnh 4.3
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>

const int length = 25; // di ti a tn tp tin

void main(){
clrscr();
char sourceFile[length], targetFile[length], data;
cout << Ten tep tin nguon: ;
cin >> setw(length) >> sourceFile; // Nhp tn tp tin ngun

cout << Ten tep tin dich: ;
cin >> setw(length) >> targetFile; // Nhp tn tp tin ch
Chng 4: Vo ra trn tp

69

/* M tp tin ngun */
ifstream fileIn(sourceFile, ios::in);// Khai bo v m tp ngun
if(!fileIn){ // Khng m c tp ngun
cout << Khong the mo duoc tep tin nguon
<< sourceFile << endl;
exit(1);
}

/* M tp tin ch */
ofstream fileOut(targetFile, ios::out);// Khai bo v m tp ch
if(!fileOut){ // Khng m c tp ch
cout << Khong the tao duoc tep tin dich
<< targetFile << endl;
exit(1);
}

/* c d liu t tp tin ra tp ch */
while(fileIn){
fileIn >> data; // c k t t tp ngun
fileOut << data; // Ghi k t ra tp ch
}

/* ng cc tp tin */
fileIn.close(); // ng tp tin ngun
fileOut.close(); // ng tp tin ch
return;
}

Lu :
Tn bin tp, sau khi dng xong vi mt tp xc nh, c th s dng m mt tp khc,
vi mt ch m tp khc bng php ton open() ca bin tp.
<Tn bin tp>.open(<Tn tp mi>, <ch m mi>);
V d, on chng trnh:
ofstream myFile(abc.txt, ios::out);
// ghi vao file abc.txt
myFile.close();
myFile.open(xyz.txt, ios::out|ios::app);
// Them vao cuoi file xyz.txt
myFile.close();
s dng bin tp myFile (c kiu ofstream) hai ln: mt ln l dng vi tp tin abc.txt ch m
ghi t u. Mt ln khc l vi tp tin xyz.txt ch m ghi thm vo cui.
Chng 4: Vo ra trn tp

70
4.2.2 Vo ra tp nh phn bng read v write
Ghi vo tp nh phn bng write
Cc bc thc hin ghi d liu vo mt tp nh phn nh sau:
1. M tp tin theo ch ghi nh phn bng i tng fstream:
fstream <Tn bin tp>(<Tn tp tin>, ios::out|ios::binary);
2. Ghi d liu vo tp bng thao tc write():
<Tn bin tp>.write(char* <D liu>,
int <Kch thc d liu>);
3. ng tp tin bng lnh close():
<Tn bin tp>.close();
Trong , thao tc write nhn hai tham s u vo nh sau:
Tham s th nht l con tr kiu char tr n vng d liu cn ghi vo tp. V con tr bt
buc c kiu char nn khi mun ghi d liu c kiu khc vo tp, ta dng hm chuyn
kiu:
reinterpret_cast<char *>(<D liu>);
Tham s th hai l kch c d liu c ghi vo tp. Kch c ny c tnh theo byte, nn
thng thng ta dng ton t:
sizeof(<Kiu d liu>);
Lu :
Khi mun c, ghi cc d liu c cu trc (struct) vo tp th ta phi dng ch
c/ghi tp nh phn m khng th dng ch c/ghi ch vn bn.
Khi c/ghi d liu c kiu cu trc, ton t sizeof() thc hin chnh xc th cc thnh
vin ca cu trc khng c l kiu con tr. V ton t sizeof() i vi con tr ch cho
kch c ca con tr m khng cho kch c tht ca vng d liu m con tr tr ti.
Chng trnh 4.4 minh ho vic ghi d liu vo tp tin nh phn, d liu l kiu cu trc:
Tn tp tin v s lng bn ghi c ngi dng t nhp vo t bn phm.
Chng trnh s ghi vo tp cc bn ghi c cu trc do ngi dng g vo t bn phm.

Chng trnh 4.4
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<type.h>

const int length = 25; // di ti a tn tp tin

typedef struct {
int day; // Ngy
int month; // Thng
Chng 4: Vo ra trn tp

71
int year; // Nm
} Date;

typedef struct {
char name[20]; // Tn nhn vin
Date birthDay; // Ngy sinh ca nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;

void main(){
clrscr();
char fileName[length]; // Tn tp tin
cout << Ten tep tin: ;
cin >> setw(length) >> fileName; // Nhp tn tp tin

int recordNumber; // S lng bn ghi
cout << So luong ban ghi: ;
cin >> recordNumber; // Nhp s lng bn ghi

/* M tp tin */
// Khai bo v m tp tin
fstream fileOut(fileName, ios::out|ios::binary);
if(!fileOut){ // Khng m c tp
cout << Khong the tao duoc tep tin << fileName << endl;
exit(1);
}

/* Ghi d liu vo tp tin */
Employee myEmployee;
for(int i=0; i<recordNumber; i++){
cout << Ban ghi thu << i+1 << endl;
cout << Name: ;
cin >> myEmployee.name; // Nhp tn nhn vin
cout << Day of birth: ;
cin >> myEmployee.birthDay.day;// Nhp ngy sinh
cout << Month of birth: ;
cin >> myEmployee.birthDay.month;// Nhp thng sinh
cout << Year of birth: ;
cin >> myEmployee.birthDay.year;// Nhp nm sinh
cout << Role: ;
cin >> myEmployee.role; // Nhp chc v
cout << Salary: ;
Chng 4: Vo ra trn tp

72
cin >> myEmployee.salary; // Nhp tin lng

// Ghi d liu vo tp
fileOut.write(reinterpret_cast<char *>(&myEmployee),
sizeof(Employee));
}

/* ng tp tin */
fileOut.close(); // ng tp tin
return;
}

c d liu t tp nh phn bng read
Cc bc thc hin c d liu t mt tp tin nh phn nh sau:
1. M tp tin theo ch c nh phn bng i tng fstream (m tp tin ch ghi):
fstream <Tn bin tp>(<Tn tp tin>, ios::in|ios::binary);
2. c d liu t tp bng thao tc read():
<Tn bin tp>.read(char* <D liu ra>,
int <Kch thc d liu>);
3. ng tp tin bng lnh close():
<Tn bin tp>.close();
Chng trnh 4.5 minh ho vic c d liu t tp tin vo bin c cu trc:
Tn tp tin c ngi dng t nhp vo t bn phm.
Chng trnh s c cc cu trc nhn vin trong tp v hin th ra mn hnh.
Chng trnh dng li khi kt thc tp tin.

Chng trnh 4.5
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<type.h>

const int length = 25; // di ti a tn tp tin

typedef struct {
int day; // Ngy
int month; // Thng
int year; // Nm
} Date;
Chng 4: Vo ra trn tp

73

typedef struct {
char name[20]; // Tn nhn vin
Date birthDay; // Ngy sinh ca nhn vin
char role[20]; // Chc v ca nhn vin
float salary; // Lng ca nhn vin
} Employee;

void main(){
clrscr();
char fileName[length]; // Tn tp tin
cout << Ten tep tin: ;
cin >> setw(length) >> fileName; // Nhp tn tp tin

/* M tp tin */
// Khai bo v m tp tin
fstream fileIn(fileName, ios::in|ios::binary);
if(!fileIn){ // Khng m c tp
cout << Khong the mo duoc tep tin << fileName << endl;
exit(1);
}

/* c d liu t tp tin ra mn hnh */
Employee myEmployee;
while(fileIn){
fileIn.read(reinterpret_cast<char *>(&myEmployee),
sizeof(Employee)); // c k t t tp tin
cout << myEmployee.name <<
<< myEmployee.birthDay.day << /
<< myEmployee.birthDay.month << /
<< myEmployee.birthDay.year <<
<< myEmployee.role <<
<< myEmployee.salary << endl; // Ghi k t ra mn hnh
}

/* ng tp tin */
fileIn.close(); // ng tp tin
return;
}

Chng 4: Vo ra trn tp

74
4.3 TRUY NHP TP TRC TIP
4.3.1 Con tr tp tin
Con tr tp tin c vai tr nh mt u c tr vo mt v tr xc nh ca tp v thao tc truy nhp
tp din ra tun t:
Ti mi thi im, con tr tp tin xc nh mt v tr trn tp m ti , thao tc truy nhp
tp (c/ghi) c thc hin.
Sau thao tc truy nhp, con tr tp t ng chuyn n v tr tip theo da vo kch thc
n v d liu c truy nhp.
Cch truy nhp tp tun t c nhc im l bao gi cng phi bt u t u tp tin, i tun t
cho n v tr cn truy nhp. Khi tp tin c kch thc ln th cch truy nhp ny rt tn thi gian.
trnh nhc im ny, C++ cho php truy nhp trc tip n mt v tr xc nh trn tp tin
bng cc php ton:
Truy nhp v tr hin ti ca con tr tp tin
Dch chuyn con tr tp tin n mt v tr xc nh
4.3.2 Truy nhp v tr hin ti ca con tr tp
C php truy nhp n v tr hin thi ca con tr tp ph thuc vo kiu bin tp ang dng l
c hay ghi.
Nu bin tp l kiu m tp c ifstream th c php l:
<Tn bin tp>.tellg();
Nu bin tp l kiu m tp ghi ofstream th c php l:
<Tn bin tp>.tellp();
Chng trnh 4.6a minh ho vic xc nh v tr hin thi ca con tr tp sau mt s thao tc c
tp trc .

Chng trnh 4.6a
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>

const int length = 25; // di ti a tn tp tin

void main(){
clrscr();
char fileName[length], output;
cout << Ten tep tin: ;
cin >> setw(length) >> fileName; // Nhp tn tp tin

Chng 4: Vo ra trn tp

75
/* M tp tin */
ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin
if(!fileIn){ // Khng m c tp
cout << Khong the mo duoc tep tin << fileName << endl;
exit(1);
}

/* c d liu t tp tin ra mn hnh
* Ghi vi tr con tr tp ra mn hnh c sau 5 ln c k t */
int index = 0;
while(fileIn){
fileIn >> output; // c k t t tp tin
cout << output; // Ghi k t ra mn hnh
if(index % 5 == 0) // Ghi ra v tr con tr tp
cout<< endl << Vi tri con tro tep:
<< fileIn.tellg() << endl;
index ++;
}
cout << endl; // Xung dng trn mn hnh

/* ng tp tin */
fileIn.close(); // ng tp tin
return;
}

Chng trnh 4.6b minh ho vic xc nh v tr hin thi ca con tr tp sau mt s thao tc ghi
vo tp trc .

Chng trnh 4.6b
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>

const int length = 25; // di ti a tn tp tin

void main(){
clrscr();
char fileName[length], input;
cout << Ten tep tin: ;
cin >> setw(length) >> fileName; // Nhp tn tp tin

Chng 4: Vo ra trn tp

76
/* M tp tin */
ofstream fileOut(fileName, ios::out);// Khai bo v m tp tin
if(!fileOut){ // Khng m c tp
cout << Khong the tao duoc tep tin << fileName << endl;
exit(1);
}

/* Ghi d liu vo tp tin
* Hin ra mn hnh v tr con tr tp sau khi ghi uc 5 k t*/
int index = 0;
do{
cin >> input; // c k t t bn phm
fileOut << input << ; // Ghi k t vo tp tin
if(index%5 == 0) // Hin th v tr con tr tp
cout << Vi tri con tro tep:
<< fileOut.tellp() << endl;
index++;
}while((input != e)&&(fileOut));
fileOut << endl; // Xung dng cui tp tin

/* ng tp tin */
fileOut.close(); // ng tp tin
return;
}

4.3.3 Dch chuyn con tr tp
Ngoi vic xc nh v tr hin thi ca con tr tp, C++ cn cho php dch chuyn con tr tp n
mt v tr bt k trn tp. C php dch chuyn ph thuc vo kiu bin tp l c hay ghi.
Nu bin tp c kiu l m tp tin c ifstream, c php s l:
<Tn bin tp>.seekg(<Kch thc>, <Mc dch chuyn>);
Nu bin tp c kiu l m tp ghi ofstream, c php s l:
<Tn bin tp>.seekp(<Kch thc>, <Mc dch chuyn>);
Trong :
Kch thc: l tham s m t khong cch dch chuyn so vi v tr mc dch chuyn.
n v tnh ca kch thc l byte, c kiu l s nguyn.
Mc dch chuyn: l v tr gc xc nh khong cch dch chuyn ca con tr tp. C
ba tham s hng v kiu mc dch chuyn:
- ios::beg: Mc dch chuyn l u tp tin.
- ios::cur: Mc dch chuyn l v tr hin thi ca con tr tp.
- ios::end: Mc dch chuyn l v tr cui cng ca tp tin.
Chng 4: Vo ra trn tp

77
V d:
ifstream fileIn(abc.txt, ios::in);
fileIn.seekg(sizeof(char)*7, ios::beg);
s dch chuyn con tr tp tin n k t (kiu char) th 7+1 = 8 trong tp tin abc.txt c (gi s
tp tin abc.txt lu cc k t kiu char).
Lu :
V khong cch cch dch chuyn c kiu s nguyn (int) cho nn c th nhn gi tr m
hoc dng. Nu gi tr dng, dch chuyn v pha sau v tr lm mc, nu gi tr m,
dch chuyn v pha trc v tr lm mc.
Nu v tr dch chuyn n nm ngoi phm vi tp tin (pha sau v tr cui cng ca tp
hoc pha trc v tr u tin ca tp) s ny sinh li, khi <Tn bin tp> = false.
Chng trnh 4.7 ci t chng trnh truy nhp tp tin trc tip c gi tr k t (kiu char)
trong tp:
Tn tp tin (cha d liu kiu char) do ngi dng nhp vo t bn phm.
Sau , mi khi ngi dng nhp vo mt s nguyn, chng trnh s dch chuyn n v
tr mi, cch v tr c ng bng tng y k t, tnh t v tr hin thi ca con tr tp.
Chng trnh s kt thc khi ngi dng nhp vo s 0.

Chng trnh 4.7
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
#include<conio.h>

const int length = 25; // di ti a tn tp tin

void main(){
clrscr();
char fileName[length], output;
cout << Ten tep tin: ;
cin >> setw(length) >> fileName; // Nhp tn tp tin

/* M tp tin */
ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin
if(!fileIn){ // Khng m c tp
cout << Khong the mo duoc tep tin << fileName << endl;
exit(1);
}

/* c d liu t tp tin ra mn hnh
* Ghi vi tr con tr tp ra mn hnh c sau 5 ln c k t */
Chng 4: Vo ra trn tp

78
int index = 1;
do{
cout << So ki tu dich chuyen: ;
cin >> index;

// Dch chuyn con tr tp t v tr hin thi
fileIn.seekg(sizeof(char)*index, ios::cur);
if(fileIn){ // ng
fileIn >> output; // c k t t tp tin

// Ghi k t ra mn hnh
cout << Vi tri: << fileIn.tellg() << output;
}else{ // Ra khi phm vi tp
fileIn.clear(); // V v tr u tp
}
}while(index);

/* ng tp tin */
fileIn.close(); // ng tp tin
return;
}

TNG KT CHNG 4
Ni dung chng 4 tp trung trnh by cc vn lin quan n cc thao tc trn tp tin trong
ngn ng C++. Bao gm:
Cc bc tun t khi thao tc vi mt tp tin:
- M tp tin
- c/ghi d liu trn tp tin
- ng tp tin
Thao tc m tp tin vi nhiu ch bng kiu fstream.
Thao tc m tp tin ch c vi kiu ifstream
Thao tc m tp tin ch ghi vi thao tc ofstream.
c d liu t tp tin vn bn vi thao tc >>.
Ghi d liu vo tp tin vn bn bng thao tc <<.
c tp tin nh phn bng thao tc read().
Ghi vo tp tin nh phn bng thao tc write().
Xc nh v tr hin thi ca con tr tp tin vi cc thao tc tellg() v tellp().
Dch chuyn v tr ca con tr tp vi cc thao tc seekg() v seekp().
Thit lp li trng thi cho con tr tp tin bng thao tc clear().
Chng 4: Vo ra trn tp

79
ng tp tin s dng bng thao tc close().

CU HI V BI TP CHNG 4
1. Mun m mt tp tin tn l abc.txt c d liu, lnh m tp no sau y l ng:
a. fstream myFile(abc.txt, ios::in);
b. fstream myFile(abc.txt, ios::out);
c. fstream myFile(abc.txt, ios::app);
d. fstream myFile(abc.txt, ios::ate);
2. Mun m mt tp tin abc.txt nm trong th mc xyz ghi d liu vo. Lnh m no sau
y l ng:
a. fstream myFile(xyz\abc.txt, ios::out);
b. fstream myFile(xyz\\abc.txt, ios::out);
c. fstream myFile(xyz/abc.txt, ios::out);
d. fstream myFile(xyz//abc.txt, ios::out);
3. Mun m mt tp tin abc.txt ghi thm d liu vo cui tp, lnh no sau y l ng:
a. fstream myFile(abc.txt, ios::out);
b. fstream myFile(abc.txt, ios::app);
c. fstream myFile(abc.txt, ios::out|ios::app);
d. fstream myFile(abc.txt, ios::out||ios::app);
4. Xt hai lnh khai bo sau:
fstream myFile1(abc.txt, ios::out);
ofstream myFile2(abc.txt, ios::out);
Nhn nh no sau y l ng:
a. myFile1 v myFile2 c chc nng ging nhau.
b. myFile1 v myFile2 c chc nng khc nhau
5. Xt hai lnh khai bo sau:
fstream myFile1(abc.txt, ios::in);
ifstream myFile2(abc.txt, ios::in);
Nhn nh no sau y l ng:
a. myFile1 v myFile2 c chc nng ging nhau.
b. myFile1 v myFile2 c chc nng khc nhau
6. Xt on chng trnh sau:
ofstream myFile(abc.txt, ios::out);
if(myFile) myFile << abc.txt;
Chng trnh s lm g?
a. Ghi ra mn hnh dng ch abc.txt
b. Ghi vo tp tin abc.txt dng ch abc.txt
c. c t tp tin abc.txt dng ch abc.txt
Chng 4: Vo ra trn tp

80
d. Chng trnh s bo li.
7. Xt on chng trnh sau:
ifstream myFile(abc.txt, ios::in);
char text[20];
if(myFile) myFile >> text;
Chng trnh s lm g, nu tp tin abc.txt c ni dung l dng ch abc.txt?
a. Ghi ra mn hnh dng ch abc.txt
b. Ghi vo tp tin abc.txt dng ch abc.txt
c. c t tp tin abc.txt dng ch abc.txt
d. Chng trnh s bo li.
8. Xt on chng trnh sau:
fstream myFile(abc.txt, ios::out);
if(myFile) myFile << abc.txt;
myFile.close();
myFile.open(abc.txt, ios::in);
char text[20];
if(myFile) myFile >> text;
cout << text;
Chng trnh s lm g, nu tp tin abc.txt c ni dung l dng ch abc.txt?
a. Ghi vo tp tin abc.txt dng ch abc.txt
b. c t tp tin abc.txt dng ch abc.txt
c. Ghi ra mn hnh dng ch abc.txt
d. C ba p n trn.
e. Chng trnh s bo li.
9. Xt on chng trnh sau:
ifstream myFile(abc.txt, ios::in);
if(myFile) cout << myFile.tellg();
Chng trnh s in ra mn hnh kt qu g?
a. 0
b. 1
c. 8
d. 16
10. Xt on chng trnh sau, nu tp abc.txt cha mt s lng k t ln:
ifstream myFile(abc.txt, ios::in);
if(myFile){
char c;
myFile >> c;
cout << myFile.tellg();
}
Chng trnh s in ra mn hnh kt qu g?
a. 0
Chng 4: Vo ra trn tp

81
b. 1
c. 8
d. 16
11. Xt on chng trnh sau, nu tp abc.txt cha mt s lng k t ln:
ifstream myFile(abc.txt, ios::in);
if(myFile){
myFile.seekg(sizeof(char)*5, ios::beg);
myFile.seekg(sizeof(char)*5, ios::cur);
cout << myFile.tellg();
}
Chng trnh s in ra mn hnh kt qu g?
a. 0
b. 5
c. 10
d. 80
12. Vit mt chng trnh gp ni dung ca hai tp tin c sn vo mt tp tin th ba. Tn cc
tp tin c nhp vo t bn phm.
13. Vit mt chng trnh tm kim trn tp nh phn c cu trc c to bi chng trnh
4.4: Tm tt c cc nhn vin c tn l X, X c nhp t bn phm. Hin th kt qu l tt
c cc thng tin v cc nhn vin c tm thy.
14. Vit mt chng trnh tm kim trn tp nh phn c cu trc c to bi chng trnh
4.4: Tm tt c cc nhn vin c nm sinh l X, X c nhp t bn phm. Hin th kt qu
l tt c cc thng tin v cc nhn vin c tm thy.
15. Vit mt chng trnh tm kim trn tp nh phn c cu trc c to bi chng trnh
4.4: Tm tt c cc nhn vin c lng cao hn hoc bng mt gi tr X, X c nhp t
bn phm. Hin th kt qu l tt c cc thng tin v cc nhn vin c tm thy.
16. Vit mt chng trnh sao chp mt on u ni dung ca mt tp tin vo mt tp tin th
hai. Tn cc tp tin v di on ni dung cn sao chp c nhp t bn phm.
17. Vit mt chng trnh sao chp mt on cui ni dung ca mt tp tin vo mt tp tin
th hai. Tn cc tp tin v di on ni dung cn sao chp c nhp t bn phm.
Chng 5: Lp

82
CHNG 5
LP

Ni dung chng ny tp trung trnh by cc vn lin quan n lp i tng trong C++:
Khi nim, khai bo v s dng lp
Khai bo v s dng cc thnh phn ca lp: cc thuc tnh v cc phng thc ca lp
Phm vi truy nhp lp
Khai bo v s dng cc phng thc khi to v hu b ca lp
S dng lp thng qua con tr i tng, mng cc i tng.
5.1 KHI NIM LP I TNG
C++ coi lp l s tru tng ha cc i tng, l mt khun mu biu din cc i tng
thng qua cc thuc tnh v cc hnh ng c trng ca i tng.
5.1.1 nh ngha lp i tng
nh ngha mt lp trong C++, ta dng t kha class vi c php:
class <Tn lp>{
};
Trong :
class: l tn t kha bt buc nh ngha mt lp i tng trong C++.
Tn lp: do ngi dng t nh ngha. Tn lp c tnh cht nh tn kiu d liu s
dng sau ny. Cch t tn lp phi tun th theo quy tc t tn bin trong C++.
V d:
class Car{
};
l nh ngha mt lp xe t (Car). Lp ny cha c bt k mt thnh phn no, vic nh ngha
cc thnh phn cho lp s c trnh by trong mc 5.2.
Lu :
T kha class l bt buc nh ngha mt lp i tng trong C++. Hn na, C++ c
phn bit ch hoa ch thng trong khai bo cho nn ch class phi c vit bng ch
thng.
V d:
class Car{ // nh ngha ng
};
nhng:
Class Car{ // Li t kha
};
Chng 5: Lp

83
Bt buc phi c du chm phy ; cui nh ngha lp v C++ coi nh ngha mt lp
nh nh ngha mt kiu d liu, cho nn phi c du chm phy cui nh ngha (tng
t nh ngha kiu d liu kiu cu trc).
phn bit vi tn bin thng thng, ta nn (nhng khng bt buc) t tn lp bt u
bng mt ch in hoa v cc tn bin bt u bng mt ch in thng.
5.1.2 S dng lp i tng
Lp i tng c s dng khi ta khai bo cc th hin ca lp . Mt th hin ca mt lp
chnh l mt i tng c th ca lp . Vic khai bo mt th hin ca mt lp c thc hin
nh c php khai bo mt bin c kiu lp:
<Tn lp> <Tn bin lp>;
Trong :
Tn lp: l tn lp i tng c nh ngha trc khi khai bo bin.
Tn bin lp: l tn i tng c th. Tn bin lp s c s dng nh cc bin thng
thng trong C++, ngoi tr vic n c kiu lp i tng.
V d, mun khai bo mt th hin (bin) ca lp Car c nh ngha trong mc 5.1.1, ta khai
bo nh sau:
Car myCar;
Sau , ta c th s dng bin myCar trong chng trnh nh cc bin thng thng: truyn tham
s cho hm, gn cho bin khc
Lu :
Khi khai bo bin lp, ta khng dng li t kha class na. T kha class ch c s
dng khi nh ngha lp m khng dng khi khai bo bin lp.
V d, khai bo:
Car myCar; // ng
l ng, nhng khai bo:
class Car myCar; // Li c php
l sai c php.
5.2 CC THNH PHN CA LP
Vic khai bo cc thnh phn ca lp c dng nh sau:
class <Tn lp>{
private:
<Khai bo cc thnh phn ring>
protected:
<Khai bo cc thnh phn c bo v>
public:
<Khai bo cc thnh phn cng cng>
};
Trong :
Chng 5: Lp

84
private: l t kha ch tnh cht ca C++ ch ra rng cc thnh phn c khai bo
trong phm vi t kha ny l ring t i vi lp i tng. Cc i tng ca cc lp
khc khng truy nhp c cc thnh phn ny.
protected: cc thnh phn c khai bo trong phm vi t kha ny u c bo v. Qui
nh loi i tng no c truy nhp n cc thnh phn c bo v s c m t chi
tit trong mc 5.3.
public: cc thnh phn cng cng. Cc i tng ca cc lp khc u c th truy nhp
n cc thnh phn cng cng ca mt i tng bt k.
Cc thnh phn ca lp c chia lm hai loi:
Cc thnh phn ch d liu ca lp, c gi l thuc tnh ca lp
Cc thnh phn ch hnh ng ca lp, c gi l phng thc ca lp.
5.2.1 Thuc tnh ca lp
Khai bo thuc tnh
Thuc tnh ca lp l thnh phn cha d liu, c trng cho cc tnh cht ca lp. Thuc tnh ca
lp c khai bo theo c php sau:
<Kiu d liu> <Tn thuc tnh>;
Trong :
Kiu d liu: c th l cc kiu d liu c bn ca C++, cng c th l cc kiu d liu
phc tp do ngi dng t nh ngha nh struct, hoc kiu l mt lp c nh ngha
trc .
Tn thuc tnh: l tn thuc tnh ca lp, c tnh cht nh mt bin thng thng. Tn
thuc tnh phi tun theo quy tc t tn bin ca C++.
V d, khai bo:
class Car{
private:
int speed;
public:
char mark[20];
};
l khai bo mt lp xe t (Car), c hai thuc tnh: thuc tnh tc (speed) c tnh cht private,
thuc tnh nhn hiu xe (mark) c tnh cht public.
Lu :
Khng c khi to gi tr ban u cho cc thuc tnh ngay trong lp. V cc thuc tnh
ch c gi tr khi n gn vi mt i tng c th, l mt th hin (bin) ca lp.
V d:
class Car{
private:
int speed; // ng
int weight = 500; // li
Chng 5: Lp

85
};
Kh nng truy nhp thuc tnh ca lp l ph thuc vo thuc tnh y c khai bo trong
phm vi ca t kha no: private, protected hay public.
Thng thng, do yu cu ng gi d liu ca hng i tng, ta nn khai bo cc
thuc tnh c tnh cht ring t (ptivate). Nu mun cc i tng khc truy nhp c
vo cc thuc tnh ny, ta xy dng cc hm public truy nhp (get / set) n thuc tnh .
S dng thuc tnh
Thuc tnh c th c s dng cho cc chng trnh nm ngoi lp thng qua tn bin lp hoc
s dng ngay trong lp bi cc phng thc ca lp.
Nu thuc tnh c dng bn ngoi phm vi lp, c php phi thng qua tn bin lp
(cch ny ch s dng c vi cc bin c tnh cht public):
<Tn bin lp>.<tn thuc tnh>;
Nu thuc tnh c dng bn trong lp, c php n gin hn:
<Tn thuc tnh>;
V d, vi nh ngha lp:
class Car{
private:
int speed;
public:
char mark[20];
};
ta khai bo mt bin lp:
Car myCar;
Th c th s dng thuc tnh nhn hiu xe khi in ra mn hnh nh sau:
cout << myCar.mark;
Lu :
Khi dng thuc tnh bn trong cc phng thc ca lp, m tn thuc tnh li b trng vi
tn bin ton cc (t do) ca chng trnh, ta phi ch r vic dng tn thuc tnh ca lp
(m khng phi tn bin ton cc) bng cch dng ch th phm vi lp :: vi c php:
<Tn lp>::<Tn thuc tnh>;
5.2.2 Phng thc ca lp
Khai bo khun mu phng thc
Mt phng thc l mt thao tc thc hin mt s hnh ng c trng ca lp i tng.
Phng thc c khai bo tng t nh cc hm trong C++:
<Kiu tr v> <Tn phng thc>([<Cc tham s>]);
Trong :
Kiu tr v: l kiu d liu tr v ca phng thc. Kiu c th l cc kiu d liu c bn
ca C++, cng c th l kiu do ngi dng nh ngha, hoc kiu lp c nh ngha.
Chng 5: Lp

86
Tn phng thc: do ngi dng t t tn, tun theo quy tc t tn bin ca C++.
Cc tham s: Cc tham s u vo ca phng thc, c biu din bng kiu d liu
tng ng. Cc tham s c phn cch bi du phy ,. Cc tham s l ty chn (Phn
trong du ngoc vung [] l ty chn).
V d, khai bo:
class Car{
private:
int speed;
char mark[20];
public:
void show();
};
l nh ngha mt lp Car c hai thuc tnh cc b l speed v mark, v khai bo mt phng thc
show() m t i tng xe tng ng. Show() l mt phng thc khng cn tham s v kiu
tr v l void.
Lu :
Kh nng truy nhp phng thc t bn ngoi l ph thuc vo phng thc c khai
bo trong phm vi ca t kha no: private, protected hay public.
nh ngha phng thc
Trong C++, vic ci t chi tit ni dung ca phng thc c th tin hnh ngay trong phm vi
lp hoc bn ngoi phm vi nh ngha lp. C php ch khc nhau dng khai bo tn phng
thc.
Nu ci t phng thc ngay trong phm vi nh ngha lp, c php l:
<Kiu tr v> <Tn phng thc>([<Cc tham s>]){
// Ci t chi tit
}
Nu ci t phng thc bn ngoi phm vi nh ngha lp, ta phi dng ch th phm vi
:: ch ra rng y l mt phng thc ca lp m khng phi l mt hm t do trong
chng trnh:
<Kiu tr v> <Tn lp>::<Tn phng thc>([<Cc tham s>]){
// Ci t chi tit
}
V d, nu ci t phng thc show() ca lp Car ngay trong phm vi nh ngha lp, ta ci t
nh sau:
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
public:
void show(){ // Khai bo phng thc ngay trong lp
cout << This is a << mark << having a speed of
Chng 5: Lp

87
<< speed << km/h! << endl;
return;
}
};
Nu mun ci t bn ngoi lp, ta ci t nh sau:
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
public:
void show(); // Gii thiu xe
};
/* Khai bo phng thc bn ngoi lp */
void Car::show(){
cout << This is a << mark << having a speed of
<< speed << km/h! << endl;
return;
}
Lu :
Nu phng thc c ci t ngay trong lp th cc tham s phi tng minh, ngha l
mi tham s phi c biu din bng mt cp <Kiu d liu> <Tn tham s> nh khi ci
t chi tit mt hm t do trong chng trnh.
Thng thng, ch cc phng thc ngn (trn mt dng) l nn ci t ngay trong lp.
Cn li nn ci t cc phng thc bn ngoi lp chng trnh c sng sa, r rng
v d theo di.
S dng phng thc
Cng tng t nh cc thuc tnh ca lp, cc phng thc cng c th c s dng bn ngoi
lp thng qua tn bin lp, hoc c th c dng ngay trong lp bi cc phng thc khc ca
lp nh ngha n.
Nu phng thc c dng bn ngoi phm vi lp, c php phi thng qua tn bin lp
(cch ny ch s dng c vi cc phng thc c tnh cht public):
<Tn bin lp>.<Tn phng thc>([<Cc i s>]);
Nu thuc tnh c dng bn trong lp, c php n gin hn:
<Tn phng thc>([<Cc i s>]);
V d, vi nh ngha lp:
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
public:
void show(); // Gii thiu xe
Chng 5: Lp

88
};
/* Khai bo phng thc bn ngoi lp */
void Car::show(){
cout << This is a << mark << having a speed of
<< speed << km/h! << endl;
return;
}
ta khai bo mt bin lp:
Car myCar;
Th c th s dng phng thc gii thiu xe nh sau:
myCar.show();
Lu :
Khi dng phng thc bn trong cc phng thc khc ca lp, m phng thc li b
trng vi cc phng thc t do ca chng trnh, ta phi ch r vic dng phng thc
ca lp (m khng phi dng phng thc t do) bng cch dng ch th phm vi lp ::
vi c php:
<Tn lp>::<Tn phng thc>([<Cc i s>]);
Chng trnh 5.1 ci t y mt lp xe t (Car) vi cc thuc tnh c tnh cht cc b:
Tc xe (speed)
Nhn hiu xe (mark)
Gi xe (price)
V cc phng thc c tnh cht public:
Khi to cc tham s (init)
Gii thiu xe (show)
Cc phng thc truy nhp (get/set) cc thuc tnh
Sau , chng trnh main s s dng lp Car ny nh ngha cc i tng c th v s dng
cc phng thc ca lp ny.

Chng trnh 5.1
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
void setSpeed(int); // Gn tc cho xe
Chng 5: Lp

89
int getSpeed(); // c tc xe
void setMark(char); // Gn nhn cho xe
char[] getMark(); // c nhn xe
void setPrice(float); // Gn gi cho xe
float getPrice(); // c gi xe
void init(int, char[], float);// Khi to thng tin v xe
void show(); // Gii thiu xe
};

/* Khai bo phng thc bn ngoi lp */
void Car::setSpeed(int speedIn){ // Gn tc cho xe
speed = speedIn;
}
int Car::getSpeed(){ // c tc xe
return speed;
}
void Car::setMark(char markIn){ // Gn nhn cho xe
strcpy(mark, markIn);
}
char[] Car::getMark(){ // c nhn xe
return mark;
}
void Car::setPrice(float priceIn){ // Gn gi cho xe
price = priceIn;
}
float Car::getPrice(){ // c gi xe
return price;
}

void Car::init(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
return;
}

void Car::show(){ // Phng thc gii thiu xe
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}

// Hm main, chng trnh chnh
Chng 5: Lp

90
void main(){
clrscr();
Car myCar; // Khai bo bin lp

// Khi to ln th nht
cout << Xe thu nhat: << endl;
myCar.init(100, Ford, 3000);
cout << Toc do (km/h): << myCar.getSpeed() << endl;
cout << Nhan hieu : << myCar.getMark() << endl;
cout << Gia ($): << myCar.getPrice() << endl;

// Thay i thuc tnh xe
cout << Xe thu hai: << endl;
myCar.setSpeed(150);
myCar.setMark(Mercedes);
myCar.setPrice(5000);
myCar.show();
return;
}

Chng trnh 5.1 s in ra kt qu nh sau:
Xe thu nhat:
Toc do (km/h): 100
Nhan hieu: Ford
Gia ($): 3000
Xe thu hai:
This is a Mercedes having a speed of 150km/h and its price is $5000
5.3 PHM VI TRUY NHP LP
5.3.1 Phm vi truy nhp lp
Trong C++, c mt s khi nim v phm vi, xp t b n ln nh sau:
Phm vi khi lnh: Trong phm vi gia hai du gii hn {} ca mt khi lnh. V d
cc lnh trong khi lnh lp while(){} s c cng phm vi khi lnh.
Phm vi hm: Cc lnh trong cng mt hm c cng mc phm vi hm.
Phm vi lp: Cc thnh phn ca cng mt lp c cng phm vi lp vi nhau: cc thuc
tnh v cc phng thc ca cng mt lp.
Phm vi chng trnh (cn gi l phm vi tp): Cc lp, cc hm, cc bin c khai
bo v nh ngha trong cng mt tp chng trnh th c cng phm vi chng trnh.
Chng 5: Lp

91
Trong phm vi truy nhp lp, ta ch quan tm n hai phm vi ln nht, l phm vi lp v
phm vi chng trnh. Trong C++, phm vi truy nhp lp c quy nh bi cc t kha v thuc
tnh truy nhp:
private: Cc thnh phn ca lp c thuc tnh private th ch c th c truy nhp trong
phm vi lp.
protected: Trong cng mt lp, thuc tnh protected cng c nh hng tng t nh
thuc tnh private: cc thnh phn lp c thuc tnh protected ch c th c truy nhp
trong phm vi lp. Ngoi ra n cn c th c truy nhp trong cc lp con khi c k tha
(s c trnh by trong chng 6).
public: cc thnh phn lp c thuc tnh public th c th c truy nhp trong phm vi
chng trnh, c ngha l n c th c truy nhp trong cc hm t do, cc phng thc
bn trong cc lp khc
V d, thuc tnh price ca lp Car c tnh cht private nn ch c th truy nhp bi cc phng
thc ca lp Car. Khng th truy nhp t bn ngoi lp (phm vi chng trnh), chng hn trong
mt hm t do ngoi lp Car.
void Car::setPrice(float priceIn){
price = priceIn; // ng, v setPrice l mt phng thc
// ca lp Car
}
nhng:
void freeFunction(Car myCar){
myCar.price = 3000;// Li, v freeFunction l mt hm t do
// nm ngoi phm vi lp Car
}
Khi , hm freeFunction phi truy nhp gin tip n thuc tnh price thng qua phng thc
truy nhp c tnh cht public nh sau:
void freeFunction(Car myCar){
myCar.setPrice(3000);// ng, v setPrice l mt phng thc
ca
// lp Car c thuc tnh public
}
Tuy nhin, C++ cho php mt cch c bit truy nhp n cc thnh phn private v protected
ca mt lp bng khi nim hm bn v lp bn ca mt lp: trong cc hm bn v lp bn ca
mt lp, c th truy nhp n cc thnh phn private v protected nh bn trong phm vi lp .
5.3.2 Hm bn
C hai kiu hm bn c bn trong C++:
Mt hm t do l hm bn ca mt lp
Mt hm thnh phn (phng thc) ca mt lp l bn ca mt lp khc
Ngoi ra cn c mt s kiu hm bn m rng t hai kiu ny:
Mt hm l bn ca nhiu lp
Chng 5: Lp

92
Tt c cc hm ca mt lp l bn ca lp khc (lp bn)
Hm t do bn ca mt lp
Mt hm bn ca mt lp c khai bo bng t kha friend khi khai bo khun mu hm trong
lp tng ng.
class <Tn lp>{
// Khai bo cc thnh phn lp nh thng thng
// Khai bo hm bn
friend <Kiu tr v> <Tn hm bn>([<Cc tham s>]);
};
Khi , nh ngha chi tit hm bn c thc hin nh nh ngha mt hm t do thng thng:
<Kiu tr v> <Tn hm bn>([<Cc tham s>]){
// C th truy nhp trc tip cc thnh phn private
// ca lp khai bo
}
Lu :
Mc d hm bn c khai bo khun mu hm trong phm vi lp, nhng hm bn t do
li khng phi l mt phng thc ca lp. N l hm t do, vic nh ngha v s dng
hm ny hon ton tng t nh cc hm t do khc.
Vic khai bo khun mu hm bn trong phm vi lp v tr no cng c: hm bn
khng b nh hng bi cc t kha private, protected hay public trong lp.
Trong hm bn, c th truy nhp trc tip n cc thnh phn private v protected ca i
tng c kiu lp m n lm bn (truy nhp thng qua i tng c th).
Chng trnh 5.2 minh ha vic nh ngha mt hm bn ca lp Car, hm ny so snh xem hai
chic xe, chic no t hn.

Chng trnh 5.2
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
void init(int, char[], float);// Khi to thng tin v xe
// Khai bo hm bn ca lp
friend void moreExpensive(Car, Car);
};
Chng 5: Lp

93

/* Khai bo phng thc bn ngoi lp */
void Car::init(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
return;
}
/* nh ngha hm bn t do */
void moreExpensive(Car car1, Car car2){
if(car1.price > car2.price)//Truy nhp n cc thuc tnh private
cout << xe thu nhat dat hon << endl;
else if(car1.price < car2.price)
cout << xe thu nhat dat hon << endl;
else
cout << hai xe dat nhu nhau << endl;
return;
}

// Hm main, chng trnh chnh
void main(){
clrscr();
Car car1, car2; // Khai bo bin lp

// Khi to xe th nht, th hai
car1.init(100, Ford, 3000);
car2.init(150, Mercedes, 3500);

// So snh gi hai xe
moreExpensive(car1, car2); // S dng hm bn t do
return;
}

Chng trnh 5.2 s in ra thng bo:
xe thu hai dat hon
v xe th hai c gi $3500, trong khi xe th nht c khi to gi l $3000.
Phng thc lp l bn ca mt lp khc
Trong C++, mt phng thc ca lp ny cng c th lm bn ca mt lp kia. khai bo mt
phng thc f ca lp B l bn ca lp A v f nhn mt tham s c kiu lp A, ta phi khai bo
tun t nh sau (trong cng mt chng trnh):
Khai bo khun mu lp A, lm tham s cho hm f ca lp B:
Chng 5: Lp

94
class A;
Khai bo lp B vi hm f nh khai bo cc lp thng thng:
class B{
// Khai bo cc thnh phn khc ca lp B
void f(A);
};
Khai bo chi tit lp A vi hm f ca lp B l bn
class A{
// Khai bo cc thnh phn khc ca lp A
friend void B::f(A);
};
nh ngha chi tit hm f ca lp B:
void B::f(A){
// nh ngha chi tit hm f
}
Lu :
Trong trng hp ny, hm f ch c nh ngha chi tit mt khi lp A c nh
ngha chi tit. Do vy, ch c th nh ngha chi tit hm f ngay trong lp A ( bc 3)
hoc sau khi nh ngha lp A ( bc 4), m khng th nh ngha chi tit hm f ngay
trong lp B ( bc 2).
Hm f c th truy nhp n cc thnh phn private v protected ca c hai lp A v B.
Tuy nhin, mun f truy nhp n cc thnh phn ca lp A th phi thng qua mt i
tng c th c kiu lp A.
Chng trnh 5.3 minh ha vic ci t v s dng mt hm permission() ca lp Person, l hm
bn ca lp Car. Hm ny thc hin vic kim tra xem mt ngi c quyn iu khin xe hay
khng, theo lut sau:
Vi cc loi xe thng thng, ngi iu khin phi 18 tui.
Vi cc loi xe c tc cao hn 150km/h, ngi iu khin phi 21 tui.

Chng trnh 5.3
#include<stdio.h>
#include<conio.h>
#include<string.h>

class Car; // Khai bo nguyn mu lp

/* nh ngha lp Person */
class Person{
private:
char name[25]; // Tn
int age; // Tui
Chng 5: Lp

95
public:
void init(char[], int); // Khi to thng tin v ngi
int permission(Car); // Xc nh quyn iu khin xe
};

/* nh ngha lp Car */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
void init(int, char[], float);// Khi to thng tin v xe
// Khai bo hm bn ca lp
friend int Person::permission(Car);
};

/* Khai bo phng thc bn ngoi lp */
void Person::init(char nameIn[], int ageIn){
strcpy(name, nameIn);
age = ageIn;
return;
}

void Car::init(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
return;
}

/* nh ngha hm bn */
int Person::permission(Car car){
if(age < 18)
return 0;
//Truy nhp thuc tnh private thng qua i tng car
if((age < 21)&&(car.speed > 150))
return 0;
return 1;
}

// Hm main, chng trnh chnh
void main(){
Chng 5: Lp

96
clrscr();
// Khai bo cc bin lp
Car car;
Person person;

// Khi to cc i tng
car.init(100, Ford, 3000);
person.init(Vinh, 20);

// Xc nh quyn iu khin xe
if(person.permission(car)) // S dng hm bn
cout << Co quyen dieu khien << endl;
else
cout << Khong co quyen dieu khien << endl;
return;
}

Chng trnh 5.3 s hin th thng bo:
Co quyen dieu khien
V ngi ch xe 20 tui v xe ch c tc 100km/h.
5.3.3 Lp bn
Khi tt cc cc phng thc ca mt lp l bn ca mt lp khc, th lp ca cc phng thc
cng tr thnh lp bn ca lp kia. Mun khai bo mt lp B l lp bn ca lp A, ta khai bo
theo tun t sau:
Khai bo khun mu lp B:
class B;
nh ngha lp A, vi khai bo B l lp bn:
class A{
// Khai bo cc thnh phn ca lp A
// Khai bo lp bn B
friend class B;
};
nh ngha chi tit lp B:
class B{
// Khai bo cc thnh phn ca lp B
};
Lu :
Trong trng hp ny, lp B l lp bn ca lp A nhng khng c ngha l lp A cng l
bn ca lp B: tt c cc phng thc ca lp B c th truy nhp cc thnh phn private
ca lp A (thng qua cc i tng c kiu lp A) nhng cc phng thc ca lp A li
khng th truy nhp n cc thnh phn private ca lp B.
Chng 5: Lp

97
Mun cc phng thc ca lp A cng truy nhp c n cc thnh phn private ca lp
B, th phi khai bo thm l lp A cng l lp bn ca lp B.
5.4 HM KHI TO V HU B
5.4.1 Hm khi to
Hm khi to c gi mi khi khai bo mt i tng ca lp. Ngay c khi khng c khai bo
tng minh, C++ cng gi hm khi to ngm nh khi i tng c khai bo.
Khai bo hm khi to
Hm khi to ca mt lp c khai bo tng minh theo c php sau:
class <Tn lp>{
public:
<Tn lp>([<Cc tham s>]); // Khai bo hm khi to
};
V d:
class Car{
int speed;
char mark[20];
float price;
public:
Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}
};
l khai bo mt hm khi to vi ba tham s ca lp Car.
Lu :
Hm khi to phi c tn trng vi tn ca lp
Hm khi to khng c gi tr tr v
Hm khi to c tnh cht public
C th c nhiu hm khi to ca cng mt lp
S dng hm khi to ca lp
Hm khi to c s dng khi khai bo bin lp. Khi , ta c th va khai bo, va khi to gi
tr cc thuc tnh ca i tng lp theo c php sau:
<Tn lp> <Tn i tng>([<Cc i s khi to>]);
Trong :
Tn lp: l tn kiu lp c nh ngha
Tn i tng: l tn bin c kiu lp, tun th theo quy tc t tn bin ca C++
Chng 5: Lp

98
Cc i s khi to: L cc i s tng ng vi hm khi to ca lp tng ng. Tng
t nh vic truyn i s khi dng cc li gi hm thng thng.
V d, nu lp Car c hm khi to Car(int, char[], float) th khi khai bo bin c kiu lp Car, ta
c th s dng hm khi to ny nh sau:
Car myCar(100, Ford, 3000);
Lu :
Khi s dng hm khi to, phi truyn ng s lng v ng kiu ca cc tham s ca
cc hm khi to c nh ngha ca lp.
Khi mt lp c t nht mt hm khi to tng minh, th khng c s dng hm khi
to ngm nh ca C++. Do , khi khai bo t nht mt hm khi to, nu mun khai
bo bin m khng cn tham s, lp tng ng phi c t nht mt hm khi to khng c
tham s.
V d, nu lp Car ch c duy nht mt hm khi to nh sau:
class Car{
public:
Car(int, char[], float);
};
th khng th khai bo mt bin nh sau:
Car myCar; // Khai bo li
Trong trng hp dng hm khi to khng c tham s, ta khng cn phi s dng cp
du ngoc n () sau tn bin i tng. Vic khai bo tr thnh cch khai bo thng
thng.
Chng trnh 5.4a minh ha vic nh ngha v s dng lp Car vi hai hm khi to khc nhau.

Chng trnh 5.4a
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
Car(); // Khi to khng tham s
Car(int, char[], float);// Khi to y tham s
void show(); // Gii thiu xe
};

Chng 5: Lp

99
/* Khai bo phng thc bn ngoi lp */
Car::Car(){ // Khi to khng tham s
speed = 0;
strcpy(mark, );
price = 0;
}

// Khi to c y tham s
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}

void Car::show(){ // Phng thc gii thiu xe
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}

// Hm main, chng trnh chnh
void main(){
clrscr();
Car myCar1; // S dng hm khi to khng tham s
Car myCar2(150, Mercedes, 5000);// Dng hm khi to tham s

// Gii thiu xe th nht
cout << Xe thu nhat: << endl;
myCar1.show();

// Gii thiu xe th hai
cout << Xe thu hai: << endl;
myCar2.show();
return;
}

Chng trnh 5.4a s hin th cc thng tin nh sau:
Xe thu nhat:
This is a having a speed of 0km/h and its price is $0
Xe thu hai:
This is a Mercedes having a speed of 150km/h and its price is $5000
Chng 5: Lp

100
L do l xe th nht s dng hm khi to khng c tham s nn xe khng c tn, tc v gi
u l mc nh (0). Trong khi , xe th hai c khi to y c ba tham s nn thng tin
gii thiu xe c y .
Tuy nhin, khi i tng c nhiu thuc tnh ring, trnh trng hp phi nh ngha nhiu
hm khi to cho cc trng hp thiu vng mt vi tham s khc nhau. Ta c th s dng hm
khi to vi cc gi tr khi u ngm nh. Chng trnh 5.4b cho kt qu hon ton ging
chng trnh 5.4a, nhng n gin hn v ch cn nh ngha mt hm khi to vi cc tham s c
gi tr ngm nh.

Chng trnh 5.4b
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
// Khi to vi cc gi tr ngm inh cho cc tham s
Car(int speedIn=0, char markIn[]=, float priceIn=0);
void show(); // Gii thiu xe
};

/* Khai bo phng thc bn ngoi lp */
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}

void Car::show(){ // Phng thc gii thiu xe
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}

// Hm main, chng trnh chnh
void main(){
clrscr();
Car myCar1; // Cc tham s nhn gi tr mc nh
Chng 5: Lp

101
Car myCar2(150, Mercedes, 5000);// Dng hm khi to tham s

// Gii thiu xe th nht
cout << Xe thu nhat: << endl;
myCar1.show();

// Gii thiu xe th hai
cout << Xe thu hai: << endl;
myCar2.show();
return;
}

5.4.2 Hm hy b
Hm hy b c t ng gi n khi m i tng c gii phng khi b nh. Nhim v ca
hm hy b l dn dp b nh trc khi i tng b gii phng. C php khai bo hm hy b
nh sau:
class <Tn lp>{
public:
~<Tn lp>([<Cc tham s>]); // Khai bo hm khi to
};
V d:
class Car{
int speed;
char *mark;
float price;
public:
~Car(){
delete [] mark;
};
};
l khai bo mt hm hy b ca lp Car vi thuc tnh mark c kiu con tr. Hm ny s gii
phng vng nh cp pht cho con tr kiu char ca thuc tnh nhn hiu xe.
Lu :
Hm hy b phi c tn bt u bng du ~, theo sau l tn ca lp tng ng.
Hm hy b khng c gi tr tr v.
Hm hy b phi c tnh cht public
Mi lp ch c nhiu nht mt hm hy b. Trong trng hp khng khai bo tng minh
hm hy b, C++ s s dng hm hy b ngm nh.
Chng 5: Lp

102
Ni chung, khi c t nht mt trong cc thuc tnh ca lp l con tr, th nn dng hm
hy b tng minh gii phng trit cc vng nh ca cc thuc tnh, trc khi i
tng b gii phng khi b nh.
Chng trnh 5.5 minh ha vic nh ngha lp Car vi mt hm khi to c cc tham s vi gi
tr mc nh v mt hm hy b tng minh.

Chng trnh 5.5
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp */
class Car{
private:
int speed; // Tc
char *mark; // Nhn hiu
float price; // Gi xe
public:
// Khi to vi cc gi tr ngm inh cho cc tham s
Car(int speedIn=0, char *markIn=NULL, float priceIn=0);
void show(); // Gii thiu xe
~Car(); // Hm hy b tng minh
};

/* Khai bo phng thc bn ngoi lp */
Car::Car(int speedIn, char *markIn, float priceIn){
speed = speedIn;
mark = markIn;
price = priceIn;
}

void Car::show(){ // Phng thc gii thiu xe
cout << This is a << *mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}

Car::~Car(){ // Hm hy b tng minh
delete [] mark;
cout << The object has been destroyed! << endl;
}

Chng 5: Lp

103
// Hm main, chng trnh chnh
void main(){
clrscr();
Car myCar(150, Mercedes, 5000);// Dng hm khi to tham s

// Gii thiu xe
cout << Gioi thieu xe: << endl;
myCar.show();
return;
}

Chng trnh 5.5 s in ra thng bo nh sau:
Gioi thieu xe:
This is a Mercedes having a speed of 150km/h and its price is $5000
The object has been destroyed!
Dng cui cng l ca hm hy b, mc d ta khng gi hm hy b trc tip, nhng khi thot
khi hm main() ca chng trnh chnh, i tng myCar b gii phng khi b nh v khi ,
C++ t ng gi n hm hy b m ta nh ngha tng minh. Do vy, m c dng thng bo
cui cng ny.
5.5 CON TR I TNG V MNG I TNG
5.5.1 Con tr i tng
Con tr i tng l con tr tr n a ch ca mt i tng c kiu lp. Cc thao tc lin quan
n con tr i tng bao gm:
Khai bo con tr i tng
Cp pht b nh cho con tr i tng
S dng con tr i tng
Gii phng b nh cho con tr i tng
Khai bo con tr i tng
Con tr i tng c khai bo tng t nh khai bo cc con tr c kiu thng thng:
<Tn lp> *<Tn con tr i tng>;
V d, mun khai bo mt con tr i tng c kiu ca lp Car, ta khai bo nh sau:
Car *myCar;
Khi , myCar l mt con tr i tng c kiu lp Car.
Cp pht b nh cho con tr i tng
Con tr i tng cng cn phi cp pht b nh hoc tr vo mt a ch ca mt i tng lp
xc nh trc khi c s dng. Cp pht b nh cho con tr i tng cng bng thao tc new:
<Tn con tr i tng> = new <Tn lp>([<Cc i s>]);
Chng 5: Lp

104
V d, nu lp Car c hai hm khi to nh sau:
class Car{
public:
Car();
Car(int, char[], float);
};
th ta c th cp pht b nh theo hai cch, tng ng vi hai hm khi to ca lp:
myCar = new Car(); // Khi to khng tham s
myCar = new Car(100, Ford, 3000); // Khi to tham s
Lu :
Cc i s truyn phi tng ng vi t nht mt trong cc hm khi to ca lp.
Khi s dng hm khi to khng c tham s, ta vn phi s dng cp ngoc n () trong
thao tc new.
Khi lp khng c mt hm khi to tng minh no, s dng hm khi to ngm nh ca
C++ v c php tng t nh s dng hm khi to tng minh khng c tham s.
C th va khai bo, va cp pht b nh cho con tr i tng.
V d:
Car myCar = new Car(); // Khi to khng tham s
S dng con tr i tng
Con tr i tng c s dng qua cc thao tc:
Tr n a ch ca mt i tng cng lp
Truy nhp n cc phng thc ca lp
Con tr i tng c th tr n a ch ca mt i tng c sn, cng lp theo c php sau:
<Tn con tr i tng> = &<Tn i tng c sn>;
V d, ta c mt con tr v mt i tng ca lp Car:
Car *ptrCar, myCar(100, Ford,3000);
Khi , c th cho con tr ptrCar tr vo a ch ca i tng myCar nh sau:
ptrCar = &myCar;
Khi mun truy nhp n cc thnh phn ca con tr i tng, ta dng c php sau:
<Tn con tr i tng> -> <Tn thnh phn lp>([<Cc i s>]);
V d, on chng trnh sau s thc hin phng thc gii thiu xe ca lp Car thng qua con
tr ptrCar:
Car *ptrCar = new Car(100, Ford,3000);
ptrCar->show();
Lu :
Danh sch cc i s phi tng thch vi tn phng thc tng ng.
Cc quy tc phm vi truy nhp vn p dng trong truy nhp cc thnh phn lp thng qua
con tr.
Chng 5: Lp

105
Gii phng b nh cho con tr i tng
Con tr i tng cng c gii phng thng qua thao tc delete:
delete <Tn con tr i tng>;
V d:
Car *ptrCar = new Car();// Khai bo v cp pht b nh
// S dng con tr ptrCar
delete ptrCar; // Gii phng b nh.
Lu :
Thao tc delete ch c dng khi trc , con tr c cp pht b nh qua thao tc
new:
Car *ptrCar = new Car();
delete ptrCar; // ng.
Nhng khng c dng delete khi trc , con tr ch tr vo mt a ch ca i tng
c sn (tnh):
Car *ptrCar, myCar(100, Ford, 3000);
ptrCar = &myCar;
delete ptrCar; // Khng c
Chng trnh 5.6 minh ha vic dng con tr i tng c kiu lp l Car.

Chng trnh 5.6
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
// Khi to vi cc gi tr ngm inh cho cc tham s
Car(int speedIn=0, char markIn[]=, float priceIn=0);
void show(); // Gii thiu xe
};

/* Khai bo phng thc bn ngoi lp */
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
Chng 5: Lp

106
}

void Car::show(){ // Phng thc gii thiu xe
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}

// Hm main, chng trnh chnh
void main(){
clrscr();
// Khai bo con tr, cp pht b nh dng hm khi to tham s
Car *myCar = new Car(150, Mercedes, 5000);

// Gii thiu xe
cout << Gioi thieu xe: << endl;
myCar->show();

// Gii phng con tr
delete myCar;
return;
}

Chng trnh 5.6 hin th ra thng bo l mt li gii thiu xe;
Gioi thieu xe:
This is a Mercedes having a speed of 150km/h and its price is $5000
5.5.2 Mng cc i tng
Mng cc i tng cng c th c khai bo v s dng nh mng ca cc bin c kiu thng
thng.
Khai bo mng tnh cc i tng
Mng cc i tng c khai bo theo c php:
<Tn lp> <Tn bin mng>[<S lng i tng>];
V d:
Car cars[10];
L khai bo mt mng c 10 i tng c cng kiu lp Car.
Lu :
C th khai bo mng tnh cc i tng m cha cn khai bo di mng, cch ny
thng dng khi cha bit chnh xc di mng:
Car cars[];
Chng 5: Lp

107
Mun khai bo c mng tnh cc i tng, lp tng ng phi c hm khi to khng
c tham s. V khi khai bo mng, tng ng vi khai bo mt dy cc i tng vi
hm khi to khng c tham s.
Khai bo mng ng vi con tr
Mt mng cc i tng cng c th c khai bo v cp pht ng thng qua con tr i tng
nh sau:
<Tn lp> *<Tn bin mng ng> = new <Tn lp>[< di mng>];
V d:
Car *cars = new Car[10];
Sau khi c s dng, mng ng cc i tng cng cn phi gii phng b nh:
delete [] <Tn bin mng ng>;
V d:
Car *cars = new Car[10];// Khai bo v cp pht ng
// S dng bin mng ng
delete [] cars; // Gii phng b nh ca mng ng
S dng mng i tng
Khi truy nhp vo cc thnh phn ca mt i tng c ch s xc nh trong mng khai bo,
ta c th s dng c php:
<Tn bin mng>[<Ch s i tng>].<Tn thnh phn>([<Cc i s>]);
V d:
Car cars[10];
cars[5].show();
s thc hin phng thc show() ca i tng c ch s th 5 (tnh t ch s 0) trong mng cars.
Chng trnh 5.7 s ci t mt chng trnh, trong nhp vo di mng, sau yu cu
ngi dng nhp thng tin v mng cc xe. Cui cng, chng trnh s tm kim v hin th thng
tin v chic xe c gi t nht trong mng.

Chng trnh 5.7
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp Car */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
void setSpeed(int); // Gn tc cho xe
Chng 5: Lp

108
int getSpeed(); // c tc xe
void setMark(char); // Gn nhn cho xe
char[] getMark(); // c nhn xe
void setPrice(float); // Gn gi cho xe
float getPrice(); // c gi xe
// Khi to thng tin v xe
Car(int speedIn=0, char markIn[]=, float priceIn=0);
void show(); // Gii thiu xe
};

/* Khai bo phng thc bn ngoi lp */
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}

void Car::setSpeed(int speedIn){ // Gn tc cho xe
speed = speedIn;
}
int Car::getSpeed(){ // c tc xe
return speed;
}
void Car::setMark(char markIn){ // Gn nhn cho xe
strcpy(mark, markIn);
}
char[] Car::getMark(){ // c nhn xe
return mark;
}
void Car::setPrice(float priceIn){ // Gn gi cho xe
price = priceIn;
}
float Car::getPrice(){ // c gi xe
return price;
}

void Car::show(){ // Phng thc gii thiu xe
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}

// Hm main, chng trnh chnh
Chng 5: Lp

109
void main(){
clrscr();
int length; // Chiu di mng
float maxPrice = 0; // Gi t nht
int index = 0; // Ch s ca xe t nht
Car *cars; // Khai bo mng i tng

// Nhp s lng xe, tc l chiu di mng
cout << So luong xe: ;
cin >> length;

// Cp pht b nh ng cho mng
cars = new Car[length];

// Khi to cc i tng trong mng
for(int i=0;i<length; i++){
int speed; // (Bin tm) tc
char mark[20]; // (Bin tm) nhn hiu
float price; // (Bin tm) gi xe
cout << Xe thu << i << : <<endl;
cout << Toc do (km/h): ;
cin >> speed; cars[i].setSpeed(speed); // Nhp tc
cout << Nhan hieu : ;
cin >> mark; cars[i].setMark(mark); // Nhp nhn xe
cout << Gia ($): ;
cin >> price; cars[i].setPrice(price); // Nhp gi xe

if(maxPrice < price){
maxPrice = price;
index = i;
}
}

// Tm xe t nht
for(int i=0; i<length; i++)
if(i == index){
cars[i].show(); // Gii thiu xe t nht
break;
}

// Gii phng b nh ca mng
delete [] cars;
return;
Chng 5: Lp

110
}

TNG KT CHNG 5
Ni dung chng 5 tp trung trnh by cc vn c bn v lp i tng trong ngn ng
C++:
Khai bo, nh ngha lp bng t kha class
S dng bin lp nh nhng i tng c th
Khai bo, nh ngha cc thuc tnh v cc phng thc ca lp: nh ngha cc phng
thc trong hoc ngoi phm vi khai bo lp
Khai bo phm vi truy nhp lp bng cc t kha ch phm vi: private, protected v
public. Gii thiu cc kiu hm c th truy nhp phm vi bt quy tc: hm bn v lp bn
vi t kha friend.
Khai bo, nh ngha tng minh hm khi to ca lp v s dng khi khai bo bin lp
Khai bo, nh ngha tng minh hm hy b ca lp, nhm dn dp, gii phng b nh
trc khi i tng b gii phng khi b nh.
Khai bo, cp pht b nh, s dng v gii phng b nh cho con tr i tng
Khai bo, cp pht b nh ng, s dng v gii phng vng nh ca mng cc i tng.
CU HI V BI TP CHNG 5
1. Trong cc khai bo lp sau, nhng khai bo no l ng:
a. class MyClass;
b. Class MyClass;
c. class MyClass{};
d. Class MyClass{};
2. Gi s ta nh ngha lp MyClass, by gi ta khai bo mt i tng thuc kiu lp
ny. Khai bo no l ng:
a. class MyClass me;
b. MyClass me;
c. MyClass me();
d. MyClass me{};
3. Trong cc khai bo thuc tnh ngay trong phm vi ca khai bo lp nh sau, nhng khai
bo no l ng:
a. int myAge;
b. private int myAge;
c. public int myAge;
d. private: int myAge;
Chng 5: Lp

111
4. Trong cc khai bo phng thc ngay trong phm vi ca khai bo lp MyClass nh sau,
nhng khai bo no l ng:
a. public: void show();
b. void show();
c. void show(){cout << hello!;};
d. void MyClass::show(){cout << hello!;}
5. Xt on chng trnh sau:
class MyClass{
int age;
public:
int getAge();
};
MyClass me;
Khi , trong cc lnh sau, lnh no c th thm vo cui on chng trnh trn:
a. cout << MyClass::age;
b. cout << me.age;
c. cout << me.getAge();
d. cin >> me.age;
6. Trong cc khai bo hm khi to cho lp MyClass nh sau, nhng khai bo no l ng:
a. myClass();
b. MyClass();
c. MyClass(MyClass);
d. void MyClas();
e. MyClass MyClass();
7. Trong cc khai bo hm hy b cho lp MyClass nh sau, nhng khai bo no l ng:
a. ~myClass();
b. ~MyClass();
c. ~MyClass(MyClass);
d. void ~MyClas();
e. MyClass ~MyClass();
8. Gi s ta khai bo lp MyClass c mt thuc tnh age v mt hm khi to:
class MyClass{
int age;
public:
MyClass(MyClass me){

};
int getAge(){return age};
};
Chng 5: Lp

112
Trong cc dng lnh sau, nhng dng no c th xut hin trong hm khi to trn:
a. age = MyClass.age;
b. age = me.age;
c. age = MyClass.getAge();
d. age = me.getAge();
e. age = 10;
9. Xt khai bo lp nh sau:
class MyClass{
public:
MyClass(MyClass);
MyClass(int);
};
Khi , trong s cc khai bo i tng sau, nhng khai bo no l ng:
a. MyClass me;
b. MyClass me();
c. MyClass me(10);
d. MyClass me1(10), me2(me1);
10. Xt khai bo lp nh sau:
class MyClass{
public:
MyClass();
};
Khi , trong s cc khai bo con tr i tng sau, nhng khai bo no l ng:
a. MyClass *me;
b. MyClass *me();
c. MyClass *me = new me();
d. MyClass *me = new MyClass();
11. Xt khai bo lp nh sau:
class MyClass{
public:
MyClass(int i=0, int j=0, float k=0);
};
Khi , trong s cc khai bo con tr i tng sau, nhng khai bo no l ng:
a. MyClass *me;
b. MyClass *me = new MyClass();
c. MyClass *me = new MyClass(1, 20);
d. MyClass *me = new MyClass(1, 20, 30);
12. Khai bo mt lp nhn vin, c tn l Employee, vi ba thuc tnh c tnh cht private:
- Tn nhn vin, c dng mt con tr kiu char
Chng 5: Lp

113
- Tui nhn vin, c kiu int
- Lung nhn vin, c kiu float.
13. Thm vo lp Employee trong bi 12 cc phng thc c tnh cht public:
- set/get gi tr thuc tnh tn nhn vin
- set/get gi tr thuc tnh tui nhn vin
- set/get gi tr thuc tnh lung nhn vin.
14. Vit mt hm khi to khng c tham s cho lp Employee trong bi 13, cc thuc tnh
ca lp nhn gi tr mc nh:
- gi tr thuc tnh tn nhn vin, mc nh l chui k t rng
- gi tr thuc tnh tui nhn vin, mc nh l 18
- gi tr thuc tnh lung nhn vin, mc nh l $100.
15. Vit thm mt hm khi to vi y ba tham s tng ng vi ba thuc tnh ca lp
Employee trong bi 14.
16. Thm vo lp Employee mt phng thc show() gii thiu v tn, tui v lng ca
i tng nhn vin.
17. Vit mt hm hy b tng minh cho lp Employee nhm gii phng vng nh ca con
tr char, l kiu ca thuc tnh tn nhn vin.
18. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc
sau:
- Khai bo mt i tng kiu Employee, dng hm khi to khng tham s
- Dng hm show() gii thiu v i tng
19. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc
sau:
- Khai bo mt i tng kiu Employee, dng hm khi to khng tham s
- Nhp t bn phm gi tr cc thuc tnh tn, tui, lng nhn vin.
- Gn cc gi tr ny cho cc thuc tnh ca i tng khai bo, dng cc hm set
- Dng hm show() gii thiu v i tng
20. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc
sau:
- Khai bo mt i tng kiu Employee, dng hm khi to vi 3 tham s
- Dng hm show() gii thiu v i tng
21. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc
sau:
- Khai bo mt con tr i tng kiu Employee
- Cp pht b nh, dng hm khi to vi 3 tham s
- Dng hm show() gii thiu v i tng m con tr ny ang tr ti
22. Vit mt chng trnh nhp d liu cho mt mng ng cc i tng ca lp Employee
trong bi 17. Chiu di mng ng cng c nhp t bn phm.
Chng 5: Lp

114
23. Vit mt chng trnh tm kim trn mng ng c xy dng trong bi 22: tm kim
v gii thiu v nhn vin tr nht v nhn vin gi nht trong mng .
24. Vit mt chng trnh tm kim trn mng ng c xy dng trong bi 22: tm kim
v gii thiu v nhn vin c lng cao nht v nhn vin c lng thp nht trong mng
.
25. Vit mt chng trnh tm kim trn mng ng c xy dng trong bi 22: tm kim
v gii thiu v nhn vin c tn xc nh, do ngi dng nhp t bn phm.

Chng 6: Tnh k tha v a hnh

115
CHNG 6
TNH K THA V A HNH

Ni dung chng ny tp trung trnh by cc vn lin quan n tnh k tha v tng ng bi
(a hnh) trong ngn ng C++:
Khi nim k tha, dn xut v cc kiu dn xut
Khai bo, nh ngha cc hm khi to v hm hy b trong lp dn xut
Truy nhp ti cc thnh phn ca lp c s v cc lp dn xut
Vic mt lp c k tha t nhiu lp c s khc nhau
Khai bo v s dng cc lp c s tru tng trong k tha
Tnh a hnh trong k tha
6.1 KHI NIM K THA
Lp trnh hng i tng c hai c trng c bn:
ng gi d liu, c th hin bng cch dng khi nim lp biu din i tng vi
cc thuc tnh private, ch cho php bn ngoi truy nhp vo thng qua cc phng thc
get/set.
Dng li m, th hin bng vic tha k gia cc lp. Vic tha k cho php cc lp tha
k (gi l lp dn xut) s dng li cc phng thc c nh ngha trong cc lp gc
(gi l lp c s).
6.1.1 Khai bo tha k
C php khai bo mt lp k tha t mt lp khc nh sau:
class <Tn lp dn xut>: <T kha dn xut> <Tn lp c s>{
// Khai bo cc thnh phn lp
};
Trong :
Tn lp dn xut: l tn lp c cho k tha t lp khc. Tn lp ny tun th theo quy
tc t tn bin trong C++.
Tn lp c s: l tn lp c nh ngha trc cho lp khc k tha. Tn lp
ny cng tun th theo quy tc t tn bin ca C++.
T kha dn xut: l t kha quy nh tnh cht ca s k tha. C ba t kha dn xut
l private, protected v public. Mc tip theo s trnh by ngha ca cc t kha dn xut
ny.
V d:
class Bus: public Car{
// Khai bo cc thnh phn
};
Chng 6: Tnh k tha v a hnh

116
l khai bo mt lp Bus (xe but) k tha t lp Car (xe t) vi tnh cht k tha l public.
6.1.2 Tnh cht dn xut
S k tha cho php trong lp dn xut c th s dng li mt s m ngun ca cc phng thc
v thuc tnh c nh ngha trong lp c s. Ngha l lp dn xut c th truy nhp trc tip
n mt s thnh phn ca lp c s. Tuy nhin, phm vi truy nhp t lp dn xut n lp c s
khng phi bao gi cng ging nhau: chng c quy nh bi cc t kha dn xut private,
protected v public.
Dn xut private
Dn xut private quy nh phm vi truy nhp nh sau:
Cc thnh phn private ca lp c s th khng th truy nhp c t lp dn xut.
Cc thnh phn protected ca lp c s tr thnh cc thnh phn private ca lp dn xut
Cc thnh phn public ca lp c s cng tr thnh cc thnh phn private ca lp dn
xut.
Phm vi truy nhp t bn ngoi vo lp dn xut c tun th nh quy tc phm vi lp
thng thng.
Dn xut protected
Dn xut protected quy nh phm vi truy nhp nh sau:
Cc thnh phn private ca lp c s th khng th truy nhp c t lp dn xut.
Cc thnh phn protected ca lp c s tr thnh cc thnh phn protected ca lp dn
xut
Cc thnh phn public ca lp c s cng tr thnh cc thnh phn protected ca lp dn
xut.
Phm vi truy nhp t bn ngoi vo lp dn xut c tun th nh quy tc phm vi lp
thng thng.
Dn xut public
Dn xut public quy nh phm vi truy nhp nh sau:
Cc thnh phn private ca lp c s th khng th truy nhp c t lp dn xut.
Cc thnh phn protected ca lp c s tr thnh cc thnh phn protected ca lp dn
xut.
Cc thnh phn public ca lp c s vn l cc thnh phn public ca lp dn xut.
Phm vi truy nhp t bn ngoi vo lp dn xut c tun th nh quy tc phm vi lp
thng thng.
Bng 6.1 tm tt li cc quy tc truy nhp c quy nh bi cc t kha dn xut.

Kiu dn xut Tnh cht lp c s Tnh cht lp dn xut
private private Khng truy nhp c
Chng 6: Tnh k tha v a hnh

117
protected
public
private
private
protected
private
protected
public
Khng truy nhp c
protected
protected
public
private
protected
public
Khng truy nhp c
protected
public

6.2 HM KHI TO V HU B TRONG K THA
6.2.1 Hm khi to trong k tha
Khi khai bo mt i tng c kiu lp c dn xut t mt lp c s khc. Chng trnh s t
ng gi ti hm khi to ca lp dn xut. Tuy nhin, th t c gi s bt u t hm khi to
tng ng ca lp c s, sau n hm khi to ca lp dn xut. Do , thng thng, trong
hm khi to ca lp dn xut phi c hm khi to ca lp c s.
C php khai bo hm khi to nh sau:
<Tn hm khi to dn xut>([<Cc tham s>]):
<Tn hm khi to c s>([<Cc i s>]){
// Khi to cc thuc tnh mi b sung ca lp dn xut
};
V tn hm khi to l trng vi tn lp, nn c th vit li thnh:
<Tn lp dn xut>([<Cc tham s>]):
<Tn lp c s>([<Cc i s>]){
// Khi to cc thuc tnh mi b sung ca lp dn xut
};
V d:
Bus():Car(){
// Khi to cc thuc tnh mi b sung ca lp Bus
}
l mt nh ngha mt hm khi to ca lp Bus k tha t lp Car. nh ngha ny c thc
hin trong phm vi khai bo lp Bus. y l mt hm khi to khng tham s, n gi ti hm
khi to khng tham s ca lp Car.
Lu :
Nu nh ngha hm khi to bn ngoi phm vi lp th phi thm tn lp dn xut v ton
t phm vi :: trc tn hm khi to.
Gia tn hm khi to ca lp dn xut v hm khi to ca lp c s, ch c mt du hai
chm :, nu l hai du :: th tr thnh ton t phm vi lp.
Chng 6: Tnh k tha v a hnh

118
Nu khng ch r hm khi to ca lp c s sau du hai chm : chng trnh s t
ng gi hm khi to ngm nh hoc hm khi to khng c tham s ca lp c s nu
hm c nh ngha tng minh trong lp c s.
V d, nh ngha hm khi to:
Bus():Car(){
// Khi to cc thuc tnh mi b sung ca lp Bus
};
C th thay bng:
Bus(){ // Gi hm khi to khng tham s ca lp Car
// Khi to cc thuc tnh mi b sung ca lp Bus
};
Chng trnh 6.1 nh ngha lp Car c 3 thuc tnh vi hai hm khi to, sau nh ngha lp
Bus c thm thuc tnh label l s hiu ca tuyn xe but. Lp Bus s c ci t hai hm khi
to tng minh, gi n hai hm khi to tng ng ca lp Car.

Chng trnh 6.1
#include<string.h>

/* nh ngha lp Car */
class Car{
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
Car(); // Khi to khng tham s
Car(int, char[], float); // Khi to tham s
};

Car::Car(){ // Khi to khng tham s
speed = 0;
strcpy(mark, );
price = 0;
}

// Khi to tham s
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}

/* nh ngha lp Bus k tha t lp Car */
Chng 6: Tnh k tha v a hnh

119
class Bus: public Car{
int label; // S hiu tuyn xe
public:
Bus(); // Khi to khng tham s
Bus(int, char[], float, int); // Khi to tham s
};

Bus::Bus():Car(){ // Khi to khng tham s
label = 0;
}

// Khi to tham s
Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){
label = lIn;
}

Trong hm khi to ca lp Bus, mun khi to cc thuc tnh ca lp Car, ta phi khi to gin
tip thng qua hm khi to ca lp Car m khng th gn gi tr trc tip cho cc thuc tnh
speed, mark v price. L do l cc thuc tnh ny c tnh cht private, nn lp dn xut khng th
truy nhp trc tip n chng.
6.2.2 Hm hy b trong k tha
Khi mt i tng lp dn xut b gii phng khi b nh, th t gi cc hm hy b ngc vi
th t gi hm thit lp: gi hm hy b ca lp dn xut trc khi gi hm hy b ca lp c s.
V mi lp ch c nhiu nht l mt hm hy b, nn ta khng cn phi ch ra hm hy b no ca
lp c s s c gi sau khi hy b lp dn xut. Do vy, hm hy b trong lp dn xut c
khai bo v nh ngha hon ton ging vi cc lp thng thng:
<Tn lp>::~<Tn lp>([<Cc tham s>]){
// gii phng phn b nh cp pht cho cc thuc tnh b sung
}
Lu :
Hm hy b ca lp dn xut ch gii phng phn b nh c cp pht ng cho cc
thuc tnh mi b sung trong lp dn xut, nu c, m khng c gii phng b nh
c cp cho cc thuc tnh trong lp c s (phn ny l do hm hy b ca lp c s
m nhim).
Khng phi gi tng minh hm hy b ca lp c s trong hm hy b ca lp dn xut.
Ngay c khi lp dn xut khng nh ngha tng minh hm hy b (do khng cn thit)
m lp c s li c nh ngha tng minh. Chng trnh vn gi hm hy b ngm nh
ca lp dn xut, sau vn gi hm hy b tng minh ca lp c s.
Chng trnh 6.2 ci t lp Bus k tha t lp Car: lp Car c mt thuc tnh c dng con tr
nn cn gii phng bng hm hy b tng minh. Lp Bus c thm mt thuc tnh c dng con
Chng 6: Tnh k tha v a hnh

120
tr l danh sch cc ng ph m xe but i qua (mng ng cc chui k t *char[]) nn cng
cn gii phng bng hm hy b tng minh.

Chng trnh 6.2
#include<string.h>

/* nh ngha lp Car */
class Car{
char *mark; // Nhn hiu xe
public:
~Car(); // Hy b tng minh
};

Car::~Car(){ // Hy b tng minh
delete [] mark;
}

/* nh ngha lp Bus k tha t lp Car */
class Bus: public Car{
char *voyage[]; // Hnh trnh tuyn xe
public:
~Bus(); // Hy b tng minh
};

Bus::~Bus(){ // Hy b tng minh
delete [] voyage;
}

Trong hm hy b ca lp Bus, ta ch c gii phng vng nh c cp pht cho thuc tnh
voyage (hnh trnh ca xe but), l thuc tnh c b sung thm ca lp Bus. M khng c
gii phng vng nh cp pht cho thuc tnh mark (nhn hiu xe), vic ny l thuc trch nhim
ca hm hy b ca lp Car v thuc tnh mark c khai bo trong lp Car.
6.3 TRUY NHP TI CC THNH PHN TRONG K THA LP
6.3.1 Phm vi truy nhp
Mi quan h gia cc thnh phn ca lp c s v lp dn xut c quy nh bi cc t kha
dn xut, nh trnh by trong mc 6.1.2, c tm tt trong bng 6.2

Kiu dn xut Tnh cht lp c s Tnh cht lp dn xut
private
private
protected
Khng truy nhp c
private
Chng 6: Tnh k tha v a hnh

121
public private
protected
private
protected
public
Khng truy nhp c
protected
protected
public
private
protected
public
Khng truy nhp c
protected
public

Ta xt phm vi truy nhp theo hai loi:
Phm vi truy nhp t cc hm bn, lp bn ca lp dn xut
Phm vi truy nhp t cc i tng c kiu lp dn xut
Truy nhp t cc hm bn v lp bn ca lp dn xut
Nhn vo bng tng kt 6.2, phm vi truy nhp ca hm bn, lp bn ca lp dn xut vo lp c
s nh sau:
Vi dn xut private, hm bn c th truy nhp c cc thnh phn protected v public
ca lp c s v chng tr thnh cc thnh phn private ca lp dn xut, c th truy nhp
c t hm bn.
Vi dn xut protected, hm bn cng c th truy nhp c cc thnh phn protected v
public ca lp c s v chng tr thnh cc thnh phn protected ca lp dn xut, c th
truy nhp c t hm bn.
Vi dn xut public, hm bn cng c th truy nhp c cc thnh phn protected v
public ca lp c s v chng tr thnh cc thnh phn protected v public ca lp dn
xut, c th truy nhp c t hm bn.
i vi c ba loi dn xut, hm bn u khng truy nhp c cc thnh phn private
ca lp c s, v cc thnh phn ny cng khng truy nhp c t lp dn xut.
Truy nhp t cc i tng to bi lp dn xut
Nhn vo bng tng kt 6.2, phm vi truy nhp ca cc i tng ca lp dn xut vo lp c s
nh sau:
Vi dn xut private, i tng ca lp dn xut khng truy nhp c bt c thnh phn
no ca lp c s v chng tr thnh cc thnh phn private ca lp dn xut, khng truy
nhp c t bn ngoi.
Vi dn xut protected, i tng ca lp dn xut khng truy nhp c bt c thnh
phn no ca lp c s v chng tr thnh cc thnh phn protected ca lp dn xut,
khng truy nhp c t bn ngoi.
Vi dn xut public, i tng ca lp dn xut c th truy nhp c cc thnh phn
public ca lp c s v chng tr thnh cc thnh phn public ca lp dn xut, c th truy
nhp c t bn ngoi.
Bng 6.3 tng kt phm vi truy nhp t hm bn v i tng ca lp dn xut vo cc thnh
phn ca lp c s, c quy nh bi cc t kha dn xut.
Chng 6: Tnh k tha v a hnh

122

Kiu dn xut Tnh cht lp c
s
Tnh cht lp
dn xut
Truy nhp t hm
bn ca lp dn
xut
Truy nhp t i
tng ca lp dn
xut
private
private
protected
public
---
private
private
---
ok
ok
---
---
---
protected
private
protected
public
---
protected
protected
---
ok
ok
---
---
---
public
private
protected
public
---
protected
public
---
ok
ok
---
---
ok

6.3.2 S dng cc thnh phn ca lp c s t lp dn xut
T bng tng kt phm vi truy nhp, ta thy rng ch c dn xut theo kiu public th i tng
ca lp dn xut mi c th truy nhp n cc thnh phn (thuc loi public) ca lp c s. Khi
, vic gi n cc thnh phn ca lp c s cng tng t nh gi cc thnh phn lp thng
thng:
i vi bin i tng thng thng:
<Tn i tng>.<Tn thnh phn>([Cc i s]);
i vi con tr i tng:
<Tn i tng>-><Tn thnh phn>([Cc i s]);
Lu :
Cch gi hm thnh phn ny c p dng khi trong lp dn xut, ta khng nh ngha
li cc hm thnh phn ca lp c s. Trng hp nh ngha li hm thnh phn ca lp
c s s c trnh by trong mc 6.3.3.
Chng trnh 6.3 minh ha vic s dng cc thnh phn lp c s t i tng lp dn xut: lp
Bus k tha t lp Car. Lp Bus c nh ngha b sung mt s phng thc v thuc tnh mi.
Khi , i tng ca lp Bus c th gi cc hm public ca lp Bus cng nh ca lp Car.

Chng trnh 6.3
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp Car */
class Car{
private:
int speed; // Tc
Chng 6: Tnh k tha v a hnh

123
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
void setSpeed(int); // Gn tc cho xe
int getSpeed(); // c tc xe
void setMark(char); // Gn nhn cho xe
char[] getMark(); // c nhn xe
void setPrice(float); // Gn gi cho xe
float getPrice(); // c gi xe
// Khi to thng tin v xe
Car(int speedIn=0, char markIn[]=, float priceIn=0);
void show(); // Gii thiu xe
};

/* Khai bo phng thc bn ngoi lp */
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}

void Car::setSpeed(int speedIn){ // Gn tc cho xe
speed = speedIn;
}
int Car::getSpeed(){ // c tc xe
return speed;
}
void Car::setMark(char markIn){ // Gn nhn cho xe
strcpy(mark, markIn);
}
char[] Car::getMark(){ // c nhn xe
return mark;
}
void Car::setPrice(float priceIn){ // Gn gi cho xe
price = priceIn;
}
float Car::getPrice(){ // c gi xe
return price;
}

void Car::show(){ // Phng thc gii thiu xe
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
Chng 6: Tnh k tha v a hnh

124
return;
}

/* nh ngha lp Bus k tha t lp Car */
class Bus: public Car{
int label; // S hiu tuyn xe
public:
// Khi to tham s
Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0);
void setLabel(int); // Gn s hiu tuyn xe
int getLabel(); // c s hiu tuyn xe
};

// Khi to tham s
Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){
label = lIn;
}
void Bus::setLabel(int labelIn){ // Gn s hiu tuyn xe
label = labelIn;
}
int Bus::getLabel(){ // c s hiu tuyn xe
return label;
}

// Chng trnh chnh
void main(){
clrscr();
Bus myBus; // Bin i tng ca lp Bus
int speedIn, labelIn;
float priceIn;
char markIn[20];

// Nhp gi tr cho cc thuc tnh
cout << Toc do xe bus:;
cin >> speedIn;
cout << Nhan hieu xe bus:;
cin >> markIn;
cout << Gia xe bus:;
cin >> priceIn;
cout << So hieu tuyen xe bus:;
cin >> labelIn;

myBus.setSpeed(speedIn); // Phng thc ca lp Car
Chng 6: Tnh k tha v a hnh

125
myBus.setMark(markIn); // Phng thc ca lp Car
myBus.setPrice(priceIn); // Phng thc ca lp Car
myBus.setLabel(labelIn); // Phng thc ca lp Bus
myBus.show(); // Phng thc ca lp Car
return;
}

Trong chng trnh 6.3, i tng myBus c kiu lp Bus, l lp dn xut ca lp c s Car, c
th s dng cc phng thc ca lp Car v lp Bus mt cch bnh ng. Khi , lnh
myBus.show() s gi n phng thc show() ca lp Car, do vy, chng trnh trn s in ra mn
hnh kt qu nh sau (ty theo d liu nhp vo 4 dng u):
Toc do xe bus: 80
Nhan hieu xe bus: Mercedes
Gia xe bus: 5000
So hieu tuyen xe bus: 27
This is a Mercedes having a speed of 80km/h and its price is $5000
Trong dng gii thiu xe bus (v ta ang dng i tng myBus ca lp Bus), khng c gii thiu
s hiu tuyn xe. L do l v ta ang dng hm show ca lp Car. Mun c thm phn gii thiu
v s hiu tuyn xe but, ta phi nh ngha li hm show trong lp Bus. Mc 6.3.3 s trnh by
ni dung ny.
6.3.3 nh ngha chng cc phng thc ca lp c s
nh ngha chng phng thc ca lp c s
Mt phng thc ca lp c s b coi l np chng nu lp dn xut cng nh ngha mt
phng thc c cng tn.
V d, trong lp Car, c phng thc show(), by gi, trong lp Bus k tha t lp Car, ta
cng nh ngha li phng thc show():
class Car{

public:

void show(); // Phng thc ca lp c s
};
class Bus: public Car{

public:

void show(); // Phng thc np chng
};
khi , phng thc show() ca lp Bus c coi l phng thc np chng t phng thc
show() ca lp Car.
Chng 6: Tnh k tha v a hnh

126
S dng cc phng thc np chng
T mt i tng ca lp dn xut, vic truy nhp n phng thc c nh ngha li trong
lp dn xut c thc hin nh li gi mt phng thc thng thng:
i vi bin i tng thng thng:
<Tn i tng>.<Tn thnh phn>([Cc i s]);
i vi con tr i tng:
<Tn i tng>-><Tn thnh phn>([Cc i s]);
V d:
Bus myBus;
myBus.show();
s gi n phng thc show() c nh ngha trong lp Bus.
Trong trng hp, t mt i tng ca lp dn xut, mun truy nhp n mt phng thc ca
lp c s ( b nh ngha li lp dn xut) th phi s dng ch th phm vi lp trc phng
thc c gi:
i vi bin i tng thng thng:
<Tn i tng>.<Tn lp c s>::<Tn thnh phn>([Cc i s]);
i vi con tr i tng:
<Tn i tng>-><Tn lp c s>::<Tn thnh phn>([Cc i s]);
V d:
Bus myBus;
myBus.Car::show();
s gi n phng thc show() c nh ngha trong lp Car t mt i tng ca lp Bus.
Chng trnh 6.4 minh ha vic nh ngha chng hm show() trong lp Bus v vic s dng hai
phng thc show() ca hai lp t mt i tng ca lp dn xut.

Chng trnh 6.4
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp Car */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
int getSpeed(); // c tc xe
char[] getMark(); // c nhn xe
float getPrice(); // c gi xe
// Khi to thng tin v xe
Chng 6: Tnh k tha v a hnh

127
Car(int speedIn=0, char markIn[]=, float priceIn=0);
void show(); // Gii thiu xe
};

/* Khai bo phng thc bn ngoi lp */
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}

void Car::setSpeed(int speedIn){ // Gn tc cho xe
speed = speedIn;
}
int Car::getSpeed(){ // c tc xe
return speed;
}
char[] Car::getMark(){ // c nhn xe
return mark;
}
float Car::getPrice(){ // c gi xe
return price;
}

void Car::show(){ // Phng thc gii thiu xe
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}

/* nh ngha lp Bus k tha t lp Car */
class Bus: public Car{
int label; // S hiu tuyn xe
public:
// Khi to tham s
Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0);
void show(); // Gii thiu xe bus
};

// Khi to tham s
Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){
label = lIn;
}
Chng 6: Tnh k tha v a hnh

128

// nh ngha np chng phng thc
void Bus::show(){ // Gii thiu xe bus
cout << This is a bus of type << getMark() << , on the line
<< label << , having a speed of << getSpeed()
<< km/h and its price is $ << getPrice() << endl;
return;
}

// Chng trnh chnh
void main(){
clrscr();
Bus myBus(80, Mercedes, 5000, 27);// Bin i tng ca lp Bus

cout << Gioi thieu xe: << endl;
myBus.Car::show(); // Phng thc ca lp Car
cout << Gioi thieu xe bus: << endl;
myBus.show(); // Phng thc ca lp Bus
return;
}

Chng trnh 6.4 s hin th cc thng bo nh sau:
Gioi thieu xe:
This is a Mercedes having a speed of 80km/h and its price is $5000
Gioi thieu xe bus:
This is a bus of type Mercedes, on the line 27, having a speed of
80km/h and its price is $5000
Lu :
Trong phng thc show() ca lp Bus, ta phi dng cc hm get truy nhp n cc
thuc tnh ca lp Car. Khng c truy nhp trc tip n tn cc thuc tnh (speed,
mark v price) v chng c dng private ca lp Car.
6.3.4 Chuyn i kiu gia lp c s v lp dn xut
V mt d liu, mt lp dn xut bao gi cng cha ton b d liu ca lp c s: Ta lun tm
thy lp c s trong lp dn xut, nhng khng phi bao gi cng tm thy lp dn xut trong lp
c s. Do vy:
C th gn mt i tng lp dn xut cho mt i tng lp c s:
<i tng lp c s> = <i tng lp dn xut>; // ng
Nhng khng th gn mt i tng lp c s cho mt i tng lp dn xut:
<i tng lp dn xut> = <i tng lp c s>; // Khng c
V d, ta c lp Bus k tha t lp Car v:
Bus myBus;
Chng 6: Tnh k tha v a hnh

129
Car myCar;
khi , php gn:
myCar = myBus; // ng
th chp nhn c, nhng php gn:
myBus = myCar; // khng c
th khng chp nhn c.
Lu :
Nguyn tc chuyn kiu ny cng ng vi cc php gn con tr: mt con tr i tng
lp c s c th tr n a ch ca mt i tng lp dn xut. Nhng mt con tr i
tng lp dn xut khng th tr n a ch mt i tng lp c s.
Nguyn tc chuyn kiu ny cng ng vi truyn i s cho hm: c th truyn mt i
tng lp dn xut vo v tr ca tham s c kiu lp c s. Nhng khng th truyn mt
i tng lp c s vo v tr mt tham s c kiu lp dn xut.
Chng trnh 6.5 minh ha vic chuyn kiu gia cc i tng ca lp c s v lp dn xut.

Chng trnh 6.5
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp Car */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
int getSpeed(); // c tc xe
char[] getMark(); // c nhn xe
float getPrice(); // c gi xe
// Khi to thng tin v xe
Car(int speedIn=0, char markIn[]=, float priceIn=0);
void show(); // Gii thiu xe
};

/* Khai bo phng thc bn ngoi lp */
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}

Chng 6: Tnh k tha v a hnh

130
int Car::getSpeed(){ // c tc xe
return speed;
}
char[] Car::getMark(){ // c nhn xe
return mark;
}
float Car::getPrice(){ // c gi xe
return price;
}

void Car::show(){ // Phng thc gii thiu xe
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}

/* nh ngha lp Bus k tha t lp Car */
class Bus: public Car{
int label; // S hiu tuyn xe
public:
// Khi to tham s
Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0);
void show(); // nh ngha chng phng thc
};

// Khi to tham s
Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){
label = lIn;
}

// nh ngha np chng phng thc
void Bus::show(){ // Gii thiu xe bus
cout << This is a bus of type << getMark() << , on the line
<< label << , having a speed of << getSpeed()
<< km/h and its price is $ << getPrice() << endl;
return;
}

// Chng trnh chnh
void main(){
clrscr();
Car myCar(100, Ford, 3000); // Bin i tng lp Car
Bus myBus(80, Mercedes, 5000, 27);// Bin i tng lp Bus
Chng 6: Tnh k tha v a hnh

131

cout << Gioi thieu xe o to lan 1: << endl;
myCar.show();
cout << Gioi thieu xe o to lan 2: << endl;
myCar = myBus;
myCar.show();
cout << Gioi thieu xe bus: << endl;
myBus.show();
return;
}

Chng trnh 6.5 s in ra kt qu thng bo nh sau:
Goi thieu xe o to lan 1:
This is a Ford having a speed of 100km/h and its price is $3000
Gioi thieu xe lan o to lan 2:
This is a Mercedes having a speed of 80km/h and its price is $5000
Gioi thieu xe bus:
This is a bus of type Mercedes, on the line 27, having a speed of
80km/h and its price is $5000
thng bo th nht, i tng myCar gi phng thc show() ca lp Car vi cc d liu c
khi u cho myCar: (100, Ford, 3000). thng bo th hai, myCar gi phng thc show()
ca lp Car, nhng vi d liu va c gn t i tng myBus: (80, Mercedes, 5000).
thng bo th ba, myBus gi phng thc show() ca lp Bus vi cc d liu ca myBus: (80,
Mercedes, 5000, 27).
6.4 A K THA
C++ cho php a k tha, tc l mt lp c th c dn xut t nhiu lp c s khc nhau, vi
nhng kiu dn xut khc nhau.
6.4.1 Khai bo a k tha
a k tha c khai bo theo c php:
class <Tn lp dn xut>: <T kho dn xut> <Tn lp c s 1>,
<T kho dn xut> <Tn lp c s 2>,

<T kho dn xut> <Tn lp c s n>{
// Khai bo thm cc thnh phn lp dn xut
};
V d:
class Bus: public Car, public PublicTransport{
// Khai bo cc thnh phn b sung
};
Chng 6: Tnh k tha v a hnh

132
l khai bo lp Bus (xe but) k tha t hai lp xe Car ( t) v PublicTransport (phng tin
giao thng cng cng) theo cng mt kiu dn xut l public.
Lu :
Trong a k tha, mi lp c s c phn cch nhau bi du phy ,.
Mi lp c s c th c mt kiu dn xut bi mt t kho dn xut khc nhau.
Nguyn tc truy nhp vo cc thnh phn lp c s cng hon ton tng t nh trong k
tha n.
6.4.2 Hm khi to v hm hu b trong a k tha
Hm khi to trong a k tha
Hm khi to trong a k tha c khai bo tng t nh trong n k tha, ngoi tr vic phi
sp xp th t gi ti hm khi to ca cc lp c s: thng thng, th t gi n hm khi to
ca cc lp c s nn tun theo th t dn xut t cc lp c s trong a k tha.
Chng trnh 6.6 minh ho vic nh ngha hm khi to tng minh trong a k tha: th t gi
hm khi to ca cc lp c s trong hm khi to ca lp Bus l tng t th t dn xut: hm
khi to ca lp Car trc hm khi to ca lp PublicTransport.

Chng trnh 6.6
#include<string.h>

/* nh ngha lp Car */
class Car{
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
Car(); // Khi to khng tham s
Car(int, char[], float); // Khi to tham s
};

Car::Car(){ // Khi to khng tham s
speed = 0;
strcpy(mark, );
price = 0;
}

// Khi to tham s
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
Chng 6: Tnh k tha v a hnh

133
}

/* nh ngha lp PublicTransport */
class PublicTransport{
float ticket; // Gi v phng tin
public:
PublicTransport(); // Khi to khng tham s
PublicTransport(float); // Khi to tham s
};

PublicTransport::PublicTransport(){ // Khi to khng tham s
ticket = 0;
}

// Khi to tham s
PublicTransport::PublicTransport(float ticketIn){
ticket = ticketIn;
}

/* nh ngha lp Bus k tha t lp Car v PublicTransport */
class Bus: public Car, public PublicTransport{ // Th t khai bo
int label; // S hiu tuyn xe
public:
Bus(); // Khi to khng tham s
Bus(int, char[], float, float, int);// Khi to tham s
};

// Khi to khng tham s
Bus::Bus(): Car(), Transport(){ // Theo th t dn xut
label = 0;
}

// Khi to tham s
Bus::Bus(int sIn, char mIn[], float pIn, float tIn, int lIn):
Car(sIn, mIn, pIn), PublicTransport(tIn){ // Theo th t dn xut
label = lIn;
}

Lu :
Trong trng hp dng hm khi to ngm nh hoc khng c tham s, ta c th khng
cn gi tng minh cc hm khi to ca cc lp c s, trnh bin dch s t ng gi ti
chng theo ng th t dn xut
Chng 6: Tnh k tha v a hnh

134
V d, trong chng trnh 6.6, hai cch nh ngha hm khi to khng tham s ca lp Bus sau l
tng ng:
Bus::Bus(): Car(), Transport(){// Theo th t dn xut
label = 0;
}
l tng ng vi:
Bus::Bus(){ // Theo th t dn xut ngm nh
label = 0;
}
Hm hu b trong a k tha
V hm hu b l duy nht ca mi lp, hn na hm hu b ca lp c s s c t ng gi
n khi gii phng i tng ca lp dn xut. Cho nn hm hu b trong a k tha hon ton
tng t hm hu b trong n k tha:
Hm hu b ca lp dn xut ch gii phng b nh cho cc thnh phn b sung, nu c,
ca lp dn xut.
Hm hu b ca lp dn xut s c gi n sm nht. Sau cc hm hu b ca cc
lp c s s c gi n.
Qu trnh ny c trnh bin dch thc hin t ng.
6.4.3 Truy nhp cc thnh phn lp trong a k tha
Vic truy nhp n cc thnh phn ca cc lp trong a k tha c da trn cc nguyn tc sau:
Vic truy nhp t i tng lp dn xut n cc thnh phn ca mi lp c s c tun
theo quy tc phm vi tng t nh trong n k tha.
Trong trng hp cc lp c s u c cc thnh phn cng tn, vic truy xut n thnh
phn ca lp no phi c ch r bng ton t phm vi: <Tn lp>:: i vi thnh
phn lp c s .
V d, ta nh ngha lp Bus k tha t hai lp c s: Car v PublicTransport. Nhng c ba lp
ny u nh ngha mt phng thc show() t gii thiu:
class Car{
public:
void show();
};
class PublicTransport{
public:
void show();
};
class Bus: public Car, public PublicTransport{
public:
void show();
};
Chng 6: Tnh k tha v a hnh

135
Khi , khai bo:
Bus myBus;
v li gi hm:
myBus.show(); // Gi n hm ca lp Bus
myBus.Car::show(); // Gi n hm ca lp Car
myBus.PublicTransport::show();// Gi n hm ca lp PublicTransport
Chng trnh 6.7 minh ho vic truy nhp n cc thnh phn trng nhau trong cc lp c s v
c nh ngha li trong lp dn xut.


Chng trnh 6.7
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp Car */
class Car{
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
Car(); // Khi to khng tham s
Car(int, char[], float); // Khi to tham s
void show(); // Gii thiu
float getSpeed(){return speed;};
char[] getMark(){return mark;};
float getPrice(){return price;};
};

Car::Car(){ // Khi to khng tham s
speed = 0;
strcpy(mark, );
price = 0;
}

// Khi to tham s
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}

Chng 6: Tnh k tha v a hnh

136
// Gii thiu
void Car::show(){
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}

/* nh ngha lp PublicTransport */
class PublicTransport{
float ticket; // Gi v phng tin
public:
PublicTransport(); // Khi to khng tham s
PublicTransport(float); // Khi to tham s
void show(); // Gii thiu
float getTicket(){return ticket;};
};

PublicTransport::PublicTransport(){ // Khi to khng tham s
ticket = 0;
}

// Khi to tham s
PublicTransport::PublicTransport(float ticketIn){
ticket = ticketIn;
}

// Gii thiu
void PublicTransport::show(){
cout << This public transport had a ticket of $
<< ticket << endl;
return;
}

/* nh ngha lp Bus k tha t lp Car v PublicTransport */
class Bus: public Car, public PublicTransport{ // Th t khai bo
int label; // S hiu tuyn xe
public:
Bus(); // Khi to khng tham s
Bus(int, char[], float, float, int);// Khi to tham s
void show(); // Gii thiu
};

// Khi to khng tham s
Chng 6: Tnh k tha v a hnh

137
Bus::Bus(): Car(), Transport(){ // Theo th t dn xut
label = 0;
}

// Khi to tham s
Bus::Bus(int sIn, char mIn[], float pIn, float tIn, int lIn):
Car(sIn, mIn, pIn), PublicTransport(tIn){ // Theo th t dn xut
label = lIn;
}

// Gii thiu
void Bus::show(){
cout << This is a bus on the line << label
<< , its speed is << getSpeed()
<< km/h, mark is << getMark()
<< , price is $ << getPrice()
<< and ticket is << getTicket() << endl;
return;
}

// phng thc main
void main(){
clrscr();
Bus myBus(100, Mercedes, 3000, 1.5, 27);

myBus.Car::show(); // Hm ca lp Car
myBus.PublicTransport:: show(); // Hm ca lp PublicTransport
myBus.show(); // Hm ca lp Bus
return;
}

Chng trnh 6.7 s in ra thng bo nh sau:
This is a Mercedes having a speed of 100km/h and its price is $3000
This public transport had a ticket of $1.5
This is a bus on the line 27, its speed is 100km/h, mark is Mercedes,
price is $3000 and ticket is $1.5
Dng th nht l kt qu ca phng thc show() ca lp Car, dng th hai, tng ng l kt qu
phng thc show() ca lp PublicTransport, dng th ba l kt qu phng thc show() ca lp
Bus.
Chng 6: Tnh k tha v a hnh

138
6.5 LP C S TRU TNG
6.5.1 t vn
S cho php a k tha trong C++ dn n mt s hu qu xu, l s ng gia cc thnh
phn ca cc lp c s, khi c t nht hai lp c s li cng c k tha t mt lp c s khc.
Xt trng hp:
Lp Bus k tha t lp Car v lp PublicTransport.
Nhng lp Car v lp PublicTransport li cng c tha k t lp Engine (ng c).
Lp Engine c mt thuc tnh l power (cng sut ca ng c).

Khi , ny sinh mt s vn nh sau:
Cc thnh phn d liu ca lp Engine b lp li trong lp Bus hai ln: mt ln do k tha
theo ng Bus::Car::Engine, mt ln theo ng Bus::PublicTransport::Engine. iu
ny l khng an ton.
Khi khai bo mt i tng ca lp Bus, hm khi to ca lp Engine cng c gi hai
ln: mt ln do gi truy hi t hm khi to lp Car, mt ln do gi truy hi t hm khi
to lp PublicTransport.
Khi gii phng mt i tng ca lp Bus, hm hu b ca lp Engine cng s b gi ti
hai ln.
trnh cc vn ny, C++ cung cp mt khi nim l k tha t lp c s tru tng. Khi ,
ta cho cc lp Car v PublicTransport k tha tru tng t lp Engine. Bng cch ny, cc thnh
phn ca lp Engine ch xut hin trong lp Bus ng mt ln. Lp Engine c gi l lp c s
tru tng ca cc lp Car v PublicTransport.
6.5.2 Khai bo lp c s tru tng
Vic ch ra mt s k tha tru tng c thc hin bng t kho virtual khi khai bo lp c s:
class <Tn lp c s>: <T kho dn xut> virtual <Tn lp c s>{
// Khai bo cc thnh phn b sung
};
V d:
class Engine{
// Cc thnh phn lp Engine
Engine
Car PublicTransport
Bus
Chng 6: Tnh k tha v a hnh

139
};
class Car: public virtual Engine{
// Khai bo cc thnh phn b sung
};
l khai bo lp Car, k tha t lp c s tru tng Engine, theo kiu dn xut public.
Lu :
T kho virtual c vit bng ch thng.
T kho virtual khng nh hng n phm vi truy nhp thnh phn lp c s, phm vi
ny vn c quy nh bi t kho dn xut nh thng thng.
T kho virtual ch ra mt lp c s l tru tng nhng li c vit trong khi khai bo
lp dn xut.
Mt lp dn xut c th c k tha t nhiu lp c s tru tng
6.5.3 Hm khi to lp c s tru tng
Khc vi cc lp c s thng thng, khi c mt lp dn xut t mt lp c s tru tng, li
c ly lm c s cho mt lp dn xut khc th trong hm khi to ca lp dn xut cui cng,
vn phi gi hm khi to tng minh ca lp c s tru tng. Hn na, hm khi to ca lp
c s tru tng phi c gi sm nht.
V d, khi lp Car v lp PublicTransport c k tha t lp c s tru tng Engine. Sau ,
lp Bus c k tha t hai lp Car v PublicTranport. Khi , hm khi to ca lp Bus cng
phi gi tng minh hm khi to ca lp Engine, theo th t sm nht, sau mi gi n hm
khi to ca cc lp Car v PublicTransport.
class Engine{
public:
Engine(){ };
};
class Car: public virtual Engine{ //Lp c s virtual
public:
Car(): Engine(){ };
};
class PublicTransport: public virtual Engine{ //Lp c s virtual
public:
PublicTransport():Engine(){ };
};
class Bus: public Car, public PublicTransport{
public:
// Gi hm khi to tng minh ca lp c s tru tng
Bus():Engine(), Car(), PublicTransport(){ };
};
Lu :
Trong trng hp lp Engine khng phi l lp c s tru tng ca cc lp Car v
PublicTransport, th trong hm khi to ca lp Bus khng cn gi hm khi to ca lp
Chng 6: Tnh k tha v a hnh

140
Engine, m ch cn gi ti cc hm khi to ca cc lp c s trc tip ca lp Bus l lp
Car v lp PublicTransport.
Chng trnh 6.8 minh ho vic khai bo v s dng lp c s tru tng: lp Engine l lp c s
tru tng ca cc lp Car v lp PublicTransport. Hai lp ny, sau , li lm lp c s ca lp
Bus.

Chng trnh 6.8
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp Engine */
class Engine{
int power; // Cng sut
public:
Engine(){power = 0;}; // Khi to khng tham s
Engine(int pIn){power = pIn;};// Khi to tham s
void show(); // Gii thiu
float getPower(){return power;};
};

// Gii thiu
void Engine::show(){
cout << This is an engine having a power of
<< power << KWH << endl;
return;
}

/* nh ngha lp Car dn xut t lp c s tru tng Engine*/
class Car: public virtual Engine{
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
Car(); // Khi to khng tham s
Car(int, int, char[], float); // Khi to tham s
void show(); // Gii thiu
float getSpeed(){return speed;};
char[] getMark(){return mark;};
float getPrice(){return price;};
};

Chng 6: Tnh k tha v a hnh

141
Car::Car(): Engine(){ // Khi to khng tham s
speed = 0;
strcpy(mark, );
price = 0;
}

// Khi to tham s
Car::Car(int pwIn, int sIn, char mIn[], float prIn): Engine(pwIn){
speed = sIn;
strcpy(mark, mIn);
price = prIn;
}

// Gii thiu
void Car::show(){
cout << This is a << mark << having a speed of
<< speed << km/h, its power is << getPower()
<< KWh and price is $ << price << endl;
return;
}

/* nh ngha lp PublicTransport dn xut tru tng t lp Engine */
class PublicTransport: public virtual Engine{
float ticket; // Gi v phng tin
public:
PublicTransport(); // Khi to khng tham s
PublicTransport(int, float); // Khi to tham s
void show(); // Gii thiu
float getTicket(){return ticket;};
};

// Khi to khng tham s
PublicTransport::PublicTransport(): Engine(){
ticket = 0;
}

// Khi to tham s
PublicTransport::PublicTransport(int pwIn, float tIn): Engine(pwIn){
ticket = tIn;
}

// Gii thiu
void PublicTransport::show(){
Chng 6: Tnh k tha v a hnh

142
cout << This is a public transport havn a ticket of $
<< ticket << and its power is << getPower()
<< KWh << endl;
return;
}

/* nh ngha lp Bus k tha t lp Car v PublicTransport */
class Bus: public Car, public PublicTransport{ // Th t khai bo
int label; // S hiu tuyn xe
public:
Bus(); // Khi to khng tham s
Bus(int,int,char[],float,float,int);// Khi to tham s
void show(); // Gii thiu
};

// Khi to khng tham s
Bus::Bus(): Engine(), Car(), Transport(){ // Theo th t dn xut
label = 0;
}

// Khi to tham s
Bus::Bus(int pwIn, int sIn, char mIn[], float prIn, float tIn, int lIn):
Engine(pwIn), Car(sIn, mIn, prIn), PublicTransport(tIn){
label = lIn;
}

// Gii thiu
void Bus::show(){
cout << This is a bus on the line << label
<< , its speed is << getSpeed()
<< km/h, power is << Car::getPower()
<< KWh, mark is << getMark()
<< , price is $ << getPrice()
<< and ticket is << getTicket() << endl;
return;
}

// phng thc main
void main(){
clrscr();
Bus myBus(250, 100, Mercedes, 3000, 1.5, 27);

myBus.Car::Engine::show(); // Hm ca lp Engine
Chng 6: Tnh k tha v a hnh

143
myBus.PublicTransport::Engine::show();// Hm ca lp Engine
myBus.Car::show(); // Hm ca lp Car
myBus.PublicTransport:: show(); // Hm ca lp PublicTransport
myBus.show(); // Hm ca lp Bus
return;
}

Chng trnh 6.8 s in ra thng bo nh sau:
This is an engine having a power of 250KWh
This is an engine having a power of 250KWh
This is a Mercedes having a speed of 100km/h, its power is 250KWh and
price is $3000
This is a public transport having a ticket of $1.5 and its power is
250KWh
This is a bus on the line 27, its speed is 100km/h, power is 250KWh,
mark is Mercedes, price is $3000 and ticket is $1.5
Hai dng u l kt qu ca phng thc show() ca lp Engine: mt ln gi qua lp Car, mt ln
gi qua lp PublicTransport, chng cho kt qu nh nhau. Dng th ba l kt qu phng thc
show() ca lp Car. Dng th t, tng ng l kt qu phng thc show() ca lp
PublicTransport. Dng th nm l kt qu phng thc show() ca lp Bus.
6.6 A HNH
6.6.1 t vn
S k tha trong C++ cho php c s tng ng gia lp c s v cc lp dn xut trong s
tha k:
Mt con tr c kiu lp c s lun c th tr n a ch ca mt i tng ca lp dn
xut.
Tuy nhin, khi thc hin li gi mt phng thc ca lp, trnh bin dch s quan tm n
kiu ca con tr ch khng phi i tng m con tr ang tr ti: phng thc ca lp
m con tr c kiu c gi ch khng phi phng thc ca i tng m con tr ang
tr ti c gi.
V d, lp Bus k tha t lp Car, c hai lp ny u nh ngha phng thc show():
class Car{
public:
void show();
};
class Bus: public Car{
public:
void show();
};
khi , nu ta khai bo mt con tr lp Bus, nhng li tr vo a ch ca mt i tng lp Car:
Chng 6: Tnh k tha v a hnh

144
Bus myBus;
Car *ptrCar = &myBus; // ng
nhng khi gi:
ptrCar->show();
th chng trnh s gi n phng thc show() ca lp Car (l kiu ca con tr ptrCar), m
khng gi ti phng thc show() ca lp Bus (l kiu ca i tng myBus m con tr ptrCar
ang tr ti).
gii quyt vn ny, C++ a ra mt khi nim l phng thc tru tng. Bng cch s
dng phng thc tru tng. Khi gi mt phng thc t mt con tr i tng, trnh bin dch
s xc nh kiu ca i tng m con tr ang tr n, sau n s gi phng thc tng ng
vi i tng m con tr ang tr ti.
6.6.2 Khai bo phng thc tru tng
Phng thc tru tng (cn gi l phng thc o, hm o) c khai bo vi t kho virtual:
Nu khai bo trong phm vi lp:
virtual <Kiu tr v> <Tn phng thc>([<Cc tham s>]);
Nu nh ngha ngoi phm vi lp:
virtual <Kiu tr v> <Tn lp>::<Tn phng thc>([<Cc tham
s>]){}
V d:
class Car{
public:
virtual void show();
};
l khai bo phng thc tru tng show() ca lp Car: phng thc khng c tham s v khng
cn gi tr tr v (void).
Lu :
T kho virtual c th t trc hay sau kiu tr v ca phng thc.
Vi cng mt phng thc c khai bo lp c s ln lp dn xut, ch cn dng t
kho virtual mt trong hai ln nh ngha phng thc l : hoc lp c s, hoc
lp dn xut.
Trong trng hp cy k tha c nhiu mc, cng ch cn khai bo phng thc l tru
tng (virtual) mt mc bt k. Khi , tt c cc phng thc trng tn vi phng
thc tt c cc mc u c coi l tru tng.
i khi khng cn thit phi nh ngha chng (trong lp dn xut) mt phng thc
c khai bo tru tng trong lp c s.
6.6.3 S dng phng thc tru tng a hnh
Mt khi phng thc c khai bo l tru tng th khi mt con tr gi n phng thc ,
chng trnh s thc hin phng thc tng ng vi i tng m con tr ang tr ti, thay v
Chng 6: Tnh k tha v a hnh

145
thc hin phng thc ca lp cng kiu vi con tr. y c gi l hin tng a hnh (tng
ng bi) trong C++.
Chng trnh 6.9 minh ho vic s dng phng thc tru tng: lp Bus k tha t lp Car, hai
lp ny cng nh ngha phng thc tru tng show().
Khi ta dng mt con tr c kiu lp Car tr vo a ch ca mt i tng kiu Car, n s
gi phng thc show() ca lp Car.
Khi ta dng cng con tr , tr vo a ch ca mt i tng kiu Bus, n s gi phng
thc show() ca lp Bus.

Chng trnh 6.9
#include<stdio.h>
#include<conio.h>
#include<string.h>

/* nh ngha lp Car */
class Car{
private:
int speed; // Tc
char mark[20]; // Nhn hiu
float price; // Gi xe
public:
int getSpeed(){return speed;};// c tc xe
char[] getMark(){return mark;};// c nhn xe
float getPrice(){return price;};// c gi xe
// Khi to thng tin v xe
Car(int speedIn=0, char markIn[]=, float priceIn=0);
virtual void show(); // Gii thiu xe, tru tng
};

/* Khai bo phng thc bn ngoi lp */
Car::Car(int speedIn, char markIn[], float priceIn){
speed = speedIn;
strcpy(mark, markIn);
price = priceIn;
}

// Phng thc tru tng gii thiu xe
virtual void Car::show(){
cout << This is a << mark << having a speed of
<< speed << km/h and its price is $ << price << endl;
return;
}
Chng 6: Tnh k tha v a hnh

146

/* nh ngha lp Bus k tha t lp Car */
class Bus: public Car{
int label; // S hiu tuyn xe
public:
// Khi to tham s
Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0);
void show(); // Gii thiu xe
};

// Khi to tham s
Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){
label = lIn;
}

// nh ngha np chng phng thc tru tng
void Bus::show(){ // Gii thiu xe bus
cout << This is a bus of type << getMark() << , on the line
<< label << , having a speed of << getSpeed()
<< km/h and its price is $ << getPrice() << endl;
return;
}

// Chng trnh chnh
void main(){
clrscr();
Car *ptrCar, myCar(100, Ford, 3000);
Bus myBus(150, Mercedes, 5000, 27);// Bin i tng ca lp Bus

ptrCar = &myCar; // Tr n i tng lp Car
ptrCar->show(); // Phng thc ca lp Car

ptrCar = &myBus; // Tr n i tng lp Bus
ptrCar->show(); // Phng thc ca lp Bus
return;
}

Chng trnh 6.9 hin th kt qu thng bo nh sau:
This is a Ford having a speed of 100km/h and its price is $3000
This is a bus of type Mercedes, on the line 27, having a speed of
150km/h and its price is $5000
Dng th nht l kt qu khi con tr ptrCar tr n a ch ca i tng myCar, thuc lp Car
nn s gi phng thc show() ca lp Car vi cc d liu ca i tng myCar: (100, Ford,
Chng 6: Tnh k tha v a hnh

147
3000). Dng th hai tng ng l kt qu khi con tr ptrCar tr n a ch ca i tng myBus,
thuc lp Bus nn s gi phng thc show() ca lp Bus, cng vi cc tham s ca i tng
myBus: (150, Mercedes, 5000, 27).
Lu :
Trong trng hp lp dn xut khng nh ngha li phng thc tru tng, th chng
trnh s gi phng thc ca lp c s, nhng vi d liu ca lp dn xut.
V d, nu trong chng trnh 6.9, lp Bus khng nh ngha chng phng thc tru tng
show() th kt qu hin th s l hai dng thng bo ging nhau, ch khc nhau d liu ca hai
i tng khc nhau:
This is a Ford having a speed of 100km/h and its price is $3000
This is a Mercedes having a speed of 150km/h and its price is $5000
TNG KT CHNG 6
Ni dung chng 6 trnh by cc vn c bn lin quan n tha k v tng ng bi trong
C++ nh sau:
Khai bo mt lp dn xut k tha t mt lp c s bng khai bo k tha : i km vi
mt t kho dn xut.
C ba loi dn xut khc nhau, c quy nh bi ba t kho dn xut khc nhau: private,
protected v public. Kiu dn xut ph bin l dn xut public.
S k tha to ra mi quan h tng ng gia lp c s v lp dn xut: c th chuyn
kiu ngm nh (trong php gn, php truyn i s, php tr a ch) t mt i tng
lp c s n mt i tng lp dn xut. Nhng khng th chuyn kiu ngc li t lp
dn xut vo lp c s.
Hm khi to ca lp dn xut c th gi tng minh hoc gi ngm nh hm khi to
ca lp c s. Hm khi to lp c s bao gi cng c thc hin trc hm khi to
lp dn xut.
Hm hu b ca lp dn xut lun gi ngm nh hm hu b ca lp c s. Tri vi hm
khi to, hm hu b lp c s lun c thc hin sau hm hu b ca lp dn xut.
C th truy nhp cc phng thc ca lp c s t lp dn xut, phm vi truy nhp l ph
thuc vo kiu dn xut: private, protected hoc public. iu ny cho php s dng li m
ngun ca lp c s, m khng cn nh ngha li lp dn xut.
Trong lp dn xut, c th nh ngha chng mt s phng thc ca lp c s. Khi c
nh ngha chng, mun truy nhp vo phng thc lp c s, phi dng ton t phm vi
lp <Tn lp>::.
C++ cn cho php mt lp c th c dn xut t nhiu lp c s khc nhau, gi l a k
tha. Trong a k tha, quan h gia lp dn xut vi mi lp c s l tng t nh trong
n k tha.
Trong a k tha, hm khi to lp dn xut s gi tng minh (hoc ngm nh) hm
khi to cc lp c s, theo th t khai bo k tha. Hm hu b lp dn xut li gi
ngm nh cc hm hu b ca cc lp c s.
Chng 6: Tnh k tha v a hnh

148
C++ cung cp khi nim k tha t lp c s tru tng trnh trng hp trng lp d
liu lp dn xut, khi cc lp c s li cng c dn xut t mt lp khc.
C++ cng cho php c ch tng ng bi (a hnh) bng cch nh ngha mt phng
thc l tru tng trong s tha k. Khi , mt con tr lp c s c th tr n a ch
ca mt i tng lp dn xut, v phng thc c thc hin l tu thuc vo kiu ca
i tng m con tr ang tr ti.
CU HI V BI TP CHNG 6
1. Trong cc khai bo sau, khai bo no l ng c php k tha lp:
a. class A: public class B{};
b. class A: public B{};
c. class A: class B{};
d. class A:: public B{};
2. Trong cc kiu dn xut sau, t cc phng thc lp dn xut, khng th truy nhp n
cc thnh phn private ca lp c s:
a. private
b. protected
c. public
d. C ba kiu trn
3. Trong cc kiu dn xut sau, t i tng ca lp dn xut, c th truy nhp n cc thnh
phn ca lp c s:
a. private
b. protected
c. public
d. C ba kiu trn
4. A l lp dn xut public t lp c s B. Gi s c cc kiu khai bo:
A myA, *ptrA;
B myB, *ptrB;
Khi , cc lnh no sau y l khng c li:
a. myA = myB;
b. myB = myA;
c. ptrA = &myB;
d. ptrB = &myA;
e. ptrA = ptrB;
f. ptrB = ptrA;
5. A l lp dn xut public t lp c s B. Gi s c cc kiu khai bo v nguyn mu hm:
A myA;
B myB;
void show(A, B);
Chng 6: Tnh k tha v a hnh

149
Khi , cc lnh gi hm no sau y l khng c li:
a. show(myA, myA);
b. show(myA, myB);
c. show(myB, myA);
d. show(myB, myB);
6. A l lp dn xut public t lp c s B. Gi s B c mt hm khi to:
B(int, float);
Khi , nh ngha hm khi to no sau y ca lp A l chp nhn c:
a. A::A(){};
b. A::A(): B(){};
c. A::A(int x, float y): B(){};
d. A::A(int x, float y): B(x, y){};
7. A l lp dn xut public t lp c s B. Gi s B c hai hm khi to:
B();
B(int, float);
Khi , nhng nh ngha hm khi to no sau y ca lp A l chp nhn c:
a. A::A(){};
b. A::A(): B(){};
c. A::A(int x, float y): B(){};
d. A::A(int x, float y): B(x, y){};
8. A l lp dn xut public t lp c s B. Gi s B c hm hu b tng minh:
~B();
Khi , nhng nh ngha hm hu b no sau y ca lp A l chp nhn c:
a. A::~A(){};
b. A::~A(): ~B(){};
c. A::~A(int x){};
d. A::~A(int x): ~B(){};
9. Gi s B l mt lp c khai bo:
class B{
int x;
public: int getx();
};
v A l mt lp dn xut t lp B theo kiu private:
class A: private B{
};
khi , nu myA l mt i tng lp A, lnh no sau y l chp chn c:
a. myA.x;
b. myA.getx();
c. C hai lnh trn.
Chng 6: Tnh k tha v a hnh

150
d. Khng lnh no c.
10. Gi s B l mt lp c khai bo:
class B{
int x;
public: int getx();
};
v A l mt lp dn xut t lp B theo kiu protected:
class A: protected B{
};
khi , nu myA l mt i tng lp A, lnh no sau y l chp chn c:
a. myA.x;
b. myA.getx();
c. C hai lnh trn.
d. Khng lnh no c.
11. Gi s B l mt lp c khai bo:
class B{
int x;
public: int getx();
};
v A l mt lp dn xut t lp B theo kiu public:
class A: public B{
};
khi , nu myA l mt i tng lp A, lnh no sau y l chp chn c:
a. myA.x;
b. myA.getx();
c. C hai lnh trn.
d. Khng lnh no c.
12. Gi s B l mt lp c khai bo:
class B{
public: void show();
};
v A l mt lp dn xut t lp B theo kiu public, c nh ngha chng hm show():
class A: public B{
public: void show();
};
khi , nu myA l mt i tng lp A, mun thc hin phng thc show() ca lp B
th lnh no sau y l chp chn c:
a. myA.show();
b. myA.B::show();
c. B::myA.show();
Chng 6: Tnh k tha v a hnh

151
d. A::B::show();
13. Mun khai bo mt lp A k tha t hai lp c s B v C, nhng lnh no l ng:
a. class A: B, C{};
b. class A: public B, C{};
c. class A: public B, protected C{};
d. class A: public B, public C{};
14. B l mt lp c hai hm khi to:
B();
B(int);
C cng l mt lp c hai hm khi to:
C();
C(int, int);
V A l mt lp k tha t B v C:
class A: public B, public C{};
Khi , hm khi to no sau y ca lp A l chp nhn c:
a. A::A(){};
b. A::A():B(),C(){};
c. A::A(int x, int y): C(x, y){};
d. A::A(int x, int y, int z): B(x), C(y, z){};
e. A::A(int x, int y, int z): C(x, y), B(z){};
15. Mun khai bo lp A k tha t lp c s tru tng B, nhng khai bo no sau y l
ng:
a. virtual class A: public B{};
b. class virtual A: public B{};
c. class A: virtual public B{};
d. class A: public virtual B{};
16. Lp A l mt lp dn xut, c k tha t lp c s B. Hai lp ny u nh ngha hm
show(). Mun hm ny tr thnh tru tng th nhng nh ngha no sau y l ng:
a. void A::show(){} v void B::show(){}
b. virtual void A::show(){} v void B::show(){}
c. void A::show(){} v virtual void B::show(){}
d. virtual void A::show(){} v virtual void B::show(){}
17. Khai bo lp ngi (Human) bao gm cc thuc tnh sau:
Tn ngi (name)
Tui ca ngi (age)
Gii tnh ca ngi (sex)
Sau khai bo lp C nhn (Person) k tha t lp Human va c nh ngha trn.
Chng 6: Tnh k tha v a hnh

152
18. B sung cc phng thc truy nhp cc thuc tnh ca lp Human, cc phng thc ny
c tnh cht public.
19. B sung thm cc thuc tnh ca lp Person: a ch v s in thoi. Thm cc phng
thc truy nhp cc thuc tnh ny trong lp Person.
20. Xy dng hai hm khi to cho lp Human: mt hm khng tham s, mt hm vi ba
tham s tng ng vi ba thuc tnh ca n. Sau , xy dng hai hm khi to cho lp
Person c s dng cc hm khi to ca lp Human: mt hm khng tham s, mt hm
nm tham s (ng vi hai thuc tnh ca lp Person v ba thuc tnh ca lp Human).
21. Xy dng mt hm main, trong c yu cu nhp cc thuc tnh to mt i tng c
kiu Human v mt i tng c kiu Person, thng qua cc hm set thuc tnh xy
dng.
22. Xy dng hm show() cho hai lp Human v Person. Thay i hm main: dng mt i
tng c kiu lp Person, gi hm show() ca lp Person, sau li gi hm show() ca
lp Human t chnh i tng .
23. Khai bo thm mt lp ngi lao ng (Worker), k tha t lp Human, c thm thuc
tnh l s gi lm vic trong mt thng (hour) v tin lng ca ngi (salary). Sau ,
khai bo thm mt lp nhn vin (Employee) k tha ng thi t hai lp: Person v
Worker. Lp Employee c b sung thm mt thuc tnh l chc v (position).
24. Chuyn lp Human thnh lp c s tru tng ca hai lp Person v Worker. Xy dng
thm hai hm show() ca lp Worker v lp Employee. Trong hm main, khai bo mt i
tng lp Employee, sau gi n cc hm show() ca cc lp Employee, Person,
Worrker v Human.
25. Chuyn hm show() trong cc lp trn thnh phng thc tru tng. Trong hm main,
khai bo mt con tr kiu Human, sau , cho n tr n ln lt cc i tng ca cc
lp Human, Person, Worker v Employee, mi ln u gi phng thc show() hin th
thng bo ra mn hnh.
Chng 7: Mt s lp quan trng

153
CHNG 7
MT S LP QUAN TRNG

Ni dung chng ny tp trung trnh by mt s lp c bn trong C++:
Lp vt cha (Container)
Lp tp hp (Set)
Lp chui k t (String)
Lp ngn xp (Stack) v hng i (Queue)
Lp danh sch lin kt (Lists)
7.1 LP VT CHA
Lp vt cha (Container) bao gm nhiu lp c bn ca C++: lp Vector, lp danh sch (List) v
cc kiu hng i (Stack v Queue), lp tp hp (Set) v lp nh x (Map). Trong chng ny s
trnh by mt s lp c bn ca Container l: Set, Stack, Queue v List
7.1.1 Giao din ca lp Container
Cc lp c bn ca Container c mt s ton t v phng thc c chc nng ging nhau, bao
gm:
==: Ton t so snh bng
<: Ton t so snh nh hn
begin(): Gi tr khi u ca con chy iterator
end(): Gi tr kt thc ca con chy iterator
size(): S lng phn t i tng ca vt cha
empty(): Vt cha l rng
front(): Phn t th nht ca vt cha
back(): Phn t cui ca vt cha
[]: Ton t truy nhp n phn t ca vt cha
insert(): Thm vo vt cha mt (hoc mt s) phn t
push_back(): Thm mt phn t vo cui vt cha
push_front(): Thm mt phn t vo u vt cha
erase(): Loi b mt (hoc mt s) phn t khi vt cha
pop_back(): Loi b phn t cui ca vt cha
pop_front(): Loi b phn t u ca vt cha.
Ngoi ra, tu vo cc lp c th m c mt s ton t v phng thc c trng ca lp . Cc
ton t v phng thc ny s c trnh by chi tit trong ni dung tng lp tip theo.
Chng 7: Mt s lp quan trng

154
7.1.2 Con chy Iterator
Iterator l mt con tr tr n cc phn t ca vt cha. N ng vai tr l mt con chy cho php
ngi dng di chuyn qua tng phn t c mt trong vt cha. Mi php tng gim mt n v
ca con chy ny tng ng vi mt php dch n phn t tip theo hay phn t trc ca phn
t hin ti m con chy ang tr ti.
Khai bo con chy
C php chung khai bo mt bin con chy iterator nh sau:
Tn_lp<T>::iterator Tn_con_chy;
Trong :
Tn lp: l tn ca lp c bn ta ang dng, v d lp Set, lp List
T: l tn kiu lp ca cc phn t cha trong vt cha. Kiu c th l cc kiu c bn
trong C++, cng c th l cc kiu phc tp do ngi dng t nh ngha.
Tn con chy: l tn bin s c s dng lm bin chy trong vt cha.
V d:
Set<int>::iterator iter;
l khai bo mt bin con chy iter cho lp tp hp (Set), trong , cc phn t ca lp vt cha c
kiu c bn int. Hoc:
List<Person>::iterator iter;
l khai bo mt bin con chy iter cho lp danh sch (List), trong , cc phn t c kiu lp do
ngi dng t nh ngha l Person.
S dng con chy
Con chy c s dng khi cn duyt ln lt cc phn t c mt trong vt cha. V d sau s in
ra cc phn t c kiu int ca mt tp hp:
Set<int> mySet; // Khai bo mt i tng ca lp Set,
// cc phn t c kiu int
Set<int>::iterator i; // Khai bo con chy ca lp Set,
// cc phn t c kiu int
// Thm phn t vo
for(i=mySet.begin(); i<mySet.end(); i++)
cout << mySet[i] << ;
Lu :
Bin con chy phi c khi u bng phng thc begin() v kt thc bng phng
thc end() ca i tng cn duyt tng ng.
Mt con chy c th c s dng nhiu ln cho nhiu i tng nu chng c cng kiu
lp vt cha v cc phn t ca chng cng cng kiu.
Chng 7: Mt s lp quan trng

155
7.2 LP TP HP
Lp tp hp (Set) cha cc phn t c cng kiu, khng phn bit th t gia cc phn t nhng
li phn bit gia cc phn t: cc phn t l khc nhau tng i mt. Mun s dng lp tp hp,
phi c ch th u tp:
#include<set.h> // Th vin ring ca lp tp hp
hoc:
#include<stl.h> // Th vin chung cho cc lp vt cha
7.2.1 Hm khi to
Lp tp hp c ba kiu khi to chnh:
Khi to khng tham s:
Set<T> Tn_i_tng;
Khi to bng mt mng cc i tng phn t:
Set<T> Tn_i_tng(T*, chiu_di_mng);
Khi to bng mt i tng thuc lp tp hp khc:
Set<T> Tn_i_tng(Set<T>);
Trong :
T: l tn kiu ca cc phn t ca tp hp. Kiu ny c th l kiu c bn ca C++, cng
c th l cc kiu cu trc (struct) hoc lp (class) do ngi dng t nh ngha.
V d:
Set<int> mySet;
l khai bo mt i tng mySet ca lp tp hp, mySet khi u cha c phn t no, cc phn
t ca i tng ny c kiu c bn int. Hoc:
Person *myPerson = new Person[10]; // Khi to mng i tng
Set<Person> mySet(myPerson, 10); // Khai bo tp hp
l khai bo mt i tng mySet ca lp tp hp, c 10 phn t tng ng vi cc phn t trong
mng ng myPerson, cc phn t c kiu lp Person.
7.2.2 Ton t
Cc ton t trn lp tp hp l tng ng vi cc ton t s hc trn tp hp thng thng: OR
|, AND &, XOR ^ v php tr -.
Php ton | v |=
Php ton ny tr v php hp (OR) ca hai i tng ca lp tp hp, kt qu cng l mt i
tng ca lp tp hp:
<i_tng_1> = <i_tng_2> | <i_tng_3>;
<i_tng_1> |= <i_tng_2>;
V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 | mySet2;
th mySet3 s cha cc phn t kiu int l {1,2,3,4}.
Chng 7: Mt s lp quan trng

156
Php ton & v &=
Php ton ny tr v php giao (AND) gia hai i tng tp hp, kt qu cng l mt i tng
tp hp:
<i_tng_1> = <i_tng_2> & <i_tng_3>;
<i_tng_1> &= <i_tng_2>;
V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 & mySet2;
th mySet3 s cha cc phn t c kiu int l {2}.
Php ton ^ v ^=
Php ton ny tr v php hp ngoi (XOR) gia hai i tng tp hp, kt qu cng l mt i
tng tp hp:
<i_tng_1> = <i_tng _2> ^ <i_tng_3>;
<i_tng_1> ^= <i_tng_2>;
V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 ^ mySet2;
th mySet3 s cha cc phn t c kiu int l {1,3,4}.
Php ton - v -=
Php ton ny tr v php hiu (loi tr) gia hai i tng tp hp, kt qu cng l mt i
tng tp hp:
<i_tng_1> = <i_tng_2> - <i_tng_3>;
<i_tng_1> -= <i_tng_2>;
V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 - mySet2;
th mySet3 s cha cc phn t c kiu int l {1}.
7.2.3 Phng thc
Lp tp hp c mt s phng thc c bn sau:
Thm mt phn t vo tp hp
Loi mt phn t khi tp hp
Tm kim mt phn t trong tp hp
Thm mt phn t vo tp hp
C hai c php thm mt phn t vo tp hp:
pair<iterator, bool> insert(T&);
iterator insert(<V tr con chy>, T&);
Trong :
Chng 7: Mt s lp quan trng

157
Phng thc th nht thm mt phn t vo tp hp, nu phn t c mt trong tp hp,
tr v false v v tr con chy ca phn t . Nu phn t cha tn ti, tr v true v v tr
con chy ca phn t mi thm vo.
Phng thc th hai cng thm vo mt phn t, nhng ch kim tra xem phn t tn
ti hay cha bt u t v tr con chy c ch ra trong bin <v tr con chy>. Phng
thc ny tr v v tr con chy ca phn t mi thm vo (nu thnh cng) hoc v tr ca
phn t c mt.
V d, mySet l mt tp hp kiu int:
mySet.insert(10);
s thm mt phn t c gi tr 10 vo tp hp.
Lu :
Do tun th theo l thuyt tp hp, nn khi chn vo tp hp nhiu ln vi cng mt gi tr
phn t. Trong tp hp ch tn ti duy nht mt gi tr phn t , khng c trng lp.
Loi mt phn t khi tp hp
C ba c php loi b phn t khi tp hp:
int erase(T&);
void erase(<v tr con chy>);
void erase(<v tr bt u>, <v tr kt thc>);

Trong :
T: l tn kiu cc phn t ca tp hp.
Phng thc th nht xo phn t c gi tr c ch r trong tham s u vo.
Phng thc th hai loi b phn t v tr ca con chy c xc nh bi tham s u
vo.
Phng thc th ba loi b mt s phn t nm trong phm vi t <v tr bt u> cho n
<v tr kt thc> ca con chy.
V d, mySet l mt tp hp cc phn t c kiu int:
mySet.erase(10);
s xo phn t c gi tr 10, hoc:
mySet.erase((Set<int>::iterator)10);
s xo phn t v tr th 10 trong tp hp, hoc:
mySet.erase(mySet.begin(), mySet.end());
s xo ton b cc phn t hin c ca tp hp mySet.
Tm kim mt phn t trong tp hp
C hai c php tm kim mt phn t trong tp hp:
iterator find(T&);
int count(T&);
Trong :
Chng 7: Mt s lp quan trng

158
Phng thc th nht tm phn t c gi tr xc nh bi tham s u vo, kt qu l v tr
con chy ca phn t .
Phng th th hai ch kim tra xem phn t c xut hin trong tp hp hay khng: tr
v 1 nu c mt, tr v 0 nu khng c mt.
V d, mySet l mt tp hp cc phn t c kiu int:
Set<int>::iterator index = mySet.find(10);
cout << index;
s hin th v tr con chy ca phn t c gi tr 10 trong tp hp mySet.
7.2.4 p dng
Chng trnh 7.1 minh ho mt s thao tc trn mt tp hp cc phn t c kiu char: thm phn
t, loi b phn t, duyt cc phn t.

Chng trnh 7.1
#include<stdio.h>
#include<conio.h>
#include<set.h>
void main(){
clrscr();
Set<char> mySet;
int function;
do{
clrscr();
cout << CAC CHUC NANG: << endl;
cout << 1: Them mot phan tu vao tap hop << endl;
cout << 2: Loai bo mot phan tu khoi tap hop << endl;
cout << 3: Xem tat ca cac phan tu cua tap hop << endl;
cout << 5: Thoat! << endl;
cout << ===================================== << endl;
cout << Chon chuc nang: << endl;
cin >> function;
switch(function){
case 1: // Thm vo
char phantu;
cout << Ki tu them vao: ;
cin >> phantu;
mySet.insert(phantu);
break;
case 2: // Loi ra
char phantu;
cout << Loai bo ki tu: << endl;
cin >> phantu;
Chng 7: Mt s lp quan trng

159
mySet.erase(phantu);
break;
case 3: // Duyt
cout<<Cac phan tu cua tap hop la:<<endl;
Set<char>::iterator i;
for(i=mySet.begin(); i<mySet.end(); i++)
cout << mySet[i] << ;
break;
}while(function != 5);
return;
}

7.3 LP CHUI
Lp chui (String) cng l mt loi lp cha, n cha mt tp cc phn t l mt dy cc k t c
phn bit th t, cc phn t khng nht thit phi phn bit nhau. Mun s dng lp String, cn
thm vo ch th u tp:
#include <string.h>
7.3.1 Hm khi to
Lp String c ba hm khi to chnh:
Hm khi to khng tham s:
String <tn bin>;
Hm khi to t mt string khc:
String <tn bin>(const String &);
Hm khi to t mt mng cc k t:
String <tn bin>(char*, <chiu di mng>);
V d:
String myStr;
l khai bo mt chui myStr cha c phn t no (rng). Hoc:
String myStr(hello!);
l khai bo mt chui myStr c cc phn t theo th t l {h, e, l, l, o, !}. Hoc:
char* myChar = new char[10];
String myStr(myChar, 10);
l khai bo mt chui myStr c 10 phn t tng ng vi cc k t trong mng myChar.
Lu :
Trong trng hp khi to bng mt chui khc, ta c th truyn vo mt i s c kiu
c bn khc, trnh bin dch s t ng chuyn i s sang dng string.
V d:
String myStr(12);
Chng 7: Mt s lp quan trng

160
th chui myStr s cha hai phn t k t{1, 2}. Hoc:
String myStr(15.55);
th chui myStr s cha nm phn t k t {1, 5, ., 5, 5}.
7.3.2 Ton t
Lp String c cc ton t c bn l:
Php gn chui
Php cng chui
Php so snh chui
Php vo/ra
Php gn chui =
C php php gn chui l tng t c php gn cc i tng c bn:
<Tn bin 1> = <Tn bin 2>;
V d:
String s1(12), s2;
s2 = s1;
th chui s2 cng cha hai phn t nh s1 {1, 2}.
Lu :
C th gn trc tip cc i tng c bn cho chui:
String myStr = 12; // myStr c hai phn t {1, 2}
Nhng php gn li c u tin thp hn php ton hc:
String myStr = 12+1.5; // tng ng myStr = 13.5
Php cng chui + v +=
Php cng chui s ni chui th hai vo sau chui th nht, kt qu cng l mt chui:
<Tn bin 1> = <Tn bin 2> + <Tn bin 3>;
<Tn bin 1> += <Tn bin 2>;
V d:
String s1(12), s2(3);
s1+= s2;
th s1 s c ba phn t k t {1, 2, 3}.
Php so snh chui
Cc php so snh chui u l cc php ton hai ngi, tr v kt qu dng bool (true/false):
Php so snh ln hn >: chui_1 > chui_2;
Php so snh ln hn hoc bng >=: chui_1 >= chui_2;
Php so snh nh hn <: chui_1 < chui_2;
Php so snh nh hn hoc bng <=: chui_1 <= chui_2;
Chng 7: Mt s lp quan trng

161
Php so snh bng ==: chui_1 == chui_2;
Php so snh khc (khng bng) !=: chui_1 != chui_2;
Lu :
Php so snh chui thc hin so snh m ASCII ca tng k t hai chui theo th t
tng ng cho n khi c s khc nhau u tin gia hai k t.
Php so snh l php so snh da trn t in, c phn bit ch hoa v ch thng.
V d:
12 < a; // c gi tr ng
a <= A; // c gi tr sai
Php vo/ra
Php xut ra <<: cout << bin_chui;
Php nhp vo >>: cin >> bin_chui;
V d:
String s(hello!);
cout << s;
s in ra mn hnh dng ch hello!.
7.3.3 Phng thc
Lp chui c mt s phng thc c bn:
Ly chiu di chui
Tm mt chui con
Thm mt chui con
Xo mt chui con
Chuyn kiu k t
Ly chiu di chui
C php:
<bin_chui>.length();
tr v chiu di ca chui (s lng phn t k t trong chui).
V d:
String s(hello!);
cout << s.length();
s in ra mn hnh di chui s l 6.
Tm mt chui con
C php:
<bin_chui>.find(<Chui con>, <V tr bt u>, <Kiu so khp>);
Trong :
Chng 7: Mt s lp quan trng

162
Tham s th nht l chui con cn tm.
Tham s th hai l v tr bt u tm, mc nh l bt u tm t phn t c ch s 0.
Tham s th ba ch ra cch so khp c phn bit ch hoa vi ch thng: SM_IGNORE
l khng phn bit, SM_SENSITIVE l c phn bit.
Phng thc ny tr v kt qu dng bool, tng ng l c tm thy hay khng.

V d:
s.find(12, 0, SM_IGNORE);
s tm trong chui s xem c s xut hin ca chui 12 hay khng, v tr bt u tm l 0, vi
cch tm khng phn bit ch hoa ch thng.
Thm mt chui con
C php:
<bin_chui>.insert(<v tr chn>, <chui con>);
Trong :
Tham s th nht l v tr ch s m ti , chui con s c chn vo
Tham s th hai l chui con cn chn, chui con ny cng c th l mt k t.
V d:
s.insert(0, 12);
s chn vo u chui s mt chui con c hai phn t 12.
Xo mt chui con
C php:
<bin_chui>.delete(<v tr bt u>, < di chui xo>);
Trong :
Tham s th nht l v tr bt u xo chui con
Tham s th hai l di chui con b xo, gi tr mc nh l 1.
V d:
s.delete(0, 2);
s xo hai k t u ca chui s.
Chuyn kiu k t
i chui thnh cc k t hoa: <bin_chui>.toUpper();
i chui thnh cc k t thng: <bin_chui>.toLower();
V d:
s.toUpper(); // chuyn chui s thnh k t hoa
s.toLower(); // chuyn chui s thnh k t thng
Chng 7: Mt s lp quan trng

163
7.3.4 p dng
Chng trnh 7.2 minh ho mt s thao tc c bn trn lp chui, c s dng th vin lp chui
chun ca C++: cng thm mt chui, chn thm mt chui con, xo mt chui con, tm mt
chui con

Chng trnh 7.2
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main(){
clrscr();
String myStr;
int function;
do{
clrscr();
cout << CAC CHUC NANG: << endl;
cout << 1: Cong them mot chuoi << endl;
cout << 2: Chen them mot chuoi << endl;
cout << 3: Xoa di mot chuoi << endl;
cout << 4: Tim mot chuoi con << endl;
cout << 5: Chuyen thanh chu hoa << endl;
cout << 6: Chuyen thanh chu thuong << endl;
cout << 7: Xem noi dung chuoi << endl;
cout << 8: Xem chieu dai chuoi << endl;
cout << 9: Thoat! << endl;
cout << ===================================== << endl;
cout << Chon chuc nang: << endl;
cin >> function;
switch(function){
case 1: // Thm vo cui
String subStr;
cout << Chuoi them vao: ;
cin >> subStr;
myStr += subStr;
break;
case 2: // Chn vo chui
String subStr;
int position;
cout << Chuoi them vao: ;
cin >> subStr;
cout << Vi tri chen:;
cin >> position;
Chng 7: Mt s lp quan trng

164
myStr.insert(position, subStr);
break;
case 3: // Xo i mt chui con
int position, count;
cout << Vi tri bat dau xoa:;
cin >> position;
cout << Do dai xoa:;
cin >> count;
myStr.delete(position, count);
break;
case 4: // Tm chui con
String subStr;
int position;
cout << Chuoi con can tim:;
cin >> subStr;
cout << Vi tri bat dau tim:;
cin >> position;
if(myStr.find(position, subStr))
cout << Co xuat hien! << endl;
else
cout << Khong xuat hien! << endl;
break;
case 5: // Chuyn thnh ch hoa
myStr.toUpper();
cout << myStr << endl;
break;
case 6: // Chuyn thnh ch thng
myStr.toLower();
cout << myStr << endl;
break;
case 7: // Duyt
cout << Noi dung chuoi: << endl;
cout << myStr << endl;
break;
case 8: // Duyt
cout << Chieu dai chuoi:
<< myStr.length() << endl;
break;
}while(function != 9);
return;
}

Chng 7: Mt s lp quan trng

165
7.4 LP NGN XP V HNG I
7.4.1 Lp ngn xp
Lp ngn xp (stack) cng l mt loi lp vt cha, n cha cc phn t cng kiu, khng bt
buc phi phn bit nhau nhng c phn bit v th t: cc thao tc thm phn t v ly phn t
ra u c thc hin mt u ngn xp. Phn t no c thm vo trc th s b ly ra sau.
Mun dng lp Stack phi dng ch th u tp:
#include<stack.h>
Hm khi to
Lp Stack c hai cch khi to:
Khi to khng tham s:
Stack<T> bin_ngn_xp;
Khi to bng mt ngn xp khc, c cng kiu phn t:
Stack<T> bin_ngn_xp(Stack<T>);
Trong :
T: l kiu ca cc phn t cha trong ngn xp. T c th l cc kiu c bn, cng c th l
cc kiu phc tp do ngi dng t nh ngha.
V d:
Stack<int> myStack;
l khai bo mt bin myStack, cha cc phn t c kiu c bn int.
Ton t
Lp Stack ch dng n cc ton t gn = v ton t so snh bng ==:
Php gn =:
<ngn xp 1> = <ngn xp 2>;
Dng gn hai i tng ngn xp.
Php so snh bng ==:
<ngn xp 1> == <ngn xp 2>;
Dng kim tra xem hai i tng ngn xp c bng nhau hay khng. Kt qu tr v c
kiu bool (true/false).
Phng thc
Thm mt phn t:
<bin ngn xp>.push(T);
s thm mt phn t c kiu T vo nh ngn xp.
Loi mt phn t:
<bin ngn xp>.pop();
s tr v phn t ang nm nh ngn xp.
Kim tra tnh rng:
Chng 7: Mt s lp quan trng

166
<bin ngn xp>.empty();
s tr v kt qu kiu bool, tng ng vi trng thi ca ngn xp c rng hay khng.
Kch thc ngn xp:
<bin ngn xp>.size();
s tr v s lng cc phn t hin ang c mt trong ngn xp.
p dng
Trong phn ny, ta s vit li chng trnh 3.4c c minh ho trong phn vit v cu trc
ngn xp (chng 3). Nhng thay v phi nh ngha cu trc ngn xp, ta dng lp ngn xp ca
th vin C++: o ngc mt xu k t c nhp vo t bn phm.

Chng trnh 7.3
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack.h>

void main(){
clrscr();
Stack<char> myStack;
char strIn[250];
cout << Nhap chuoi: ;
cin >> strIn; // Nhp chui k t t bn phm
for(int i=0; i<strlen(strIn); i++) // t vo ngn xp
myStack.push(strIn[i]);
while(!myStack.empty()) // Ly ra t ngn xp
cout << myStack.pop();
return;
}

7.4.2 Lp hng i
Lp hng i (queue) cng l mt loi lp vt cha, n cha cc phn t cng kiu, khng bt
buc phi phn bit nhau nhng c phn bit v th t: cc thao tc thm phn t c thc hin
mt u, cc thao tc ly phn t ra c thc hin mt u cn li ca hng i. Phn t no
c thm vo trc th s b ly ra trc.
Mun dng lp Queue phi dng ch th u tp:
#include<queue.h>
Hm khi to
Lp Queue c hai cch khi to:
Chng 7: Mt s lp quan trng

167
Khi to khng tham s:
Queue<T> bin_hng_i;
Khi to bng mt hng i khc, c cng kiu phn t:
Queue<T> bin_hng_i(Queue<T>);
Trong :
T: l kiu ca cc phn t cha trong hng i. T c th l cc kiu c bn, cng c th l
cc kiu phc tp do ngi dng t nh ngha.
V d:
Queue<int> myQueue;
l khai bo mt bin myQueue, cha cc phn t c kiu c bn int.
Ton t
Lp Queue ch dng n cc ton t gn = v ton t so snh bng ==:
Php gn =:
<hng i 1> = <hng i 2>;
Dng gn hai i tng hng i.
Php so snh bng ==:
<hng i 1> == <hng i 2>;
Dng kim tra xem hai i tng hng i c bng nhau hay khng. Kt qu tr v c kiu
bool (true/false).
Phng thc
Thm mt phn t:
<bin hng i>.push(T);
s thm mt phn t c kiu T vo cui hng i.
Loi mt phn t:
<bin hng i>.pop();
s tr v phn t ang nm nh u hng i.
Kim tra tnh rng:
<bin hng i>.empty();
s tr v kt qu kiu bool, tng ng vi trng thi ca hng i c rng hay khng.
Kch thc hng i:
<bin hng i>.size();
s tr v s lng cc phn t hin ang c mt trong hng i.
p dng
Trong phn ny, ta s ci t li chng trnh trong phn cu trc hng i (chung 3). Nhng
thay v phi t nh ngha cu trc hng i, ta dng lp Queue ca th vin C++ m phng
chng trnh qun l tin trnh ca h iu hnh.

Chng 7: Mt s lp quan trng

168
Chng trnh 7.4
#include<stdio.h>
#include<conio.h>
#include<queue.h>

void main(){
clrscr();
Queue<int> myQueue;
int function;
do{
clrscr();
cout << CAC CHUC NANG: << endl;
cout << 1: Them mot tien trinh vao hang doi << endl;
cout << 2: Dua mot tien trinh trinh vao thuc hien << endl;
cout<<3: Xem tat ca cac tien trinh trong hang doi<< endl;
cout << 5: Thoat! << endl;
cout << ======================================== << endl;
cout << Chon chuc nang: << endl;
cin >> function;
switch(function){
case 1: // Thm vo hng i
int maso;
cout << Ma so tien trinh vao hang doi: ;
cin >> maso;
myQueue.push(maso);
break;
case 2: // Ly ra khi hng i
cout << Tien trinh duoc thuc hien: <<
myQueue.pop() << endl;
break;
case 3: // Duyt hng i
Queue<int>::iterator i;
for(i=myQueue.begin(); i<myQueue.end(); i++)
cout << myQueue[i] << ;
break;
}while(function != 5);
return;
}

Chng 7: Mt s lp quan trng

169
7.5 LP DANH SCH LIN KT
Lp danh sch lin kt (List) cng l mt kiu lp vt cha, n cha cc phn t cng kiu, c
tnh n th t. Mun s dng lp List ca th vin C++, phi khai bo ch th u tp:
#include<list.h> // Dnh ring cho lp List
hoc:
#include<stl.h> // Dng chung cho cc lp vt cha
7.5.1 Hm khi to
Lp List c ba kiu khi to:
Khi to khng tham s:
List<T> bin_danh_sch;
Khi to t mt danh sch cng kiu:
List<T> bin_danh_sch(List<T>);
Khi to t mt mng cc phn t:
List<T> bin_danh_sch(T* <Mng phn t>, int <chiu di mng>);
Trong :
T: l kiu ca cc phn t cha trong danh sch lin kt. T c th l cc kiu c bn, cng
c th l cc kiu phc tp do ngi dng t nh ngha.
V d:
List<int> myList;
s khai bo mt danh sch lin kt myList, cc phn t ca n c kiu c bn int.
7.5.2 Ton t
Ton t gn =
C php:
<danh sch 1> = <danh sch 2>;
s copy ton b cc phn t ca <danh sch 2> vo <danh sch 1>.
Ton t so snh bng ==
C php:
<danh sch 1> = <danh sch 2>;
s tr v mt gi tr kiu bool, tng ng vi vic hai danh sch ny c bng nhau hay khng.
Vic so snh c tin hnh trn tng phn t v tr tng ng nhau.
Lu :
Ngoi ra cn c cc php ton so snh khc cng c th thc hin trn danh sch: <, >,
<=, >=, !=.
Chng 7: Mt s lp quan trng

170
7.5.3 Phng thc
Thm mt phn t vo danh sch
C php:
<bin danh sch>.insert(<v tr chn>, <phn t>);
<bin danh sch>.push_front(<phn t>);
<bin danh sch>.push_back(<phn t>);
Trong :
Phng thc th nht chn mt phn t vo mt v tr bt k ca danh sch, v tr chn
c ch ra bi tham s th nht.
Phng thc th hai chn mt phn t vo u danh sch
Phng thc th ba chn mt phn t vo cui danh sch.
V d:
List<int> myList;
myList.push_front(7);
s chn vo u danh sch myList mt phn t c gi tr l 7.
Xo i mt phn t
C php:
<bin danh sch>.erase(<v tr xo>);
<bin danh sch>.pop_front();
<bin danh sch>.pop_back();
Trong :
Phng thc th nht xa mt phn t mt v tr bt k ca danh sch, v tr xo c
ch ra bi tham s th nht.
Phng thc th hai xo mt phn t u danh sch
Phng thc th ba xo mt phn t cui danh sch.
V d:
List<int> myList;
cout << myList.pop_front();
s in ra mn hnh phn t u ca danh sch myList.
Kim tra tnh rng ca danh sch
C php:
<bin danh sch>.empty();
tr v gi tr bool, tng ng vi trng thi hin ti ca bin danh sch l rng hay khng.
Xem kch thc danh sch
C php:
<bin danh sch>.size();
V d:
Chng 7: Mt s lp quan trng

171
cout << myList.size();
s in ra mn hnh kch c (s lng cc phn t) ca danh dch.
Xem ni dung mt phn t
C php:
<bin danh sch>.get();
<bin danh sch>.next();
Trong :
Phng thc th nht tr v phn t v tr hin ti ca con chy
Phng thc th hai tr v phn t tip theo, v con chy cng di chuyn sang phn t .
V d:
List<int> myList;
cout << myList.get();
s in ra mn hnh ni dung phn t th nht ca danh sch myList.
7.5.4 p dng
Trong phn ny, ta ci t li chng trnh 3.6c c trnh by trong phn cu trc danh sch
lin kt (chng 3). Nhng thay v t to danh sch lin kt, ta dng lp List trong th vin ca
C++ qun l nhn vin vn phng.

Chng trnh 7.5
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<list.h>

typedef struct{
char name[25]; // Tn nhn vin
int age; // Tui nhn vin
float salary; // Lng nhn vin
} Employee;
void main(){
clrscr();
List<Employee> myList;
int function;
do{
clrscr();
cout << CAC CHUC NANG: << endl;
cout << 1: Them mot nhan vien << endl;
cout << 2: Xoa mot nhan vien << endl;
cout << 3: Xem tat ca cac nhan vien trong phong << endl;
Chng 7: Mt s lp quan trng

172
cout << 5: Thoat! << endl;
cout << ======================================= << endl;
cout << Chon chuc nang: << endl;
cin >> function;
switch(function){
case 1: // Thm vo ds
int position;
Employee employee;
cout << Vi tri can chen: ;
cin >> position;
cout << Ten nhan vien: ;
cin >> employee.name;
cout << Tuoi nhan vien: ;
cin >> employee.age;
cout << Luong nhan vien: ;
cin >> employee.salary;
myList.insert(position, employee);
break;
case 2: // Ly ra khi ds
int position;
cout << Vi tri can xoa: ;
cin >> position;
Employee result = myList.erase(position);
if(result != NULL){
cout << Nhan vien bi loai: endl;
cout << Ten: << result.name << endl;
cout << Tuoi: << result.age << endl;
cout << Luong: << result.salary << endl;
}
break;
case 3: // Duyt ds
cout << Cac nhan vien cua phong: << endl;
Employee result = myList.front();
do{
cout << result.name <<
<< result.age <<
<< result.salary << endl;
result = myList.next();
}while(result != NULL);
break;
}while(function != 5);
return;
}
Chng 7: Mt s lp quan trng

173
TNG KT CHNG 7
Ni dung chng 7 trnh by mt s lp c bn ca lp vt cha (Container) trong th vin
ca C++:
Lp tp hp (Set)
Lp chui (String)
Lp ngn xp (Stack)
Lp hng i (Queue)
Lp danh sch lin kt (List)
Hu ht cc lp vt cha ny u c th cha cc phn t vi kiu bt k: c th l kiu c bn,
cng c th l kiu phc tp do ngi dng t nh ngha. Ngoi tr lp chui, ch cha cc phn
t c kiu char.
Cc lp vt cha ny c mt s phng thc tng t nhau, nhng cch thc hin li khc nhau:
Thm vo mt phn t
Ly ra mt phn t
Kim tra tnh rng
Kim tra s lng phn t.
Ngi dng c th p dng cc lp c sn trong th vin ny ca C++ gii quyt cc bi ton
khc nhau m khng phi t nh ngha li cc lp.
CU HI V BI TP CHNG 7
1. Dng th vin lp stack kim tra mt s t nhin nhp vo t bn phm c phi l mt
s parlindom hay khng: Mt s t nhin l parlindom nu i ngc th t cc ch s, ta
vn thu c chnh s , v d, 87278 l mt s nh vy.
2. Vit li chng trnh 7.1 dng lp tp hp, nhng dng kiu ca cc phn t l lp Car
c nh ngha trong chng 5.
3. Dng th vin lp String vit chng trnh chia nh mt chui ban u thnh mt s
chui con, ranh gii phn chia l mt chui con c nhp vo t bn phm. V d abc
acb, m chia nh theo chui con c s thu c cc chui: ab, ca, cb.
4. Dng th vin lp String vit chng trnh thay th cc chui con ca mt chui ban
u bng mt chui con khc. Cc chui con c nhp t bn phm.
5. Vit li chng trnh 7.5 , vn dng th vin lp List, nhng thay th kiu phn t bng
kiu lp Car c nh ngha trong chng 5.

Hng dn tr li cu hi v n tp

174
HNG DN TR LI CU HI V BI TP
Chng 1

Chng 2
1. c v e.
2. a v d.
3. c.
4. b.
5. c.
6. c.
7. d.
8. b v c.
9. b.
10. c.
11. d.
12. c.
13. d.
Chng 3
1. a.
2. c.
3. a.
4. b.
5. b v d.
6. Gi :
struct Subject{
char subject[20];
float note;
};
Hoc:
typedef struct {
char subject[20];
float note;
}Subject;
7. Gi :
typedef struct {
char name[20];
Hng dn tr li cu hi v n tp

175
int age;
char class[20];
Subject* subjects;
char type[20];
}Student;
Chng 4
1. a.
2. b.
3. c.
4. a.
5. a.
6. b.
7. c.
8. d.
9. a.
10. b.
11. c.
Chng 5
1. a v c.
2. b.
3. d.
4. a, b v c.
5. c.
6. b v c.
7. b v c.
8. b, d v e.
9. c v d.
10. a v d.
11. a, b, c v d.
12. Gi (t bi 12 n bi 17):
class Employee{
char* name;
int age;
float salary;
public:
Employee();
Employee(char* nameIn=, int ageIn=18, float
salaryIn=100);
Hng dn tr li cu hi v n tp

176
void setName(char*);
char* getName();
void setAge(int);
int getAge();
void setSalary(float);
float getSalary();
void show();
~Employee();
};
Chng 6
1. b.
2. d.
3. c.
4. b, d v f.
5. b v d.
6. d.
7. a, b, c v d.
8. a v c.
9. d.
10. d.
11. b.
12. b.
13. c v d.
14. a, b, c v d.
15. c v d.
16. b v c.
17. Gi (t bi 17 n bi 25):
class Human{
char* name;
int age;
int sex;
public:
Human();
Human(char*, int, int);
void setName(char*);
char* getName();
void setAge(int);
int getAge();
void setSex(int);
Hng dn tr li cu hi v n tp

177
int getSex();
void show();
~Human();
};
class Person: public virtual Human{
char* address;
char* phone;
public:
Person();
Person(char*, int, int, char*, char*);
void setAddress(char*);
char* getAddress();
void setPhone(char*);
char* getPhone();
void show();
~Person();
};
class Worker: public virtual Human{
int hour;
float salary;
public:
Worker();
Worker(int, float);
void setHour(int);
int getHour();
void setSalary(float);
float getSalary();
void show();
};
class Employee: public Person, public Worker{
char* position;
public:
Employee();
Employee(char*, int, int, char*, char*, int, float,
char*);
void setPosition(char*);
char* getPosition();
void virtual show();
~Employee();
};
Chng 7
2. Gi
Hng dn tr li cu hi v n tp

178
void main(){
clrscr();
Set<Car> mySet;
int function;
do{
clrscr();
cout << CAC CHUC NANG: << endl;
cout << 1: Them mot phan tu vao tap hop << endl;
cout << 2: Loai bo mot phan tu khoi tap hop << endl;
cout << 3: Xem tat ca cac phan tu cua tap hop << endl;
cout << 5: Thoat! << endl;
cout << =========================================== << endl;
cout << Chon chuc nang: << endl;
cin >> function;
switch(function){
case 1: // Thm vo
Car car = new Car();
cout << O to them vao: << endl;
cout << Toc do: ;
int speed;
cin >> speed;
car.setSpeed(speed);
cout << Nhan hieu:;
char[] mark;
cin >> mark;
car.setMark(mark);
float price;
cout << Gia xe:;
cin >> price;
car.setPrice(price);
mySet.insert(car);
break;
case 2: // Loi ra
Set<Car>::iterator index;
cout << Loai bo xe o vi tri: ;
cin >> index;
if(index >= mySet.begin())&&(index < mySet.end())
mySet.erase(mySet[index]);
break;
case 3: // Duyt
cout<<Cac phan tu cua tap hop la:<<endl;
Set<char>::iterator i;
for(i=mySet.begin(); i<mySet.end(); i++){
cout << mySet[i].getSpeed() << ;
cout << mySet[i].getMark() << ;
cout << mySet[i].getPrice() << ;
}
Hng dn tr li cu hi v n tp

179
break;
}while(function != 5);
return;
}
5. Gi
void main(){
clrscr();
List<Car> myList;
int function;
do{
clrscr();
cout << CAC CHUC NANG: << endl;
cout << 1: Them mot xe o to << endl;
cout << 2: Xoa mot xe o to << endl;
cout << 3: Xem tat ca cac o to << endl;
cout << 5: Thoat! << endl;
cout << ======================================= << endl;
cout << Chon chuc nang: << endl;
cin >> function;
switch(function){
case 1: // Thm vo ds
int possition;
Car car = new Car();
cout << Vi tri can chen: ;
cin >> possition;
cout << Toc do: ;
int speed;
cin >> speed;
car.setSpeed(speed);
cout << Nhan hieu:;
char[] mark;
cin >> mark;
car.setMark(mark);
float price;
cout << Gia xe:;
cin >> price;
car.setPrice(price);
myList.insert(possition, car);
break;
case 2: // Ly ra khi ds
int possition;
cout << Vi tri can xoa: ;
cin >> possition;
Car result = myList.erase(possition);
if(result != NULL){
cout << O to bi loai: endl;
cout<<Toc do:<<result.getSpeed()<<endl;
Hng dn tr li cu hi v n tp

180
cout << Nhan hieu: << result.getMark()
<< endl;
cout<<Gia: <<result.getPrice()<<endl;
}
break;
case 3: // Duyt ds
cout << Cac o to hien co: << endl;
Car result = myList.front();
do{
cout << result.getSpeed() <<
<< result.getMark() <<
<< result.getPrice() << endl;
result = myList.next();
}while(result != NULL);
break;
}while(function != 5);
return;
}
Ti liu tham kho

181
TI LIU THAM KHO
Ti liu ting Anh
[1] James P. Cohoon and Jack W.Davidson, C++ Program Design An Introduction to
Programming and Object-Oriented Design, 2
nd
edition, WCB McGraw-Hill, 1999.
[2] Nell Dale, Chip Weems and Mark Headington, Programming and Problem Solving with
C++, John & Barlett Publisher, 1996.
[3] Michael T. Goodrich, Roberto Tamassia and David Mount, Data Structures and Algorithms
in C++, John Wiley & Sons Inc, 2004.
[4] Scott R.Ladd, C++ Components and Algorithms. 2
nd
edition. . M&T Books, 1994.
[5] Scott R.Ladd, C++ Templates and Tools, M&T Books, 1994
[6] Robert Lafore, Object Oriented Programming in C++, Fourth edition, SAMS, 2001.
Ti liu ting Vit
[1] L . Hng, T T. Anh, Nguyn H. c v Nguyn T. Thu, Lp trnh hng i tng
vi C++, NXB Khoa hc v K thut, 2005.
[2] Nguyn T. Thu, T T. Anh, Nguyn Q. Huy v Nguyn H. c, Bi tp lp trnh hng
i tng vi C++, NXB Khoa hc v K thut, 2004.
Cc a ch web
1. http://www.angelfire.com/country/aldev0/cpphowto/
2. http://www.gnacademy.org/text/cc/Tutorial/tutorial.html
3. http://sophia.dtp.fmph.uniba.sk/cpptut/tutorial.us.html
4. http://www.brpreiss.com/books/opus4/html/book.html
5. http://www.fredosaurus.com/notes-cpp/index.html


Mc lc

182
MC LC
GII THIU .....................................................................................................................................3
CHNG 1.......................................................................................................................................5
GII THIU V CC PHNG PHP LP TRNH...................................................................5
1.1 LP TRNH TUYN TNH...................................................................................................5
1.2 LP TRNH HNG CU TRC.......................................................................................5
1.2.1 c trng ca lp trnh hng cu trc............................................................................5
1.2.2 Phng php thit k trn xung (top-down) ..................................................................6
1.3 LP TRNH HNG I TNG.....................................................................................7
1.3.1 Lp trnh hng i tng...............................................................................................7
1.3.2 Mt s khi nim c bn..................................................................................................8
1.3.3 Lp trnh hng i tng trong C++ .............................................................................9
TNG KT CHNG 1............................................................................................................10
CHNG 2.....................................................................................................................................11
CON TR V MNG ...................................................................................................................11
2.1 KHI NIM CON TR.......................................................................................................11
2.1.1 Khai bo con tr.............................................................................................................11
2.1.2 S dng con tr..............................................................................................................11
2.2 CON TR V MNG.........................................................................................................14
2.2.1 Con tr v mng mt chiu............................................................................................14
2.2.2 Con tr v mng nhiu chiu .........................................................................................17
2.3 CON TR HM...................................................................................................................18
2.4 CP PHT B NH NG...............................................................................................20
2.4.1 Cp pht b nh ng cho bin .....................................................................................21
2.4.2 Cp pht b nh cho mng ng mt chiu...................................................................22
2.4.3 Cp pht b nh cho mng ng nhiu chiu................................................................23
TNG KT CHNG 2............................................................................................................25
CU HI V BI TP CHNG 2........................................................................................26
CHNG 3.....................................................................................................................................30
KIU D LIU CU TRC.........................................................................................................30
3.1 NH NGHA CU TRC..................................................................................................30
3.1.1 Khai bo cu trc ...........................................................................................................30
3.1.2 Cu trc lng nhau.........................................................................................................31
3.1.3 nh ngha cu trc vi t kho typedef........................................................................32
3.2 THAO TC TRN CU TRC..........................................................................................33
3.2.1 Khi to gi tr ban u cho cu trc .............................................................................33
3.2.2 Truy nhp n thuc tnh ca cu trc...........................................................................34
3.3 CON TR CU TRC V MNG CU TRC...............................................................38
3.3.1 Con tr cu trc..............................................................................................................38
3.3.2 Mng cu trc ................................................................................................................41
3.4 MT S KIU D LIU TRU TNG.........................................................................44
3.4.1 Ngn xp........................................................................................................................45
3.4.2 Hng i.........................................................................................................................48
3.4.3 Danh sch lin kt ..........................................................................................................53
TNG KT CHNG 3............................................................................................................60
CU HI V BI TP CHNG 3........................................................................................60
CHNG 4.....................................................................................................................................64
Mc lc

183
VO RA TRN TP ..................................................................................................................... 64
4.1 KHI NIM TP................................................................................................................. 64
4.1.1 Tp d liu .................................................................................................................... 64
4.1.2 Tp vn bn................................................................................................................... 65
4.1.3 Tp nh phn.................................................................................................................. 65
4.2 VO RA TRN TP........................................................................................................... 66
4.2.1 Vo ra tp vn bn bng >> v <<......................................................................... 66
4.2.2 Vo ra tp nh phn bng read v write......................................................................... 70
4.3 TRUY NHP TP TRC TIP.......................................................................................... 74
4.3.1 Con tr tp tin ............................................................................................................... 74
4.3.2 Truy nhp v tr hin ti ca con tr tp........................................................................ 74
4.3.3 Dch chuyn con tr tp ................................................................................................ 76
TNG KT CHNG 4........................................................................................................... 78
CU HI V BI TP CHNG 4....................................................................................... 79
CHNG 5.................................................................................................................................... 82
LP ................................................................................................................................................ 82
5.1 KHI NIM LP I TNG......................................................................................... 82
5.1.1 nh ngha lp i tng.............................................................................................. 82
5.1.2 S dng lp i tng................................................................................................... 83
5.2 CC THNH PHN CA LP......................................................................................... 83
5.2.1 Thuc tnh ca lp ........................................................................................................ 84
5.2.2 Phng thc ca lp ..................................................................................................... 85
5.3 PHM VI TRUY NHP LP............................................................................................. 90
5.3.1 Phm vi truy nhp lp................................................................................................... 90
5.3.2 Hm bn ........................................................................................................................ 91
5.3.3 Lp bn ......................................................................................................................... 96
5.4 HM KHI TO V HU B......................................................................................... 97
5.4.1 Hm khi to................................................................................................................. 97
5.4.2 Hm hy b................................................................................................................. 101
5.5 CON TR I TNG V MNG I TNG........................................................ 103
5.5.1 Con tr i tng........................................................................................................ 103
5.5.2 Mng cc i tng..................................................................................................... 106
TNG KT CHNG 5......................................................................................................... 110
CU HI V BI TP CHNG 5..................................................................................... 110
CHNG 6.................................................................................................................................. 115
TNH K THA V A HNH................................................................................................. 115
6.1 KHI NIM K THA.................................................................................................... 115
6.1.1 Khai bo tha k ......................................................................................................... 115
6.1.2 Tnh cht dn xut....................................................................................................... 116
6.2 HM KHI TO V HU B TRONG K THA...................................................... 117
6.2.1 Hm khi to trong k tha......................................................................................... 117
6.2.2 Hm hy b trong k tha........................................................................................... 119
6.3 TRUY NHP TI CC THNH PHN TRONG K THA LP ............................... 120
6.3.1 Phm vi truy nhp ....................................................................................................... 120
6.3.2 S dng cc thnh phn ca lp c s t lp dn xut ............................................... 122
6.3.3 nh ngha chng cc phng thc ca lp c s...................................................... 125
6.3.4 Chuyn i kiu gia lp c s v lp dn xut......................................................... 128
6.4 A K THA ................................................................................................................... 131
6.4.1 Khai bo a k tha..................................................................................................... 131
6.4.2 Hm khi to v hm hu b trong a k tha ........................................................... 132
6.4.3 Truy nhp cc thnh phn lp trong a k tha.......................................................... 134
Mc lc

184
6.5 LP C S TRU TNG.............................................................................................138
6.5.1 t vn ....................................................................................................................138
6.5.2 Khai bo lp c s tru tng .....................................................................................138
6.5.3 Hm khi to lp c s tru tng..............................................................................139
6.6 A HNH............................................................................................................................143
6.6.1 t vn ....................................................................................................................143
6.6.2 Khai bo phng thc tru tng................................................................................144
6.6.3 S dng phng thc tru tng a hnh.................................................................144
TNG KT CHNG 6..........................................................................................................147
CU HI V BI TP CHNG 6......................................................................................148
CHNG 7...................................................................................................................................153
MT S LP QUAN TRNG....................................................................................................153
7.1 LP VT CHA ...............................................................................................................153
7.1.1 Giao din ca lp Container ........................................................................................153
7.1.2 Con chy Iterator..........................................................................................................154
7.2 LP TP HP....................................................................................................................155
7.2.1 Hm khi to................................................................................................................155
7.2.2 Ton t.........................................................................................................................155
7.2.3 Phng thc.................................................................................................................156
7.2.4 p dng........................................................................................................................158
7.3 LP CHUI .......................................................................................................................159
7.3.1 Hm khi to................................................................................................................159
7.3.2 Ton t.........................................................................................................................160
7.3.3 Phng thc.................................................................................................................161
7.3.4 p dng........................................................................................................................163
7.4 LP NGN XP V HNG I.....................................................................................165
7.4.1 Lp ngn xp ...............................................................................................................165
7.4.2 Lp hng i ................................................................................................................166
7.5 LP DANH SCH LIN KT..........................................................................................169
7.5.1 Hm khi to................................................................................................................169
7.5.2 Ton t.........................................................................................................................169
7.5.3 Phng thc.................................................................................................................170
7.5.4 p dng........................................................................................................................171
TNG KT CHNG 7..........................................................................................................173
CU HI V BI TP CHNG 7......................................................................................173
HNG DN TR LI CU HI V BI TP.................................................................174
Chng 1...............................................................................................................................174
Chng 2...............................................................................................................................174
Chng 3...............................................................................................................................174
Chng 4...............................................................................................................................175
Chng 5...............................................................................................................................175
Chng 6...............................................................................................................................176
Chng 7...............................................................................................................................177
TI LIU THAM KHO.........................................................................................................181
MC LC.................................................................................................................................182










NGN NG LP TRNH C++
M s : 412LTC340

Chu trch nhim bn tho
TRUNG TM O TO BU CHNH VIN THNG 1

You might also like