SlideShare a Scribd company logo
1 of 118
CH¬NG 1
C¸C KH¸I NIÖM C¬ Së
cña LËP TR×NH HíNG §èI TîNG
Ch¬ng 1 tr×nh bµy nh÷ng vÊn ®Ò sau:
 Th¶o luËn vÒ c¸ch tiÕp cËn híng ®èi tîng, nh÷ng nhîc ®iÓm cña lËp tr×nh truyÒn
thèng vµ c¸c ®Æc ®iÓm cña lËp tr×nh híng ®èi tîng.
 C¸c kh¸i niÖm c¬ së cña ph¬ng ph¸p híng ®èi tîng:
• §èi tîng
• Líp
• Trõu tîng hãa d÷ liÖu vµ bao gãi th«ng tin
• KÕ thõa
• T¬ng øng béi
• Liªn kÕt ®éng
• TruyÒn th«ng b¸o
 C¸c bíc cÇn thiÕt ®Ó thiÕt kÕ ch¬ng tr×nh theo híng ®èi tîng
 C¸c u ®iÓm cña lËp tr×nh híng ®èi tîng
 C¸c ng«n ng÷ híng ®èi tîng
 Mét sè øng dông cña lËp tr×nh híng ®èi tîng
1.1. Giíi thiÖu
1.1.1. TiÕp cËn híng ®èi tîng
Trong thÕ giíi thùc, chung quanh chóng ta lµ nh÷ng ®èi tîng, ®ã lµ c¸c thùc thÓ cã
mèi quan hÖ víi nhau. VÝ dô c¸c phßng trong mét c«ng ty kinh doanh ®îc xem nh
nh÷ng ®èi tîng. C¸c phßng ë ®©y cã thÓ lµ: phßng qu¶n lý, phßng b¸n hµng, phßng kÕ
to¸n, phßng tiÕp thÞ,... Mçi phßng ngoµi nh÷ng c¸n bé ®¶m nhiÖm nh÷ng c«ng viÖc cô
thÓ, cßn cã nh÷ng d÷ liÖu riªng nh th«ng tin vÒ nh©n viªn, doanh sè b¸n hµng, hoÆc
c¸c d÷ liÖu kh¸c cã liªn quan ®Õn bé phËn ®ã. ViÖc ph©n chia c¸c phßng chøc n¨ng
trong c«ng ty sÏ t¹o ®iÒu kiÖn dÔ dµng cho viÖc qu¶n lý c¸c ho¹t ®éng. Mçi nh©n viªn
trong phßng sÏ ®iÒu khiÓn vµ xö lý d÷ liÖu cña phßng ®ã. VÝ dô phßng kÕ to¸n phô
tr¸ch vÒ l¬ng bæng nh©n viªn trong c«ng ty. NÕu b¹n ®ang ë bé phËn tiÕp thÞ vµ cÇn
t×m th«ng tin chi tiÕt vÒ l¬ng cña ®¬n vÞ m×nh th× sÏ gëi yªu cÇu vÒ phßng kÕ to¸n.
Víi c¸ch lµm nµy b¹n ®îc ®¶m b¶o lµ chØ cã nh©n viªn cña bé phËn kÕ to¸n ®îc quyÒn
truy cËp d÷ liÖu vµ cung cÊp th«ng tin cho b¹n. §iÒu nµy còng cho thÊy r»ng, kh«ng cã
ngêi nµo thuéc bé phËn kh¸c cã thÓ truy cËp vµ thay ®æi d÷ liÖu cña bé phËn kÕ to¸n.
Kh¸i niÖm nh thÕ vÒ ®èi tîng hÇu nh cã thÓ ®îc më réng ®èi víi mäi lÜnh vùc trong ®êi
sèng x· héi vµ h¬n n÷a - ®èi víi viÖc tæ chøc ch¬ng tr×nh. Mäi øng dông cã thÓ ®îc
®Þnh nghÜa nh mét tËp c¸c thùc thÓ - hoÆc c¸c ®èi tîng, sao cho qu¸ tr×nh t¸i t¹o
nh÷ng suy nghÜa cña chóng ta lµ gÇn s¸t nhÊt vÒ thÕ giíi thùc.
Trong phÇn tiÕp theo chóng ta sÏ xem xÐt ph¬ng ph¸p lËp tr×nh truyÒn thèng ®Ó
tõ ®ã thÊy r»ng v× sao chóng ta cÇn chuyÓn sang ph¬ng ph¸p lËp tr×nh híng ®èi tîng.
1.1.2. Nh÷ng nhîc ®iÓm cña lËp tr×nh híng thñ tôc
C¸ch tiÕp cËn lËp tr×nh truyÒn thèng lµ lËp tr×nh híng thñ tôc (LTHTT). Theo c¸ch
tiÕp cËn nµy th× mét hÖ thèng phÇn mÒm ®îc xem nh lµ d·y c¸c c«ng viÖc cÇn thùc
hiÖn nh ®äc d÷ liÖu, tÝnh to¸n, xö lý, lËp b¸o c¸o vµ in Ên kÕt qu¶ v.v... Mçi c«ng viÖc
®ã sÏ ®îc thùc hiÖn bëi mét sè hµm nhÊt ®Þnh. Nh vËy träng t©m cña c¸ch tiÕp cËn
nµy lµ c¸c hµm chøc n¨ng. LTHTT sö dông kü thuËt ph©n r· hµm chøc n¨ng theo c¸ch
tiÕp cËn trªn xuèng (top-down) ®Ó t¹o ra cÊu tróc ph©n cÊp. C¸c ng«n ng÷ lËp tr×nh
1
bËc cao nh COBOL, FORTRAN, PASCAL, C, v.v..., lµ nh÷ng ng«n ng÷ lËp tr×nh híng
thñ tôc. Nh÷ng nhîc ®iÓm chÝnh cña LTHTT lµ:
 Ch¬ng tr×nh khã kiÓm so¸t vµ khã kh¨n trong viÖc bæ sung, n©ng cÊp ch¬ng tr×nh.
Ch¬ng tr×nh ®îc x©y dùng theo c¸ch TCHTT thùc chÊt lµ danh s¸ch c¸c c©u lÖnh
mµ theo ®ã m¸y tÝnh cÇn thùc hiÖn. Danh s¸ch c¸c lÖnh ®ã ®îc tæ chøc thµnh
tõng nhãm theo ®¬n vÞ cÊu tróc cña ng«n ng÷ lËp tr×nh vµ ®îc gäi lµ hµm/thñ tôc.
Trong ch¬ng tr×nh cã nhiÒu hµm/thñ tôc, thêng th× cã nhiÒu thµnh phÇn d÷ liÖu
quan träng sÏ ®îc khai b¸o tæng thÓ (global) ®Ó c¸c hµm/thñ tôc cã thÓ truy nhËp,
®äc vµ lµm thay ®æi gi¸ trÞ cña biÕn tæng thÓ. §iÒu nµy sÏ lµm cho ch¬ng tr×nh
rÊt khã kiÓm so¸t, nhÊt lµ ®èi víi c¸c ch¬ng tr×nh lín, phøc t¹p th× vÊn ®Ò cµng trë
nªn khã kh¨n h¬n. Khi ta muèn thay ®æi, bæ sung cÊu tróc d÷ liÖu dïng chung cho
mét sè hµm/thñ tôc th× ph¶i thay ®æi hÇu nh tÊt c¶ c¸c hµm/thñ tôc liªn quan ®Õn
d÷ liÖu ®ã.
 M« h×nh ®îc x©y dùng theo c¸ch tiÕp cËn híng thñ tôc kh«ng m« t¶ ®îc ®Çy ®ñ,
trung thùc hÖ thèng trong thùc tÕ.
 Ph¬ng ph¸p TCHTT ®Æt träng t©m vµo hµm lµ híng tíi ho¹t ®éng sÏ kh«ng thùc sù t-
¬ng øng víi c¸c thùc thÓ trong hÖ thèng cña thÕ giíi thùc.
1.1.3. LËp tr×nh híng ®èi tîng
LËp tr×nh híng ®èi tîng (Object Oriented Programming - LTH§T) lµ ph¬ng ph¸p
lËp tr×nh lÊy ®èi tîng lµm nÒn t¶ng ®Ó x©y dùng thuËt gi¶i, x©y dùng ch¬ng tr×nh. §èi
tîng ®îc x©y dùng trªn c¬ së g¾n cÊu tróc d÷ liÖu víi c¸c ph¬ng thøc (c¸c hµm/thñ tôc)
sÏ thÓ hiÖn ®îc ®óng c¸ch mµ chóng ta suy nghÜ, bao qu¸t vÒ thÕ giíi thùc. LTH§T cho
phÐp ta kÕt hîp nh÷ng tri thøc bao qu¸t vÒ c¸c qu¸ tr×nh víi nh÷ng kh¸i niÖm trõu tîng
®îc sö dông trong m¸y tÝnh.
§iÓm c¨n b¶n cña ph¬ng ph¸p LTH§T lµ thiÕt kÕ ch¬ng tr×nh xoay quanh d÷ liÖu
cña hÖ thèng. NghÜa lµ c¸c thao t¸c xö lý cña hÖ thèng ®îc g¾n liÒn víi d÷ liÖu vµ nh
vËy khi cã sù thay ®æi cña cÊu tróc d÷ liÖu th× chØ ¶nh hëng ®Õn mét sè Ýt c¸c ph-
¬ng thøc xö lý liªn quan.
LTH§T kh«ng cho phÐp d÷ liÖu chuyÓn ®éng tù do trong hÖ thèng. D÷ liÖu ®îc
g¾n chÆt víi tõng ph¬ng thøc thµnh c¸c vïng riªng mµ c¸c ph¬ng thøc ®ã t¸c ®éng lªn
vµ nã ®îc b¶o vÖ ®Ó cÊm viÖc truy nhËp tïy tiÖn tõ bªn ngoµi. LTH§T cho phÐp ph©n
tÝch bµi to¸n thµnh tËp c¸c thùc thÓ ®îc gäi lµ c¸c ®èi tîng vµ sau ®ã x©y dùng c¸c d÷
liÖu cïng víi c¸c ph¬ng thøc xung quanh c¸c ®èi tîng ®ã.
Tãm l¹i LTH§T cã nh÷ng ®Æc tÝnh chñ yÕu nh sau:
1. TËp trung vµo d÷ liÖu thay cho c¸c ph¬ng thøc.
2. Ch¬ng tr×nh ®îc chia thµnh c¸c líp ®èi tîng.
3. C¸c cÊu tróc d÷ liÖu ®îc thiÕt kÕ sao cho ®Æc t¶ ®îc c¸c ®èi tîng.
4. C¸c ph¬ng thøc x¸c ®Þnh trªn c¸c vïng d÷ liÖu cña ®èi tîng ®îc g¾n víi nhau trªn
cÊu tróc d÷ liÖu ®ã.
5. D÷ liÖu ®îc bao bäc, che dÊu vµ kh«ng cho phÐp c¸c thµnh phÇn bªn ngoµi truy
nhËp tù do.
6. C¸c ®èi tîng trao ®æi víi nhau th«ng qua c¸c ph¬ng thøc.
7. D÷ liÖu vµ c¸c ph¬ng thøc míi cã thÓ dÔ dµng bæ sung vµo ®èi tîng nµo ®ã khi
cÇn thiÕt.
8. Ch¬ng tr×nh ®îc thiÕt kÕ theo c¸ch tiÕp cËn bottom-up (díi -lªn).
1.2. C¸c kh¸i niÖm c¬ b¶n cña lËp tr×nh híng ®èi tîng
Nh÷ng kh¸i niÖm c¬ b¶n trong LTH§T bao gåm: §èi tîng; Líp; Trõu tîng hãa d÷
liÖu, bao gãi th«ng tin; KÕ thõa; T¬ng øng béi; Liªn kÕt ®éng; TruyÒn th«ng b¸o.
2
1.2.1. §èi tîng
Trong thÕ giíi thùc, kh¸i niÖm ®èi tîng ®îc hiÓu nh lµ mét thùc thÓ, nã cã thÓ lµ
ngêi, vËt hoÆc mét b¶ng d÷ liÖu cÇn xö lý trong ch¬ng tr×nh,... Trong LTH§T th× ®èi t-
îng lµ biÕn thÓ hiÖn cña líp.
1.2.2. Líp
Líp lµ mét kh¸i niÖm míi trong LTH§T so víi kü thuËt LTHTT. Nã lµ mét b¶n mÉu
m« t¶ c¸c th«ng tin cÊu tróc d÷ liÖu vµ c¸c thao t¸c hîp lÖ cña c¸c phÇn tö d÷ liÖu. Khi
mét phÇn tö d÷ liÖu ®îc khai b¸o lµ phÇn tö cña mét líp th× nã ®îc gäi lµ ®èi tîng. C¸c
hµm ®îc ®Þnh nghÜa hîp lÖ trong mét líp ®îc gäi lµ c¸c ph¬ng thøc (method) vµ chóng
lµ c¸c hµm duy nhÊt cã thÓ xö lý d÷ liÖu cña c¸c ®èi tîng cña líp ®ã. Mçi ®èi tîng cã
riªng cho m×nh mét b¶n sao c¸c phÇn tö d÷ liÖu cña líp. Mçi líp bao gåm: danh s¸ch c¸c
thuéc tÝnh (attribute) vµ danh s¸ch c¸c ph¬ng thøc ®Ó xö lý c¸c thuéc tÝnh ®ã. C«ng
thøc ph¶n ¸nh b¶n chÊt cña kü thuËt LTH§T lµ:
§èi tîng = D÷ liÖu + Ph¬ng thøc
Ch¼ng h¹n, chóng ta xÐt líp HINH_CN bao gåm c¸c thuéc tÝnh: (x1,y1) to¹ ®é gãc
trªn bªn tr¸i, d,r lµ chiÒu dµi vµ chiÒu réng cña HCN. C¸c ph¬ng thøc nhËp sè liÖu cho
HCN, hµm tÝnh diÖn tÝch, chu vi vµ hµm hiÓn thÞ. Líp HINH_CN cã thÓ ®îc m« t¶ nh
sau:
H×nh 2.2 M« t¶ líp HINH_CN
Chó ý: Trong LTH§T th× líp lµ kh¸i niÖm tÜnh, cã thÓ nhËn biÕt ngay tõ v¨n b¶n ch¬ng
tr×nh, ngîc l¹i ®èi tîng lµ kh¸i niÖm ®éng, nã ®îc x¸c ®Þnh trong bé nhí cña m¸y tÝnh,
n¬i ®èi tîng chiÕm mét vïng bé nhí lóc thùc hiÖn ch¬ng tr×nh. §èi tîng ®îc t¹o ra ®Ó xö
HINH_CN
Thuéc tÝnh :
x1,y1
d,r
Ph¬ng thøc :
NhËp_sl
DiÖn tÝch
Chu vi
HiÓn thÞ
3
lý th«ng tin, thùc hiÖn nhiÖm vô ®îc thiÕt kÕ, sau ®ã bÞ hñy bá khi ®èi tîng ®ã hÕt vai
trß.
1.2.3. Trõu tîng hãa d÷ liÖu vµ bao gãi th«ng tin
Trõu tîng hãa lµ c¸ch biÓu diÔn nh÷ng ®Æc tÝnh chÝnh vµ bá qua nh÷ng chi tiÕt
vôn vÆt hoÆc nh÷ng gi¶i thÝch. Khi x©y dùng c¸c líp, ta ph¶i sö dông kh¸i niÖm trõu t-
îng hãa. VÝ dô ta cã thÓ ®Þnh nghÜa mét líp ®Ó m« t¶ c¸c ®èi tîng trong kh«ng gian
h×nh häc bao gåm c¸c thuéc tÝnh trõu tîng nh lµ kÝch thíc, h×nh d¸ng, mµu s¾c vµ c¸c
ph¬ng thøc x¸c ®Þnh trªn c¸c thuéc tÝnh nµy.
ViÖc ®ãng gãi d÷ liÖu vµ c¸c ph¬ng thøc vµo mét ®¬n vÞ cÊu tróc líp ®îc xem nh
mét nguyªn t¾c bao gãi th«ng tin. D÷ liÖu ®îc tæ chøc sao cho thÕ giíi bªn ngoµi (c¸c
®èi tîng ë líp kh¸c) kh«ng truy nhËp vµo, mµ chØ cho phÐp c¸c ph¬ng thøc trong cïng
líp hoÆc trong nh÷ng líp cã quan hÖ kÕ thõa víi nhau míi ®îc quyÒn truy nhËp. ChÝnh
c¸c ph¬ng thøc cña líp sÏ ®ãng vai trß nh lµ giao diÖn gi÷a d÷ liÖu cña ®èi tîng vµ phÇn
cßn l¹i cña ch¬ng tr×nh. Nguyªn t¾c bao gãi d÷ liÖu ®Ó ng¨n cÊm sù truy nhËp trùc
tiÕp trong lËp tr×nh ®îc gäi lµ sù che giÊu th«ng tin.
1.2.4. KÕ thõa
KÕ thõa lµ qu¸ tr×nh mµ c¸c ®èi tîng cña líp nµy ®îc quyÒn sö dông mét sè tÝnh
chÊt cña c¸c ®èi tîng cña líp kh¸c. Sù kÕ thõa cho phÐp ta ®Þnh nghÜa mét líp míi trªn
c¬ së c¸c líp ®· tån t¹i. Líp míi nµy, ngoµi nh÷ng thµnh phÇn ®îc kÕ thõa, sÏ cã thªm
nh÷ng thuéc tÝnh vµ c¸c hµm míi. Nguyªn lý kÕ thõa hç trî cho viÖc t¹o ra cÊu tróc
ph©n cÊp c¸c líp.
1.2.5. T¬ng øng béi
T¬ng øng béi lµ kh¶ n¨ng cña mét kh¸i niÖm (ch¼ng h¹n c¸c phÐp to¸n) cã thÓ sö
dông víi nhiÒu chøc n¨ng kh¸c nhau. VÝ dô, phÐp + cã thÓ biÓu diÔn cho phÐp “céng”
c¸c sè nguyªn (int), sè thùc (float), sè phøc (complex) hoÆc x©u ký tù (string) v.v...
Hµnh vi cña phÐp to¸n t¬ng øng béi phô thuéc vµo kiÓu d÷ liÖu mµ nã sö dông ®Ó xö
lý.
T¬ng øng béi ®ãng vai quan träng trong viÖc t¹o ra c¸c ®èi tîng cã cÊu tróc bªn
trong kh¸c nhau nhng cïng dïng chung mét giao diÖn bªn ngoµi (nh tªn gäi).
1.2.6. Liªn kÕt ®éng
Liªn kÕt ®éng lµ d¹ng liªn kÕt c¸c thñ tôc vµ hµm khi ch¬ng tr×nh thùc hiÖn lêi gäi
tíi c¸c hµm, thñ tôc ®ã. Nh vËy trong liªn kÕt ®éng, néi dung cña ®o¹n ch¬ng tr×nh øng
víi thñ tôc, hµm sÏ kh«ng ®îc biÕt cho ®Õn khi thùc hiÖn lêi gäi tíi thñ tôc, hµm ®ã.
1.2.7. TruyÒn th«ng b¸o
C¸c ®èi tîng göi vµ nhËn th«ng tin víi nhau gièng nh con ngêi trao ®æi víi nhau.
ChÝnh nguyªn lý trao ®æi th«ng tin b»ng c¸ch truyÒn th«ng b¸o cho phÐp ta dÔ dµng
x©y dùng ®îc hÖ thèng m« pháng gÇn h¬n nh÷ng hÖ thèng trong thÕ giíi thùc. TruyÒn
th«ng b¸o cho mét ®èi tîng lµ yªu cÇu ®èi tîng thùc hiÖn mét viÖc g× ®ã. C¸ch øng xö
cña ®èi tîng ®îc m« t¶ bªn trong líp th«ng qua c¸c ph¬ng thøc.
Trong ch¬ng tr×nh, th«ng b¸o göi ®Õn cho mét ®èi tîng chÝnh lµ yªu cÇu thùc
hiÖn mét c«ng viÖc cô thÓ, nghÜa lµ sö dông nh÷ng hµm t¬ng øng ®Ó xö lý d÷ liÖu ®·
®îc khai b¸o trong ®èi tîng ®ã. V× vËy, trong th«ng b¸o ph¶i chØ ra ®îc hµm cÇn thùc
hiÖn trong ®èi tîng nhËn th«ng b¸o. Th«ng b¸o truyÒn ®i còng ph¶i x¸c ®Þnh tªn ®èi t-
îng vµ th«ng tin truyÒn ®i. VÝ dô, líp CONGNHAN cã thÓ hiÖn lµ ®èi tîng cô thÓ ®îc
®¹i diÖn bëi Hoten nhËn ®îc th«ng b¸o cÇn tÝnh l¬ng th«ng qua hµm TINHLUONG ®·
®îc x¸c ®Þnh trong líp CONGNHAN. Th«ng b¸o ®ã sÏ ®îc xö lý nh sau:
4
CONGNHAN.TINHLUONG (Hoten)
§èi t­îng Th«ng b¸o Th«ng
tin
Trong ch¬ng tr×nh híng ®èi tîng, mçi ®èi tîng chØ tån t¹i trong thêi gian nhÊt
®Þnh. §èi tîng ®îc t¹o ra khi nã ®îc khai b¸o vµ sÏ bÞ hñy bá khi ch¬ng tr×nh ra khái
miÒn x¸c ®Þnh cña ®èi tîng ®ã. Sù trao ®æi th«ng tin chØ cã thÓ thùc hiÖn trong thêi
gian ®èi tîng tån t¹i.
1.3. C¸c bíc cÇn thiÕt ®Ó thiÕt kÕ ch¬ng tr×nh theo híng ®èi tîng
Ch¬ng tr×nh theo híng ®èi tîng bao gåm mét tËp c¸c ®èi tîng vµ mèi quan hÖ gi÷a
c¸c ®èi tîng víi nhau. V× vËy, lËp tr×nh trong ng«n ng÷ híng ®èi tîng bao gåm c¸c bíc
sau:
1. X¸c ®Þnh c¸c d¹ng ®èi tîng (líp) cña bµi tãan.
2. T×m kiÕm c¸c ®Æc tÝnh chung (d÷ liÖu chung) trong c¸c d¹ng ®èi tîng nµy,
nh÷ng g× chóng cïng nhau chia xÎ.
3. X¸c ®Þnh líp c¬ së dùa trªn c¬ së c¸c ®Æc tÝnh chung cña c¸c d¹ng ®èi tîng.
4. Tõ líp c¬ së, x©y dùng c¸c líp dÉn xuÊt chøa c¸c thµnh phÇn, nh÷ng ®Æc tÝnh
kh«ng chung cßn l¹i cña c¸c d¹ng ®èi tîng. Ngoµi ra, ta cßn ®a ra c¸c líp cã quan hÖ víi
c¸c líp c¬ së vµ líp dÉn xuÊt.
1.4. C¸c u ®iÓm cña lËp tr×nh híng ®èi tîng
C¸ch tiÕp cËn híng ®èi tîng gi¶i quyÕt ®îc nhiÒu vÊn ®Ò tån t¹i trong qu¸ tr×nh
ph¸t triÓn phÇn mÒm vµ t¹o ra ®îc nh÷ng s¶n phÈm phÇn mÒm cã chÊt lîng cao.
Nh÷ng u ®iÓm chÝnh cña LTH§T lµ:
1. Th«ng qua nguyªn lý kÕ thõa, cã thÓ lo¹i bá ®îc nh÷ng ®o¹n ch¬ng tr×nh lÆp l¹i
trong qu¸ tr×nh m« t¶ c¸c líp vµ më réng kh¶ n¨ng sö dông c¸c líp ®· ®îc x©y dùng.
2. Ch¬ng tr×nh ®îc x©y dùng tõ nh÷ng ®¬n thÓ (®èi tîng) trao ®æi víi nhau nªn
viÖc thiÕt kÕ vµ lËp tr×nh sÏ ®îc thùc hiÖn theo quy tr×nh nhÊt ®Þnh chø kh«ng ph¶i
dùa vµo kinh nghiÖm vµ kü thuËt nh tríc. §iÒu nµy ®¶m b¶o rót ng¾n ®îc thêi gian x©y
dùng hÖ thèng vµ t¨ng n¨ng suÊt lao ®éng.
3. Nguyªn lý che giÊu th«ng tin gióp ngêi lËp tr×nh t¹o ra ®îc nh÷ng ch¬ng tr×nh
an toµn kh«ng bÞ thay bëi nh÷ng ®o¹n ch¬ng tr×nh kh¸c.
4. Cã thÓ x©y dùng ®îc ¸nh x¹ c¸c ®èi tîng cña bµi to¸n vµo ®èi tîng cña ch¬ng
tr×nh.
5. C¸ch tiÕp cËn thiÕt kÕ ®Æt träng t©m vµo ®èi tîng, gióp chóng ta x©y dùng ®-
îc m« h×nh chi tiÕt vµ gÇn víi d¹ng cµi ®Æt h¬n.
6. Nh÷ng hÖ thèng híng ®èi tîng dÔ më réng, n©ng cÊp thµnh nh÷ng hÖ lín h¬n.
7. Kü thuËt truyÒn th«ng b¸o trong viÖc trao ®æi th«ng tin gi÷a c¸c ®èi tîng gióp
cho viÖc m« t¶ giao diÖn víi c¸c hÖ thèng bªn ngoµi trë nªn ®¬n gi¶n h¬n.
8. Cã thÓ qu¶n lý ®îc ®é phøc t¹p cña nh÷ng s¶n phÈm phÇn mÒm.
Kh«ng ph¶i trong hÖ thèng híng ®èi tîng nµo còng cã tÊt c¶ c¸c tÝnh chÊt nªu trªn.
Kh¶ n¨ng cã c¸c tÝnh chÊt ®ã cßn phô thuéc vµo lÜnh vùc øng dông cña dù ¸n tin häc
vµ vµo ph¬ng ph¸p thùc hiÖn cña ngêi ph¸t triÓn phÇn mÒm.
1.5. C¸c ng«n ng÷ híng ®èi tîng
LËp tr×nh híng ®èi tîng kh«ng lµ ®Æc quyÒn cña mét ng«n ng÷ nµo ®Æc biÖt.
Còng gièng nh lËp tr×nh cã cÊu tróc, nh÷ng kh¸i niÖm trong lËp tr×nh híng ®èi tîng cã
thÓ cµi ®Æt trong nh÷ng ng«n ng÷ lËp tr×nh nh C hoÆc Pascal,... Tuy nhiªn, ®èi víi
nh÷ng ch¬ng tr×nh lín th× vÊn ®Ò lËp tr×nh sÏ trë nªn phøc t¹p. Nh÷ng ng«n ng÷ ®îc
thiÕt kÕ ®Æc biÖt, hç trî cho viÖc m« t¶, cµi ®Æt c¸c kh¸i niÖm cña ph¬ng ph¸p híng
®èi tîng ®îc gäi chung lµ ng«n ng÷ ®èi tîng. Dùa vµo kh¶ n¨ng ®¸p øng c¸c kh¸i niÖm
vÒ híng ®èi tîng, ta cã thÓ chia ra lµm hai lo¹i:
1. Ng«n ng÷ lËp tr×nh dùa trªn ®èi tîng
5
2. Ng«n ng÷ lËp tr×nh híng ®èi tîng
LËp tr×nh dùa trªn ®èi tîng lµ kiÓu lËp tr×nh hç trî chÝnh cho viÖc bao gãi, che
giÊu th«ng tin vµ ®Þnh danh c¸c ®èi tîng. LËp tr×nh dùa trªn ®èi tîng cã nh÷ng ®Æc
tÝnh sau:
• Bao gãi d÷ liÖu
• C¬ chÕ che giÊu vµ truy nhËp d÷ liÖu
• Tù ®éng t¹o lËp vµ xãa bá c¸c ®èi tîng
• PhÐp to¸n t¶i béi
Ng«n ng÷ hç trî cho kiÓu lËp tr×nh trªn ®îc gäi lµ ng«n ng÷ lËp tr×nh dùa trªn ®èi
tîng. Ng«n ng÷ trong líp nµy kh«ng hç trî cho viÖc thùc hiÖn kÕ thõa vµ liªn kÕt ®éng,
ch¼ng h¹n Ada lµ ng«n ng÷ lËp tr×nh dùa trªn ®èi tîng.
LËp tr×nh híng ®èi tîng lµ kiÓu lËp tr×nh dùa trªn ®èi tîng vµ bæ sung thªm nhiÒu
cÊu tróc ®Ó cµi ®Æt nh÷ng quan hÖ vÒ kÕ thõa vµ liªn kÕt ®éng. V× vËy ®Æc tÝnh
cña LTH§T cã thÓ viÕt mét c¸ch ng¾n gän nh sau:
C¸c ®Æc tÝnh dùa trªn ®èi tîng + kÕ thõa + liªn kÕt ®éng.
Ng«n ng÷ hç trî cho nh÷ng ®Æc tÝnh trªn ®îc gäi lµ ng«n ng÷ LTH§T, vÝ dô nh
C++, Smalltalk, Object Pascal v.v...
ViÖc chän mét ng«n ng÷ ®Ó cµi ®Æt phÇn mÒm phô thuéc nhiÒu vµo c¸c ®Æc
tÝnh vµ yªu cÇu cña bµi to¸n øng dông, vµo kh¶ n¨ng sö dông l¹i cña nh÷ng ch¬ng
tr×nh ®· cã vµ vµo tæ chøc cña nhãm tham gia x©y dùng phÇn mÒm.
1.6. Mét sè øng dông cña LTH§T
LTH§T ®ang ®îc øng dông ®Ó ph¸t triÓn phÇn mÒm trong nhiÒu lÜnh vùc kh¸c
nhau. Trong sè ®ã, cã øng dông quan träng vµ næi tiÕng nhÊt hiÖn nay lµ hÖ ®iÒu
hµnh Windows cña h·ng Microsoft ®· ®îc ph¸t triÓn dùa trªn kü thuËt LTH§T. Mét sè
nh÷ng lÜnh vùc øng dông chÝnh cña kü thuËt LTH§T bao gåm:
+ Nh÷ng hÖ thèng lµm viÖc theo thêi gian thùc.
+ Trong lÜnh vùc m« h×nh hãa hoÆc m« pháng c¸c qu¸ tr×nh
+ C¸c c¬ së d÷ liÖu híng ®èi tîng.
+ Nh÷ng hÖ siªu v¨n b¶n, multimedia
+ LÜnh vùc trÝ tuÖ nh©n t¹o vµ c¸c hÖ chuyªn gia.
+ LËp tr×nh song song vµ m¹ng n¬-ron.
+ Nh÷ng hÖ tù ®éng hãa v¨n phßng vµ trî gióp quyÕt ®Þnh.
...
Ch¬ng 2
c¸c më réng cña ng«n ng÷ C++
Ch¬ng 2 tr×nh bµy nh÷ng vÊn ®Ò sau ®©y:
 Giíi thiÖu chung vÒ ng«n ng÷ C++
 Mét sè më réng cña ng«n ng÷ C++ so víi ng«n ng÷ C
 C¸c ®Æc tÝnh cña C++ hç trî lËp tr×nh híng ®èi tîng
 Vµo ra trong C++
 CÊp ph¸t vµ gi¶i phãng bé nhí
 BiÕn tham chiÕu, h»ng tham chiÕu
 TruyÒn tham sè cho hµm theo tham chiÕu
6
 Hµm tr¶ vÒ gi¸ trÞ tham chiÕu
 Hµm víi tham sè cã gi¸ trÞ mÆc ®Þnh
 C¸c hµm néi tuyÕn (inline)
 Hµm t¶i béi
