gt laptrinhhuongdoituong_chinh thuc

156
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 nhnh÷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 nhth«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

Upload: map

Post on 05-Dec-2015

215 views

Category:

Documents


0 download

DESCRIPTION

Giáo trình lập trình hướng đối tượng

TRANSCRIPT

Page 1: GT LapTrinhHuongDoiTuong_Chinh Thuc

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

Page 2: GT LapTrinhHuongDoiTuong_Chinh Thuc

2

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 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.

Page 3: GT LapTrinhHuongDoiTuong_Chinh Thuc

3

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 kiÓu d−íi-lªn (bottom-up).

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.

Page 4: GT LapTrinhHuongDoiTuong_Chinh Thuc

4

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 HINH_CN. C¸c ph−¬ng

thøc nhËp sè liÖu cho HINH_CN, 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

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Þ

Page 5: GT LapTrinhHuongDoiTuong_Chinh Thuc

5

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ö 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 nh−ng cïng dïng chung mét giao diÖn bªn ngoµi

(ch¼ng h¹n tªn gäi).

Page 6: GT LapTrinhHuongDoiTuong_Chinh Thuc

6

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:

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.

CONGNHAN.TINHLUONG (Hoten)

§èi t−îng Th«ng b¸o Th«ng tin

Page 7: GT LapTrinhHuongDoiTuong_Chinh Thuc

7

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¸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.

Page 8: GT LapTrinhHuongDoiTuong_Chinh Thuc

8

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

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Ö

Page 9: GT LapTrinhHuongDoiTuong_Chinh Thuc

9

®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.

...

Page 10: GT LapTrinhHuongDoiTuong_Chinh Thuc

10

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

Hµm tr¶ vÒ gi¸ trÞ tham chiÕu

Hµm víi ®èi 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++ nh−ng ®· 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 //. Nãi chung, 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.

VÝ dô: /* §©y lµ

chó thÝch trong C */

// §©y lµ chó thÝch trong C++

Page 11: GT LapTrinhHuongDoiTuong_Chinh Thuc

11

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])

{

float tg=x[i];

x[i]=x[j];

x[j]=tg;

}

printf("\n Day sau khi sap xep\n");

for (i=0;i<n;++i)

printf("%0.2f ",x[i]);

Page 12: GT LapTrinhHuongDoiTuong_Chinh Thuc

12

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 = n1...

31

211 ++++

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>

Page 13: GT LapTrinhHuongDoiTuong_Chinh Thuc

13

#include <stdio.h>

void main()

{

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("\n\n 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("\n\n Phan tu max:");

Page 14: GT LapTrinhHuongDoiTuong_Chinh Thuc

14

printf("\n Co gia tri=%6.1f", smax);

printf("\n\n 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;

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µ l−u 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:

Page 15: GT LapTrinhHuongDoiTuong_Chinh Thuc

15

cout<<setiosflags(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;

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 :";

Page 16: GT LapTrinhHuongDoiTuong_Chinh Thuc

16

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)

{

Page 17: GT LapTrinhHuongDoiTuong_Chinh Thuc

17

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 << "\n\n 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 << "\n\n"<< "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.

Page 18: GT LapTrinhHuongDoiTuong_Chinh Thuc

18

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

int *a = new int[100]; //cÊp ph¸t bé nhí ®Ó l−u 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

Page 19: GT LapTrinhHuongDoiTuong_Chinh Thuc

19

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";

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;

Page 20: GT LapTrinhHuongDoiTuong_Chinh Thuc

20

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

Page 21: GT LapTrinhHuongDoiTuong_Chinh Thuc

21

tong++; //a=2

++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, nh−ng 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í, nh−ng

kh«ng cho phÐp thay ®æi gi¸ trÞ nµy.

H»ng tham chiÕu th−êng ®−îc sö dông lµm ®èi 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, nh−ng 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

Page 22: GT LapTrinhHuongDoiTuong_Chinh Thuc

22

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)

{

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;

Page 23: GT LapTrinhHuongDoiTuong_Chinh Thuc

23

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)

{

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);

Page 24: GT LapTrinhHuongDoiTuong_Chinh Thuc

24

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<<"\n\nDanh sach thi sinh \n";

for(i=0;i<n;++i)

if(ts[i].td>=dc)

ints(ts[i]);

else

Page 25: GT LapTrinhHuongDoiTuong_Chinh Thuc

25

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)

{

Page 26: GT LapTrinhHuongDoiTuong_Chinh Thuc

26

if(x[i]>x[vtmax]) vtmax=i;

if(x[i]<x[vtmin]) vtmin=i;

}

}

void main()

{

float a[20][20];

int m,n;

clrscr();

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>;

}

Page 27: GT LapTrinhHuongDoiTuong_Chinh Thuc

27

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 cuc z

{

return z;

}

void main()

{

f()=50;//z=50

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;

Page 28: GT LapTrinhHuongDoiTuong_Chinh Thuc

28

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 ®èi sè cã gi¸ trÞ mÆc ®Þnh

C++ cho phÐp x©y dùng hµm víi c¸c ®èi sè ®−îc khëi g¸n gi¸ trÞ mÆc ®Þnh.

Quy t¾c x©y dùng hµm víi ®èi sè mÆc ®Þnh nh− sau:

• C¸c ®èi cã gi¸ trÞ mÆc ®Þnh cÇn lµ c¸c ®èi 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 ®èi 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)

{

//C¸c c©u lÖnh

}

Page 29: GT LapTrinhHuongDoiTuong_Chinh Thuc

29

Chó ý: §èi víi c¸c hµm cã ®èi 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 ®èi 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 ch−ong 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

Page 30: GT LapTrinhHuongDoiTuong_Chinh Thuc

30

ph¸t vïng nhí cho c¸c ®èi 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

#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 nh−ng 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 Ch−ong tr×nh sau sö dông hµm inline ®Ó tÝnh chu vi vµ diÖn tÝch h×nh

Page 31: GT LapTrinhHuongDoiTuong_Chinh Thuc

31

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)

{

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()

Page 32: GT LapTrinhHuongDoiTuong_Chinh Thuc

32

{

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 ®èi

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ã 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

Page 33: GT LapTrinhHuongDoiTuong_Chinh Thuc

33

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)

{

Page 34: GT LapTrinhHuongDoiTuong_Chinh Thuc

34

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)

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

Page 35: GT LapTrinhHuongDoiTuong_Chinh Thuc

35

nguyªn a, nh−ng 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);

getch();

}

Page 36: GT LapTrinhHuongDoiTuong_Chinh Thuc

36

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.

Page 37: GT LapTrinhHuongDoiTuong_Chinh Thuc

37

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

Page 38: GT LapTrinhHuongDoiTuong_Chinh Thuc

38

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 ®ã, nh−ng 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

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 .

Page 39: GT LapTrinhHuongDoiTuong_Chinh Thuc

39

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

{

private :

int x,y ;

public :

void nhapsl( )

{

cout << "\n Nhap hoanh do va tung do cua diem:";

cin >>x>>y ;

}

Page 40: GT LapTrinhHuongDoiTuong_Chinh Thuc

40

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();

Page 41: GT LapTrinhHuongDoiTuong_Chinh Thuc

41

getch();

}

Chó ý: C¸c hµm tù do cã thÓ cã c¸c ®èi lµ ®èi t−îng nh−ng 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 ®èi sè mÆc ®Þnh:

#include <iostream.h>

#include <conio.h>

class Box

{

private:

Page 42: GT LapTrinhHuongDoiTuong_Chinh Thuc

42

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;

}

void main()

{

Box ob;

int x = 10, y = 12, z = 15;

cout <<"Dai Rong Cao Thetich\n";

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

Page 43: GT LapTrinhHuongDoiTuong_Chinh Thuc

43

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)

{

strcpy(dongtu, in_dongtu);

}

inline char* phrase::get_phrase(void)

{

strcpy(cumtu,dongtu);

strcat(cumtu," the ");

Page 44: GT LapTrinhHuongDoiTuong_Chinh Thuc

44

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);

};

Page 45: GT LapTrinhHuongDoiTuong_Chinh Thuc

45

void constants::print_it(const int data_value)

{

number = data_value;

cout << number << "\n";

}

void main()

{

constants num;

const int START = 3;

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:

Page 46: GT LapTrinhHuongDoiTuong_Chinh Thuc

46

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;

}

};

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++)

Page 47: GT LapTrinhHuongDoiTuong_Chinh Thuc

47

{ 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

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 ®iÒu nµy

®−î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 ;

}

Cã thÓ xem 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 ®ã.

Page 48: GT LapTrinhHuongDoiTuong_Chinh Thuc

48

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 ®èi ®Æ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 ®èi 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();

Page 49: GT LapTrinhHuongDoiTuong_Chinh Thuc

49

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

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 (...)

{

...

}

Page 50: GT LapTrinhHuongDoiTuong_Chinh Thuc

50

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 (...)

{

...

}

} ;

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

Page 51: GT LapTrinhHuongDoiTuong_Chinh Thuc

51

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);

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);

Page 52: GT LapTrinhHuongDoiTuong_Chinh Thuc

52

}

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

Page 53: GT LapTrinhHuongDoiTuong_Chinh Thuc

53

{

int v1;

public:

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

Page 54: GT LapTrinhHuongDoiTuong_Chinh Thuc

54

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 ch−a 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:

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 ch−a 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 ch−a khai b¸o th× thµnh phÇn tÜnh ch−a tån t¹i. H·y xem ch−¬ng

tr×nh sau:

VÝ dô 3.10

#include <conio.h>

#include <iostream.h>

class HDBH

{

Page 55: GT LapTrinhHuongDoiTuong_Chinh Thuc

55

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 ch−a khai b¸o, nªn ch−a 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>

class HDBH

{

private:

int shd;

char *tenhang;

double tienban;

static int tshd;

static double tstienban;

public:

Page 56: GT LapTrinhHuongDoiTuong_Chinh Thuc

56

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 ch−a 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;

Page 57: GT LapTrinhHuongDoiTuong_Chinh Thuc

57

char *tenhang;

double tienban;

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()

Page 58: GT LapTrinhHuongDoiTuong_Chinh Thuc

58

{

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();

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 l−u ý 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ã ®èi sè hoÆc kh«ng cã ®èi sè.

- Trong mét líp cã thÓ cã nhiÒu hµm t¹o (cïng tªn nh−ng kh¸c c¸c ®èi sè).

VÝ dô 3.13

class DIEM

Page 59: GT LapTrinhHuongDoiTuong_Chinh Thuc

59

{

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ã ch−a ®−îc x¸c ®Þnh.

VÝ dô 3.14

#include <conio.h>

#inlcule <iostream.h>

class DIEM

{

private:

int x,y;

public:

void in()

{

cout <<”\n” << y <<” ” << m;

}

};

void main()

{

DIEM d;

Page 60: GT LapTrinhHuongDoiTuong_Chinh Thuc

60

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ã ®èi sè kiÓu líp, th× ®èi sè chØ xem lµ c¸c tham sè h×nh

thøc, v× vËy khai b¸o ®èi 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;

Page 61: GT LapTrinhHuongDoiTuong_Chinh Thuc

61

}

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)

Page 62: GT LapTrinhHuongDoiTuong_Chinh Thuc

62

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, nh−ng l¹i sö dông c¸c khai b¸o kh«ng tham sè nh− vÝ dô sau:

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();

Page 63: GT LapTrinhHuongDoiTuong_Chinh Thuc

63

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 ch−a

®−î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;

}

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(); }

Page 64: GT LapTrinhHuongDoiTuong_Chinh Thuc

64

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++; }

Page 65: GT LapTrinhHuongDoiTuong_Chinh Thuc

65

void main()

{

rectangle small, medium, large;

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

Page 66: GT LapTrinhHuongDoiTuong_Chinh Thuc

66

C©u lÖnh nµy cã ý nghÜa nh− sau:

- NÕu trong líp ABC ch−a 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

#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;

}

};

Page 67: GT LapTrinhHuongDoiTuong_Chinh Thuc

67

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;

}

};

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 ch−a ®¸p øng ®−îc yªu cÇu.

Page 68: GT LapTrinhHuongDoiTuong_Chinh Thuc

68

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, nh−ng ®éc lËp

víi d. NghÜa lµ khi d thay ®æi th× u kh«ng bÞ ¶nh h−ëng g×. ThÕ nh−ng 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

Page 69: GT LapTrinhHuongDoiTuong_Chinh Thuc

69

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.

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;

Page 70: GT LapTrinhHuongDoiTuong_Chinh Thuc

70

}

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];

}

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>

Page 71: GT LapTrinhHuongDoiTuong_Chinh Thuc

71

#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)

{

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;

Page 72: GT LapTrinhHuongDoiTuong_Chinh Thuc

72

}

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();

}

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

Page 73: GT LapTrinhHuongDoiTuong_Chinh Thuc

73

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ã ®èi 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();

Page 74: GT LapTrinhHuongDoiTuong_Chinh Thuc

74

~Count();

};

int Count::counter;

Count::Count()

{

counter++;

obj_id = counter;

}

Count::~Count()

{

counter--;

cout<<"Doi tuong "<<obj_id<<" duoc huy bo\n";

}

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();

}

Page 75: GT LapTrinhHuongDoiTuong_Chinh Thuc

75

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

Page 76: GT LapTrinhHuongDoiTuong_Chinh Thuc

76

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. X©y dùng 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

Page 77: GT LapTrinhHuongDoiTuong_Chinh Thuc

77

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.

8. X©y dùng líp ®a thøc vµ c¸c ph−¬ng thøc céng, trõ hai ®a thøc.

9. 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.

10. X©y dùng líp vector ®Ó l−u 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¬.

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 ®ã).

11. 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

Page 78: GT LapTrinhHuongDoiTuong_Chinh Thuc

78

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è l−u ý 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 ®èi 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 ®èi 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, nh−ng kh«ng thÓ lµ hµm tÜnh. Danh s¸ch ®èi

sè ®−îc khai b¸o t−¬ng tù khai b¸o biÕn nh−ng 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ã ®èi sè cho to¸n tö mét

ng«i vµ mét ®èi 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 ®èi sè cho to¸n tö mét ng«i vµ hai

®èi 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è l−u ý 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’)

Page 79: GT LapTrinhHuongDoiTuong_Chinh Thuc

79

- 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 nh−ng 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

{

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();

Page 80: GT LapTrinhHuongDoiTuong_Chinh Thuc

80

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;

}

void hienthi()

{ cout<<x<<" "<<y <<" " <<z<<endl;}

};

void main()

{

clrscr();

Diem d1(3,-6,8),d2(4,3,7),d3;

d3=d1+d2;

Page 81: GT LapTrinhHuongDoiTuong_Chinh Thuc

81

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();

}

Page 82: GT LapTrinhHuongDoiTuong_Chinh Thuc

82

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();

}

Page 83: GT LapTrinhHuongDoiTuong_Chinh Thuc

83

VÝ dô 4.5

#include <iostream.h>

#include <conio.h>

class Diem

{

private:

int x,y;

public:

Diem() {}

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)

Page 84: GT LapTrinhHuongDoiTuong_Chinh Thuc

84

{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);

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 ®èi sè cña to¸n tö chØ cÇn dïng mét

®èi 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)

{

Page 85: GT LapTrinhHuongDoiTuong_Chinh Thuc

85

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 ;

c.b= c1.b + c2.b ;

return (c);

}

void hienthi(sophuc c)

{ cout<<c.a<<" + "<<c.b<<"i"<<endl; }

Page 86: GT LapTrinhHuongDoiTuong_Chinh Thuc

86

};

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 ;

}

Page 87: GT LapTrinhHuongDoiTuong_Chinh Thuc

87

string string::operator =(string s2)

{

strcpy(s,s2.s) ;

return *this;

}

int string::operator <(string s2)

{

return strcmp(s,s2.s)<0 ;

}

int string::operator >(string s2)

{

return strcmp(s,s2.s)>0 ;

}

int string::operator ==(string s2)

{

return strcmp(s,s2.s)==0 ;

}

void main()

{ clrscr();

string o1 ("Trung Tam "), o2 (" Tin hoc"), o3;

cout<<"o1 = "<<o1.get()<<'\n';

cout<<"o2 = "<<o2.get()<<'\n';

if (o1 > o2)

cout << "o1 > o2 \n";

if (o1 < o2)

cout << "o1 < o2 \n";

if (o1 == o2)

cout << "o1 bang o3 \n";

o3=o1+o2;

cout<<"o3 ="<<o3.get()<<'\n'; //Trung tam tin hoc

o3=o2;

cout<<"o2 = "<<o2.get()<<'\n'; //Tin hoc

cout<<"o3 = "<<o3.get()<<'\n'; //Tin hoc

if (o2 == o3)

Page 88: GT LapTrinhHuongDoiTuong_Chinh Thuc

88

cout << "o2 bang o3 \n";

getch();

}

4.4. §Þnh nghÜa chång c¸c to¸n tö ++ , --

Ta cã thÓ ®Þnh nghÜa chång cho c¸c to¸n tö ++/-- theo quy ®Þnh sau:

- To¸n tö ++/-- d¹ng tiÒn tè tr¶ vÒ mét tham chiÕu ®Õn ®èi t−îng thuéc líp.

- To¸n tö ++/-- d¹ng tiÒn tè tr¶ vÒ mét ®èi t−îng thuéc líp.

VÝ dô 4.10

#include <iostream.h>

#include <conio.h>

class Diem

{

private:

int x,y;

public:

Diem() {x = y = 0;}

Diem(int x1, int y1)

{x = x1;

y = y1;}

Diem & operator ++(); //qua tai toan tu ++ tien to

Diem operator ++(int); //qua tai toan tu ++ hau to

Diem & operator --(); //qua tai toan tu -- tien to

Diem operator --(int); //qua tai toan tu -- hau to

void hienthi()

{

cout<<" x = "<<x<<" y = "<<y;

}

};

Diem & Diem::operator ++()

{

x++;

y++;

return (*this);

}

Page 89: GT LapTrinhHuongDoiTuong_Chinh Thuc

89

Diem Diem::operator ++(int)

