Giáo trình Lập trình hướng đối tượng với C++ - Chương 3: Đối tượng và lớp

Ch-¬ng 3  
®èi t-îng vµ líp  
(Object & Class)  
Môc ®Ých ch-¬ng nµy:  
1. Kh¸i niÖm vÒ ®ãng gãi d÷ liÖu.  
2. Khai b¸o vµ sö dông mét líp.  
3. Khai b¸o vµ sö dông ®èi t-îng, con trá ®èi t-îng, tham chiÕu ®èi  
t-îng.  
4. Hµm thiÕt lËp vµ hµm huû bá.  
5. Khai b¸o vµ sö dông hµm thiÕt lËp sao chÐp.  
Vai trß cña hµm thiÕt lËp ngÇm ®Þnh.  
6.  
1. §èi t-îng  
§èi t-îng lµ mét kh¸i niÖm trong lËp tr×nh h-íng ®èi t-îng biÓu thÞ sù  
liªn kÕt gi÷a d÷ liÖu vµ c¸c thñ tôc (gäi lµ c¸c ph-¬ng thøc) thao t¸c trªn d÷  
liÖu ®ã. Ta cã c«ng thøc sau:  
§èi t-îng = D÷ liÖu+Ph-¬ng  
thøc  
ë ®©y chóng ta hiÓu r»ng ®èi t-îng chÝnh lµ c«ng cô hç trî cho sù ®ãng  
gãi. Sù ®ãng gãi lµ c¬ chÕ liªn kÕt c¸c lÖnh thao t¸c vµ d÷ liÖu cã liªn quan,  
gióp cho c¶ hai ®-îc an toµn tr¸nh ®-îc sù can thiÖp tõ bªn ngoµi vµ viÖc sö  
dông sai. Nh×n chung ®Þnh nghÜa mét ®èi t-îng phøc t¹p h¬n so víi ®Þnh  
nghÜa c¸c biÕn cÊu tróc th«ng th-êng, bëi lÏ ngoµi viÖc m« t¶ c¸c thµnh phÇn  
d÷ liÖu, ta cßn ph¶i x¸c ®Þnh ®-îc c¸c thao t¸c t¸c ®éng lªn ®èi t-îng ®ã.  
H×nh 2.1 m« t¶ c¸c ®èi t-îng ®iÓm trªn mÆt ph¼ng:  
Mçi ®èi t-îng ®-îc x¸c ®Þnh bëi hai thµnh phÇn to¹ ®é ®-îc biÓu diÔn  
bëi hai biÕn nguyªn. C¸c thao t¸c t¸c ®éng lªn ®iÓm bao gåm viÖc x¸c ®Þnh  
to¹ ®é mét ®iÓm trªn mÆt ph¼ng to¹ ®é (thÓ hiÖn b»ng viÖc g¸n gi¸ trÞ cho  
hai thµnh phÇn to¹ ®é), thay ®æi to¹ ®é vµ hiÓn thÞ kÕt qu¶ lªn trªn mÆt ph¼ng  
to¹ ®é (t-¬ng tù nh- viÖc chÊm ®iÓm trªn mÆt ph¼ng ®ã).  
Lîi Ých cña viÖc ®ãng gãi lµ khi nh×n tõ bªn ngoµi, mét ®èi t-îng chØ  
®-îc biÕt tíi bëi c¸c m« t¶ vÒ c¸c ph-¬ng thøc cña nã, c¸ch thøc cµi ®Æt c¸c  
Ng«n ng÷ C++  
d÷ liÖu kh«ng quan träng ®èi víi ng-êi sö dông. Víi mét ®èi t-îng ®iÓm,  
ng-êi ta chØ quan t©m ®Õn viÖc cã thÓ thùc hiÖn ®-îc thao t¸c g× trªn nã mµ  
kh«ng cÇn biÕt c¸c thao t¸c ®ã ®-îc thùc hiÖn nh- thÕ nµo, còng nh- ®iÒu g×  
x¶y ra bªn trong b¶n th©n ®èi t-îng ®ã. Ta th-êng nãi ®ã lµ “sù trõu t-îng  
ho¸ d÷ liÖu” (khi c¸c chi tiÕt cµi ®Æt cô thÓ ®-îc giÊu ®i).  
M« t¶ ®èi t-îng ®iÓm {  
//d÷ liÖu  
int x,y;  
//ph-¬ng thøc  
void init(int ox,int oy);  
void move(int dx,int dy);  
void display();  
};  
H×nh 3.1 M« t¶ c¸c ®èi t-îng ®iÓm  
§ãng gãi cã nhiÒu lîi Ých gãp phÇn n©ng cao chÊt l-îng cña ch-¬ng  
tr×nh. Nã lµm cho c«ng viÖc b¶o tr× ch-¬ng tr×nh thuËn l¬i h¬n rÊt nhiÒu: mét  
sù thay ®æi cÊu tróc cña mét ®èi t-îng chØ ¶nh h-ëng tíi b¶n th©n ®èi t-îng;  
ng-êi sö dông ®èi t-îng kh«ng cÇn biÕt ®Õn thay ®æi nµy (víi lËp tr×nh cÊu  
tróc th× ng-êi lËp tr×nh ph¶i tù qu¶n lý sù thay ®æi ®ã). Ch¼ng h¹n cã thÓ  
biÓu diÔn to¹ ®é mét ®iÓm d-íi d¹ng sè thùc, khi ®ã chØ cã ng-êi thiÕt kÕ  
®èi t-îng ph¶i quan t©m ®Ó söa l¹i ®Þnh nghÜa cña ®èi t-îng trong khi ®ã  
ng-êi sö dông kh«ng cÇn hay biÕt vÒ ®iÒu ®ã, miÔn lµ nh÷ng thay ®æi ®ã  
kh«ng t¸c ®éng ®Õn viÖc sö dông ®èi t-îng ®iÓm.  
T-¬ng tù nh- vËy, ta cã thÓ bæ sung thªm thuéc tÝnh mµu vµ mét sè thao  
t¸c lªn mét ®èi t-îng ®iÓm, ®Ó cã ®-îc mét ®èi t-îng ®iÓm mµu. Râ rµng lµ  
®ãng gãi cho phÐp ®¬n gi¶n ho¸ viÖc sö dông mét ®èi t-îng.  
Trong lËp tr×nh h-íng ®èi t-îng, ®ãng gãi cho phÐp d÷ liÖu cña ®èi  
t-îng ®-îc che lÊp khi nh×n tõ bªn ngoµi, nghÜa lµ nÕu ng-êi dïng muèn t¸c  
®éng lªn d÷ liÖu cña ®èi t-îng th× ph¶i göi ®Õn ®èi t-îng c¸c th«ng  
®iÖp(message). ë ®©y c¸c ph-¬ng thøc ®ãng vai trß lµ giao diÖn b¾t buéc  
gi÷a c¸c ®èi t-îng vµ ng-êi sö dông. Ta cã nhËn xÐt: “Lêi gäi ®Õn mét  
ph-¬ng thøc lµ truyÒn mét th«ng b¸o ®Õn cho ®èi t-îng”.  
C¸c th«ng ®iÖp göi tíi ®èi t-îng nµo sÏ g¾n chÆt víi ®èi t-îng ®ã vµ chØ  
®èi t-îng nµo nhËn ®-îc th«ng ®iÖp míi ph¶i thùc hiÖn theo th«ng ®iÖp ®ã;  
ch¼ng h¹n c¸c ®èi t-îng ®iÓm ®éc lËp víi nhau, v× vËy th«ng ®iÖp thay ®æi  
to¹ ®é ®èi t-îng ®iÓm p chØ lµm ¶nh h-ëng ®Õn c¸c thµnh phÇn to¹ ®é trong  
p chø kh«ng thÓ thay ®æi ®-îc néi dung cña mét ®èi t-îng ®iÓm q kh¸c.  
-41-  
Ng«n ng÷ C++  
So víi lËp tr×nh h-íng ®èi t-îng thuÇn tuý, c¸c cµi ®Æt cô thÓ cña ®èi  
t-îng trong C++ linh ®éng h¬n mét chót, b»ng c¸ch cho phÐp chØ che dÊu  
mét bé phËn d÷ liÖu cña ®èi t-îng vµ më réng h¬n kh¶ n¨ng truy nhËp ®Õn  
c¸c thµnh phÇn riªng cña ®èi t-îng. Kh¸i niÖm líp chÝnh lµ c¬ së cho c¸c  
linh ®éng nµy.  
Líp lµ mét m« t¶ trõu t-îng cña nhãm c¸c ®èi t-îng cã cïng b¶n chÊt.  
Trong mét líp ng-êi ta ®-a ra c¸c m« t¶ vÒ tÝnh chÊt cña c¸c thµnh phÇn d÷  
liÖu, c¸ch thøc thao t¸c trªn c¸c thµnh phÇn nµy(hµnh vi cña c¸c ®èi t-îng),  
ng-îc l¹i mçi mét ®èi t-îng lµ mét thÓ hiÖn cô thÓ cho nh÷ng m« t¶ trõu  
t-îng ®ã. Trong c¸c ng«n ng÷ lËp tr×nh, líp ®ãng vai trß mét kiÓu d÷ liÖu  
®-îc ng-êi dïng ®Þnh nghÜa vµ viÖc t¹o ra mét ®èi t-îng ®-îc vÝ nh- khai  
b¸o mét biÕn cã kiÓu líp.  
2. Líp  
2.1 Khai b¸o líp  
Tõ quan ®iÓm cña lËp tr×nh cÊu tróc, líp lµ mét kiÓu d÷ liÖu tù ®Þnh  
nghÜa. Trong lËp tr×nh h-íng ®èi t-îng, ch-¬ng tr×nh nguån ®-îc ph©n bè  
trong khai b¸o vµ ®Þnh nghi· cña c¸c líp.  
Sau ®©y lµ mét vÝ dô ®iÓn h×nh vÒ có ph¸p khai b¸o líp. Kinh nghiÖm  
cho thÊy mäi kiÓu khai b¸o kh¸c ®Òu cã thÓ chuÈn ho¸ ®Ó ®-a vÒ d¹ng nµy.  
class <tªn líp> {  
private:  
<khai b¸o c¸c thµnh phÇn riªng trong tõng ®èi t-îng>  
public:  
<khai b¸o c¸c thµnh phÇn c«ng céng cña tõng ®èi  
t-îng>  
};  
<®Þnh nghi· cña c¸c hµm thµnh phÇn ch-a ®-îc ®Þnh  
nghÜa bªn trong khai b¸o líp>  
...  
C¸c chi tiÕt liªn quan ®Õn khai b¸o líp sÏ lÇn l-ît ®-îc ®Ò cËp ®Õn trong  
c¸c phÇn sau. §Ó dÔ h×nh dung xÐt mét vÝ dô vÒ khai b¸o líp ®iÓm trong mÆt  
ph¼ng. Trong vÝ dô nµy ta cã ®Ò cËp ®Õn mét vµi khÝa c¹nh liªn quan ®Õn  
khai b¸o líp, ®èi t-îng vµ sö dông chóng.  
-42-  
Ng«n ng÷ C++  
VÝ dô 3.1  
/*point.cpp*/  
#include <iostream.h>  
#include <conio.h>  
class point {  
/*khai b¸o c¸c thµnh phÇn d÷ liÖu riªng*/  
private:  
int x,y;  
/*khai b¸o c¸c hµm thµnh phÇn c«ng céng*/  
public:  
void init(int ox, int oy);  
void move(int dx, int dy);  
void display();  
};  
/*®Þnh nghÜa c¸c hµm thµnh phÇn bªn ngoµi khai b¸o líp*/  
void point::init(int ox, int oy) {  
cout<<"Ham thanh phan init\n";  
x = ox; y = oy; /*x,y lµ c¸c thµnh phÇn cña ®èi t-îng gäi hµm thµnh  
phÇn*/  
}
void point::move(int dx, int dy) {  
cout<<"Ham thanh phan move\n";  
x += dx; y += dy;  
}
void point::display() {  
cout<<"Ham thanh phan display\n";  
cout<<"Toa do: "<<x<<" "<<y<<"\n";  
}
-43-  
Ng«n ng÷ C++  
void main() {  
clrscr();  
point p;  
p.init(2,4); /*gäi hµm thµnh phÇn tõ ®èi t-îng*/  
p.display();  
p.move(1,2);  
p.display();  
getch();  
}
Ham thanh phan init  
Ham thanh phan display  
Toa do: 2 4  
Ham thanh phan move  
Ham thanh phan display  
Toa do: 3 6  
NhËn xÐt  
7. Cã thÓ khai b¸o trùc tiÕp c¸c hµm thµnh phÇn bªn trong khai b¸o líp.  
Tuy vËy ®iÒu ®ã ®«i khi lµm mÊt mü quan cña ch-¬ng tr×nh nguån, do  
vËy ng-êi ta th-êng sö dông c¸ch khai b¸o c¸c hµm thµnh phÇn ë bªn  
ngoµi khai b¸o líp. Khi ®ã ta sö dông có ph¸p:  
<tªn kiÓu gi¸ trÞ tr¶ l¹i> <tªn líp>::<tªn hµm> (<danh s¸ch tham sè>) {  
<néi dung >  
}
8. Gäi hµm thµnh phÇn cña líp tõ mét ®èi t-îng chÝnh lµ truyÒn th«ng  
®iÖp cho hµm thµnh phÇn ®ã. Có ph¸p nh- sau:  
<tªn ®èi t-îng>.<tªn hµm thµnh phÇn>(<danh s¸ch c¸c  
tham sè nÕu cã>);  
-44-  
Ng«n ng÷ C++  
2.1.1  
T¹o ®èi t-îng  
Trong C++, mét ®èi t-îng cã thÓ ®-îc x¸c lËp th«ng quan mét  
biÕn/h»ng cã kiÓu líp.  
<tªn líp> <tªn ®èi t-îng>;  
Do ®ã vïng nhí ®-îc cÊp ph¸t cho mét biÕn kiÓu líp sÏ cho ta mét  
khung cña ®èi t-îng bao gåm d÷ liÖu lµ c¸c thÓ hiÖn cô thÓ cña c¸c m« t¶ d÷  
liÖu trong khai b¸o líp cïng víi c¸c th«ng ®iÖp göi tíi c¸c hµm thµnh phÇn.  
Mçi ®èi t-îng së h÷u mét tËp c¸c biÕn t-¬ng øng víi tªn vµ kiÓu cña  
c¸c thµnh phÇn d÷ liÖu ®Þnh nghÜa trong líp. Ta gäi chóng lµ c¸c biÕn thÓ  
hiÖn cña ®èi t-îng. Tuy nhiªn tÊt c¶ c¸c ®èi t-îng cïng mét líp chung nhau  
®Þnh nghÜa cña c¸c hµm thµnh phÇn.  
Líp lµ mét kiÓu d÷ liÖu v× vËy cã thÓ khai b¸o con trá hay tham chiÕu  
®Õn mét ®èi t-îng thuéc líp vµ b»ng c¸ch Êy cã thÓ truy nhËp gi¸n tiÕp ®Õn  
®èi t-îng. Nh-ng chó ý lµ con trá vµ tham chiÕu kh«ng ph¶i lµ mét thÓ hiÖn  
cña líp.  
Líp  
Khung DL  
§èi  
§èi  
D÷ liÖu cô thÓ 1  
D÷ liÖu cô thÓ 2  
H×nh 3.2 §èi t-îng lµ mét thÓ  
C¸c thµnh phÇn d÷ liÖu  
2.1.2  
Có ph¸p khai b¸o c¸c thµnh phÇn d÷ liÖu gièng nh- khai b¸o biÕn:  
<tªn kiÓu> <tªn thµnh phÇn>;  
-45-  
Ng«n ng÷ C++  
Mét thµnh phÇn d÷ liÖu cã thÓ lµ mét biÕn kiÓu c¬ së (int, float, double,  
char, char *), kiÓu tr-êng bit, kiÓu liÖt kª (enum) hay c¸c kiÓu do ng-êi dïng  
®Þnh nghÜa. ThËm chÝ, thµnh phÇn d÷ liÖu cßn cã thÓ lµ mét ®èi t-îng thuéc  
líp ®· ®-îc khai b¸o tr-íc ®ã. Tuy nhiªn kh«ng thÓ dïng trùc tiÕp c¸c líp  
®Ó khai b¸o kiÓu thµnh phÇn d÷ liÖu thuéc vµo b¶n th©n líp ®ang ®-îc ®Þnh  
nghÜa. Muèn vËy, trong khai b¸o cña mét líp cã thÓ dïng c¸c con trá hoÆc  
tham chiÕu ®Õn c¸c ®èi t-îng cña chÝnh líp ®ã.  
Trong khai b¸o cña c¸c thµnh phÇn d÷ liÖu, cã thÓ sö dông tõ kho¸  
static nh-ng kh«ng ®-îc sö dông c¸c tõ kho¸ auto, register, extern  
trong khai b¸o c¸c thµnh phÇn d÷ liÖu. Còng kh«ng thÓ khai b¸o vµ khëi ®Çu  
gi¸ trÞ cho c¸c thµnh phÇn ®ã.  
2.1.3  
C¸c hµm thµnh phÇn  
Hµm ®-îc khai b¸o trong ®Þnh nghÜa cña líp ®-îc gäi lµ hµm thµnh  
phÇn hay ph-¬ng thøc cña líp (hµm thµnh phÇn lµ thuËt ng÷ cña C++, cßn  
ph-¬ng thøc lµ thuËt ng÷ trong lËp tr×nh h-íng ®èi t-îng nãi chung). C¸c  
hµm thµnh phÇn cã thÓ truy nhËp ®Õn c¸c thµnh phÇn d÷ liÖu vµ c¸c hµm  
thµnh phÇn kh¸c trong líp. Nh- trªn ®· nãi, C++ cho phÐp hµm thµnh phÇn  
truy nhËp tíi c¸c thµnh phÇn cña c¸c ®èi t-îng cïng líp, miÔn lµ chóng ®-îc  
khai b¸o bªn trong ®Þnh nghÜa hµm (nh- lµ mét ®èi t-îng côc bé hay mét  
tham sè h×nh thøc cña hµm thµnh phÇn). PhÇn tiÕp sau sÏ cã c¸c vÝ dô minh  
ho¹ cho kh¶ n¨ng nµy.  
Trong ch-¬ng tr×nh point.cpp, trong khai b¸o cña líp point cã chøa  
c¸c khai b¸o c¸c hµm thµnh phÇn cña líp. C¸c khai b¸o nµy còng tu©n theo  
có ph¸p khai b¸o cho c¸c hµm b×nh th-êng. §Þnh nghÜa cña c¸c hµm th× cã  
thÓ ®Æt ë bªn trong hay bªn ngoµi khai b¸o líp; Khi ®Þnh nghÜa hµm thµnh  
phÇn ®Æt trong khai b¸o líp (nÕu hµm thµnh phÇn ®¬n gi¶n, kh«ng chøa c¸c  
1
cÊu tróc lÆp ) kh«ng cã g× kh¸c so víi ®Þnh nghÜa cña hµm th«ng th-êng.  
Ch-¬ng tr×nh point1.cpp sau ®©y lµ mét c¸ch viÕt kh¸c cña  
point.cpp trong ®ã hµm thµnh phÇn init() ®-îc ®Þnh nghÜa ngay bªn  
trong khai b¸o líp.  
VÝ dô 3.2  
/*point1.cpp*/  
1
Hµm thµnh phÇn ®Þnh nghÜa trong khai b¸o líp ®-îc ch-¬ng tr×nh dÞch hiÓu lµ  
hµm inline, nªn kh«ng ®-îc qu¸ phøc t¹p.  
-46-  
Ng«n ng÷ C++  
#include <iostream.h>  
#include <conio.h>  
class point {  
/*khai b¸o c¸c thµnh phÇn d÷ liÖu private*/  
private:  
int x,y;  
/*khai b¸o c¸c hµm thµnh phÇn public*/  
public:  
/*§Þnh nghÜa hµm thµnh phÇn bªn trong khai b¸o líp*/  
void init(int ox, int oy){  
cout<<"Ham thanh phan init\n";  
x = ox; y = oy; /*x,y lµ c¸c thµnh phÇn cña ®èi t-îng gäi hµm  
thµnh phÇn*/  
}
void move(int dx, int dy);  
void display();  
};  
/*®Þnh nghÜa c¸c hµm thµnh phÇn bªn ngoµi khai b¸o líp*/  
void point::move(int dx, int dy) {  
cout<<"Ham thanh phan move\n";  
x += dx; y += dy;  
}
void point::display() {  
cout<<"Ham thanh phan display\n";  
cout<<"Toa do: "<<x<<" "<<y<<"\n";  
}
void main() {  
clrscr();  
-47-  
Ng«n ng÷ C++  
point p;  
p.init(2,4); /*gäi hµm thµnh phÇn tõ ®èi t-îng*/  
p.display();  
p.move(1,2);  
p.display();  
getch();  
}
Ham thanh phan init  
Ham thanh phan display  
Toa do: 2 4  
Ham thanh phan move  
Ham thanh phan display  
Toa do: 3 6  
Khi ®Þnh nghÜa hµm thµnh phÇn ë ngoµi líp, dßng tiªu ®Ò cña hµm thµnh  
phÇn ph¶i chøa tªn cña líp cã hµm lµ thµnh viªn tiÕp theo lµ to¸n tö ®Þnh  
ph¹m vi “::”. §ã lµ c¸ch ®Ó ph©n biÖt hµm thµnh phÇn víi c¸c hµm tù do,  
®ång thêi cßn cho phÐp hai líp kh¸c nhau cã thÓ cã c¸c hµm thµnh phÇn  
cïng tªn.  
Cã thÓ ®Æt ®Þnh nghÜa hµm thµnh phÇn trong cïng tËp tin khai b¸o líp  
hoÆc trong mét tËp tin kh¸c. VÝ dô sau ®©y sau ®©y lµ mét c¶i biªn kh¸c tõ  
point.cpp, trong ®ã ta ®Æt riªng khai b¸o líp point trong mét tÖp tiªu ®Ò.  
TÖp tiªu ®Ò sÏ ®-îc tham chiÕu tíi trong tÖp ch-¬ng tr×nh point2.cpp chøa  
®Þnh nghÜa c¸c hµm thµnh phÇn cña líp point.  
VÝ dô 3.3  
TÖp tiªu ®Ò  
/*point.h*/  
/* ®©y lµ tËp tin tiªu ®Ò khai b¸o líp point ®-îc gép vµo tÖp point2.cpp */  
#ifndef point_h  
#define point_h  
#include <iostream.h>  
-48-  
Ng«n ng÷ C++  
class point {  
/*khai b¸o c¸c thµnh phÇn d÷ liÖu private*/  
private:  
int x,y;  
/*khai b¸o c¸c hµm thµnh phÇn public*/  
public:  
/*§Þnh nghÜa hµm thµnh phÇn bªn trong khai b¸o líp*/  
void init(int ox, int oy);  
void move(int dx, int dy);  
void display();  
};  
#endif  
TÖp ch-¬ng tr×nh nguån  
/*point2.cpp*/  
/*TËp tin ch-¬ng tr×nh, ®Þnh nghÜa vµ sö dông c¸c hµm thµnh phÇn trong líp  
point ®-îc khai b¸o trong tËp tin tiªu ®Ò point.h */  
#include “point.h”/*chÌn ®Þnh nghÜa líp point vµo ch-¬ng tr×nh*/  
#include <conio.h>  
/*®Þnh nghÜa c¸c hµm thµnh phÇn bªn ngoµi khai b¸o líp*/  
void point::init(int ox, int oy) {  
cout<<"Ham thanh phan init\n";  
x = ox; y = oy; /*x,y lµ c¸c thµnh phÇn cña ®èi t-îng gäi hµm thµnh  
phÇn*/  
}
void point::move(int dx, int dy) {  
cout<<"Ham thanh phan move\n";  
x += dx; y += dy;  
}
-49-  
Ng«n ng÷ C++  
void point::display() {  
cout<<"Ham thanh phan display\n";  
cout<<"Toa do: "<<x<<" "<<y<<"\n";  
}
void main() {  
clrscr();  
point p;  
p.init(2,4); /*gäi hµm thµnh phÇn tõ ®èi t-îng*/  
p.display();  
p.move(1,2);  
p.display();  
getch();  
}
Ham thanh phan init  
Ham thanh phan display  
Toa do: 2 4  
Ham thanh phan move  
Ham thanh phan display  
Toa do: 3 6  
Tham sè ngÇm ®Þnh trong lêi gäi hµm thµnh phÇn  
2.1.4  
ë ®©y kh«ng nªn nhÇm lÉn kh¸i niÖm nµy víi lêi gäi hµm víi tham sè  
cã gi¸ trÞ ngÇm ®Þnh. Lêi gäi hµm thµnh phÇn lu«n cã mét vµ chØ mét tham  
sè ngÇm ®Þnh lµ ®èi t-îng thùc hiÖn lêi gäi hµm. Nh- thÕ c¸c biÕn x, y trong  
®Þnh nghÜa cña c¸c hµm point::init(), point::display(), hay point::move()  
chÝnh lµ c¸c biÕn thÓ hiÖn cña ®èi t-îng dïng lµm tham sè ngÇm ®Þnh trong  
lêi gäi hµm. Do vËy lêi gäi hµm thµnh phÇn:  
p.init(2,4)  
sÏ g¸n 2 cho p.x cßn p.y sÏ cã gi¸ trÞ 4.  
-50-  
Ng«n ng÷ C++  
TÊt nhiªn, theo nguyªn t¾c ®ãng gãi, kh«ng g¸n trÞ cho c¸c thµnh phÇn  
d÷ liÖu cña ®èi t-îng mét c¸ch trùc tiÕp.  
p.x = 2;  
p.y = 4;  
H¬n n÷a, kh«ng thÓ thùc hiÖn lêi gäi tíi hµm thµnh phÇn nÕu kh«ng chØ  
râ ®èi t-îng ®-îc tham chiÕu. ChØ thÞ:  
init(5,2);  
trong hµm main sÏ cã thÓ g©y lçi biªn dÞch nÕu trong ch-¬ng tr×nh  
kh«ng cã hµm tù do víi tªn init.  
2.1.5  
Ph¹m vi líp  
Ph¹m vi chØ ra phÇn ch-¬ng tr×nh trong ®ã cã thÓ truy xuÊt ®Õn mét ®èi  
t-îng nµo ®ã. Trong C cã bèn kiÓu ph¹m vi liªn quan ®Õn c¸ch thøc vµ vÞ trÝ  
khai b¸o biÕn: ph¹m vi khèi lÖnh, ph¹m vi tÖp, ph¹m vi ch-¬ng tr×nh vµ  
ph¹m vi hµm nguyªn mÉu, trong ®ã th-êng dïng nhÊt lµ ph¹m vi toµn côc  
(tÖp, ch-¬ng tr×nh) vµ ph¹m vi côc bé (khèi lÖnh, hµm). Môc ®Ých cña ph¹m  
vi lµ ®Ó kiÓm so¸t viÖc truy xuÊt ®Õn c¸c biÕn/h»ng/hµm.  
§Ó kiÓm so¸t truy nhËp ®Õn c¸c thµnh phÇn (d÷ liÖu, hµm) cña c¸c líp,  
C++ ®-a ra kh¸i niÖm ph¹m vi líp. TÊt c¶ c¸c thµnh phÇn cña mét líp sÏ  
®-îc coi lµ thuéc ph¹m vi líp; trong ®Þnh nghÜa hµm thµnh phÇn cña líp cã  
thÓ tham chiÕu ®Õn bÊt kú mét thµnh phÇn nµo kh¸c cña cïng líp ®ã. Tu©n  
theo ý t-ëng ®ãng gãi, C++ coi tÊt c¶ c¸c thµnh phÇn cña mét líp cã liªn hÖ  
víi nhau. Ngoµi ra, C++ cßn cho phÐp më réng ph¹m vi líp ®Õn c¸c líp con  
ch¸u, b¹n bÌ vµ hä hµng (Xem thªm ch-¬ng 5 - KÕ thõa vµ c¸c môc tiÕp sau  
®Ó hiÓu râ h¬n).  
Tõ kho¸ x¸c ®Þnh thuéc tÝnh truy xuÊt  
2.1.6  
Trong phÇn nµy ta nãi tíi vai trß cña hai tõ kho¸ private vµ public -  
dïng ®Ó x¸c ®Þnh thuéc tÝnh truy xuÊt cña c¸c thµnh phÇn líp.  
Trong ®Þnh nghÜa cña líp ta cã thÓ x¸c ®Þnh kh¶ n¨ng truy xuÊt thµnh  
phÇn cña mét líp nµo ®ã tõ bªn ngoµi ph¹m vi líp. Trong líp point cã hai  
thµnh phÇn d÷ liÖu vµ ba thµnh phÇn hµm. C¸c thµnh phÇn d÷ liÖu ®-îc khai  
b¸o víi nh·n lµ private, cßn c¸c hµm thµnh víi nh·n public. private vµ  
public lµ c¸c tõ kho¸ x¸c ®Þnh thuéc tÝnh truy xuÊt. Mäi thµnh phÇn ®-îc  
liÖt kª trong phÇn public ®Òu cã thÓ truy xuÊt trong bÊt kú hµm nµo. Nh÷ng  
-51-  
Ng«n ng÷ C++  
thµnh phÇn ®-îc liÖt kª trong phÇn private chØ ®-îc truy xuÊt bªn trong  
ph¹m vi líp, bëi chóng thuéc së h÷u riªng cña líp, trong khi ®ã c¸c thµnh  
phÇn public thuéc së h÷u chung cña mäi thµnh phÇn trong ch-¬ng tr×nh.  
Víi khai b¸o líp point ta thÊy r»ng c¸c thµnh phÇn private ®-îc tÝnh  
tõ chç nã xuÊt hiÖn cho ®Õn tr-íc nh·n public. Trong líp cã thÓ cã nhiÒu  
nh·n private vµ public. Mçi nh·n nµy cã ph¹m vi ¶nh h-ëng cho ®Õn khi  
gÆp mét nh·n kÕ tiÕp hoÆc hÕt khai b¸o líp. Xem ch-¬ng tr×nh  
tamgiac.cpp sau ®©y:  
-52-  
Ng«n ng÷ C++  
VÝ dô 3.4  
/*tamgiac.cpp*/  
#include <iostream.h>  
#include <math.h>  
#include <conio.h>  
/*khai b¸o líp tam gi¸c*/  
class tamgiac{  
private:  
float a,b,c;/*®é dµi ba c¹nh*/  
public:  
void nhap();/*nhËp vµo ®é dµi ba c¹nh*/  
void in();/*in ra c¸c th«ng tin liªn quan ®Õn tam gi¸c*/  
private:  
int loaitg();/*cho biÕt kiÓu cña tam gi¸c: 1-d,2-vc,3-c,4-v,5-t*/  
float dientich();/*tÝnh diÖn tÝch cña tam gi¸c*/  
};  
/*®Þnh nghÜa hµm thµnh phÇn*/  
void tamgiac::nhap() {  
/*nhËp vµo ba c¹nh cña tam gi¸c, cã kiÓm tra ®iÒu kiÖn*/  
do {  
cout<<"Canh a : "; cin>>a;  
cout<<"Canh b : "; cin>>b;  
cout<<"Canh c : "; cin>>c;  
}while(a+b<=c||b+c<=a||c+a<=b);  
}
void tamgiac::in() {  
cout<<"Do dai ba canh :"<<a<<" "<<b<<" "<<c<<"\n";  
/* gäi hµm thµnh phÇn bªn trong mét hµm thµnh phÇn kh¸c cïng líp */  
-53-  
Ng«n ng÷ C++  
cout<<"Dien tich tam giac : "<<dientich()<<"\n";  
switch(loaitg()) {  
case 1: cout<<"Tam giac deu\n";break;  
case 2: cout<<"Tam giac vuong can\n";break;  
case 3: cout<<"Tam giac can\n";break;  
case 4: cout<<"Tam giac vuong\n";break;  
default:cout<<"Tam giac thuong\n";break;  
}
}
float tamgiac::dientich() {  
return (0.25*sqrt((a+b+c)*(a+b-c)*(a-b+c)*(-a+b+c)));  
}
int tamgiac::loaitg() {  
if (a==b||b==c||c==a)  
if (a==b && b==c)  
return 1;  
else if (a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b)  
return 2;  
else return 3;  
else if (a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b)  
return 4;  
else return 5;  
}
void main() {  
clrscr();  
tamgiac tg;  
tg.nhap();  
tg.in();  
-54-  
Ng«n ng÷ C++  
getch();  
}
Canh a : 3  
Canh b : 3  
Canh c : 3  
Do dai ba canh :3 3 3  
Dien tich tam giac : 3.897114  
Tam giac deu  
Canh a : 3  
Canh b : 4  
Canh c : 5  
Do dai ba canh :3 4 5  
Dien tich tam giac : 6  
Tam giac vuong  
C¸c thµnh phÇn trong mét líp cã thÓ ®-îc s¾p xÕp mét c¸ch hÕt søc tuú  
ý. Do ®ã cã thÓ s¾p xÕp l¹i c¸c khai b¸o hµm thµnh phÇn ®Ó cho c¸c thµnh  
phÇn private ë trªn, cßn c¸c thµnh phÇn public ë d-íi trong khai b¸o líp.  
Ch¼ng h¹n cã thÓ ®-a ra mét khai b¸o kh¸c cho líp tamgiac trong  
tamgiac.cpp nh- sau:  
class tamgiac{  
private:  
float a,b,c;/*®é dµi ba c¹nh*/  
int loaitg();/*cho biÕt kiÓu cña tam gi¸c: 1-d,2-vc,3-c,4-v,5-t*/  
float dientich();/*tÝnh diÖn tÝch cña tam gi¸c*/  
public:  
void nhap();/*nhËp vµo ®é dµi ba c¹nh*/  
void in();/*in ra c¸c th«ng tin liªn quan ®Õn tam gi¸c*/  
};  
-55-  
Ng«n ng÷ C++  
Ngoµi ra, cßn cã thÓ bá nh·n private ®i v× C++ ngÇm hiÓu r»ng c¸c  
thµnh phÇn tr-íc nh·n public ®Çu tiªn lµ private (ë ®©y chóng ta t¹m thêi  
ch-a bµn ®Õn tõ kho¸ protected). Tãm l¹i, khai b¸o “sóc tÝch” nhÊt cho líp  
tam gi¸c nh- sau:  
class tamgiac {  
float a,b,c;/*®é dµi ba c¹nh*/  
int loaitg();/*cho biÕt kiÓu cña tam gi¸c: 1-d,2-vc,3-c,4-v,5-t*/  
float dientich();/*tÝnh diÖn tÝch cña tam gi¸c*/  
public:  
void nhap();/*nhËp vµo ®é dµi ba c¹nh*/  
void in();/*in ra c¸c th«ng tin liªn quan ®Õn tam gi¸c*/  
};  
-56-  
Ng«n ng÷ C++  
2.1.7  
Gäi mét hµm thµnh phÇn trong mét hµm thµnh phÇn  
kh¸c  
Khi khai b¸o líp, cã thÓ gäi hµm thµnh phÇn tõ mét hµm thµnh phÇn  
kh¸c trong cïng líp ®ã. Khi muèn gäi mét hµm tù do trïng tªn vµ danh s¸ch  
tham sè ta ph¶i sö dông to¸n tö ph¹m vi “::”. B¹n ®äc cã thÓ kiÓm nghiÖm  
®iÒu nµy b»ng c¸ch ®Þnh nghÜa mét hµm tù do tªn loaitg vµ gäi nã trong  
®Þnh nghÜa cña hµm tamgiac::in().  
NhËn xÐt  
9. NÕu tÊt c¶ c¸c thµnh phÇn cña mét líp lµ public, líp sÏ hoµn toµn t-¬ng  
®-¬ng víi mét cÊu tróc, kh«ng cã ph¹m vi líp. C++ còng cho phÐp khai  
b¸o c¸c cÊu tróc víi c¸c hµm thµnh phÇn. Hai khai b¸o sau lµ t-¬ng  
®-¬ng nhau:  
struct point {  
int x, y;  
class point {  
public:  
void init(int, int);  
void move(int, int);  
void display();  
};  
int x, y;  
void init(int, int);  
void move(int, int);  
void display();  
};  
10. Ngoµi public vµ private, cßn cã tõ kho¸ protected (®-îc b¶o vÖ)  
dïng ®Ó chØ ®Þnh tr¹ng th¸i cña c¸c thµnh phÇn trong mét líp.  
Trong ph¹m vi cña líp hiÖn t¹i mét thµnh phÇn protected cã tÝnh  
chÊt gièng nh- thµnh phÇn private.  
2.2 Kh¶ n¨ng cña c¸c hµm thµnh phÇn  
§Þnh nghÜa chång c¸c hµm thµnh phÇn.  
2.2.1  
C¸c hµm thµnh phÇn cã thÓ cã trïng tªn nh-ng ph¶i kh¸c nhau ë kiÓu  
gi¸ trÞ tr¶ vÒ, danh s¸ch kiÓu c¸c tham sè. Hµm thµnh phÇn ®-îc phÐp gäi tíi  
c¸c hµm thµnh phÇn kh¸c, thËm chÝ trïng tªn. Ch-¬ng tr×nh point3.cpp sau  
®©y lµ mét c¶i biªn míi cña point.cpp:  
VÝ dô 3.5  
/*point3.cpp*/  
-57-  
Ng«n ng÷ C++  
#include <iostream.h>  
#include <conio.h>  
class point {  
int x,y;  
public:  
/*®Þnh nghÜa chång c¸c hµm thµnh phÇn init vµ display*/  
void init();  
void init (int);  
void init (int,int);  
void display();  
void display(char *);  
};  
void point::init() {  
x=y=0;  
}
void point::init(int abs) {  
x=abs;y=0;  
}
void point::int(int abs,int ord) {  
x=abs;  
y=ord;  
}
void point::display()  
{
cout<<"Toa do : "<<x<<" "<<y<<"\n";  
}
void point::display(char *mesg) {  
cout<<mesg;  
-58-  
Ng«n ng÷ C++  
display();  
}
void main() {  
clrscr();  
point a; a.init();/*point::init()*/  
a.display();/*point::display()*/  
point b; b.init(5); /*point::init(int )*/  
b.display("point b - ");/*point::display(char *)*/  
point c; c.init(3,12); /*point::init(int, int)*/  
c.display("Hello ----");  
getch();  
}
Toa do : 0 0  
point b - Toa do : 5 0  
Hello ----Toa do : 3 12  
C¸c tham sè víi gi¸ trÞ ngÇm ®Þnh  
2.2.2  
Gièng nh- c¸c hµm th«ng th-êng, lêi gäi hµm thµnh phÇn cã thÓ sö  
dông gi¸ trÞ ngÇm ®Þnh cho c¸c tham sè. Gi¸ trÞ ngÇm ®Þnh nµy sÏ ®-îc khai  
b¸o trong ®Þnh nghÜa hµm thµnh phÇn hay trong khai b¸o (trong khai b¸o líp)  
cña nã. Ch-¬ng tr×nh point4.cpp sau ®©y ®-îc c¶i tiÕn tõ point3.cpp  
ng¾n gän h¬n nh-ng vÉn gi÷ ®-îc tÊt c¶ c¸c kh¶ n¨ng nh- trong  
point3.cpp  
VÝ dô 3.6  
/*point4.cpp*/  
#include <iostream.h>  
#include <conio.h>  
class point {  
int x,y;  
-59-  
Tải về để xem bản đầy đủ
pdf 85 trang Thùy Anh 20460 Free
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình hướng đối tượng với C++ - Chương 3: Đối tượng và lớp", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_lap_trinh_huong_doi_tuong_voi_c_chuong_3_doi_tuon.pdf