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
ë ®©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
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 đủ
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:
giao_trinh_lap_trinh_huong_doi_tuong_voi_c_chuong_3_doi_tuon.pdf