{

Diem temp = *this;

++*this;

return temp;

}

Diem & Diem::operator --()

{

x--;

y--;

return (*this);

}

Diem Diem::operator --(int)

{

Diem temp = *this;

--*this;

return temp;

}

void main()

{

clrscr();

Diem d1(5,10),d2(20,25),d3(30,40),d4(50,60);

cout<<"\nd1 : ";d1.hienthi();

++d1;

cout<<"\n Sau khi tac dong cac toan tu tang

truoc :";

cout<<"\nd1 : ";d1.hienthi();

cout<<"\nd2 : ";d2.hienthi();

d2++;

cout<<" \n Sau khi tac dong cac toan tu tang

sau";

cout<<"\nd2 : ";d2.hienthi();

cout<<"\nd3 : ";d3.hienthi();

--d3;

Page 90: GT LapTrinhHuongDoiTuong_Chinh Thuc

90

cout<<"\n Sau khi tac dong cac toan tu giam

truoc :";

cout<<"\nd3 : ";d3.hienthi();

cout<<"\nd4 : ";d4.hienthi();

d4--;

cout<<"\n Sau khi tac dong cac toan tu giam

sau : ";

cout<<"\nd4 : ";d4.hienthi();

getch();

}

Ch−¬ng tr×nh cho kÕt qu¶ nh− sau:

d1 : x = 5 y = 10 Sau khi tac dong cac toan tu tang truoc : d1 : x = 6 y = 11 d2 : x = 20 y = 25 Sau khi tac dong cac toan tu tang sau d2 : x = 21 y = 26 d3 : x = 30 y = 40 Sau khi tac dong cac toan tu giam truoc : d3 : x = 29 y = 39 d4 : x = 50 y = 60 Sau khi tac dong cac toan tu giam sau : d4 : x = 49 y = 59 Chó ý: §èi sè int trong d¹ng hËu tè lµ b¾t buéc, dïng ®Ó ph©n biÖt víi d¹ng tiÒn

tè, th−êng nã mang trÞ mÆc ®Þnh lµ 0.

4.5. §Þnh nghÜa chång to¸n tö << vµ >>

Ta cã thÓ ®Þnh nghÜa chång cho hai to¸n tö vµo/ra << vµ >> kÕt hîp víi cout

vµ cin (cout<< vµ cin>>), cho phÐp c¸c ®èi t−îng ®øng bªn ph¶i chóng. Lóc ®ã

ta cã thÓ thùc hiÖn c¸c thao t¸c vµo ra nh− nhËp d÷ liÖu tõ bµn phÝm cho c¸c ®èi

t−îng, hiÓn thÞ gi¸ trÞ thµnh phÇn d÷ liÖu cña c¸c ®èi t−îng ra mµn h×nh. Hai hµm

to¸n tö << vµ >> ph¶i lµ hµm tù do vµ khai b¸o lµ hµm b¹n cña líp.

VÝ dô 4.11

#include <iostream.h>

#include <conio.h>

class SO

{

Page 91: GT LapTrinhHuongDoiTuong_Chinh Thuc

91

private:

int giatri;

public:

SO(int x=0)

{

giatri = x;

}

SO (SO &tso)

{

giatri = tso.giatri;

}

friend istream& operator>>(istream&,SO&);

friend ostream& operator<<(ostream&,SO&);

};

void main(){

clrscr();

SO so1,so2;

cout<<"Nhap du lieu cho so1 va so2 " << endl;

cin>>so1;

cin>>so2;

cout<<"Gia tri so1 la : " <<so1

<<" so 2 la : "<<so2<<endl;

getch();

}

istream& operator>>(istream& nhap,SO& so)

{

cout << "Nhap gia tri so :";

nhap>> so.giatri;

return nhap; }

ostream& operator<<(ostream& xuat,SO& so)

{

xuat<< so.giatri;

return xuat;

}

Page 92: GT LapTrinhHuongDoiTuong_Chinh Thuc

92

Bμi tËp

1. §Þnh nghÜa c¸c phÐp to¸n t¶i béi =, ==, ++, --, +=, <<, >> trªn líp Time (bµi

tËp 1 ch−¬ng 3).

2. §Þnh nghÜa c¸c phÐp to¸n t¶i béi =, ==, ++, --, +=, <<, >> trªn líp Date (bµi

tËp 2 ch−¬ng 3).

3. §Þnh nghÜa c¸c phÐp to¸n t¶i béi +, -, *, =, ==, != trªn líp c¸c ma trËn vu«ng.

4. §Þnh nghÜa c¸c phÐp to¸n t¶i béi +, -, * trªn líp ®a thøc.

5. §Þnh nghÜa c¸c phÐp to¸n t¶i béi +, -, *, /, =, ==, +=, -=, *=, /= , <, >, <=, >=,

!= , ++, -- trªn líp Phanso (bµi tËp 11 ch−¬ng 3).

6. Ma trËn ®−îc xem lµ mét vect¬ mµ mçi thµnh phÇn cña nã lµ mét vect¬. Theo

nghÜa ®ã, h·y ®Þnh nghÜa líp Matran dùa trªn vect¬. T×m c¸ch ®Ó ch−¬ng

tr×nh dÞch hiÓu ®−îc phÐp truy nhËp m[i][j], trong ®ã m lµ mét ®èi t−îng thuéc

líp Matran.

Page 93: GT LapTrinhHuongDoiTuong_Chinh Thuc

93

Ch−¬ng 5

kÕ thõa Ch−¬ng 5 tr×nh bµy c¸c vÊn ®Ò sau:

§¬n kÕ thõa, ®a kÕ thõa

Hµm t¹o vµ hµm hñy ®èi víi sù kÕ thõa

Hµm ¶o, líp c¬ së ¶o

5.1. Giíi thiÖu

KÕ thõa lµ mét trong c¸c kh¸i niÖm c¬ së cña ph−¬ng ph¸p lËp tr×nh h−íng

®èi t−îng. TÝnh kÕ thõa cho phÐp ®Þnh nghÜa c¸c líp míi tõ c¸c líp ®· cã. Mét

líp cã thÓ lµ líp c¬ së cho nhiÒu líp dÉn xuÊt kh¸c nhau. Líp dÉn xuÊt sÏ kÕ

thõa mét sè thµnh phÇn (d÷ liÖu vµ hµm) cña líp c¬ së, ®ång thêi cã thªm nh÷ng

thµnh phÇn míi. Cã hai lo¹i kÕ thõa lµ: ®¬n kÕ thõa vµ ®a kÕ thõa, cã thÓ minh

häa qua c¸c h×nh vÏ sau ®©y:

H×nh 5.1. §¬n kÕ thõa, líp A lµ líp c¬ së cña líp B

(a) (b) (c)

H×nh 5.2. §a kÕ thõa

H×nh (a): Líp A lµ líp c¬ së cña líp B, líp B lµ líp c¬ së cña líp C

H×nh (b): Líp A lµ líp c¬ së cña c¸c líp B, C, D

H×nh (c): Líp A, B, C lµ líp c¬ së cña líp D 5.2. §¬n kÕ thõa

A

B

A

B C D

A B C

D

A

B

C

Page 94: GT LapTrinhHuongDoiTuong_Chinh Thuc

94

5.2.1. §Þnh nghÜa líp dÉn xuÊt tõ mét líp c¬ së

Gi¶ sö ®· ®Þnh nghÜa líp A. Có ph¸p ®Ó x©y dùng líp B dÉn xuÊt tõ líp A

nh− sau:

class B: mode A

{

private:

// Khai b¸o c¸c thuéc tÝnh cña líp B

public:

// §Þnh nghÜa c¸c hµm thµnh phÇn cña líp B

};

Trong ®ã mode cã thÓ lµ private hoÆc public víi ý nghÜa nh− sau:

- KÕ thõa theo kiÓu public th× tÊt c¶ c¸c thµnh phÇn public cña líp c¬ së còng lµ

thµnh phÇn public cña líp dÉn xuÊt.

- KÕ thõa theo kiÓu private th× tÊt c¶ c¸c thµnh phÇn public cña líp c¬ së sÏ trë

thµnh c¸c thµnh phÇn private cña líp dÉn xuÊt.

Chó ý: Trong c¶ hai tr−êng hîp ë trªn th× thµnh phÇn private cña líp c¬ së lµ

kh«ng ®−îc kÕ thõa. Nh− vËy trong líp dÉn xuÊt kh«ng cho phÐp truy nhËp ®Õn

c¸c thµnh phÇn private cña líp c¬ së.

5.2.2. Truy nhËp c¸c thµnh phÇn trong líp dÉn xuÊt

Thµnh phÇn cña líp dÉn xuÊt bao gåm: c¸c thµnh phÇn khai b¸o trong líp

dÉn xuÊt vµ c¸c thµnh phÇn mµ líp dÉn xuÊt thõa kÕ tõ c¸c líp c¬ së. Quy t¾c sö

dông c¸c thµnh phÇn trong líp dÉn xuÊt ®−îc thùc hiÖn theo theo mÉu nh− sau:

Tªn ®èi t−îng.Tªn_líp::Tªn_thµnh_phÇn

Khi ®ã ch−¬ng tr×nh dÞch C++ dÔ dµng ph©n biÖt thµnh phÇn thuéc líp nµo.

VÝ dô 5.1 Gi¶ sö cã c¸c líp A vµ B nh− sau:

class A

{

public: int n;

void nhap()

{

cout<<”\n Nhap n = ”;

cin>>n;

}

};

Page 95: GT LapTrinhHuongDoiTuong_Chinh Thuc

95

class B: public A

{

public: int m;

void nhap()

{

cout<<”\n Nhap m = ”;

cin>>m;

}

};

XÐt khai b¸o: B ob;

Lóc ®ã: ob.B::m lµ thuéc tÝnh n khai b¸o trong B

ob.A::n lµ thuéc tÝnh n thõa kÕ tõ líp A ob.D::nhap() lµ hµm nhap() ®Þnh nghÜa trong líp B

ob.A::nhap() lµ hµm nhap() ®Þnh nghÜa trong líp A

Chó ý: §Ó sö dông c¸c thµnh phÇn cña líp dÉn xuÊt, cã thÓ kh«ng dïng tªn líp,

chØ dïng tªn thµnh phÇn. Khi ®ã ch−¬ng tr×nh dÞch ph¶i tù ph¸n ®o¸n ®Ó biÕt

thµnh phÇn ®ã thuéc líp nµo: tr−íc tiªn xem thµnh phÇn ®ang xÐt cã trïng tªn

víi c¸c thµnh phÇn nµo cña líp dÉn xuÊt kh«ng? NÕu trïng th× ®ã thµnh phÇn cña

líp dÉn xuÊt. NÕu kh«ng trïng th× tiÕp tôc xÐt c¸c líp c¬ së theo thø tù: c¸c líp

cã quan hÖ gÇn víi líp dÉn xuÊt sÏ ®−îc xÐt tr−íc, c¸c líp quan hÖ xa h¬n xÐt

sau. Chó ý tr−êng hîp thµnh phÇn ®ang xÐt cã mÆt ®ång thêi trong 2 líp c¬ së cã

cïng mét ®¼ng cÊp quan hÖ víi líp dÉn xuÊt. Tr−êng hîp nµy ch−¬ng tr×nh dÞch

kh«ng thÓ quyÕt ®Þnh ®−îc thµnh phÇn nµy thõa kÕ tõ líp nµo vµ sÏ ®−a ra mét

th«ng b¸o lçi.

5.2.3. §Þnh nghÜa l¹i c¸c hµm thµnh phÇn cña líp c¬ së trong líp dÉn xuÊt

Trong líp dÉn xuÊt cã thÓ ®Þnh nghÜa l¹i hµm thµnh phÇn cña líp c¬ së. Nh−

vËy cã hai phiªn b¶n kh¸c nhau cña hµm thµnh phÇn trong líp dÉn xuÊt. Trong

ph¹m vi líp dÉn xuÊt, hµm ®Þnh nghÜa l¹i “che khuÊt” hµm ®−îc ®Þnh nghÜa.

ViÖc sö dông hµm nµo cÇn tu©n theo quy ®Þnh ë trªn.

Chó ý: ViÖc ®Þnh nghÜa l¹i hµm thµnh phÇn kh¸c víi ®Þnh nghÜa hµm qu¸ t¶i.

Hµm ®Þnh nghÜa l¹i vµ hµm bÞ ®Þnh nghÜa l¹i gièng nhau vÒ tªn, tham sè vµ gi¸ trÞ

tr¶ vÒ. Chóng chØ kh¸c nhau vÒ vÞ trÝ: mét hµm ®Æt trong líp dÉn xuÊt vµ hµm kia

th× ë trong líp c¬ së. Trong khi ®ã, c¸c hµm qu¸ t¶i chØ cã cïng tªn, nh−ng kh¸c

Page 96: GT LapTrinhHuongDoiTuong_Chinh Thuc

96

nhau vÒ danh s¸ch ®èi sè vµ tÊt c¶ chóng thuéc cïng mét líp. §Þnh nghÜa l¹i

hµm thµnh phÇn chÝnh lµ c¬ së cho viÖc x©y dùng tÝnh ®a h×nh cña c¸c hµm.

C++ cho phÐp ®Æt trïng tªn thuéc tÝnh trong c¸c líp c¬ së vµ líp dÉn xuÊt.

C¸c thµnh phÇn cïng tªn nµy cã thÓ cïng kiÓu hay kh¸c kiÓu. Lóc nµy bªn trong

®èi t−îng cña líp dÉn xuÊt cã tíi hai thµnh phÇn kh¸c nhau cã cïng tªn, nh−ng

trong ph¹m vi líp dÉn xuÊt, tªn chung ®ã nh»m chØ ®Þnh thµnh phÇn ®−îc khai

b¸o l¹i trong líp dÉn xuÊt. Khi muèn chØ ®Þnh thµnh phÇn trïng tªn trong líp c¬

së ph¶i dïng tªn líp to¸n tö ‘::’ ®Æt tr−íc tªn hµm thµnh phÇn.

VÝ dô 5.2 XÐt c¸c líp A vµ B ®−îc x©y dùng nh− sau:

class A

{

private:

int a, b, c;

public:

void nhap()

{ cout<<"\na = "; cin>>a;

cout<<"\nb = "; cin>>b;

cout<<"\nc = "; cin>>c;

}

void hienthi()

{ cout<<"\na = "<<a<<" b = "<<b<<" c = "<<c; }

};

class B: private A

{

private:

double d;

public:

void nhap_d()

{ cout<<"\nd = "; cin>>d;

}

};

Líp B kÕ thõa theo kiÓu private tõ líp A, c¸c thµnh phÇn public cña líp A lµ c¸c

hµm nhap() vµ hienthi() trë thµnh thµnh phÇn private cña líp B.

XÐt khai b¸o : B ob; Lóc ®ã c¸c c©u lÖnh sau ®©y lµ lçi :

ob.nhap();

Page 97: GT LapTrinhHuongDoiTuong_Chinh Thuc

97

ob.d=10;

ob.a = ob.b = ob.c = 5;

ob.hienthi();

bëi v× ®èi t−îng ob kh«ng thÓ truy nhËp vµo c¸c thµnh phÇn private cña líp A vµ

B.

VÝ dô 5.3 Ch−¬ng tr×nh minh häa ®¬n kÕ thõa theo kiÓu public:

#include <iostream.h>

#include <conio.h>

class A

{

int a; //Bien private, khong duoc ke thua

public:

int b; //Bien public, se duoc ke thua

void get_ab();

int get_a(void);

void show_a(void);

};

class B: public A

{

int c;

public:

void mul(void);

void display(void);

};

void A::get_ab(void)

{ a = 5; b = 10;}

int A::get_a()

{ return a;}

void A::show_a()

{ cout << "a = " << a << " \n";}

void B::mul()

{ c = b*get_a();}

void B::display()

{

Page 98: GT LapTrinhHuongDoiTuong_Chinh Thuc

98

cout << "a = " << get_a() << "\n";

cout << "b = " << b << "\n";

cout << "c = " << c << "\n";

}

void main()

{ clrscr();

B d;

d.get_ab(); //Ke thua tu A

d.mul();

d.show_a(); //Ke thua tu A

d.display();

d.b = 20;

d.mul();

d.display();

getch();

}

Ch−¬ng tr×nh cho kÕt qu¶:

a = 5

a = 5

b = 10

c = 50

a = 5

b = 20

c = 100

VÝ dô 5.4 Ch−¬ng tr×nh sau lµ minh häa kh¸c cho tr−êng hîp kÕ thõa ®¬n:

#include <conio.h>

#include <iostream.h>

class Diem

{

private:

double x, y;

public:

void nhap()

{

Page 99: GT LapTrinhHuongDoiTuong_Chinh Thuc

99

cout<<"\n x = "; cin>>x;

cout<<"\n y = "; cin>>y;

}

void hienthi()

{

cout<<"\n x = "<<x<<" y = "<<y;

}

};

class Hinhtron: public Diem

{

private:

double r;

public:

void nhap_r()

{

cout<<"\n r = "; cin>>r;

}

double get_r()

{

return r;

}

};

void main()

{

Hinhtron h;

clrscr();

cout<<"\n Nhap toa do tam va ban kinh hinh tron";

h.nhap();

h.nhap_r();

cout<<"\n Hinh tron co tam:";h.hienthi();

cout<<"\n Co ban kinh = " << h.get_r();

getch();

}

Ch−¬ng tr×nh cho kÕt qu¶:

Page 100: GT LapTrinhHuongDoiTuong_Chinh Thuc

100

Nhap toa do tam va ban kinh hinh tron

x = 2

y = 3

r = 10

Hinh tron co tam:

x = 2 y = 3

Co ban kinh = 10

5.2.4. Hµm t¹o ®èi víi tÝnh kÕ thõa

C¸c hµm t¹o cña líp c¬ së lµ kh«ng ®−îc kÕ thõa. Mét ®èi t−îng cña líp

dÉn xuÊt vÒ thùc chÊt cã thÓ xem lµ mét ®èi t−îng cña líp c¬ së, v× vËy viÖc gäi