2.1. Giíi thiÖu chung vÒ C++
C++ lµ ng«n ng÷ lËp tr×nh híng ®èi tîng vµ lµ sù më réng cña ng«n ng÷ C. V× vËy
mäi kh¸i niÖm trong C ®Òu dïng ®îc trong C++. PhÇn lín c¸c ch¬ng tr×nh C ®Òu cã
thÓ ch¹y ®îc trong C++. Trong ch¬ng nµy chØ tËp trung giíi thiÖu nh÷ng kh¸i niÖm,
®Æc tÝnh míi cña C++ hç trî cho lËp tr×nh híng ®èi tîng. Mét sè kiÕn thøc cã trong C+
+ nhng ®· cã trong ng«n ng÷ C sÏ kh«ng ®îc tr×nh bµy l¹i ë ®©y.
2.2. Mét sè më réng cña C++ so víi C
2.2.1. §Æt lêi chó thÝch
Ngoµi kiÓu chó thÝch trong C b»ng /* ... */ , C++ ®a thªm mét kiÓu chó thÝch thø
hai, ®ã lµ chó thÝch b¾t ®Çu b»ng //. KiÓu chó thÝch /*...*/ ®îc dïng cho c¸c khèi chó
thÝch lín gåm nhiÒu dßng, cßn kiÓu // ®îc dïng cho c¸c chó thÝch trªn mét dßng. Ch-
¬ng tr×nh dÞch sÏ bá qua tÊt c¶ c¸c chó thÝch trong ch¬ng tr×nh.
VÝ dô: /* §©y lµ
c©u chó thÝch trªn nhiÒu dßng */
// §©y lµ chó thÝch trªn mét dßng
2.2.2. Khai b¸o biÕn
Trong C tÊt c¶ c¸c c©u lÖnh khai b¸o biÕn, m¶ng côc bé ph¶i ®Æt t¹i ®Çu khèi.
V× vËy vÞ trÝ khai b¸o vµ vÞ trÝ sö dông cña biÕn cã thÓ ë c¸ch kh¸ xa nhau, ®iÒu
nµy g©y khã kh¨n trong viÖc kiÓm so¸t ch¬ng tr×nh. C++ ®· kh¾c phôc nhîc ®iÓm nµy
b»ng c¸ch cho phÐp c¸c lÖnh khai b¸o biÕn cã thÓ ®Æt bÊt kú chç nµo trong ch¬ng
tr×nh tríc khi c¸c biÕn ®îc sö dông. Ph¹m vi ho¹t ®éng cña c¸c biÕn kiÓu nµy lµ khèi
trong ®ã biÕn ®îc khai b¸o.
VÝ dô 2.1 Ch¬ng tr×nh sau ®©y nhËp mét d·y sè thùc råi s¾p xÕp theo thø tù t¨ng
dÇn:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
int n;
printf("n So phan tu cua day N=");
scanf("%d",&n);
float *x=(float*)malloc((n+1)*sizeof(float));
for (int i=0;i<n;i++)
{
printf("n X[%d]=",i);
scanf("%f",x+i);
}
for(i=0;i<n-1;++i)
for (int j=i+1;j<n;++j)
if (x[i]>x[j])
7
{
float tg=x[i];
x[i]=x[j];
x[j]=tg;
}
printf("n Day sau khi sap xepn");
for (i=0;i<n;++i)
printf("%0.2f ",x[i]);
getch();
}
2.2.3. PhÐp chuyÓn kiÓu b¾t buéc
Ngoµi phÐp chuyÓn kiÓu b¾t buéc ®îc viÕt trong C theo có ph¸p:
(kiÓu) biÓu thøc
C++ cßn sö dông mét phÐp chuyÓn kiÓu míi nh sau:
KiÓu(biÓu thøc)
PhÐp chuyÓn kiÓu nµy cã d¹ng nh mét hµm sè chuyÓn kiÓu ®ang ®îc gäi. C¸ch
chuyÓn kiÓu nµy thêng ®îc sö dông trong thùc tÕ.
VÝ dô 2.2 Ch¬ng tr×nh sau ®©y tÝnh sau tæng S =
n
1
...
3
1
2
1
1 ++++
Víi n lµ mét sè nguyªn d¬ng nhËp tõ bµn phÝm.
#include <stdio.h>
#include <conio.h>
void main()
{
int n;
printf("n So phan tu cua day N=");
scanf("%d",&n);
float s=0.0;
for (int i=1;i<=n;++i)
s+= float(1)/float(i); //chuyen kieu theo C++
printf("S=%0.2f",s);
getch();
}
2.2.4. LÊy ®Þa chØ c¸c phÇn tö m¶ng thùc 2 chiÒu
Trong C kh«ng cho phÐp dïng phÐp to¸n & ®Ó lÊy ®Þa chØ cña c¸c phÇn tö
m¶ng thùc 2 chiÒu. V× vËy khi nhËp mét ma trËn thùc (dïng hµm scanf()) ta ph¶i nhËp
qua mét biÕn trung gian sau ®ã míi g¸n cho c¸c phÇn tö m¶ng.
C++ cho phÐp dïng phÐp to¸n & ®Ó lÊy ®Þa chØ c¸c phÇn tö m¶ng thùc 2 chiÒu,
do ®ã thÓ dïng hµm scanf() ®Ó nhËp trùc tiÕp vµo c¸c phÇn tö m¶ng.
VÝ dô 2.3 Ch¬ng tr×nh sau ®©y cho phÐp nhËp mét m¶ng thùc cÊp 20x20 vµ t×m c¸c
phÇn tö cã gi¸ trÞ lín nhÊt.
#include <conio.h>
#include <stdio.h>
void main()
8
{
float a[20][20],smax;
int m,n,i,j,imax,jmax;
clrscr();
puts(" Cho biet so hang va so cot cua ma tran: ");
scanf("%d%d",&m,&n);
for (i=0;i<m;++i)
for (j=0;j<n;++j)
{
printf("n a[%d][%d]=",i,j);
scanf("%f",&a[i][j]);
}
smax=a[0][0];
imax=0;
jmax=0;
for (i=0;i<m;++i)
for(j=0;j<n;++j)
if(smax<a[i][j])
{
smax=a[i][j];
imax=i;
jmax=j;
}
puts("nn Ma tran");
for (i=0;i<m;++i)
for (j=0;j<n;++j)
{
if (j==0) puts("");
printf("%6.1f",a[i][j]);
}
puts("nn Phan tu max:");
printf("n Co gia tri=%6.1f", smax);
printf("nn Tai hang %d cot %d",imax,jmax);
getch();
}
2.3. Vµo ra trong C++
§Ó xuÊt d÷ liÖu ra mµn h×nh vµ nhËp d÷ liÖu tõ bµn phÝm, trong C++ vÉn cã thÓ
dïng hµm printf() vµ scanf(), ngoµi ra trong C++ ta cã thÓ dïng dßng xuÊt/nhËp chuÈn
®Ó nhËp/xuÊt d÷ liÖu th«ng qua hai biÕn ®èi tîng cña dßng (stream object) lµ cout vµ
cin.
2.3.1. XuÊt d÷ liÖu
Có ph¸p: cout << biÓu thøc 1<<. . .<< biÓu thøc N;
9
Trong ®ã cout ®îc ®Þnh nghÜa tríc nh mét ®èi tîng biÓu diÔn cho thiÕt bÞ xuÊt chuÈn
cña C++ lµ mµn h×nh, cout ®îc sö dông kÕt hîp víi to¸n tö chÌn << ®Ó hiÓn thÞ gi¸ trÞ
c¸c biÓu thøc 1, 2,..., N ra mµn h×nh.
2.3.2. NhËp d÷ liÖu
Có ph¸p: cin >>biÕn 1>>. . . >>biÕn N;
To¸n tö cin ®îc ®Þnh nghÜa tríc nh mét ®èi tîng biÓu diÔn cho thiÕt bÞ vµo chuÈn cña
C++ lµ bµn phÝm, cin ®îc sö dông kÕt hîp víi to¸n tö trÝch >> ®Ó nhËp d÷ liÖu tõ bµn
phÝm cho c¸c biÕn 1, 2, ..., N.
Chó ý:
• §Ó nhËp mét chuçi kh«ng qu¸ n ký tù vµ lu vµo m¶ng mét chiÒu a (kiÓu char) cã
thÓ dïng hµm cin.get nh sau: cin.get(a,n);
• To¸n tö nhËp cin>> sÏ ®Ó l¹i ký tù chuyÓn dßng ’n’ trong bé ®Öm. Ký tù nµy cã thÓ
lµm tr«i ph¬ng thøc cin.get. §Ó kh¾c phôc t×nh tr¹ng trªn cÇn dïng ph¬ng thøc
cin.ignore(1) ®Ó bá qua mét ký tù chuyÓn dßng.
• §Ó sö dông c¸c lo¹i to¸n tö vµ ph¬ng thøc nãi trªn cÇn khai b¸o tËp tin dÉn híng
iostream.h
2.3.3. §Þnh d¹ng khi in ra mµn h×nh
• §Ó quy ®Þnh sè thùc ®îc hiÓn thÞ ra mµn h×nh víi p ch÷ sè sau dÊu chÊm thËp
ph©n, ta sö dông ®ång thêi c¸c hµm sau:
setiosflags(ios::showpoint); // BËt cê hiÖu showpoint(p)
setprecision(p);
C¸c hµm nµy cÇn ®Æt trong to¸n tö xuÊt nh sau:
cout<<setiosflag(ios::showpoint)<<setprecision(p);
C©u lÖnh trªn sÏ cã hiÖu lùc ®èi víi tÊt c¶ c¸c to¸n tö xuÊt tiÕp theo cho ®Õn khi
gÆp mét c©u lÖnh ®Þnh d¹ng míi.
• §Ó quy ®Þnh ®é réng tèi thiÓu ®Ó hiÓn thÞ lµ k vÞ trÝ cho gi¸ trÞ (nguyªn, thùc,
chuçi) ta dïng hµm: setw(k)
Hµm nµy cÇn ®Æt trong to¸n tö xuÊt vµ nã chØ cã hiÖu lùc cho mét gi¸ trÞ ®îc in
gÇn nhÊt. C¸c gi¸ trÞ in ra tiÕp theo sÏ cã ®é réng tèi thiÓu mÆc ®Þnh lµ 0, nh vËy
c©u lÖnh:
cout<<setw(6)<<“Khoa”<<“CNTT”
sÏ in ra chuçi “ KhoaCNTT”.
VÝ dô 2.4 Ch¬ng tr×nh sau cho phÐp nhËp mét danh s¸ch kh«ng qu¸ 100 thÝ sinh. D÷
liÖu mçi thÝ sinh gåm hä tªn, c¸c ®iÓm thi m«n 1, m«n 2, m«n 3. Sau ®ã in danh s¸ch
thÝ sinh theo thø tù gi¶m dÇn cña tæng ®iÓm.
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
void main()
{
struct
{
char ht[25];
float d1,d2,d3,td;
}ts[100],tg;
10
int n,i,j;
clrscr();
cout << "So thi sinh:";
cin >> n;
for (i=0;i<n;++i)
{
cout << "n Thi sinh:"<<i;
cout << "n Ho ten:";
cin.ignore(1);
cin.get(ts[i].ht,25);
cout << "Diem cac mon thi :";
cin>>ts[i].d1>>ts[i].d2>>ts[i].d3;
ts[i].td=ts[i].d1+ts[i].d2+ts[i].d3;
}
for (i=0;i<n-1;++i)
for(j=i+1;j<n;++j)
if(ts[i].td<ts[j].td)
{
tg=ts[i];
ts[i]=ts[j];
ts[j]=tg;
}
cout<< " Danh sach thi sinh sau khi sap xep :";
for (i=0;i<n;++i)
{
cout<< "n" <<
setw(25)<<ts[i].ht<<setw(5)<<ts[i].td;
}
getch();
}
VÝ dô 2.5 Ch¬ng tr×nh sau ®©y cho phÐp nhËp mét m¶ng thùc cÊp 50x50. Sau ®ã in
ma trËn díi d¹ng b¶ng vµ t×m mét phÇn tö lín nhÊt.
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
void main()
{
float a[50][50],smax;
int m,n,i,j,imax,jmax;
clrscr();
cout<< "Nhap so hang va cot:";
cin>>m>>n;
for (i=0;i<m;++i)
for (j=0;j<n;++j)
11
{
cout<< "a["<<i<<","<<j<<"]=";
cin>> a[i][j];
}
smax= a[0][0];
imax=0;
jmax=0;
for (i=0;i<m;++i)
for (j=0;j<n;++j)
if (smax<a[i][j])
{
smax=a[i][j];
imax=i;
jmax=j;
}
cout << "nn Mang da nhap";
cout << setiosflags(ios::showpoint)<<setprecision(1);
for (i=0;i<m;++i)
for (j=0;j<n;++j)
{
if (j==0) cout<<"n";
cout << setw(6)<<a[i][j];
}
cout << "nn"<< "Phan tu max:"<< "n";
cout << "co gia tri ="<<setw(6)<<smax;
cout<<"nTai hang"<<imax<< " cot "<<jmax;
getch();
}
2.4. CÊp ph¸t vµ gi¶i phãng bé nhí
Trong C cã thÓ sö dông c¸c hµm cÊp ph¸t bé nhí nh malloc(), calloc() vµ hµm
free() ®Ó gi¶i phãng bé nhí ®îc cÊp ph¸t. C++ ®a thªm mét c¸ch thøc míi ®Ó thùc hiÖn
viÖc cÊp ph¸t vµ gi¶i phãng bé nhí b»ng c¸ch dïng hai to¸n tö new vµ delete.
2.4.1. To¸n tö new ®Ó cÊp ph¸t bé nhí
To¸n tö new thay cho hµm malloc() vµ calloc() cña C cã có ph¸p nh sau:
new Tªn kiÓu ;
hoÆc new (Tªn kiÓu);
Trong ®ã Tªn kiÓu lµ kiÓu d÷ liÖu cña biÕn con trá, nã cã thÓ lµ: c¸c kiÓu d÷ liÖu
chuÈn nh int, float, double, char,... hoÆc c¸c kiÓu do ngêi lËp tr×nh ®Þnh nghÜa nh
m¶ng, cÊu tróc, líp,...
Chó ý: §Ó cÊp ph¸t bé nhí cho m¶ng mét chiÒu, dïng có ph¸p nh sau:
BiÕn con trá = new kiÓu[n];
Trong ®ã n lµ sè nguyªn d¬ng x¸c ®Þnh sè phÇn tö cña m¶ng.
VÝ dô: float *p = new float; //cÊp ph¸t bé nhí cho biÕn con trá p cã kiÓu int
12
int *a = new int[100]; //cÊp ph¸t bé nhí ®Ó lu tr÷ m¶ng mét chiÒu a
// gåm 100 phÇn tö
Khi sö dông to¸n tö new ®Ó cÊp ph¸t bé nhí, nÕu kh«ng ®ñ bé nhí ®Ó cÊp ph¸t,
new sÏ tr¶ l¹i gi¸ trÞ NULL cho con trá. §o¹n ch¬ng tr×nh sau minh häa c¸ch kiÓm tra lçi
cÊp ph¸t bé nhí:
double *p;
int n;
cout<< “n So phan tu : ”;
cin>>n;
p = new double[n]
if (p == NULL)
{
cout << “Loi cap phat bo nho”;
exit(0);
}
2.4.2. To¸n tö delete
To¸n tö delete thay cho hµm free() cña C, nã cã có ph¸p nh sau:
delete con trá ;
VÝ dô 2.6 Ch¬ng tr×nh sau minh ho¹ c¸ch dïng new ®Ó cÊp ph¸t bé nhí chøa n thÝ
sinh. Mçi thÝ sinh lµ mét cÊu tróc gåm c¸c trêng ht(hä tªn), sobd(sè b¸o danh), vµ
td(tæng ®iÓm). Ch¬ng tr×nh sÏ nhËp n, cÊp ph¸t bé nhí chøa n thÝ sinh, kiÓm tra lçi
cÊp ph¸t bé nhí, nhËp n thÝ sinh, s¾p xÕp thÝ sinh theo thø tù gi¶m cña tæng ®iÓm, in
danh s¸ch thÝ sinh sau khi s¾p xÕp, gi¶i phãng bé nhí ®· cÊp ph¸t.
#include <iomanip.h>
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct TS
{
char ht[20];
long sobd;
float td;
};
void main(void)
{
TS *ts;
int n;
cout<<"nSo thi sinh n = ";
cin>>n;
ts = new TS[n+1];
if (ts == NULL)
{
cout << "n Loi cap phat vung nho";
13
getch();
exit(0);
}
for (int i=0;i<n;++i)
{
cout << "n Thi sinh thu "<<i;
cout<< "n Ho ten";
cin.ignore(1);
cin.get (ts[i].ht,20);
cout << "so bao danh";
cin>> ts[i].sobd;
cout<< "tong diem:";
cin>>ts[i].td;
}
for (i=0;i<n-1;++i)
for (int j=i+1;j<n;++j)
if (ts[i].td<ts[j].td)
{
TS tg=ts[i];
ts[i]=ts[j];
ts[j]=tg;
}
cout << setiosflags(ios::showpoint)<<setprecision(1);
for (i=0;i<n;++i)
cout << "n" << setw(20)<<ts[i].ht<<setw(6)<<ts[i].td;
delete ts;
getch();
}
2.5. BiÕn tham chiÕu
Trong C cã 2 lo¹i biÕn lµ: BiÕn gi¸ trÞ dïng ®Ó chøa d÷ liÖu (nguyªn, thùc, ký
tù,...) vµ biÕn con trá dïng ®Ó chøa ®Þa chØ. C¸c biÕn nµy ®Òu ®îc cung cÊp bé nhí
vµ cã ®Þa chØ. C++ cho phÐp sö dông lo¹i biÕn thø ba lµ biÕn tham chiÕu. BiÕn tham
chiÕu lµ mét tªn kh¸c (bÝ danh) cho biÕn ®· ®Þnh nghÜa tríc ®ã. Có ph¸p khai b¸o
biÕn tham chiÕu nh sau:
KiÓu &BiÕn tham chiÕu = BiÕn;
BiÕn tham chiÕu cã ®Æc ®iÓm lµ nã ®îc dïng lµm bÝ danh cho mét biÕn (kiÓu gi¸ trÞ)
nµo ®ã vµ sö dông vïng nhí cña biÕn nµy.
VÝ dô: Víi c©u lÖnh: int a, &tong=a; th× tong lµ bÝ danh cña biÕn a vµ biÕn tong
dïng chung vïng nhí cña biÕn a. Lóc nµy, trong mäi c©u lÖnh, viÕt a hay viÕt tong ®Òu
cã ý nghÜa nh nhau, v× ®Òu truy nhËp ®Õn cïng mét vïng nhí. Mäi sù thay ®æi ®èi víi
biÕn tong ®Òu ¶nh hëng ®èi víi biÕn a vµ ngîc l¹i.
VÝ dô: int a, &tong = a;
tong =1; //a=1
cout<< tong; //in ra sè 1
tong++; //a=2
14
++a; //a=3
cout<<tong; //in ra sè 3
Chó ý:
• Trong khai b¸o biÕn tham chiÕu ph¶i chØ râ tham chiÕu ®Õn biÕn nµo.
• BiÕn tham chiÕu cã thÓ tham chiÕu ®Õn mét phÇn tö m¶ng, nhng kh«ng cho
phÐp khai b¸o m¶ng tham chiÕu.
• BiÕn tham chiÕu cã thÓ tham chiÕu ®Õn mét h»ng. Khi ®ã nã sö dông vïng nhí
cña h»ng vµ cã thÓ lµm thay ®æi gi¸ trÞ chøa trong vïng nhí nµy.
• BiÕn tham chiÕu thêng ®îc sö dông lµm ®èi cña hµm ®Ó cho phÐp hµm truy
nhËp ®Õn c¸c tham biÕn trong lêi gäi hµm
2.6. H»ng tham chiÕu
Có ph¸p khai b¸o h»ng tham chiÕu nh sau:
const KiÓu d÷ liÖu &BiÕn = BiÕn/H»ng;
VÝ dô: int n = 10;
const int &m = n;
const int &p = 123;
H»ng tham chiÕu cã thÓ tham chiÕu ®Õn mét biÕn hoÆc mét h»ng.
Chó ý:
 BiÕn tham chiÕu vµ h»ng tham chiÕu kh¸c nhau ë chç: kh«ng cho phÐp dïng h»ng
tham chiÕu ®Ó lµm thay ®æi gi¸ trÞ cña vïng nhí mµ nã tham chiÕu.
VÝ dô: int y=12, z;
const int &p = y //H»ng tham chiÕu p tham chiÕu ®Õn biÕn y
p = p + 1; //Sai, tr×nh biªn dÞch sÏ th«ng b¸o lçi
 H»ng tham chiÕu cho phÐp sö dông gi¸ trÞ chøa trong mét vïng nhí, nhng kh«ng cho
phÐp thay ®æi gi¸ trÞ nµy.
 H»ng tham chiÕu thêng ®îc sö dông lµm tham sè cña hµm ®Ó cho phÐp sö dông gi¸
trÞ cña c¸c tham sè trong lêi gäi hµm, nhng tr¸nh lµm thay ®æi gi¸ trÞ tham sè.
2.7. TruyÒn tham sè cho hµm theo tham chiÕu
Trong C chØ cã mét c¸ch truyÒn d÷ liÖu cho hµm lµ truyÒn theo theo gi¸ trÞ. Ch-
¬ng tr×nh sÏ t¹o ra c¸c b¶n sao cña c¸c tham sè thùc sù trong lêi gäi hµm vµ sÏ thao t¸c
trªn c¸c b¶n sao nµy chø kh«ng xö lý trùc tiÕp víi c¸c tham sè thùc sù. C¬ chÕ nµy rÊt
tèt nÕu khi thùc hiÖn hµm trong ch¬ng tr×nh kh«ng cÇn lµm thay ®æi gi¸ trÞ cña biÕn
gèc. Tuy nhiªn, nhiÒu khi ta l¹i muèn nh÷ng tham sè ®ã thay ®æi khi thùc hiÖn hµm
trong ch¬ng tr×nh. C++ cung cÊp thªm c¸ch truyÒn d÷ liÖu cho hµm theo tham chiÕu
b»ng c¸ch dïng ®èi lµ tham chiÕu. C¸ch lµm nµy cã u diÓm lµ kh«ng cÇn t¹o ra c¸c b¶n
sao cña c¸c tham sè, do dã tiÕt kiÖm bé nhí vµ thêi gian ch¹y m¸y. MÆt kh¸c, hµm nµy
sÏ thao t¸c trùc tiÕp trªn vïng nhí cña c¸c tham sè, do ®ã dÔ dµng thay ®æi gi¸ trÞ c¸c
tham sè khi cÇn.
VÝ dô 2.7 Ch¬ng tr×nh sau sÏ nhËp d·y sè thùc, s¾p xÕp d·y theo thø tù t¨ng dÇn vµ
hiÓn thÞ ra mµn h×nh.
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
void nhapds(double *a,int n)
{
15
for(int i=0;i<n;++i)
{
cout<<"n Phan tu thu "<<i<<":";
cin>>a[i];
}
}
void hv(double &x,double &y)
{
double tam=x;x=y;y=tam;
}
void sapxep(double *a,int n)
{
for(int i=0;i<n-1;++i)
for(int j=i+1;j<n;++j)
if(a[i]>a[j])
hv(a[i],a[j]);
}
void main()
{
double x[100];
int i,n;
clrscr();
cout<<"n nhap so phan tu N = ";
cin>>n;
nhapds(x,n);
sapxep(x,n);
cout<<"nCac phan tu mang sau khi sap xep :";
for(i=0;i<n;++i)
printf("n%6.2f",x[i]);
getch();
}
VÝ dô 2.8 Ch¬ng tr×nh sÏ nhËp d÷ liÖu mét danh s¸ch thÝ sinh bao gåm hä tªn, ®iÓm
c¸c m«n 1, m«n 2, m«n 3 vµ in danh s¸ch thÝ sinh:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <iomanip.h>
struct TS
{
char ht[20];
float d1,d2,d3,td;
};
void ints(const TS &ts)
{
16
cout<<setiosflags(ios::showpoint)<<setprecision(1);
cout<<"n ho ten"<<setw(20)<<ts.ht<<setw(6)<<ts.td;
}
void nhapsl(TS *ts,int n)
{
for(int i=0;i<n;++i)
{
cout<<"n Thi sinh"<<i;
cout<<"n ho ten ";
cin.ignore(1);
cin.get(ts[i].ht,25);
cout<<"Nhap diem cac mon thi : ";
cin>>ts[i].d1>>ts[i].d2>>ts[i].d3;
ts[i].td=ts[i].d1+ts[i].d2+ts[i].d3;
}
}
void hvts(TS &ts1,TS &ts2)
{
TS tg=ts1;
ts1=ts2;
ts2=tg;
}
void sapxep(TS *ts,int n)
{
for(int i=0;i<n-1;++i)
for(int j=i+1;j<n;++j)
if(ts[i].td<ts[j].td)
hvts(ts[i],ts[j]) ;
}
void main()
{
TS ts[100];
int n,i;
clrscr();
cout<<"So thi sinh : ";
cin>>n;
nhapsl(ts,n);
sapxep(ts,n);
float dc;
cout<<"nnDanh sach thi sinh n";
for(i=0;i<n;++i)
if(ts[i].td>=dc)
ints(ts[i]);
17
else
break;
getch();
}
VÝ dô 2.9 Ch¬ng tr×nh sau sÏ nhËp mét m¶ng thùc kÝch thíc 20x20, in m¶ng ®· nhËp
vµ in c¸c phÇn tö lín nhÊt vµ nhá nhÊt trªn mçi hµng cña m¶ng.
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <iomanip.h>
void nhapmt(float a[20][20],int m,int n)
{
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
{
cout<<"n a["<<i<<","<<j<<"]=";
cin>> a[i][j];
}
}
void inmt(float a[20][20],int m,int n)
{
cout<<setiosflags(ios::showpoint)<<setprecision(1);
cout<<"nMang da nhap : ";
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
{
if(j==0) cout<<"n";
cout<<setw(6)<<a[i][j];
}
}
void maxminds(float *x,int n,int &vtmax,int &vtmin)
{
vtmax=vtmin=0;
for(int i=1;i<n;++i)
{
if(x[i]>x[vtmax]) vtmax=i;
if(x[i]<x[vtmin]) vtmin=i;
}
}
void main()
{
float a[20][20];
int m,n;
clrscr();
18
cout<<"n Nhap so hang va so cot : ";
cin>>m>>n;
nhapmt(a,m,n);
inmt(a,m,n);
float *p=(float*) a;
int vtmax,vtmin;
for(int i=0;i<m;++i)
{
p=((float*)a)+i*20;
maxminds(p,n,vtmax,vtmin);
printf("n Hang %d phan tu max=%6.1f tai cot
%d",i,p[vtmax],vtmax);
printf("n Phan tu min=%6.1f tai cot
%d",p[vtmin],vtmin);
}
getch();
}
2.8. Hµm tr¶ vÒ gi¸ trÞ tham chiÕu
C++ cho phÐp hµm tr¶ vÒ gi¸ trÞ lµ mét tham chiÕu, lóc nµy ®Þnh nghÜa cña
hµm cã d¹ng nh sau :
KiÓu &Tªn hµm(...)
{ //th©n hµm
return <biÕn ph¹m vi toµn côc>;
}
Trong trêng hîp nµy biÓu thøc ®îc tr¶ l¹i trong c©u lÖnh return ph¶i lµ tªn cña mét
biÕn x¸c ®Þnh tõ bªn ngoµi hµm, bëi v× khi ®ã míi cã thÓ sö dông ®îc gi¸ trÞ cña hµm.
Khi ta tr¶ vÒ mét tham chiÕu ®Õn mét biÕn côc bé khai b¸o bªn trong hµm, biÕn côc
bé nµy sÏ bÞ mÊt ®i khi kÕt thóc thùc hiÖn hµm. Do vËy tham chiÕu cña hµm sÏ kh«ng
cßn ý nghÜa n÷a.
Khi gi¸ trÞ tr¶ vÒ cña hµm lµ tham chiÕu, ta cã thÓ gÆp c¸c c©u lÖnh g¸n h¬i kh¸c
thêng, trong ®ã vÕ tr¸i lµ mét lêi gäi hµm chø kh«ng ph¶i lµ tªn cña mét biÕn. §iÒu nµy
hoµn toµn hîp lý, bëi v× b¶n th©n hµm ®ã cã gi¸ trÞ tr¶ vÒ lµ mét tham chiÕu. Nãi c¸ch
kh¸c, vÕ tr¸i cña lÖnh g¸n cã thÓ lµ lêi gäi ®Õn mét hµm cã gi¸ trÞ tr¶ vÒ lµ mét tham
chiÕu.Xem c¸c vÝ dô sau:
VÝ dô 2.10
#include <iostream.h>
#include <conio.h>
int z;
int &f()// ham tra ve mot bi danh cua bien toan bo z
{
return z;
}
void main()
{
f()=50;//z=50
19
cout<<"nz="<<z;
getch();
}
VÝ dô 2.11
#include <iostreams.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
int & max(int& a, int& b);
void main()
{
clrscr();
int b =10, a= 7, c= 20;
cout << "Max a,b : "<<max(b,a) << endl;
max(b,a)++;
cout << "Gia tri b va a :"<< b <<" "<<a <<endl;
max(b,c)=5;
cout << "Gia tri b va a va c :"<<b<<" "<<a
<<" "<<c<< endl;
}
int &max(int &a, int &b)
{
return a>b ? a:b;
}
KÕt qu¶ trªn mµn h×nh sÏ lµ :
Max a,b : 10
Gia tri cua b va a : 11 7
Gia tri cua b va a va c : 11 7 5
2.9. Hµm víi tham sè cã gi¸ trÞ mÆc ®Þnh
C++ cho phÐp x©y dùng hµm víi c¸c tham sè ®îc khëi g¸n gi¸ trÞ mÆc ®Þnh. Quy
t¾c x©y dùng hµm víi tham sè mÆc ®Þnh nh sau:
• C¸c ®èi cã gi¸ trÞ mÆc ®Þnh cÇn lµ c¸c tham sè cuèi cïng tÝnh tõ tr¸i qua ph¶i.
• NÕu ch¬ng tr×nh sö dông khai b¸o nguyªn mÉu hµm th× c¸c tham sè mÆc ®Þnh
cÇn ®îc khëi g¸n trong nguyªn mÉu hµm, kh«ng ®îc khëi g¸n khëi g¸n l¹i cho c¸c
®èi mÆc ®Þnh trong dßng ®Çu cña ®Þnh nghÜa hµm.
void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234);
void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234)
{
//C¸c c©u lÖnh
}
• Khi x©y dùng hµm, nÕu kh«ng khai b¸o nguyªn mÉu, th× c¸c ®èi mÆc ®Þnh
®îc khëi g¸n trong dßng ®Çu cña ®Þnh nghÜa hµm, vÝ dô:
void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234)
{
20
//C¸c c©u lÖnh
}
Chó ý: §èi víi c¸c hµm cã tham sè mÆc ®Þnh th× lêi gäi hµm cÇn viÕt theo quy ®Þnh:
C¸c tham sè v¾ng mÆt trong lêi gäi hµm t¬ng øng víi c¸c tham sè mÆc ®Þnh cuèi cïng
(tÝnh tõ tr¸i sang ph¶i), vÝ dô víi hµm:
void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234);
th× c¸c lêi gäi hµm ®óng:
f(3,3.4,”TIN HOC”,10,1.0);//§Çy ®ñ tham sè
f(3,3.4,”ABC”); //ThiÕu 2 tham sè cuèi
f(3,3.4); //ThiÕu 3 tham sè cuèi
C¸c lêi gäi hµm sai:
f(3);
f(3,3.4, ,10);
VÝ dô 2.12
#include <iostream.h>
#include <conio.h>
void ht(char *dc="TRUNG TAM",int n=5);
void ht(char *dc,int n)
{
for(int i=0;i<n;++i)
cout<<"n" <<dc;
}
void main()
{
ht();// in dong chu "TRUNG TAM"tren 5 dong
ht("ABC",3);// in dong chu "ABC"tren 3 dong
ht("DEF");// in dong chu "DEF"tren 5 dong
getch();
}
2.10. C¸c hµm néi tuyÕn (inline)
ViÖc tæ chøc ch¬ng tr×nh thµnh c¸c hµm cã u ®iÓm ch¬ng tr×nh ®îc chia thµnh
c¸c ®¬n vÞ ®éc lËp, ®iÒu nµy gi¶m ®îc kÝch thíc ch¬ng tr×nh, v× mçi ®o¹n chong
tr×nh thùc hiÖn nhiÖm vô cña hµm ®îc thay b»ng lêi gäi hµm. Tuy nhiªn hµm còng cã
nhîc ®iÓm lµ lµm lµ chËm tèc ®é thùc hiÖn ch¬ng tr×nh v× ph¶i thùc hiÖn mét sè thao
t¸c cã tÝnh thñ tôc mçi khi gäi hµm nh: cÊp ph¸t vïng nhí cho c¸c tham sè vµ biÕn côc
bé, truyÒn d÷ liÖu cña c¸c tham sè cho c¸c ®èi, gi¶i phãng vïng nhí tríc khi tho¸t khái
hµm.
C++ cho kh¶ n¨ng kh¾c phôc ®îc nhîc ®iÓm nãi trªn b»ng c¸ch dïng hµm néi
tuyÕn. §Ó biÕn mét hµm thµnh hµm néi tuyÕn ta viÕt thªm tõ khãa inline vµo tríc khai
b¸o nguyªn mÉu hµm.
Chó ý: Trong mäi trêng hîp, tõ khãa inline ph¶i xuÊt hiÖn tríc c¸c lêi gäi hµm th× tr×nh
biªn dÞch míi biÕt cÇn xö lý hµm theo kiÓu inline.
VÝ dô hµm f() trong ch¬ng tr×nh sau sÏ kh«ng ph¶i lµ hµm néi tuyÕn v× inline viÕt
sau lêi gäi hµm.
VÝ dô 2.13
21
#include <iostream.h>
#include <conio.h>
void main()
{
int s ;
s=f(5,6);
cout<<s;
getch();
}
inline int f(int a,int b)
{
return a*b;
}
Chó ý:
 Ch¬ng tr×nh dÞch c¸c hµm inline nh t¬ng tù nh c¸c macro, nghÜa lµ nã sÏ thay ®æi
lêi gäi hµm b»ng mét ®o¹n ch¬ng tr×nh thùc hiÖn nhiÖm vô hµm. C¸ch lµm nµy sÏ
t¨ng tèc ®é ch¬ng tr×nh do kh«ng ph¶i thùc hiÖn c¸c thao t¸c cã tÝnh thñ tôc khi gäi
hµm nhng l¹i lµm t¨ng khèi lîng bé nhí ch¬ng tr×nh (nhÊt lµ ®èi víi c¸c hµm néi tuyÕn
cã nhiÒu c©u lÖnh). V× vËy chØ nªn dïng hµm inline ®èi víi c¸c hµm cã néi dung
®¬n gi¶n.
 Kh«ng ph¶i khi gÆp tõ kho¸ inline lµ ch¬ng tr×nh dÞch nhÊt thiÕt ph¶i xö lý hµm theo
kiÓu néi tuyÕn. Tõ kho¸ inline chØ lµ mét tõ kho¸ gîi ý cho ch¬ng tr×nh dÞch chø
kh«ng ph¶i lµ mét mÖnh lÖnh b¾t buéc.
VÝ dô 2.14 Chong tr×nh sau sö dông hµm inline ®Ó tÝnh chu vi vµ diÖn tÝch h×nh ch÷
nhËt.
#include <iostream.h>
#include <conio.h>
inline void dtcvhcn(int a,int b,int &dt,int &cv)
{
dt=a*b;
cv=2*(a+b);
}
void main()
{
int a[20],b[20],cv[20],dt[20],n;
cout<<"n So hinh chu nhat";
cin>>n;
for(int i=0;i<n;++i)
{
cout<<"n Nhap 2 canh cua hinh chu nhat"<<i<<":";
cin>>a[i]>>b[i];
dtcvhcn(a[i],b[i],dt[i],cv[i]);
}
clrscr();
for(i=0;i<n;++i)
22
{
cout<<"n Hinh chu nhat thu "<<i+1<<":";
cout<<"n Do dai hai canh "<<a[i]<<"va"<<b[i];
cout<<"n dien tich "<<dt[i];
cout<<"n chu vi "<<cv[i];
}
getch();
}
VÝ dô 2.15 Mét c¸ch viÕt kh¸c cña ch¬ng tr×nh trong vÝ dô 2.14
#include <iostream.h>
#include <conio.h>
inline void dtcvhcn(int a,int b,int &dt,int &cv);
void main()
{
int a[20],b[20],cv[20],dt[20],n;
cout<<"n So hinh chu nhat";
cin>>n;
for(int i=0;i<n;++i)
{
cout<<"n Nhap 2 canh cua hinh chu nhat"<<i<<":";
cin>>a[i]>>b[i];
dtcvhcn(a[i],b[i],dt[i],cv[i]);
}
clrscr();
for(i=0;i<n;++i)
{
cout<<"n Hinh chu nhat thu "<<i+1<<":";
cout<<"n Do dai hai canh "<<a[i]<<"va"<<b[i];
cout<<"n dien tich "<<dt[i];
cout<<"n chu vi "<<cv[i];
}
getch();
}
void dtcvhcn(int a,int b,int &dt ,int &cv)
{
dt=a*b;
cv=2*(a+b);
}
2.11. Hµm t¶i béi
C¸c hµm t¶i béi lµ c¸c hµm cã cïng mét tªn vµ cã tËp ®èi kh¸c nhau (vÒ sè lîng c¸c
®èi hoÆc kiÓu). Khi gÆp lêi gäi c¸c hµm t¶i béi th× tr×nh biªn dÞch sÏ c¨n cø vµo sè l-
îng vµ kiÓu c¸c tham sè ®Ó gäi hµm cã ®óng tªn vµ ®óng c¸c tham sè t¬ng øng.
VÝ dô 2.16 Ch¬ng tr×nh t×m max cña mét d·y sè nguyªn vµ max cña mét dÉy sè thùc.
Trong ch¬ng tr×nh cã 6 hµm: hai hµm dïng ®Ó nhËp d·y sè nguyªn vµ d·y sè thùc cã
23
tªn chung lµ nhapds, bèn hµm: tÝnh max 2 sè nguyªn, tÝnh max 2 sè thùc, tÝnh max
cña dÉy sè nguyªn, tÝnh max cña dÉy sè thùc ®îc ®Æt chung mét tªn lµ max.
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
void nhapds(int *x,int n);
void nhapds(double *x,int n);
int max(int x,int y);
double max(double x,double y);
void nhapds(int *x,int n)
{
for(int i=0;i<n;++i)
{
cout<<"Phan tu "<<i<<" = ";
cin>>x[i];
}
}
void nhapds(double *x,int n)
{
for (int i=0;i<n;i++)
{
cout<<"Phan tu "<<i<<" = ";
cin>>x[i];
}
}
int max(int x,int y)
{
return x>y?x:y;
}
double max(double x,double y)
{
return x>y?x:y;
}
int max(int *x,int n)
{
int s=x[0];
for(int i=1;i<n;++i)
s=max(s,x[i]);
return s;
}
double max(double *x,int n)
{
double s=x[0];
for(int i=1;i<n;++i)
24
s=max(s,x[i]);
return s;
}
void main()
{
int a[20],n,ni,nd,maxi;
double x[20],maxd;
clrscr();
cout<<"n So phan tu nguyen n: ";
cin>>ni;
cout<<"n Nhap day so nguyen: ";
nhapds(a,ni);
cout<<"n So phan tu so thuc: ";
cin>>nd;
cout<<"n Nhap day so thuc: ";
nhapds(x,nd);
maxi=max(a,ni);
maxd=max(x,nd);
cout<<"n Max day so nguyen ="<<maxi;
cout<<"n Max day so thuc="<<maxd;
getch();
}
Chó ý: NÕu hai hµm trïng tªn vµ trïng ®èi th× tr×nh biªn dÞch kh«ng thÓ ph©n biÖt ®îc.
Ngay c¶ khi hai hµm nµy cã cïng kiÓu kh¸c nhau th× tr×nh biªn dÞch vÉn b¸o lçi. VÝ dô
sau x©y dùng hai hµm cïng cã tªn lµ f vµ cïng mét ®èi nguyªn a, nhng kiÓu hµm kh¸c
nhau. Hµm thø nhÊt cã kiÓu nguyªn( tr¶ vÒ a*a), hµm thø hai cã kiÓu void. Ch¬ng
tr×nh sau sÏ bÞ th«ng b¸o lçi khi biªn dÞch.
VÝ dô 2.17
#include <iostream.h>
#include <conio.h>
int f(int a);
void f(int a);
int f(int a)
{
return a*a;
}
void f(int a)
{
cout<<"n"<<a;
}
void main()
{
int b = f(5);
f(b);
25
getch();
}
26
Bµi tËp
1. ViÕt ch¬ng tr×nh thùc hiÖn c¸c yªu cÇu sau ®©y:
- NhËp d÷ liÖu cho c¸c sinh viªn (dïng cÊu tróc danh s¸ch liªn kÕt ®¬n), c¸c
th«ng tin cña sinh viªn bao gåm: m· sinh viªn, hä tªn, líp, ®iÓm trung b×nh.
- Ch¬ng tr×nh cã sö dông to¸n tö new vµ delete.
- In ra danh s¸ch sinh viªn cã s¾p xÕp vÞ thø theo ®iÓm trung b×nh.
2. ViÕt ch¬ng tr×nh ®Ó s¾p xÕp mét m¶ng thùc hai chiÒu theo thø tù t¨ng dÇn,
trong ch¬ng tr×nh cã cã sö dông to¸n tö new vµ delete.
3. ViÕt c¸c hµm t¶i béi ®Ó tÝnh diÖn tÝch tam gi¸c, diÖn tÝch h×nh ch÷ nhËt,
diÖn tÝch h×nh trßn.
4. ViÕt ch¬ng tr×nh nh©n hai ma trËn Amxn vµ Bnxp , mçi ma tr©n ®îc cÊp ph¸t
®éng vµ c¸c gi¸ trÞ cña chóng ph¸t sinh ngÉu nhiªn.
27
CH¬NG 3
LíP
Ch¬ng nµy tr×nh bµy nh÷ng vÊn ®Ò sau ®©y:
 §Þnh nghÜa líp
 T¹o lËp ®èi tîng
 Truy nhËp ®Õn c¸c thµnh phÇn cña líp
 Con trá ®èi tîng
 Con trá this
 Hµm b¹n
 D÷ liÖu thµnh phÇn tÜnh, hµm thµnh phÇn tÜnh
 Hµm t¹o, hµm hñy
 Hµm t¹o sao chÐp
