Giáo trình Lập trình hướng đối tượng C++
LËp tr×nh h íng ®èi t îng C++
Ch ¬ng 1
LËp tr×nh h íng ®èi t îng
1.1 Ph ¬ng ph¸p lËp tr×nh:
Tõ l©u ta ®· nghe ®Õn thuËt ng÷ lËp tr×nh h íng ®èi t îng. VËy thùc chÊt lËp tr×nh
h íng ®èi t îng lµ g×? §Ó hiÓu ® îc vÊn ®Ò nµy chóng ta b¾t ®Çu nh×n l¹i mét chót lÞch sö
ph¸t triÓn cña c¸c ph ¬ng ph¸p lËp tr×nh. Vµo nh÷ng ngµy ®Çu ph¸t triÓn cña m¸y tÝnh, khi
c¸c phÇn mÒm cßn rÊt ®¬n gi¶n chØ kho¶ng vµi chôc dßng lÖnh, ch ¬ng tr×nh ® îc viÕt tuÇn
tù víi c¸c c©u lÖnh ® îc thùc hiÖn tuÇn tù tõ ®Çu ®Õn cuèi. C¸ch viÕt ch ¬ng tr×nh nh thÕ
gäi lµ ph ¬ng ph¸p lËp tr×nh tuyÕn tÝnh. Khoa häc m¸y tÝnh ngµy cµng ph¸t triÓn, c¸c phÇn
mÒm ®ßi hái ngµy cµng phøc t¹p vµ lín h¬n rÊt nhiÒu. §Õn lóc nµy ph ¬ng ph¸p lËp tr×nh
tuyÕn tÝnh tá ra kÐm hiÖu qu¶ vµ cã nh÷ng tr êng hîp ng êi lËp tr×nh kh«ng cßn kiÓm so¸t
® îc ch ¬ng tr×nh. ThÕ lµ ph ¬ng ph¸p lËp tr×nh cÊu tróc ra ®êi. Theo c¸ch tiÕp cËn nµy,
ch ¬ng tr×nh ® îc tæ chøc thµnh c¸c ch ¬ng tr×nh con. Mçi ch ¬ng tr×nh con ®¶m nhËn xö
lý mét c«ng viÖc nhá trong toµn bé hÖ thèng. Mçi ch ¬ng tr×nh con l¹i ® îc chia nhá thµnh
c¸c ch ¬ng tr×nh con nhá h¬n. Qu¸ tr×nh ph©n chia nh vËy cø tiÕp diÔn cho ®Õn khi nhËn
® îc c¸c ch ¬ng tr×nh con ®ñ nhá vµ ®¬n gi¶n ®Ó cã thÓ kiÓm so¸t ® îc. Ng êi ta gäi ®ã lµ
qu¸ tr×nh lµm mÞn dÇn. C¸c ch ¬ng tr×nh con t ¬ng ®èi ®éc lËp víi nhau, do ®ã cã thÓ ph©n
c«ng cho tõng nhãm ®¶m nhËn viÕt c¸c ch ¬ng tr×nh con kh¸c nhau. Ng«n ng÷ lËp tr×nh thÓ
hiÖn râ nÐt nhÊt ph ¬ng ph¸p lËp tr×nh cÊu tróc ®ã lµ Pascal. Tuy nhiªn, khi sö dông ph ¬ng
ph¸p lËp tr×nh nµy vÉn gÆp mét khã kh¨n lín lµ tæ chøc d÷ liÖu cña hÖ thèng nh thÕ nµo
trong m¸y tÝnh. Bëi v× theo quan niÖm cña lËp tr×nh cÊu tróc th× Ch ¬ng tr×nh = CÊu tróc d÷
liÖu + Gi¶i thuËt. §Ó lµm viÖc nµy ®ßi hái lËp tr×nh viªn ph¶i cã kiÕn thøc v÷ng vµng vÒ cÊu
tróc d÷ liÖu. Mét khã kh¨n n÷a gÆp ph¶i lµ gi¶i thuËt cña ch ¬ng tr×nh phô thuéc rÊt chÆt
chÏ vµo cÊu tróc d÷ liÖu, do vËy chØ cÇn mét thay ®æi nhá ë cÊu tróc d÷ liÖu còng dÉn ®Õn
lµm thay ®æi gi¶i thuËt vµ nh vËy lµ ph¶i viÕt l¹i ch ¬ng tr×nh. §iÒu nµy râ rµng kh«ng
thÝch hîp víi viÖc viÕt nh÷ng ch ¬ng tr×nh lín. Mét ph ¬ng ph¸p lËp tr×nh míi ra ®êi ®Ó
kh¸c phôc nh îc ®iÓm nµy ®ã chÝnh lµ ph ¬ng ph¸p lËp tr×nh h íng ®èi t îng. §iÓm c¨n
b¶n cña ph ¬ng ph¸p nµy lµ thiÕt kÕ ch ¬ng tr×nh xoay quanh d÷ liÖu cña hÖ thèng. NghÜa
lµ lóc nµy 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 mét sù thay
®æi nhá cña d÷ liÖu chØ ¶nh h ëng ®Õn sè l îng nhá c¸c hµm cã liªn quan xö lý d÷ liÖu ®ã.
Sù g¾n kÕt gi÷a d÷ liÖu vµ c¸c hµm xö lý trªn chóng t¹o ra ®èi t îng. Mét u ®iÓm n÷a cña
ph ¬ng ph¸p lËp tr×nh ®èi t îng lµ c¸ch tiÕp cËn bµi to¸n trë nªn gÇn gòi víi thùc tÕ h¬n.
1.2 LËp tr×nh h íng ®èi t îng
LËp tr×nh h íng ®èi t îng ®Æt träng t©m vµo ®èi t îng, yÕu tè quan träng trong qu¸
tr×nh ph¸t triÓn ch ¬ng tr×nh vµ kh«ng cho phÐp d÷ liÖu biÕn ®æi tù do trong hÖ thèng. D÷
liÖu ® îc g¾n chÆt vµo c¸c hµm thµnh c¸c vïng riªng mµ chØ cã c¸c hµm ®ã t¸c ®éng lªn vµ
cÊm c¸c hµm bªn ngoµi truy nhËp tíi mét c¸ch tuú tiÖn. LËp tr×nh h íng ®èi t îng cho
phÐp chóng ta ph©n tÝch bµi to¸n thµnh 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 c¸c hµm xung quang c¸c ®èi t îng nµy. C¸c ®èi t îng cã thÓ t¸c
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 1
LËp tr×nh h íng ®èi t îng C++
®éng, trao ®æi th«ng tin víi nhau th«ng qua c¬ chÕ th«ng b¸o( message). Tæ chøc mét
ch ¬ng tr×nh h íng ®èi t îng cã thÓ m« t¶ nh trong h×nh sau:
§èi t îng A
§èi t îng B
message
D÷ liÖu
D÷ liÖu
§èi t îng C
D÷ liÖu
LËp tr×nh h íng ®èi t îng cã c¸c ®Æc tr ng sau:
1. TËp trung vµo d÷ liÖu thay v× vµo c¸c hµm.
2. Ch ¬ng tr×nh ® îc chia thµnh c¸c ®èi t îng.
3. C¸c cÊu tróc d÷ liÖu ® îc thiÕt kÕ sao cho ®Æc t¶ ® îc ®èi t îng.
4. C¸c thao t¸c trªn c¸c vïng d÷ liÖu cña ®èi t îng ® îc g¾n víi cÊu tróc d÷ liÖu
®ã.
5. D÷ liÖu ® îc ®ãng gãi l¹i, ® îc che dÊu vµ kh«ng cho phÐp c¸c hµm ngo¹i lai
truy nhËp tù do.
6. C¸c ®èi t îng t¸c ®éng vµ trao ®æi th«ng tin th«ng qua c¸c hµm.
7. Cã thÓ dÔ dµng bæ xung d÷ liÖu vµ c¸c hµm míi 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 tõ d íi lªn( bottom-up).
D íi ®©y lµ mét sè kh¸i niÖm míi ® îc sö dông trong lËp tr×nh h íng ®èi t îng:
§èi t îng (Object):
§èi t îng lµ sù kÕt hîp gi÷a d÷ liÖu vµ thñ tôc (hay cßn gäi lµ ph ¬ng thøc) thao t¸c
trªn d÷ liÖu ®ã. Cã thÓ d a ra c«ng thøc ph¶n ¸nh b¶n chÊt kü thuËt cña lËp tr×nh h íng ®èi
t îng nh sau:
§«Ý t îng = D÷ liÖu + Ph ¬ng thøc
Líp (Class):
Líp lµ mét kh¸i niÖm míi trong lËp tr×nh h íng ®èi t îng so víi c¸c kü thuËt lËp
tr×nh kh¸c. §ã lµ mét tËp c¸c ®èi t îng cã cÊu tróc d÷ liÖu vµ ph ¬ng thøc gièng nhau( hay
nãi c¸ch kh¸c lµ tËp c¸c ®èi t îng cïng lo¹i). Nh vËy khi cã mét líp th× chóng ta sÏ biÕt
mét m« t¶ cÊu tróc d÷ liÖu vµ ph ¬ng thøc cña c¸c ®èi t îng thuéc líp ®ã. Mçi ®èi t îng sÏ
lµ mét thÓ hiÖn cô thÓ (instance) cña líp ®ã. Trong lËp tr×nh, chóng ta cã thÓ coi mét líp
nh mét kiÓu, cßn c¸c ®èi t îng lµ c¸c biÕn cã kiÓu cña líp.
Nguyªn t¾c ®ãng gãi d÷ liÖu:
Trong lËp tr×nh h íng ®èi t îng ta ®· thÊy c¸c hµm hay thñ tôc ® îc sö dông mµ
kh«ng cÇn biÕt ®Õn néi dung cô thÓ cña nã. Ng êi sö dông chØ cÇn biÕt ®Õn chøc n¨ng cña
nã còng nh tham sè cÇn truyÒn vµo ®Ó gäi hµm ch¹y mµ kh«ng cÇn quan t©m ®Õn nh÷ng
lÖnh cô thÓ bªn trong nã. Ng êi ta gäi ®ã lµ sù ®ãng gãi vÒ chøc n¨ng.
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 2
LËp tr×nh h íng ®èi t îng C++
Trong lËp tr×nh h íng ®èi t îng, kh«ng nh÷ng c¸c chøc n¨ng bÞ ®ãng gãi mµ c¶ d÷
liÖu còng nh vËy. Víi mçi ®èi t îng ng êi ta kh«ng thÓ truy nhËp trùc tiÕp vµo c¸c thµnh
phÇn d÷ liÖu cña nã mµ ph¶i th«ng qua c¸c thµnh phÇn chøc n¨ng( c¸c ph ¬ng thøc) ®Ó lµm
viÖc ®ã.
Chóng ta sÏ thÊy sù ®ãng gãi thùc sù vÒ d÷ liÖu trong mét ng«n ng÷ lËp tr×nh h íng
®èi t îng thuÇn khiÕt theo nghÜa c¸c ng«n ng÷ ® îc thiÕt kÕ ngay tõ ®Çu chØ cho lËp tr×nh
h íng ®èi t îng. Cßn c¸c ng«n ng÷ lai lËp tr×nh h íng ®èi t îng ® îc x©y dùng dùa trªn sù
ph¸t triÓn c¸c ng«n ng÷ kh¸c ch a ph¶i lµ h íng ®èi t îng thuÇn khiÕt nh C++ nãi ë ®©y.
V× vËy vÉn cã nh÷ng sù vi ph¹m nguyªn t¾c ®ãng gãi d÷ liÖu.
TÝnh kÕ thõa (inheritance):
Mét kh¸i niÖm quan träng trong lËp tr×nh h íng ®èi t îng lµ sù kÕ thõa. Sù kÕ thõa
cho phÐp ta ®Þnh nghÜa l¹i mét líp míi trªn c¬ së c¸c líp ®· tån t¹i, tÊt nhiªn cã sù bæ xung
nh÷ng ph ¬ng thøc hay c¸c thµnh phÇn d÷ liÖu míi. Kh¶ n¨ng kÕ thõa cho phÐp ta sö dông
l¹i mét c¸ch dÔ dµng c¸c module ch ¬ng tr×nh mµ kh«ng cÇn mét thay ®æi c¸c module ®ã.
§©y lµ mét ®iÓm m¹nh cña lËp tr×nh h íng ®èi t îng so víi lËp tr×nh cÊu tróc.
TÝnh ®a h×nh ( polymorphime):
TÝnh ®a h×nh xuÊt hiÖn khi cã kh¸i niÖm kÕ thõa. Gi¶ sö chóng ta cã mét líp h×nh tø
gi¸c kÕ thõa tõ líp ®a gi¸c vµ mét líp tam gi¸c còng kÕ thõa tõ líp ®a gi¸c. Nh vËy h×nh tø
gi¸c hay tam gi¸c ®Òu cã c¸c thuéc tÝnh vµ tÝnh chÊt cña mét h×nh ®a gi¸c. Lóc nµy mét ®èi
t îng thuéc líp tø gi¸c hay tam gi¸c ®Òu cã thÓ hiÓu lµ nã lµ mét h×nh ®a gi¸c. MÆt kh¸c
mçi h×nh ®a gi¸c ®Òu cã thÓ tÝnh diÖn tÝch cña nã. Nh vËy lµm thÕ nµo mµ mét ®a gi¸c cã
thÓ sö dông ®óng c«ng thøc ®Ó tÝnh diÖn tÝch phï hîp víi nã lµ h×nh tam gi¸c hay tø gi¸c.
Ta gäi ®ã lµ tÝnh ®a h×nh.
C¸c u ®iÓm cña lËp tr×nh h íng ®èi t îng :
LËp tr×nh h íng ®èi t îng ®em l¹i mét sè lîi thÕ cho ng êi thiÕt kÕ lÉn ng êi lËp
tr×nh. 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 nh÷ng phÇn mÒm cã ®é phøc t¹p vµ chÊt l îng cao. Ph ¬ng
ph¸p nµy më ra mét triÓn väng to lín cho ng êi lËp tr×nh. Nh÷ng u ®iÓm chÝnh cña lËp
tr×nh h íng ®èi t îng lµ:
1.Th«ng qua nguyªn lý kÕ thõa, ta 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µ cã thÓ më réng kh¶ n¨ng sö dông c¸c líp ®· x©y
dùng mµ kh«ng cÇn ph¶i viÕt l¹i.
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 dùa vµo
kinh nghiÖm vµ kü thuËt nh tr íc n÷a. §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ý ®ãng gãi hay che dÊ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 ®æi 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 ch ¬ng tr×nh.
5.C¸ch tiÕp cËn thiÕt kÕ ®Æt träng t©m vµo d÷ liÖu gióp ta x©y dùng ® îc m« h×nh chi
tiÕt vµ dÔ dµng h¬n.
6.C¸c hÖ thèng h íng ®èi t îng dÔ më réng, n©ng cÊp thµnh nh÷ng hÖ thèng lín h¬n.
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 3
LËp tr×nh h íng ®èi t îng C++
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 lµm 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.
Nh÷ng øng dông cña lËp tr×nh h íng ®èi t îng:
LËp tr×nh h íng ®èi t îng lµ mét trong nh÷ng thuËt ng÷ ® îc nh¾c nhiÒu nhÊt hiÖn
nay trong lÜnh vùc c«ng nghÖ phÇn mÒm vµ nã ® îc øng dông ®Ó ph¸t triÓn phÇn mÒm trong
nhiÒu lÜnh vùc kh¸c nhau. Trong sè ®ã, øng dông quan träng vµ næi tiÕng nhÊt hiÖn nay lµ
thiÕt kÕ giao diÖn ng êi sö dông, kiÓu nh Windows. C¸c hÖ th«ng tin qu¶n lý trong thùc tÕ
th êng rÊt phøc t¹p, chøa nhiÒu ®èi t îng víi c¸c thuéc tÝnh vµ hµm rÊt phøc t¹p. §Ó gi¶i
quyÕt nh÷ng hÖ th«ng tin phøc t¹p nh thÕ, lËp tr×nh h íng ®èi t îng tá ra rÊt hiÖu qu¶. C¸c
lÜnh vùc øng dông phï hîp víi kü thuËt lËp tr×nh h íng ®èi t îng cã thÓ liÖt kª nh sau:
C¸c hÖ thèng lµm viÖc theo thêi gian thùc.
C¸c hÖ m« h×nh ho¸ hoÆc m« pháng qu¸ tr×nh.
C¸c hÖ c¬ së d÷ liÖu h íng ®èi t îng.
C¸c hÖ siªu v¨n b¶n (hypertext), ®a ph ¬ng tiÖn (multimedia).
C¸c hÖ thèng trÝ tuÖ nh©n t¹o vµ hÖ chuyªn gia.
C¸c hÖ tù ®éng ho¸ v¨n phßng hoÆc trî gióp quyÕt ®Þnh.
C¸c hÖ thèng song song vµ m¹ng n¬-ron.
C¸c hÖ CAD/CAM.
Víi nhiÒu ®Æc tÝnh phong phó cña lËp tr×nh h íng ®èi t îng nãi riªng, cña ph ¬ng
ph¸p ph©n tÝch thiÕt kÕ vµ ph¸t triÓn h íng ®èi t îng nãi chung chóng ta hy väng c«ng
nghiÖp phÇm mÒm sÏ cã nh÷ng c¶i tiÕn nh¶y vät kh«ng chØ vÒ chÊt l îng mµ cßn gia t¨ng
vÒ sè l îng trong t ¬ng lai.
1.3 Ng«n ng÷ lËp tr×nh C++
N¨m 1983, gi¸o s Bjarne Stroustrap b¾t ®Çu nghiªn cøu vµ ph¸t triÓn viÖc cµi ®Æt kh¶
n¨ng lËp tr×nh h íng ®èi t îng vµo ng«n ng÷ C t¹o ra mét ng«n ng÷ míi cã tªn gäi lµ C++.
Tªn gäi nµy cã thÓ ph©n tÝch ý nghÜa r»ng nã lµ ng«n ng÷ C mµ cã hai ®Æc ®iÓm míi t ¬ng
øng víi hai dÊu céng. §Æc ®iÓm thø nhÊt lµ kh¶ n¨ng më réng so víi C nh tham chiÕu,
chång hµm, tham sè mÆc ®Þnh… §Æc thø hai chÝnh lµ kh¶ n¨ng lËp tr×nh h-íng ®èi t-îng.
HiÖn nay C++ ch a ph¶i lµ mét ng«n ng÷ hoµn toµn æn ®Þnh. KÓ tõ khi phiªn b¶n ®Çu tiªn ra
®êi vµo n¨m 1986 ®· cã rÊt nhiÒu thay ®æi trong c¸c phiªn b¶n C++ kh¸c nhau: B¶n 1.1 ra
®êi vµo n¨m 1986, 2.0 vµo n¨m 1989 vµ 3.0 vµo n¨m 1991. Phiªn b¶n 3.0 nµy ® îc sö dông
®Ó lµm c¬ së cho viÖc ®Þnh nghÜa mét ng«n ng÷ C++ chuÈn ( kiÓu nh ANSI C).
Trªn thùc tÕ hiÖn nay tÊt c¶ c¸c ch ¬ng tr×nh dÞch C++ ®Òu t ¬ng thÝch víi phiªn b¶n
3.0. V× vËy C++ hÇu nh kh«ng g©y bÊt kú mét khã kh¨n nµo khi chuyÓn ®æi tõ mét m«i
tr êng nµy sang mét m«i tr êng kh¸c, nh chóng ta ®· biÕt C++ nh lµ mét sù bæ sung kh¶
n¨ng lËp tr×nh h íng ®èi t îng vµo ng«n ng÷ C. SÏ cã nhiÒu ng êi nghÜ r»ng ng«n ng÷ C
nãi ë ®©y lµ C theo chuÈn ANSI. Thùc ra kh«ng ph¶i hoµn toµn nh vËy. Trªn thùc tÕ vÉn
tån t¹i nh÷ng ®iÓm kh«ng t ¬ng thÝch gi÷a ANSI C vµ C++.
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 4
LËp tr×nh h íng ®èi t îng C++
MÆt kh¸c còng c©n thÊy r»ng nh÷ng më réng cã trong C++ so víi ANSI C kh«ng chØ lµ
®Ó phôc vô cho môc ®Ých t¹o ng«n ng÷ kh¶ n¨ng lËp tr×nh h íng ®èi t îng. Cã nh÷ng thay
®æi chØ víi môc ®Ých ®¬n thuÇn lµ t¨ng søc m¹nh cho ng«n ng÷ C hiÖn thêi.
Cã mét vµi thay ®æi nhá ë C++ so víi ANSI C nh sau:
§Þnh nghÜa c¸c hµm: Khai b¸o, truyÒn tham sè vµ gi¸ trÞ tr¶ vÒ.
Sù t ¬ng thÝch gi÷a c¸c con trá.
TÝnh linh ho¹t cña c¸c h»ng.
C¸c ®iÓm më réng trong C++
Nh ®· ®Ò cËp ë trªn C++ chøa c¶ nh÷ng më rèng so víi C mµ kh«ng liªn quan ®Õn kü
thuËt h íng ®èi t îng. Nh÷ng më réng nµy sÏ ® îc m« t¶ cô thÓ ë ch ¬ng sau, ë ®©y chóng
ta chØ tãm t¾t l¹i mét vµi ®iÓm chÝnh:
Kh¶ n¨ng viÕt c¸c dßng chó thÝch míi.
Kh¶ n¨ng khai b¸o linh ho¹t h¬n.
Kh¶ n¨ng ®Þnh nghÜa l¹i c¸c hµm: c¸c hµm cïng tªn cã thÓ thùc hiÖn theo nh÷ng
thao t¸c kh¸c nhau. C¸c lêi gäi hµm sÏ dïng kiÓu vµ sè tham sè ®Ó x¸c ®Þnh
®óng hµm nµo cÇn thùc hiÖn.
Cã thªm c¸c to¸n tö ®Þnh nghÜa bé nhí ®éng míi: new vµ delete.
Kh¶ n¨ng ®Þnh nghÜa c¸c hµ inline ®Ó t¨ng tèc ®é thùc hiÖn ch ¬ng tr×nh.
T¹o c¸c biÕn tham chiÕu ®Õn c¸c biÕn kh¸c.
LËp tr×nh h íng ®èi t îng trong C++
C++ chøa ®ùng kh¸i niÖm líp. Mét líp bao gåm c¸c thµnh phÇn d÷ liÖu hay lµ thuéc
tÝnh vµ ph ¬ng thøc hay lµ hµm thµnh phÇn. Tõ mét líp ta cã thÓ t¹o ra c¸c ®èi t îng hoÆc
b»ng c¸ch khai b¸o th«ng th êng mét biÕn cã kiÓu lµ líp ®ã hoÆc b»ng c¸ch cÊp ph¸t bé
nhí ®éng nhê sö dông to¸n tö new. C++ cho phÐp chóng ta ®ãng gãi d÷ liÖu nh ng nã
kh«ng b¾t buéc chóng ta lµm viÖc nµy. §©y lµ mét nh îc ®iÓm cña C++. Tuy nhiªn còng cÇn
thÊy r»ng b¶n th©n C++ chØ lµ sù më réng cña C nªn nã kh«ng thÓ lµ mét ng«n ng÷ lËp tr×nh
h íng ®èi t îng thuÇn khiÕt ® îc.
C++ cho phÐp ta ®Þnh nghÜa c¸c hµm thiÕt lËp( constructor) cho mét líp. Hµm thiÕt lËp
lµ mét ph ¬ng thøc ®Æc biÖt ® îc gäi ®Õn t¹i thêi ®iÓm mét ®èi t îng cña mét líp ® îc t¹o.
Hµm thiÕt lËp cã nhiÖm vô khëi t¹o mét ®èi t îng: cÊp ph¸t bé nhí, g¸n c¸c gi¸ trÞ cho c¸c
thµnh phÇn d÷ liÖu còng nh viÖc chuÈn bÞ chç cho c¸c ®èi t îng míi. Mét líp cã thÓ cã
mét hay nhiÒu hµm thiÕt lËp. §Ó x¸c ®Þnh ®óng hµm thiÕt lËp nµo cÇn gäi, tr×nh biªn dÞch sÏ
so s¸nh c¸c ®èi sè víi c¸c tham sè truyÒn vµo. T ¬ng tù nh hµm thiÕt lËp, mét líp cã thÓ
cã mét hµm huû bá( destructor), mét ph ¬ng thøc ®Æc biÖt ® îc gäi mçi khi ®èi t îng ® îc
gi¶i phãng khái bé nhí.
Líp trong C++ thøc chÊt lµ mét kiÓu d÷ liÖu do ng êi s dông ®Þnh nghÜa. Kh¸i niÖm
®Þnh nghÜa chång to¸n tö cho phÐp ®Þnh nghÜa c¸c phÐp to¸n trªn mét líp gièng nh c¸c
kiÓu d÷ liÖu chuÈn trong C. VÝ dô ta cã thÓ ®Þnh nghÜa trªn mét líp sè phøc víi c¸c phÐp
to¸n céng trõ nh©n chia.
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 5
LËp tr×nh h íng ®èi t îng C++
Còng gièng nh C, C++ cã kh¶ n¨ng chuyÓn ®æi kiÓu. Kh«ng nh÷ng thÕ, C++ cßn cho
phÐp më réng sù chuyÓn ®æi nµy sang c¸c kiÓu do ng êi sö dông tù ®Þnh nghÜa (c¸c líp). VÝ
dô ta cã thÓ chuyÓn ®æi tõ mét sè nguyªn int sang líp sè phøc mµ ta ®Þnh nghÜa.
C++ cho phÐp thùc hiÖn kÕ thõa c¸c líp ®· x©y dùng. Tõ phiªn b¶n 2.0 trë ®i C++ cßn
cho phÐp mét líp ® îc kÕ thõa cïng mét lóc nhiÒu líp kh¸c nhau : ®a kÕ thõa.
Cuèi cïng C++ cung cÊp nh÷ng thao t¸c vµo ra míi dùa trªn kh¸i niÖm luång d÷ liÖu.
Sù u viÖt nµy thÓ hiÖn ë chç :
Sö dông ®¬n gi¶n.
KÝch th íc bé nhí ® îc rót gän.
Kh¶ n¨ng ¸p dông trªn c¸c kiÓu do ng êi sö dông ®Þnh nghÜa b»ng c¸ch sö dông
c¬ chÕ chång to¸n tö.
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 6
LËp tr×nh h íng ®èi t îng C++
Ch ¬ng 2
Nh÷ng më réng cña c++
Trong ch ¬ng nµy:
Giíi thiÖu nh÷ng ®iÓm kh¸c biÖt chñ yÕu gi÷a C vµ C++
C¸c ®iÓm míi cña C++ so víi C
2.1 C¸c ®iÓm kh«ng t ¬ng thÝch gi÷a C vµ C++
2.1.1 §Þnh nghÜa hµm:
Trong ®Þnh nghÜa hµm, C cho phÐp hai kiÓu khai b¸o dßng tiªu ®Ò cña hµm, trong khi
C++ chØ chÊp nhËn mét kiÓu:
/*C++ kh«ng khai b¸o kiÓu nµy*/
/* C¶ C vµ C++ cho phÐp*/
double vidu(int x, double y)
int x;
double vidu(x,y)
int x;
double y;
double y;
2.1.2 Khai b¸o hµm nguyªn mÉu:
Trong C, khi sö dông mét hµm ch a ®Þnh nghÜa tr íc ®ã trong cïng mét tÖp ta cã thÓ:
1. Kh«ng cÇn khai b¸o( khi ®ã ngÇm ®Þnh gi¸ trÞ tr¶ vÒ cña hµm lµ int).
2. ChØ cÇn khai b¸o tªn hµm vµ gi¸ trÞ tr¶ vÒ, kh«ng cÇn d¸nh s¸ch kiÓu cña c¸c
tham s«.
3. Khai b¸o nguyªn mÉu hµm.
Víi C++ chØ cã ph ¬ng ph¸p thø 3 lµ ® îc chÊp nhËn. Nãi c¸ch kh¸c, mét lêi gäi hµm
chØ ® îc chÊp nhËn khi tr×nh biªn dÞch biÕt ® îc kiÓu cña c¸c tham sè, kiÓu cña gi¸ trÞ tr¶
vÒ. Mçi khi tr×nh biªn dÞch gÆp mét lêi gäi hµm, nã sÏ so s¸nh c¸c kiÓu cña c¸c ®èi sè ® îc
truyÒn víi c¸c tham sè h×nh thøc t ¬ng øng. Trong tr êng hîp cã sù kh¸c nhau, cã thÓ thùc
hiÖn viÖc chuyÓn ®æi kiÓu tù ®éng ®Ó cho hµm nhËn ® îc cã danh s¸ch c¸c tham sè ®óng
víi kiÓu ®· ® îc khai b¸o cña hµm. Tuy nhiªn ph¶i tu©n thñ theo nguyªn t¾c chuyÓn ®æi
kiÓu tù ®éng sau:
Char int longint double
VÝ dô 2.1
double fexple(int, double)
...
main(){
int n;
char c;
double z, res1, res2, res3;
...
res1=fexple(n,z); /* kh«ng cã chuyÓn ®æi kiÓu*/
res2=fexple(c,z); // Cã chuyÓn ®æi kiÓu tõ char int
res3=fexple(z,n); //* Cã chuyÓn ®æi kiÓu tõ double int vµ int double
...
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 7
LËp tr×nh h íng ®èi t îng C++
}
Trong C++ b¾t buéc ph¶i cã tõ kho¸ void tr íc tªn cña hµm trong phÇn khai b¸o ®Ó chØ
ra r»ng hµm kh«ng cã gi¸ trÞ tr¶ vÒ. Tr êng hîp kh«ng cã, tr×nh dÞch ngÇm hiÓu kiÓu cña
gi¸ trÞ tr¶ vÒ lµ int vµ nh thÕ trong th©n hµm b¾t buéc ph¶i cã c©u lÖnh return. §iÒu nµy
hoµn toµn kh«ng cÇn thiÕt ®èi víi m« t¶ trong ng«n ng÷ C.
Thùc ra, c¸c kh¶ n¨ng võa m« t¶ kh«ng hoµn toµn lµ ®iÓm kh«ng t ¬ng thÝch gi÷a C
vµ C++ mµ ®ã chØ lµ sù g¹n läc c¸c ®iÓm yÕu vµ hoµn thiÖn c¸c mÆt cßn ch a hoµn chØnh
cña C.
2.1.3 Sù t ¬ng thÝch gi÷a con trá void vµ c¸c con trá kh¸c.
Trong C, kiÓu void* t ¬ng thÝch víi c¸c kiÓu con trá kh¸c theo c¶ hai chiÒu. Ch¼ng
h¹n víi khai b¸o sau:
void *gen;
int *adj;
Hai phÐp g¸n sau ®©y lµ hîp lÖ trong C:
gen=adj;
adj=gen;
Thùc ra, hai c©u lÖnh trªn ®· kÌm theo c¸c phÐp chuyÓn kiÓu ngÇm ®Þnh:
int* void* ®èi víi c©u lÖnh thø nhÊt.
void* int * ®èi víi c©u lÖnh thø hai.
Trong C++, chØ cã chuyÓn ®æi kiÓu ngÇm ®Þnh tõ mét kiÓu con trá tuú ý thµnh con trá
void* lµ ® îc chÊp nhËn, cßn muèn chuyÓn ®æi theo chiÒu ng îc l¹i ta ph¶i thùc hiÖn
chuyÓn ®æi t êng minh nh c¸ch viÕt sau:
gen=adj;
adj=(int*)gen;
2.2 C¸c kh¶ n¨ng vµo ra míi cña C++
C¸c tiÖn Ých vµo ra( hµm hoÆc macro) cña th viÖn C chuÈn ®Òu cã thÓ sö dông trong
C++. §Ó sö dông c¸c hµm nµy chóng ta chØ cÇn khai b¸o tÖp tiªu ®Ò trong ®ã cã chøa khai
b¸o hµm nguyªn mÉu cña c¸c tiÖn Ých nµy.
Bªn c¹nh ®ã C++ cßn cµi ®Æt thªm c¸c kh¶ n¨ng vµo ra míi dùa trªn hai to¸n tö “<<”(
xuÊt) vµ ”>>”(nhËp) víi c¸c ®Æc tÝnh sau:
§¬n gi¶n trong sö dông.
Cã kh¶ n¨ng më réng ®èi víi c¸c kiÓu míi theo nhu cÇu cña ng êi lËp tr×nh.
Trong tÖp tiªu ®Ò <iostream.h> ®· ®Þnh nghÜa hai ®èi t îng cout vµ cin t ¬ng øng víi
hai thiÕt bÞ chuÈn ra/vµo ®-îc sö dông cïng víi “<<” vµ “>>”. Th«ng th-êng ta hiÓu cout lµ
mµn h×nh, cßn cin lµ bµn phÝm.
2.2.1 Ghi d÷ liÖu lªn thiÕt bÞ chuÈn( mµn h×nh) cout
Trong phÇn nµy ta xem xÐt mét sè minh ho¹ c¸ch sö dông cout vµ ”<<” ®Ó ®-a th«ng
tin ra mµn h×nh.
VÝ dô 2.2 :
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 8
LËp tr×nh h íng ®èi t îng C++
Ch ¬ng tr×nh sau minh ho¹ c¸ch sö dông cout ®Ó ® a ra mµn h×nh mét x©u ký tù:
#include <iostream.h>
main()
{
cout<<”Xin chao cac ban”;
}
Xin chao cac ban
“<<” lµ mét to¸n tö hai ng«i, to¸n h¹ng ë bªn tr¸i m« t¶ n¬i kÕt xuÊt th«ng tin( cã thÓ
lµ mét thiÕt bÞ ngo¹i vi chuÈn hay mét tÖp tin), to¸n h¹ng bªn ph¶i lµ mét biÓu thøc nµo ®ã.
Trong ch-¬ng tr×nh trªn, c©u lÖnh cout<<”Xin chao cac ban” ®-a ra mµn h×nh x©u ký tù
“Xin chao cac ban”.
VÝ dô 2.3: Sö dông cout vµ “<<” ®-a c¸c gi¸ trÞ kh¸c nhau:
#include <iostream.h>
void main()
{
int n=25;
cout<<”Gia tri cua n :”;
cout<<n;
}
Gia tri cua n :25
Trong vÝ dô trªn ta ®· sö dông to¸n tö “<<” ®Ó in ra mµn h×nh ®Çu tiªn lµ mét x©u ký
tù, sau ®ã lµ mét sè nguyªn. Chøc n¨ng cña to¸n tö “<<” râ rµng lµ kh¸c nhau trong hai lÇn
kÕt xuÊt d÷ liÖu: víi c©u lÖnh thø nhÊt, chØ ® a ra mµn h×nh mét d·y ký tù, ë c©u lÖnh sau,
®· sö dôngmét khu«n mÉu ®Ó chuyÓn ®æi mét gi¸ trÞ nhÞ ph©n thµnh mét chuçi c¸c ký tù
ch÷ sè. ViÖc mét to¸n tö cã nhiÒu vai trß kh¸c nhau liªn quan ®Õn mét kh¸i niÖm míi trong
C++, ®ã chÝnh lµ “ §Þnh nghÜa chång to¸n tö”.
VÝ dô 2.4: Trong vÝ dô nµy gép c¶ hai c©u lÖnh trong vÝ dô trªn thµnh mét c©u lÖnh, kÕt qu¶
kh«ng thay ®æi:
#include <iostream.h>
void main()
{
int n=25;
cout<<”Gia tri cua n :”<<n;
}
Gia tri cua n :25
2.2.2 C¸c kh¶ n¨ng viÕt ra trªn cout
Chóng ta võa xem xÐt mét vµi vÝ dô viÕt mét x©u ký tù, mét sè nguyªn. Mét c¸ch tæng
qu¸t, ta cã thÓ sö dông to¸n tö “<<” cïng víi cout ®Ó ®-a ra mµn h×nh gi¸ trÞ cña mét biÓu
thøc cã c¸c kiÓu sau:
KiÓu d÷ liÖu c¬ së( char, int, float, double).
X©u ký tù: (char*).
Con trá (trõ con trá char*).
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 9
LËp tr×nh h íng ®èi t îng C++
Trong tr êng hîp muèn ® a ra ®Þa chØ biÕn x©u ký tù ph¶i thùc hiÖn theo nguyªn t¾c
chuyÓn kiÓu t êng minh, ch¼ng h¹n (char*) (void*).
XÐt vÝ dô sau:
VÝ dô 2.5
#include <iostream.h>
void main()
{
int n=25;
long p=250000;
unsigned q= 63000;
char c=’a’;
float x=12.3456789;
double y=12.3456789e16;
char *ch=”Xin chao cac ban”;
int *ad=&n;
cout<<”Gia tri cua n :”<<n<<”\n”;
cout<<”Gia tri cua p :”<<p<<”\n”;
cout<<”Gia tri cua c :”<<c<<”\n”;
cout<<”Gia tri cua q :”<<q<<”\n”;
cout<<”Gia tri cua x :”<<x<<”\n”;
cout<<”Gia tri cua y :”<<y<<”\n”;
cout<<”Gia tri cua ch :”<<ch<<”\n”;
cout<<”Dia chi cua n :”<<ad<<”\n”;
cout<<”Dia chi cua ch :”<<(void*)ch<<”\n”;
}
Gia tri cua n :25
Gia tri cua p :250000
Gia tri cua c :a
Gia tri cua q :63000
Gia tri cua x :12.3456789
Gia tri cua y :1.23456789e+17
Gia tri cua ch :Xin chao cac ban
Dia chi cua n :0xfff2
Dia chi cua ch :0x00b2
2.2.3 §äc d÷ liÖu tõ thiÕt bÞ vµo chuÈn( bµn phÝm) cin
NÕu nh cout dïng ®Ó chØ thiÕt bÞ ra chuÈn, th× cin ® îc dïng ®Ó chØ mét thiÕt bÞ vµo
chuÈn. Mét c¸ch t ¬ng tù, to¸n tö “>>” ®-îc dïng kÌm víi cin ®Ó nhËp c¸c gi¸ trÞ. Hai c©u
lÖnh:
int n;
cin>>n;
Yªu cÇu ®äc c¸c ký tù trªn bµn phÝm vµ chuyÓn chóng thµnh mét sè nguyªn vµ g¸n cho
biÕn n.
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 10
LËp tr×nh h íng ®èi t îng C++
Gièng nh- cout vµ “<<”, cã thÓ nhËp vµo nhiÒu gi¸ trÞ cïng kiÓu hay kh¸c kiÓu b»ng
c¸ch viÕt liªn tiÕp tªn c¸c biÕn cÇn nhËp gi¸ trÞ cïng víi “>>” ngay sau cin. Ch¼ng h¹n:
int n;
float p;
char c;
cin>>c>>n>>p;
Cã thÓ sö dông to¸n tö “>>” ®Ó nhËp d÷ liÖu cho c¸c biÕn kiÓu char, int, float, double
vµ char*.
Gièng víi hµm scanf(), cin tu©n theo mét sè quy íc dïng trong viÖc ph©n tÝch c¸c
ký tù:
C¸c gi¸ trÞ sè ® îc ph©n c¸ch bëi: SPACE, TAB, CR, LF. Khi gÆp mét ký tù kh«ng hîp lÖ(
dÊu “.” ®èi víi sè nguyªn, ch÷ c¸i ®èi víi sè…) sÏ kÕt thóc viÖc ®äc tõ cin; ký tù kh«ng hîp
lÖ nµy sÏ ® îc xem xÐt trong lÇn ®äc sau.
§èi víi gi¸ trÞ x©u ký tù, dÊu ph©n c¸ch còng lµ SPACE, TAB, CR, cßn ®èi víi gi¸ trÞ ký tù,
dÊu ph©n c¸ch lµ CR. Trong tr êng hîp nµy kh«ng cã kh¸i niÖm ký tù kh«ng hîp lÖ. M·
sinh ra do bÊm Enter cña lÇn nhËp tr íc vÉn ® îc xem xÐt trong lÇn nhËp x©u/ký tù tiÕp
theo vµ do vËy sÏ cã nguy c¬ kh«ng nhËp ®óng gi¸ trÞ mong muèn khi ® a ra lÖnh nhËp x©u
ký tù hoÆc ký tù ngay sau c¸c lÖnh nhËp c¸c gi¸ trÞ kh¸c. Gi¶i ph¸p kh¾c phôc vÊn ®Ò nµy lµ
®Ó ®¶m b¶o c«ng viÖc diÔn ra theo ®óng ý lµ tr íc mçi lÇn gäi lÖnh nhËp d÷ liÖu cho x©u ký
tù hay ký tù ta sö dông mét trong hai chØ thÞ sau:
fflush(stdin); // Khai b¸o trong th viÖn stdio.h
cin.clear(); // Hµm thµnh phÇn cña líp ®èi t îng cin
Ta tham kh¶o vÝ dô sau:
VÝ dô 2.6:
#include <iostream.h>
#include <conio.h>
void main()
{
int n;
float x;
char t[81];
clrscr();
do {
cout<<”Nhap mot so nguyen, mot xau, mot so thuc:”;
cin>>n>>t>>x;
cout<<”Da nhap ”<<n<<”, ”<<x<<”va “<<x<<”\n”;
}while(n);
}
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 11
LËp tr×nh h íng ®èi t îng C++
Nhap mot so nguyen, mot xau, mot so thuc: 3 long 3.4
Da nhap 3, long va 3.4
Nhap mot so nguyen, mot xau, mot so thuc: 5 hung 5.6
Da nhap 5, hung va 5.6
Nhap mot so nguyen, mot xau, mot so thuc: 0 4
3
Da nhap 0, 4 va 3
2.3 Nh÷ng tiÖn Ých cho ng êi lËp tr×nh
2.3.1 Chó thÝch cuèi dßng
Mäi ký hiÖu ®i sau “//” cho ®Õn hÕt dßng ®-îc coi lµ chó thÝch, ®-îc ch-¬ng tr×nh
dÞch bá qua khi biªn dÞch ch ¬ng tr×nh.
XÐt vÝ dô sau:
Cout<<”Xin chao\n”; // Lêi chµo
Th«ng th êng sö dông chó thÝch cuèi dßng khi muèn gi¶i thÝch ý nghÜa cña mét c©u
lÖnh nµo ®ã. §èi víi mét ®o¹n ch-¬ng tr×nh kiÓu chó thÝch giíi h¹n bëi “/*” vµ “*/” cho
phÐp m« t¶ ® îc nhiÒu th«ng tin h¬n.
2.3.2 Khai b¸o mäi n¬i
Trong C++ kh«ng nhÊt thiÕt ph¶i nhãm lªn ®Çu c¸c khai b¸o ®Æt bªn trong mét hµm
hay mét khèi lÖnh, mµ cßn cã thÓ ®Æt xen kÏ víi c¸c lÖnh xö lý. VÝ dô:
{
int n;
n=23;
cout<<n<<”\n”;
...
int *p=&n;
cout<<p<<”\n”;
...
}
Gi¸ trÞ khëi ®Çu cho mét biÕn cã thÓ thay ®æi t¹i c¸c thêi ®iÓm ch¹y ch ¬ng tr×nh
kh¸c nhau.
Mét vÝ dô minh ho¹ cho kh¶ n¨ng ®Þnh nghÜa kh¾p n¬i lµ cã thÓ khai b¸o c¸c biÕn
®iÒu khiÓn ngay bªn trong c¸c vßng lÆp nÕu biÕn ®ã ch a ® îc khai b¸o tr íc ®ã trong cïng
mét khèi lÖnhcòng nh kh«ng ® îc khai b¸o l¹i ë phÇn sau. Xem ®o¹n ch ¬ng tr×nh sau:
{
...// Ch a cã biÕn I
for(int i=0;i<n;i++)
... // Kh«ng ® îc khai b¸o i n÷a
}
2.3.3 To¸n tö ph¹m vi “:: ”
B×nh th êng, biÕn côc bé che lÊp biÕn toµn côc cïng tªn. Ch¼ng h¹n:
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 12
LËp tr×nh h íng ®èi t îng C++
#include <iostream.h>
int x;
void main()
{
int x=10; //x biÕn côc bé
cout<<x<<”\n”; // x côc bé
}
Trong nh÷ng tr êng hîp cÇn thiÕt, khi muèn truy xuÊt tíi biÕn toµn côc ph¶i sö dông
to¸n tö ph¹m vi “::” tr-íc tªn biÕn.
#include <iostream.h>
int x;
void main()
{
int x=10; //x biÕn côc bé
::x=20; // x toµn côc
cout<<x<<”\n”; // x côc bé
cout<<::x<<”\n”; // x toµn côc
}
2.4 Hµm inline
Trong C++ cã thÓ ®Þnh nghÜa c¸c hµm ® îc thay thÕ trùc tiÕp thµnh m· lÖnh m¸y t¹i
chç gäi (inline) mçi lÇn ® îc tham chiÕu. §iÓm nµy rÊt gièng víi c¸ch ho¹t ®éng cña c¸c
macro cã tham sè trong C. ¦u ®iÓm cña c¸c hµm inline lµ chóng kh«ng ®ßi hái c¸c thñ tôc
bæ sung khi gäi hµm vµ gi¸ trÞ tr¶ vÒ. Do vËy hµm inline ® îc thùc hiÖn nhanh h¬n so víi
c¸c hµm th«ng th êng.
Mét hµm inline ® îc ®Þnh nghÜa vµ ® îc sö dông gièng nh b×nh th êng. §iÓm kh¸c
nhau duy nhÊt ë ®©y lµ ph¶i ®Æt m« t¶ inline tr íc khai b¸o hµm.
XÐt vÝ dô sau ®©y:
VÝ dô 2.7
#include <iostream.h>
#include <math.h>
#include <conio.h>
inline double norme(double vec[3]);
void main()
{
clrscr();
double v1[3],v2[3];
int i
for(i=0;i<3;i++)
{
v1[i]=i;v2[i]=2*i-1;
cout<<”norme cua v1 :”<<norme(v1)<<”-norme cua v2 :”<<norme(v2);
getch();
}
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 13
LËp tr×nh h íng ®èi t îng C++
// §Þnh nghÜa hµm inline
inline double norme(double vec[3]){
double s=0;
for(int i=0;i<3;i++) s+=vec[i]*vec[i];
return(sqrt(s));
}
Norme cua v1 : 2.236063 norme cua v2 : 3.316625
Hµm norme() nh»m môc ®Ých tÝnh chuÈn cña vector víi 3 thµnh phÇn. Tõ kho¸
inline yªu cÇu ch ¬ng tr×nh biªn dÞch xö lý hµm norme kh¸c víi c¸c hµm th«ng th êng. Cô
thÓ lµ, mçi lÇn gäi norme(), tr×nh biªn dÞch ghÐp trùc tiÕp c¸c chØ thÞ t ¬ng øng cña hµm vµo
trong ch ¬ng tr×nh (d íi d¹ng m· m¸y). Do ®ã c¬ chÕ qu¶n lý lêi gäi vµ trë vÒ kh«ng cÇn
n÷a (kh«ng cÇn l u ng÷ c¶nh, sao chÐp c¸c th«ng sè...), nhê ®ã tiÕt kiÖm ® îc thêi gian
thùc hiÖn. Bªn c¹nh ®ã c¸c chØ thÞ t ¬ng øng sÏ ® îc sinh ra mçi khi gäi hµm do ®ã chi phÝ
l u tr÷ t¨ng lªn khi hµm ® îc gäi nhiÒu lÇn.
§iÓm bÊt lîi khi sö dông hµm inline lµ nÕu chóng qu¸ lín vµ ® îc gäi th êng xuyªn
th× kÝch th íc ch ¬ng tr×nh sÏ t¨ng lªn rÊt nhanh. V× lý do nµy, chØ nh÷ng hµm ®¬n gi¶n,
kh«ng chøa c¸c cÊu tróc lÆp míi ® îc khai b¸o inline.
ViÖc sö dông hµm inline so víi macro cã tham sè cã hai ®iÓm lîi. Tr íc hÕt lµ hµm
inline cung cÊp mét c¸ch cã cÊu tróc h¬n khi më réng c¸c hµm ®¬n gi¶n thµnh hµm inline.
Thùc tÕ cho thÊy khi t¹o ra mét macro cã tham sè th êng hay quªn c¸c dÊu ®ãng ngoÆc, rÊt
cÇn ®Õn ®Ó ®¶m b¶o sù më réng néi tuyÕn riªng trong mçi tr êng hîp. Víi macro cã thÓ
g©y ra hiÖu øng phô hoÆc bÞ h¹n chÕ kh¶ n¨ng sö dông. Ch¼ng h¹n víi macro:
#define square(x){x++*x++}
Víi lêi gäi square(a) a lµ mét biÕn sÏ s¶n sinh ra biÓu thøc a++*a++ vµ kÕt qu¶ lµ
thay ®æi gi¸ trÞ cña biÕn a tíi hai lÇn.
Cßn lêi gäi square(3) sÏ g©y lçi biªn dÞch v× ta kh«ng thÓ thùc hiÖn c¸c phÐp to¸n
t¨ng gi¶m trªn c¸c to¸n h¹ng lµ h»ng sè.
ViÖc sö dông hµm inline nh mét gi¶i ph¸p thay thÕ sÏ tr¸nh ® îc c¸c t×nh huèng
nh thÕ. Ngoµi ra, c¸c hµm inline cã thÓ ® îc tèi u bëi tr×nh biªn dÞch. §iÒu quan träng lµ
®Æc t¶ inline chØ lµ mét yªu cÇu, chø kh«ng ph¶i lµ mét chØ thÞ ®èi víi tr×nh biªn dÞch. NÕu
v× mét lý do nµo ®ã tr×nh biªn dÞch kh«ng thÓ ®¸p øng ® îc yªu cÇu( ch¼ng h¹n bªn trong
®Þnh nghÜa hµm inline cã cÊu tróc lÆp) th× hµm sÏ ® îc biªn dÞch nh mét hµm th«ng
th êng vµ yªu cÇu inline sÏ bÞ bá qua.
Hµm inline ph¶i ® îc khai b¸o bªn trong tÖp tin nguån chøa c¸c hµm sö dông nã.
Kh«ng thÓ dÞch t¸ch biÖt c¸c hµm inline.
2.5 Tham chiÕu
Ng«n ng÷ C++ giíi thiÖu mét kh¸i niÖm míi “reference” t¹m dÞch lµ tham chiÕu. B¶n
chÊt cña tham chiÕu lµ mét bÝ danh cña mét vïng nhí ® îc cÊp ph¸t cho mét biÕn nµo ®ã.
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 14
LËp tr×nh h íng ®èi t îng C++
Mét tham chiÕu cã thÓ lµ mét biÕn, tham sè h×nh thøc cña hµm hay dïng lµm gi¸ trÞ
tr¶ vÒ cña hµm. C¸c phÇn tiÕp theo sÏ lÇn l ît giíi thiÖu c¸c kh¶ n¨ng cña tham chiÕu ® îc
sö dông trong ch ¬ng tr×nh viÕt b»ng ng«n ng÷ C++.
2.5.1 Tham chiÕu tíi mét biÕn
XÐt hai chØ thÞ:
int n;
int &p=n;
Trong chØ thÞ thø hai, dÊu “&” ®Ó x¸c ®Þnh p lµ mét biÕn tham chiÕu cßn dÊu “=” vµ
tªn biÕn n ®Ó x¸c ®Þnh vïng nhí mµ p tham chiÕu ®Õn. Lóc nµy c¶ hai ®Þnh danh p vµ n
cïng x¸c ®Þnh vïng nhí ® îc cÊp ph¸t cho biÕn n. Nh vËy c¸c chØ thÞ sau ®©y:
n=3;
cout<<p;
Cho kÕt qu¶ 3 trªn mµn h×nh.
XÐt vÒ b¶n chÊt tham chiÕu vµ tham trá gièng nhau v× cïng chØ ®Õn c¸c ®èi t îng cã
®Þc chØ, cïng ® îc cÊp ph¸t ®Þa chØ khi khai b¸o. Nh ng c¸ch sö dông chóng th× kh¸c nhau.
Khi nãi ®Õn tham chiÕu “&p” ta ph¶i g¸n nã víi mét biÕn nµo ®ã ®· khai b¸o qua phÐp
“&p=n”, trong khi ®ã khai b¸o con trá “*p” kh«ng nhÊt thiÕt ph¶i khëi t¹o gi¸ trÞ cho nã.
Trong ch ¬ng tr×nh biÕn trá cã thÓ tham chiÕu ®Õn nhiÒu biÕn kh¸c nhau nh ng tham chiÕu
th× chØ duy nhÊt mét biÕn ® îc g¸n khi khai b¸o. Cã nghÜa lµ sau khi khëi t¹o cho tham
chiÕu g¾n víi mét biÕn nµo ®ã råi th× ta kh«ng thÓ thay ®æi ®Ó g¸n tham chiÕu cho mét biÕn
kh¸c.
XÐt c¸c chØ thÞ d íi ®©y:
VÝ dô 2.8
int n=3,m=4;
int *p;
p=&n;
*p=m;
// p trá ®Õn n
// g¸n gi¸ trÞ cña m cho n th«ng qua p
...
p=&m;
int &q=n;
q=4;
// p trá ®Õn m
// Khai b¸o tham chiÕu q trá ®Õn n
// G¸n gi¸ trÞ cña n b»ng 4
...
q=m;
// G¸n gi¸ trÞ cña n b»ng gi¸ trÞ cña m
Nãi mét c¸ch ®¬n gi¶n, tham chiÕu cña mét biÕn gièng nh bÝ danh cña mét ng êi
nµo ®ã. Cã nghÜa lµ ®Ó chØ ®Õn mét ng êi cô thÓ nµo ®ã ta cã thÓ dïng tªn hay bÝ danh cña
anh ta. Do vËy, ®Ó truy nhËp ®Õn vïng nhí t ¬ng øng cña mét biÕn ta cã thÓ sö dông tªn
biÕn hoÆc tªn tham chiÕu t ¬ng øng. §èi víi con ng êi, bÝ danh bao giê cïng nh»m nãi ®Õn
mét ng êi ®· tån t¹i, vµ nh vËy tham chiÕu còng ph¶i ® îc khai b¸o vµ khëi t¹o sau khi
biÕn ® îc khai b¸o. Ch ¬ng tr×nh sau ®©y sÏ g©y lçi biªn dÞch do tham chiÕu y ch a ® îc
khëi t¹o.
VÝ dô 2.9
Ch ¬ng tr×nh sai:
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 15
LËp tr×nh h íng ®èi t îng C++
#include <iostream.h>
void main(){
int x=3, &y; // lçi v× y ph¶i khëi t¹o
cout<<”x= “<<x<<”\n”;
cout<<”y= “<<y<<”\n”;
y=7;
cout<<”x= “<<x<<”\n”;
cout<<”y= “<<y<<”\n”;
}
Ch ¬ng tr×nh ®óng:
#include <iostream.h>
void main(){
int x=3, &y=x;
cout<<”x= “<<x<<”\n”;
cout<<”y= “<<y<<”\n”;
y=7;
cout<<”x= “<<x<<”\n”;
cout<<”y= “<<y<<”\n”;
}
x=3
y=3
x=7
y=7
L u ý cuèi cïng lµ kh«ng thÓ g¸n mét tham chiÕu ®Õn mét h»ng sè trõ trong tr êng
hîp cã tõ kho¸ const ®øng tr íc khai b¸o tham chiÕu. DÔ dµng kiÓm tra c¸c nhËn xÐt sau:
int &p=3;
// Kh«ng hîp lÖ
// Hîp lÖ
const int &p=3;
2.5.2 TruyÒn tham sè cho hµm b»ng tham chiÕu
Trong C, c¸c tham sè vµ gi¸ trÞ tr¶ vÒ cña mét hµm ® îc truyÒn b»ng gi¸ trÞ. §Ó gi¶
lËp c¬ chÕ truyÒn tham biÕn ta ph¶i sö dông con trá.
Trong C++, viÖc dïng kh¸i niÖm tham chiÕu trong khai b¸o tham sè h×nh thøc cña
hµm sÏ yªu cÇu ch ¬ng tr×nh dÞch truyÒn ®Þa chØ cña biÕn ®ã cho hµm vµ hµm sÏ thao t¸c
trùc tiÕp trªn c¸c biÕn ®ã. Ch ¬ng tr×nh sau ® a ra ba c¸ch viÕt kh¸c nhau cña hµm thùc
hiÖn viÖc ho¸n ®æi néi dung hai biÕn.
VÝ dô 2.10
#include <iostream.h>
#include <conio.h>
// Hµm ho¸n vÞ víi tham sè lµ tham trÞ
void hoanvi1(int x, int y)
{
int temp=x;
x=y;
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 16
LËp tr×nh h íng ®èi t îng C++
y=temp;
}
// Hµm ho¸n vÞ víi tham sè lµ tham trá
void hoanvi2(int *x, int *y)
{
int temp=*x;
*x=*y;
*y=temp;
}
// Hµm ho¸n vÞ víi tham sè lµ tham chiÕu
void hoanvi3(int &x, int &y)
{
int temp=x;
x=y;
y=temp;
}
void main()
{
int a=3, b=4;
clrscr();
cout<<”Truoc khi goi hoanvi1: \n”;
cout<<” a=”<<a<<” b= “<<b<<”\n”;
hoanvi1(a,b);
cout<<”Sau khi goi hoanvi1 :\n”;
cout<<” a=”<<a<<” b= “<<b<<”\n”;
a=3;b=4;
cout<<”Truoc khi goi hoanvi2: \n”;
cout<<” a=”<<a<<” b= “<<b<<”\n”;
hoanvi2(a,b);
cout<<”Sau khi goi hoanvi2 :\n”;
cout<<” a=”<<a<<” b= “<<b<<”\n”;
a=3;b=4;
cout<<”Truoc khi goi hoanvi3: \n”;
cout<<” a=”<<a<<” b= “<<b<<”\n”;
hoanvi3(a,b);
cout<<”Sau khi goi hoanvi3 :\n”;
cout<<” a=”<<a<<” b= “<<b<<”\n”;
getch();
}
Truoc khi goi hoanvi1:
a=3 b=4
Sau khi goi hoanvi1:
a=3 b=4
Truoc khi goi hoanvi2:
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 17
LËp tr×nh h íng ®èi t îng C++
a=3 b=4
Sau khi goi hoanvi2:
a=4 b=3
Truoc khi goi hoanvi3:
a=3 b=4
Sau khi goi hoanvi3:
a=4 b=3
Trong ch ¬ng tr×nh trªn, ta truyÒn tham sè a, b cho hµm hoanvi1() theo tham trÞ nªn
gi¸ trÞ cña chóng kh«ng bÞ thay ®æi tr íc vµ sau khi gäi hµm.
Gi¶i ph¸p ® a ra trong hµm hoanvi2() lµ thay v× truyÒn trùc tiÕp gi¸ trÞ hai biÕn a, b ta
truyÒn ®Þa chØ cña chóng råi th«ng qua c¸c ®Þa chØ nµy ®Ó x¸c ®Þnh gÝa trÞ c¸c biÕn. B»ng
c¸ch ®ã gi¸ trÞ cña hai biÕn a vµ b sÏ ho¸n ®æi cho nhau sau lêi gäi hµm hoanvi2(). Kh¸c víi
hµm hoanvi2(), hµm hoanvi3() ® a ra gi¶i ph¸p sö dông tham chiÕu. C¸c tham sè h×nh thøc
lµ c¸c tham chiÕu ®Õn c¸c tham sè thùc ® îc truyÒn cho hµm. Nhê vËy mµ gi¸ trÞ cña hai
tham sè thùc a vµ b cã thÓ ho¸n ®æi ® îc cho nhau.
Cã mét vÊn ®Ò mµ ph¸t sinh lµ “lµm thÕ nµo ®Ó khëi t¹o c¸c tham sè h×nh thøc lµ
tham chiÕu”. Ghi nhí r»ng ®iÒu nµy ta kh«ng cÇn quan t©m v× ®iÒu ®ã ®-îc thùc hiÖn tù
®éng trong mçi lêi gäi hµm chø kh«ng ph¶i trong ®Þnh nghÜa. Tõ ®©y ta cã mét nhËn xÐt
quan träng: Tham sè øng víi tham sè h×nh thøc lµ tham chiÕu ph¶i lµ biÕn trõ tr êng hîp cã
tõ kho¸ const ®øng tr íc khai b¸o tham sè h×nh thøc. Ch¼ng h¹n kh«ng thÓ thùc hiÖn lêi gäi
hµm ho¸n vÞ nh sau:
hoanvi3(2,3);
Ta sÏ thÊy lîi Ých cña viÖc truyÒn tham sè b»ng tham chiÕu trong phÇn “Hµm thiÕt lËp
sao chÐp”. Chó ý: Khi muèn truyÒn tham biÕn mét biÕn con trá ta lµm nh sau:
int &*adr; /* adr lµ mét tham chiÕu ®Õn mét biÕn con trá trá ®Õn mét biÕn nguyªn*/
2.5.3 Gi¸ trÞ tr¶ vÒ cña hµm lµ tham chiÕu
Mét ®Þnh nghÜa hµm cã d¹ng nh sau:
<type> & tªn_hµm(danh s¸ch c¸c ®èi)
{
...
return<biÕn cã ph¹m vi toµn côc>
}
Trong tr êng hîp nµy biÓu thøc ® îc tr¶ vÒ 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× chØ khi ®ã míi cã thÓ sö dông ® îc gi¸ trÞ cña hµm.
Khi 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 viªc thùc hiÖn hµm vµ do vËy, tham chiÕu cña hµm còng kh«ng cã ý
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 kú dÞ trong
®ã vÕ tr¸i lµ lêi gäi hµm chø kh«ng ph¶i lµ tªn biÕn. §iÒu nµy hoµn toµn hîp lý bëi lÏ 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( biÓu
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 18
LËp tr×nh h íng ®èi t îng C++
thøc 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.
XÐt vÝ dô sau ®©y:
VÝ dô 2.11
#include <iostream.h>
#include <conio.h>
int a[5];
int &fr(int *d, int i);
void main()
{
clrscr();
cout<<”Nhap gia tri cho mang a :\n”;
for(int i=0;i<5;i++)
{
cout<<”a[“<<i<<”] = “;
cin>>fr(a,i);
}
cout<<”Mang sau khi nhap :\n”;
for(i=0;i<5;i++)
cout<<a[i]<<” “;
cout<<”\n”;
getch();
}
int &fr(int *d, int i)
{
return d[i];
}
Nhap gia tri cho mang a :
a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5
Mang sau khi nhap:
1 2 3 4 5
2.6 §Þnh nghÜa chång hµm
C++ cho phÐp sö dông mét tªn cho nhiÒu hµm kh¸c nhau, ta gäi ®ã lµ sù chång hµm.
Trong tr êng hîp ®ã, c¸c hµm sÏ kh¸c nhau ë gi¸ trÞ tr¶ vÒ vµ danh s¸ch kiÓu c¸c tham sè.
Ch¼ng h¹n chóng ta muèn ®Þnh nghÜa c¸c hµm tr¶ vÒ sè nhá nhÊt trong :
1. hai sè nguyªn
2. hai sè thùc
3. hai ký tù
4. ba sè nguyªn
5. mét d·y c¸c sè nguyªn...
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 19
LËp tr×nh h íng ®èi t îng C++
DÜ nhiªn cã thÓ t×m cho mçi hµm mét tªn riªng. Lîi dông kh¶ n¨ng chång hµm ta cã
thÓ viÕt ch ¬ng tr×nh nh sau:
VÝ dô 2.12
#include <iostream.h>
// Hµm nguyªn mÉu
int min(int, int);
//Hµm 1
// Hµm 2
// Hµm 3
//Hµm 4
//Hµm 5
double min(double, double);
char min(char, char);
int min(int , int, int );
int min(int, int*);
void main()
{
int n=10, p=12, q=-12;
double x=2.3, y=-1.2;
char c=’A’, d=’Q’;
int td[7]={1,3,4,-2,0,23,9};
cout<<”min (n,p) : “<<min(n,p)<<”\n”;
cout<<”min(n,p,q) :”<<min(n,p,q)<<”\n”;
cout<<”min(c,d) :”<<min(c,d)<<”\n”;
cout<<”min(x,y) :”<<min(x,y)<<”\n”;
cout<<”min(td) :”<<min(7,td)<<”\n”;
cout<<”min(n,x) :”<<min(n,x)<<”\n”;
// Hµm 1
// Hµm 4
// Hµm 3
// Hµm 2
// Hµm 5
// Hµm 2
}
int min(int a, int b)
{ return (a>b?b:a);}
int min(int a, int b, int c)
{return (min(a,min(b,c)));}
double min(double a, double b)
{ return(a>b?b:a);}
char min(char a, char b)
{ return(a>b?b:a);}
int min(int a, int *t)
{
int res=t[0];
for(int i=0;i<a;i++) res=min(res,t[i]);
return res;
}
C«ng ty Tin häc vµ c«ng nghÖ hµng h¶i
Trang 20
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình hướng đối tượng C++", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
giao_trinh_lap_trinh_huong_doi_tuong_c.pdf