hµm t¹o líp dÉn xuÊt ®Ó t¹o ®èi t−îng cña líp dÉn xuÊt sÏ kÐo theo viÖc gäi ®Õn

mét hµm t¹o cña líp c¬ së. Thø tù thùc hiÖn cña c¸c hµm t¹o sÏ lµ: hµm t¹o cho

líp c¬ së, råi ®Õn hµm t¹o cho líp dÉn xuÊt.

C++ thùc hiÖn ®iÒu nµy b»ng c¸ch: trong ®Þnh nghÜa cña hµm t¹o líp dÉn

xuÊt, ta m« t¶ mét lêi gäi tíi hµm t¹o trong líp c¬ së. Có ph¸p ®Ó truyÒn ®èi sè

tõ líp dÉn xuÊt ®Õn líp c¬ së nh− sau:

Tªn_ líp_dÉn_xuÊt(danh s¸ch ®èi):Tªn_ líp_c¬_së (danh s¸ch ®èi)

{

//th©n hµm t¹o cña líp dÉn xuÊt

} ; Trong phÇn lín c¸c tr−êng hîp, hµm t¹o cña líp dÉn xuÊt vµ hµm t¹o cña

líp c¬ së sÏ kh«ng dïng ®èi sè gièng nhau. Trong tr−êng hîp cÇn truyÒn mét

hay nhiÒu ®èi sè cho mçi líp, ta ph¶i truyÒn cho hµm t¹o cña líp dÉn xuÊt tÊt c¶

c¸c ®èi sè mµ c¶ hai líp dÉn xuÊt vµ c¬ së cÇn ®Õn. Sau ®ã, líp dÉn xuÊt chØ

truyÒn cho líp c¬ së nh÷ng ®èi sè nµo mµ líp c¬ së cÇn.

VÝ dô 5.5 Ch−¬ng tr×nh sau minh häa c¸ch truyÒn ®èi sè cho hµm t¹o cña líp c¬

së: #include <iostream.h>

#include <conio.h>

class Diem

{

private:

double x, y;

public:

Page 101: GT LapTrinhHuongDoiTuong_Chinh Thuc

101

Diem()

{

x=y=0.0;

}

Diem(double x1, double y1)

{

x=x1; y=y1;

}

void in()

{

cout<<”\nx=”<<x<<”y=”<<y;

}

};

class Hinhtron: public Diem

{

private:

double r;

public:

Hinhtron()

{

r = 0.0;

}

Hinhtron(double x1,double y1,double r1):

Diem (x1, y1)

{

r=r1;

}

double get_r()

{

return r;

}

};

void main()

{

Page 102: GT LapTrinhHuongDoiTuong_Chinh Thuc

102

Hinhtron h(2.5, 3.5, 8);

clrscr();

cout<<”\n Hinh tron co tam:”;

h.in();

cout<<”\n Co ban kinh =” << h.get_r();

getch();

}

Chó ý: C¸c ®èi sè mµ hµm t¹o cña líp dÉn xuÊt truyÒn cho hµm t¹o cña líp c¬

së kh«ng nhÊt thiÕt ph¶i lÊy hoµn toµn y nh− tõ c¸c tham sè nã nhËn ®−îc. VÝ dô: Hinhtron(double x1,double y1,double r1):Diem (x1/2,

y1/2)

5.2.5. Hµm hñy ®èi víi tÝnh kÕ thõa

Hµm hñy cña líp c¬ së còng kh«ng ®−îc kÕ thõa. Khi c¶ líp c¬ së vµ líp dÉn

xuÊt cã c¸c hµm hñy vµ hµm t¹o, c¸c hµm t¹o thi hµnh theo thø tù dÉn xuÊt. C¸c

hµm hñy ®−îc thi hµnh theo thø tù ng−îc l¹i. NghÜa lµ, hµm t¹o cña líp c¬ së thi

hµnh tr−íc hµm t¹o cña líp dÉn xuÊt, hµm hñy cña líp dÉn xuÊt thi hµnh tr−íc

hµm hñy cña líp c¬ së.

VÝ dô 5.6

#include <iostream.h>

#include <conio.h>

class CS

{ public:

CS()

{cout<<"\nHam tao lop co so";}

~CS()

{cout<<"\nHam huy lop co so";}

};

class DX:public CS

{ public:

DX()

{cout<<"\nHam tao lop dan xuat";}

~DX()

{cout<<"\nHam huy lop dan xuat";}

};

Page 103: GT LapTrinhHuongDoiTuong_Chinh Thuc

103

void main()

{ clrscr();

DX ob;

getch();

}

Ch−¬ng tr×nh nµy cho kÕt qu¶ nh− sau : Ham tao lop co so

Ham tao dan xuat

Ham huy lop dan xuat

Ham huy lop co so

5.2.6. Khai b¸o protected

Ta ®· biÕt c¸c thµnh phÇn khai b¸o private kh«ng ®−îc kÕ thõa trong líp

dÉn xuÊt. Cã thÓ gi¶i quyÕt vÊn ®Ò nµy b»ng c¸ch chuyÓn chóng sang vïng

public. Tuy nhiªn c¸ch lµm nµy l¹i ph¸ vì nguyªn lý che dÊu th«ng tin cña

LTH§T. C++ ®−a ra c¸ch gi¶i quyÕt kh¸c lµ sö dông khai b¸o protected. C¸c

thµnh phÇn protected cã ph¹m vi truy nhËp réng h¬n so víi c¸c thµnh phÇn

private, nh−ng hÑp h¬n so víi c¸c thµnh phÇn public.

C¸c thµnh phÇn protected cña líp c¬ së hoµn toµn gièng c¸c thµnh phÇn

private ngo¹i trõ mét ®iÓm lµ chóng cã thÓ kÕ thõa tõ líp dÉn xuÊt trùc tiÕp tõ líp

c¬ së. Cô thÓ nh− sau:

- NÕu kÕ thõa theo kiÓu public th× c¸c thµnh phÇn proteted cña líp c¬ së sÏ trë

thµnh c¸c thµnh phÇn protected cña líp dÉn xuÊt.

- NÕu kÕ thõa theo kiÓu private th× c¸c thµnh phÇn proteted cña líp c¬ së sÏ

trë thµnh c¸c thµnh phÇn private cña líp dÉn xuÊt.

5.2.7. DÉn xuÊt protected

Ngoµi hai kiÓu dÉn xuÊt ®· biÕt lµ private vµ public, C++ cßn ®−a ra kiÓu

dÉn xuÊt protected. Trong dÉn xuÊt lo¹i nµy th× c¸c thµnh phÇn public, protected

trong líp c¬ së trë thµnh c¸c thµnh phÇn protected trong líp dÉn xuÊt.

5.3. §a kÕ thõa

5.3.1. §Þnh nghÜa líp dÉn xuÊt tõ nhiÒu líp c¬ së

Gi¶ sö ®· ®Þnh nghÜa c¸c líp A, B. Có ph¸p ®Ó x©y dùng líp C dÉn xuÊt tõ

líp A vµ B nh− sau:

class C: mode A, mode B

Page 104: GT LapTrinhHuongDoiTuong_Chinh Thuc

104

{

private:

// Khai b¸o c¸c thuéc tÝnh

public:

// C¸c hµm thµnh phÇn

};

trong ®ã mode cã thÓ lµ private, public hoÆc protected. ý nghÜa cña kiÓu dÉn

xuÊt nµy gièng nh− tr−êng hîp ®¬n kÕ thõa.

5.3.2. Mét sè vÝ dô vÒ ®a kÕ thõa

VÝ dô 5.7 Ch−¬ng tr×nh sau minh häa mét líp kÕ thõa tõ hai líp c¬ së:

#include <iostream.h>

#include <string.h>

#include <conio.h>

class M

{ protected :

int m;

public :

void getm(int x) {m=x;}

};

class N

{ protected :

int n;

public :

void getn(int y) {n=y;}

};

class P : public M,public N

{

public :

void display(void)

{ cout<<"m= "<<m<<endl;

cout<<"n= "<<n<<endl;

cout<<"m * n = "<<m*n<<endl;

Page 105: GT LapTrinhHuongDoiTuong_Chinh Thuc

105

}

};

void main()

{ P ob;

clrscr();

ob.getm(10);

ob.getn(20);

ob.display();

getch();

}

Ch−¬ng tr×nh cho kÕt qu¶ nh− sau:

m = 10

n = 20

m*n = 200

VÝ dô 5.8 Ch−¬ng tr×nh sau minh häa viÖc qu¶n lý kÕt qu¶ thi cña mét líp kh«ng

qu¸ 100 sinh viªn. Ch−¬ng tr×nh gåm 3 líp: líp c¬ së sinh viªn (sinhvien) chØ l−u

hä tªn vµ sè b¸o danh, líp ®iÓm thi (diemthi) kÕ thõa líp sinh viªn vµ l−u kÕt qu¶

m«n thi 1 vµ m«n thi 2. Líp kÕt qu¶ (ketqua) l−u tæng sè ®iÓm ®¹t ®−îc cña sinh

viªn.

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

class sinhvien

{ char hoten[25];

protected:

int sbd;

public:

void nhap()

{ cout<<"\nHo ten :";gets(hoten);

cout<<"So bao danh :";cin>>sbd;

}

void hienthi()

{ cout<<"So bao danh : "<<sbd<<endl;

Page 106: GT LapTrinhHuongDoiTuong_Chinh Thuc

106

cout<<"Ho va ten sinh vien : "<<hoten<<endl;

}

};

class diemthi : public sinhvien

{ protected :

float d1,d2;

public :

void nhap_diem()

{

cout<<"Nhap diem hai mon thi : \n";

cin>>d1>>d2;

}

void hienthi_diem()

{ cout<<"Diem mon 1 :"<<d1<<endl;

cout<<"Diem mon 2 :"<<d2<<endl;

}

};

class ketqua : public diemthi

{

float tong;

public :

void display()

{ tong = d1+d2;

hienthi();

hienthi_diem();

cout<<"Tong so diem :"<<tong<<endl;

}

};

void main()

{ int i,n; ketqua sv[100];

cout<<"\n Nhap so sinh vien : ";

cin>>n;

clrscr();

Page 107: GT LapTrinhHuongDoiTuong_Chinh Thuc

107

for(i=0;i<n;++i)

{ sv[i].nhap();

sv[i].nhap_diem();

}

for(i=0;i<n;++i)

sv[i].display();

getch();

}

VÝ dô 5.9 Ch−¬ng tr×nh sau lµ sù më réng cña ch−¬ng tr×nh ë trªn, trong ®ã

ngoµi kÕt qu¶ hai thi, mçi sinh viªn cßn cã thÓ cã ®iÓm th−ëng. Ch−¬ng tr×nh më

réng thªm mét líp −u tiªn (uutien).

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

class sinhvien

{ char hoten[25];

protected : int sbd;

public :

void nhap()

{ cout<<"\nHo ten :";gets(hoten);

cout<<"So bao danh :";cin>>sbd;

}

void hienthi()

{ cout<<"So bao danh : "<<sbd<<endl;

cout<<"Ho va ten sinh vien : "<<hoten<<endl;

}

};

class diemthi : public sinhvien

{ protected : float d1,d2;

public :

void nhap_diem()

{

cout<<"Nhap diem hai mon thi : \n";

cin>>d1>>d2;

Page 108: GT LapTrinhHuongDoiTuong_Chinh Thuc

108

}

void hienthi_diem()

{ cout<<"Diem mon 1 :"<<d1<<endl;

cout<<"Diem mon 2 :"<<d2<<endl;

}

};

class uutien

{ protected : float ut;

public :

void nhap_ut()

{

cout<<"\nNhap diem uu tien :";cin>>ut;

}

void hienthi_ut()

{cout<<"Diem uu tien : "<<ut<<endl; }

};

class ketqua : public diemthi, public uutien

{ float tong;

public :

void display()

{ tong=d1+d2+ut;

hienthi();

hienthi_diem();

hienthi_ut();

cout<<"Tong so diem :"<<tong<<endl;

}

};

void main()

{ int i,n; ketqua sv[100];

cout<<"\n Nhap so sinh vien : ";

cin>>n;

clrscr();

for(i=0;i<n;++i)

{ sv[i].nhap();

Page 109: GT LapTrinhHuongDoiTuong_Chinh Thuc

109

sv[i].nhap_diem();

sv[i].nhap_ut();

}

for(i=0;i<n;++i)

sv[i].display();

getch();

}

VÝ dô 5.10 Xem s¬ ®å kÕ thõa c¸c líp nh− sau:

H×nh 5.3.

Trong ®ã líp c¬ së Building l−u tr÷ sè tÇng cña mét tßa nhµ, tæng sè phßng vµ

tæng diÖn tÝch cña tßa nhµ. Líp dÉn xuÊt House kÕ thõa líp Building vµ l−u tr÷

sè phßng ngñ, sè phßng t¾m. Líp dÉn xuÊt Office tõ líp Building l−u tr÷ sè m¸y

®iÖn tho¹i vµ sè b×nh cøu háa. Ch−¬ng tr×nh sau minh häa viÖc tæ chøc l−u tr÷

theo s¬ ®å kÕ thõa nµy.

#include <iostream.h>

#include <conio.h>

class Building

{ protected :

int floors; //tong so tang

int rooms; //tong so phong

double footage; //tong so dien tich

};

class house : public Building

{ int bedrooms; //tong so phong ngu

int bathrooms; //tong so phong tam

public :

house(int f, int r, int ft, int br, int bth)

{ floors=f; rooms=r; footage=ft;

bedrooms=br; bathrooms=bth;

Building

House Office

Page 110: GT LapTrinhHuongDoiTuong_Chinh Thuc

110

}

void show()

{ cout<<'\n';

cout<<" So tang : " <<floors <<'\n';

cout<<" So phong : " <<rooms <<'\n';

cout<<" So tong dien tich : "

<<footage<<'\n';

cout<<" So phong ngu : " <<bedrooms <<'\n';

cout<<" So phong tam : " <<bathrooms<<'\n';

}

};

class office : public Building

{ int phones; //tong so may dien thoai

int extis; //tong so binh cuu hoa

public :

office(int f, int r, int ft, int p, int ext)

{ floors=f; rooms=r; footage=ft;

phones=p; extis=ext;

}

void show()

{ cout<<'\n';

cout<<" So tang : " <<floors <<'\n';

cout<<" So phong : " <<rooms <<'\n';

cout<<" So tong dien tich : " <<footage

<<"\n”;

cout<<" So may dien thoai : " <<phones

<< "\n";

cout<<" So binh cuu hoa : " <<extis<<'\n';

}

};

void main()

{

house h_ob(2,12,5000,6,4);

office o_ob(4,25,12000,30,8);

Page 111: GT LapTrinhHuongDoiTuong_Chinh Thuc

111

cout<<"House : ";

h_ob.show();

cout<<"Office : ";

o_ob.show();

getch();

}

Ch−¬ng tr×nh cho kÕt qu¶ nh− sau: House : So tang : 2 So phong : 12 So tong dien tich : 5000 So phong ngu : 6 So phong tam : 4 Office : So tang : 4 So phong : 25 So tong dien tich : 12000 So may dien thoai : 30 So binh cuu hoa : 8

5.4. Hµm ¶o

5.4.1 §Æt vÊn ®Ò

Tr−íc khi ®−a ra kh¸i niÖm vÒ hµm ¶o, ta h·y th¶o luËn vÝ dô sau:

Gi¶ sö cã 3 líp A, B vµ C ®−îc x©y dùng nh− sau:

class A

{

public:

void xuat()

{

cout <<”\n Lop A”;

}

};

class B : public A

{

public:

void xuat()

{

cout <<”\n Lop B”;

Page 112: GT LapTrinhHuongDoiTuong_Chinh Thuc

112

}

};

class C : public B

{

public:

void xuat()

{

cout <<”\n Lop C”;

}

};

C¶ 3 líp nµy ®Òu cã hµm thµnh phÇn lµ xuat(). Líp C cã hai líp c¬ së lµ A, B vµ

C kÕ thõa c¸c hµm thµnh phÇn cña A vµ B. Do ®ã mét ®èi t−îng cña C sÏ cã 3

hµm xuat(). Xem c¸c c©u lÖnh sau:

C ob; // ob lµ ®èi t−îng kiÓu C

ob.xuat(); // Gäi tíi hµm thµnh phÇn xuat() cña líp D

ob.B::xuat() ; // Gäi tíi hµm thµnh phÇn xuat() cña líp B

ob.A::xuat() ; // Gäi tíi hµm thµnh phÇn xuat() cña líp A

C¸c lêi gäi hµm thµnh phÇn trong vÝ dô trªn ®Òu xuÊt ph¸t tõ ®èi t−îng ob

vµ mäi lêi gäi ®Òu x¸c ®Þnh râ hµm cÇn gäi.

Ta xÐt tiÕp t×nh huèng c¸c lêi gäi kh«ng ph¶i tõ mét biÕn ®èi t−îng mµ tõ

mét con trá ®èi t−îng. XÐt c¸c c©u lÖnh:

A *p, *q, *r; // p,q,r lµ c¸c con trá kiÓu A

A a; // a lµ ®èi t−îng kiÓu A

B b; // b lµ ®èi t−îng kiÓu B

C c; // c lµ ®èi t−îng kiÓu C

Bëi v× con trá cña líp c¬ së cã thÓ dïng ®Ó chøa ®Þa chØ c¸c ®èi t−îng cña

líp dÉn xuÊt, nªn c¶ 3 phÐp g¸n sau ®Òu hîp lÖ:

p = &a; q = &b; r = &c;

Ta xÐt c¸c lêi gäi hµm thµnh phÇn tõ c¸c con trá p, q, r:

p->xuat(); q->xuat(); r->xuat();

C¶ 3 c©u lÖnh trªn ®Òu gäi tíi hµm thµnh phÇn xuat() cña líp A, bëi v× c¸c

con trá p, q, r ®Òu cã kiÓu líp A. Së dÜ nh− vËy lµ v× mét lêi gäi (xuÊt ph¸t tõ mét

®èi t−îng hay con trá) tíi hµm thµnh phÇn lu«n lu«n liªn kÕt víi mét hµm