Líp lµ kh¸i niÖm trung t©m cña lËp tr×nh híng ®èi tîng, nã lµ sù më réng cña c¸c
kh¸i niÖm cÊu tróc (struct) cña C. Ngoµi c¸c thµnh phÇn d÷ liÖu, líp cßn chøa c¸c thµnh
phÇn hµm, cßn gäi lµ ph¬ng thøc (method) hoÆc hµm thµnh viªn (member function).
Líp cã thÓ xem nh mét kiÓu d÷ liÖu c¸c biÕn, m¶ng ®èi tîng. Tõ mét líp ®· ®Þnh
nghÜa, cã thÓ t¹o ra nhiÒu ®èi tîng kh¸c nhau, mçi ®èi tîng cã vïng nhí riªng.
Ch¬ng nµy sÏ tr×nh bµy c¸ch ®Þnh nghÜa líp, c¸ch x©y dùng ph¬ng thøc, gi¶i
thÝch vÒ ph¹m vi truy nhËp, sö dông c¸c thµnh phÇn cña líp, c¸ch khai b¸o biÕn, m¶ng
cÊu tróc, lêi gäi tíi c¸c ph¬ng thøc .
3.1. §Þnh nghÜa líp
Có ph¸p: Líp ®îc ®Þnh nghÜa theo mÉu :
class tªn_líp
{
private: [Khai b¸o c¸c thuéc tÝnh]
[§Þnh nghÜa c¸c hµm thµnh phÇn (ph¬ng thøc)]
public : [Khai b¸o c¸c thuéc tÝnh]
[§Þnh nghÜa c¸c hµm thµnh phÇn (ph¬ng thøc)]
} ;
Thuéc tÝnh cña líp ®îc gäi lµ d÷ liÖu thµnh phÇn vµ hµm ®îc gäi lµ ph¬ng thøc
hoÆc hµm thµnh viªn. Thuéc tÝnh vµ hµm ®îc gäi chung lµ c¸c thµnh phÇn cña líp. C¸c
thµnh phÇn cña líp ®îc tæ chøc thµnh hai vïng: vïng së h÷u riªng (private) vµ vïng dïng
chung (public) ®Ó quy ®Þnh ph¹m vi sö dông cña c¸c thµnh phÇn. NÕu kh«ng quy
®Þnh cô thÓ (kh«ng dïng c¸c tõ khãa private vµ public) th× C++ hiÓu ®ã lµ private. C¸c
thµnh phÇn private chØ ®îc sö dông bªn trong líp (trong th©n cña c¸c hµm thµnh
phÇn). C¸c thµnh phÇn public ®îc phÐp sö dông ë c¶ bªn trong vµ bªn ngoµi líp. C¸c
hµm kh«ng ph¶i lµ hµm thµnh phÇn cña líp th× kh«ng ®îc phÐp sö dông c¸c thµnh
phÇn nµy.
Khai b¸o c¸c thuéc tÝnh cña líp: ®îc thùc hiÖn y nh viÖc khai b¸o biÕn. Thuéc tÝnh cña
líp kh«ng thÓ cã kiÓu chÝnh cña líp ®ã, nhng cã thÓ lµ kiÓu con trá cña líp nµy,
VÝ dô:
class A
{
A x; //Kh«ng cho phÐp, v× x cã kiÓu líp A
28
A *p ; // Cho phÐp, v× p lµ con trá kiÓu líp A
} ;
§Þnh nghÜa c¸c hµm thµnh phÇn: C¸c hµm thµnh phÇn cã thÓ ®îc x©y dùng bªn
ngoµi hoÆc bªn trong ®Þnh nghÜa líp. Th«ng thêng, c¸c hµm thµnh phÇn ®¬n gi¶n, cã
Ýt dßng lÖnh sÏ ®îc viÕt bªn trong ®Þnh nghÜa líp, cßn c¸c hµm thµnh phÇn dµi th×
viÕt bªn ngoµi ®Þnh nghÜa líp. C¸c hµm thµnh phÇn viÕt bªn trong ®Þnh nghÜa líp ®-
îc viÕt nh hµm th«ng thêng. Khi ®Þnh nghÜa hµm thµnh phÇn ë bªn ngoµi líp, ta dïng
có ph¸p sau ®©y:
KiÓu_tr¶_vÒ_cña_hµm Tªn_líp::Tªn_hµm(khai b¸o c¸c tham sè)
{ [néi dung hµm]
}
To¸n tö :: ®îc gäi lµ to¸n tö ph©n gi¶i miÒn x¸c ®Þnh, ®îc dïng ®Ó chØ ra líp mµ
hµm ®ã thuéc vµo.
Trong th©n hµm thµnh phÇn, cã thÓ sö dông c¸c thuéc tÝnh cña líp, c¸c hµm
thµnh phÇn kh¸c vµ c¸c hµm tù do trong ch¬ng tr×nh.
Chó ý :
• C¸c thµnh phÇn d÷ liÖu khai b¸o lµ private nh»m b¶o ®¶m nguyªn lý che dÊu
th«ng tin, b¶o vÖ an toµn d÷ liÖu cña líp, kh«ng cho phÐp c¸c hµm bªn ngoµi
x©m nhËp vµo d÷ liÖu cña líp .
• C¸c hµm thµnh phÇn khai b¸o lµ public cã thÓ ®îc gäi tíi tõ c¸c hµm thµnh phÇn
public kh¸c trong ch¬ng tr×nh .
3.2. T¹o lËp ®èi tîng
Sau khi ®Þnh nghÜa líp, ta cã thÓ khai b¸o c¸c biÕn thuéc kiÓu líp. C¸c biÕn nµy
®îc gäi lµ c¸c ®èi tîng. Có ph¸p khai b¸o biÕn ®èi tîng nh sau:
Tªn_líp Danh_s¸ch_biÕn ;
§èi tîng còng cã thÓ khai b¸o khi ®Þnh nghÜa líp theo có ph¸p sau:
class tªn_líp
{
...
} <Danh_s¸ch_biÕn>;
Mçi ®èi tîng sau khi khai b¸o sÏ ®îc cÊp ph¸t mét vïng nhí riªng ®Ó chøa c¸c thuéc
tÝnh cña chóng. Kh«ng cã vïng nhí riªng ®Ó chøa c¸c hµm thµnh phÇn cho mçi ®èi t-
îng. C¸c hµm thµnh phÇn sÏ ®îc sö dông chung cho tÊt c¶ c¸c ®èi tîng cïng líp.
3.3. Truy nhËp tíi c¸c thµnh phÇn cña líp
• §Ó truy nhËp ®Õn d÷ liÖu thµnh phÇn cña líp, ta dïng có ph¸p:
Tªn_®èi_tîng. Tªn_thuéc_tÝnh
CÇn chó ý r»ng d÷ liÖu thµnh phÇn riªng chØ cã thÓ ®îc truy nhËp bëi nh÷ng hµm
thµnh phÇn cña cïng mét líp, ®èi tîng cña líp còng kh«ng thÓ truy nhËp.
• §Ó sö dông c¸c hµm thµnh phÇn cña líp, ta dïng có ph¸p:
Tªn_®èi_tîng. Tªn_hµm (C¸c_khai_b¸o_tham_sè_thùc_sù)
VÝ dô 3.1
#include <conio.h>
#include <iostream.h>
class DIEM
29
{
private :
int x,y ;
public :
void nhapsl( )
{
cout << "n Nhap hoanh do va tung do cua diem:";
cin >>x>>y ;
}
void hienthi( )
{ cout<<"n x = " <<x<<" y = "<<y<<endl;}
} ;
void main()
{ clrscr();
DIEM d1;
d1.nhapsl();
d1.hienthi();
getch();
}
VÝ dô 3.2
#include <conio.h>
#include <iostream.h>
class A
{ int m,n;
public :
void nhap( )
{
cout << "n Nhap hai so nguyen : " ;
cin>>m>>n ;
}
int max()
{
return m>n?m:n;
}
void hienthi( )
{ cout<<"n Thanh phan du lieu lon nhat x = "
<<max()<<endl;}
};
void main ()
{ clrscr();
A ob;
ob.nhap();
ob.hienthi();
getch();
30
}
Chó ý: C¸c hµm tù do cã thÓ cã c¸c ®èi lµ ®èi tîng nhng trong th©n hµm kh«ng thÓ truy
nhËp ®Õn c¸c thuéc tÝnh cña líp. VÝ dô gi¶ sö ®· ®Þnh nghÜa líp :
class DIEM
{
private :
double x,y ; // toa do cua diem
public :
void nhapsl()
{
cout << “ Toa do x,y : “ ;
cin >> x>>y ;
}
void in()
{
cout << “x =””<<x<<”y=”<<y ;
}
} ;
Dïng líp DIEM, ta x©y dùng hµm tù do tÝnh ®é ®µi cña ®o¹n th¼ng ®i qua hai
®iÓm nh sau :
double do_dai ( DIEM d1, DIEM d2 )
{
return sqrt(pow(d1.x-d2.x,2) + pow(d1.y-d2.y,2));
}
Ch¬ng tr×nh dÞch sÏ b¸o b¸o lçi ®èi víi hµm nµy. Bëi v× trong th©n hµm kh«ng
cho phÐp sö dông c¸c thuéc tÝnh d1.x,d2.x,d1.y cña c¸c ®èi tîng d1 vµ d2 thuéc líp
DIEM .
VÝ dô 3.3 VÝ dô sau minh häa viÖc sö dông hµm thµnh phÇn víi tham sè mÆc ®Þnh:
#include <iostream.h>
#include <conio.h>
class Box
{
private:
int dai;
int rong;
int cao;
public:
int get_thetich(int lth,int wdth = 2,int ht = 3);
};
int Box::get_thetich(int l, int w, int h)
{
dai = l;
rong = w;
cao = h;
cout<< dai<<'t'<< rong<<'t'<<cao<<'t';
return dai * rong * cao;
}
31
void main()
{
Box ob;
int x = 10, y = 12, z = 15;
cout <<"Dai Rong Cao Thetichn";
cout << ob.get_thetich(x, y, z) << "n";
cout << ob.get_thetich(x, y) << "n";
cout << ob.get_thetich(x) << "n";
cout << ob.get_thetich(x, 7) << "n";
cout << ob.get_thetich(5, 5, 5) << "n";
getch();
}
KÕt qu¶ ch¬ng tr×nh nh sau:
Dai Rong Cao Thetich
10 12 15 1800
10 12 3 360
10 2 3 60
10 7 3 210
5 5 5 125
VÝ dô 3.4 VÝ dô sau minh häa viÖc sö dông hµm inline trong líp:
#include <iostream.h>
#include <string.h>
#include <conio.h>
class phrase
{
private:
char dongtu[10];
char danhtu[10];
char cumtu[25];
public:
phrase();
inline void set_danhtu(char* in_danhtu);
inline void set_dongtu(char* in_dongtu);
inline char* get_phrase(void);
};
void phrase::phrase()
{
strcpy(danhtu,"");
strcpy(dongtu,"");
strcpy(cumtu,"");
}
inline void phrase::set_danhtu(char* in_danhtu)
{
strcpy(danhtu, in_danhtu);
}
inline void phrase::set_dongtu(char* in_dongtu)
{
32
strcpy(dongtu, in_dongtu);
}
inline char* phrase::get_phrase(void)
{
strcpy(cumtu,dongtu);
strcat(cumtu," the ");
strcat(cumtu,danhtu);
return cumtu;
}
void main()
{
phrase text;
cout << "Cum tu la : -> " << text.get_phrase()
<< "n";
text.set_danhtu("file");
cout << "Cum tu la : -> " <<
text.get_phrase()<<"n";
text.set_dongtu("Save");
cout << "Cum tu la : -> " <<
text.get_phrase()<<"n";
text.set_danhtu("program");
cout << "Cum tu la : -> " <<
text.get_phrase()<<"n";
}
KÕt qu¶ ch¬ng tr×nh nh sau:
Cum tu la : -> the
Cum tu la : -> the file
Cum tu la : -> Save the file
Cum tu la : -> Save the program
VÝ dô 3.5 VÝ dô sau minh häa viÖc sö dông tõ khãa const trong líp:
#include <iostream.h>
#include <conio.h>
class constants
{
private:
int number;
public:
void print_it(const int data_value);
};
void constants::print_it(const int data_value)
{
number = data_value;
cout << number << "n";
}
void main()
{
constants num;
const int START = 3;
33
const int STOP = 6;
int index;
for (index=START; index<=STOP; index++)
{
cout<< "index = " ;
num.print_it(index);
cout<< "START = " ;
num.print_it(START);
}
getch();
}
KÕt qu¶ ch¬ng tr×nh nh sau:
index = 3
START = 3
index = 4
START = 3
index = 5
START = 3
index = 6
START = 3
3.4. Con trá ®èi tîng
Con trá ®èi tîng dïng ®Ó chøa ®Þa chØ cña biÕn ®èi tîng, ®îc khai b¸o nh sau :
Tªn_líp * Tªn_con_ trá ;
VÝ dô : Dïng líp DIEM, ta cã thÓ khai b¸o:
DIEM *p1, *p2, *p3 ; // Khai b¸o 3 con trá p1, p2, p3
DIEM d1, d2 ; //Khai b¸o hai ®èi tîng d1, d2
DIEM d [20] ; // Khai b¸o m¶ng ®èi tîng
Cã thÓ thùc hiÖn c©u lÖnh :
p1 = &d2 ; //p1 chøa ®Þa chØ cña d2, p1 trá tíi d2
p2 =d ; // p2 trá tíi ®Çu m¶ng d
p3 =new DIEM //t¹o mét ®èi tîng vµ chøa ®Þa chØ cña nã vµo p3
§Ó truy xuÊt c¸c thµnh phÇn cña líp tõ con trá ®èi tîng, ta viÕt nh sau :
Tªn_con_trá -> Tªn_thuéc_tÝnh
Tªn_con_trá -> Tªn_hµm(c¸c tham sè thùc sù)
NÕu con trá chøa ®Çu ®Þa chØ cña m¶ng, cã thÓ dïng con trá nh tªn m¶ng.
VÝ dô 3.6
#include <iostream.h>
#include <conio.h>
class mhang
{ int maso;
float gia;
public: void getdata(int a, float b)
{maso= a; gia= b;}
void show()
{ cout << "maso" << maso<< endl;
cout << "gia" << gia<< endl;
34
}
};
const int k=5;
void main()
{ clrscr();
mhang *p = new mhang[k];
mhang *d = p;
int x,i;
float y;
cout<<"nNhap vao du lieu 5 mat hang :";
for (i = 0; i <k; i++)
{ cout <<"nNhap ma hang va don gia cho mat hang thu "
<<i+1;
cin>>x>>y;
p -> getdata(x,y);
p++;}
for (i = 0; i <k; i++)
{ cout <<"nMat hang thu : " << i + 1 <<
endl;
d -> show();
d++;
}
getch();
}
3.5. Con trá this
Mçi hµm thµnh phÇn cña líp cã mét tham sè Èn, ®ã lµ con trá this. Con trá this trá
®Õn tõng ®èi tîng cô thÓ. Ta h·y xem l¹i hµm nhapsl() cña líp DIEM trong vÝ dô ë trªn:
void nhapsl( )
{
cout << "n Nhap hoanh do va tung do cua diem : ";
cin >>x>>y;
}
Trong hµm nµy ta sö dông tªn c¸c thuéc tÝnh x,y mét c¸ch ®¬n ®éc. §iÒu nµy d-
êng nh m©u thuÈn víi quy t¾c sö dông thuéc tÝnh. Tuy nhiªn nã ®îc lý gi¶i nh sau: C++
sö dông mét con trá ®Æc biÖt trong c¸c hµm thµnh phÇn. C¸c thuéc tÝnh viÕt trong
hµm thµnh phÇn ®îc hiÓu lµ thuéc mét ®èi tîng do con trá this trá tíi. Nh vËy hµm
nhapsl() cã thÓ viÕt mét c¸ch têng minh nh sau:
void nhapsl( )
{
cout << "n Nhap hoanh do va tung do cua diem:" ;
cin >>this->x>>this->y ;
}
Con trá this lµ ®èi thø nhÊt cña hµm thµnh phÇn. Khi mét lêi gäi hµm thµnh phÇn
®îc ph¸t ra bëi mét ®èi tîng th× tham sè truyÒn cho con trá this chÝnh lµ ®Þa chØ cña
®èi tîng ®ã.
35
VÝ dô: XÐt mét lêi gäi tíi hµm nhapsl() :
DIEM d1 ;
d1.nhapsl();
Trong trêng hîp nµy cña d1 th× this =&d1. Do ®ã this -> x chÝnh lµ d1.x vµ this-> y
chÝnh lµ d1.y
Chó ý: Ngoµi tham sè ®Æc biÖt this kh«ng xuÊt hiÖn mét c¸ch têng minh, hµm thµnh
phÇn líp cã thÓ cã c¸c tham«1 kh¸c ®îc khai b¸o nh trong c¸c hµm th«ng thêng.
VÝ dô 3.7
#include <iostream.h>
#include <conio.h>
class time
{ int h,m;
public :
void nhap(int h1, int m1)
{ h= h1; m = m1;}
void hienthi(void)
{ cout <<h << " gio "<<m << " phut"<<endl;}
void tong(time, time);
};
void time::tong(time t1, time t2)
{ m= t1.m+ t2.m; //this->m = t1.m+ t2.m;
h= m/60; //this->h = this->m/60;
m= m%60; //this->m = this->m%60;
h = h+t1.h+t2.h; //this->h = this->h + t1.h+t2.h;
}
void main()
{
clrscr();
time ob1, ob2,ob3;
ob1.nhap(2,45);
ob2.nhap(5,40);
ob3.tong(ob1,ob2);
cout <<"object 1 = "; ob1.hienthi();
cout <<"object 2 = "; ob2. hienthi();
cout <<"object 3 = "; ob3. hienthi();
getch();
}
Ch¬ng tr×nh cho kÕt qu¶ nh sau :
object 1 = 2 gio 45 phut
object 2 = 5 gio 40 phut
object 3 = 8 gio 25 phut
36
3.6. Hµm b¹n
Trong thùc tÕ thêng x·y ra trêng hîp cã mét sè líp cÇn sö dông chung mét hµm.
C++ gi¶i quyÕt vÊn ®Ò nµy b»ng c¸ch dïng hµm b¹n. §Ó mét hµm trë thµnh b¹n cña
mét líp, cã 2 c¸ch viÕt:
C¸ch 1: Dïng tõ khãa friend ®Ó khai b¸o hµm trong líp vµ x©y dùng hµm bªn ngoµi nh
c¸c hµm th«ng thêng (kh«ng dïng tõ khãa friend). MÉu viÕt nh sau :
class A
{
private :
// Khai b¸o c¸c thuéc tÝnh
public :
...
// Khai b¸o c¸c hµm b¹n cña líp A
friend void f1 (...) ;
friend double f2 (...) ;
...
} ;
// X©y dùng c¸c hµm f1,f2,f3
void f1 (...)
{
...
}
double f2 (...)
{
...
}
C¸ch 2: Dïng tõ khãa friend ®Ó x©y dùng hµm trong ®Þnh nghÜa líp . MÉu viÕt nh sau
:
class A
{
private :
// Khai b¸o c¸c thuéc tÝnh
public :
...
// Khai b¸o c¸c hµm b¹n cña líp A
void f1 (...)
{
...
}
double f2 (...)
{
...
}
37
} ;
Hµm b¹n cã nh÷ng tÝnh chÊt sau:
- Hµm b¹n kh«ng ph¶i lµ hµm thµnh phÇn cña líp.
- ViÖc truy nhËp tíi hµm b¹n ®îc thùc hiÖn nh hµm th«ng thêng.
- Trong th©n hµm b¹n cña mét líp cã thÓ truy nhËp tíi c¸c thuéc tÝnh cña ®èi tîng thuéc
líp nµy. §©y lµ sù kh¸c nhau duy nhÊt gi÷a hµm b¹n vµ hµm th«ng thêng.
- Mét hµm cã thÓ lµ b¹n cña nhiÒu líp. Lóc ®ã nã cã quyÒn truy nhËp tíi tÊt c¶ c¸c
thuéc tÝnh cña c¸c ®èi tîng trong c¸c líp nµy. §Ó lµm cho hµm f trë thµnh b¹n cña c¸c líp
A, B vµ C ta sö dông mÈu viÕt sau :
class B ; //Khai b¸o tríc líp A
class B ; // Khai b¸o tríc líp B
class C ; // Khai b¸o tríc líp C
// §Þnh nghÜa líp A
class A
{
// Khai b¸o f lµ b¹n cña A
friend void f(... )
} ;
// §Þnh nghÜa líp B
class B
{
// Khai b¸o f lµ b¹n cña B
friend void f(...)
} ;
// §Þnh nghÜa líp C
class C
{
// Khai b¸o f lµ b¹n cña C
friend void f(...)
} ;
// X©y dùng hµm f
void f(...)
{
...
} ;
VÝ dô 3.8
#include <iostream.h>
#include <conio.h>
class sophuc
{float a,b;
public : sophuc() {}
sophuc(float x, float y)
{a=x; b=y;}
friend sophuc tong(sophuc,sophuc);
38
friend void hienthi(sophuc);
};
sophuc tong(sophuc c1,sophuc c2)
{sophuc c3;
c3.a=c1.a + c2.a ;
c3.b=c1.b + c2.b ;
return (c3);
}
void hienthi(sophuc c)
{cout<<c.a<<" + "<<c.b<<"i"<<endl; }
void main()
{ clrscr();
sophuc d1 (2.1,3.4);
sophuc d2 (1.2,2.3) ;
sophuc d3 ;
d3 = tong(d1,d2);
cout<<"d1= ";hienthi(d1);
cout<<"d2= ";hienthi(d2);
cout<<"d3= ";hienthi(d3);
getch();
}
Ch¬ng tr×nh cho kÕt qu¶ nh sau :
d1= 2.1 + 3.4i
d2= 1.2 + 2.3i
d3= 3.3 + 5.7i
VÝ dô 3.9
#include <iostream.h>
#include <conio.h>
class LOP1;
class LOP2
{
int v2;
public:
void nhap(int a)
{ v2=a;}
void hienthi(void)
{ cout<<v2<<"n";}
friend void traodoi(LOP1 &, LOP2 &);
};
class LOP1
{
int v1;
public:
39
void nhap(int a)
{ v1=a;}
void hienthi(void)
{ cout<<v1<<"n";}
friend void traodoi(LOP1 &, LOP2 &);
};
void traodoi(LOP1 &x, LOP2 &y)
{
int t = x.v1;
x.v1 = y.v2;
y.v2 = t;
}
void main()
{
clrscr();
LOP1 ob1;
LOP2 ob2;
ob1.nhap(150);
ob2.nhap(200);
cout << "Gia tri ban dau :" << "n";
ob1.hienthi();
ob2.hienthi();
traodoi(ob1, ob2); //Thuc hien hoan doi
cout << "Gia tri sau khi thay doi:" << "n";
ob1.hienthi();
ob2.hienthi();
getch();
}
Ch¬ng tr×nh cho kÕt qu¶ nh sau:
Gia tri ban dau :
150
200
Gia tri sau khi thay doi:
200
150
3.7. D÷ liÖu thµnh phÇn tÜnh vµ hµm thµnh phÇn tÜnh
3.7.1. D÷ liÖu thµnh phÇn tÜnh
D÷ liÖu thµnh phÇn tÜnh ®îc khai b¸o b»ng tõ kho¸ static vµ ®îc cÊp ph¸t mét vïng
nhÝ cè ®Þnh, nã tån t¹i ngay c¶ khi líp cha cã mét ®èi tîng nµo c¶. D÷ liÖu thµnh phÇn
tÜnh lµ chung cho c¶ líp, nã kh«ng ph¶i lµ riªng cña mçi ®èi tîng, vÝ dô:
class A
{
private:
40
static int ts; // Thµnh phÇn tÜnh
int x;
...
};
A u, v; // Khai b¸o 2 ®èi tîng
Gi÷a c¸c thµnh phÇn x vµ ts cã sù kh¸c nhau nh sau: u.x vµ v.x cã 2 vïng nhí kh¸c nhau,
trong khi u.ts vµ v.ts chØ lµ mét, chóng cïng biÓu thÞ mét vïng nhí, thµnh phÇn ts tån
t¹i ngay khi u vµ v cha khai b¸o.
§Ó biÓu thÞ thµnh phÇn tÜnh, ta cã thÓ dïng tªn líp, vÝ dô: A::ts
Khai b¸o vµ khëi g¸n gi¸ trÞ cho thµnh phÇn tÜnh: Thµnh phÇn tÜnh sÏ ®îc cÊp ph¸t bé
nhí vµ khëi g¸n gi¸ trÞ ®Çu b»ng mét c©u lÖnh khai b¸o ®Æt sau ®Þnh nghÜa líp theo
mÉu nh sau:
int A::ts; // Khëi g¸n cho ts gi¸ trÞ 0
int A::ts = 1234; // Khëi g¸n cho ts gi¸ trÞ 1234
Chó ý: Khi cha khai b¸o th× thµnh phÇn tÜnh cha tån t¹i. H·y xem ch¬ng tr×nh sau:
VÝ dô 3.10
#include <conio.h>
#include <iostream.h>
class HDBH
{
private:
char *tenhang;
double tienban;
static int tshd;
static double tstienban;
public:
static void in()
{
cout <<”n” << tshd;
cout <<”n” << tstienban;
}
};
void main ()
{
HDBH::in();
getch();
}
C¸c thµnh phÇn tÜnh tshd vµ tstienban cha khai b¸o, nªn cha tån t¹i. V× vËy c¸c
c©u lÖnh in gi¸ trÞ c¸c thµnh phÇn nµy trong hµm in() lµ kh«ng thÓ ®îc. Khi dÞch ch-
¬ng tr×nh, sÏ nhËn ®îc c¸c th«ng b¸o lçi. Cã thÓ söa ch¬ng tr×nh trªn b»ng c¸ch ®a vµo
c¸c lÖnh khai b¸o c¸c thµnh phÇn tÜnh tshd vµ tstienban nh sau:
VÝ dô 3.11
#include <conio.h>
#include <iostream.h>
41
class HDBH
{
private:
int shd;
char *tenhang;
double tienban;
static int tshd;
static double tstienban;
public:
static void in()
{
cout <<”n” <<tshd;
cout <<”n” <<tstienban;
}
};
int HDBH::tshd=5
double HDBH::tstienban=20000.0;
void main()
{
HDBH::in();
getch();
}
3.7.2. Hµm thµnh phÇn tÜnh
Hµm thµnh phÇn tÜnh ®îc viÕt theo mét trong hai c¸ch:
- Dïng tõ kho¸ static ®Æt tríc ®Þnh nghÜa hµm thµnh phÇn viÕt bªn trong ®Þnh
nghÜa líp.
- NÕu hµm thµnh phÇn x©y dùng bªn ngoµi ®Þnh nghÜa líp, th× dïng tõ kho¸
static ®Æt tríc khai b¸o hµm thµnh phÇn bªn trong ®Þnh nghÜa líp. Kh«ng cho phÐp
dïng tõ kho¸ static ®Æt tríc ®Þnh nghÜa hµm thµnh phÇn viÕt bªn ngoµi ®Þnh nghÜa
líp.
C¸c ®Æc tÝnh cña hµm thµnh phÇn tÜnh:
- Hµm thµnh phÇn tÜnh lµ chung cho toµn bé líp vµ kh«ng lÖ thuéc vµo mét ®èi tîng cô
thÓ, nã tån t¹i ngay khi líp cha cã ®èi tîng nµo.
- Lêi gäi hµm thµnh phÇn tÜnh nh sau:
Tªn líp :: Tªn hµm thµnh phÇn tÜnh(c¸c tham sè thùc sù)
- V× hµm thµnh phÇn tÜnh lµ ®éc lËp víi c¸c ®èi tîng, nªn kh«ng thÓ dïng hµm thµnh
phÇn tÜnh ®Ó xö lý d÷ liÖu cña c¸c ®èi tîng trong lêi gäi ph¬ng thøc tÜnh. Nãi c¸ch
kh¸c kh«ng cho phÐp truy nhËp c¸c thuéc tÝnh (trõ thuéc tÝnh tÜnh) trong th©n hµm
thµnh phÇn tÜnh. §o¹n ch¬ng tr×nh sau minh häa ®iÒu nµy:
class HDBH
{
private:
int shd;
char *tenhang;
double tienban;
42
static int tshd;
static double tstienban;
public:
static void in()
{
cout <<”n” << tshd;
cout << ”n” << tstienban;
cout <<”n”<< tenhang //loi
cout <<”n” << tienban; //loi
}
};
VÝ dô 3.12
#include <iostream.h>
#include <conio.h>
class A
{
int m;
static int n; //n la bien tinh
public: void set_m(void) { m= ++n;}
void show_m(void)
{
cout << "n Doi tuong thu:" << m << endl;
}
static void show_n(void)
{
cout << " m = " << n << endl;
}
};
int A::n=1; //khoi gan gia tri ban dau 1 cho bien tinh n
void main()
{
clrscr();
A t1, t2;
t1.set_m();
t2.set_m();
A::show_n();
A t3;
t3.set_m();
A::show_n();
t1.show_m();
t2.show_m();
t3.show_m();
43
getch();
}
KÕt qu¶ ch¬ng tr×nh trªn lµ:
m = 3
m = 4
Doi tuong thu : 2
Doi tuong thu : 3
Doi tuong thu : 4
3.8. Hµm t¹o (constructor)
Hµm t¹o lµ mét hµm thµnh phÇn ®Æc biÖt cña líp lµm nhiÖm vô t¹o lËp mét ®èi t-
îng míi. Ch¬ng tr×nh dÞch sÏ cÊp ph¸t bé nhí cho ®èi tîng, sau ®ã sÏ gäi ®Õn hµm t¹o.
Hµm t¹o sÏ khëi g¸n gi¸ trÞ cho c¸c thuéc tÝnh cña ®èi tîng vµ cã thÓ thùc hiÖn mét sè
c«ng viÖc kh¸c nh»m chuÈn bÞ cho ®èi tîng míi. Khi x©y dùng hµm t¹o cÇn lu ý nh÷ng
®Æc tÝnh sau cña hµm t¹o:
- Tªn hµm t¹o trïng víi tªn cña líp.
- Hµm t¹o kh«ng cã kiÓu tr¶ vÒ.
- Hµm t¹o ph¶i ®îc khai b¸o trong vïng public.
- Hµm t¹o cã thÓ ®îc x©y dùng bªn trong hoÆc bªn ngoµi ®Þnh nghÜa líp.
- Hµm t¹o cã thÓ cã tham sè hoÆc kh«ng cã tham sè.
- Trong mét líp cã thÓ cã nhiÒu hµm t¹o (cïng tªn nhng kh¸c c¸c tham sè).
VÝ dô 3.13
class DIEM
{
private:
int x,y;
public:
DIEM() //Ham tao khong tham so
{
x = y = 0;
}
DIEM(int x1, int y1) //Ham tao co tham so
{
x = x1;y=y1;
}
//Cac thanh phan khac
};
Chó ý 1: NÕu líp kh«ng cã hµm t¹o, ch¬ng tr×nh dÞch sÏ cung cÊp mét hµm t¹o mÆc
®Þnh kh«ng ®èi, hµm nµy thùc chÊt kh«ng lµm g× c¶. Nh vËy mét ®èi tîng t¹o ra chØ
®îc cÊp ph¸t bé nhí, cßn c¸c thuéc tÝnh cña nã cha ®îc x¸c ®Þnh.
VÝ dô 3.14
#include <conio.h>
#inlcule <iostream.h>
class DIEM
44
{
private:
int x,y;
public:
void in()
{
cout <<”n” << y <<” ” << m;
}
};
void main()
{
DIEM d;
d.in();
DIEM *p;
p= new DIEM [10];
clrscr();
d.in();
for (int i=0;1<10;++i)
(p+i)->in();
getch();
}
Chó ý 2:
• Khi mét ®èi tîng ®îc khai b¸o th× hµm t¹o cña líp t¬ng øng sÏ tù ®éng thùc hiÖn
vµ khëi g¸n gi¸ trÞ cho c¸c thuéc tÝnh cña ®èi tîng. Dùa vµo c¸c tham sè trong
khai b¸o mµ ch¬ng tr×nh dÞch sÏ biÕt cÇn gäi ®Õn hµm t¹o nµo.
• Khi khai b¸o m¶ng ®èi tîng kh«ng cho phÐp dïng c¸c tham sè ®Ó khëi g¸n cho
c¸c thuéc tÝnh cña c¸c ®èi tîng m¶ng.
• C©u lÖnh khai b¸o mét biÕn ®èi tîng sÏ gäi tíi hµm t¹o mét lÇn.
• C©u lÖnh khai b¸o mét m¶ng n ®èi tîng sÏ gäi tíi hµm t¹o mÆc ®Þnh n lÇn.
• Víi c¸c hµm cã c¸c tham sè kiÓu líp, th× chóng chØ xem lµ c¸c tham sè h×nh
thøc, v× vËy khai b¸o tham sè trong dßng ®Çu cña hµm sÏ kh«ng t¹o ra ®èi tîng
míi vµ do ®ã kh«ng gäi tíi c¸c hµm t¹o.
VÝ dô 3.15
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
class DIEM
{
private:
int x,y;
public:
DIEM()
{
x = y = 0;
45
}
DIEM(int x1, int y1)
{
x = x1; y = y1;
}
friend void in(DIEM d)
{
cout <<"n" << d.x <<" " << d.y;
}
void in()
{
cout <<"n" << x <<" " << y ;
}
};
void main()
{
DIEM d1;
DIEM d2(2,3);
DIEM *d;
d = new DIEM (5,6);
clrscr();
in(d1); // Goi ham ban in()
d2.in(); // Goi ham thanh phan in()
in(*d); // Goi ham ban in()
DIEM(2,2).in();// Goi ham thanh phan in()
DIEM t[3]; // 3 lan goi ham tao khong doi
DIEM *q; // Goi ham tao khong doi
int n;
cout << "n N = ";
cin >> n;
q = new DIEM [n+1]; //n+1 lan goi ham tao khong doi
for (int i=0;i<=n;++i)
q[i]=DIEM (3+i,4+i);//n+1 lan goi ham tao co doi
for (i=0;i<=n;++i)
q[i].in(); // Goi ham thanh phan in()
for (i=0;i<=n;++i)
DIEM(5+i,6+i).in(); //Goi ham thanh phan in()
getch();
}
Chó ý 3: NÕu trong líp ®· cã Ýt nhÊt mét hµm t¹o, th× hµm t¹o mÆc ®Þnh sÏ kh«ng ®îc
ph¸t sinh n÷a. Khi ®ã mäi c©u lÖnh x©y dùng ®èi tîng míi ®Òu sÏ gäi ®Õn mét hµm t¹o
cña líp. NÕu kh«ng t×m thÊy hµm t¹o cÇn gäi th× ch¬ng tr×nh dÞch sÏ b¸o lçi. §iÒu nµy
thêng x·y ra khi chóng ta kh«ng x©y dùng hµm t¹o kh«ng ®èi, nhng l¹i sö dông c¸c khai
b¸o kh«ng tham sè nh vÝ dô sau:
46
VÝ dô 3.16
#include <conio.h>
#include <iostream.h>
class DIEM
{
private:
int x,y;
public:
DIEM(int x1, int y1)
{
x=x1; y=y1;
}
void in()
{
cout << “n” << x << “ ” << y <<” ” << m;
}
};
void main()
{
DIEM d1(200,200); // Goi ham tao co doi
DIEM d2; // Loi, goi ham tao khong doi
d2= DIEM_DH (3,5); // Goi ham tao co doi
d1.in();
d2.in();
getch();
};
Trong vÝ dô nµy, c©u lÖnh DIEM d2; trong hµm main() sÏ bÞ ch¬ng tr×nh dÞch
b¸o lçi. Bëi v× lÖnh nµy sÏ gäi tíi hµm t¹o kh«ng ®èi, mµ hµm t¹o nµy cha ®îc x©y dùng.
Cã thÓ kh¾c phôc ®iÒu nµy b»ng c¸ch chän mét trong hai gi¶i ph¸p sau:
- X©y dùng thªm hµm t¹o kh«ng ®èi.
- G¸n gi¸ trÞ mÆc ®Þnh cho tÊt c¶ c¸c ®èi x1, y1 cña hµm t¹o ®· x©y dùng ë trªn.
Theo gi¶i ph¸p thø 2, ch¬ng tr×nh trªn cã thÓ söa l¹i nh sau:
VÝ dô 3.17
#include <conio.h>
#include <iostream.h>
class DIEM
{
private:
int x,y;
public:
DIEM(int x1=0, int y1=0)
{
x = x1; y = y1;
}
47
void in()
{
cout << “n” << x << “ ” << y <<” ” << m;
}
};
void main()
{
DIEM d1(2,3); //Goi ham tao,khong dung tham so mac dinh
DIEM d2; //Goi ham tao, dung tham so mac dinh
d2= DIEM(6,7);//Goi ham tao,khong dung tham so mac dinh
d1.in();
d2.in();
getch(); }
VÝ dô 3.18
#include <iostream.h>
#include <conio.h>
class rectangle
{
private:
int dai;
int rong;
static int extra_data;
public:
rectangle();
void set(int new_dai, int new_rong);
int get_area();
int get_extra();
};
int rectangle::extra_data;
rectangle::rectangle()
{
dai = 8;
rong = 8;
extra_data = 1;
}
void rectangle::set(int new_dai,int new_rong)
{
dai = new_dai;
rong = new_rong;
}
int rectangle::get_area()
{
return (dai * rong);
}
int rectangle::get_extra()
{
return extra_data++; }
void main()
{
rectangle small, medium, large;
48
small.set(5, 7);
large.set(15, 20);
cout<<"Dien tich la : "<<small.get_area()<<"n";
cout<<"Dien tich la : "<<
medium.get_area()<<"n";
cout<<"Dien tich la : "<<large.get_area()<<"n";
cout <<"Gia tri du lieu tinh la : "<<
small.get_extra()<<"n";
cout <<"Gia tri du lieu tinh la : "<<
medium.get_extra()<<"n";
cout <<"Gia tri du lieu tinh la : "<<
large.get_extra()<<"n";
}
Ch¬ng tr×nh cho kÕt qu¶ nh sau :
Dien tich la : 35
Dien tich la : 64
Dien tich la : 300
Gia tri du lieu tinh la : 1
Gia tri du lieu tinh la : 2
Gia tri du lieu tinh la : 3
3.9. Hµm t¹o sao chÐp
3.9.1. Hµm t¹o sao chÐp mÆc ®Þnh
Gi¶ sö ®· ®Þnh nghÜa mét líp ABC nµo ®ã. Khi ®ã:
- Ta cã thÓ dïng c©u lÖnh khai b¸o hoÆc cÊp ph¸t bé nhí ®Ó t¹o c¸c ®èi tîng míi,
vÝ dô:
ABC p1, p2;
ABC *p = new ABC;
- Ta còng cã thÓ dïng lÖnh khai b¸o ®Ó t¹o mét ®èi tîng míi tõ mét ®èi tîng ®· tån
t¹i, vÝ dô:
ABC u;
ABC v(u); // T¹o v theo u
C©u lÖnh nµy cã ý nghÜa nh sau:
- NÕu trong líp ABC cha x©y dùng hµm t¹o sao chÐp, th× c©u lÖnh nµy sÏ gäi tíi
mét hµm t¹o sao chÐp mÆc ®Þnh cña C++. Hµm nµy sÏ sao chÐp néi dung tõng bit
cña u vµo c¸c bit t¬ng øng cña v. Nh vËy c¸c vïng nhí cña u vµ v sÏ cã néi dung nh
nhau.
- NÕu trong líp ABC ®· cã hµm t¹o sao chÐp th× c©u lÖnh:
PS v(u);
sÏ t¹o ra ®èi tîng míi v, sau ®ã gäi tíi hµm t¹o sao chÐp ®Ó khëi g¸n v theo u.
VÝ dô sau minh häa c¸ch dïng hµm t¹o sao chÐp mÆc ®Þnh:
Trong ch¬ng tr×nh ®a vµo líp PS (ph©n sè):
+ C¸c thuéc tÝnh gåm: t (tö sè) vµ m (mÉu).
+ Trong líp mµ kh«ng cã ph¬ng thøc nµo c¶ mµ chØ cã hai hµm b¹n lµ c¸c hµm
to¸n tö nhËp (>>) vµ xuÊt (<<).
+ Néi dung ch¬ng tr×nh lµ: Dïng lÖnh khai b¸o ®Ó t¹o mét ®èi tîng u (kiÓu PS)
cã néi dung nh ®èi tîng ®· cã d.
VÝ dô 3.19
49
#include <conio.h>
#include <iostream.h>
class PS
{
private: int t,m;
public:
friend ostream& operator<< (ostream& os,const PS &p)
{
os<<" = "<<p.t<<"/"<<p.m;
return os;
}
friend istream& operator>> (istream& is, PS &p)
{
cout <<" Nhap tu va mau : ";
is>>p.t>>p.m;
return is;
}
};
void main()
{
PS d;
cout <<"n Nhap phan so d "; cin>>d;
cout<<"n PS d "<<d;
PS u(d);
cout<<"n PS u "<<u;
getch();
}
3.9.2. Hµm t¹o sao chÐp
Hµm t¹o sao chÐp sö dông mét ®èi kiÓu tham chiÕu ®èi tîng ®Ó khëi g¸n cho ®èi
tîng míi vµ ®îc viÕt theo mÉu sau:
Tªn_líp (const Tªn_líp &ob)
{
// C¸c c©u lÖnh dïng c¸c thuéc tÝnh cña ®èi tîng ob ®Ó khëi g¸n
// cho c¸c thuéc tÝnh cña ®èi tîng míi
}
VÝ dô:
class PS
{ private: int t, m;
public:
PS(const PS &p)
{
t= p.t;
m= p.m;
}
50
…
};
Hµm t¹o sao chÐp trong vÝ dô trªn kh«ng kh¸c g× hµm t¹o sao chÐp mÆc ®Þnh.
Chó ý:
- NÕu líp kh«ng cã c¸c thuéc tÝnh kiÓu con trá hoÆc tham chiÕu th× dïng hµm t¹o
sao chÐp mÆc ®Þnh lµ ®ñ.
- NÕu líp cã c¸c thuéc tÝnh con trá hoÆc tham chiÕu, th× hµm t¹o sao chÐp mÆc
®Þnh cha ®¸p øng ®îc yªu cÇu.
class DT
{
private:
int n; // Bac da thuc
double *a; // Tro toi vung nho chua cac he so da thuc a0, a1, …
public:
DT()
{
n = 0; a = NULL;
}
DT(int n1)
{
n = n1;
a = new double[n1+1];
}
friend ostream& operator<< (ostream& os,const DT &d);
friend istream& operator>> (istream& is,DT &d);
…
};
B©y giê chóng ta h·y theo dâi xem viÖc dïng hµm t¹o mÆc ®Þnh trong ®o¹n ch¬ng
tr×nh sau sÏ dÉn ®Õn sai lÇm nh thÕ nµo:
DT d;
cin >> d;
/* NhËp ®èi tîng d gåm: nhËp mét sè nguyªn d¬ng vµ g¸n cho d.n, cÊp ph¸t vïng nhí
cho d.n, nhËp c¸c hÖ sè cña ®a thøc vµ chøa vµo vïng nhí ®îc cÊp ph¸t
*/
DT u(d);
/* Dïng hµm t¹o mÆc ®Þnh ®Ó x©y dùng ®èi tîng u theo d. KÕt qu¶: u.n = d.n vµ
u.a = d.a. Nh vËy hai con trá u.a vµ d.a cïng trá ®Õn mét vïng nhí.
*/
NhËn xÐt: Môc ®Ých cña ta lµ t¹o ra mét ®èi tîng u gièng nh d, nhng ®éc lËp víi d.
NghÜa lµ khi d thay ®æi th× u kh«ng bÞ ¶nh hëng g×. ThÕ nhng môc tiªu nµy kh«ng
®¹t ®îc, v× u vµ d cã chung mét vïng nhí chøa hÖ sè cña ®a thøc, nªn khi söa ®æi c¸c
hÖ sè cña ®a thøc trong d th× c¸c hÖ sè cña ®a thøc trong u còng thay ®æi theo. Cßn
mét trêng hîp n÷a còng dÉn ®Õn lçi lµ khi mét trong hai ®èi tîng u vµ d bÞ gi¶i phãng
(thu håi vïng nhí chøa ®a thøc) th× ®èi tîng cßn l¹i còng sÏ kh«ng cßn vïng nhí n÷a.
51
VÝ dô sau sÏ minh häa nhËn xÐt trªn: Khi d thay ®æi th× u còng thay ®æi vµ ngîc l¹i
khi u thay ®æi th× d còng thay ®æi theo.
VÝ dô 3.20
#include <conio.h>
#include <iostream.h>
#include <math.h>
class DT
{
private:
int n; // Bac da thuc
double *a; // Tro toi vung nho chua cac he
//so da thuc a0,a1,...
public:
DT()
{
this->n=0; this->a=NULL;
}
DT(int n1)
{
this->n=n1;
this->a= new double[n1+1];
}
friend ostream& operator<< (ostream& os,const DT &d);
friend istream& operator>> (istream& is,DT &d);
};
ostream& operator<< (ostream& os,const DT &d)
{
os <<" Cac he so ";
for (int i=0; i<=d.n; ++i)
os << d.a[i]<<" ";
return os;
}
istream& operator>> (istream& is,DT &d)
{
if (d.a != NULL) delete d.a;
cout << " nBac da thuc:";
cin >>d.n;
d.a = new double[d.n+1];
cout<<"Nhap cac he so da thuc:n";
for (int i=0 ; i<=d.n ; ++i)
{
cout<<"He so bac"<< i << "=";
is >> d.a[i];
}
52
return is;
}
void main()
{
DT d;
clrscr();
cout<<"nNhap da thuc d" ; cin >> d;
DT u(d);
cout <<"nDa thuc d" << d ;
cout <<"nDa thuc u" << u ;
cout <<"nNhap da thuc d" << d ; cin >> d;
cout <<"nDa thuc d" << d ;
cout <<"nDa thuc u" << u ;
cout <<"nDa thuc u" << u ; cin >> u;
cout <<"nDa thuc d" << d ;
cout <<"nDa thuc u" << u ;
getch();
}
VÝ dô 3.21 VÝ dô sau minh häa vÒ hµm t¹o sao chÐp:
#include <conio.h>
#include <iostream.h>
#include <math.h>
class DT
{
private:
int n; // Bac da thuc
double *a; // Tro toi vung nho chua cac da thuc
// a0, a1,...
public:
DT()
{
this->n=0; this->a=NULL;
}
DT(int n1)
{
this->n=n1;
this->a= new double[n1+1];
}
DT(const DT &d);
friend ostream& operator<< (ostream& os,const DT &d);
friend istream& operator>> (istream& is,DT &d);
};
DT::DT(const DT &d)
{
53
this->n = d.n;
this->a = new double[d.n+1];
for (int i=0;i<=d.n;++i)
this->a[i] = d.a[i];
}
ostream& operator<< (ostream& os,const DT &d)
{
os<<"-Cac he so (tu ao): ";
for (int i=0 ; i<=d.n ; ++i)
os << d.a[i] <<" ";
return os;
}
istream& operator>> (istream& is,DT &d)
{
if (d.a != NULL) delete d.a;
cout << "n Bac da thuc:";
cin >> d.n;
d.a = new double[d.n+1];
cout << "Nhap cac he so da thuc:n";
for (int i=0 ; i<= d.n ; ++i)
{
cout << "He so bac " << i << "=";
is >> d.a[i];
}
return is;
}
void main()
{
DT d;
clrscr();
cout <<"nNhap da thuc d " ; cin >> d;
DT u(d);
cout << "nDa thuc d " << d;
cout << "nDa thuc u " << u;
cout << "nNhap da thuc d "; cin >> d;
cout << "nDa thuc d " << d;
cout << "nDa thuc u " << u;
cout << "nNhap da thuc u " ; cin >> u;
cout << "nDa thuc d " << d;
cout << "nDa thuc u " << u;
getch();
}
54
3.10. Hµm hñy (destructor)
Hµm huû lµ mét hµm thµnh phÇn cña líp, cã chøc n¨ng ngîc víi hµm t¹o. Hµm huû
®îc gäi tríc khi gi¶i phãng mét ®èi tîng ®Ó thùc hiÖn mét sè c«ng viÖc cã tÝnh “dän
dÑp” tríc khi ®èi tîng ®îc hñy bá, vÝ dô gi¶i phãng mét vïng nhí mµ ®èi tîng ®ang qu¶n
lý, xo¸ ®èi tîng khái mµn h×nh nÕu nh nã ®ang hiÓn thÞ...ViÖc hñy bá ®èi tîng thêng
x¶y ra trong 2 trêng hîp sau:
- Trong c¸c to¸n tö vµ hµm gi¶i phãng bé nhí nh delete, free...
- Gi¶i phãng c¸c biÕn, m¶ng côc bé khi tho¸t khái hµm, ph¬ng thøc.
NÕu trong líp kh«ng ®Þnh nghÜa hµm huû th× mét hµm huû mÆc ®Þnh kh«ng
lµm g× c¶ ®îc ph¸t sinh. §èi víi nhiÒu líp th× hµm huû mÆc ®Þnh lµ ®ñ, kh«ng cÇn ®a
vµo mét hµm huû míi. Trêng hîp cÇn x©y dùng hµm hñy th× tu©n theo quy t¾c sau:
- Mçi líp chØ cã mét hµm hñy.
- Hµm hñy kh«ng cã kiÓu, kh«ng cã gi¸ trÞ tr¶ vÒ vµ kh«ng cã tham sè.
- Tªn hµm hµm huû cã mét dÊu ng· ngay tríc tªn líp.
VÝ dô:
class A
{
private:
int n;
double *a;
public:
~A()
{
n = 0;
delete a;
}
};
VÝ dô 3.22
#include <iostream.h>
class Count{
private:
static int counter;
int obj_id;
public:
Count();
static void display_total();
void display();
~Count();
};
int Count::counter;
Count::Count()
{
counter++;
obj_id = counter;
}
Count::~Count()
{
counter--;
55
cout<<"Doi tuong "<<obj_id<<" duoc huy bon";
}
void Count::display_total()
{
cout <<"So cac doi tuong duoc tao ra la = "<< counter <<
endl;
}
void Count::display()
{
cout << "Object ID la "<<obj_id<<endl;
}
void main()
{
Count a1;
Count::display_total();
Count a2, a3;
Count::display_total();
a1.display();
a2.display();
a3.display();
}
KÕt qu¶ ch¬ng tr×nh nh sau:
So cac doi tuong duoc tao ra la = 1
So cac doi tuong duoc tao ra la = 3
Object ID la 1
Object ID la 2
Object ID la 3
Doi tuong 3 duoc huy bo
Doi tuong 2 duoc huy bo
Doi tuong 1 duoc huy bo
56
Bµi tËp
1. X©y dùng líp thêi gian Time. D÷ liÖu thµnh phÇn bao gåm giê, phót gi©y. C¸c hµm
thµnh phÇn bao gåm: hµm t¹o, hµm truy cËp d÷ liÖu, hµm normalize() ®Ó chuÈn
hãa d÷ liÖu n»m trong kho¶ng quy ®Þnh cña giê (0 ≤ giê < 24) , phót (0 ≤ phót <60),
gi©y (0 ≤ gi©y <60), hµm advance(int h, int m, int s) ®Ó t¨ng thêi gian
hiÖn hµnh cña ®èi tîng ®ang tån t¹i, hµm reset(int h, int m, int s) ®Ó
chØnh l¹i thêi gian hiÖn hµnh cña mét ®èi tîng ®ang tån t¹i vµ mét hµm print() ®Ó
hiÓn thÞ d÷ liÖu.
2. X©y dùng líp Date. D÷ liÖu thµnh phÇn bao gåm ngµy, th¸ng, n¨m. C¸c hµm thµnh
phÇn bao gåm: hµm t¹o, hµm truy cËp d÷ liÖu, hµm normalize() ®Ó chuÈn hãa
d÷ liÖu n»m trong kho¶ng quy ®Þnh cña ngµy (1 ≤ ngµy <daysIn(th¸ng)), th¸ng (1 ≤
th¸ng < 12), n¨m (n¨m ≥ 1), hµm daysIn(int) tr¶ vÒ sè ngµy trong th¸ng, hµm
advance(int y, int m, int d) ®Ó t¨ng ngµy hiÖn lªn c¸c n¨m y, th¸ng m,
ngµy d cña ®èi tîng ®ang tån t¹i, hµm reset(int y, int m, int d) ®Ó ®Æt l¹i
ngµy cho mét ®èi tîng ®ang tån t¹i vµ mét hµm print() ®Ó hiÓn thÞ d÷ liÖu.
3. Thùc hiÖn mét líp String. Mçi ®èi tîng cña líp sÏ ®¹i diÖn mét chuçi ký tù. Nh÷ng
thµnh phÇn d÷ liÖu lµ chiÒu dµi chuçi, vµ chuçi ký tù. C¸c hµm thµnh phÇn bao
gåm: hµm t¹o, hµm truy cËp, hµm hiÓn thÞ, hµm character(int i)tr¶ vÒ mét ký
tù trong chuçi ®îc chØ ®Þnh b»ng tham sè i.
4. X©y dùng líp ma trËn cã tªn lµ Matrix cho c¸c ma trËn, c¸c hµm thµnh phÇn bao
gåm: hµm t¹o mÆc ®Þnh, hµm nhËp xuÊt ma trËn, céng, trõ, nh©n hai ma trËn.
5. X©y dùng líp ma trËn cã tªn lµ Matrix cho c¸c ma trËn vu«ng, c¸c hµm thµnh phÇn
bao gåm: hµm t¹o mÆc ®Þnh, hµm nhËp xuÊt ma trËn, tÝnh ®Þnh thøc vµ tÝnh ma
trËn nghÞch ®¶o.
6. X©y dùng líp Stack cho ng¨n xÕp kiÓu int. C¸c hµm thµnh phÇn bao gåm: Hµm t¹o
mÆc ®Þnh, hµm hñy, hµm isEmpty() kiÓm tra stack cã rçng kh«ng, hµm
isFull() kiÓm tra stack cã ®Çy kh«ng, hµm push() , pop(), hµm in néi dung
ng¨n xÕp. Sö dông mét m¶ng ®Ó thùc hiÖn.
7. X©y dùng líp hµng ®îi Queue chøa phÇn tö kiÓu int. C¸c hµm thµnh phÇn bao gåm:
hµm t¹o, hµm hñy vµ nh÷ng to¸n tö hµng ®îi th«ng thêng: hµm insert() ®Ó thªm
phÇn tö vµo hµng ®îi, hµm remove() ®Ó lo¹i bá phÇn tö, hµm isEmpty() kiÓm tra
hµng ®îi cã rçng kh«ng, hµm isFull() kiÓm tra hµng ®îi cã ®Çy kh«ng. Sö dông
mét m¶ng ®Ó thùc hiÖn.
4. X©y dùng líp ®a thøc vµ c¸c ph¬ng thøc céng, trõ hai ®a thøc.
8. X©y dùng líp Sinhvien ®Ó qu¶n lý hé tªn sinh viªn, n¨m sinh, ®iÓm thi 9 m«n häc cña
c¸c sinh viªn. Cho biÕt sinh viªn nµo ®îc lµm khãa luËn tèt nghiÖp, bao nhiªu sinh
viªn thi tèt nghiÖp, bao nhiªu sinh viªn thi l¹i, tªn m«n thi l¹i> Tiªu chuÈn ®Ó xÐt nh
sau:
- Sinh viªn lµm khãa luËn ph¶i cã ®iÓm trung b×nh tõ 7 trë lªn, trong ®ã kh«ng cã
m«n nµo díi 5.
- Sinh viªn thi tè nghiÖp khi ®iÓm trung b×nh nhá h¬n 7 vµ ®iÓm c¸c m«n kh«ng díi
5.
- Sinh viªn thi l¹i m«n díi 5.
9. X©y dùng líp vector ®Ó lu tr÷ c¸c vect¬ gåm c¸c sè thùc. C¸c thµnh phÇn d÷ liÖu
bao gåm:
- KÝch thíc vect¬.
- Mét m¶ng ®éng chøa c¸c thµnh phÇn cña vect¬.
57
C¸c hµm thµnh phÇn bao gåm hµm t¹o, hµm hñy, hµm tÝnh tÝch v« híng hai vect¬,
tÝnh chuÈn cña vect¬ (theo chuÈn bÊt kú nµo ®ã).
10. X©y dùng líp Phanso víi d÷ liÖu thµnh phÇn lµ tö vµ mÉu sè. C¸c hµm thµnh phÇn
bao gåm:
- Céng hai ph©n sè, kÕt qu¶ ph¶i dîc tèi gi¶n
- Trõ hai ph©n sè, kÕt qu¶ ph¶i dîc tèi gi¶n
- Nh©n hai ph©n sè, kÕt qu¶ ph¶i dîc tèi gi¶n
- Chia hai ph©n sè, kÕt qu¶ ph¶i dîc tèi gi¶n
58
CH¬NG 4
TO¸N Tö T¶I BéI
Ch¬ng 4 tr×nh bµy c¸c vÊn ®Ò sau:
 §Þnh nghÜa to¸n tö t¶i béi
 Mét sè lu ý khi x©y dùng to¸n tö t¶i béi
 Mét sè vÝ dô minh häa