thµnh phÇn cè ®Þnh vµ sù liªn kÕt nµy x¸c ®Þnh trong qu¸ tr×nh biªn dÞch

ch−¬ng tr×nh. Ta b¶o ®©y lµ sù liªn kÕt tÜnh.

Page 113: GT LapTrinhHuongDoiTuong_Chinh Thuc

113

Cã thÓ tãm l−îc c¸ch thøc gäi c¸c hµm thµnh phÇn nh− sau:

1. NÕu lêi gäi xuÊt ph¸t tõ mét ®èi t−îng cña líp nµo ®ã, th× hµm thµnh

phÇn cña líp ®ã sÏ ®−îc gäi.

2. NÕu lêi gäi xuÊt ph¸t tõ mét con trá kiÓu líp, th× hµm thµnh phÇn cña líp

®ã sÏ ®−îc gäi bÊt kÓ con trá chøa ®Þa chØ cña ®èi t−îng nµo.

VÊn ®Ò ®Æt ra lµ: Ta muèn t¹i thêi ®iÓm con trá ®ang trá ®Õn ®èi t−îng nµo ®ã

th× lêi gäi hµm ph¶i liªn kÕt ®óng hµm thµnh phÇn cña líp mµ ®èi t−îng ®ã thuéc

vµo chø kh«ng phô thuéc vµo kiÓu líp cña con trá. C++ gi¶i quyÕt vÊn ®Ò nµy

b»ng c¸ch dïng kh¸i niÖm hµm ¶o.

5.4.2. §Þnh nghÜa hµm ¶o

Hµm ¶o lµ hµm thµnh phÇn cña líp, nã ®−îc khai b¸o trong líp c¬ së vµ

®Þnh nghÜa l¹i trong líp dÉn xuÊt. §Ó ®Þnh nghÜa hµm ¶o th× phÇn khai b¸o hµm

ph¶i b¾t ®Çu b»ng tõ khãa virtual. Khi mét líp cã chøa hµm ¶o ®−îc kÕ thõa, líp

dÉn xuÊt sÏ ®Þnh nghÜa l¹i hµm ¶o ®ã cho chÝnh m×nh. C¸c hµm ¶o triÓn khai t−

t−ëng chñ ®¹o cña tÝnh ®a h×nh lµ “ mét giao diÖn cho nhiÒu hµm thµnh phÇn”.

Hµm ¶o bªn trong líp c¬ së ®Þnh nghÜa h×nh thøc giao tiÕp ®èi víi hµm ®ã. ViÖc

®Þnh nghÜa l¹i hµm ¶o ë líp dÉn xuÊt lµ thi hµnh c¸c t¸c vô cña hµm liªn quan

®Õn chÝnh líp dÉn xuÊt ®ã. Nãi c¸ch kh¸c, ®Þnh nghÜa l¹i hµm ¶o chÝnh lµ t¹o ra

ph−¬ng thøc cô thÓ. Trong phÇn ®Þnh nghÜa l¹i hµm ¶o ë líp dÉn xuÊt, kh«ng cÇn

ph¶i sö dông l¹i tõ khãa virtual. Khi x©y dùng hµm ¶o, cÇn tu©n theo nh÷ng quy t¾c sau :

1. Hµm ¶o ph¶i lµ hµm thµnh phÇn cña mét líp ; 2. Nh÷ng thµnh phÇn tÜnh (static) kh«ng thÓ khai b¸o ¶o;

3. Sö dông con trá ®Ó truy nhËp tíi hµm ¶o;

4. Hµm ¶o ®−îc ®Þnh nghÜa trong líp c¬ së, ngay khi nã kh«ng ®−îc sö

dông;

5. MÉu cña c¸c phiªn b¶n (ë líp c¬ së vµ líp dÉn xuÊt) ph¶i gièng nhau. NÕu

hai hµm cïng tªn nh−ng cã mÉu kh¸c nhau th× C++ sÏ xem nh− hµm t¶i

béi;

6. Kh«ng ®−îc t¹o ra hµm t¹o ¶o, nh−ng cã thÓ t¹o ra hµm hñy ¶o;

7. Con trá cña líp c¬ së cã thÓ chøa ®Þa chØ cña ®èi t−îng thuéc líp dÉn xuÊt,

nh−ng ng−îc l¹i th× kh«ng ®−îc;

8. NÕu dïng con trá cña líp c¬ së ®Ó trá ®Õn ®èi t−îng cña líp dÉn xuÊt th×

phÐp to¸n t¨ng gi¶m con trá sÏ kh«ng t¸c dông ®èi víi líp dÉn xuÊt, nghÜa

Page 114: GT LapTrinhHuongDoiTuong_Chinh Thuc

114

lµ kh«ng ph¶i con trá sÏ trá tíi ®èi t−îng tr−íc hoÆc tiÕp theo trong líp

dÉn xuÊt. PhÐp to¸n t¨ng gi¶m chØ liªn quan ®Õn líp c¬ së.

VÝ dô:

class A

{

...

virtual void hienthi()

{

cout<<”\nDay la lop A”;

};

};

class B : public A {

...

void hienthi()

{

cout<<”\nDay la lop B”;

}

};

class C : public B

{

...

void hienthi()

{

cout<<”\nDay la lop C”;

}

};

class D : public A

{ ...

void hienthi()

{

cout<<”\nDay la lop D”;

}

};

Page 115: GT LapTrinhHuongDoiTuong_Chinh Thuc

115

Chó ý: Tõ kho¸ virtual kh«ng ®−îc ®Æt bªn ngoµi ®Þnh nghÜa líp. Xem vÝ dô : class A

{

...

virtual void hienthi();

};

virtual void hienthi() // sai

{

cout<<”\nDay la lop A”;

}

5.4.3. Quy t¾c gäi hµm ¶o

Hµm ¶o chØ kh¸c hµm thµnh phÇn th«ng th−êng khi ®−îc gäi tõ mét con trá.

Lêi gäi tíi hµm ¶o tõ mét con trá ch−a cho biÕt râ hµm thµnh phÇn nµo (trong sè

c¸c hµm thµnh phÇn cïng tªn cña c¸c líp cã quan hÖ thõa kÕ) sÏ ®−îc gäi. §iÒu

nµy sÏ phô thuéc vµo ®èi t−îng cô thÓ mµ con trá ®ang trá tíi: con trá ®ang trá

tíi ®èi t−îng cña líp nµo th× hµm thµnh phÇn cña líp ®ã sÏ ®−îc gäi.

5.4.5. Quy t¾c g¸n ®Þa chØ ®èi t−îng cho con trá líp c¬ së

C++ cho phÐp g¸n ®Þa chØ ®èi t−îng cña mét líp dÉn xuÊt cho con trá cña

líp c¬ së b»ng c¸ch sö dông phÐp g¸n = vµ phÐp to¸n lÊy ®Þa chØ &.

VÝ dô : Gi¶ sö A lµ líp c¬ së vµ B lµ líp dÉn xuÊt tõ A. C¸c phÐp g¸n sau lµ

®óng:

A *p; // p lµ con trá kiÓu A

A a; // a lµ biÕn ®èi t−îng kiÓu A

B b; // b lµ biÕn ®èi t−îng kiÓu B

p = &a; // p vµ a cïng líp A

p = &b; // p lµ con trá líp c¬ së, b lµ ®èi t−îng líp dÉn xuÊt

Chó ý: Kh«ng cho phÐp g¸n ®Þa chØ ®èi t−îng cña líp c¬ së cho con trá cña líp

dÉn xuÊt, ch¼ng h¹n víi khai b¸o B *q; A a; th× c©u lÖnh q = &a; lµ sai.

VÝ dô 5.11 Ch−¬ng tr×nh sau ®©y minh häa viÖc sö dông hµm ¶o:

#include <iostream.h>

#include <conio.h>

class A

{

Page 116: GT LapTrinhHuongDoiTuong_Chinh Thuc

116

public:

virtual void hienthi()

{

cout <<"\n Lop A";

}

};

class B : public A

{

public:

void hienthi()

{

cout <<"\n Lop B";

}

};

class C : public B

{

public:

void hienthi()

{

cout <<"\n Lop C";

}

};

void main()

{ clrscr();

A *p;

A a; B b; C c;

a.hienthi(); //goi ham cua lop A

p = &b; //p tro to doi tuong b cua lop B

p->hienthi(); //goi ham cua lop B

p=&c; //p tro to doi tuong c cua lop C

p->hienthi(); //goi ham cua lop C

getch();

}

Page 117: GT LapTrinhHuongDoiTuong_Chinh Thuc

117

Ch−¬ng tr×nh nµy cho kÕt qu¶ nh− sau:

Lop A

Lop B

Lop C

Chó ý : Cïng mét c©u lÖnh p->hienthi(); ®−îc t−¬ng øng víi nhiÒu hµm kh¸c

nhau kh¸c nhau khi hienthi() lµ hµm ¶o. §©y chÝnh lµ sù t−¬ng øng béi.

Kh¶ n¨ng nµy cho phÐp xö lý nhiÒu ®èi t−îng kh¸c nhau theo cïng mét

c¸ch thøc.

Còng víi lêi gäi: p->hienthi(); (hienthi() lµ hµm ¶o) th× lêi gäi nµy kh«ng

liªn kÕt víi mét ph−¬ng thøc cè ®Þnh, mµ tïy thuéc vµ néi dung con trá.

§ã lµ sù liªn kÕt ®éng vµ ph−¬ng thøc ®−îc liªn kÕt (®−îc gäi) thay ®æi

mçi khi cã sù thay ®æi néi dung con trá trong qu¸ tr×nh ch¹y ch−¬ng tr×nh.

VÝ dô 5.12 Ch−¬ng tr×nh sau t¹o ra mét líp c¬ së cã tªn lµ num l−u tr÷ mét sè

nguyªn, vµ mét hµm ¶o cña líp cã tªn lµ shownum(). Líp num cã hai líp dÉn

xuÊt lµ outhex vµ outoct. Trong hai líp nµy sÏ ®Þnh nghÜa l¹i hµm ¶o shownum()

®Ó chóng in ra sè nguyªn d−íi d¹ng sè hÖ 16 vµ sè hÖ 8.

#include <iostream.h>

#include <conio.h>

class num

{

public :

int i;

num(int x) { i=x; }

virtual void shownum()

{ cout<<"\n So he 10 : ";

cout <<dec<<i<<'\n';

}

};

class outhex : public num

{ public :

outhex(int n) : num(n) {}

void shownum()

{ cout <<"\n So he 10 : "<<dec<<i<<endl;

Page 118: GT LapTrinhHuongDoiTuong_Chinh Thuc

118

cout <<"\n So he 16 : "<<hex << i <<'\n';

}

};

class outoct : public num

{ public :

outoct(int n) : num(n) {}

void shownum()

{ cout <<"\n So he 10 : "<<dec<<i<<endl;

cout <<"\n So he 8 : "<< oct << i <<'\n';

}

};

void main()

{ clrscr();

num n (1234);

outoct o (342);

outhex h (747);

num *p;

p=&n;

p->shownum(); //goi ham cua lop co so, 100

p=&o;

p->shownum(); //goi ham cua lop dan xuat, 12

p=&h;

p->shownum(); //goi ham cua lop dan xuat, f

getch();

}

Ch−¬ng tr×nh trªn cho kÕt qu¶:

So he 10 : 1234

So he 10 : 342

So he 8 : 526

So he 10 : 747

So he 16 : 2eb

Page 119: GT LapTrinhHuongDoiTuong_Chinh Thuc

119

5.5. Líp c¬ së ¶o

5.5.1. Khai b¸o líp c¬ së ¶o

Mét vÊn ®Ò tån t¹i lµ khi nhiÒu líp c¬ së ®−îc kÕ thõa trùc tiÕp bëi mét líp

dÉn xuÊt. §Ó hiÓu râ h¬n vÊn ®Ò nµy, xÐt t×nh huèng c¸c líp kÕ thõa theo s¬ ®å

nh− sau:

H×nh 5.4.

ë ®©y, líp A ®−îc kÕ thõa bëi hai líp B vµ C. Líp D kÕ thõa trùc tiÕp c¶ hai líp

B vµ C. Nh− vËy líp A ®−îc kÕ thõa hai lÇn bëi líp D: lÇn thø nhÊt nã ®−îc kÕ

thõa th«ng qua líp B, vµ lÇn thø hai ®−îc kÕ thõa th«ng qua líp C. Bëi v× cã hai

b¶n sao cña líp A cã trong líp D nªn mét tham chiÕu ®Õn mét thµnh phÇn cña

líp A sÏ tham chiÕu vÒ líp A ®−îc kÕ thõa gi¸n tiÕp th«ng qua líp B hay tham

chiÕu vÒ líp A ®−îc kÕ thõa gi¸n tiÕp th«ng qua líp C? §Ó gi¶i quyÕt tÝnh kh«ng

râ rµng nµy, C++ cã mét c¬ chÕ mµ nhê ®ã chØ cã mét b¶n sao cña líp A ë trong

líp D: ®ã lµ sö dông líp c¬ së ¶o.

Trong vÝ dô trªn, C++ sö dông tõ khãa vitual ®Ó khai b¸o líp A lµ ¶o trong

c¸c líp B vµ C theo mÉu nh− sau:

class B : virtual public A

{...};

class C : virtual public A

{...};

class D : public B, public C

{...};

ViÖc chØ ®Þnh A lµ ¶o trong c¸c líp B vµ C nghÜa lµ A sÏ chØ xuÊt hiÖn mét

lÇn trong líp D. Khai b¸o nµy kh«ng ¶nh h−ëng ®Õn c¸c líp B vµ C.

Chó ý: Tõ khãa virtual cã thÓ ®Æt tr−íc hoÆc sau tõ khãa public, private,

protected.

VÝ dô 5.13

A

B C

D

Page 120: GT LapTrinhHuongDoiTuong_Chinh Thuc

120

#include <iostream.h>

#include <conio.h>

class A

{ float x,y;

public:

void set(float x1, float y1)

{

x = x1; y = y1;

}

float getx()

{ return x;

}

float gety()

{ return y;

}

};

class B : virtual public A

{ };

class C : virtual public A

{ };

class D : public B, public C

{ };

void main()

{ clrscr();

D d;

cout<<"\nd.B::set(2,3)\n";

d.B::set(2,3);

cout<<"\nd.C::getx() = "; cout<<d.C::getx()<<endl;

cout<<"\nd.B::getx() = "; cout<<d.B::getx()<<endl;

cout<<"\nd.C::gety() = "; cout<<d.C::gety()<<endl;

cout<<"\nd.B::gety() = "; cout<<d.B::gety()<<endl;

cout<<"\nd.C::set(2,3)\n";

d.C::set(2,3);

cout<<"\nd.C::getx() = "; cout<<d.C::getx()<<endl;

Page 121: GT LapTrinhHuongDoiTuong_Chinh Thuc

121

cout<<"\nd.B::getx() = "; cout<<d.B::getx()<<endl;

cout<<"\nd.C::gety() = "; cout<<d.C::gety()<<endl;

cout<<"\nd.B::gety() = "; cout<<d.B::gety()<<endl;

getch();

}

Ch−¬ng tr×nh trªn sÏ cho kÕt qu¶:

d.B::set(2,3)

d.C::getx() = 2

d.B::getx() = 2

d.C::gety() = 3

d.B::gety() = 3

d.C::set(2,3)

d.C::getx() = 2

d.B::getx() = 2

d.C::gety() = 3

d.B::gety() = 3

5.5.2. Hµm t¹o vµ hµm hñy ®èi víi líp c¬ së ¶o

Ta ®· biÕt, khi khëi t¹o ®èi t−îng líp dÉn xuÊt th× c¸c hµm t¹o ®−îc gäi

theo thø tù xuÊt hiÖn trong danh s¸ch c¸c líp c¬ së ®−îc khai b¸o, råi ®Õn hµm

t¹o cña líp dÉn xuÊt. Th«ng tin ®−îc chuyÓn tõ hµm t¹o cña líp dÉn xuÊt sang

hµm t¹o cña líp c¬ së. Trong t×nh huèng cã líp c¬ së ¶o, ch¼ng h¹n nh− h×nh vÏ

5.4., cÇn ph¶i tu©n theo quy ®Þnh sau:

Thø tù gäi hµm t¹o: Hµm t¹o cña mét líp ¶o lu«n lu«n ®−îc gäi tr−íc c¸c

hµm t¹o kh¸c.

Víi s¬ ®å kÕ thõa nh− h×nh vÏ 5.4., thø tù gäi hµm t¹o sÏ lµ A, B, C vµ cuèi

cïng lµ D. Ch−¬ng tr×nh sau minh häa ®iÒu nµy:

VÝ dô 5.14

#include <iostream.h>

#include <conio.h>

class A

{ float x,y;

public:

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

Page 122: GT LapTrinhHuongDoiTuong_Chinh Thuc

122

A(float x1, float y1)

{

cout<<"A::A(float,float)\n";

x = x1; y = y1;

}

float getx()

{

return x;

}

float gety()

{

return y;

}

};

class B : virtual public A

{

public:

B(float x1, float y1):A(x1,y1)

{

cout<<"B::B(float,float)\n";

}

};

class C : virtual public A

{

public:

C(float x1, float y1):A(x1,y1)

{

cout<<"C::C(float,float)\n";

}

};

class D : public B, public C

{

public:

Page 123: GT LapTrinhHuongDoiTuong_Chinh Thuc

123

D(float x1, float y1):A(x1,y1), B(10,4), C(1,1)

{

cout<<"D::D(float,float)\n";

}

};

void main()

{ clrscr();

D d(2,3);

cout<<"\nD d (2,3)\n";

cout<<"\nd.C::getx() = "; cout<<d.C::getx()<<endl;

cout<<"\nd.B::getx() = "; cout<<d.B::getx()<<endl;

cout<<"\nd.C::gety() = "; cout<<d.C::gety()<<endl;

cout<<"\nd.B::gety() = "; cout<<d.B::gety()<<endl;

cout<<"\nd1 (10,20) \n";

D d1 (10,20);

cout<<"\nd.C::getx() = "; cout<<d.C::getx()<<endl;

cout<<"\nd.B::getx() = "; cout<<d.B::getx()<<endl;

cout<<"\nd.C::gety() = "; cout<<d.C::gety()<<endl;

cout<<"\nd.B::gety() = "; cout<<d.B::gety()<<endl;

getch();

}

KÕt qu¶ ch−¬ng tr×nh trªn nh− sau:

A::A(float,float)

B::B(float,float)

C::C(float,float)

D::D(float,float)

D d (2,3)

d.C::getx() = 2

d.B::getx() = 2

d.C::gety() = 3

d.B::gety() = 3

d1 (10,20)

Page 124: GT LapTrinhHuongDoiTuong_Chinh Thuc

124

A::A(float,float)

B::B(float,float)

C::C(float,float)

D::D(float,float)

d.C::getx() = 2

d.B::getx() = 2

d.C::gety() = 3

d.B::gety() = 3

Page 125: GT LapTrinhHuongDoiTuong_Chinh Thuc

125

Bμi tËp

1. X©y dùng líp cã tªn lµ Stack víi c¸c thao t¸c cÇn thiÕt. Tõ ®ã h·y dÉn xuÊt tõ

líp stack ®Ó ®æi mét sè nguyªn d−¬ng sang hÖ ®Õm bÊt kú.

2. ViÕt mét ph©n cÊp kÕ thõa cho c¸c líp h×nh tø gi¸c, h×nh thang, h×nh b×nh

hµnh, h×nh ch÷ nhËt, h×nh vu«ng.

3. T¹o mét líp c¬ së cã tªn lµ airship ®Ó l−u th«ng tin vÒ sè l−îng hµnh kh¸ch tèi

®a vµ träng l−îng hµng hãa tèi ®a mµ m¸y bay cã thÓ chë ®−îc. Tõ ®ã h·y t¹o

hai líp dÉn xuÊt airplane vµ balloon, líp airplane l−u th«ng tin vÒ kiÓu ®éng

c¬ (gåm ®éng c¬ c¸nh qu¹t vµ ®éng c¬ ph¶n lùc), líp balloon l−u th«ng tin vÒ

lo¹i nhiªn liÖu sö dông cho khÝ cÇu (gåm hai lo¹i lµ hydrogen vµ helium). H·y

viÕt ch−¬ng tr×nh minh häa.

4. Mét nhµ xuÊt b¶n nhËn xuÊt b¶n s¸ch. S¸ch cã hai lo¹i: lo¹i cã h×nh ¶nh ë

trang b×a vµ lo¹i kh«ng cã h×nh ¶nh ë trang b×a. Lo¹i cã h×nh ¶nh ë trang b×a

th× ph¶i thuª häa sÜ vÏ b×a. ViÕt ch−¬ng tr×nh thùc hiÖn c¸c yªu cÇu :

- T¹o mét líp c¬ së cã tªn lµ SACH ®Ó l−u th«ng tin vÒ tªn s¸ch, t¸c gi¶, sè

trang, gi¸ b¸n vµ ®Þnh nghÜa hµm thµnh phÇn cho phÐp nhËp d÷ liÖu cho c¸c

®èi t−îng cña líp SACH.

- T¹o líp BIA kÕ thõa tõ líp SACH ®Ó l−u c¸c th«ng tin : M· h×nh ¶nh, tiÒn vÏ

vµ ®Þnh nghÜa hµm thµnh phÇn cho phÐp nhËp d÷ liÖu cho c¸c ®èi t−îng cña

líp BIA.

- T¹o líp HOASY ®Ó l−u c¸c th«ng tin hä tªn, ®Þa chØ cña häa sü vµ ®Þnh

nghÜa hµm thµnh phÇn cho phÐp nhËp d÷ liÖu cho c¸c ®èi t−îng cña líp

HOASY.

- T¹o líp SACHVEBIA kÕ thõa tõ líp BIA vµ líp HOASY vµ ®Þnh nghÜa hµm

thµnh phÇn cho phÐp nhËp d÷ liÖu cho c¸c ®èi t−îng cña líp SACHVEBIA.

ViÕt hµm main() cho phÐp nhËp vµo hai danh s¸ch : danh s¸ch c¸c s¸ch cã vÏ

b×a vµ danh s¸ch c¸c s¸ch kh«ng cã vÏ b×a (cã thÓ dïng m¶ng tÜnh hoÆc m¶ng

con trá).

5. X©y dùng líp h×nh vu«ng cã tªn lµ HVUONG víi c¸c d÷ liÖu thµnh phÇn nh−

sau: ®é dµi c¹nh. C¸c hµm thµnh phÇn ®Ó nhËp d÷ liÖu, hiÓn thÞ d÷ liÖu, tÝnh

diÖn tÝch, chu vi h×nh vu«ng. Tõ líp HVUONG, x©y dùng líp dÉn xuÊt cã tªn

lµ CHUNHAT, lµ líp kÕ thõa cña líp HVUONG vµ ®−îc bæ sung thªm thuéc

Page 126: GT LapTrinhHuongDoiTuong_Chinh Thuc

126

tÝnh sau: ®é dµi c¹nh thø hai. C¸c hµm thµnh phÇn ®Ó nhËp d÷ liÖu, hiÓn thÞ d÷

liÖu ®Ó tÝnh diÖn tÝch vµ chu vi h×nh ch÷ nhËt. ViÕt ch−¬ng tr×nh minh häa.

6. X©y dùng líp c¬ së CANBO cã d÷ liÖu thµnh phÇn lµ m· c¸n bé, m· ®¬n vÞ,

hä tªn, ngµy sinh. C¸c hµm thµnh phÇn bao gåm: nhËp d÷ liÖu c¸n bé, hiÓn thÞ

d÷ liÖu. Líp dÉn xuÊt LUONG kÕ thõa líp CANBO vµ cã thªm c¸c thuéc tÝnh:

phô cÊp, hÖ sè l−¬ng, b¶o hiÓm. Hµm thµnh phÇn ®Ó tÝnh l−¬ng c¸n bé theo

c«ng thøc:

l−¬ng = hÖ sè l−¬ng *290000 + phô cÊp - b¶o hiÓm

H·y thiÕt kÕ ch−¬ng tr×nh ®Ó ®¸p øng c¸c yªu cÇu:

- NhËp danh s¸ch c¸n bé

- In b¶ng l−¬ng c¸c c¸n bé theo tõng ®¬n vÞ.

7. Nh©n viªn trong mét c¬ quan ®−îc lÜnh l−¬ng theo c¸c d¹ng kh¸c nhau. D¹ng

ng−êi lao ®éng h−ëng l−¬ng tõ ng©n s¸ch Nhµ n−íc gäi lµ c¸n bé, c«ng chøc

(d¹ng biªn chÕ). D¹ng ng−êi lao ®éng lÜnh l−¬ng tõ ng©n s¸ch cña c¬ quan gäi

lµ ng−êi lµm hîp ®ång. Nh− vËy hÖ thèng cã hai ®èi t−îng: biªn chÕ vµ hîp

®ång.

- Hai lo¹i ®èi t−îng nµy cã ®Æc tÝnh chung lµ viªn chøc lµm viÖc cho c¬ quan.

Tõ ®©y cã thÓ t¹o nªn líp c¬ së ®Ó qu¶n lý mét viªn chøc ( líp Nguoi) bao

gåm m· sè, hä tªn, l−¬ng.

- Hai líp kÕ thõa tõ líp c¬ së trªn:

+ Líp Bienche gåm c¸c thuéc tÝnh: hÖ sè l−¬ng, tiÒn phô cÊp chøc vô.

+ Líp Hopdong gåm c¸c thuéc tÝnh: tiÒn c«ng lao ®éng, sè ngµy lµm

viÖc trong th¸ng, hÖ sè v−ît giê.

H·y thiÕt kÕ c¸c líp trªn vµ viÕt ch−¬ng tr×nh minh häa.

8. ViÕt ch−¬ng tr×nh qu¶n lý s¸ch b¸o, t¹p chÝ cña th− viÖn trong tr−êng ®¹i häc,

h»ng th¸ng gëi vÒ khoa hä tªn cña c¸c gi¸o viªn vµ sinh viªn ®· qu¸ thêi h¹n

m−în s¸ch.

9. ViÕt ch−¬ng tr×nh tÝnh vµ in b¶ng l−¬ng hµng th¸ng cña gi¸o viªn vµ ng−êi

lµm hîp ®ång trong mét tr−êng ®¹i häc. Gi¶ sö viÖc tÝnh tãan tiÒn l−¬ng ®−îc

c¨n cø vµo c¸c yÕu tè sau:

- §èi víi gi¸o viªn: sè tiÕt d¹y trong th¸ng, tiÒn d¹y mét tiÕt.

- §èi víi ng−êi lµm hîp ®ång: tiÒn c«ng ngµy, sè ngµy lµm viÖc

10. Gi¶ sö cuèi n¨m häc cÇn trao phÇn th−ëng cho c¸c sinh viªn giái, c¸c gi¸o

viªn cã tham gia nghiªn cøu khoa häc. §iÒu kiÖn khen th−ëng cña sinh viªn lµ

Page 127: GT LapTrinhHuongDoiTuong_Chinh Thuc

127

cã ®iÓm trung b×nh lín h¬n 8. §iÒu kiÖn khen th−ëng cña gi¸o viªn lµ cã Ýt

nhÊt mét bµi b¸o nghiªn cøu khoa häc. S¬ ®å cÊu tróc ph©n cÊp líp nh− sau:

Nguoi

Hä tªn

Ngµy sinh

C¸c ph−¬ng

thøc

Sinhvien

Líp

§iÓm trung

b×nh

C¸c ph−¬ng

thøc

Yªu cÇu:

- X©y dùng c¸c líp theo s¬ ®å kÒ thõa ë trªn, mçi líp cã c¸c hµm thµnh phÇn

®Ó nhËp, xuÊt d÷ liÖu, hµm kiÓm tra khen th−ëng.

- H·y viÕt hµm main() cho phÐp nhËp vµo d÷ liÖu cña kh«ng qu¸ 100 sinh viªn

vµ kh«ng qu¸ 30 gi¸o viªn. In ra danh s¸ch sinh viªn vµ gi¸o viªn ®−îc khen

th−ëng.

Giaovien

Bé m«n

Sè bµi b¸o

C¸c ph−¬ng

thøc

Page 128: GT LapTrinhHuongDoiTuong_Chinh Thuc

128

11. Gi¶ sö ta cã s¬ ®å kÕ thõa cña c¸c líp nh− sau:

HINHHOC

HAICHIEU

Yªu cÇu:

- ThiÕt kÕ c¸c líp ®Ó cã thÓ in ra c¸c th«ng tin cña c¸c h×nh (trßn, ch÷ nhËt, lËp

ph−¬ng) bao gåm: diÖn tÝch, chu vi, thÓ tÝch.

- ViÕt ch−¬ng tr×nh minh häa.

12. ViÕt ch−¬ng tr×nh qu¶n lý viÖc m−în vµ tr¶ s¸ch ë mét th− viÖn theo ph−¬ng

ph¸p lËp tr×nh h−íng ®èi t−îng. Ch−¬ng tr×nh cho phÐp:

- §¨ng ký b¹n ®äc míi víi th«ng tin lµ m· vµ tªn b¹n ®äc, sè ®iÖn tho¹i

- NhËp s¸ch míi víi th«ng tin lµ m· s¸ch, tªn s¸ch, sè l−îng, nhµ xuÊt b¶n.

- M−în vµ tr¶ s¸ch.

- Thèng kª b¹n ®äc.

- Thèng kª s¸ch.

BACHIEU

TRON CHUNHAT LAPPHUONG

Page 129: GT LapTrinhHuongDoiTuong_Chinh Thuc

129

Ch−¬ng 6

Khu«n h×nh

6.1. Khu«n h×nh hµm

6.1.1. Kh¸i niÖm

Ta ®· biÕt hµm qu¸ t¶i cho phÐp dïng mét tªn duy nhÊt cho nhiÒu hµm ®Ó

thùc hiÖn c¸c c«ng viÖc kh¸c nhau. Kh¸i niÖm khu«n h×nh hµm còng cho phÐp sö

dông cïng mét tªn duy nhÊt ®Ó thùc hiÖn c¸c c«ng viÖc kh¸c nhau, tuy nhiªn so

víi ®Þnh nghÜa hµm qu¸ t¶i, nã cã phÇn m¹nh h¬n vµ chÆt chÏ h¬n. M¹nh h¬n v×

chØ cÇn viÕt ®Þnh nghÜa khu«n h×nh hµm mét lÇn, råi sau ®ã ch−¬ng tr×nh biªn

dÞch lµm cho nã thÝch øng víi c¸c kiÓu d÷ liÖu kh¸c nhau. ChÆt chÏ h¬n bëi v×

dùa theo khu«n h×nh hµm, tÊt c¶ c¸c hµm thÓ hiÖn ®−îc sinh ra bëi ch−¬ng tr×nh

dÞch sÏ t−¬ng øng víi cïng mét ®Þnh nghÜa vµ nh− vËy sÏ cã cïng mét gi¶i thuËt.

6.1.2. T¹o mét khu«n h×nh hµm

Gi¶ thiÕt r»ng chóng ta cÇn viÕt mét hµm min ®−a ra gi¸ trÞ nhá nhÊt trong

hai gi¸ trÞ cã cïng kiÓu. Ta cã thÓ viÕt mét ®Þnh nghÜa nh− thÕ víi kiÓu int nh−

sau:

int min (int a, int b)

{

if (a<b)

return a;

else

return b;

}

NÕu ta muèn sö dông hµm min cho kiÓu double, float, char,.... ta l¹i ph¶i

viÕt l¹i ®Þnh nghÜa hµm min, vÝ dô:

float min (float a, float b)

{

if (a < b)

return a;

else

return b;

}

Page 130: GT LapTrinhHuongDoiTuong_Chinh Thuc

130

Nh− vËy ta ph¶i viÕt rÊt nhiÒu ®Þnh nghÜa hµm hoµn toµn t−¬ng tù nhau, chØ

cã kiÓu d÷ liÖu lµ thay ®æi. Ch−¬ng tr×nh dÞch C++ cho phÐp gi¶i quyÕt ®¬n gi¶n

vÊn ®Ò trªn b»ng c¸ch ®Þnh nghÜa mét khu«n h×nh hµm duy nhÊt theo có ph¸p:

template <danh s¸ch tham sè kiÓu> <kiÓu tr¶ vÒ> tªn hµm(khai b¸o tham sè)

{

// ®Þnh nghÜa hµm

}

trong ®ã <danh s¸ch tham sè kiÓu> lµ c¸c kiÓu d÷ liÖu ®−îc khai b¸o víi tõ kho¸

class, c¸ch nhau bëi dÊu phÈy. KiÓu d÷ liÖu lµ mét kiÓu bÊt kú, kÓ c¶ kiÓu class.

VÝ dô 6.1 X©y dùng khu«n h×nh cho hµm t×m gi¸ trÞ nhá nhÊt cña hai sè:

template <class Kieuso> Kieuso min(Kieuso a, Kieuso

b)

{

if (a<b)

return a;

else

return b;

}

6.1.3. Sö dông khu«n h×nh hµm

§Ó sö dông khu«n h×nh hµm min võa t¹o ra, chØ cÇn sö dông hµm min trong

nh÷ng ®iÒu kiÖn phï hîp, trong tr−êng hîp nµy lµ hai tham sè cña hµm ph¶i cïng

kiÓu d÷ liÖu. Nh− vËy, nÕu trong mét ch−¬ng tr×nh cã hai tham sè nguyªn n vµ m

(kiÓu int) víi lêi gäi min(n,m) th× ch−¬ng tr×nh dÞch tù ®éng s¶n sinh ra hµm

min(), gäi lµ mét hµm thÓ hiÖn, t−¬ng øng víi hai tham sè kiÓu int. NÕu chóng

ta gäi min() víi hai tham sè kiÓu float, ch−¬ng tr×nh biªn dÞch còng tù ®éng s¶n

sinh mét hµm thÓ hiÖn min kh¸c t−¬ng øng víi c¸c tham sè kiÓu float vµ cø thÕ

víi c¸c kiÓu d÷ liÖu kh¸c.

Chó ý:

- C¸c biÕn truyÒn cho danh s¸ch tham sè cña hµm ph¶i chÝnh x¸c víi kiÓu

khai b¸o.

Page 131: GT LapTrinhHuongDoiTuong_Chinh Thuc

131

- Muèn ¸p dông ®−îc víi kiÓu líp th× trong líp ph¶i ®Þnh nghÜa c¸c to¸n tö

t¶i béi t−¬ng øng.

6.1.4. C¸c tham sè kiÓu cña khu«n h×nh hµm

Khu«n h×nh hµm cã thÓ cã mét hay nhiÒu tham sè kiÓu, mçi tham sè ®i liÒn

sau tõ kho¸ class. C¸c tham sè nµy cã thÓ ë bÊt kú ®©u trong ®Þnh nghÜa cña

khu«n h×nh hµm, nghÜa lµ :

- Trong dßng tiªu ®Ò (ë dßng ®Çu khai b¸o template).

- Trong c¸c khai b¸o biÕn côc bé.

- Trong c¸c chØ thÞ thùc hiÖn.

Trong mäi tr−êng hîp, mçi tham sè kiÓu ph¶i xuÊt hiÖn Ýt nhÊt mét lÇn

trong khai b¸o danh s¸ch tham sè h×nh thøc cña khu«n h×nh hµm. §iÒu ®ã hoµn

toµn logic, bëi v× nhê c¸c tham sè nµy, ch−¬ng tr×nh dÞch míi cã thÓ s¶n sinh ra

hµm thÓ hiÖn cÇn thiÕt.

ë khu«n h×nh hµm min trªn, míi chØ cho phÐp t×m min cña hai sè cïng

kiÓu, nÕu muèn t×m min hai sè kh¸c kiÓu th× khu«n h×nh hµm trªn ch−a ®¸p øng