4.1. §Þnh nghÜa to¸n tö t¶i béi
C¸c to¸n tö cïng tªn thùc hiÖn nhiÒu chøc n¨ng kh¸c nhau ®îc gäi lµ to¸n tö t¶i béi.
D¹ng ®Þnh nghÜa tæng qu¸t cña to¸n tö t¶i béi nh sau:
KiÓu_tr¶_vÒ operator op(danh s¸ch tham sè)
{//th©n to¸n tö}
Trong ®ã: KiÓu_tr¶_vÒ lµ kiÓu kÕt qu¶ thùc hiÖn cña to¸n tö.
op lµ tªn to¸n tö t¶i béi
operator op(danh s¸ch tham sè) gäi lµ hµm to¸n tö t¶i béi, nã cã thÓ lµ hµm
thµnh phÇn hoÆc lµ hµm b¹n, nhng kh«ng thÓ lµ hµm tÜnh. Danh s¸ch tham sè ®îc
khai b¸o t¬ng tù khai b¸o biÕn nhng ph¶i tu©n theo nh÷ng quy ®Þnh sau:
- NÕu to¸n tö t¶i béi lµ hµm thµnh phÇn th×: kh«ng cã tham sè cho to¸n tö mét ng«i vµ
mét tham sè cho to¸n tö hai ng«i. Còng gièng nh hµm thµnh phÇn th«ng thêng, hµm
thµnh phÇn to¸n tö cã ®èi ®Çu tiªn (kh«ng têng minh) lµ con trá this .
- NÕu to¸n tö t¶i béi lµ hµm b¹n th×: cã mét tham sè cho to¸n tö mét ng«i vµ hai tham sè
cho to¸n tö hai ng«i.
Qu¸ tr×nh x©y dùng to¸n tö t¶i béi ®îc thùc hiÖn nh sau:
- §Þnh nghÜa líp ®Ó x¸c ®Þnh kiÓu d÷ liÖu sÏ ®îc sö dông trong c¸c to¸n tö t¶i béi
- Khai b¸o hµm to¸n tö t¶i béi trong vïng public cña líp
- §Þnh nghÜa néi dung cÇn thùc hiÖn
4.2. Mét sè lu ý khi x©y dùng to¸n tö t¶i béi
1. Trong C++ ta cã thÓ ®a ra nhiÒu ®Þnh nghÜa míi cho hÇu hÕt c¸c to¸n tö trong C+
+, ngo¹i trõ nh÷ng to¸n tö sau ®©y:
- To¸n tö x¸c ®Þnh thµnh phÇn cña líp (‘.’)
- To¸n tö ph©n gi¶i miÒn x¸c ®Þnh (‘::’)
- To¸n tö x¸c ®Þnh kÝch thíc (‘sizeof’)
- To¸n tö ®iÒu kiÖn 3 ng«i (‘?:’)
2. MÆc dÇu ng÷ nghÜa cña to¸n tö ®îc më réng nhng có ph¸p, c¸c quy t¾c v¨n ph¹m
nh sè to¸n h¹ng, quyÒn u tiªn vµ thø tù kÕt hîp thùc hiÖn cña c¸c to¸n tö vÉn kh«ng cã
g× thay ®æi.
3. Kh«ng thÓ thay ®æi ý nghÜa c¬ b¶n cña c¸c to¸n tö ®· ®Þnh nghÜa tríc, vÝ dô
kh«ng thÓ ®Þnh nghÜa l¹i c¸c phÐp to¸n +, - ®èi víi c¸c sè kiÓu int, float.
4. C¸c to¸n tö = , ( ) , [ ] , -> yªu cÇu hµm to¸n tö ph¶i lµ hµm thµnh phÇn cña líp,
kh«ng thÓ dïng hµm b¹n ®Ó ®Þnh nghÜa to¸n tö t¶i béi.
4.3. Mét sè vÝ dô
VÝ dô 4.1 To¸n tö t¶i béi mét ng«i, dïng hµm b¹n
#include <iostream.h>
#include <conio.h>
class Diem
{
59
private:
float x,y,z;
public:
Diem() {}
Diem(float x1,float y1,float z1)
{ x = x1; y = y1; z=z1;}
friend Diem operator -(Diem d)
{
Diem d1;
d1.x = -d.x; d1.y = -d.y;d1.z=-d.z;
return d1;
}
void hienthi()
{ cout<<"Toa do: "<<x<<" "<<y <<" "
<<z<<endl;}
};
void main()
{
clrscr();
Diem p(2,3,-4),q;
q = -p;
p.hienthi();
q.hienthi();
getch();
}
VÝ dô 4.2 To¸n tö t¶i béi hai ng«i, dïng hµm b¹n
#include <iostream.h>
#include <conio.h>
class Diem
{
private:
float x,y,z;
public:
Diem() {}
Diem(float x1,float y1,float z1)
{ x = x1; y = y1; z=z1;}
friend Diem operator +(Diem d1, Diem d2)
{
Diem tam;
tam.x = d1.x + d2.x;
tam.y = d1.y + d2.y;
tam.z = d1.z + d2.z;
return tam;
60
}
void hienthi()
{ cout<<x<<" "<<y <<" " <<z<<endl;}
};
void main()
{
clrscr();
Diem d1(3,-6,8),d2(4,3,7),d3;
d3=d1+d2;
d1.hienthi();
d2.hienthi();
cout<<"n Tong hai diem co toa do la :";
d3.hienthi();
getch();
}
VÝ dô 4.3 To¸n tö t¶i béi hai ng«i, dïng hµm thµnh phÇn
#include <iostream.h>
#include <conio.h>
class Diem
{
private:
float x,y;
public:
Diem() {}
Diem(float x1,float y1)
{ x = x1; y = y1;}
Diem operator -()
{ x = -x; y = -y; z = -z;
return (*this); }
void hienthi()
{ cout<<"Toa do: "<<x<<" "<<y <<” z = "<<z
<<" n";}
};
void main()
{
clrscr();
Diem p(2,3,-4),q;
p.hienthi();
q = -p;
q.hienthi();
getch();
}
61
VÝ dô 4.4 To¸n tö t¶i béi hai ng«i, dïng hµm thµnh phÇn
#include <iostream.h>
#include <conio.h>
class Diem
{
private:
float x,y,z;
public:
Diem() {}
Diem(float x1,float y1,float z1)
{ x = x1; y = y1; z=z1;}
Diem operator +(Diem d2)
{
x = x + d2.x;
y = y + d2.y;
z = z + d2.z;
return (*this);
}
void hienthi()
{ cout<<"n x="<<x<<" y= "<<y<<" z = " << z
<<endl;}
};
void main()
{
clrscr();
Diem d1(3,-6,8),d2(4,3,7),d3;
d1.hienthi();
d2.hienthi();
d3=d1+d2;
cout<<"n Tong hai diem co toa do la :";
d3.hienthi();
getch();
}
VÝ dô 4.5
#include <iostream.h>
#include <conio.h>
class Diem
{
private:
int x,y;
public:
Diem() {}
62
Diem(int x1,int y1)
{ x = x1; y = y1;}
void operator -()
{
x = -x; y = -y;
}
void hienthi()
{ cout<<"Toa do: "<<x<<" "<<y <<" n";}
};
void main()
{
clrscr();
Diem p(2,3),q;
p.hienthi();
-p;
p.hienthi();
getch();
}
VÝ dô 4.6 To¸n tö t¶i béi hai ng«i
#include <iostream.h>
#include <conio.h>
class sophuc
{float a,b;
public : sophuc() {}
sophuc(float x, float y)
{a=x; b=y;}
sophuc operator +(sophuc c2)
{ sophuc c3;
c3.a= a + c2.a ;
c3.b= b + c2.b ;
return (c3);
}
void hienthi(sophuc c)
{ cout<<c.a<<" + "<<c.b<<"i"<<endl; }
};
void main()
{ clrscr();
sophuc d1 (2.1,3.4);
sophuc d2 (1.2,2.3) ;
sophuc d3 ;
d3 = d1+d2; //d3=d1.operator +(d2);
cout<<"d1= ";d1.hienthi(d1);
cout<<"d2= ";d2.hienthi(d2);
cout<<"d3= ";d3.hienthi(d3);
63
getch();
}
Chó ý: Trong c¸c hµm to¸n tö thµnh phÇn hai ng«i (cã hai to¸n h¹ng) th× con trá this øng
víi to¸n h¹ng thø nhÊt, v× vËy trong tham sè cña to¸n tö chØ cÇn dïng mét tham sè têng
minh ®Ó biÓu thÞ to¸n h¹ng thø hai .
VÝ dô 4.7 Phiªn b¶n 2 cña vÝ dô 4.6
#include <iostream.h>
#include <conio.h>
class sophuc
{float a,b;
public : sophuc() {}
sophuc(float x, float y)
{a=x; b=y;}
sophuc operator +(sophuc c2)
{
a= a + c2.a ;
b= b + c2.b ;
return (*this);
}
void hienthi(sophuc c)
{ cout<<c.a<<" + "<<c.b<<"i"<<endl; }
};
void main()
{ clrscr();
sophuc d1 (2.1,3.4);
sophuc d2 (1.2,2.3) ;
sophuc d3 ;
cout<<"d1= ";d1.hienthi(d1);
cout<<"d2= ";d2.hienthi(d2);
d3 = d1+d2; //d3=d1.operator +(d2);
cout<<"d3= ";d3.hienthi(d3);
getch();
}
VÝ dô 4.8 Phiªn b¶n 3 cña vÝ dô 4.6
#include <iostream.h>
#include <conio.h>
class sophuc
{float a,b;
public : sophuc() {}
sophuc(float x, float y)
{a=x; b=y;}
friend sophuc operator +(sophuc c1,sophuc c2)
{ sophuc c;
c.a= c1.a + c2.a ;
64
c.b= c1.b + c2.b ;
return (c);
}
void hienthi(sophuc c)
{ cout<<c.a<<" + "<<c.b<<"i"<<endl; }
};
void main()
{ clrscr();
sophuc d1 (2.1,3.4);
sophuc d2 (1.2,2.3) ;
sophuc d3 ;
cout<<"d1= ";d1.hienthi(d1);
cout<<"d2= ";d2.hienthi(d2);
d3 = d1+d2; //d3=operator +(d1,d2);
cout<<"d3= ";d3.hienthi(d3);
getch();
}
VÝ dô 4.9 To¸n tö t¶i béi trªn líp chuçi ký tù
#include <iostream.h>
#include <string.h>
#include <conio.h>
class string
{ char s[80];
public:
string() { *s='0'; }
string(char *p) { strcpy(s,p); }
char *get() { return s;}
string operator + (string s2);
string operator = (string s2);
int operator < (string s2);
int operator > (string s2);
int operator == (string s2);
};
string string::operator +(string s2)
{
strcat(s,s2.s);
return *this ;
}
string string::operator =(string s2)
{
strcpy(s,s2.s) ;
return *this;
}
65
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt
Tailieu.vncty.com giao trinh-lt[1].hdt

More Related Content

What's hot

Nghệ thuật lãnh đạo và động viên: Leadership and Motivation
Nghệ thuật lãnh đạo và động viên: Leadership and MotivationNghệ thuật lãnh đạo và động viên: Leadership and Motivation
Nghệ thuật lãnh đạo và động viên: Leadership and MotivationKenny Nguyen
 
Tổ Chức Hành Chính Nhà Nước Trung Ương
Tổ Chức Hành Chính Nhà Nước Trung Ương Tổ Chức Hành Chính Nhà Nước Trung Ương
Tổ Chức Hành Chính Nhà Nước Trung Ương nataliej4
 
Bai giang pttkht 1 2_lop_5
Bai giang pttkht 1 2_lop_5Bai giang pttkht 1 2_lop_5
Bai giang pttkht 1 2_lop_5Ảo Ảo
 
Quan tri-nhan-su
Quan tri-nhan-suQuan tri-nhan-su
Quan tri-nhan-suXuan Le
 
2. thiet ke san betong ung luc truoc phan quang minh
2. thiet ke san betong ung luc truoc   phan quang minh2. thiet ke san betong ung luc truoc   phan quang minh
2. thiet ke san betong ung luc truoc phan quang minhPham Nguyen Phap
 
Ai giao trinh tri tue nhan tao
Ai   giao trinh tri tue nhan taoAi   giao trinh tri tue nhan tao
Ai giao trinh tri tue nhan taoQuoc Nguyen
 
Chuong 10 part 3 - cstmqt bookbooming
Chuong 10   part 3 - cstmqt bookboomingChuong 10   part 3 - cstmqt bookbooming
Chuong 10 part 3 - cstmqt bookboomingbookbooming
 
Tổ chức nhân sự hành chính nhà nước
Tổ chức nhân sự hành chính nhà nướcTổ chức nhân sự hành chính nhà nước
Tổ chức nhân sự hành chính nhà nướcjackjohn45
 
Bai giang chuyen doi
Bai giang chuyen doiBai giang chuyen doi
Bai giang chuyen doibookbooming1
 
P T C H U O N G T R I N H Q T D T C U A G D D H V I E T N A M Mr. Hai
P T  C H U O N G  T R I N H   Q T D T  C U A  G D D H  V I E T  N A M  Mr.  HaiP T  C H U O N G  T R I N H   Q T D T  C U A  G D D H  V I E T  N A M  Mr.  Hai
P T C H U O N G T R I N H Q T D T C U A G D D H V I E T N A M Mr. HaiNguyen Chien
 

What's hot (12)

Nghệ thuật lãnh đạo và động viên: Leadership and Motivation
Nghệ thuật lãnh đạo và động viên: Leadership and MotivationNghệ thuật lãnh đạo và động viên: Leadership and Motivation
Nghệ thuật lãnh đạo và động viên: Leadership and Motivation
 
Tổ Chức Hành Chính Nhà Nước Trung Ương
Tổ Chức Hành Chính Nhà Nước Trung Ương Tổ Chức Hành Chính Nhà Nước Trung Ương
Tổ Chức Hành Chính Nhà Nước Trung Ương
 
Bai giang pttkht 1 2_lop_5
Bai giang pttkht 1 2_lop_5Bai giang pttkht 1 2_lop_5
Bai giang pttkht 1 2_lop_5
 
Quan tri-nhan-su
Quan tri-nhan-suQuan tri-nhan-su
Quan tri-nhan-su
 
2. thiet ke san betong ung luc truoc phan quang minh
2. thiet ke san betong ung luc truoc   phan quang minh2. thiet ke san betong ung luc truoc   phan quang minh
2. thiet ke san betong ung luc truoc phan quang minh
 
Ai giao trinh tri tue nhan tao
Ai   giao trinh tri tue nhan taoAi   giao trinh tri tue nhan tao
Ai giao trinh tri tue nhan tao
 
Đề tài: Thiết kế trụ sở liên cơ quan số 2 tỉnh Quảng Ninh, HAY
Đề tài: Thiết kế trụ sở liên cơ quan số 2 tỉnh Quảng Ninh, HAYĐề tài: Thiết kế trụ sở liên cơ quan số 2 tỉnh Quảng Ninh, HAY
Đề tài: Thiết kế trụ sở liên cơ quan số 2 tỉnh Quảng Ninh, HAY
 
Chuong 10 part 3 - cstmqt bookbooming
Chuong 10   part 3 - cstmqt bookboomingChuong 10   part 3 - cstmqt bookbooming
Chuong 10 part 3 - cstmqt bookbooming
 
Tổ chức nhân sự hành chính nhà nước
Tổ chức nhân sự hành chính nhà nướcTổ chức nhân sự hành chính nhà nước
Tổ chức nhân sự hành chính nhà nước
 
Bai giang chuyen doi
Bai giang chuyen doiBai giang chuyen doi
Bai giang chuyen doi
 
P T C H U O N G T R I N H Q T D T C U A G D D H V I E T N A M Mr. Hai
P T  C H U O N G  T R I N H   Q T D T  C U A  G D D H  V I E T  N A M  Mr.  HaiP T  C H U O N G  T R I N H   Q T D T  C U A  G D D H  V I E T  N A M  Mr.  Hai
P T C H U O N G T R I N H Q T D T C U A G D D H V I E T N A M Mr. Hai
 
Giao trinh do-dien-dientu
Giao trinh do-dien-dientuGiao trinh do-dien-dientu
Giao trinh do-dien-dientu
 

Viewers also liked

Tailieu.vncty.com th s-11(1)
Tailieu.vncty.com th s-11(1)Tailieu.vncty.com th s-11(1)
Tailieu.vncty.com th s-11(1)Trần Đức Anh
 
Tailieu.vncty.com copy of-tieuluangis_683
Tailieu.vncty.com copy of-tieuluangis_683Tailieu.vncty.com copy of-tieuluangis_683
Tailieu.vncty.com copy of-tieuluangis_683Trần Đức Anh
 
Tailieu.vncty.com bo de thi tuyen sinh dai hoc mon tieng anh
Tailieu.vncty.com   bo de thi tuyen sinh dai hoc mon tieng anhTailieu.vncty.com   bo de thi tuyen sinh dai hoc mon tieng anh
Tailieu.vncty.com bo de thi tuyen sinh dai hoc mon tieng anhTrần Đức Anh
 
Tailieu.vncty.com luan van ths nang luc canh tranh ngan hang 2008 2255
Tailieu.vncty.com   luan van ths nang luc canh tranh ngan hang 2008 2255Tailieu.vncty.com   luan van ths nang luc canh tranh ngan hang 2008 2255
Tailieu.vncty.com luan van ths nang luc canh tranh ngan hang 2008 2255Trần Đức Anh
 

Viewers also liked (7)

Tailieu.vncty.com th s-11(1)
Tailieu.vncty.com th s-11(1)Tailieu.vncty.com th s-11(1)
Tailieu.vncty.com th s-11(1)
 
Tailieu.vncty.com copy of-tieuluangis_683
Tailieu.vncty.com copy of-tieuluangis_683Tailieu.vncty.com copy of-tieuluangis_683
Tailieu.vncty.com copy of-tieuluangis_683
 
Tailieu.vncty.com qt003
Tailieu.vncty.com   qt003Tailieu.vncty.com   qt003
Tailieu.vncty.com qt003
 
Tailieu.vncty.com bo de thi tuyen sinh dai hoc mon tieng anh
Tailieu.vncty.com   bo de thi tuyen sinh dai hoc mon tieng anhTailieu.vncty.com   bo de thi tuyen sinh dai hoc mon tieng anh
Tailieu.vncty.com bo de thi tuyen sinh dai hoc mon tieng anh
 
Tailieu.vncty.com luan van ths nang luc canh tranh ngan hang 2008 2255
Tailieu.vncty.com   luan van ths nang luc canh tranh ngan hang 2008 2255Tailieu.vncty.com   luan van ths nang luc canh tranh ngan hang 2008 2255
Tailieu.vncty.com luan van ths nang luc canh tranh ngan hang 2008 2255
 
Tailieu.vncty.com qt001
Tailieu.vncty.com qt001Tailieu.vncty.com qt001
Tailieu.vncty.com qt001
 
Tailieu.vncty.com excel2010
Tailieu.vncty.com excel2010Tailieu.vncty.com excel2010
Tailieu.vncty.com excel2010
 

Similar to Tailieu.vncty.com giao trinh-lt[1].hdt

Gs Nguyễn Đình Cống: Giáo trình Phong Thủy Căn Bản
Gs Nguyễn Đình Cống: Giáo trình Phong Thủy Căn BảnGs Nguyễn Đình Cống: Giáo trình Phong Thủy Căn Bản
Gs Nguyễn Đình Cống: Giáo trình Phong Thủy Căn BảnĐặng Duy Linh
 
Tailieu.vncty.com thuc trang ve hoat dong xuat khau nong san thuc pham ha noi
Tailieu.vncty.com   thuc trang ve hoat dong xuat khau nong san thuc pham ha noiTailieu.vncty.com   thuc trang ve hoat dong xuat khau nong san thuc pham ha noi
Tailieu.vncty.com thuc trang ve hoat dong xuat khau nong san thuc pham ha noiTrần Đức Anh
 
hoccokhi.vn Giáo Trình Cơ Khí Đại Cương - Nhiều Tác Giả, 124 Trang
hoccokhi.vn Giáo Trình Cơ Khí Đại Cương - Nhiều Tác Giả, 124 Tranghoccokhi.vn Giáo Trình Cơ Khí Đại Cương - Nhiều Tác Giả, 124 Trang
hoccokhi.vn Giáo Trình Cơ Khí Đại Cương - Nhiều Tác Giả, 124 TrangHọc Cơ Khí
 
Một số giải pháp nhằm nâng cao hiệu quả công tác quy hoạch sử dụng đất trên đ...
Một số giải pháp nhằm nâng cao hiệu quả công tác quy hoạch sử dụng đất trên đ...Một số giải pháp nhằm nâng cao hiệu quả công tác quy hoạch sử dụng đất trên đ...
Một số giải pháp nhằm nâng cao hiệu quả công tác quy hoạch sử dụng đất trên đ...nataliej4
 
Tuoitrebentre.vn-giao trinh-cong-nghe-che-tao-may-bk-da-nang
Tuoitrebentre.vn-giao trinh-cong-nghe-che-tao-may-bk-da-nangTuoitrebentre.vn-giao trinh-cong-nghe-che-tao-may-bk-da-nang
Tuoitrebentre.vn-giao trinh-cong-nghe-che-tao-may-bk-da-nangNgô Chí Tâm
 
Baigiang mtb chuong1
Baigiang mtb chuong1Baigiang mtb chuong1
Baigiang mtb chuong1luuguxd
 
Giới thiệu tập thơ Đông y
Giới thiệu tập thơ Đông yGiới thiệu tập thơ Đông y
Giới thiệu tập thơ Đông yThi đàn Việt Nam
 
Những bài văn mẫu dành cho học sinh lớp 10truonghocso.com
Những bài văn mẫu dành cho học sinh lớp 10truonghocso.comNhững bài văn mẫu dành cho học sinh lớp 10truonghocso.com
Những bài văn mẫu dành cho học sinh lớp 10truonghocso.comThế Giới Tinh Hoa
 
B10[1]. system thinkingv2
B10[1]. system thinkingv2B10[1]. system thinkingv2
B10[1]. system thinkingv2maihuongnv
 
B10[1]. system thinkingv2
B10[1]. system thinkingv2B10[1]. system thinkingv2
B10[1]. system thinkingv2maihuongnv
 
Thiết kế hệ truyền động cho máy bào giường
Thiết kế hệ truyền động cho máy bào giườngThiết kế hệ truyền động cho máy bào giường
Thiết kế hệ truyền động cho máy bào giườngHuynh Loc
 

Similar to Tailieu.vncty.com giao trinh-lt[1].hdt (18)

Qt038
Qt038Qt038
Qt038
 
Gs Nguyễn Đình Cống: Giáo trình Phong Thủy Căn Bản
Gs Nguyễn Đình Cống: Giáo trình Phong Thủy Căn BảnGs Nguyễn Đình Cống: Giáo trình Phong Thủy Căn Bản
Gs Nguyễn Đình Cống: Giáo trình Phong Thủy Căn Bản
 
Tailieu.vncty.com thuc trang ve hoat dong xuat khau nong san thuc pham ha noi
Tailieu.vncty.com   thuc trang ve hoat dong xuat khau nong san thuc pham ha noiTailieu.vncty.com   thuc trang ve hoat dong xuat khau nong san thuc pham ha noi
Tailieu.vncty.com thuc trang ve hoat dong xuat khau nong san thuc pham ha noi
 
Bt duc
Bt ducBt duc
Bt duc
 
H oa hong
H oa hongH oa hong
H oa hong
 
hoccokhi.vn Giáo Trình Cơ Khí Đại Cương - Nhiều Tác Giả, 124 Trang
hoccokhi.vn Giáo Trình Cơ Khí Đại Cương - Nhiều Tác Giả, 124 Tranghoccokhi.vn Giáo Trình Cơ Khí Đại Cương - Nhiều Tác Giả, 124 Trang
hoccokhi.vn Giáo Trình Cơ Khí Đại Cương - Nhiều Tác Giả, 124 Trang
 
Một số giải pháp nhằm nâng cao hiệu quả công tác quy hoạch sử dụng đất trên đ...
Một số giải pháp nhằm nâng cao hiệu quả công tác quy hoạch sử dụng đất trên đ...Một số giải pháp nhằm nâng cao hiệu quả công tác quy hoạch sử dụng đất trên đ...
Một số giải pháp nhằm nâng cao hiệu quả công tác quy hoạch sử dụng đất trên đ...
 
Tailieu.vncty.com qt247
Tailieu.vncty.com   qt247Tailieu.vncty.com   qt247
Tailieu.vncty.com qt247
 
Tuoitrebentre.vn-giao trinh-cong-nghe-che-tao-may-bk-da-nang
Tuoitrebentre.vn-giao trinh-cong-nghe-che-tao-may-bk-da-nangTuoitrebentre.vn-giao trinh-cong-nghe-che-tao-may-bk-da-nang
Tuoitrebentre.vn-giao trinh-cong-nghe-che-tao-may-bk-da-nang
 
Baigiang mtb chuong1
Baigiang mtb chuong1Baigiang mtb chuong1
Baigiang mtb chuong1
 
Bai1
Bai1Bai1
Bai1
 
Giới thiệu tập thơ Đông y
Giới thiệu tập thơ Đông yGiới thiệu tập thơ Đông y
Giới thiệu tập thơ Đông y
 
Những bài văn mẫu dành cho học sinh lớp 10truonghocso.com
Những bài văn mẫu dành cho học sinh lớp 10truonghocso.comNhững bài văn mẫu dành cho học sinh lớp 10truonghocso.com
Những bài văn mẫu dành cho học sinh lớp 10truonghocso.com
 
Chuong 1
Chuong 1Chuong 1
Chuong 1
 
Trg123
Trg123Trg123
Trg123
 
B10[1]. system thinkingv2
B10[1]. system thinkingv2B10[1]. system thinkingv2
B10[1]. system thinkingv2
 
B10[1]. system thinkingv2
B10[1]. system thinkingv2B10[1]. system thinkingv2
B10[1]. system thinkingv2
 
Thiết kế hệ truyền động cho máy bào giường
Thiết kế hệ truyền động cho máy bào giườngThiết kế hệ truyền động cho máy bào giường
Thiết kế hệ truyền động cho máy bào giường
 

More from Trần Đức Anh

Tailieu.vncty.com nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
Tailieu.vncty.com   nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747Tailieu.vncty.com   nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
Tailieu.vncty.com nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747Trần Đức Anh
 
Tailieu.vncty.com nhom 6-de_tai_flo_9602
Tailieu.vncty.com   nhom 6-de_tai_flo_9602Tailieu.vncty.com   nhom 6-de_tai_flo_9602
Tailieu.vncty.com nhom 6-de_tai_flo_9602Trần Đức Anh
 
Tailieu.vncty.com lai phan-tu_2413
Tailieu.vncty.com   lai phan-tu_2413Tailieu.vncty.com   lai phan-tu_2413
Tailieu.vncty.com lai phan-tu_2413Trần Đức Anh
 
Tailieu.vncty.com duong hoa-hoc_3666
Tailieu.vncty.com   duong hoa-hoc_3666Tailieu.vncty.com   duong hoa-hoc_3666
Tailieu.vncty.com duong hoa-hoc_3666Trần Đức Anh
 
Tailieu.vncty.com do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
Tailieu.vncty.com   do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562Tailieu.vncty.com   do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
Tailieu.vncty.com do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562Trần Đức Anh
 
Tailieu.vncty.com tieu luanc4v-1324
Tailieu.vncty.com   tieu luanc4v-1324Tailieu.vncty.com   tieu luanc4v-1324
Tailieu.vncty.com tieu luanc4v-1324Trần Đức Anh
 
Tailieu.vncty.com do an-cong_nghe_san_xuat_sua_tiet_trung_9366
Tailieu.vncty.com   do an-cong_nghe_san_xuat_sua_tiet_trung_9366Tailieu.vncty.com   do an-cong_nghe_san_xuat_sua_tiet_trung_9366
Tailieu.vncty.com do an-cong_nghe_san_xuat_sua_tiet_trung_9366Trần Đức Anh
 

More from Trần Đức Anh (20)

Tailieu.vncty.com 5275 1261
Tailieu.vncty.com   5275 1261Tailieu.vncty.com   5275 1261
Tailieu.vncty.com 5275 1261
 
Tailieu.vncty.com 5249 5591
Tailieu.vncty.com   5249 5591Tailieu.vncty.com   5249 5591
Tailieu.vncty.com 5249 5591
 
Tailieu.vncty.com 5219 0449
Tailieu.vncty.com   5219 0449Tailieu.vncty.com   5219 0449
Tailieu.vncty.com 5219 0449
 
Tailieu.vncty.com 5208 2542
Tailieu.vncty.com   5208 2542Tailieu.vncty.com   5208 2542
Tailieu.vncty.com 5208 2542
 
Tailieu.vncty.com 5145 0887
Tailieu.vncty.com   5145 0887Tailieu.vncty.com   5145 0887
Tailieu.vncty.com 5145 0887
 
Tailieu.vncty.com 5142 5647
Tailieu.vncty.com   5142 5647Tailieu.vncty.com   5142 5647
Tailieu.vncty.com 5142 5647
 
Tailieu.vncty.com 5138 529
Tailieu.vncty.com   5138 529Tailieu.vncty.com   5138 529
Tailieu.vncty.com 5138 529
 
Tailieu.vncty.com 5125 4608
Tailieu.vncty.com   5125 4608Tailieu.vncty.com   5125 4608
Tailieu.vncty.com 5125 4608
 
Tailieu.vncty.com 5117 1019
Tailieu.vncty.com   5117 1019Tailieu.vncty.com   5117 1019
Tailieu.vncty.com 5117 1019
 
Tailieu.vncty.com 5106 4775
Tailieu.vncty.com   5106 4775Tailieu.vncty.com   5106 4775
Tailieu.vncty.com 5106 4775
 
Tailieu.vncty.com 5089 2417
Tailieu.vncty.com   5089 2417Tailieu.vncty.com   5089 2417
Tailieu.vncty.com 5089 2417
 
Tailieu.vncty.com 5088 8018
Tailieu.vncty.com   5088 8018Tailieu.vncty.com   5088 8018
Tailieu.vncty.com 5088 8018
 
Tailieu.vncty.com 5067 1967
Tailieu.vncty.com   5067 1967Tailieu.vncty.com   5067 1967
Tailieu.vncty.com 5067 1967
 
Tailieu.vncty.com nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
Tailieu.vncty.com   nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747Tailieu.vncty.com   nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
Tailieu.vncty.com nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
 
Tailieu.vncty.com nhom 6-de_tai_flo_9602
Tailieu.vncty.com   nhom 6-de_tai_flo_9602Tailieu.vncty.com   nhom 6-de_tai_flo_9602
Tailieu.vncty.com nhom 6-de_tai_flo_9602
 
Tailieu.vncty.com lai phan-tu_2413
Tailieu.vncty.com   lai phan-tu_2413Tailieu.vncty.com   lai phan-tu_2413
Tailieu.vncty.com lai phan-tu_2413
 
Tailieu.vncty.com duong hoa-hoc_3666
Tailieu.vncty.com   duong hoa-hoc_3666Tailieu.vncty.com   duong hoa-hoc_3666
Tailieu.vncty.com duong hoa-hoc_3666
 
Tailieu.vncty.com do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
Tailieu.vncty.com   do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562Tailieu.vncty.com   do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
Tailieu.vncty.com do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
 
Tailieu.vncty.com tieu luanc4v-1324
Tailieu.vncty.com   tieu luanc4v-1324Tailieu.vncty.com   tieu luanc4v-1324
Tailieu.vncty.com tieu luanc4v-1324
 
Tailieu.vncty.com do an-cong_nghe_san_xuat_sua_tiet_trung_9366
Tailieu.vncty.com   do an-cong_nghe_san_xuat_sua_tiet_trung_9366Tailieu.vncty.com   do an-cong_nghe_san_xuat_sua_tiet_trung_9366
Tailieu.vncty.com do an-cong_nghe_san_xuat_sua_tiet_trung_9366
 

Tailieu.vncty.com giao trinh-lt[1].hdt

  • 1. CH¬NG 1 C¸C KH¸I NIÖM C¬ Së cña LËP TR×NH HíNG §èI TîNG Ch¬ng 1 tr×nh bµy nh÷ng vÊn ®Ò sau:  Th¶o luËn vÒ c¸ch tiÕp cËn híng ®èi tîng, nh÷ng nhîc ®iÓm cña lËp tr×nh truyÒn thèng vµ c¸c ®Æc ®iÓm cña lËp tr×nh híng ®èi tîng.  C¸c kh¸i niÖm c¬ së cña ph¬ng ph¸p híng ®èi tîng: • §èi tîng • Líp • Trõu tîng hãa d÷ liÖu vµ bao gãi th«ng tin • KÕ thõa • T¬ng øng béi • Liªn kÕt ®éng • TruyÒn th«ng b¸o  C¸c bíc cÇn thiÕt ®Ó thiÕt kÕ ch¬ng tr×nh theo híng ®èi tîng  C¸c u ®iÓm cña lËp tr×nh híng ®èi tîng  C¸c ng«n ng÷ híng ®èi tîng  Mét sè øng dông cña lËp tr×nh híng ®èi tîng 1.1. Giíi thiÖu 1.1.1. TiÕp cËn híng ®èi tîng Trong thÕ giíi thùc, chung quanh chóng ta lµ nh÷ng ®èi tîng, ®ã lµ c¸c thùc thÓ cã mèi quan hÖ víi nhau. VÝ dô c¸c phßng trong mét c«ng ty kinh doanh ®îc xem nh nh÷ng ®èi tîng. C¸c phßng ë ®©y cã thÓ lµ: phßng qu¶n lý, phßng b¸n hµng, phßng kÕ to¸n, phßng tiÕp thÞ,... Mçi phßng ngoµi nh÷ng c¸n bé ®¶m nhiÖm nh÷ng c«ng viÖc cô thÓ, cßn cã nh÷ng d÷ liÖu riªng nh th«ng tin vÒ nh©n viªn, doanh sè b¸n hµng, hoÆc c¸c d÷ liÖu kh¸c cã liªn quan ®Õn bé phËn ®ã. ViÖc ph©n chia c¸c phßng chøc n¨ng trong c«ng ty sÏ t¹o ®iÒu kiÖn dÔ dµng cho viÖc qu¶n lý c¸c ho¹t ®éng. Mçi nh©n viªn trong phßng sÏ ®iÒu khiÓn vµ xö lý d÷ liÖu cña phßng ®ã. VÝ dô phßng kÕ to¸n phô tr¸ch vÒ l¬ng bæng nh©n viªn trong c«ng ty. NÕu b¹n ®ang ë bé phËn tiÕp thÞ vµ cÇn t×m th«ng tin chi tiÕt vÒ l¬ng cña ®¬n vÞ m×nh th× sÏ gëi yªu cÇu vÒ phßng kÕ to¸n. Víi c¸ch lµm nµy b¹n ®îc ®¶m b¶o lµ chØ cã nh©n viªn cña bé phËn kÕ to¸n ®îc quyÒn truy cËp d÷ liÖu vµ cung cÊp th«ng tin cho b¹n. §iÒu nµy còng cho thÊy r»ng, kh«ng cã ngêi nµo thuéc bé phËn kh¸c cã thÓ truy cËp vµ thay ®æi d÷ liÖu cña bé phËn kÕ to¸n. Kh¸i niÖm nh thÕ vÒ ®èi tîng hÇu nh cã thÓ ®îc më réng ®èi víi mäi lÜnh vùc trong ®êi sèng x· héi vµ h¬n n÷a - ®èi víi viÖc tæ chøc ch¬ng tr×nh. Mäi øng dông cã thÓ ®îc ®Þnh nghÜa nh mét tËp c¸c thùc thÓ - hoÆc c¸c ®èi tîng, sao cho qu¸ tr×nh t¸i t¹o nh÷ng suy nghÜa cña chóng ta lµ gÇn s¸t nhÊt vÒ thÕ giíi thùc. Trong phÇn tiÕp theo chóng ta sÏ xem xÐt ph¬ng ph¸p lËp tr×nh truyÒn thèng ®Ó tõ ®ã thÊy r»ng v× sao chóng ta cÇn chuyÓn sang ph¬ng ph¸p lËp tr×nh híng ®èi tîng. 1.1.2. Nh÷ng nhîc ®iÓm cña lËp tr×nh híng thñ tôc C¸ch tiÕp cËn lËp tr×nh truyÒn thèng lµ lËp tr×nh híng thñ tôc (LTHTT). Theo c¸ch tiÕp cËn nµy th× mét hÖ thèng phÇn mÒm ®îc xem nh lµ d·y c¸c c«ng viÖc cÇn thùc hiÖn nh ®äc d÷ liÖu, tÝnh to¸n, xö lý, lËp b¸o c¸o vµ in Ên kÕt qu¶ v.v... Mçi c«ng viÖc ®ã sÏ ®îc thùc hiÖn bëi mét sè hµm nhÊt ®Þnh. Nh vËy träng t©m cña c¸ch tiÕp cËn nµy lµ c¸c hµm chøc n¨ng. LTHTT sö dông kü thuËt ph©n r· hµm chøc n¨ng theo c¸ch tiÕp cËn trªn xuèng (top-down) ®Ó t¹o ra cÊu tróc ph©n cÊp. C¸c ng«n ng÷ lËp tr×nh 1
  • 2. bËc cao nh COBOL, FORTRAN, PASCAL, C, v.v..., lµ nh÷ng ng«n ng÷ lËp tr×nh híng thñ tôc. Nh÷ng nhîc ®iÓm chÝnh cña LTHTT lµ:  Ch¬ng tr×nh khã kiÓm so¸t vµ khã kh¨n trong viÖc bæ sung, n©ng cÊp ch¬ng tr×nh. Ch¬ng tr×nh ®îc x©y dùng theo c¸ch TCHTT thùc chÊt lµ danh s¸ch c¸c c©u lÖnh mµ theo ®ã m¸y tÝnh cÇn thùc hiÖn. Danh s¸ch c¸c lÖnh ®ã ®îc tæ chøc thµnh tõng nhãm theo ®¬n vÞ cÊu tróc cña ng«n ng÷ lËp tr×nh vµ ®îc gäi lµ hµm/thñ tôc. Trong ch¬ng tr×nh cã nhiÒu hµm/thñ tôc, thêng th× cã nhiÒu thµnh phÇn d÷ liÖu quan träng sÏ ®îc khai b¸o tæng thÓ (global) ®Ó c¸c hµm/thñ tôc cã thÓ truy nhËp, ®äc vµ lµm thay ®æi gi¸ trÞ cña biÕn tæng thÓ. §iÒu nµy sÏ lµm cho ch¬ng tr×nh rÊt khã kiÓm so¸t, nhÊt lµ ®èi víi c¸c ch¬ng tr×nh lín, phøc t¹p th× vÊn ®Ò cµng trë nªn khã kh¨n h¬n. Khi ta muèn thay ®æi, bæ sung cÊu tróc d÷ liÖu dïng chung cho mét sè hµm/thñ tôc th× ph¶i thay ®æi hÇu nh tÊt c¶ c¸c hµm/thñ tôc liªn quan ®Õn d÷ liÖu ®ã.  M« h×nh ®îc x©y dùng theo c¸ch tiÕp cËn híng thñ tôc kh«ng m« t¶ ®îc ®Çy ®ñ, trung thùc hÖ thèng trong thùc tÕ.  Ph¬ng ph¸p TCHTT ®Æt träng t©m vµo hµm lµ híng tíi ho¹t ®éng sÏ kh«ng thùc sù t- ¬ng øng víi c¸c thùc thÓ trong hÖ thèng cña thÕ giíi thùc. 1.1.3. LËp tr×nh híng ®èi tîng LËp tr×nh híng ®èi tîng (Object Oriented Programming - LTH§T) lµ ph¬ng ph¸p lËp tr×nh lÊy ®èi tîng lµm nÒn t¶ng ®Ó x©y dùng thuËt gi¶i, x©y dùng ch¬ng tr×nh. §èi tîng ®îc x©y dùng trªn c¬ së g¾n cÊu tróc d÷ liÖu víi c¸c ph¬ng thøc (c¸c hµm/thñ tôc) sÏ thÓ hiÖn ®îc ®óng c¸ch mµ chóng ta suy nghÜ, bao qu¸t vÒ thÕ giíi thùc. LTH§T cho phÐp ta kÕt hîp nh÷ng tri thøc bao qu¸t vÒ c¸c qu¸ tr×nh víi nh÷ng kh¸i niÖm trõu tîng ®îc sö dông trong m¸y tÝnh. §iÓm c¨n b¶n cña ph¬ng ph¸p LTH§T lµ thiÕt kÕ ch¬ng tr×nh xoay quanh d÷ liÖu cña hÖ thèng. NghÜa lµ c¸c thao t¸c xö lý cña hÖ thèng ®îc g¾n liÒn víi d÷ liÖu vµ nh vËy khi cã sù thay ®æi cña cÊu tróc d÷ liÖu th× chØ ¶nh hëng ®Õn mét sè Ýt c¸c ph- ¬ng thøc xö lý liªn quan. LTH§T kh«ng cho phÐp d÷ liÖu chuyÓn ®éng tù do trong hÖ thèng. D÷ liÖu ®îc g¾n chÆt víi tõng ph¬ng thøc thµnh c¸c vïng riªng mµ c¸c ph¬ng thøc ®ã t¸c ®éng lªn vµ nã ®îc b¶o vÖ ®Ó cÊm viÖc truy nhËp tïy tiÖn tõ bªn ngoµi. LTH§T cho phÐp ph©n tÝch bµi to¸n thµnh tËp c¸c thùc thÓ ®îc gäi lµ c¸c ®èi tîng vµ sau ®ã x©y dùng c¸c d÷ liÖu cïng víi c¸c ph¬ng thøc xung quanh c¸c ®èi tîng ®ã. Tãm l¹i LTH§T cã nh÷ng ®Æc tÝnh chñ yÕu nh sau: 1. TËp trung vµo d÷ liÖu thay cho c¸c ph¬ng thøc. 2. Ch¬ng tr×nh ®îc chia thµnh c¸c líp ®èi tîng. 3. C¸c cÊu tróc d÷ liÖu ®îc thiÕt kÕ sao cho ®Æc t¶ ®îc c¸c ®èi tîng. 4. C¸c ph¬ng thøc x¸c ®Þnh trªn c¸c vïng d÷ liÖu cña ®èi tîng ®îc g¾n víi nhau trªn cÊu tróc d÷ liÖu ®ã. 5. D÷ liÖu ®îc bao bäc, che dÊu vµ kh«ng cho phÐp c¸c thµnh phÇn bªn ngoµi truy nhËp tù do. 6. C¸c ®èi tîng trao ®æi víi nhau th«ng qua c¸c ph¬ng thøc. 7. D÷ liÖu vµ c¸c ph¬ng thøc míi cã thÓ dÔ dµng bæ sung vµo ®èi tîng nµo ®ã khi cÇn thiÕt. 8. Ch¬ng tr×nh ®îc thiÕt kÕ theo c¸ch tiÕp cËn bottom-up (díi -lªn). 1.2. C¸c kh¸i niÖm c¬ b¶n cña lËp tr×nh híng ®èi tîng Nh÷ng kh¸i niÖm c¬ b¶n trong LTH§T bao gåm: §èi tîng; Líp; Trõu tîng hãa d÷ liÖu, bao gãi th«ng tin; KÕ thõa; T¬ng øng béi; Liªn kÕt ®éng; TruyÒn th«ng b¸o. 2
  • 3. 1.2.1. §èi tîng Trong thÕ giíi thùc, kh¸i niÖm ®èi tîng ®îc hiÓu nh lµ mét thùc thÓ, nã cã thÓ lµ ngêi, vËt hoÆc mét b¶ng d÷ liÖu cÇn xö lý trong ch¬ng tr×nh,... Trong LTH§T th× ®èi t- îng lµ biÕn thÓ hiÖn cña líp. 1.2.2. Líp Líp lµ mét kh¸i niÖm míi trong LTH§T so víi kü thuËt LTHTT. Nã lµ mét b¶n mÉu m« t¶ c¸c th«ng tin cÊu tróc d÷ liÖu vµ c¸c thao t¸c hîp lÖ cña c¸c phÇn tö d÷ liÖu. Khi mét phÇn tö d÷ liÖu ®îc khai b¸o lµ phÇn tö cña mét líp th× nã ®îc gäi lµ ®èi tîng. C¸c hµm ®îc ®Þnh nghÜa hîp lÖ trong mét líp ®îc gäi lµ c¸c ph¬ng thøc (method) vµ chóng lµ c¸c hµm duy nhÊt cã thÓ xö lý d÷ liÖu cña c¸c ®èi tîng cña líp ®ã. Mçi ®èi tîng cã riªng cho m×nh mét b¶n sao c¸c phÇn tö d÷ liÖu cña líp. Mçi líp bao gåm: danh s¸ch c¸c thuéc tÝnh (attribute) vµ danh s¸ch c¸c ph¬ng thøc ®Ó xö lý c¸c thuéc tÝnh ®ã. C«ng thøc ph¶n ¸nh b¶n chÊt cña kü thuËt LTH§T lµ: §èi tîng = D÷ liÖu + Ph¬ng thøc Ch¼ng h¹n, chóng ta xÐt líp HINH_CN bao gåm c¸c thuéc tÝnh: (x1,y1) to¹ ®é gãc trªn bªn tr¸i, d,r lµ chiÒu dµi vµ chiÒu réng cña HCN. C¸c ph¬ng thøc nhËp sè liÖu cho HCN, hµm tÝnh diÖn tÝch, chu vi vµ hµm hiÓn thÞ. Líp HINH_CN cã thÓ ®îc m« t¶ nh sau: H×nh 2.2 M« t¶ líp HINH_CN Chó ý: Trong LTH§T th× líp lµ kh¸i niÖm tÜnh, cã thÓ nhËn biÕt ngay tõ v¨n b¶n ch¬ng tr×nh, ngîc l¹i ®èi tîng lµ kh¸i niÖm ®éng, nã ®îc x¸c ®Þnh trong bé nhí cña m¸y tÝnh, n¬i ®èi tîng chiÕm mét vïng bé nhí lóc thùc hiÖn ch¬ng tr×nh. §èi tîng ®îc t¹o ra ®Ó xö HINH_CN Thuéc tÝnh : x1,y1 d,r Ph¬ng thøc : NhËp_sl DiÖn tÝch Chu vi HiÓn thÞ 3
  • 4. lý th«ng tin, thùc hiÖn nhiÖm vô ®îc thiÕt kÕ, sau ®ã bÞ hñy bá khi ®èi tîng ®ã hÕt vai trß. 1.2.3. Trõu tîng hãa d÷ liÖu vµ bao gãi th«ng tin Trõu tîng hãa lµ c¸ch biÓu diÔn nh÷ng ®Æc tÝnh chÝnh vµ bá qua nh÷ng chi tiÕt vôn vÆt hoÆc nh÷ng gi¶i thÝch. Khi x©y dùng c¸c líp, ta ph¶i sö dông kh¸i niÖm trõu t- îng hãa. VÝ dô ta cã thÓ ®Þnh nghÜa mét líp ®Ó m« t¶ c¸c ®èi tîng trong kh«ng gian h×nh häc bao gåm c¸c thuéc tÝnh trõu tîng nh lµ kÝch thíc, h×nh d¸ng, mµu s¾c vµ c¸c ph¬ng thøc x¸c ®Þnh trªn c¸c thuéc tÝnh nµy. ViÖc ®ãng gãi d÷ liÖu vµ c¸c ph¬ng thøc vµo mét ®¬n vÞ cÊu tróc líp ®îc xem nh mét nguyªn t¾c bao gãi th«ng tin. D÷ liÖu ®îc tæ chøc sao cho thÕ giíi bªn ngoµi (c¸c ®èi tîng ë líp kh¸c) kh«ng truy nhËp vµo, mµ chØ cho phÐp c¸c ph¬ng thøc trong cïng líp hoÆc trong nh÷ng líp cã quan hÖ kÕ thõa víi nhau míi ®îc quyÒn truy nhËp. ChÝnh c¸c ph¬ng thøc cña líp sÏ ®ãng vai trß nh lµ giao diÖn gi÷a d÷ liÖu cña ®èi tîng vµ phÇn cßn l¹i cña ch¬ng tr×nh. Nguyªn t¾c bao gãi d÷ liÖu ®Ó ng¨n cÊm sù truy nhËp trùc tiÕp trong lËp tr×nh ®îc gäi lµ sù che giÊu th«ng tin. 1.2.4. KÕ thõa KÕ thõa lµ qu¸ tr×nh mµ c¸c ®èi tîng cña líp nµy ®îc quyÒn sö dông mét sè tÝnh chÊt cña c¸c ®èi tîng cña líp kh¸c. Sù kÕ thõa cho phÐp ta ®Þnh nghÜa mét líp míi trªn c¬ së c¸c líp ®· tån t¹i. Líp míi nµy, ngoµi nh÷ng thµnh phÇn ®îc kÕ thõa, sÏ cã thªm nh÷ng thuéc tÝnh vµ c¸c hµm míi. Nguyªn lý kÕ thõa hç trî cho viÖc t¹o ra cÊu tróc ph©n cÊp c¸c líp. 1.2.5. T¬ng øng béi T¬ng øng béi lµ kh¶ n¨ng cña mét kh¸i niÖm (ch¼ng h¹n c¸c phÐp to¸n) cã thÓ sö dông víi nhiÒu chøc n¨ng kh¸c nhau. VÝ dô, phÐp + cã thÓ biÓu diÔn cho phÐp “céng” c¸c sè nguyªn (int), sè thùc (float), sè phøc (complex) hoÆc x©u ký tù (string) v.v... Hµnh vi cña phÐp to¸n t¬ng øng béi phô thuéc vµo kiÓu d÷ liÖu mµ nã sö dông ®Ó xö lý. T¬ng øng béi ®ãng vai quan träng trong viÖc t¹o ra c¸c ®èi tîng cã cÊu tróc bªn trong kh¸c nhau nhng cïng dïng chung mét giao diÖn bªn ngoµi (nh tªn gäi). 1.2.6. Liªn kÕt ®éng Liªn kÕt ®éng lµ d¹ng liªn kÕt c¸c thñ tôc vµ hµm khi ch¬ng tr×nh thùc hiÖn lêi gäi tíi c¸c hµm, thñ tôc ®ã. Nh vËy trong liªn kÕt ®éng, néi dung cña ®o¹n ch¬ng tr×nh øng víi thñ tôc, hµm sÏ kh«ng ®îc biÕt cho ®Õn khi thùc hiÖn lêi gäi tíi thñ tôc, hµm ®ã. 1.2.7. TruyÒn th«ng b¸o C¸c ®èi tîng göi vµ nhËn th«ng tin víi nhau gièng nh con ngêi trao ®æi víi nhau. ChÝnh nguyªn lý trao ®æi th«ng tin b»ng c¸ch truyÒn th«ng b¸o cho phÐp ta dÔ dµng x©y dùng ®îc hÖ thèng m« pháng gÇn h¬n nh÷ng hÖ thèng trong thÕ giíi thùc. TruyÒn th«ng b¸o cho mét ®èi tîng lµ yªu cÇu ®èi tîng thùc hiÖn mét viÖc g× ®ã. C¸ch øng xö cña ®èi tîng ®îc m« t¶ bªn trong líp th«ng qua c¸c ph¬ng thøc. Trong ch¬ng tr×nh, th«ng b¸o göi ®Õn cho mét ®èi tîng chÝnh lµ yªu cÇu thùc hiÖn mét c«ng viÖc cô thÓ, nghÜa lµ sö dông nh÷ng hµm t¬ng øng ®Ó xö lý d÷ liÖu ®· ®îc khai b¸o trong ®èi tîng ®ã. V× vËy, trong th«ng b¸o ph¶i chØ ra ®îc hµm cÇn thùc hiÖn trong ®èi tîng nhËn th«ng b¸o. Th«ng b¸o truyÒn ®i còng ph¶i x¸c ®Þnh tªn ®èi t- îng vµ th«ng tin truyÒn ®i. VÝ dô, líp CONGNHAN cã thÓ hiÖn lµ ®èi tîng cô thÓ ®îc ®¹i diÖn bëi Hoten nhËn ®îc th«ng b¸o cÇn tÝnh l¬ng th«ng qua hµm TINHLUONG ®· ®îc x¸c ®Þnh trong líp CONGNHAN. Th«ng b¸o ®ã sÏ ®îc xö lý nh sau: 4 CONGNHAN.TINHLUONG (Hoten) §èi t­îng Th«ng b¸o Th«ng tin
  • 5. Trong ch¬ng tr×nh híng ®èi tîng, mçi ®èi tîng chØ tån t¹i trong thêi gian nhÊt ®Þnh. §èi tîng ®îc t¹o ra khi nã ®îc khai b¸o vµ sÏ bÞ hñy bá khi ch¬ng tr×nh ra khái miÒn x¸c ®Þnh cña ®èi tîng ®ã. Sù trao ®æi th«ng tin chØ cã thÓ thùc hiÖn trong thêi gian ®èi tîng tån t¹i. 1.3. C¸c bíc cÇn thiÕt ®Ó thiÕt kÕ ch¬ng tr×nh theo híng ®èi tîng Ch¬ng tr×nh theo híng ®èi tîng bao gåm mét tËp c¸c ®èi tîng vµ mèi quan hÖ gi÷a c¸c ®èi tîng víi nhau. V× vËy, lËp tr×nh trong ng«n ng÷ híng ®èi tîng bao gåm c¸c bíc sau: 1. X¸c ®Þnh c¸c d¹ng ®èi tîng (líp) cña bµi tãan. 2. T×m kiÕm c¸c ®Æc tÝnh chung (d÷ liÖu chung) trong c¸c d¹ng ®èi tîng nµy, nh÷ng g× chóng cïng nhau chia xÎ. 3. X¸c ®Þnh líp c¬ së dùa trªn c¬ së c¸c ®Æc tÝnh chung cña c¸c d¹ng ®èi tîng. 4. Tõ líp c¬ së, x©y dùng c¸c líp dÉn xuÊt chøa c¸c thµnh phÇn, nh÷ng ®Æc tÝnh kh«ng chung cßn l¹i cña c¸c d¹ng ®èi tîng. Ngoµi ra, ta cßn ®a ra c¸c líp cã quan hÖ víi c¸c líp c¬ së vµ líp dÉn xuÊt. 1.4. C¸c u ®iÓm cña lËp tr×nh híng ®èi tîng C¸ch tiÕp cËn híng ®èi tîng gi¶i quyÕt ®îc nhiÒu vÊn ®Ò tån t¹i trong qu¸ tr×nh ph¸t triÓn phÇn mÒm vµ t¹o ra ®îc nh÷ng s¶n phÈm phÇn mÒm cã chÊt lîng cao. Nh÷ng u ®iÓm chÝnh cña LTH§T lµ: 1. Th«ng qua nguyªn lý kÕ thõa, cã thÓ lo¹i bá ®îc nh÷ng ®o¹n ch¬ng tr×nh lÆp l¹i trong qu¸ tr×nh m« t¶ c¸c líp vµ më réng kh¶ n¨ng sö dông c¸c líp ®· ®îc x©y dùng. 2. Ch¬ng tr×nh ®îc x©y dùng tõ nh÷ng ®¬n thÓ (®èi tîng) trao ®æi víi nhau nªn viÖc thiÕt kÕ vµ lËp tr×nh sÏ ®îc thùc hiÖn theo quy tr×nh nhÊt ®Þnh chø kh«ng ph¶i dùa vµo kinh nghiÖm vµ kü thuËt nh tríc. §iÒu nµy ®¶m b¶o rót ng¾n ®îc thêi gian x©y dùng hÖ thèng vµ t¨ng n¨ng suÊt lao ®éng. 3. Nguyªn lý che giÊu th«ng tin gióp ngêi lËp tr×nh t¹o ra ®îc nh÷ng ch¬ng tr×nh an toµn kh«ng bÞ thay bëi nh÷ng ®o¹n ch¬ng tr×nh kh¸c. 4. Cã thÓ x©y dùng ®îc ¸nh x¹ c¸c ®èi tîng cña bµi to¸n vµo ®èi tîng cña ch¬ng tr×nh. 5. C¸ch tiÕp cËn thiÕt kÕ ®Æt träng t©m vµo ®èi tîng, gióp chóng ta x©y dùng ®- îc m« h×nh chi tiÕt vµ gÇn víi d¹ng cµi ®Æt h¬n. 6. Nh÷ng hÖ thèng híng ®èi tîng dÔ më réng, n©ng cÊp thµnh nh÷ng hÖ lín h¬n. 7. Kü thuËt truyÒn th«ng b¸o trong viÖc trao ®æi th«ng tin gi÷a c¸c ®èi tîng gióp cho viÖc m« t¶ giao diÖn víi c¸c hÖ thèng bªn ngoµi trë nªn ®¬n gi¶n h¬n. 8. Cã thÓ qu¶n lý ®îc ®é phøc t¹p cña nh÷ng s¶n phÈm phÇn mÒm. Kh«ng ph¶i trong hÖ thèng híng ®èi tîng nµo còng cã tÊt c¶ c¸c tÝnh chÊt nªu trªn. Kh¶ n¨ng cã c¸c tÝnh chÊt ®ã cßn phô thuéc vµo lÜnh vùc øng dông cña dù ¸n tin häc vµ vµo ph¬ng ph¸p thùc hiÖn cña ngêi ph¸t triÓn phÇn mÒm. 1.5. C¸c ng«n ng÷ híng ®èi tîng LËp tr×nh híng ®èi tîng kh«ng lµ ®Æc quyÒn cña mét ng«n ng÷ nµo ®Æc biÖt. Còng gièng nh lËp tr×nh cã cÊu tróc, nh÷ng kh¸i niÖm trong lËp tr×nh híng ®èi tîng cã thÓ cµi ®Æt trong nh÷ng ng«n ng÷ lËp tr×nh nh C hoÆc Pascal,... Tuy nhiªn, ®èi víi nh÷ng ch¬ng tr×nh lín th× vÊn ®Ò lËp tr×nh sÏ trë nªn phøc t¹p. Nh÷ng ng«n ng÷ ®îc thiÕt kÕ ®Æc biÖt, hç trî cho viÖc m« t¶, cµi ®Æt c¸c kh¸i niÖm cña ph¬ng ph¸p híng ®èi tîng ®îc gäi chung lµ ng«n ng÷ ®èi tîng. Dùa vµo kh¶ n¨ng ®¸p øng c¸c kh¸i niÖm vÒ híng ®èi tîng, ta cã thÓ chia ra lµm hai lo¹i: 1. Ng«n ng÷ lËp tr×nh dùa trªn ®èi tîng 5
  • 6. 2. Ng«n ng÷ lËp tr×nh híng ®èi tîng LËp tr×nh dùa trªn ®èi tîng lµ kiÓu lËp tr×nh hç trî chÝnh cho viÖc bao gãi, che giÊu th«ng tin vµ ®Þnh danh c¸c ®èi tîng. LËp tr×nh dùa trªn ®èi tîng cã nh÷ng ®Æc tÝnh sau: • Bao gãi d÷ liÖu • C¬ chÕ che giÊu vµ truy nhËp d÷ liÖu • Tù ®éng t¹o lËp vµ xãa bá c¸c ®èi tîng • PhÐp to¸n t¶i béi Ng«n ng÷ hç trî cho kiÓu lËp tr×nh trªn ®îc gäi lµ ng«n ng÷ lËp tr×nh dùa trªn ®èi tîng. Ng«n ng÷ trong líp nµy kh«ng hç trî cho viÖc thùc hiÖn kÕ thõa vµ liªn kÕt ®éng, ch¼ng h¹n Ada lµ ng«n ng÷ lËp tr×nh dùa trªn ®èi tîng. LËp tr×nh híng ®èi tîng lµ kiÓu lËp tr×nh dùa trªn ®èi tîng vµ bæ sung thªm nhiÒu cÊu tróc ®Ó cµi ®Æt nh÷ng quan hÖ vÒ kÕ thõa vµ liªn kÕt ®éng. V× vËy ®Æc tÝnh cña LTH§T cã thÓ viÕt mét c¸ch ng¾n gän nh sau: C¸c ®Æc tÝnh dùa trªn ®èi tîng + kÕ thõa + liªn kÕt ®éng. Ng«n ng÷ hç trî cho nh÷ng ®Æc tÝnh trªn ®îc gäi lµ ng«n ng÷ LTH§T, vÝ dô nh C++, Smalltalk, Object Pascal v.v... ViÖc chän mét ng«n ng÷ ®Ó cµi ®Æt phÇn mÒm phô thuéc nhiÒu vµo c¸c ®Æc tÝnh vµ yªu cÇu cña bµi to¸n øng dông, vµo kh¶ n¨ng sö dông l¹i cña nh÷ng ch¬ng tr×nh ®· cã vµ vµo tæ chøc cña nhãm tham gia x©y dùng phÇn mÒm. 1.6. Mét sè øng dông cña LTH§T LTH§T ®ang ®îc øng dông ®Ó ph¸t triÓn phÇn mÒm trong nhiÒu lÜnh vùc kh¸c nhau. Trong sè ®ã, cã øng dông quan träng vµ næi tiÕng nhÊt hiÖn nay lµ hÖ ®iÒu hµnh Windows cña h·ng Microsoft ®· ®îc ph¸t triÓn dùa trªn kü thuËt LTH§T. Mét sè nh÷ng lÜnh vùc øng dông chÝnh cña kü thuËt LTH§T bao gåm: + Nh÷ng hÖ thèng lµm viÖc theo thêi gian thùc. + Trong lÜnh vùc m« h×nh hãa hoÆc m« pháng c¸c qu¸ tr×nh + C¸c c¬ së d÷ liÖu híng ®èi tîng. + Nh÷ng hÖ siªu v¨n b¶n, multimedia + LÜnh vùc trÝ tuÖ nh©n t¹o vµ c¸c hÖ chuyªn gia. + LËp tr×nh song song vµ m¹ng n¬-ron. + Nh÷ng hÖ tù ®éng hãa v¨n phßng vµ trî gióp quyÕt ®Þnh. ... Ch¬ng 2 c¸c më réng cña ng«n ng÷ C++ Ch¬ng 2 tr×nh bµy nh÷ng vÊn ®Ò sau ®©y:  Giíi thiÖu chung vÒ ng«n ng÷ C++  Mét sè më réng cña ng«n ng÷ C++ so víi ng«n ng÷ C  C¸c ®Æc tÝnh cña C++ hç trî lËp tr×nh híng ®èi tîng  Vµo ra trong C++  CÊp ph¸t vµ gi¶i phãng bé nhí  BiÕn tham chiÕu, h»ng tham chiÕu  TruyÒn tham sè cho hµm theo tham chiÕu 6
  • 7.  Hµm tr¶ vÒ gi¸ trÞ tham chiÕu  Hµm víi tham sè cã gi¸ trÞ mÆc ®Þnh  C¸c hµm néi tuyÕn (inline)  Hµm t¶i béi 2.1. Giíi thiÖu chung vÒ C++ C++ lµ ng«n ng÷ lËp tr×nh híng ®èi tîng vµ lµ sù më réng cña ng«n ng÷ C. V× vËy mäi kh¸i niÖm trong C ®Òu dïng ®îc trong C++. PhÇn lín c¸c ch¬ng tr×nh C ®Òu cã thÓ ch¹y ®îc trong C++. Trong ch¬ng nµy chØ tËp trung giíi thiÖu nh÷ng kh¸i niÖm, ®Æc tÝnh míi cña C++ hç trî cho lËp tr×nh híng ®èi tîng. Mét sè kiÕn thøc cã trong C+ + nhng ®· cã trong ng«n ng÷ C sÏ kh«ng ®îc tr×nh bµy l¹i ë ®©y. 2.2. Mét sè më réng cña C++ so víi C 2.2.1. §Æt lêi chó thÝch Ngoµi kiÓu chó thÝch trong C b»ng /* ... */ , C++ ®a thªm mét kiÓu chó thÝch thø hai, ®ã lµ chó thÝch b¾t ®Çu b»ng //. KiÓu chó thÝch /*...*/ ®îc dïng cho c¸c khèi chó thÝch lín gåm nhiÒu dßng, cßn kiÓu // ®îc dïng cho c¸c chó thÝch trªn mét dßng. Ch- ¬ng tr×nh dÞch sÏ bá qua tÊt c¶ c¸c chó thÝch trong ch¬ng tr×nh. VÝ dô: /* §©y lµ c©u chó thÝch trªn nhiÒu dßng */ // §©y lµ chó thÝch trªn mét dßng 2.2.2. Khai b¸o biÕn Trong C tÊt c¶ c¸c c©u lÖnh khai b¸o biÕn, m¶ng côc bé ph¶i ®Æt t¹i ®Çu khèi. V× vËy vÞ trÝ khai b¸o vµ vÞ trÝ sö dông cña biÕn cã thÓ ë c¸ch kh¸ xa nhau, ®iÒu nµy g©y khã kh¨n trong viÖc kiÓm so¸t ch¬ng tr×nh. C++ ®· kh¾c phôc nhîc ®iÓm nµy b»ng c¸ch cho phÐp c¸c lÖnh khai b¸o biÕn cã thÓ ®Æt bÊt kú chç nµo trong ch¬ng tr×nh tríc khi c¸c biÕn ®îc sö dông. Ph¹m vi ho¹t ®éng cña c¸c biÕn kiÓu nµy lµ khèi trong ®ã biÕn ®îc khai b¸o. VÝ dô 2.1 Ch¬ng tr×nh sau ®©y nhËp mét d·y sè thùc råi s¾p xÕp theo thø tù t¨ng dÇn: #include <stdio.h> #include <conio.h> #include <alloc.h> void main() { int n; printf("n So phan tu cua day N="); scanf("%d",&n); float *x=(float*)malloc((n+1)*sizeof(float)); for (int i=0;i<n;i++) { printf("n X[%d]=",i); scanf("%f",x+i); } for(i=0;i<n-1;++i) for (int j=i+1;j<n;++j) if (x[i]>x[j]) 7
  • 8. { float tg=x[i]; x[i]=x[j]; x[j]=tg; } printf("n Day sau khi sap xepn"); for (i=0;i<n;++i) printf("%0.2f ",x[i]); getch(); } 2.2.3. PhÐp chuyÓn kiÓu b¾t buéc Ngoµi phÐp chuyÓn kiÓu b¾t buéc ®îc viÕt trong C theo có ph¸p: (kiÓu) biÓu thøc C++ cßn sö dông mét phÐp chuyÓn kiÓu míi nh sau: KiÓu(biÓu thøc) PhÐp chuyÓn kiÓu nµy cã d¹ng nh mét hµm sè chuyÓn kiÓu ®ang ®îc gäi. C¸ch chuyÓn kiÓu nµy thêng ®îc sö dông trong thùc tÕ. VÝ dô 2.2 Ch¬ng tr×nh sau ®©y tÝnh sau tæng S = n 1 ... 3 1 2 1 1 ++++ Víi n lµ mét sè nguyªn d¬ng nhËp tõ bµn phÝm. #include <stdio.h> #include <conio.h> void main() { int n; printf("n So phan tu cua day N="); scanf("%d",&n); float s=0.0; for (int i=1;i<=n;++i) s+= float(1)/float(i); //chuyen kieu theo C++ printf("S=%0.2f",s); getch(); } 2.2.4. LÊy ®Þa chØ c¸c phÇn tö m¶ng thùc 2 chiÒu Trong C kh«ng cho phÐp dïng phÐp to¸n & ®Ó lÊy ®Þa chØ cña c¸c phÇn tö m¶ng thùc 2 chiÒu. V× vËy khi nhËp mét ma trËn thùc (dïng hµm scanf()) ta ph¶i nhËp qua mét biÕn trung gian sau ®ã míi g¸n cho c¸c phÇn tö m¶ng. C++ cho phÐp dïng phÐp to¸n & ®Ó lÊy ®Þa chØ c¸c phÇn tö m¶ng thùc 2 chiÒu, do ®ã thÓ dïng hµm scanf() ®Ó nhËp trùc tiÕp vµo c¸c phÇn tö m¶ng. VÝ dô 2.3 Ch¬ng tr×nh sau ®©y cho phÐp nhËp mét m¶ng thùc cÊp 20x20 vµ t×m c¸c phÇn tö cã gi¸ trÞ lín nhÊt. #include <conio.h> #include <stdio.h> void main() 8
  • 9. { float a[20][20],smax; int m,n,i,j,imax,jmax; clrscr(); puts(" Cho biet so hang va so cot cua ma tran: "); scanf("%d%d",&m,&n); for (i=0;i<m;++i) for (j=0;j<n;++j) { printf("n a[%d][%d]=",i,j); scanf("%f",&a[i][j]); } smax=a[0][0]; imax=0; jmax=0; for (i=0;i<m;++i) for(j=0;j<n;++j) if(smax<a[i][j]) { smax=a[i][j]; imax=i; jmax=j; } puts("nn Ma tran"); for (i=0;i<m;++i) for (j=0;j<n;++j) { if (j==0) puts(""); printf("%6.1f",a[i][j]); } puts("nn Phan tu max:"); printf("n Co gia tri=%6.1f", smax); printf("nn Tai hang %d cot %d",imax,jmax); getch(); } 2.3. Vµo ra trong C++ §Ó xuÊt d÷ liÖu ra mµn h×nh vµ nhËp d÷ liÖu tõ bµn phÝm, trong C++ vÉn cã thÓ dïng hµm printf() vµ scanf(), ngoµi ra trong C++ ta cã thÓ dïng dßng xuÊt/nhËp chuÈn ®Ó nhËp/xuÊt d÷ liÖu th«ng qua hai biÕn ®èi tîng cña dßng (stream object) lµ cout vµ cin. 2.3.1. XuÊt d÷ liÖu Có ph¸p: cout << biÓu thøc 1<<. . .<< biÓu thøc N; 9
  • 10. Trong ®ã cout ®îc ®Þnh nghÜa tríc nh mét ®èi tîng biÓu diÔn cho thiÕt bÞ xuÊt chuÈn cña C++ lµ mµn h×nh, cout ®îc sö dông kÕt hîp víi to¸n tö chÌn << ®Ó hiÓn thÞ gi¸ trÞ c¸c biÓu thøc 1, 2,..., N ra mµn h×nh. 2.3.2. NhËp d÷ liÖu Có ph¸p: cin >>biÕn 1>>. . . >>biÕn N; To¸n tö cin ®îc ®Þnh nghÜa tríc nh mét ®èi tîng biÓu diÔn cho thiÕt bÞ vµo chuÈn cña C++ lµ bµn phÝm, cin ®îc sö dông kÕt hîp víi to¸n tö trÝch >> ®Ó nhËp d÷ liÖu tõ bµn phÝm cho c¸c biÕn 1, 2, ..., N. Chó ý: • §Ó nhËp mét chuçi kh«ng qu¸ n ký tù vµ lu vµo m¶ng mét chiÒu a (kiÓu char) cã thÓ dïng hµm cin.get nh sau: cin.get(a,n); • To¸n tö nhËp cin>> sÏ ®Ó l¹i ký tù chuyÓn dßng ’n’ trong bé ®Öm. Ký tù nµy cã thÓ lµm tr«i ph¬ng thøc cin.get. §Ó kh¾c phôc t×nh tr¹ng trªn cÇn dïng ph¬ng thøc cin.ignore(1) ®Ó bá qua mét ký tù chuyÓn dßng. • §Ó sö dông c¸c lo¹i to¸n tö vµ ph¬ng thøc nãi trªn cÇn khai b¸o tËp tin dÉn híng iostream.h 2.3.3. §Þnh d¹ng khi in ra mµn h×nh • §Ó quy ®Þnh sè thùc ®îc hiÓn thÞ ra mµn h×nh víi p ch÷ sè sau dÊu chÊm thËp ph©n, ta sö dông ®ång thêi c¸c hµm sau: setiosflags(ios::showpoint); // BËt cê hiÖu showpoint(p) setprecision(p); C¸c hµm nµy cÇn ®Æt trong to¸n tö xuÊt nh sau: cout<<setiosflag(ios::showpoint)<<setprecision(p); C©u lÖnh trªn sÏ cã hiÖu lùc ®èi víi tÊt c¶ c¸c to¸n tö xuÊt tiÕp theo cho ®Õn khi gÆp mét c©u lÖnh ®Þnh d¹ng míi. • §Ó quy ®Þnh ®é réng tèi thiÓu ®Ó hiÓn thÞ lµ k vÞ trÝ cho gi¸ trÞ (nguyªn, thùc, chuçi) ta dïng hµm: setw(k) Hµm nµy cÇn ®Æt trong to¸n tö xuÊt vµ nã chØ cã hiÖu lùc cho mét gi¸ trÞ ®îc in gÇn nhÊt. C¸c gi¸ trÞ in ra tiÕp theo sÏ cã ®é réng tèi thiÓu mÆc ®Þnh lµ 0, nh vËy c©u lÖnh: cout<<setw(6)<<“Khoa”<<“CNTT” sÏ in ra chuçi “ KhoaCNTT”. VÝ dô 2.4 Ch¬ng tr×nh sau cho phÐp nhËp mét danh s¸ch kh«ng qu¸ 100 thÝ sinh. D÷ liÖu mçi thÝ sinh gåm hä tªn, c¸c ®iÓm thi m«n 1, m«n 2, m«n 3. Sau ®ã in danh s¸ch thÝ sinh theo thø tù gi¶m dÇn cña tæng ®iÓm. #include <iostream.h> #include <conio.h> #include <iomanip.h> void main() { struct { char ht[25]; float d1,d2,d3,td; }ts[100],tg; 10
  • 11. int n,i,j; clrscr(); cout << "So thi sinh:"; cin >> n; for (i=0;i<n;++i) { cout << "n Thi sinh:"<<i; cout << "n Ho ten:"; cin.ignore(1); cin.get(ts[i].ht,25); cout << "Diem cac mon thi :"; cin>>ts[i].d1>>ts[i].d2>>ts[i].d3; ts[i].td=ts[i].d1+ts[i].d2+ts[i].d3; } for (i=0;i<n-1;++i) for(j=i+1;j<n;++j) if(ts[i].td<ts[j].td) { tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } cout<< " Danh sach thi sinh sau khi sap xep :"; for (i=0;i<n;++i) { cout<< "n" << setw(25)<<ts[i].ht<<setw(5)<<ts[i].td; } getch(); } VÝ dô 2.5 Ch¬ng tr×nh sau ®©y cho phÐp nhËp mét m¶ng thùc cÊp 50x50. Sau ®ã in ma trËn díi d¹ng b¶ng vµ t×m mét phÇn tö lín nhÊt. #include <iostream.h> #include <iomanip.h> #include <conio.h> void main() { float a[50][50],smax; int m,n,i,j,imax,jmax; clrscr(); cout<< "Nhap so hang va cot:"; cin>>m>>n; for (i=0;i<m;++i) for (j=0;j<n;++j) 11
  • 12. { cout<< "a["<<i<<","<<j<<"]="; cin>> a[i][j]; } smax= a[0][0]; imax=0; jmax=0; for (i=0;i<m;++i) for (j=0;j<n;++j) if (smax<a[i][j]) { smax=a[i][j]; imax=i; jmax=j; } cout << "nn Mang da nhap"; cout << setiosflags(ios::showpoint)<<setprecision(1); for (i=0;i<m;++i) for (j=0;j<n;++j) { if (j==0) cout<<"n"; cout << setw(6)<<a[i][j]; } cout << "nn"<< "Phan tu max:"<< "n"; cout << "co gia tri ="<<setw(6)<<smax; cout<<"nTai hang"<<imax<< " cot "<<jmax; getch(); } 2.4. CÊp ph¸t vµ gi¶i phãng bé nhí Trong C cã thÓ sö dông c¸c hµm cÊp ph¸t bé nhí nh malloc(), calloc() vµ hµm free() ®Ó gi¶i phãng bé nhí ®îc cÊp ph¸t. C++ ®a thªm mét c¸ch thøc míi ®Ó thùc hiÖn viÖc cÊp ph¸t vµ gi¶i phãng bé nhí b»ng c¸ch dïng hai to¸n tö new vµ delete. 2.4.1. To¸n tö new ®Ó cÊp ph¸t bé nhí To¸n tö new thay cho hµm malloc() vµ calloc() cña C cã có ph¸p nh sau: new Tªn kiÓu ; hoÆc new (Tªn kiÓu); Trong ®ã Tªn kiÓu lµ kiÓu d÷ liÖu cña biÕn con trá, nã cã thÓ lµ: c¸c kiÓu d÷ liÖu chuÈn nh int, float, double, char,... hoÆc c¸c kiÓu do ngêi lËp tr×nh ®Þnh nghÜa nh m¶ng, cÊu tróc, líp,... Chó ý: §Ó cÊp ph¸t bé nhí cho m¶ng mét chiÒu, dïng có ph¸p nh sau: BiÕn con trá = new kiÓu[n]; Trong ®ã n lµ sè nguyªn d¬ng x¸c ®Þnh sè phÇn tö cña m¶ng. VÝ dô: float *p = new float; //cÊp ph¸t bé nhí cho biÕn con trá p cã kiÓu int 12
  • 13. int *a = new int[100]; //cÊp ph¸t bé nhí ®Ó lu tr÷ m¶ng mét chiÒu a // gåm 100 phÇn tö Khi sö dông to¸n tö new ®Ó cÊp ph¸t bé nhí, nÕu kh«ng ®ñ bé nhí ®Ó cÊp ph¸t, new sÏ tr¶ l¹i gi¸ trÞ NULL cho con trá. §o¹n ch¬ng tr×nh sau minh häa c¸ch kiÓm tra lçi cÊp ph¸t bé nhí: double *p; int n; cout<< “n So phan tu : ”; cin>>n; p = new double[n] if (p == NULL) { cout << “Loi cap phat bo nho”; exit(0); } 2.4.2. To¸n tö delete To¸n tö delete thay cho hµm free() cña C, nã cã có ph¸p nh sau: delete con trá ; VÝ dô 2.6 Ch¬ng tr×nh sau minh ho¹ c¸ch dïng new ®Ó cÊp ph¸t bé nhí chøa n thÝ sinh. Mçi thÝ sinh lµ mét cÊu tróc gåm c¸c trêng ht(hä tªn), sobd(sè b¸o danh), vµ td(tæng ®iÓm). Ch¬ng tr×nh sÏ nhËp n, cÊp ph¸t bé nhí chøa n thÝ sinh, kiÓm tra lçi cÊp ph¸t bé nhí, nhËp n thÝ sinh, s¾p xÕp thÝ sinh theo thø tù gi¶m cña tæng ®iÓm, in danh s¸ch thÝ sinh sau khi s¾p xÕp, gi¶i phãng bé nhí ®· cÊp ph¸t. #include <iomanip.h> #include <iostream.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> struct TS { char ht[20]; long sobd; float td; }; void main(void) { TS *ts; int n; cout<<"nSo thi sinh n = "; cin>>n; ts = new TS[n+1]; if (ts == NULL) { cout << "n Loi cap phat vung nho"; 13
  • 14. getch(); exit(0); } for (int i=0;i<n;++i) { cout << "n Thi sinh thu "<<i; cout<< "n Ho ten"; cin.ignore(1); cin.get (ts[i].ht,20); cout << "so bao danh"; cin>> ts[i].sobd; cout<< "tong diem:"; cin>>ts[i].td; } for (i=0;i<n-1;++i) for (int j=i+1;j<n;++j) if (ts[i].td<ts[j].td) { TS tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } cout << setiosflags(ios::showpoint)<<setprecision(1); for (i=0;i<n;++i) cout << "n" << setw(20)<<ts[i].ht<<setw(6)<<ts[i].td; delete ts; getch(); } 2.5. BiÕn tham chiÕu Trong C cã 2 lo¹i biÕn lµ: BiÕn gi¸ trÞ dïng ®Ó chøa d÷ liÖu (nguyªn, thùc, ký tù,...) vµ biÕn con trá dïng ®Ó chøa ®Þa chØ. C¸c biÕn nµy ®Òu ®îc cung cÊp bé nhí vµ cã ®Þa chØ. C++ cho phÐp sö dông lo¹i biÕn thø ba lµ biÕn tham chiÕu. BiÕn tham chiÕu lµ mét tªn kh¸c (bÝ danh) cho biÕn ®· ®Þnh nghÜa tríc ®ã. Có ph¸p khai b¸o biÕn tham chiÕu nh sau: KiÓu &BiÕn tham chiÕu = BiÕn; BiÕn tham chiÕu cã ®Æc ®iÓm lµ nã ®îc dïng lµm bÝ danh cho mét biÕn (kiÓu gi¸ trÞ) nµo ®ã vµ sö dông vïng nhí cña biÕn nµy. VÝ dô: Víi c©u lÖnh: int a, &tong=a; th× tong lµ bÝ danh cña biÕn a vµ biÕn tong dïng chung vïng nhí cña biÕn a. Lóc nµy, trong mäi c©u lÖnh, viÕt a hay viÕt tong ®Òu cã ý nghÜa nh nhau, v× ®Òu truy nhËp ®Õn cïng mét vïng nhí. Mäi sù thay ®æi ®èi víi biÕn tong ®Òu ¶nh hëng ®èi víi biÕn a vµ ngîc l¹i. VÝ dô: int a, &tong = a; tong =1; //a=1 cout<< tong; //in ra sè 1 tong++; //a=2 14
  • 15. ++a; //a=3 cout<<tong; //in ra sè 3 Chó ý: • Trong khai b¸o biÕn tham chiÕu ph¶i chØ râ tham chiÕu ®Õn biÕn nµo. • BiÕn tham chiÕu cã thÓ tham chiÕu ®Õn mét phÇn tö m¶ng, nhng kh«ng cho phÐp khai b¸o m¶ng tham chiÕu. • BiÕn tham chiÕu cã thÓ tham chiÕu ®Õn mét h»ng. Khi ®ã nã sö dông vïng nhí cña h»ng vµ cã thÓ lµm thay ®æi gi¸ trÞ chøa trong vïng nhí nµy. • BiÕn tham chiÕu thêng ®îc sö dông lµm ®èi cña hµm ®Ó cho phÐp hµm truy nhËp ®Õn c¸c tham biÕn trong lêi gäi hµm 2.6. H»ng tham chiÕu Có ph¸p khai b¸o h»ng tham chiÕu nh sau: const KiÓu d÷ liÖu &BiÕn = BiÕn/H»ng; VÝ dô: int n = 10; const int &m = n; const int &p = 123; H»ng tham chiÕu cã thÓ tham chiÕu ®Õn mét biÕn hoÆc mét h»ng. Chó ý:  BiÕn tham chiÕu vµ h»ng tham chiÕu kh¸c nhau ë chç: kh«ng cho phÐp dïng h»ng tham chiÕu ®Ó lµm thay ®æi gi¸ trÞ cña vïng nhí mµ nã tham chiÕu. VÝ dô: int y=12, z; const int &p = y //H»ng tham chiÕu p tham chiÕu ®Õn biÕn y p = p + 1; //Sai, tr×nh biªn dÞch sÏ th«ng b¸o lçi  H»ng tham chiÕu cho phÐp sö dông gi¸ trÞ chøa trong mét vïng nhí, nhng kh«ng cho phÐp thay ®æi gi¸ trÞ nµy.  H»ng tham chiÕu thêng ®îc sö dông lµm tham sè cña hµm ®Ó cho phÐp sö dông gi¸ trÞ cña c¸c tham sè trong lêi gäi hµm, nhng tr¸nh lµm thay ®æi gi¸ trÞ tham sè. 2.7. TruyÒn tham sè cho hµm theo tham chiÕu Trong C chØ cã mét c¸ch truyÒn d÷ liÖu cho hµm lµ truyÒn theo theo gi¸ trÞ. Ch- ¬ng tr×nh sÏ t¹o ra c¸c b¶n sao cña c¸c tham sè thùc sù trong lêi gäi hµm vµ sÏ thao t¸c trªn c¸c b¶n sao nµy chø kh«ng xö lý trùc tiÕp víi c¸c tham sè thùc sù. C¬ chÕ nµy rÊt tèt nÕu khi thùc hiÖn hµm trong ch¬ng tr×nh kh«ng cÇn lµm thay ®æi gi¸ trÞ cña biÕn gèc. Tuy nhiªn, nhiÒu khi ta l¹i muèn nh÷ng tham sè ®ã thay ®æi khi thùc hiÖn hµm trong ch¬ng tr×nh. C++ cung cÊp thªm c¸ch truyÒn d÷ liÖu cho hµm theo tham chiÕu b»ng c¸ch dïng ®èi lµ tham chiÕu. C¸ch lµm nµy cã u diÓm lµ kh«ng cÇn t¹o ra c¸c b¶n sao cña c¸c tham sè, do dã tiÕt kiÖm bé nhí vµ thêi gian ch¹y m¸y. MÆt kh¸c, hµm nµy sÏ thao t¸c trùc tiÕp trªn vïng nhí cña c¸c tham sè, do ®ã dÔ dµng thay ®æi gi¸ trÞ c¸c tham sè khi cÇn. VÝ dô 2.7 Ch¬ng tr×nh sau sÏ nhËp d·y sè thùc, s¾p xÕp d·y theo thø tù t¨ng dÇn vµ hiÓn thÞ ra mµn h×nh. #include <iostream.h> #include <conio.h> #include <stdio.h> void nhapds(double *a,int n) { 15
  • 16. for(int i=0;i<n;++i) { cout<<"n Phan tu thu "<<i<<":"; cin>>a[i]; } } void hv(double &x,double &y) { double tam=x;x=y;y=tam; } void sapxep(double *a,int n) { for(int i=0;i<n-1;++i) for(int j=i+1;j<n;++j) if(a[i]>a[j]) hv(a[i],a[j]); } void main() { double x[100]; int i,n; clrscr(); cout<<"n nhap so phan tu N = "; cin>>n; nhapds(x,n); sapxep(x,n); cout<<"nCac phan tu mang sau khi sap xep :"; for(i=0;i<n;++i) printf("n%6.2f",x[i]); getch(); } VÝ dô 2.8 Ch¬ng tr×nh sÏ nhËp d÷ liÖu mét danh s¸ch thÝ sinh bao gåm hä tªn, ®iÓm c¸c m«n 1, m«n 2, m«n 3 vµ in danh s¸ch thÝ sinh: #include <iostream.h> #include <conio.h> #include <stdio.h> #include <iomanip.h> struct TS { char ht[20]; float d1,d2,d3,td; }; void ints(const TS &ts) { 16
  • 17. cout<<setiosflags(ios::showpoint)<<setprecision(1); cout<<"n ho ten"<<setw(20)<<ts.ht<<setw(6)<<ts.td; } void nhapsl(TS *ts,int n) { for(int i=0;i<n;++i) { cout<<"n Thi sinh"<<i; cout<<"n ho ten "; cin.ignore(1); cin.get(ts[i].ht,25); cout<<"Nhap diem cac mon thi : "; cin>>ts[i].d1>>ts[i].d2>>ts[i].d3; ts[i].td=ts[i].d1+ts[i].d2+ts[i].d3; } } void hvts(TS &ts1,TS &ts2) { TS tg=ts1; ts1=ts2; ts2=tg; } void sapxep(TS *ts,int n) { for(int i=0;i<n-1;++i) for(int j=i+1;j<n;++j) if(ts[i].td<ts[j].td) hvts(ts[i],ts[j]) ; } void main() { TS ts[100]; int n,i; clrscr(); cout<<"So thi sinh : "; cin>>n; nhapsl(ts,n); sapxep(ts,n); float dc; cout<<"nnDanh sach thi sinh n"; for(i=0;i<n;++i) if(ts[i].td>=dc) ints(ts[i]); 17
  • 18. else break; getch(); } VÝ dô 2.9 Ch¬ng tr×nh sau sÏ nhËp mét m¶ng thùc kÝch thíc 20x20, in m¶ng ®· nhËp vµ in c¸c phÇn tö lín nhÊt vµ nhá nhÊt trªn mçi hµng cña m¶ng. #include <iostream.h> #include <conio.h> #include <stdio.h> #include <iomanip.h> void nhapmt(float a[20][20],int m,int n) { for(int i=0;i<m;++i) for(int j=0;j<n;++j) { cout<<"n a["<<i<<","<<j<<"]="; cin>> a[i][j]; } } void inmt(float a[20][20],int m,int n) { cout<<setiosflags(ios::showpoint)<<setprecision(1); cout<<"nMang da nhap : "; for(int i=0;i<m;++i) for(int j=0;j<n;++j) { if(j==0) cout<<"n"; cout<<setw(6)<<a[i][j]; } } void maxminds(float *x,int n,int &vtmax,int &vtmin) { vtmax=vtmin=0; for(int i=1;i<n;++i) { if(x[i]>x[vtmax]) vtmax=i; if(x[i]<x[vtmin]) vtmin=i; } } void main() { float a[20][20]; int m,n; clrscr(); 18
  • 19. cout<<"n Nhap so hang va so cot : "; cin>>m>>n; nhapmt(a,m,n); inmt(a,m,n); float *p=(float*) a; int vtmax,vtmin; for(int i=0;i<m;++i) { p=((float*)a)+i*20; maxminds(p,n,vtmax,vtmin); printf("n Hang %d phan tu max=%6.1f tai cot %d",i,p[vtmax],vtmax); printf("n Phan tu min=%6.1f tai cot %d",p[vtmin],vtmin); } getch(); } 2.8. Hµm tr¶ vÒ gi¸ trÞ tham chiÕu C++ cho phÐp hµm tr¶ vÒ gi¸ trÞ lµ mét tham chiÕu, lóc nµy ®Þnh nghÜa cña hµm cã d¹ng nh sau : KiÓu &Tªn hµm(...) { //th©n hµm return <biÕn ph¹m vi toµn côc>; } Trong trêng hîp nµy biÓu thøc ®îc tr¶ l¹i trong c©u lÖnh return ph¶i lµ tªn cña mét biÕn x¸c ®Þnh tõ bªn ngoµi hµm, bëi v× khi ®ã míi cã thÓ sö dông ®îc gi¸ trÞ cña hµm. Khi ta tr¶ vÒ mét tham chiÕu ®Õn mét biÕn côc bé khai b¸o bªn trong hµm, biÕn côc bé nµy sÏ bÞ mÊt ®i khi kÕt thóc thùc hiÖn hµm. Do vËy tham chiÕu cña hµm sÏ kh«ng cßn ý nghÜa n÷a. Khi gi¸ trÞ tr¶ vÒ cña hµm lµ tham chiÕu, ta cã thÓ gÆp c¸c c©u lÖnh g¸n h¬i kh¸c thêng, trong ®ã vÕ tr¸i lµ mét lêi gäi hµm chø kh«ng ph¶i lµ tªn cña mét biÕn. §iÒu nµy hoµn toµn hîp lý, bëi v× b¶n th©n hµm ®ã cã gi¸ trÞ tr¶ vÒ lµ mét tham chiÕu. Nãi c¸ch kh¸c, vÕ tr¸i cña lÖnh g¸n cã thÓ lµ lêi gäi ®Õn mét hµm cã gi¸ trÞ tr¶ vÒ lµ mét tham chiÕu.Xem c¸c vÝ dô sau: VÝ dô 2.10 #include <iostream.h> #include <conio.h> int z; int &f()// ham tra ve mot bi danh cua bien toan bo z { return z; } void main() { f()=50;//z=50 19
  • 20. cout<<"nz="<<z; getch(); } VÝ dô 2.11 #include <iostreams.h> #include <stdio.h> #include <string.h> #include <conio.h> int & max(int& a, int& b); void main() { clrscr(); int b =10, a= 7, c= 20; cout << "Max a,b : "<<max(b,a) << endl; max(b,a)++; cout << "Gia tri b va a :"<< b <<" "<<a <<endl; max(b,c)=5; cout << "Gia tri b va a va c :"<<b<<" "<<a <<" "<<c<< endl; } int &max(int &a, int &b) { return a>b ? a:b; } KÕt qu¶ trªn mµn h×nh sÏ lµ : Max a,b : 10 Gia tri cua b va a : 11 7 Gia tri cua b va a va c : 11 7 5 2.9. Hµm víi tham sè cã gi¸ trÞ mÆc ®Þnh C++ cho phÐp x©y dùng hµm víi c¸c tham sè ®îc khëi g¸n gi¸ trÞ mÆc ®Þnh. Quy t¾c x©y dùng hµm víi tham sè mÆc ®Þnh nh sau: • C¸c ®èi cã gi¸ trÞ mÆc ®Þnh cÇn lµ c¸c tham sè cuèi cïng tÝnh tõ tr¸i qua ph¶i. • NÕu ch¬ng tr×nh sö dông khai b¸o nguyªn mÉu hµm th× c¸c tham sè mÆc ®Þnh cÇn ®îc khëi g¸n trong nguyªn mÉu hµm, kh«ng ®îc khëi g¸n khëi g¸n l¹i cho c¸c ®èi mÆc ®Þnh trong dßng ®Çu cña ®Þnh nghÜa hµm. void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234); void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234) { //C¸c c©u lÖnh } • Khi x©y dùng hµm, nÕu kh«ng khai b¸o nguyªn mÉu, th× c¸c ®èi mÆc ®Þnh ®îc khëi g¸n trong dßng ®Çu cña ®Þnh nghÜa hµm, vÝ dô: void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234) { 20
  • 21. //C¸c c©u lÖnh } Chó ý: §èi víi c¸c hµm cã tham sè mÆc ®Þnh th× lêi gäi hµm cÇn viÕt theo quy ®Þnh: C¸c tham sè v¾ng mÆt trong lêi gäi hµm t¬ng øng víi c¸c tham sè mÆc ®Þnh cuèi cïng (tÝnh tõ tr¸i sang ph¶i), vÝ dô víi hµm: void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234); th× c¸c lêi gäi hµm ®óng: f(3,3.4,”TIN HOC”,10,1.0);//§Çy ®ñ tham sè f(3,3.4,”ABC”); //ThiÕu 2 tham sè cuèi f(3,3.4); //ThiÕu 3 tham sè cuèi C¸c lêi gäi hµm sai: f(3); f(3,3.4, ,10); VÝ dô 2.12 #include <iostream.h> #include <conio.h> void ht(char *dc="TRUNG TAM",int n=5); void ht(char *dc,int n) { for(int i=0;i<n;++i) cout<<"n" <<dc; } void main() { ht();// in dong chu "TRUNG TAM"tren 5 dong ht("ABC",3);// in dong chu "ABC"tren 3 dong ht("DEF");// in dong chu "DEF"tren 5 dong getch(); } 2.10. C¸c hµm néi tuyÕn (inline) ViÖc tæ chøc ch¬ng tr×nh thµnh c¸c hµm cã u ®iÓm ch¬ng tr×nh ®îc chia thµnh c¸c ®¬n vÞ ®éc lËp, ®iÒu nµy gi¶m ®îc kÝch thíc ch¬ng tr×nh, v× mçi ®o¹n chong tr×nh thùc hiÖn nhiÖm vô cña hµm ®îc thay b»ng lêi gäi hµm. Tuy nhiªn hµm còng cã nhîc ®iÓm lµ lµm lµ chËm tèc ®é thùc hiÖn ch¬ng tr×nh v× ph¶i thùc hiÖn mét sè thao t¸c cã tÝnh thñ tôc mçi khi gäi hµm nh: cÊp ph¸t vïng nhí cho c¸c tham sè vµ biÕn côc bé, truyÒn d÷ liÖu cña c¸c tham sè cho c¸c ®èi, gi¶i phãng vïng nhí tríc khi tho¸t khái hµm. C++ cho kh¶ n¨ng kh¾c phôc ®îc nhîc ®iÓm nãi trªn b»ng c¸ch dïng hµm néi tuyÕn. §Ó biÕn mét hµm thµnh hµm néi tuyÕn ta viÕt thªm tõ khãa inline vµo tríc khai b¸o nguyªn mÉu hµm. Chó ý: Trong mäi trêng hîp, tõ khãa inline ph¶i xuÊt hiÖn tríc c¸c lêi gäi hµm th× tr×nh biªn dÞch míi biÕt cÇn xö lý hµm theo kiÓu inline. VÝ dô hµm f() trong ch¬ng tr×nh sau sÏ kh«ng ph¶i lµ hµm néi tuyÕn v× inline viÕt sau lêi gäi hµm. VÝ dô 2.13 21
  • 22. #include <iostream.h> #include <conio.h> void main() { int s ; s=f(5,6); cout<<s; getch(); } inline int f(int a,int b) { return a*b; } Chó ý:  Ch¬ng tr×nh dÞch c¸c hµm inline nh t¬ng tù nh c¸c macro, nghÜa lµ nã sÏ thay ®æi lêi gäi hµm b»ng mét ®o¹n ch¬ng tr×nh thùc hiÖn nhiÖm vô hµm. C¸ch lµm nµy sÏ t¨ng tèc ®é ch¬ng tr×nh do kh«ng ph¶i thùc hiÖn c¸c thao t¸c cã tÝnh thñ tôc khi gäi hµm nhng l¹i lµm t¨ng khèi lîng bé nhí ch¬ng tr×nh (nhÊt lµ ®èi víi c¸c hµm néi tuyÕn cã nhiÒu c©u lÖnh). V× vËy chØ nªn dïng hµm inline ®èi víi c¸c hµm cã néi dung ®¬n gi¶n.  Kh«ng ph¶i khi gÆp tõ kho¸ inline lµ ch¬ng tr×nh dÞch nhÊt thiÕt ph¶i xö lý hµm theo kiÓu néi tuyÕn. Tõ kho¸ inline chØ lµ mét tõ kho¸ gîi ý cho ch¬ng tr×nh dÞch chø kh«ng ph¶i lµ mét mÖnh lÖnh b¾t buéc. VÝ dô 2.14 Chong tr×nh sau sö dông hµm inline ®Ó tÝnh chu vi vµ diÖn tÝch h×nh ch÷ nhËt. #include <iostream.h> #include <conio.h> inline void dtcvhcn(int a,int b,int &dt,int &cv) { dt=a*b; cv=2*(a+b); } void main() { int a[20],b[20],cv[20],dt[20],n; cout<<"n So hinh chu nhat"; cin>>n; for(int i=0;i<n;++i) { cout<<"n Nhap 2 canh cua hinh chu nhat"<<i<<":"; cin>>a[i]>>b[i]; dtcvhcn(a[i],b[i],dt[i],cv[i]); } clrscr(); for(i=0;i<n;++i) 22
  • 23. { cout<<"n Hinh chu nhat thu "<<i+1<<":"; cout<<"n Do dai hai canh "<<a[i]<<"va"<<b[i]; cout<<"n dien tich "<<dt[i]; cout<<"n chu vi "<<cv[i]; } getch(); } VÝ dô 2.15 Mét c¸ch viÕt kh¸c cña ch¬ng tr×nh trong vÝ dô 2.14 #include <iostream.h> #include <conio.h> inline void dtcvhcn(int a,int b,int &dt,int &cv); void main() { int a[20],b[20],cv[20],dt[20],n; cout<<"n So hinh chu nhat"; cin>>n; for(int i=0;i<n;++i) { cout<<"n Nhap 2 canh cua hinh chu nhat"<<i<<":"; cin>>a[i]>>b[i]; dtcvhcn(a[i],b[i],dt[i],cv[i]); } clrscr(); for(i=0;i<n;++i) { cout<<"n Hinh chu nhat thu "<<i+1<<":"; cout<<"n Do dai hai canh "<<a[i]<<"va"<<b[i]; cout<<"n dien tich "<<dt[i]; cout<<"n chu vi "<<cv[i]; } getch(); } void dtcvhcn(int a,int b,int &dt ,int &cv) { dt=a*b; cv=2*(a+b); } 2.11. Hµm t¶i béi C¸c hµm t¶i béi lµ c¸c hµm cã cïng mét tªn vµ cã tËp ®èi kh¸c nhau (vÒ sè lîng c¸c ®èi hoÆc kiÓu). Khi gÆp lêi gäi c¸c hµm t¶i béi th× tr×nh biªn dÞch sÏ c¨n cø vµo sè l- îng vµ kiÓu c¸c tham sè ®Ó gäi hµm cã ®óng tªn vµ ®óng c¸c tham sè t¬ng øng. VÝ dô 2.16 Ch¬ng tr×nh t×m max cña mét d·y sè nguyªn vµ max cña mét dÉy sè thùc. Trong ch¬ng tr×nh cã 6 hµm: hai hµm dïng ®Ó nhËp d·y sè nguyªn vµ d·y sè thùc cã 23
  • 24. tªn chung lµ nhapds, bèn hµm: tÝnh max 2 sè nguyªn, tÝnh max 2 sè thùc, tÝnh max cña dÉy sè nguyªn, tÝnh max cña dÉy sè thùc ®îc ®Æt chung mét tªn lµ max. #include <iostream.h> #include <conio.h> #include <iomanip.h> void nhapds(int *x,int n); void nhapds(double *x,int n); int max(int x,int y); double max(double x,double y); void nhapds(int *x,int n) { for(int i=0;i<n;++i) { cout<<"Phan tu "<<i<<" = "; cin>>x[i]; } } void nhapds(double *x,int n) { for (int i=0;i<n;i++) { cout<<"Phan tu "<<i<<" = "; cin>>x[i]; } } int max(int x,int y) { return x>y?x:y; } double max(double x,double y) { return x>y?x:y; } int max(int *x,int n) { int s=x[0]; for(int i=1;i<n;++i) s=max(s,x[i]); return s; } double max(double *x,int n) { double s=x[0]; for(int i=1;i<n;++i) 24
  • 25. s=max(s,x[i]); return s; } void main() { int a[20],n,ni,nd,maxi; double x[20],maxd; clrscr(); cout<<"n So phan tu nguyen n: "; cin>>ni; cout<<"n Nhap day so nguyen: "; nhapds(a,ni); cout<<"n So phan tu so thuc: "; cin>>nd; cout<<"n Nhap day so thuc: "; nhapds(x,nd); maxi=max(a,ni); maxd=max(x,nd); cout<<"n Max day so nguyen ="<<maxi; cout<<"n Max day so thuc="<<maxd; getch(); } Chó ý: NÕu hai hµm trïng tªn vµ trïng ®èi th× tr×nh biªn dÞch kh«ng thÓ ph©n biÖt ®îc. Ngay c¶ khi hai hµm nµy cã cïng kiÓu kh¸c nhau th× tr×nh biªn dÞch vÉn b¸o lçi. VÝ dô sau x©y dùng hai hµm cïng cã tªn lµ f vµ cïng mét ®èi nguyªn a, nhng kiÓu hµm kh¸c nhau. Hµm thø nhÊt cã kiÓu nguyªn( tr¶ vÒ a*a), hµm thø hai cã kiÓu void. Ch¬ng tr×nh sau sÏ bÞ th«ng b¸o lçi khi biªn dÞch. VÝ dô 2.17 #include <iostream.h> #include <conio.h> int f(int a); void f(int a); int f(int a) { return a*a; } void f(int a) { cout<<"n"<<a; } void main() { int b = f(5); f(b); 25
  • 27. Bµi tËp 1. ViÕt ch¬ng tr×nh thùc hiÖn c¸c yªu cÇu sau ®©y: - NhËp d÷ liÖu cho c¸c sinh viªn (dïng cÊu tróc danh s¸ch liªn kÕt ®¬n), c¸c th«ng tin cña sinh viªn bao gåm: m· sinh viªn, hä tªn, líp, ®iÓm trung b×nh. - Ch¬ng tr×nh cã sö dông to¸n tö new vµ delete. - In ra danh s¸ch sinh viªn cã s¾p xÕp vÞ thø theo ®iÓm trung b×nh. 2. ViÕt ch¬ng tr×nh ®Ó s¾p xÕp mét m¶ng thùc hai chiÒu theo thø tù t¨ng dÇn, trong ch¬ng tr×nh cã cã sö dông to¸n tö new vµ delete. 3. ViÕt c¸c hµm t¶i béi ®Ó tÝnh diÖn tÝch tam gi¸c, diÖn tÝch h×nh ch÷ nhËt, diÖn tÝch h×nh trßn. 4. ViÕt ch¬ng tr×nh nh©n hai ma trËn Amxn vµ Bnxp , mçi ma tr©n ®îc cÊp ph¸t ®éng vµ c¸c gi¸ trÞ cña chóng ph¸t sinh ngÉu nhiªn. 27
  • 28. CH¬NG 3 LíP Ch¬ng nµy tr×nh bµy nh÷ng vÊn ®Ò sau ®©y:  §Þnh nghÜa líp  T¹o lËp ®èi tîng  Truy nhËp ®Õn c¸c thµnh phÇn cña líp  Con trá ®èi tîng  Con trá this  Hµm b¹n  D÷ liÖu thµnh phÇn tÜnh, hµm thµnh phÇn tÜnh  Hµm t¹o, hµm hñy  Hµm t¹o sao chÐp Líp lµ kh¸i niÖm trung t©m cña lËp tr×nh híng ®èi tîng, nã lµ sù më réng cña c¸c kh¸i niÖm cÊu tróc (struct) cña C. Ngoµi c¸c thµnh phÇn d÷ liÖu, líp cßn chøa c¸c thµnh phÇn hµm, cßn gäi lµ ph¬ng thøc (method) hoÆc hµm thµnh viªn (member function). Líp cã thÓ xem nh mét kiÓu d÷ liÖu c¸c biÕn, m¶ng ®èi tîng. Tõ mét líp ®· ®Þnh nghÜa, cã thÓ t¹o ra nhiÒu ®èi tîng kh¸c nhau, mçi ®èi tîng cã vïng nhí riªng. Ch¬ng nµy sÏ tr×nh bµy c¸ch ®Þnh nghÜa líp, c¸ch x©y dùng ph¬ng thøc, gi¶i thÝch vÒ ph¹m vi truy nhËp, sö dông c¸c thµnh phÇn cña líp, c¸ch khai b¸o biÕn, m¶ng cÊu tróc, lêi gäi tíi c¸c ph¬ng thøc . 3.1. §Þnh nghÜa líp Có ph¸p: Líp ®îc ®Þnh nghÜa theo mÉu : class tªn_líp { private: [Khai b¸o c¸c thuéc tÝnh] [§Þnh nghÜa c¸c hµm thµnh phÇn (ph¬ng thøc)] public : [Khai b¸o c¸c thuéc tÝnh] [§Þnh nghÜa c¸c hµm thµnh phÇn (ph¬ng thøc)] } ; Thuéc tÝnh cña líp ®îc gäi lµ d÷ liÖu thµnh phÇn vµ hµm ®îc gäi lµ ph¬ng thøc hoÆc hµm thµnh viªn. Thuéc tÝnh vµ hµm ®îc gäi chung lµ c¸c thµnh phÇn cña líp. C¸c thµnh phÇn cña líp ®îc tæ chøc thµnh hai vïng: vïng së h÷u riªng (private) vµ vïng dïng chung (public) ®Ó quy ®Þnh ph¹m vi sö dông cña c¸c thµnh phÇn. NÕu kh«ng quy ®Þnh cô thÓ (kh«ng dïng c¸c tõ khãa private vµ public) th× C++ hiÓu ®ã lµ private. C¸c thµnh phÇn private chØ ®îc sö dông bªn trong líp (trong th©n cña c¸c hµm thµnh phÇn). C¸c thµnh phÇn public ®îc phÐp sö dông ë c¶ bªn trong vµ bªn ngoµi líp. C¸c hµm kh«ng ph¶i lµ hµm thµnh phÇn cña líp th× kh«ng ®îc phÐp sö dông c¸c thµnh phÇn nµy. Khai b¸o c¸c thuéc tÝnh cña líp: ®îc thùc hiÖn y nh viÖc khai b¸o biÕn. Thuéc tÝnh cña líp kh«ng thÓ cã kiÓu chÝnh cña líp ®ã, nhng cã thÓ lµ kiÓu con trá cña líp nµy, VÝ dô: class A { A x; //Kh«ng cho phÐp, v× x cã kiÓu líp A 28
  • 29. A *p ; // Cho phÐp, v× p lµ con trá kiÓu líp A } ; §Þnh nghÜa c¸c hµm thµnh phÇn: C¸c hµm thµnh phÇn cã thÓ ®îc x©y dùng bªn ngoµi hoÆc bªn trong ®Þnh nghÜa líp. Th«ng thêng, c¸c hµm thµnh phÇn ®¬n gi¶n, cã Ýt dßng lÖnh sÏ ®îc viÕt bªn trong ®Þnh nghÜa líp, cßn c¸c hµm thµnh phÇn dµi th× viÕt bªn ngoµi ®Þnh nghÜa líp. C¸c hµm thµnh phÇn viÕt bªn trong ®Þnh nghÜa líp ®- îc viÕt nh hµm th«ng thêng. Khi ®Þnh nghÜa hµm thµnh phÇn ë bªn ngoµi líp, ta dïng có ph¸p sau ®©y: KiÓu_tr¶_vÒ_cña_hµm Tªn_líp::Tªn_hµm(khai b¸o c¸c tham sè) { [néi dung hµm] } To¸n tö :: ®îc gäi lµ to¸n tö ph©n gi¶i miÒn x¸c ®Þnh, ®îc dïng ®Ó chØ ra líp mµ hµm ®ã thuéc vµo. Trong th©n hµm thµnh phÇn, cã thÓ sö dông c¸c thuéc tÝnh cña líp, c¸c hµm thµnh phÇn kh¸c vµ c¸c hµm tù do trong ch¬ng tr×nh. Chó ý : • C¸c thµnh phÇn d÷ liÖu khai b¸o lµ private nh»m b¶o ®¶m nguyªn lý che dÊu th«ng tin, b¶o vÖ an toµn d÷ liÖu cña líp, kh«ng cho phÐp c¸c hµm bªn ngoµi x©m nhËp vµo d÷ liÖu cña líp . • C¸c hµm thµnh phÇn khai b¸o lµ public cã thÓ ®îc gäi tíi tõ c¸c hµm thµnh phÇn public kh¸c trong ch¬ng tr×nh . 3.2. T¹o lËp ®èi tîng Sau khi ®Þnh nghÜa líp, ta cã thÓ khai b¸o c¸c biÕn thuéc kiÓu líp. C¸c biÕn nµy ®îc gäi lµ c¸c ®èi tîng. Có ph¸p khai b¸o biÕn ®èi tîng nh sau: Tªn_líp Danh_s¸ch_biÕn ; §èi tîng còng cã thÓ khai b¸o khi ®Þnh nghÜa líp theo có ph¸p sau: class tªn_líp { ... } <Danh_s¸ch_biÕn>; Mçi ®èi tîng sau khi khai b¸o sÏ ®îc cÊp ph¸t mét vïng nhí riªng ®Ó chøa c¸c thuéc tÝnh cña chóng. Kh«ng cã vïng nhí riªng ®Ó chøa c¸c hµm thµnh phÇn cho mçi ®èi t- îng. C¸c hµm thµnh phÇn sÏ ®îc sö dông chung cho tÊt c¶ c¸c ®èi tîng cïng líp. 3.3. Truy nhËp tíi c¸c thµnh phÇn cña líp • §Ó truy nhËp ®Õn d÷ liÖu thµnh phÇn cña líp, ta dïng có ph¸p: Tªn_®èi_tîng. Tªn_thuéc_tÝnh CÇn chó ý r»ng d÷ liÖu thµnh phÇn riªng chØ cã thÓ ®îc truy nhËp bëi nh÷ng hµm thµnh phÇn cña cïng mét líp, ®èi tîng cña líp còng kh«ng thÓ truy nhËp. • §Ó sö dông c¸c hµm thµnh phÇn cña líp, ta dïng có ph¸p: Tªn_®èi_tîng. Tªn_hµm (C¸c_khai_b¸o_tham_sè_thùc_sù) VÝ dô 3.1 #include <conio.h> #include <iostream.h> class DIEM 29
  • 30. { private : int x,y ; public : void nhapsl( ) { cout << "n Nhap hoanh do va tung do cua diem:"; cin >>x>>y ; } void hienthi( ) { cout<<"n x = " <<x<<" y = "<<y<<endl;} } ; void main() { clrscr(); DIEM d1; d1.nhapsl(); d1.hienthi(); getch(); } VÝ dô 3.2 #include <conio.h> #include <iostream.h> class A { int m,n; public : void nhap( ) { cout << "n Nhap hai so nguyen : " ; cin>>m>>n ; } int max() { return m>n?m:n; } void hienthi( ) { cout<<"n Thanh phan du lieu lon nhat x = " <<max()<<endl;} }; void main () { clrscr(); A ob; ob.nhap(); ob.hienthi(); getch(); 30
  • 31. } Chó ý: C¸c hµm tù do cã thÓ cã c¸c ®èi lµ ®èi tîng nhng trong th©n hµm kh«ng thÓ truy nhËp ®Õn c¸c thuéc tÝnh cña líp. VÝ dô gi¶ sö ®· ®Þnh nghÜa líp : class DIEM { private : double x,y ; // toa do cua diem public : void nhapsl() { cout << “ Toa do x,y : “ ; cin >> x>>y ; } void in() { cout << “x =””<<x<<”y=”<<y ; } } ; Dïng líp DIEM, ta x©y dùng hµm tù do tÝnh ®é ®µi cña ®o¹n th¼ng ®i qua hai ®iÓm nh sau : double do_dai ( DIEM d1, DIEM d2 ) { return sqrt(pow(d1.x-d2.x,2) + pow(d1.y-d2.y,2)); } Ch¬ng tr×nh dÞch sÏ b¸o b¸o lçi ®èi víi hµm nµy. Bëi v× trong th©n hµm kh«ng cho phÐp sö dông c¸c thuéc tÝnh d1.x,d2.x,d1.y cña c¸c ®èi tîng d1 vµ d2 thuéc líp DIEM . VÝ dô 3.3 VÝ dô sau minh häa viÖc sö dông hµm thµnh phÇn víi tham sè mÆc ®Þnh: #include <iostream.h> #include <conio.h> class Box { private: int dai; int rong; int cao; public: int get_thetich(int lth,int wdth = 2,int ht = 3); }; int Box::get_thetich(int l, int w, int h) { dai = l; rong = w; cao = h; cout<< dai<<'t'<< rong<<'t'<<cao<<'t'; return dai * rong * cao; } 31
  • 32. void main() { Box ob; int x = 10, y = 12, z = 15; cout <<"Dai Rong Cao Thetichn"; cout << ob.get_thetich(x, y, z) << "n"; cout << ob.get_thetich(x, y) << "n"; cout << ob.get_thetich(x) << "n"; cout << ob.get_thetich(x, 7) << "n"; cout << ob.get_thetich(5, 5, 5) << "n"; getch(); } KÕt qu¶ ch¬ng tr×nh nh sau: Dai Rong Cao Thetich 10 12 15 1800 10 12 3 360 10 2 3 60 10 7 3 210 5 5 5 125 VÝ dô 3.4 VÝ dô sau minh häa viÖc sö dông hµm inline trong líp: #include <iostream.h> #include <string.h> #include <conio.h> class phrase { private: char dongtu[10]; char danhtu[10]; char cumtu[25]; public: phrase(); inline void set_danhtu(char* in_danhtu); inline void set_dongtu(char* in_dongtu); inline char* get_phrase(void); }; void phrase::phrase() { strcpy(danhtu,""); strcpy(dongtu,""); strcpy(cumtu,""); } inline void phrase::set_danhtu(char* in_danhtu) { strcpy(danhtu, in_danhtu); } inline void phrase::set_dongtu(char* in_dongtu) { 32
  • 33. strcpy(dongtu, in_dongtu); } inline char* phrase::get_phrase(void) { strcpy(cumtu,dongtu); strcat(cumtu," the "); strcat(cumtu,danhtu); return cumtu; } void main() { phrase text; cout << "Cum tu la : -> " << text.get_phrase() << "n"; text.set_danhtu("file"); cout << "Cum tu la : -> " << text.get_phrase()<<"n"; text.set_dongtu("Save"); cout << "Cum tu la : -> " << text.get_phrase()<<"n"; text.set_danhtu("program"); cout << "Cum tu la : -> " << text.get_phrase()<<"n"; } KÕt qu¶ ch¬ng tr×nh nh sau: Cum tu la : -> the Cum tu la : -> the file Cum tu la : -> Save the file Cum tu la : -> Save the program VÝ dô 3.5 VÝ dô sau minh häa viÖc sö dông tõ khãa const trong líp: #include <iostream.h> #include <conio.h> class constants { private: int number; public: void print_it(const int data_value); }; void constants::print_it(const int data_value) { number = data_value; cout << number << "n"; } void main() { constants num; const int START = 3; 33
  • 34. const int STOP = 6; int index; for (index=START; index<=STOP; index++) { cout<< "index = " ; num.print_it(index); cout<< "START = " ; num.print_it(START); } getch(); } KÕt qu¶ ch¬ng tr×nh nh sau: index = 3 START = 3 index = 4 START = 3 index = 5 START = 3 index = 6 START = 3 3.4. Con trá ®èi tîng Con trá ®èi tîng dïng ®Ó chøa ®Þa chØ cña biÕn ®èi tîng, ®îc khai b¸o nh sau : Tªn_líp * Tªn_con_ trá ; VÝ dô : Dïng líp DIEM, ta cã thÓ khai b¸o: DIEM *p1, *p2, *p3 ; // Khai b¸o 3 con trá p1, p2, p3 DIEM d1, d2 ; //Khai b¸o hai ®èi tîng d1, d2 DIEM d [20] ; // Khai b¸o m¶ng ®èi tîng Cã thÓ thùc hiÖn c©u lÖnh : p1 = &d2 ; //p1 chøa ®Þa chØ cña d2, p1 trá tíi d2 p2 =d ; // p2 trá tíi ®Çu m¶ng d p3 =new DIEM //t¹o mét ®èi tîng vµ chøa ®Þa chØ cña nã vµo p3 §Ó truy xuÊt c¸c thµnh phÇn cña líp tõ con trá ®èi tîng, ta viÕt nh sau : Tªn_con_trá -> Tªn_thuéc_tÝnh Tªn_con_trá -> Tªn_hµm(c¸c tham sè thùc sù) NÕu con trá chøa ®Çu ®Þa chØ cña m¶ng, cã thÓ dïng con trá nh tªn m¶ng. VÝ dô 3.6 #include <iostream.h> #include <conio.h> class mhang { int maso; float gia; public: void getdata(int a, float b) {maso= a; gia= b;} void show() { cout << "maso" << maso<< endl; cout << "gia" << gia<< endl; 34
  • 35. } }; const int k=5; void main() { clrscr(); mhang *p = new mhang[k]; mhang *d = p; int x,i; float y; cout<<"nNhap vao du lieu 5 mat hang :"; for (i = 0; i <k; i++) { cout <<"nNhap ma hang va don gia cho mat hang thu " <<i+1; cin>>x>>y; p -> getdata(x,y); p++;} for (i = 0; i <k; i++) { cout <<"nMat hang thu : " << i + 1 << endl; d -> show(); d++; } getch(); } 3.5. Con trá this Mçi hµm thµnh phÇn cña líp cã mét tham sè Èn, ®ã lµ con trá this. Con trá this trá ®Õn tõng ®èi tîng cô thÓ. Ta h·y xem l¹i hµm nhapsl() cña líp DIEM trong vÝ dô ë trªn: void nhapsl( ) { cout << "n Nhap hoanh do va tung do cua diem : "; cin >>x>>y; } Trong hµm nµy ta sö dông tªn c¸c thuéc tÝnh x,y mét c¸ch ®¬n ®éc. §iÒu nµy d- êng nh m©u thuÈn víi quy t¾c sö dông thuéc tÝnh. Tuy nhiªn nã ®îc lý gi¶i nh sau: C++ sö dông mét con trá ®Æc biÖt trong c¸c hµm thµnh phÇn. C¸c thuéc tÝnh viÕt trong hµm thµnh phÇn ®îc hiÓu lµ thuéc mét ®èi tîng do con trá this trá tíi. Nh vËy hµm nhapsl() cã thÓ viÕt mét c¸ch têng minh nh sau: void nhapsl( ) { cout << "n Nhap hoanh do va tung do cua diem:" ; cin >>this->x>>this->y ; } Con trá this lµ ®èi thø nhÊt cña hµm thµnh phÇn. Khi mét lêi gäi hµm thµnh phÇn ®îc ph¸t ra bëi mét ®èi tîng th× tham sè truyÒn cho con trá this chÝnh lµ ®Þa chØ cña ®èi tîng ®ã. 35
  • 36. VÝ dô: XÐt mét lêi gäi tíi hµm nhapsl() : DIEM d1 ; d1.nhapsl(); Trong trêng hîp nµy cña d1 th× this =&d1. Do ®ã this -> x chÝnh lµ d1.x vµ this-> y chÝnh lµ d1.y Chó ý: Ngoµi tham sè ®Æc biÖt this kh«ng xuÊt hiÖn mét c¸ch têng minh, hµm thµnh phÇn líp cã thÓ cã c¸c tham«1 kh¸c ®îc khai b¸o nh trong c¸c hµm th«ng thêng. VÝ dô 3.7 #include <iostream.h> #include <conio.h> class time { int h,m; public : void nhap(int h1, int m1) { h= h1; m = m1;} void hienthi(void) { cout <<h << " gio "<<m << " phut"<<endl;} void tong(time, time); }; void time::tong(time t1, time t2) { m= t1.m+ t2.m; //this->m = t1.m+ t2.m; h= m/60; //this->h = this->m/60; m= m%60; //this->m = this->m%60; h = h+t1.h+t2.h; //this->h = this->h + t1.h+t2.h; } void main() { clrscr(); time ob1, ob2,ob3; ob1.nhap(2,45); ob2.nhap(5,40); ob3.tong(ob1,ob2); cout <<"object 1 = "; ob1.hienthi(); cout <<"object 2 = "; ob2. hienthi(); cout <<"object 3 = "; ob3. hienthi(); getch(); } Ch¬ng tr×nh cho kÕt qu¶ nh sau : object 1 = 2 gio 45 phut object 2 = 5 gio 40 phut object 3 = 8 gio 25 phut 36
  • 37. 3.6. Hµm b¹n Trong thùc tÕ thêng x·y ra trêng hîp cã mét sè líp cÇn sö dông chung mét hµm. C++ gi¶i quyÕt vÊn ®Ò nµy b»ng c¸ch dïng hµm b¹n. §Ó mét hµm trë thµnh b¹n cña mét líp, cã 2 c¸ch viÕt: C¸ch 1: Dïng tõ khãa friend ®Ó khai b¸o hµm trong líp vµ x©y dùng hµm bªn ngoµi nh c¸c hµm th«ng thêng (kh«ng dïng tõ khãa friend). MÉu viÕt nh sau : class A { private : // Khai b¸o c¸c thuéc tÝnh public : ... // Khai b¸o c¸c hµm b¹n cña líp A friend void f1 (...) ; friend double f2 (...) ; ... } ; // X©y dùng c¸c hµm f1,f2,f3 void f1 (...) { ... } double f2 (...) { ... } C¸ch 2: Dïng tõ khãa friend ®Ó x©y dùng hµm trong ®Þnh nghÜa líp . MÉu viÕt nh sau : class A { private : // Khai b¸o c¸c thuéc tÝnh public : ... // Khai b¸o c¸c hµm b¹n cña líp A void f1 (...) { ... } double f2 (...) { ... } 37
  • 38. } ; Hµm b¹n cã nh÷ng tÝnh chÊt sau: - Hµm b¹n kh«ng ph¶i lµ hµm thµnh phÇn cña líp. - ViÖc truy nhËp tíi hµm b¹n ®îc thùc hiÖn nh hµm th«ng thêng. - Trong th©n hµm b¹n cña mét líp cã thÓ truy nhËp tíi c¸c thuéc tÝnh cña ®èi tîng thuéc líp nµy. §©y lµ sù kh¸c nhau duy nhÊt gi÷a hµm b¹n vµ hµm th«ng thêng. - Mét hµm cã thÓ lµ b¹n cña nhiÒu líp. Lóc ®ã nã cã quyÒn truy nhËp tíi tÊt c¶ c¸c thuéc tÝnh cña c¸c ®èi tîng trong c¸c líp nµy. §Ó lµm cho hµm f trë thµnh b¹n cña c¸c líp A, B vµ C ta sö dông mÈu viÕt sau : class B ; //Khai b¸o tríc líp A class B ; // Khai b¸o tríc líp B class C ; // Khai b¸o tríc líp C // §Þnh nghÜa líp A class A { // Khai b¸o f lµ b¹n cña A friend void f(... ) } ; // §Þnh nghÜa líp B class B { // Khai b¸o f lµ b¹n cña B friend void f(...) } ; // §Þnh nghÜa líp C class C { // Khai b¸o f lµ b¹n cña C friend void f(...) } ; // X©y dùng hµm f void f(...) { ... } ; VÝ dô 3.8 #include <iostream.h> #include <conio.h> class sophuc {float a,b; public : sophuc() {} sophuc(float x, float y) {a=x; b=y;} friend sophuc tong(sophuc,sophuc); 38
  • 39. friend void hienthi(sophuc); }; sophuc tong(sophuc c1,sophuc c2) {sophuc c3; c3.a=c1.a + c2.a ; c3.b=c1.b + c2.b ; return (c3); } void hienthi(sophuc c) {cout<<c.a<<" + "<<c.b<<"i"<<endl; } void main() { clrscr(); sophuc d1 (2.1,3.4); sophuc d2 (1.2,2.3) ; sophuc d3 ; d3 = tong(d1,d2); cout<<"d1= ";hienthi(d1); cout<<"d2= ";hienthi(d2); cout<<"d3= ";hienthi(d3); getch(); } Ch¬ng tr×nh cho kÕt qu¶ nh sau : d1= 2.1 + 3.4i d2= 1.2 + 2.3i d3= 3.3 + 5.7i VÝ dô 3.9 #include <iostream.h> #include <conio.h> class LOP1; class LOP2 { int v2; public: void nhap(int a) { v2=a;} void hienthi(void) { cout<<v2<<"n";} friend void traodoi(LOP1 &, LOP2 &); }; class LOP1 { int v1; public: 39
  • 40. void nhap(int a) { v1=a;} void hienthi(void) { cout<<v1<<"n";} friend void traodoi(LOP1 &, LOP2 &); }; void traodoi(LOP1 &x, LOP2 &y) { int t = x.v1; x.v1 = y.v2; y.v2 = t; } void main() { clrscr(); LOP1 ob1; LOP2 ob2; ob1.nhap(150); ob2.nhap(200); cout << "Gia tri ban dau :" << "n"; ob1.hienthi(); ob2.hienthi(); traodoi(ob1, ob2); //Thuc hien hoan doi cout << "Gia tri sau khi thay doi:" << "n"; ob1.hienthi(); ob2.hienthi(); getch(); } Ch¬ng tr×nh cho kÕt qu¶ nh sau: Gia tri ban dau : 150 200 Gia tri sau khi thay doi: 200 150 3.7. D÷ liÖu thµnh phÇn tÜnh vµ hµm thµnh phÇn tÜnh 3.7.1. D÷ liÖu thµnh phÇn tÜnh D÷ liÖu thµnh phÇn tÜnh ®îc khai b¸o b»ng tõ kho¸ static vµ ®îc cÊp ph¸t mét vïng nhÝ cè ®Þnh, nã tån t¹i ngay c¶ khi líp cha cã mét ®èi tîng nµo c¶. D÷ liÖu thµnh phÇn tÜnh lµ chung cho c¶ líp, nã kh«ng ph¶i lµ riªng cña mçi ®èi tîng, vÝ dô: class A { private: 40
  • 41. static int ts; // Thµnh phÇn tÜnh int x; ... }; A u, v; // Khai b¸o 2 ®èi tîng Gi÷a c¸c thµnh phÇn x vµ ts cã sù kh¸c nhau nh sau: u.x vµ v.x cã 2 vïng nhí kh¸c nhau, trong khi u.ts vµ v.ts chØ lµ mét, chóng cïng biÓu thÞ mét vïng nhí, thµnh phÇn ts tån t¹i ngay khi u vµ v cha khai b¸o. §Ó biÓu thÞ thµnh phÇn tÜnh, ta cã thÓ dïng tªn líp, vÝ dô: A::ts Khai b¸o vµ khëi g¸n gi¸ trÞ cho thµnh phÇn tÜnh: Thµnh phÇn tÜnh sÏ ®îc cÊp ph¸t bé nhí vµ khëi g¸n gi¸ trÞ ®Çu b»ng mét c©u lÖnh khai b¸o ®Æt sau ®Þnh nghÜa líp theo mÉu nh sau: int A::ts; // Khëi g¸n cho ts gi¸ trÞ 0 int A::ts = 1234; // Khëi g¸n cho ts gi¸ trÞ 1234 Chó ý: Khi cha khai b¸o th× thµnh phÇn tÜnh cha tån t¹i. H·y xem ch¬ng tr×nh sau: VÝ dô 3.10 #include <conio.h> #include <iostream.h> class HDBH { private: char *tenhang; double tienban; static int tshd; static double tstienban; public: static void in() { cout <<”n” << tshd; cout <<”n” << tstienban; } }; void main () { HDBH::in(); getch(); } C¸c thµnh phÇn tÜnh tshd vµ tstienban cha khai b¸o, nªn cha tån t¹i. V× vËy c¸c c©u lÖnh in gi¸ trÞ c¸c thµnh phÇn nµy trong hµm in() lµ kh«ng thÓ ®îc. Khi dÞch ch- ¬ng tr×nh, sÏ nhËn ®îc c¸c th«ng b¸o lçi. Cã thÓ söa ch¬ng tr×nh trªn b»ng c¸ch ®a vµo c¸c lÖnh khai b¸o c¸c thµnh phÇn tÜnh tshd vµ tstienban nh sau: VÝ dô 3.11 #include <conio.h> #include <iostream.h> 41
  • 42. class HDBH { private: int shd; char *tenhang; double tienban; static int tshd; static double tstienban; public: static void in() { cout <<”n” <<tshd; cout <<”n” <<tstienban; } }; int HDBH::tshd=5 double HDBH::tstienban=20000.0; void main() { HDBH::in(); getch(); } 3.7.2. Hµm thµnh phÇn tÜnh Hµm thµnh phÇn tÜnh ®îc viÕt theo mét trong hai c¸ch: - Dïng tõ kho¸ static ®Æt tríc ®Þnh nghÜa hµm thµnh phÇn viÕt bªn trong ®Þnh nghÜa líp. - NÕu hµm thµnh phÇn x©y dùng bªn ngoµi ®Þnh nghÜa líp, th× dïng tõ kho¸ static ®Æt tríc khai b¸o hµm thµnh phÇn bªn trong ®Þnh nghÜa líp. Kh«ng cho phÐp dïng tõ kho¸ static ®Æt tríc ®Þnh nghÜa hµm thµnh phÇn viÕt bªn ngoµi ®Þnh nghÜa líp. C¸c ®Æc tÝnh cña hµm thµnh phÇn tÜnh: - Hµm thµnh phÇn tÜnh lµ chung cho toµn bé líp vµ kh«ng lÖ thuéc vµo mét ®èi tîng cô thÓ, nã tån t¹i ngay khi líp cha cã ®èi tîng nµo. - Lêi gäi hµm thµnh phÇn tÜnh nh sau: Tªn líp :: Tªn hµm thµnh phÇn tÜnh(c¸c tham sè thùc sù) - V× hµm thµnh phÇn tÜnh lµ ®éc lËp víi c¸c ®èi tîng, nªn kh«ng thÓ dïng hµm thµnh phÇn tÜnh ®Ó xö lý d÷ liÖu cña c¸c ®èi tîng trong lêi gäi ph¬ng thøc tÜnh. Nãi c¸ch kh¸c kh«ng cho phÐp truy nhËp c¸c thuéc tÝnh (trõ thuéc tÝnh tÜnh) trong th©n hµm thµnh phÇn tÜnh. §o¹n ch¬ng tr×nh sau minh häa ®iÒu nµy: class HDBH { private: int shd; char *tenhang; double tienban; 42
  • 43. static int tshd; static double tstienban; public: static void in() { cout <<”n” << tshd; cout << ”n” << tstienban; cout <<”n”<< tenhang //loi cout <<”n” << tienban; //loi } }; VÝ dô 3.12 #include <iostream.h> #include <conio.h> class A { int m; static int n; //n la bien tinh public: void set_m(void) { m= ++n;} void show_m(void) { cout << "n Doi tuong thu:" << m << endl; } static void show_n(void) { cout << " m = " << n << endl; } }; int A::n=1; //khoi gan gia tri ban dau 1 cho bien tinh n void main() { clrscr(); A t1, t2; t1.set_m(); t2.set_m(); A::show_n(); A t3; t3.set_m(); A::show_n(); t1.show_m(); t2.show_m(); t3.show_m(); 43
  • 44. getch(); } KÕt qu¶ ch¬ng tr×nh trªn lµ: m = 3 m = 4 Doi tuong thu : 2 Doi tuong thu : 3 Doi tuong thu : 4 3.8. Hµm t¹o (constructor) Hµm t¹o lµ mét hµm thµnh phÇn ®Æc biÖt cña líp lµm nhiÖm vô t¹o lËp mét ®èi t- îng míi. Ch¬ng tr×nh dÞch sÏ cÊp ph¸t bé nhí cho ®èi tîng, sau ®ã sÏ gäi ®Õn hµm t¹o. Hµm t¹o sÏ khëi g¸n gi¸ trÞ cho c¸c thuéc tÝnh cña ®èi tîng vµ cã thÓ thùc hiÖn mét sè c«ng viÖc kh¸c nh»m chuÈn bÞ cho ®èi tîng míi. Khi x©y dùng hµm t¹o cÇn lu ý nh÷ng ®Æc tÝnh sau cña hµm t¹o: - Tªn hµm t¹o trïng víi tªn cña líp. - Hµm t¹o kh«ng cã kiÓu tr¶ vÒ. - Hµm t¹o ph¶i ®îc khai b¸o trong vïng public. - Hµm t¹o cã thÓ ®îc x©y dùng bªn trong hoÆc bªn ngoµi ®Þnh nghÜa líp. - Hµm t¹o cã thÓ cã tham sè hoÆc kh«ng cã tham sè. - Trong mét líp cã thÓ cã nhiÒu hµm t¹o (cïng tªn nhng kh¸c c¸c tham sè). VÝ dô 3.13 class DIEM { private: int x,y; public: DIEM() //Ham tao khong tham so { x = y = 0; } DIEM(int x1, int y1) //Ham tao co tham so { x = x1;y=y1; } //Cac thanh phan khac }; Chó ý 1: NÕu líp kh«ng cã hµm t¹o, ch¬ng tr×nh dÞch sÏ cung cÊp mét hµm t¹o mÆc ®Þnh kh«ng ®èi, hµm nµy thùc chÊt kh«ng lµm g× c¶. Nh vËy mét ®èi tîng t¹o ra chØ ®îc cÊp ph¸t bé nhí, cßn c¸c thuéc tÝnh cña nã cha ®îc x¸c ®Þnh. VÝ dô 3.14 #include <conio.h> #inlcule <iostream.h> class DIEM 44
  • 45. { private: int x,y; public: void in() { cout <<”n” << y <<” ” << m; } }; void main() { DIEM d; d.in(); DIEM *p; p= new DIEM [10]; clrscr(); d.in(); for (int i=0;1<10;++i) (p+i)->in(); getch(); } Chó ý 2: • Khi mét ®èi tîng ®îc khai b¸o th× hµm t¹o cña líp t¬ng øng sÏ tù ®éng thùc hiÖn vµ khëi g¸n gi¸ trÞ cho c¸c thuéc tÝnh cña ®èi tîng. Dùa vµo c¸c tham sè trong khai b¸o mµ ch¬ng tr×nh dÞch sÏ biÕt cÇn gäi ®Õn hµm t¹o nµo. • Khi khai b¸o m¶ng ®èi tîng kh«ng cho phÐp dïng c¸c tham sè ®Ó khëi g¸n cho c¸c thuéc tÝnh cña c¸c ®èi tîng m¶ng. • C©u lÖnh khai b¸o mét biÕn ®èi tîng sÏ gäi tíi hµm t¹o mét lÇn. • C©u lÖnh khai b¸o mét m¶ng n ®èi tîng sÏ gäi tíi hµm t¹o mÆc ®Þnh n lÇn. • Víi c¸c hµm cã c¸c tham sè kiÓu líp, th× chóng chØ xem lµ c¸c tham sè h×nh thøc, v× vËy khai b¸o tham sè trong dßng ®Çu cña hµm sÏ kh«ng t¹o ra ®èi tîng míi vµ do ®ã kh«ng gäi tíi c¸c hµm t¹o. VÝ dô 3.15 #include <conio.h> #include <iostream.h> #include <iomanip.h> class DIEM { private: int x,y; public: DIEM() { x = y = 0; 45
  • 46. } DIEM(int x1, int y1) { x = x1; y = y1; } friend void in(DIEM d) { cout <<"n" << d.x <<" " << d.y; } void in() { cout <<"n" << x <<" " << y ; } }; void main() { DIEM d1; DIEM d2(2,3); DIEM *d; d = new DIEM (5,6); clrscr(); in(d1); // Goi ham ban in() d2.in(); // Goi ham thanh phan in() in(*d); // Goi ham ban in() DIEM(2,2).in();// Goi ham thanh phan in() DIEM t[3]; // 3 lan goi ham tao khong doi DIEM *q; // Goi ham tao khong doi int n; cout << "n N = "; cin >> n; q = new DIEM [n+1]; //n+1 lan goi ham tao khong doi for (int i=0;i<=n;++i) q[i]=DIEM (3+i,4+i);//n+1 lan goi ham tao co doi for (i=0;i<=n;++i) q[i].in(); // Goi ham thanh phan in() for (i=0;i<=n;++i) DIEM(5+i,6+i).in(); //Goi ham thanh phan in() getch(); } Chó ý 3: NÕu trong líp ®· cã Ýt nhÊt mét hµm t¹o, th× hµm t¹o mÆc ®Þnh sÏ kh«ng ®îc ph¸t sinh n÷a. Khi ®ã mäi c©u lÖnh x©y dùng ®èi tîng míi ®Òu sÏ gäi ®Õn mét hµm t¹o cña líp. NÕu kh«ng t×m thÊy hµm t¹o cÇn gäi th× ch¬ng tr×nh dÞch sÏ b¸o lçi. §iÒu nµy thêng x·y ra khi chóng ta kh«ng x©y dùng hµm t¹o kh«ng ®èi, nhng l¹i sö dông c¸c khai b¸o kh«ng tham sè nh vÝ dô sau: 46
  • 47. VÝ dô 3.16 #include <conio.h> #include <iostream.h> class DIEM { private: int x,y; public: DIEM(int x1, int y1) { x=x1; y=y1; } void in() { cout << “n” << x << “ ” << y <<” ” << m; } }; void main() { DIEM d1(200,200); // Goi ham tao co doi DIEM d2; // Loi, goi ham tao khong doi d2= DIEM_DH (3,5); // Goi ham tao co doi d1.in(); d2.in(); getch(); }; Trong vÝ dô nµy, c©u lÖnh DIEM d2; trong hµm main() sÏ bÞ ch¬ng tr×nh dÞch b¸o lçi. Bëi v× lÖnh nµy sÏ gäi tíi hµm t¹o kh«ng ®èi, mµ hµm t¹o nµy cha ®îc x©y dùng. Cã thÓ kh¾c phôc ®iÒu nµy b»ng c¸ch chän mét trong hai gi¶i ph¸p sau: - X©y dùng thªm hµm t¹o kh«ng ®èi. - G¸n gi¸ trÞ mÆc ®Þnh cho tÊt c¶ c¸c ®èi x1, y1 cña hµm t¹o ®· x©y dùng ë trªn. Theo gi¶i ph¸p thø 2, ch¬ng tr×nh trªn cã thÓ söa l¹i nh sau: VÝ dô 3.17 #include <conio.h> #include <iostream.h> class DIEM { private: int x,y; public: DIEM(int x1=0, int y1=0) { x = x1; y = y1; } 47
  • 48. void in() { cout << “n” << x << “ ” << y <<” ” << m; } }; void main() { DIEM d1(2,3); //Goi ham tao,khong dung tham so mac dinh DIEM d2; //Goi ham tao, dung tham so mac dinh d2= DIEM(6,7);//Goi ham tao,khong dung tham so mac dinh d1.in(); d2.in(); getch(); } VÝ dô 3.18 #include <iostream.h> #include <conio.h> class rectangle { private: int dai; int rong; static int extra_data; public: rectangle(); void set(int new_dai, int new_rong); int get_area(); int get_extra(); }; int rectangle::extra_data; rectangle::rectangle() { dai = 8; rong = 8; extra_data = 1; } void rectangle::set(int new_dai,int new_rong) { dai = new_dai; rong = new_rong; } int rectangle::get_area() { return (dai * rong); } int rectangle::get_extra() { return extra_data++; } void main() { rectangle small, medium, large; 48
  • 49. small.set(5, 7); large.set(15, 20); cout<<"Dien tich la : "<<small.get_area()<<"n"; cout<<"Dien tich la : "<< medium.get_area()<<"n"; cout<<"Dien tich la : "<<large.get_area()<<"n"; cout <<"Gia tri du lieu tinh la : "<< small.get_extra()<<"n"; cout <<"Gia tri du lieu tinh la : "<< medium.get_extra()<<"n"; cout <<"Gia tri du lieu tinh la : "<< large.get_extra()<<"n"; } Ch¬ng tr×nh cho kÕt qu¶ nh sau : Dien tich la : 35 Dien tich la : 64 Dien tich la : 300 Gia tri du lieu tinh la : 1 Gia tri du lieu tinh la : 2 Gia tri du lieu tinh la : 3 3.9. Hµm t¹o sao chÐp 3.9.1. Hµm t¹o sao chÐp mÆc ®Þnh Gi¶ sö ®· ®Þnh nghÜa mét líp ABC nµo ®ã. Khi ®ã: - Ta cã thÓ dïng c©u lÖnh khai b¸o hoÆc cÊp ph¸t bé nhí ®Ó t¹o c¸c ®èi tîng míi, vÝ dô: ABC p1, p2; ABC *p = new ABC; - Ta còng cã thÓ dïng lÖnh khai b¸o ®Ó t¹o mét ®èi tîng míi tõ mét ®èi tîng ®· tån t¹i, vÝ dô: ABC u; ABC v(u); // T¹o v theo u C©u lÖnh nµy cã ý nghÜa nh sau: - NÕu trong líp ABC cha x©y dùng hµm t¹o sao chÐp, th× c©u lÖnh nµy sÏ gäi tíi mét hµm t¹o sao chÐp mÆc ®Þnh cña C++. Hµm nµy sÏ sao chÐp néi dung tõng bit cña u vµo c¸c bit t¬ng øng cña v. Nh vËy c¸c vïng nhí cña u vµ v sÏ cã néi dung nh nhau. - NÕu trong líp ABC ®· cã hµm t¹o sao chÐp th× c©u lÖnh: PS v(u); sÏ t¹o ra ®èi tîng míi v, sau ®ã gäi tíi hµm t¹o sao chÐp ®Ó khëi g¸n v theo u. VÝ dô sau minh häa c¸ch dïng hµm t¹o sao chÐp mÆc ®Þnh: Trong ch¬ng tr×nh ®a vµo líp PS (ph©n sè): + C¸c thuéc tÝnh gåm: t (tö sè) vµ m (mÉu). + Trong líp mµ kh«ng cã ph¬ng thøc nµo c¶ mµ chØ cã hai hµm b¹n lµ c¸c hµm to¸n tö nhËp (>>) vµ xuÊt (<<). + Néi dung ch¬ng tr×nh lµ: Dïng lÖnh khai b¸o ®Ó t¹o mét ®èi tîng u (kiÓu PS) cã néi dung nh ®èi tîng ®· cã d. VÝ dô 3.19 49
  • 50. #include <conio.h> #include <iostream.h> class PS { private: int t,m; public: friend ostream& operator<< (ostream& os,const PS &p) { os<<" = "<<p.t<<"/"<<p.m; return os; } friend istream& operator>> (istream& is, PS &p) { cout <<" Nhap tu va mau : "; is>>p.t>>p.m; return is; } }; void main() { PS d; cout <<"n Nhap phan so d "; cin>>d; cout<<"n PS d "<<d; PS u(d); cout<<"n PS u "<<u; getch(); } 3.9.2. Hµm t¹o sao chÐp Hµm t¹o sao chÐp sö dông mét ®èi kiÓu tham chiÕu ®èi tîng ®Ó khëi g¸n cho ®èi tîng míi vµ ®îc viÕt theo mÉu sau: Tªn_líp (const Tªn_líp &ob) { // C¸c c©u lÖnh dïng c¸c thuéc tÝnh cña ®èi tîng ob ®Ó khëi g¸n // cho c¸c thuéc tÝnh cña ®èi tîng míi } VÝ dô: class PS { private: int t, m; public: PS(const PS &p) { t= p.t; m= p.m; } 50
  • 51. … }; Hµm t¹o sao chÐp trong vÝ dô trªn kh«ng kh¸c g× hµm t¹o sao chÐp mÆc ®Þnh. Chó ý: - NÕu líp kh«ng cã c¸c thuéc tÝnh kiÓu con trá hoÆc tham chiÕu th× dïng hµm t¹o sao chÐp mÆc ®Þnh lµ ®ñ. - NÕu líp cã c¸c thuéc tÝnh con trá hoÆc tham chiÕu, th× hµm t¹o sao chÐp mÆc ®Þnh cha ®¸p øng ®îc yªu cÇu. class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc a0, a1, … public: DT() { n = 0; a = NULL; } DT(int n1) { n = n1; a = new double[n1+1]; } friend ostream& operator<< (ostream& os,const DT &d); friend istream& operator>> (istream& is,DT &d); … }; B©y giê chóng ta h·y theo dâi xem viÖc dïng hµm t¹o mÆc ®Þnh trong ®o¹n ch¬ng tr×nh sau sÏ dÉn ®Õn sai lÇm nh thÕ nµo: DT d; cin >> d; /* NhËp ®èi tîng d gåm: nhËp mét sè nguyªn d¬ng vµ g¸n cho d.n, cÊp ph¸t vïng nhí cho d.n, nhËp c¸c hÖ sè cña ®a thøc vµ chøa vµo vïng nhí ®îc cÊp ph¸t */ DT u(d); /* Dïng hµm t¹o mÆc ®Þnh ®Ó x©y dùng ®èi tîng u theo d. KÕt qu¶: u.n = d.n vµ u.a = d.a. Nh vËy hai con trá u.a vµ d.a cïng trá ®Õn mét vïng nhí. */ NhËn xÐt: Môc ®Ých cña ta lµ t¹o ra mét ®èi tîng u gièng nh d, nhng ®éc lËp víi d. NghÜa lµ khi d thay ®æi th× u kh«ng bÞ ¶nh hëng g×. ThÕ nhng môc tiªu nµy kh«ng ®¹t ®îc, v× u vµ d cã chung mét vïng nhí chøa hÖ sè cña ®a thøc, nªn khi söa ®æi c¸c hÖ sè cña ®a thøc trong d th× c¸c hÖ sè cña ®a thøc trong u còng thay ®æi theo. Cßn mét trêng hîp n÷a còng dÉn ®Õn lçi lµ khi mét trong hai ®èi tîng u vµ d bÞ gi¶i phãng (thu håi vïng nhí chøa ®a thøc) th× ®èi tîng cßn l¹i còng sÏ kh«ng cßn vïng nhí n÷a. 51
  • 52. VÝ dô sau sÏ minh häa nhËn xÐt trªn: Khi d thay ®æi th× u còng thay ®æi vµ ngîc l¹i khi u thay ®æi th× d còng thay ®æi theo. VÝ dô 3.20 #include <conio.h> #include <iostream.h> #include <math.h> class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he //so da thuc a0,a1,... public: DT() { this->n=0; this->a=NULL; } DT(int n1) { this->n=n1; this->a= new double[n1+1]; } friend ostream& operator<< (ostream& os,const DT &d); friend istream& operator>> (istream& is,DT &d); }; ostream& operator<< (ostream& os,const DT &d) { os <<" Cac he so "; for (int i=0; i<=d.n; ++i) os << d.a[i]<<" "; return os; } istream& operator>> (istream& is,DT &d) { if (d.a != NULL) delete d.a; cout << " nBac da thuc:"; cin >>d.n; d.a = new double[d.n+1]; cout<<"Nhap cac he so da thuc:n"; for (int i=0 ; i<=d.n ; ++i) { cout<<"He so bac"<< i << "="; is >> d.a[i]; } 52
  • 53. return is; } void main() { DT d; clrscr(); cout<<"nNhap da thuc d" ; cin >> d; DT u(d); cout <<"nDa thuc d" << d ; cout <<"nDa thuc u" << u ; cout <<"nNhap da thuc d" << d ; cin >> d; cout <<"nDa thuc d" << d ; cout <<"nDa thuc u" << u ; cout <<"nDa thuc u" << u ; cin >> u; cout <<"nDa thuc d" << d ; cout <<"nDa thuc u" << u ; getch(); } VÝ dô 3.21 VÝ dô sau minh häa vÒ hµm t¹o sao chÐp: #include <conio.h> #include <iostream.h> #include <math.h> class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac da thuc // a0, a1,... public: DT() { this->n=0; this->a=NULL; } DT(int n1) { this->n=n1; this->a= new double[n1+1]; } DT(const DT &d); friend ostream& operator<< (ostream& os,const DT &d); friend istream& operator>> (istream& is,DT &d); }; DT::DT(const DT &d) { 53
  • 54. this->n = d.n; this->a = new double[d.n+1]; for (int i=0;i<=d.n;++i) this->a[i] = d.a[i]; } ostream& operator<< (ostream& os,const DT &d) { os<<"-Cac he so (tu ao): "; for (int i=0 ; i<=d.n ; ++i) os << d.a[i] <<" "; return os; } istream& operator>> (istream& is,DT &d) { if (d.a != NULL) delete d.a; cout << "n Bac da thuc:"; cin >> d.n; d.a = new double[d.n+1]; cout << "Nhap cac he so da thuc:n"; for (int i=0 ; i<= d.n ; ++i) { cout << "He so bac " << i << "="; is >> d.a[i]; } return is; } void main() { DT d; clrscr(); cout <<"nNhap da thuc d " ; cin >> d; DT u(d); cout << "nDa thuc d " << d; cout << "nDa thuc u " << u; cout << "nNhap da thuc d "; cin >> d; cout << "nDa thuc d " << d; cout << "nDa thuc u " << u; cout << "nNhap da thuc u " ; cin >> u; cout << "nDa thuc d " << d; cout << "nDa thuc u " << u; getch(); } 54
  • 55. 3.10. Hµm hñy (destructor) Hµm huû lµ mét hµm thµnh phÇn cña líp, cã chøc n¨ng ngîc víi hµm t¹o. Hµm huû ®îc gäi tríc khi gi¶i phãng mét ®èi tîng ®Ó thùc hiÖn mét sè c«ng viÖc cã tÝnh “dän dÑp” tríc khi ®èi tîng ®îc hñy bá, vÝ dô gi¶i phãng mét vïng nhí mµ ®èi tîng ®ang qu¶n lý, xo¸ ®èi tîng khái mµn h×nh nÕu nh nã ®ang hiÓn thÞ...ViÖc hñy bá ®èi tîng thêng x¶y ra trong 2 trêng hîp sau: - Trong c¸c to¸n tö vµ hµm gi¶i phãng bé nhí nh delete, free... - Gi¶i phãng c¸c biÕn, m¶ng côc bé khi tho¸t khái hµm, ph¬ng thøc. NÕu trong líp kh«ng ®Þnh nghÜa hµm huû th× mét hµm huû mÆc ®Þnh kh«ng lµm g× c¶ ®îc ph¸t sinh. §èi víi nhiÒu líp th× hµm huû mÆc ®Þnh lµ ®ñ, kh«ng cÇn ®a vµo mét hµm huû míi. Trêng hîp cÇn x©y dùng hµm hñy th× tu©n theo quy t¾c sau: - Mçi líp chØ cã mét hµm hñy. - Hµm hñy kh«ng cã kiÓu, kh«ng cã gi¸ trÞ tr¶ vÒ vµ kh«ng cã tham sè. - Tªn hµm hµm huû cã mét dÊu ng· ngay tríc tªn líp. VÝ dô: class A { private: int n; double *a; public: ~A() { n = 0; delete a; } }; VÝ dô 3.22 #include <iostream.h> class Count{ private: static int counter; int obj_id; public: Count(); static void display_total(); void display(); ~Count(); }; int Count::counter; Count::Count() { counter++; obj_id = counter; } Count::~Count() { counter--; 55
  • 56. cout<<"Doi tuong "<<obj_id<<" duoc huy bon"; } void Count::display_total() { cout <<"So cac doi tuong duoc tao ra la = "<< counter << endl; } void Count::display() { cout << "Object ID la "<<obj_id<<endl; } void main() { Count a1; Count::display_total(); Count a2, a3; Count::display_total(); a1.display(); a2.display(); a3.display(); } KÕt qu¶ ch¬ng tr×nh nh sau: So cac doi tuong duoc tao ra la = 1 So cac doi tuong duoc tao ra la = 3 Object ID la 1 Object ID la 2 Object ID la 3 Doi tuong 3 duoc huy bo Doi tuong 2 duoc huy bo Doi tuong 1 duoc huy bo 56
  • 57. Bµi tËp 1. X©y dùng líp thêi gian Time. D÷ liÖu thµnh phÇn bao gåm giê, phót gi©y. C¸c hµm thµnh phÇn bao gåm: hµm t¹o, hµm truy cËp d÷ liÖu, hµm normalize() ®Ó chuÈn hãa d÷ liÖu n»m trong kho¶ng quy ®Þnh cña giê (0 ≤ giê < 24) , phót (0 ≤ phót <60), gi©y (0 ≤ gi©y <60), hµm advance(int h, int m, int s) ®Ó t¨ng thêi gian hiÖn hµnh cña ®èi tîng ®ang tån t¹i, hµm reset(int h, int m, int s) ®Ó chØnh l¹i thêi gian hiÖn hµnh cña mét ®èi tîng ®ang tån t¹i vµ mét hµm print() ®Ó hiÓn thÞ d÷ liÖu. 2. X©y dùng líp Date. D÷ liÖu thµnh phÇn bao gåm ngµy, th¸ng, n¨m. C¸c hµm thµnh phÇn bao gåm: hµm t¹o, hµm truy cËp d÷ liÖu, hµm normalize() ®Ó chuÈn hãa d÷ liÖu n»m trong kho¶ng quy ®Þnh cña ngµy (1 ≤ ngµy <daysIn(th¸ng)), th¸ng (1 ≤ th¸ng < 12), n¨m (n¨m ≥ 1), hµm daysIn(int) tr¶ vÒ sè ngµy trong th¸ng, hµm advance(int y, int m, int d) ®Ó t¨ng ngµy hiÖn lªn c¸c n¨m y, th¸ng m, ngµy d cña ®èi tîng ®ang tån t¹i, hµm reset(int y, int m, int d) ®Ó ®Æt l¹i ngµy cho mét ®èi tîng ®ang tån t¹i vµ mét hµm print() ®Ó hiÓn thÞ d÷ liÖu. 3. Thùc hiÖn mét líp String. Mçi ®èi tîng cña líp sÏ ®¹i diÖn mét chuçi ký tù. Nh÷ng thµnh phÇn d÷ liÖu lµ chiÒu dµi chuçi, vµ chuçi ký tù. C¸c hµm thµnh phÇn bao gåm: hµm t¹o, hµm truy cËp, hµm hiÓn thÞ, hµm character(int i)tr¶ vÒ mét ký tù trong chuçi ®îc chØ ®Þnh b»ng tham sè i. 4. X©y dùng líp ma trËn cã tªn lµ Matrix cho c¸c ma trËn, c¸c hµm thµnh phÇn bao gåm: hµm t¹o mÆc ®Þnh, hµm nhËp xuÊt ma trËn, céng, trõ, nh©n hai ma trËn. 5. X©y dùng líp ma trËn cã tªn lµ Matrix cho c¸c ma trËn vu«ng, c¸c hµm thµnh phÇn bao gåm: hµm t¹o mÆc ®Þnh, hµm nhËp xuÊt ma trËn, tÝnh ®Þnh thøc vµ tÝnh ma trËn nghÞch ®¶o. 6. X©y dùng líp Stack cho ng¨n xÕp kiÓu int. C¸c hµm thµnh phÇn bao gåm: Hµm t¹o mÆc ®Þnh, hµm hñy, hµm isEmpty() kiÓm tra stack cã rçng kh«ng, hµm isFull() kiÓm tra stack cã ®Çy kh«ng, hµm push() , pop(), hµm in néi dung ng¨n xÕp. Sö dông mét m¶ng ®Ó thùc hiÖn. 7. X©y dùng líp hµng ®îi Queue chøa phÇn tö kiÓu int. C¸c hµm thµnh phÇn bao gåm: hµm t¹o, hµm hñy vµ nh÷ng to¸n tö hµng ®îi th«ng thêng: hµm insert() ®Ó thªm phÇn tö vµo hµng ®îi, hµm remove() ®Ó lo¹i bá phÇn tö, hµm isEmpty() kiÓm tra hµng ®îi cã rçng kh«ng, hµm isFull() kiÓm tra hµng ®îi cã ®Çy kh«ng. Sö dông mét m¶ng ®Ó thùc hiÖn. 4. X©y dùng líp ®a thøc vµ c¸c ph¬ng thøc céng, trõ hai ®a thøc. 8. X©y dùng líp Sinhvien ®Ó qu¶n lý hé tªn sinh viªn, n¨m sinh, ®iÓm thi 9 m«n häc cña c¸c sinh viªn. Cho biÕt sinh viªn nµo ®îc lµm khãa luËn tèt nghiÖp, bao nhiªu sinh viªn thi tèt nghiÖp, bao nhiªu sinh viªn thi l¹i, tªn m«n thi l¹i> Tiªu chuÈn ®Ó xÐt nh sau: - Sinh viªn lµm khãa luËn ph¶i cã ®iÓm trung b×nh tõ 7 trë lªn, trong ®ã kh«ng cã m«n nµo díi 5. - Sinh viªn thi tè nghiÖp khi ®iÓm trung b×nh nhá h¬n 7 vµ ®iÓm c¸c m«n kh«ng díi 5. - Sinh viªn thi l¹i m«n díi 5. 9. X©y dùng líp vector ®Ó lu tr÷ c¸c vect¬ gåm c¸c sè thùc. C¸c thµnh phÇn d÷ liÖu bao gåm: - KÝch thíc vect¬. - Mét m¶ng ®éng chøa c¸c thµnh phÇn cña vect¬. 57
  • 58. C¸c hµm thµnh phÇn bao gåm hµm t¹o, hµm hñy, hµm tÝnh tÝch v« híng hai vect¬, tÝnh chuÈn cña vect¬ (theo chuÈn bÊt kú nµo ®ã). 10. X©y dùng líp Phanso víi d÷ liÖu thµnh phÇn lµ tö vµ mÉu sè. C¸c hµm thµnh phÇn bao gåm: - Céng hai ph©n sè, kÕt qu¶ ph¶i dîc tèi gi¶n - Trõ hai ph©n sè, kÕt qu¶ ph¶i dîc tèi gi¶n - Nh©n hai ph©n sè, kÕt qu¶ ph¶i dîc tèi gi¶n - Chia hai ph©n sè, kÕt qu¶ ph¶i dîc tèi gi¶n 58
  • 59. CH¬NG 4 TO¸N Tö T¶I BéI Ch¬ng 4 tr×nh bµy c¸c vÊn ®Ò sau:  §Þnh nghÜa to¸n tö t¶i béi  Mét sè lu ý khi x©y dùng to¸n tö t¶i béi  Mét sè vÝ dô minh häa 4.1. §Þnh nghÜa to¸n tö t¶i béi C¸c to¸n tö cïng tªn thùc hiÖn nhiÒu chøc n¨ng kh¸c nhau ®îc gäi lµ to¸n tö t¶i béi. D¹ng ®Þnh nghÜa tæng qu¸t cña to¸n tö t¶i béi nh sau: KiÓu_tr¶_vÒ operator op(danh s¸ch tham sè) {//th©n to¸n tö} Trong ®ã: KiÓu_tr¶_vÒ lµ kiÓu kÕt qu¶ thùc hiÖn cña to¸n tö. op lµ tªn to¸n tö t¶i béi operator op(danh s¸ch tham sè) gäi lµ hµm to¸n tö t¶i béi, nã cã thÓ lµ hµm thµnh phÇn hoÆc lµ hµm b¹n, nhng kh«ng thÓ lµ hµm tÜnh. Danh s¸ch tham sè ®îc khai b¸o t¬ng tù khai b¸o biÕn nhng ph¶i tu©n theo nh÷ng quy ®Þnh sau: - NÕu to¸n tö t¶i béi lµ hµm thµnh phÇn th×: kh«ng cã tham sè cho to¸n tö mét ng«i vµ mét tham sè cho to¸n tö hai ng«i. Còng gièng nh hµm thµnh phÇn th«ng thêng, hµm thµnh phÇn to¸n tö cã ®èi ®Çu tiªn (kh«ng têng minh) lµ con trá this . - NÕu to¸n tö t¶i béi lµ hµm b¹n th×: cã mét tham sè cho to¸n tö mét ng«i vµ hai tham sè cho to¸n tö hai ng«i. Qu¸ tr×nh x©y dùng to¸n tö t¶i béi ®îc thùc hiÖn nh sau: - §Þnh nghÜa líp ®Ó x¸c ®Þnh kiÓu d÷ liÖu sÏ ®îc sö dông trong c¸c to¸n tö t¶i béi - Khai b¸o hµm to¸n tö t¶i béi trong vïng public cña líp - §Þnh nghÜa néi dung cÇn thùc hiÖn 4.2. Mét sè lu ý khi x©y dùng to¸n tö t¶i béi 1. Trong C++ ta cã thÓ ®a ra nhiÒu ®Þnh nghÜa míi cho hÇu hÕt c¸c to¸n tö trong C+ +, ngo¹i trõ nh÷ng to¸n tö sau ®©y: - To¸n tö x¸c ®Þnh thµnh phÇn cña líp (‘.’) - To¸n tö ph©n gi¶i miÒn x¸c ®Þnh (‘::’) - To¸n tö x¸c ®Þnh kÝch thíc (‘sizeof’) - To¸n tö ®iÒu kiÖn 3 ng«i (‘?:’) 2. MÆc dÇu ng÷ nghÜa cña to¸n tö ®îc më réng nhng có ph¸p, c¸c quy t¾c v¨n ph¹m nh sè to¸n h¹ng, quyÒn u tiªn vµ thø tù kÕt hîp thùc hiÖn cña c¸c to¸n tö vÉn kh«ng cã g× thay ®æi. 3. Kh«ng thÓ thay ®æi ý nghÜa c¬ b¶n cña c¸c to¸n tö ®· ®Þnh nghÜa tríc, vÝ dô kh«ng thÓ ®Þnh nghÜa l¹i c¸c phÐp to¸n +, - ®èi víi c¸c sè kiÓu int, float. 4. C¸c to¸n tö = , ( ) , [ ] , -> yªu cÇu hµm to¸n tö ph¶i lµ hµm thµnh phÇn cña líp, kh«ng thÓ dïng hµm b¹n ®Ó ®Þnh nghÜa to¸n tö t¶i béi. 4.3. Mét sè vÝ dô VÝ dô 4.1 To¸n tö t¶i béi mét ng«i, dïng hµm b¹n #include <iostream.h> #include <conio.h> class Diem { 59
  • 60. private: float x,y,z; public: Diem() {} Diem(float x1,float y1,float z1) { x = x1; y = y1; z=z1;} friend Diem operator -(Diem d) { Diem d1; d1.x = -d.x; d1.y = -d.y;d1.z=-d.z; return d1; } void hienthi() { cout<<"Toa do: "<<x<<" "<<y <<" " <<z<<endl;} }; void main() { clrscr(); Diem p(2,3,-4),q; q = -p; p.hienthi(); q.hienthi(); getch(); } VÝ dô 4.2 To¸n tö t¶i béi hai ng«i, dïng hµm b¹n #include <iostream.h> #include <conio.h> class Diem { private: float x,y,z; public: Diem() {} Diem(float x1,float y1,float z1) { x = x1; y = y1; z=z1;} friend Diem operator +(Diem d1, Diem d2) { Diem tam; tam.x = d1.x + d2.x; tam.y = d1.y + d2.y; tam.z = d1.z + d2.z; return tam; 60
  • 61. } void hienthi() { cout<<x<<" "<<y <<" " <<z<<endl;} }; void main() { clrscr(); Diem d1(3,-6,8),d2(4,3,7),d3; d3=d1+d2; d1.hienthi(); d2.hienthi(); cout<<"n Tong hai diem co toa do la :"; d3.hienthi(); getch(); } VÝ dô 4.3 To¸n tö t¶i béi hai ng«i, dïng hµm thµnh phÇn #include <iostream.h> #include <conio.h> class Diem { private: float x,y; public: Diem() {} Diem(float x1,float y1) { x = x1; y = y1;} Diem operator -() { x = -x; y = -y; z = -z; return (*this); } void hienthi() { cout<<"Toa do: "<<x<<" "<<y <<” z = "<<z <<" n";} }; void main() { clrscr(); Diem p(2,3,-4),q; p.hienthi(); q = -p; q.hienthi(); getch(); } 61
  • 62. VÝ dô 4.4 To¸n tö t¶i béi hai ng«i, dïng hµm thµnh phÇn #include <iostream.h> #include <conio.h> class Diem { private: float x,y,z; public: Diem() {} Diem(float x1,float y1,float z1) { x = x1; y = y1; z=z1;} Diem operator +(Diem d2) { x = x + d2.x; y = y + d2.y; z = z + d2.z; return (*this); } void hienthi() { cout<<"n x="<<x<<" y= "<<y<<" z = " << z <<endl;} }; void main() { clrscr(); Diem d1(3,-6,8),d2(4,3,7),d3; d1.hienthi(); d2.hienthi(); d3=d1+d2; cout<<"n Tong hai diem co toa do la :"; d3.hienthi(); getch(); } VÝ dô 4.5 #include <iostream.h> #include <conio.h> class Diem { private: int x,y; public: Diem() {} 62
  • 63. Diem(int x1,int y1) { x = x1; y = y1;} void operator -() { x = -x; y = -y; } void hienthi() { cout<<"Toa do: "<<x<<" "<<y <<" n";} }; void main() { clrscr(); Diem p(2,3),q; p.hienthi(); -p; p.hienthi(); getch(); } VÝ dô 4.6 To¸n tö t¶i béi hai ng«i #include <iostream.h> #include <conio.h> class sophuc {float a,b; public : sophuc() {} sophuc(float x, float y) {a=x; b=y;} sophuc operator +(sophuc c2) { sophuc c3; c3.a= a + c2.a ; c3.b= b + c2.b ; return (c3); } void hienthi(sophuc c) { cout<<c.a<<" + "<<c.b<<"i"<<endl; } }; void main() { clrscr(); sophuc d1 (2.1,3.4); sophuc d2 (1.2,2.3) ; sophuc d3 ; d3 = d1+d2; //d3=d1.operator +(d2); cout<<"d1= ";d1.hienthi(d1); cout<<"d2= ";d2.hienthi(d2); cout<<"d3= ";d3.hienthi(d3); 63
  • 64. getch(); } Chó ý: Trong c¸c hµm to¸n tö thµnh phÇn hai ng«i (cã hai to¸n h¹ng) th× con trá this øng víi to¸n h¹ng thø nhÊt, v× vËy trong tham sè cña to¸n tö chØ cÇn dïng mét tham sè têng minh ®Ó biÓu thÞ to¸n h¹ng thø hai . VÝ dô 4.7 Phiªn b¶n 2 cña vÝ dô 4.6 #include <iostream.h> #include <conio.h> class sophuc {float a,b; public : sophuc() {} sophuc(float x, float y) {a=x; b=y;} sophuc operator +(sophuc c2) { a= a + c2.a ; b= b + c2.b ; return (*this); } void hienthi(sophuc c) { cout<<c.a<<" + "<<c.b<<"i"<<endl; } }; void main() { clrscr(); sophuc d1 (2.1,3.4); sophuc d2 (1.2,2.3) ; sophuc d3 ; cout<<"d1= ";d1.hienthi(d1); cout<<"d2= ";d2.hienthi(d2); d3 = d1+d2; //d3=d1.operator +(d2); cout<<"d3= ";d3.hienthi(d3); getch(); } VÝ dô 4.8 Phiªn b¶n 3 cña vÝ dô 4.6 #include <iostream.h> #include <conio.h> class sophuc {float a,b; public : sophuc() {} sophuc(float x, float y) {a=x; b=y;} friend sophuc operator +(sophuc c1,sophuc c2) { sophuc c; c.a= c1.a + c2.a ; 64
  • 65. c.b= c1.b + c2.b ; return (c); } void hienthi(sophuc c) { cout<<c.a<<" + "<<c.b<<"i"<<endl; } }; void main() { clrscr(); sophuc d1 (2.1,3.4); sophuc d2 (1.2,2.3) ; sophuc d3 ; cout<<"d1= ";d1.hienthi(d1); cout<<"d2= ";d2.hienthi(d2); d3 = d1+d2; //d3=operator +(d1,d2); cout<<"d3= ";d3.hienthi(d3); getch(); } VÝ dô 4.9 To¸n tö t¶i béi trªn líp chuçi ký tù #include <iostream.h> #include <string.h> #include <conio.h> class string { char s[80]; public: string() { *s='0'; } string(char *p) { strcpy(s,p); } char *get() { return s;} string operator + (string s2); string operator = (string s2); int operator < (string s2); int operator > (string s2); int operator == (string s2); }; string string::operator +(string s2) { strcat(s,s2.s); return *this ; } string string::operator =(string s2) { strcpy(s,s2.s) ; return *this; } 65