®−îc. VÝ dô sau sÏ kh¾c phôc ®−îc ®iÒu nµy.

VÝ dô 6.2

#include <iostream.h>

template <class kieuso1,class kieuso2> kieuso1

min(kieuso1 a,kieuso2 b)

{

return a<b ? a : b;

}

void main(){

float a =2.5;

int b = 8;

cout << "so nho nhat la :" << min(a,b);

}

VÝ dô 6.3 Gi¶ sö trong líp SO c¸c sè int ®· x©y dùng, ta cã x©y dùng c¸c to¸n tö

t¶i béi < , << cho c¸c ®èi t−îng cña class SO ( xem ch−¬ng 4). Néi dung file

ttclsso.h nh− sau:

class SO

{

Page 132: GT LapTrinhHuongDoiTuong_Chinh Thuc

132

private:

int giatri;

public:

SO(int x=0)

{

giatri = x;

}

SO (SO &tso)

{

giatri = tso.giatri;

}

SO (){}; //Giong nhu ham thiet lap ngam dinh

~SO()

{ }

int operator<(SO & s)

{

return (giatri <s.giatri);

}

friend istream& operator>>(istream&,SO&);

friend ostream& operator<<(ostream&,SO&);

};

Ch−¬ng tr×nh sau ®©y cho phÐp thö hµm min trªn hai ®èi t−îng kiÓu class:

VÝ dô 6.4 Ch−¬ng tr×nh sau ®©y cho phÐp thö hµm min trªn hai ®èi t−îng kiÓu

class:

#include <iostream.h>

#include <ttclsso.h>

template <class kieuso1,class kieuso2> kieuso1

min(kieuso1 a,kieuso2 b)

{

if (a<b)

return a;

else

Page 133: GT LapTrinhHuongDoiTuong_Chinh Thuc

133

return b;

}

void main(){

float a =2.5;

int b = 8;

cout << "so nho nhat la :" << min(a,b)<<endl;

SO so1(15),so2(20);

cout << "so nho nhat la :" << min(so2,so1);

}

6.1.5. §Þnh nghÜa chång c¸c khu«n h×nh hµm

T−¬ng tù viÖc ®Þnh nghÜa c¸c hµm qu¸ t¶i, C++ cho phÐp ®Þnh nghÜa chång

c¸c khu«n h×nh hµm, tøc lµ cã thÓ ®Þnh nghÜa mét hay nhiÒu khu«n h×nh hµm cã

cïng tªn nh−ng víi c¸c tham sè kh¸c nhau. §iÒu ®ã sÏ t¹o ra nhiÒu hä c¸c hµm

(mçi khu«n h×nh hµm t−¬ng øng víi hä c¸c hµm).

VÝ dô cã ba hä hµm min :

- Mét hä gåm c¸c hµm t×m gi¸ trÞ nhá nhÊt trong hai gi¸ trÞ

- Mét hä gåm c¸c hµm t×m gi¸ trÞ nhá nhÊt trong ba gi¸ trÞ

- Mét hä gåm c¸c hµm t×m gi¸ trÞ nhá nhÊt trong mét m¶ng gi¸ trÞ.

Mét c¸ch tæng qu¸t, ta cã thÓ ®Þnh nghÜa mét hay nhiÒu khu«n h×nh cïng

tªn, mçi khu«n h×nh cã c¸c tham sè kiÓu còng nh− lµ c¸c tham sè biÓu thøc

riªng. H¬n n÷a, cã thÓ cung cÊp c¸c hµm th«ng th−êng víi cïng tªn víi cïng

mét khu«n h×nh hµm, trong tr−êng hîp nµy ta nãi ®ã lµ sù cô thÓ ho¸ mét hµm

thÓ hiÖn.

Trong tr−êng hîp tæng qu¸t khi cã ®ång thêi c¶ hµm qu¸ t¶i vµ khu«n h×nh

hµm, ch−¬ng tr×nh dÞch lùa chän hµm t−¬ng øng víi mét lêi gäi hµm dùa trªn c¸c

nguyªn t¾c sau:

§Çu tiªn, kiÓm tra tÊt c¶ c¸c hµm th«ng th−êng cïng tªn vµ chó ý ®Õn sù

t−¬ng øng chÝnh x¸c; nÕu chØ cã mét hµm phï hîp, hµm ®ã ®−îc chän; Cßn nÕu

cã nhiÒu hµm cïng tháa m·n sÏ t¹o ra mét lçi biªn dÞch vµ qu¸ tr×nh t×m kiÕm bÞ

gi¸n ®äan.

NÕu kh«ng cã hµm th«ng th−êng nµo t−¬ng øng chÝnh x¸c víi lêi gäi, khi

®ã ta kiÓm tra tÊt c¶ c¸c khu«n h×nh hµm cã trïng tªn víi lêi gäi, khi ®ã ta kiÓm

tra tÊt c¶ c¸c khu«n h×nh hµm cã trïng tªn víi lêi gäi; nÕu chØ cã mét t−¬ng øng

Page 134: GT LapTrinhHuongDoiTuong_Chinh Thuc

134

chÝnh x¸c ®−îc t×m thÊy, hµm thÓ hiÖn t−¬ng øng ®−îc s¶n sinh vµ vÊn ®Ò ®−îc

gi¶i quyÕt; cßn nÕu cã nhiÒu h¬n mét khu«n h×nh hµm ®iÒu ®ã sÏ g©y ra lçi biªn

dÞch vµ qu¸ tr×nh dõng.

Cuèi cïng, nÕu kh«ng cã khu«n h×nh hµm phï hîp, ta kiÓm tra mét lÇn n÷a

tÊt c¶ c¸c hµm th«ng th−êng cïng tªn víi lêi gäi. Trong tr−êng hîp nµy chóng ta

ph¶i t×m kiÕm sù t−¬ng øng dùa vµo c¶ c¸c chuyÓn kiÓu cho phÐp trong C/C++.

6.2. Khu«n h×nh líp

6.2.1. Kh¸i niÖm

Bªn c¹nh kh¸i niÖm khu«n h×nh hµm, C++ cßn cho phÐp ®Þnh nghÜa khu«n

h×nh líp. Còng gièng nh− khu«n h×nh hµm, ë ®©y ta chØ cÇn viÕt ®Þnh nghÜa c¸c

khu«n h×nh líp mét lÇn råi sau ®ã cã thÓ ¸p dông chóng víi c¸c kiÓu d÷ liÖu

kh¸c nhau ®Ó ®−îc c¸c líp thÓ hiÖn kh¸c nhau.

6.2.2. T¹o mét khu«n h×nh líp

Trong ch−¬ng tr−íc ta ®· ®Þnh nghÜa cho líp SO, gi¸ trÞ c¸c sè lµ kiÓu int.

NÕu ta muèn lµm viÖc víi c¸c sè kiÓi float, double,... th× ta ph¶i ®Þnh nghÜa l¹i

mét líp kh¸c t−¬ng tù, trong ®ã kiÓu d÷ liÖu int cho d÷ liÖu giatri sÏ ®−îc thay

b»ng float,double,...

§Ó tr¸nh sù trïng lÆp trong c¸c t×nh huèng nh− trªn, ch−¬ng tr×nh dÞch C++

cho phÐp ®Þnh nghÜa mét khu«n h×nh líp vµ sau ®ã, ¸p dông khu«n h×nh líp nµy

víi c¸c kiÓu d÷ liÖu kh¸c nhau ®Ó thu ®−îc c¸c líp thÓ hiÖn nh− mong muèn. VÝ

dô :

template <class kieuso> class SO

{

kieuso giatri;

public :

SO (kieuso x =0);

void Hienthi();

...

};

Còng gièng nh− c¸c khu«n h×nh hµm, template <class kieuso>

x¸c ®Þnh r»ng ®ã lµ mét khu«n h×nh trong ®ã cã mét tham sè kتu kieuso .

Page 135: GT LapTrinhHuongDoiTuong_Chinh Thuc

135

C++ sö dông tõ kho¸ class chØ ®Ó nãi r»ng kieuso ®¹i diÖn cho mét kiÓu d÷

liÖu nµo ®ã.

ViÖc ®Þnh nghÜa c¸c hµm thµnh phÇn cña khu«n h×nh líp, ng−êi ta ph©n biÖt

hai tr−êng hîp:

Khi hµm thµnh phÇn ®−îc ®Þnh nghÜa bªn trong ®Þnh nghÜa líp th× kh«ng cã

g× thay ®æi.

Khi hµm thµnh phÇn ®−îc ®Þnh nghÜa bªn ngoµi líp, khi ®ã cÇn ph¶i nh¾c

l¹i cho ch−¬ng tr×nh biÕt c¸c tham sè kiÓu cña khu«n h×nh líp, cã nghÜa lµ ph¶i

nh¾c l¹i template <class kieuso> ch¼ng h¹n, tr−íc ®Þnh nghÜa hµm. VÝ

dô hµm Hienthi() ®−îc ®Þnh nghÜa ngoµi líp:

template <class kieuso> void SO<kieuso>::Hienthi()

{

cout <<giatri;

}

6.2.3. Sö dông khu«n h×nh líp

Sau khi mét khu«n h×nh líp ®· ®−îc ®Þnh nghÜa, nã sÏ ®−îc dïng ®Ó khai

b¸o c¸c ®èi t−îng theo d¹ng sau :

Tªn_líp <KiÓu> Tªn_®èi_t−îng;

VÝ dô c©u lÖnh khai b¸o SO <int> so1; sÏ khai b¸o mét ®èi t−îng so1 cã thµnh

phÇn d÷ liÖu giatri cã kiÓu nguyªn int.

SO <int> cã vai trß nh− mét kiÓu d÷ liÖu líp; ng−êi ta gäi nã lµ mét líp thÓ

hiÖn cña khu«n h×nh líp SO. Mét c¸ch tæng qu¸t, khi ¸p dông mét kiÓu d÷ liÖu

nµo ®ã víi khu«n h×nh líp SO ta sÏ cã ®−îc mét líp thÓ hiÖn t−¬ng øng víi kiÓu

d÷ liÖu.

T−¬ng tù víi c¸c khai b¸o SO <float> so2; cho phÐp khai b¸o mét ®èi

t−îng so2 mµ thµnh phÇn d÷ liÖu giatri cã kiÓu float.

VÝ dô 6.5

#include <iostream.h>

#include <conio.h>

template <class kieuso> class SO

{

Page 136: GT LapTrinhHuongDoiTuong_Chinh Thuc

136

kieuso giatri;

public :

SO (kieuso x =0);

void Hienthi(){

cout<<"Gia tri cua so :"<<giatri<<endl;

}

};

void main(){

clrscr();

SO <int> soint(10); soint.Hienthi();

SO <float> sofl(25.4); sofl.Hienthi();

getch();

}

KÕt qu¶ trªn mµn h×nh lµ:

Gia tri cua so : 10

Gia tri cua so : 25.4

6.2.4. C¸c tham sè trong khu«n h×nh líp

Hoµn toµn gièng nh− khu«n h×nh hµm, c¸c khu«n h×nh líp cã thÓ cã c¸c

tham sè kiÓu vµ tham sè biÓu thøc.

VÝ dô mét líp mµ c¸c thµnh phÇn cã c¸c kiÓu d÷ liÖu kh¸c nhau ®−îc khai b¸o

theo d¹ng:

template <class T, class U,.... class Z>

class <ten lop>{

T x;

U y;

.....

Z fct1 (int);

.....

};

Page 137: GT LapTrinhHuongDoiTuong_Chinh Thuc

137

Mét líp thÓ hiÖn ®−îc khai b¸o b»ng c¸ch liÖt kª ®»ng sau tªn khu«n h×nh

líp c¸c tham sè thùc, lµ tªn kiÓu d÷ liÖu, víi sè l−îng b»ng c¸c tham sè trong

danh s¸ch cña khu«n h×nh líp (template<...>)

6.2.5. Tãm t¾t

Khu«n h×nh líp/hµm lµ ph−¬ng tiÖn m« t¶ ý nghÜa cña mét líp/hµm tæng

qu¸t, cßn líp/hµm thÓ hiÖn lµ mét b¶n sao cña khu«n h×nh tæng qu¸t víi c¸c kiÓu

d÷ liÖu cô thÓ.

C¸c khu«n h×nh líp/hµm th−êng ®−îc tham sè ho¸. Tuy nhiªn vÉn cã thÓ sö

dông c¸c kiÓu d÷ liÖu cô thÓ trong c¸c khu«n h×nh líp/hµm nÕu cÇn.

Page 138: GT LapTrinhHuongDoiTuong_Chinh Thuc

138

Bμi tËp

1. ViÕt khu«n h×nh hµm ®Ó t×m sè lín nhÊt cña hai sè bÊt kú

2. ViÕt khu«n h×nh hµm ®Ó tr¶ vÒ gi¸ trÞ trung b×nh cña mét m¶ng, c¸c tham

sè h×nh thøc cña hµm nµy lµ tªn m¶ng, kÝch th−íc m¶ng.

3. Cµi ®Æt hµng ®îi templete.

4. ViÕt khu«n h×nh hµm ®Ó s¾p xÕp kiÓu d÷ liÖu bÊt kú.

5. X©y dùng khu«n h×nh líp cho c¸c täa ®é ®iÓm trong mÆt ph¼ng, c¸c

thµnh phÇn d÷ liÖu cña líp lµ toadox, toadoy.

6. X©y dùng khu«n h×nh líp cho vector ®Ó qu¶n lý c¸c vector cã thµnh phÇn

cã kiÓu tïy ý.

Page 139: GT LapTrinhHuongDoiTuong_Chinh Thuc

139

Phô lôc

C¸c dßng xuÊt nhËp

C++ sö dông kh¸i niÖm dßng (stream) vµ ®−a ra c¸c líp dßng ®Ó tæ chøc

viÖc nhËp xuÊt. Dßng cã thÓ xem nh− mét d·y tuÇn tù c¸c byte. Thao t¸c nhËp lµ

®äc c¸c byte tõ dßng (gäi lµ dßng nhËp – input) vµo bé nhí. Thao t¸c xuÊt lµ ®−a

c¸c byte tõ bé nhí ra dßng (gäi lµ dßng xuÊt- output). C¸c thao t¸c nµy lµ ®éc lËp

thiÕt bÞ. ®Ó thùc hiÖn viÖc nhËp, xuÊt lªn mét thiÕt bÞ cô thÓ, chóng ta chØ cÇn

g¾n dßng tin víi thiÕt bÞ nµy.

1.1. C¸c líp stream

Cã 4 líp stream quan träng lµ: líp c¬ së ios, tõ líp ios dÉn xuÊt ®Õn hai líp

istream vµ iostream. Hai líp istream vµ ostream l¹i dÉn xuÊt víi líp iostream. S¬

®å kÕ thõa gi÷a c¸c líp nh− sau;

Líp ios: ®Þnh nghÜa c¸c thuéc tÝnh ®−îc sö dông lµm c¸c cê ®Þnh d¹ng cho

viÖc xuÊt nhËp vµ c¸c cê kiÓm tra lçi, c¸c ph−¬ng thøc cña líp ios phôc vô

viÖc ®Þnh d¹ng d÷ liÖu nhËp xuÊt, kiÓm tra lçi.

Líp iostream: cung cÊp to¸n tö nhËp >> vµ nhiÒu ph−¬ng thøc nhËp kh¸c,

ch¼ng h¹n c¸c ph−¬ng thøc: get, getline, read,ignore, peek, seekg, tellg, ...

Líp ostream: cung cÊp to¸n tö xuÊt << vµ nhiÒu ph−¬ng thøc xuÊt kh¸c,

ch¼ng h¹n c¸c ph−¬ng thøc: put, write, flush, seekp, tellp, ...

Líp iostream: thõa kÕ c¸c ph−¬ng thøc nhËp cña c¸c líp istream vµ

ostream.

1.2. Dßng cin vµ to¸n tö nhËp >>

1.2.1 Dßng cin

cin lµ ®èi t−îng cña líp istream. §ã lµ dßng nhËp vµ ®−îc nãi lµ “bÞ rµng

buéc tíi” hoÆc kÕt nèi tíi thiÕt bÞ nhËp chuÈn, th«ng th−êng lµ bµn phÝm. C¸c

thao t¸c nhËp trªn dßng cin ®ång nghÜa víi nhËp d÷ liÖu tõ bµn phÝm.

ios

istream ostream

iostream

Page 140: GT LapTrinhHuongDoiTuong_Chinh Thuc

140

1.2.2. To¸n tö trÝch >>

To¸n tö trÝch >> ®−îc sö dông nh− sau ®Ó ®äc d÷ liÖu tõ dßng cin:

cin>> biÕn;

§Ó nhËp gi¸ trÞ cña nhiÒu biÕn trªn mét dßng lÖnh ta dïng có ph¸p sau:

cin>>biÕn 1>>biÕn 2>>...>>biÕn n;

1.3. NhËp ký tù vµ chuçi ký tù

Cã thÓ dïng c¸c ph−¬ng thøc sau (®Þnh nghÜa trong líp istream) ®Ó nhËp ký

tù vµ chuçi: cin.get cin.getline cin.ignore

1.3.1. Ph−¬ng thøc get() cã 3 d¹ng:

D¹ng 1: int cin.get();

Dïng ®Ó ®äc mét ký tù (kÓ c¶ kho¶ng tr¾ng).

D¹ng 2: istream& cin.get(char &ch);

Dïng ®Ó ®äc mét ký tù (kÓ c¶ kho¶ng tr¾ng) vµ ®Æt vµo mét biÕn kiÓu char ®−îc

tham chiÕu bëi ch.

D¹ng 3: istream& cin.get(char *str, int n, char d = ‘\n’);

Dïng ®Ó ®äc mét d·y ký tù (kÓ c¶ kho¶ng tr¾ng) vµ ®−a vµo vïng nhí do str trá

tíi. Qu¸ tr×nh ®äc kÕt thóc khi x¶y ra mét trong hai t×nh huèng sau:

+ GÆp ký tù giíi h¹n (cho trong d). Ký tù giíi h¹n mÆc ®Þnh lµ ‘\n’.

+ §· nhËn ®ñ (n-1) ký tù.

Chó ý:

+ Ký tù kÕt thóc chuçi ‘\0’ ®−îc bæ sung vµo cuèi chuèi nhËn ®−îc.

+ Ký tù giíi h¹n vÉn cßn l¹i trªn dßng nhËp ®Ó dµnh cho c¸c lÖnh nhËn tiÕp

theo.

+ Ký tù <Enter> cßn l¹i trªn dßng nhËp cã thÓ lµm tr«i ph−¬ng thøc get() d¹ng

3. VÝ dô: XÐt ®o¹n ch−¬ng tr×nh:

char hoten[25], diachi[50], quequan[30] ; cout<<”\nHä tªn:”;

cin.get(ht,25);

cout<<”\n§Þa chØ : ”;

cin.get(diachi,50);

cout<<”\nQuª qu¸n : ”;

cin.get(quequan,30);

cout <<”\n” <<hoten<<” ”<<diachi<<” ”<<quequan;

Page 141: GT LapTrinhHuongDoiTuong_Chinh Thuc

141

§o¹n ch−¬ng tr×nh dïng ®Ó nhËp hä tªn, dÞa chØ vµ quª qu¸n. NÕu gâ vµo

Nguyen van X <Enter> th× c©u lÖnh get ®Çu tiªn sÏ nhËn ®−îc chuçi “Nguyen

van X” cÊt vµo m¶ng hoten. Ký tù <Enter> cßn l¹i sÏ lµm tr«i 2 c©u lÖnh get tiÕp

theo. Do ®ã c©u lÖnh cuèi cïng sÏ chØ in ra Nguyen van X.

§Ó kh¾c phôc t×nh tr¹ng trªn, cã thÓ dïng mét trong c¸c c¸ch sau:

+ Dïng ph−¬ng thøc get() d¹ng 1 hoÆc d¹ng 2 ®Ó lÊy ra ký tù <Enter> trªn

dßng nhËp tr−íc khi dïng get (d¹ng 3).

+ Dïng ph−¬ng thøc ignore ®Ó lÊy ra mét sè ký tù kh«ng cÇn thiÕt trªn dßng

nhËp tr−íc khi dïng get d¹ng 3. Ph−¬ng thøc nµy viÕt nh− sau:

cin.ignore(n) ; // LÊy ra (lo¹i ra hay lo¹i bá) n ký tù trªn dßng nhËp.

Nh− vËy ®Ó cã thÓ nhËp ®−îc c¶ quª qu¸n vµ c¬ quan, cÇn söa l¹i ®o¹n ch−¬ng

tr×nh trªn nh− sau:

char hoten[25], diachi[50], quequan[30] ; cout<<”\nHä tªn : ”;

cin.get(hoten,25);

cin.get(); // NhÊn < Enter>

cout<<”\n§Þa chØ : ”;

cin.get(diachi,50);

ignore(1); // Bá qua <Enter>

cout<<”\nQuª qu¸n : ”;

cin.get(quequan,30);

cout <<”\n” <<hoten<<” ”<<diachi<<” ”<<quequan;

1.3.2. Ph−¬ng thøc getline()

Ph−¬ng thøc getline ®Ó nhËp mét d·y ký tù tõ bµn phÝm, ®−îc m« t¶ nh−

sau:

istream& cin.getline(char *str, int n, char d = ‘\n’);

VÝ dô:

char hoten[25], diachi[50];

cout<<”\nHä tªn:”;

cin.getline(hoten,25);

cout<<”\n§Þa chØ”;

cin.getline(diachi,50);

cout <<”\n” <<hoten<<” ”<<diachi;

Page 142: GT LapTrinhHuongDoiTuong_Chinh Thuc

142

1.3.3. Ph−¬ng thøc ignore

Ph−¬ng thøc ignore dïng ®Ó bá qua (lo¹i bá) mét sè ký tù trªn dßng nhËp.

Trong nhiÒu tr−êng hîp, ®©y lµ viÖc lµm cÇn thiÕt ®Ó kh«ng lµm ¶nh h−ëng ®Õn

c¸c phÐp nhËp tiÕp theo. Ph−¬ng thøc ignore ®−îc m« t¶ nh− sau:

istream& cin.ignore(int n=1);

Ph−¬ng thøc sÏ bá qua (lo¹i bá) n ký tù trªn dßng nhËp.

1.4. Dßng cout vµ to¸n tö xuÊt <<

1.4.1. Dßng cout

cout lµ mét ®èi t−îng kiÓu ostream vµ ®−îc nãi lµ “bÞ rµng buéc tíi”thiÕt bÞ

chuÈn, th«ng th−êng lµ mµn h×nh. C¸c thao t¸c xuÊt trªn dßng cout ®ång nghÜa

víi xuÊt d÷ liÖu ra mµn h×nh.

1.4.2. To¸n tö xuÊt <<

C++ ®Þnh nghÜa chång to¸n tö dÞch tr¸i << ®Ó göi c¸c ký tù sang dßng xuÊt .

C¸ch dïng to¸n tö xuÊt ®Ó xuÊt d÷ liÖu tõ bé nhí ra dßng cout nh− sau:

cout<<biÓu thøc;

Trong ®ã biÓu thøc biÓu thÞ mét gi¸ trÞ cÇn xuÊt ra mµn h×nh. Gi¸ trÞ sÏ ®−îc

biÕn ®æi thµnh mét d·y ký tù tr−íc khi ®−a ra dßng xuÊt.

Chó ý: §Ó xuÊt nhiÒu gi¸ trÞ trªn mét dßng lÖnh, cã thÓ viÕt nh− sau:

cout<<biÓu thøc 1<<biÓu thøc 2 <<...<<biÓu thøc n;

1.4.3. C¸c ph−¬ng thøc ®Þnh d¹ng

1. Ph−¬ng thøc int cout.width();

cho biÕt ®é réng quy ®Þnh hiÖn t¹i.

2. Ph−¬ng thøc int cout.width(int n);

thiÕt lËp ®é réng quy ®Þnh míi lµ n vµ tr¶ vÒ ®é réng quy ®Þnh tr−íc ®ã.

Chó ý: §é réng quy ®Þnh n chØ cã t¸c dông cho mét gi¸ trÞ xuÊt. Sau ®ã C++ l¹i

¸p dông ®é réng quy ®Þnh b»ng 0. VÝ dô víi c¸c c©u lÖnh:

int m=1234, n=56;

cout<<”\nAB”;

cout.width(6);

cout<<m;

cout<<n;

th× kÕt qu¶ lµ:

AB 123456

Page 143: GT LapTrinhHuongDoiTuong_Chinh Thuc

143

(gi÷a B vµ sè 1 cã 2 dÊu c¸ch).

3. Ph−¬ng thøc int cout.precision();

cho biÕt ®é chÝnh x¸c hiÖn t¹i (®ang ¸p dông ®Ó xuÊt c¸c gi¸ trÞ thøc).

4. Ph−¬ng thøc int cout.precision(int n);

thiÕt lËp dé chÝnh x¸c sÏ ¸p dông lµ n vµ cho biÕt ®é chÝnh x¸c tr−íc ®ã. §é

chÝnh x¸c ®−îc thiÕt lËp sÏ cã hiÖu lùc cho tíi khi gÆp mét c©u lÖnh thiÕt lËp ®é

chÝnh x¸c míi.

5. Ph−¬ng thøc char cout.fill();

cho biÕt ký tù ®én hiÖn t¹i ®ang ®−îc ¸p dông.

6. Ph−¬ng thøc char cout.fill( char ch);

quy ®Þnh ký tù ®én míi sÏ ®−îc dïng lµ ch vµ cho biÕt ký tù ®én ®ang dïng

tr−íc ®ã. Ký tù ®én ®−îc thiÕt lËp sÏ cã hiÖu lùc cho tíi khi gÆp mét c©u lÖnh

chän ký tù ®én míi.

VÝ dô:

#include <iostream.h>

#include <conio.h>

void main()

{

clrscr();

float x=-3.1551, y=-23.45421;

cout.precision(2);

cout.fill(‘*’);

cout<<”\n”;

cout.width(8);

cout<<x;

cout<<”\n”;

cout.width(8);

cout<<y;

getch();

}

Sau khi thùc hiÖn, ch−¬ng tr×nh in ra mµn h×nh 2 dßng sau:

***-3.16

**-23.45

Page 144: GT LapTrinhHuongDoiTuong_Chinh Thuc

144

1.4.4. Cê ®Þnh d¹ng

Mçi cê ®Þnh d¹ng chøa trong mét bit. Cê cã 2 tr¹ng th¸i: BËt (on) – cã gi¸

trÞ 1, T¾t (off) – cã gi¸ trÞ 0. C¸c cê cã thÓ chøa trong mét biÕn kiÓu long. Trong

tËp tin iostream.h ®· ®Þnh nghÜa c¸c cê sau:

ios::left ios::right ios::internal

ios::dec ios::oct ios::hex

ios::fixed ios::scientific ios::showpos

ios::uppercase ios::showpoint ios::showbase

Cã thÓ chia cê ®Þnh d¹ng thµnh c¸c nhãm:

Nhãm 1 gåm c¸c cê c¨n lÒ:

ios::left ios::right ios::internal

Cê ios::left: khi bËt cê ios::left th× gi¸ trÞ in ra n»m bªn tr¸i vïng quy ®Þnh, c¸c

ký tù ®én n»m sau.

Cê ios::right: khi bËt cê ios::right th× gi¸ trÞ in ra n»m bªn ph¶i vïng quy ®Þnh,

c¸c ký tù ®én n»m tr−íc.

Chó: ý mÆc ®Þnh cê ios::right bËt.

Cê ios::internal: cê ios::internal cã t¸c dông gièng nh− cê ios::right chØ kh¸c

lµ dÊu (nÕu cã) in ®Çu tiªn.

Ch−¬ng tr×nh sau minh ho¹ c¸ch dïng c¸c cê c¨n lÒ:

VÝ dô

#include <iostream.h>

#include <conio.h>

void main()

{

clrscr();

float x=-87.1551, y=23.45421;

cout.precision(2);

cout.fill('*');

cout.setf(ios::left); //bat co ios::left

cout<<"\n";

cout.width(8);

cout<<x;

cout<<"\n";

cout.width(8);

Page 145: GT LapTrinhHuongDoiTuong_Chinh Thuc

145

cout<<y;

cout.setf(ios::right); //bat co ios::right

cout<<"\n";

cout.width(8);

cout<<x;

cout<<"\n";

cout.width(8);

cout<<y;

cout.setf(ios::internal); //bat co ios::internal

cout<<"\n";

cout.width(8);

cout<<x;

cout<<"\n";

cout.width(8);

cout<<y;

getch();

}

Sau khi thùc hiÖn ch−¬ng tr×nh in ra 6 dßng nh− sau:

-87.16**

23.45**

**-87.16

***23.45

-**87.16

***23.45

Nhãm 2 gåm c¸c cê ®Þnh d¹ng sè nguyªn:

ios::dec ios::oct ios::hex

+ Khi ios::dec bËt (mÆc ®Þnh): sè nguyªn ®−îc in d−íi d¹ng c¬ sè 10

+ Khi ios::oct bËt: sè nguyªn ®−îc in d−íi d¹ng c¬ sè 8

+ khi ios::hex bËt: sè nguyªn ®−îc in d−íi d¹ng c¬ sè 16

Nhãm 3 gåm c¸c cê ®Þnh d¹ng sè thùc:

ios::fixed ios::scientific ios::showpoint

MÆc ®Þnh : cê ios::fixed bËt (on) vµ cê ios::showpoint t¾t (off).

Page 146: GT LapTrinhHuongDoiTuong_Chinh Thuc

146

+ Khi ios::fixed bËt vµ cê ios::showpoint t¾t th× sè thùc in ra d−íi d¹ng thËp

ph©n, sè ch÷ sè phÇn ph©n (sau dÊu chÊm) ®−îc tÝnh b»ng ®é chÝnh x¸c n nh−ng

khi in th× bá ®i c¸c ch÷ sè 0 ë cuèi.

VÝ dô nÕu ®é chÝnh x¸c n = 4 th×

Sè thùc -87.1500 ®−îc in: -87.15

Sè thùc 23.45425 ®−îc in: 23.4543

Sè thùc 678.0 ®−îc in: 678

+ Khi ios::fixed bËt vµ cê ios::showpoint bËt th× sè thùc in ra d−íi d¹ng thËp

ph©n, sè ch÷ sè phÇn ph©n (sau dÊu chÊm) ®−îc in ra ®óng b»ng ®é chÝnh x¸c n.

VÝ dô nÕu ®é chÝnh x¸c n = 4 th×

Sè thùc -87.1500 ®−îc in: -87.1500

Sè thùc 23.45425 ®−îc in: 23.4543

Sè thùc 678.0 ®−îc in: 6780000

+ Khi ios::scientific bËt vµ cê ios::showpoint t¾t th× sè thùc in ra d−íi d¹ng

khoa häc. Sè ch÷ sè phÇn ph©n (sau dÊu chÊm) ®−îc tÝnh b»ng ®é chÝnh x¸c n

nh−ng khi in th× bá ®i c¸c ch÷ sè 0 ë cuèi.

VÝ dô nÕu ®é chÝnh x¸c n=4 th×

Sè thùc -87.1500 ®−îc in: -87.15e+01

Sè thùc 23.45425 ®−îc in: 23.4543e+01

Sè thùc 678.0 ®−îc in: 678e+02

+ Khi ios::scientific bËt vµ cê ios::showpoint bËt th× sè thùc in ra d−íi d¹ng

mò . Sè ch÷ sè phÇn ph©n (sau dÊu chÊm) cña phÇn ®Þnh trÞ ®−îc in ®óng b»ng

®é chÝnh x¸c n.

VÝ dô nÕu ®é chÝnh x¸c n=4 th×

Sè thùc -87.1500 ®−îc in: -87.150e+01

Sè thùc 23.45425 ®−îc in: 23.4543e+01

Sè thùc 678.0 ®−îc in: 67800e+01

Nhãm 4 gåm c¸c hiÓn thÞ:

ios::uppercase ios::showpos ios::showbase

Cê ios::showpos

+ NÕu cê ios::showpos t¾t (mÆc ®Þnh) th× dÊu céng kh«ng ®−îc in tr−íc sè

d−¬ng.

+ NÕu cê ios::showpos t¾t th× dÊu céng ®−îc in tr−íc sè d−¬ng.

Cê ios::showbase bËt th× sè nguyªn hÖ 8 ®−îc in b¾t ®Çu b»ng ký tù 0 vµ sè

nguyªn hÖ 16 ®−îc b¾t ®Çu b»ng c¸c ký tù 0x. VÝ dô nÕu a = 40 th×:

Page 147: GT LapTrinhHuongDoiTuong_Chinh Thuc

147

D¹ng in hÖ 8 lµ: 050

D¹ng in hÖ 16 lµ 0x28

Cê ios::showbase t¾t (mÆc ®Þnh) th× kh«ng in 0 tr−íc sè nguyªn hÖ 8 vµ kh«ng

0x tr−íc sè nguyªn hÖ 16. VÝ dô nÕu a = 40 th×:

D¹ng in hÖ 8 lµ: 50

D¹ng in hÖ 16 lµ 28

Cê ios::uppercase

+ NÕu cê ios::uppercase bËt th× c¸c ch÷ sè hÖ 16 (nh− A, B, C,...) ®−îc in d−íi

d¹ng ch÷ hoa.

+ NÕu cê ios::uppercase t¾t (mÆc ®Þnh) th× c¸c ch÷ sè hÖ 16 (nh− A, B, C,...)

®−îc in d−íi d¹ng ch÷ th−êng.

1.4.5. C¸c ph−¬ng thøc bËt t¾t cê

C¸c ph−¬ng thøc nµy ®Þnh nghÜa trong líp ios.

1. Ph−¬ng thøc long cout.setf(long f) ;

sÏ bËt c¸c cê liÖt kª trong f vµ tr¶ vÒ mét gi¸ trÞ long biÓu thÞ c¸c cê ®ang bËt.

2. Ph−¬ng thøc long cout.unsetf(long f) ;

sÏ t¾t c¸c cê liÖt kª trong f vµ tr¶ vÒ mét gi¸ trÞ long biÓu thÞ c¸c cê ®ang bËt.

3. Ph−¬ng thøc long cout.flags(long f) ;

cã t¸c dông gièng nh− cout.setf(long).

4. Ph−¬ng thøc long cout.flags() ;

sÏ tr¶ vÒ mét gi¸ trÞ long biÓu thÞ c¸c cê ®ang bËt.

1.4.6. C¸c bé phËn ®Þnh d¹ng

C¸c bé phËn ®Þnh d¹ng (®Þnh nghÜa trong tËp tin iostream.h) bao gåm:

dec // nh− cê ios::dec

oct // nh− cê ios::oct

hex // nh− cê ios::hex

endl // xuÊt ký tù ‘\n’ (chuyÓn dßng)

flush // ®Èy d÷ liÖu ra thiÕt bÞ xuÊt

VÝ dô XÐt ch−¬ng tr×nh sau:

#include <iostream.h>

#include <iomanip.h>

#include <conio.h>

void main()

{

Page 148: GT LapTrinhHuongDoiTuong_Chinh Thuc

148

clrscr();

cout.setf(ios::showbase);

cout<<”ABC”<<endl<<hex<<40<<” ”<<41;

getch();

}

1.4.7. C¸c hµm ®Þnh d¹ng

C¸c hµm ®Þnh d¹ng (®Þnh nghÜa trong <iomanip.h>) bao gåm:

set(int n) // nh− cout.width(int n)

setpecision(int n) // nh− cout.setpecision(int n)

setfill( char ch) // nh− cout.setfill( char ch)

setiosflags( long l) // nh− cout. setiosflags( long f)

resetiosflags( long l) // nh− cout. setiosflags( long f)

C¸c hµm ®Þnh d¹ng cã t¸c dông nh− c¸c ph−¬ng thøc ®Þnh d¹ng nh−ng ®−îc

viÕt nèi ®u«i trong to¸n tö xuÊt nªn tiÖn sö dông h¬n.

Chó ý

C¸c hµm ®Þnh d¹ng ( còng nh− c¸c bé phËn ®Þnh d¹ng ) cÇn viÕt trong to¸n

tö xuÊt. Mét hµm ®Þnh d¹ng ®øng mét m×nh nh− mét c©u lÖnh sÏ kh«ng cã

t¸c dông dÞnh d¹ng.

Muèn sö dông c¸c hµm ®Þnh d¹ng cÇn bæ sung vµo ®Çu ch−¬ng tr×nh c©u

lÖnh: #include <iomanip.h>

Ch−¬ng tr×nh trong vÝ dô 1.2. cã thÓ viÕt l¹i theo c¸c ph−¬ng ¸n sau:

Ph−¬ng ¸n 1:

#include <iostream.h>

#include <conio.h>

void main()

{

clrscr();

cout <<setiosflags(ios::showbase);

cout<<”ABC”<<endl<<hex<<40<<” “<<41;

getch();

}

Ph−¬ng ¸n 2:

#include <iostream.h>

#include <conio.h>

Page 149: GT LapTrinhHuongDoiTuong_Chinh Thuc

149

void main()

{

clrscr();

cout <<”ABC”<<endl<< setiosflags(ios::showbase)

<< hex<<40<<” “<<41;

getch();

}

1.5. C¸c dßng chuÈn

Cã 4 dßng (®èi t−îng cña c¸c líp stream) ®· ®Þnh nghÜa tr−íc, ®−îc cµi ®Æt khi

ch−¬ng tr×nh khëi ®éng lµ:

- cin dßng input chuÈn g¾n víi bµn phÝm, gièng nh− stdin cña C.

- cout dßng output chuÈn g¾n víi mµn h×nh, gièng nh− stdout cña C.

- cerr dßng output lçichuÈn g¾n víi mµn h×nh, gièng nh− stderr cña C.

- clog gièng cerr nh−ng cã thªm bé ®Öm.

Chó ý

Cã thÓ dïng c¸c dßng cerr vµ clog ®Ó xuÊt ra mµn h×nh nh− ®· dïng ®èi víi

cout.

V× clog cã thªm bé ®Öm, nªn d÷ liÖu ®−îc ®−a vµo bé ®Öm. Khi ®Çy bé ®Öm

th× ®−a d÷ liÖu bé ®Öm ra dßng clog. V× vËy tr−íc khi kÕt thóc xuÊt cÇn dïng

ph−¬ng thøc: clog.flush(); ®Ó ®Èy d÷ liÖu tõ bé ®Öm ra clog.

Ch−¬ng tr×nh sau minh häa c¸ch dïng dßng clog. Chóng ta nhËn thÊy, nÕu bá

c©u lÖnh clog.flush() th× sÏ kh«ng nh×n thÊy kÕt qu¶ xuÊt ra mµn h×nh khi ch−¬ng

tr×nh t¹m dõng bëi c©u lÖnh getch().

VÝ dô

#include <iostream.h>

#include <conio.h>

void main()

{

clrscr();

float x=-87.1500, y=23.45425,z=678.0;

clog.setf(ios::scientific);

clog.precision(4);

clog.fill('*');

clog<<"\n";

Page 150: GT LapTrinhHuongDoiTuong_Chinh Thuc

150

clog.width(10);

clog<<x;

clog<<"\n";

clog.width(10);

clog<<y;

clog<<"\n";

clog.width(10);

clog<<z;

clog.flush();

getch();

}

1.6. XuÊt ra m¸y in

Bèn dßng chuÈn kh«ng g¾n víi m¸y in. Nh− vËy kh«ng thÓ dïng c¸c dßng

nµy ®Ó xuÊt d÷ liÖu ra m¸y in. §Ó xuÊt d÷ liÖu ra m¸y in (còng nh− nhËp, xuÊt

trªn tÖp) cÇn t¹o ra c¸c dßng tin míi vµ cho nã g¾n víi thiÕt bÞ cô thÓ. C++ cung

cÊp 3 líp stream ®Ó lµm ®iÒu nµy, ®ã lµ c¸c líp:

ofstream dïng ®Ó t¹o c¸c dßng xuÊt (ghi tÖp)

ifstream dïng ®Ó t¹o c¸c dßng nhËp (®éc tÖp)

fstream dïng ®Ó t¹o c¸c dßng nhËp, dßng xuÊt hoÆc dßng nhËp-xuÊt

Mçi líp cã 4 hµm t¹o dïng ®Ó khai b¸o c¸c dßng (®èi t−îng dßng tin). §Ó t¹o

mét dßng xuÊt vµ g¾n nã víi m¸y in ta cã thÓ dïng mét trong nh÷ng hµm t¹o sau

®©y:

ofstream Tªn_dßng(int fd);

ofstream Tªn_dßng(int fd, ch¶ *buf, int n);

Trong ®ã:

- Tªn_dßng lµ tªn biÕn ®èi t−îng kiÓu ofstream chóng ta tù ®Æt.

- fd(file disciptor) lµ chØ sè tËp tin. ChØ sè tËp tin ®Þnh s½n ®èi víi stdprn

(m¸y in chuÈn) lµ 4.

- C¸c tham sè buf vµ n x¸c ®Þnh mét vïng nhí n byte do buff trá tíi. Vïng

nhí sÏ ®−îc lµm bé ®Öm cho dßng xuÊt.

VÝ dô: C©u lÖnh ofstream prn(4); sÏ t¹o dßng tin xuÊt prn vµ g¾n nã víi m¸y in

chuÈn. Dßng prn sÏ cã bé ®Öm mÆc ®Þnh. D÷ liÖu tr−íc hÕt chuyÓn vµo bé ®Öm,

khi ®Çy bé ®ªm th× d÷ liÖu sÏ ®−îc ®Èy tõ bé ®Öm ra dßng prn vµ cã thÓ sö dông

ph−¬ng thøc flush hoÆc bé phËn ®Þnh d¹ng flush. C¸ch viÕt nh− sau:

Page 151: GT LapTrinhHuongDoiTuong_Chinh Thuc

151

prn.flush ;// Ph−¬ng thøc

prn<<flush; //Bé phËn ®Þnh d¹ng

C¸c c©u lÖnh sau sÏ xuÊt d÷ liÖu ra prn (m¸y in) vµ ý nghÜa cña chóng nh− sau:

prn<<”\n Tong=”<<(4+9); //§−a mét dßng vµo bé ®Öm

prn<<”\n Tich=”<<(4*9); // §−a dßng tiÕp theo vµo bé ®Öm

prn.flush(); //§Èy d÷ liÖu tõ bé ®Öm ra m¸y in (in 2 dßng)

C¸c c©u lÖnh d−íi ®©y sÏ xuÊt d÷ liÖu ra m¸y in nh−ng xuÊt tõng dßng mét:

prn<<”\n Tong=”<<(4+9)<<flush; // In mét dßng

prn<<”\n TÝch=”<<(4*9)<<flush; //In dßng tiÕp theo

VÝ dô: C¸c c©u lÖnh

char buf [512];

ofstream prn(4,buf,512);

sÏ t¹o dßng tin xuÊt prn vµ g¾n nã víi m¸y in chuÈn. Dßng xuÊt prn sö dông 512

byte cña m¶ng buf lµm bé ®Öm. C¸c c©u lÖnh d−íi ®©y còng xuÊt ra m¸y in:

prn<<”\n Tong=”<<(4+9); //§−a d÷ liÖu vµo bé ®ªm

prn<<”\n Tich=”<<(4*9) ; //§−a d÷ liÖu vµo bé ®ªm

prn.flush(); // XuÊt 2 dßng (ë bé ®Öm) ra m¸y in

Chó ý: Tr−íc khi kÕt thóc ch−¬ng tr×nh, d÷ liÖu tõ bé ®Öm sÏ ®−îc tù ®éng ®Èy

ra m¸y in.

Page 152: GT LapTrinhHuongDoiTuong_Chinh Thuc

152

tμi liÖu tham kh¶o

1. Ivar Jacobson, Object - Oriented Software Engineering, Addison-

Wesley Publishing Company, 1992.

2. Michael Blaha, William Premerlani, Object - Oriented Modeling and

Design for Database Applications, Prentice Hall, 1998.

3. Ph¹m V¨n Êt, C++ vµ LËp tr×nh h−íng ®èi t−îng, NXB Khoa häc vµ Kü

thuËt, 1999.

4. §oµn V¨n Ban, Ph©n tÝch vµ thiÕt kÕ h−íng ®èi t−îng, NXB Khoa häc

vµ Kü thuËt, 1997.

5. NguyÔn Thanh Thñy, LËp tr×nh h−íng ®èi t−îng víi C++, NXB Khoa

häc vµ Kü thuËt, 1999.

Page 153: GT LapTrinhHuongDoiTuong_Chinh Thuc

153

Môc lôc

CH−¬NG 1

C¸C KH¸I NIÖM C¬ Së

cña LËP TR×NH H−íNG §èI T−îNG 1.1. Giíi thiÖu........................................................................................................ 1

1.1.1. TiÕp cËn h−íng ®èi t−îng ........................................................................ 1 1.1.2. Nh÷ng nh−îc ®iÓm cña lËp tr×nh h−íng thñ tôc ...................................... 2 1.1.3. LËp tr×nh h−íng ®èi t−îng ....................................................................... 3

1.2. C¸c kh¸i niÖm c¬ b¶n cña lËp tr×nh h−íng ®èi t−îng..................................... 3 1.2.1. §èi t−îng ................................................................................................. 4 1.2.2. Líp........................................................................................................... 4 1.2.3. Trõu t−îng hãa d÷ liÖu vµ bao gãi th«ng tin ........................................... 5 1.2.4. KÕ thõa..................................................................................................... 5 1.2.5. T−¬ng øng béi.......................................................................................... 5 1.2.6. Liªn kÕt ®éng........................................................................................... 6 1.2.7. TruyÒn th«ng b¸o..................................................................................... 6

1.3. C¸c b−íc cÇn thiÕt ®Ó thiÕt kÕ ch−¬ng tr×nh theo h−íng ®èi t−îng................ 6 1.4. C¸c −u ®iÓm cña lËp tr×nh h−íng ®èi t−îng ................................................... 7 1.5. C¸c ng«n ng÷ h−íng ®èi t−îng ...................................................................... 8 1.6. Mét sè øng dông cña LTH§T ........................................................................ 8

Ch−¬ng 2

c¸c më réng cña ng«n ng÷ C++ 2.1. Giíi thiÖu chung vÒ C++ .............................................................................. 10 2.2. Mét sè më réng cña C++ so víi C ............................................................... 10

2.2.1. §Æt lêi chó thÝch .................................................................................... 10 2.2.2. Khai b¸o biÕn......................................................................................... 11 2.2.3. PhÐp chuyÓn kiÓu b¾t buéc .................................................................... 12 2.2.4. LÊy ®Þa chØ c¸c phÇn tö m¶ng thùc 2 chiÒu ........................................... 12

2.3. Vµo ra trong C++.......................................................................................... 14 2.3.1. XuÊt d÷ liÖu ........................................................................................... 14 2.3.2. NhËp d÷ liÖu........................................................................................... 14 2.3.3. §Þnh d¹ng khi in ra mµn h×nh................................................................ 14

2.4. CÊp ph¸t vµ gi¶i phãng bé nhí ..................................................................... 17 2.4.1. To¸n tö new ®Ó cÊp ph¸t bé nhí ............................................................ 18 2.4.2. To¸n tö delete ........................................................................................ 18

2.5. BiÕn tham chiÕu (reference variable) ........................................................... 20 2.6. H»ng tham chiÕu........................................................................................... 21

Page 154: GT LapTrinhHuongDoiTuong_Chinh Thuc

154

2.7. TruyÒn tham sè cho hµm theo tham chiÕu ................................................... 21 2.8. Hµm tr¶ vÒ gi¸ trÞ tham chiÕu ....................................................................... 26 2.9. Hµm víi ®èi sè cã gi¸ trÞ mÆc ®Þnh .............................................................. 28 2.10. C¸c hµm néi tuyÕn (inline) ......................................................................... 29 2.11. Hµm t¶i béi ................................................................................................. 32

CH−¬NG 3

LíP 3.1. §Þnh nghÜa líp .............................................................................................. 37 3.2. T¹o lËp ®èi t−îng.......................................................................................... 39 3.3. Truy nhËp tíi c¸c thµnh phÇn cña líp........................................................... 39 3.4. Con trá ®èi t−îng.......................................................................................... 45 3.5. Con trá this ................................................................................................... 47 3.6. Hµm b¹n ....................................................................................................... 49 3.7. D÷ liÖu thµnh phÇn tÜnh vµ hµm thµnh phÇn tÜnh.......................................... 54

3.7.1. D÷ liÖu thµnh phÇn tÜnh ......................................................................... 54 3.7.2. Hµm thµnh phÇn tÜnh ............................................................................. 56

3.8. Hµm t¹o (constructor)................................................................................... 58 3.9. Hµm t¹o sao chÐp ......................................................................................... 64

3.9.1. Hµm t¹o sao chÐp mÆc ®Þnh................................................................... 65 3.9.2. Hµm t¹o sao chÐp................................................................................... 67

3.10. Hµm hñy (destructor) ................................................................................. 72

CH−¬NG 4

TO¸N Tö T¶I BéI 4.1. §Þnh nghÜa to¸n tö t¶i béi............................................................................. 78 4.2. Mét sè l−u ý khi x©y dùng to¸n tö t¶i béi .................................................... 78 4.4. §Þnh nghÜa chång c¸c to¸n tö ++ , -- .......................................................... 88 4.5. §Þnh nghÜa chång to¸n tö << vµ >> ............................................................. 90

Ch−¬ng 5

kÕ thõa 5.1. Giíi thiÖu...................................................................................................... 93

5.2.1. §Þnh nghÜa líp dÉn xuÊt tõ mét líp c¬ së.............................................. 94

Page 155: GT LapTrinhHuongDoiTuong_Chinh Thuc

155

5.2.2. Truy nhËp c¸c thµnh phÇn trong líp dÉn xuÊt ....................................... 94 5.2.3. §Þnh nghÜa l¹i c¸c hµm thµnh phÇn cña líp c¬ së trong líp dÉn xuÊt... 95 5.2.4. Hµm t¹o ®èi víi tÝnh kÕ thõa ............................................................... 100 5.2.5. Hµm hñy ®èi víi tÝnh kÕ thõa .............................................................. 102 5.2.6. Khai b¸o protected............................................................................... 103 5.2.7. DÉn xuÊt protected............................................................................... 103

5.3. §a kÕ thõa................................................................................................... 103 5.3.1. §Þnh nghÜa líp dÉn xuÊt tõ nhiÒu líp c¬ së......................................... 103 5.3.2. Mét sè vÝ dô vÒ ®a kÕ thõa................................................................... 104

5.4. Hµm ¶o ....................................................................................................... 111 5.4.1 §Æt vÊn ®Ò ............................................................................................. 111 5.4.2. §Þnh nghÜa hµm ¶o............................................................................... 113 5.4.3. Quy t¾c gäi hµm ¶o.............................................................................. 115 5.4.5. Quy t¾c g¸n ®Þa chØ ®èi t−îng cho con trá líp c¬ së ........................... 115

5.5. Líp c¬ së ¶o ............................................................................................... 119 5.5.1. Khai b¸o líp c¬ së ¶o .......................................................................... 119 5.5.2. Hµm t¹o vµ hµm hñy ®èi víi líp c¬ së ¶o............................................ 121

Ch−¬ng 6

Khu«n h×nh 6.1. Khu«n h×nh hµm ......................................................................................... 129

6.1.1. Kh¸i niÖm ............................................................................................ 129 6.1.2. T¹o mét khu«n h×nh hµm..................................................................... 129 6.1.3. Sö dông khu«n h×nh hµm ..................................................................... 130 6.1.4. C¸c tham sè kiÓu cña khu«n h×nh hµm................................................ 131 6.1.5. §Þnh nghÜa chång c¸c khu«n h×nh hµm............................................... 133

6.2. Khu«n h×nh líp........................................................................................... 134 6.2.1. Kh¸i niÖm ............................................................................................ 134 6.2.2. T¹o mét khu«n h×nh líp....................................................................... 134 6.2.3. Sö dông khu«n h×nh líp....................................................................... 135 6.2.4. C¸c tham sè trong khu«n h×nh líp....................................................... 136 6.2.5. Tãm t¾t................................................................................................. 137

Phô lôc

C¸c dßng xuÊt nhËp

1.1. C¸c líp stream ............................................................................................ 139 1.2. Dßng cin vµ to¸n tö nhËp >> ...................................................................... 139

1.2.1 Dßng cin ............................................................................................... 139

Page 156: GT LapTrinhHuongDoiTuong_Chinh Thuc

156

1.2.2. To¸n tö trÝch >> ................................................................................... 140 1.3. NhËp ký tù vµ chuçi ký tù .......................................................................... 140

1.3.1. Ph−¬ng thøc get()................................................................................. 140 1.3.2. Ph−¬ng thøc getline() .......................................................................... 141 1.3.3. Ph−¬ng thøc ignore.............................................................................. 142

1.4. Dßng cout vµ to¸n tö xuÊt << ..................................................................... 142 1.4.1. Dßng cout ............................................................................................ 142 1.4.2. To¸n tö xuÊt << ................................................................................... 142 1.4.3. C¸c ph−¬ng thøc ®Þnh d¹ng ................................................................. 142 1.4.4. Cê ®Þnh d¹ng........................................................................................ 144 1.4.5. C¸c ph−¬ng thøc bËt t¾t cê .................................................................. 147 1.4.6. C¸c bé phËn ®Þnh d¹ng ........................................................................ 147 1.4.7. C¸c hµm ®Þnh d¹ng .............................................................................. 148

1.5. C¸c dßng chuÈn .......................................................................................... 149 1.6. XuÊt ra m¸y in ............................................................................................ 150

Tμi liÖu tham kh¶o.................................................................................. 152