Ch
Ch
Ch
Ch
ơ
ơ
ơ
ơ
ng
ng
ng
ng
3
3
3
3
đố
đố
đố
đố
i
i
i
i
t
t
t
t
ợ
ợ
ợ
ợ
ng
ng
ng
ng
v
v
v
v
à
à
à
à
l
l
l
l
ớ
ớ
ớ
ớ
p
p
p
p
(Object
(Object
(Object
(Object
&
&
&
&
Class)
Class)
Class)
Class)
Mụcđíchchơngnày:
1.Kháiniệmvềđónggóidữliệu.
2.Khaibáovàsửdụngmộtlớp.
3.Khaibáovàsửdụngđốitợng,contrỏđốitợng,thamchiếuđối
tợng.
4.Hàmthiếtlậpvàhàmhuỷbỏ.
5.Khaibáovàsửdụnghàmthiếtlậpsaochép.
6.
Vaitròcủahàmthiếtlậpngầmđịnh.
1.
1.
1.
1.
Đố
Đố
Đố
Đố
i
i
i
i
t
t
t
t
ợ
ợ
ợ
ợ
ng
ng
ng
ng
Đốitợnglàmộtkháiniệmtronglậptrìnhhớngđốitợngbiểuthịsự
liênkếtgiữadữliệuvàcácthủtục(gọilàcácphơngthức)thaotáctrêndữ
liệuđó.Tacócôngthứcsau:
ởđâychúngtahiểurằngđốitợngchínhlàcôngcụhỗtrợchosựđóng
gói.Sựđónggóilàcơchếliênkếtcáclệnhthaotácvàdữliệucóliênquan,
giúpchocảhaiđợcantoàntránhđợcsựcanthiệptừbênngoàivàviệcsử
dụngsai.Nhìnchungđịnhnghĩamộtđốitợngphứctạphơnsovớiđịnh
nghĩacácbiếncấutrúcthôngthờng,bởilẽngoàiviệcmôtảcácthànhphần
dữliệu,tacònphảixácđịnhđợccácthaotáctácđộnglênđốitợngđó.
Hình2.1môtảcácđốitợngđiểmtrênmặtphẳng:
Mỗiđốitợngđợcxácđịnhbởihaithànhphầntoạđộđợcbiểudiễn
bởihaibiếnnguyên.Cácthaotáctácđộnglênđiểmbaogồmviệcxácđịnh
toạđộmộtđiểmtrênmặtphẳngtoạđộ(thểhiệnbằngviệcgángiátrịcho
haithànhphầntoạđộ),thayđổitoạđộvàhiểnthịkếtquảlêntrênmặtphẳng
toạđộ(tơngtựnhviệcchấmđiểmtrênmặtphẳngđó).
Lợiíchcủaviệcđónggóilàkhinhìntừbênngoài,mộtđốitợngchỉ
đợcbiếttớibởicácmôtảvềcácphơngthứccủanó,cáchthứccàiđặtcác
Đố
Đố
Đố
Đố
i
i
i
i
t
t
t
t
ợ
ợ
ợ
ợ
ng
ng
ng
ng
=
=
=
=
D
D
D
D
ữ
ữ
ữ
ữ
li
li
li
li
ệ
ệ
ệ
ệ
u+Ph
u+Ph
u+Ph
u+Ph
ơ
ơ
ơ
ơ
ng
ng
ng
ng
th
th
th
th
ứ
ứ
ứ
ứ
c
c
c
c
NgônngữC++
-41-
dữliệukhôngquantrọngđốivớingờisửdụng.Vớimộtđốitợngđiểm,
ngờitachỉquantâmđếnviệccóthểthựchiệnđợcthaotácgìtrênnómà
khôngcầnbiếtcácthaotácđóđợcthựchiệnnhthếnào,cũngnhđiềugì
xảyrabêntrongbảnthânđốitợngđó.Tathờngnóiđólàsựtrừutợng
hoádữliệu(khicácchitiếtcàiđặtcụthểđợcgiấuđi).
Đónggóicónhiềulợiíchgópphầnnângcaochấtlợngcủachơng
trình.Nólàmchocôngviệcbảotrìchơngtrìnhthuậnlơihơnrấtnhiều:một
sựthayđổicấutrúccủamộtđốitợngchỉảnhhởngtớibảnthânđốitợng;
ngờisửdụngđốitợngkhôngcầnbiếtđếnthayđổinày(vớilậptrìnhcấu
trúcthìngờilậptrìnhphảitựquảnlýsựthayđổiđó).Chẳnghạncóthể
biểudiễntoạđộmộtđiểmdớidạngsốthực,khiđóchỉcóngờithiếtkế
đốitợngphảiquantâmđểsửalạiđịnhnghĩacủađốitợngtrongkhiđó
ngờisửdụngkhôngcầnhaybiếtvềđiềuđó,miễnlànhữngthayđổiđó
khôngtácđộngđếnviệcsửdụngđốitợngđiểm.
Tơngtựnhvậy,tacóthểbổsungthêmthuộctínhmàuvàmộtsốthao
táclênmộtđốitợngđiểm,đểcóđợcmộtđốitợngđiểmmàu.Rõrànglà
đónggóichophépđơngiảnhoáviệcsửdụngmộtđốitợng.
Tronglậptrìnhhớngđốitợng,đónggóichophépdữliệucủađối
tợngđợcchelấpkhinhìntừbênngoài,nghĩalànếungờidùngmuốntác
độnglêndữliệucủađốitợngthìphảigửiđếnđốitợngcácthông
điệp(message).ởđâycácphơngthứcđóngvaitròlàgiaodiệnbắtbuộc
giữacácđốitợngvàngờisửdụng.Tacónhậnxét:
Lờigọiđếnmột
phơngthứclàtruyềnmộtthôngbáođếnchođốitợng
.
Cácthôngđiệpgửitớiđốitợngnàosẽgắnchặtvớiđốitợngđóvàchỉ
đốitợngnàonhậnđợcthôngđiệpmớiphảithựchiệntheothôngđiệpđó;
chẳnghạncácđốitợngđiểmđộclậpvớinhau,vìvậythôngđiệpthayđổi
toạđộđốitợngđiểmpchỉlàmảnhhởngđếncácthànhphầntoạđộtrong
pchứkhôngthểthayđổiđợcnộidungcủamộtđốitợngđiểmqkhác.
Môtảđố
i
tợngđ
i
ểm{
//dữliệu
intx,y;
//phơngthức
voidinit(intox,intoy);
voidmove(intdx,intdy);
voiddisplay();
};
Hình3.1Môtảcácđốitợngđiểm
NgônngữC++
-42-
Sovớilậptrìnhhớngđốitợngthuầntuý,cáccàiđặtcụthểcủađối
tợngtrongC++linhđộnghơnmộtchút,bằngcáchchophépchỉchedấu
mộtbộphậndữliệucủađốitợngvàmởrộnghơnkhảnăngtruynhậpđến
cácthànhphầnriêngcủađốitợng.Kháiniệmlớpchínhlàcơsởchocác
linhđộngnày.
Lớplàmộtmôtảtrừutợngcủanhómcácđốitợngcócùngbảnchất.
Trongmộtlớpngờitađaracácmôtảvềtínhchấtcủacácthànhphầndữ
liệu,cáchthứcthaotáctrêncácthànhphầnnày(hànhvicủacácđốitợng),
ngợclạimỗimộtđốitợnglàmộtthểhiệncụthểchonhữngmôtảtrừu
tợngđó.Trongcácngônngữlậptrình,lớpđóngvaitròmộtkiểudữliệu
đợcngờidùngđịnhnghĩavàviệctạoramộtđốitợngđợcvínhkhai
báomộtbiếncókiểulớp.
2.
2.
2.
2.
L
L
L
L
ớ
ớ
ớ
ớ
p
p
p
p
2.1
2.1
2.1
2.1
Khai
Khai
Khai
Khai
b
b
b
b
á
á
á
á
o
o
o
o
l
l
l
l
ớ
ớ
ớ
ớ
p
p
p
p
Từquanđiểmcủalậptrìnhcấutrúc,lớplàmộtkiểudữliệutựđịnh
nghĩa.Tronglậptrìnhhớngđốitợng,chơngtrìnhnguồnđợcphânbố
trongkhaibáovàđịnhnghiãcủacáclớp.
Sauđâylàmộtvídụđiểnhìnhvềcúphápkhaibáolớp.Kinhnghiệm
chothấymọikiểukhaibáokhácđềucóthểchuẩnhoáđểđavềdạngnày.
Cácchitiếtliênquanđếnkhaibáolớpsẽlầnlợtđợcđềcậpđếntrong
cácphầnsau.Đểdễhìnhdungxétmộtvídụvềkhaibáolớpđiểmtrongmặt
phẳng.Trongvídụnàytacóđềcậpđếnmộtvàikhíacạnhliênquanđến
khaibáolớp,đốitợngvàsửdụngchúng.
class
class
class
class
<tênlớp>{
private:
private:
private:
private:
<khaibáocácthànhphầnriêngtrongtừngđốitợng>
public:
public:
public:
public:
<khaibáocácthànhphầncôngcộngcủatừngđối
tợng>
};
<địnhnghiãcủacáchàmthànhphầnchađợcđịnh
nghĩabêntrongkhaibáolớp>
NgônngữC++
-43-
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
3.1
3.1
3.1
3.1
/*point.cpp
point.cpp
point.cpp
point.cpp
*/
#include<iostream.h>
#include<conio.h>
classpoint
{
/*khaibáocácthànhphầndữliệuriêng*/
private:
intx,y;
/*khaibáocáchàmthànhphầncôngcộng*/
public:
voidinit(intox,intoy);
voidmove(intdx,intdy);
voiddisplay();
};
/*địnhnghĩacáchàmthànhphầnbênngoàikhaibáolớp*/
voidpoint::init(intox,intoy)
{
cout<<"Hamthanhphaninit\n";
x=
ox;
y=
oy;
/*
x,ylàcácthànhphầncủađốitợnggọihàmthành
phần
*/
}
voidpoint::move(intdx,intdy)
{
cout<<"Hamthanhphanmove\n";
x
+=
dx;
y
+=
dy;
}
voidpoint::display()
{
cout<<"Hamthanhphandisplay\n";
cout<<"Toado:"<<x<<""<<y<<"\n";
}
NgônngữC++
-44-
voidmain()
{
clrscr();
point
p;
p.init(2,4);
/*gọihàmthànhphầntừđốitợng*/
p.display();
p.move(1,2);
p.display();
getch();
}
Hamthanhphaninit
Hamthanhphandisplay
Toado:24
Hamthanhphanmove
Hamthanhphandisplay
Toado:36
Nh
Nh
Nh
Nh
ậ
ậ
ậ
ậ
n
n
n
n
x
x
x
x
é
é
é
é
t
t
t
t
7.Cóthểkhaibáotrựctiếpcáchàmthànhphầnbêntrongkhaibáolớp.
Tuyvậyđiềuđóđôikhilàmmấtmỹquancủachơngtrìnhnguồn,do
vậyngờitathờngsửdụngcáchkhaibáocáchàmthànhphầnởbên
ngoàikhaibáolớp.Khiđótasửdụngcúpháp:
8.Gọihàmthànhphầncủalớptừmộtđốitợngchínhlàtruyềnthông
điệpchohàmthànhphầnđó.Cúphápnhsau:
<tênkiểugiátrịtrảlại><tênlớp>::<tênhàm>(<danhsáchthamsố>){
<nộidung>
}
<tênđốitợng>.<tênhàmthànhphần>(<danhsáchcác
thamsốnếucó>);
NgônngữC++
-45-
2.1.1
2.1.1
2.1.1
2.1.1
T
T
T
T
ạ
ạ
ạ
ạ
o
o
o
o
đố
đố
đố
đố
i
i
i
i
t
t
t
t
ợ
ợ
ợ
ợ
ng
ng
ng
ng
TrongC++,mộtđốitợngcóthểđợcxáclậpthôngquanmột
biến/hằngcókiểulớp.
Dođóvùngnhớđợccấpphátchomộtbiếnkiểulớpsẽchotamột
khungcủađốitợngbaogồmdữliệulàcácthểhiệncụthểcủacácmôtảdữ
liệutrongkhaibáolớpcùngvớicácthôngđiệpgửitớicáchàmthànhphần.
Mỗiđốitợngsởhữumộttậpcácbiếntơngứngvớitênvàkiểucủa
cácthànhphầndữliệuđịnhnghĩatronglớp.Tagọichúnglàcácbiếnthể
hiệncủađốitợng.Tuynhiêntấtcảcácđốitợngcùngmộtlớpchungnhau
địnhnghĩacủacáchàmthànhphần.
Lớplàmộtkiểudữliệuvìvậycóthểkhaibáocontrỏhaythamchiếu
đếnmộtđốitợngthuộclớpvàbằngcáchấycóthểtruynhậpgiántiếpđến
đốitợng.Nhngchúýlàcontrỏvàthamchiếukhôngphảilàmộtthểhiện
củalớp.
2.1.2
2.1.2
2.1.2
2.1.2
C
C
C
C
á
á
á
á
c
c
c
c
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
d
d
d
d
ữ
ữ
ữ
ữ
li
li
li
li
ệ
ệ
ệ
ệ
u
u
u
u
Cúphápkhaibáocácthànhphầndữliệugiốngnhkhaibáobiến:
KhungDL
Phơng
thức
Dữliệucụthể1
Thamchiếuphơng
thức
Dữliệucụthể2
Thamchiếuphơng
thức
Lớp
Đối
tợng
Đối
tợng
Hình3.2Đốitợnglàmộtthể
hiệncủalớp
<tênkiểu><tênthànhphần>;
<tênlớp><tênđốitợng>;
NgônngữC++
-46-
Mộtthànhphầndữliệucóthểlàmộtbiếnkiểucơsở(
int
int
int
int
,
float
float
float
float
,
double
double
double
double
,
char,
char,
char,
char,
char
char
char
char
*
*
*
*
),kiểutrờngbit,kiểuliệtkê(enum)haycáckiểudongờidùng
địnhnghĩa.Thậmchí,thànhphầndữliệucòncóthểlàmộtđốitợngthuộc
lớpđãđợckhaibáotrớcđó.Tuynhiênkhôngthểdùngtrựctiếpcáclớp
đểkhaibáokiểuthànhphầndữliệuthuộcvàobảnthânlớpđangđợcđịnh
nghĩa.Muốnvậy,trongkhaibáocủamộtlớpcóthểdùngcáccontrỏhoặc
thamchiếuđếncácđốitợngcủachínhlớpđó.
Trongkhaibáocủacácthànhphầndữliệu,cóthểsửdụngtừkhoá
static
static
static
static
nhngkhôngđợcsửdụngcáctừkhoáauto
auto
auto
auto
,register
register
register
register
,extern
extern
extern
extern
trongkhaibáocácthànhphầndữliệu.Cũngkhôngthểkhaibáovàkhởiđầu
giátrịchocácthànhphầnđó.
2.1.3
2.1.3
2.1.3
2.1.3
C
C
C
C
á
á
á
á
c
c
c
c
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
Hàmđợckhaibáotrongđịnhnghĩacủalớpđợcgọilàhàmthành
phầnhayphơngthứccủalớp(hàmthànhphầnlàthuậtngữcủaC++,còn
phơngthứclàthuậtngữtronglậptrìnhhớngđốitợngnóichung).Các
hàmthànhphầncóthểtruynhậpđếncácthànhphầndữliệuvàcáchàm
thànhphầnkháctronglớp.Nhtrênđãnói,C++chophéphàmthànhphần
truynhậptớicácthànhphầncủacácđốitợngcùnglớp,miễnlàchúngđợc
khaibáobêntrongđịnhnghĩahàm(nhlàmộtđốitợngcụcbộhaymột
thamsốhìnhthứccủahàmthànhphần).Phầntiếpsausẽcócácvídụminh
hoạchokhảnăngnày.
Trongchơngtrình
point.cpp
,
trongkhaibáocủalớppointcóchứa
cáckhaibáocáchàmthànhphầncủalớp.Cáckhaibáonàycũngtuântheo
cúphápkhaibáochocáchàmbìnhthờng.Địnhnghĩacủacáchàmthìcó
thểđặtởbêntronghaybênngoàikhaibáolớp;Khiđịnhnghĩahàmthành
phầnđặttrongkhaibáolớp(nếuhàmthànhphầnđơngiản,khôngchứacác
cấutrúclặp
1
)khôngcógìkhácsovớiđịnhnghĩacủahàmthôngthờng.
Chơngtrìnhpoint1.cppsauđâylàmộtcáchviếtkháccủa
point
.cpp
trongđóhàmthànhphần
init()
đợcđịnhnghĩangaybên
trongkhaibáolớp.
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
3.2
3.2
3.2
3.2
/*point1.cpp
point1.cpp
point1.cpp
point1.cpp
*/
1
Hàmthànhphầnđịnhnghĩatrongkhaibáolớpđợcchơngtrìnhdịchhiểulà
hàminline,
inline,
inline,
inline,
nênkhôngđợcquáphứctạp.
NgônngữC++
-47-
#include<iostream.h>
#include<conio.h>
classpoint
{
/*khaibáocácthànhphầndữliệuprivate*/
private:
intx,y;
/*khaibáocáchàmthànhphầnpublic*/
public:
/*Địnhnghĩahàmthànhphầnbêntrongkhaibáolớp*/
voidinit(intox,intoy){
cout<<"Hamthanhphaninit\n";
x=
ox;
y=
oy;
/*
x,ylàcácthànhphầncủađốitợnggọihàm
thànhphần
*/
}
voidmove(intdx,intdy);
voiddisplay();
};
/*địnhnghĩacáchàmthànhphầnbênngoàikhaibáolớp*/
voidpoint::move(intdx,intdy)
{
cout<<"Hamthanhphanmove\n";
x
+=
dx;
y
+=
dy;
}
voidpoint::display()
{
cout<<"Hamthanhphandisplay\n";
cout<<"Toado:"<<x<<""<<y<<"\n";
}
voidmain()
{
clrscr();
NgônngữC++
-48-
point
p;
p.init(2,4);
/*gọihàmthànhphầntừđốitợng*/
p.display();
p.move(1,2);
p.display();
getch();
}
Hamthanhphaninit
Hamthanhphandisplay
Toado:24
Hamthanhphanmove
Hamthanhphandisplay
Toado:36
Khiđịnhnghĩahàmthànhphầnởngoàilớp,dòngtiêuđềcủahàmthành
phầnphảichứatêncủalớpcóhàmlàthànhviêntiếptheolàtoántửđịnh
phạmvi::.Đólàcáchđểphânbiệthàmthànhphầnvớicáchàmtựdo,
đồngthờicònchophéphailớpkhácnhaucóthểcócáchàmthànhphần
cùngtên.
Cóthểđặtđịnhnghĩahàmthànhphầntrongcùngtậptinkhaibáolớp
hoặctrongmộttậptinkhác.Vídụsauđâysauđâylàmộtcảibiênkháctừ
point.
cpp,
trongđótađặtriêngkhaibáolớppointtrongmộttệptiêuđề.
Tệptiêuđềsẽđợcthamchiếutớitrongtệpchơngtrình
point2.cpp
chứa
địnhnghĩacáchàmthànhphầncủalớp
point
.
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
3.3
3.3
3.3
3.3
Tệptiêuđề
/*point.h*/
/*point.h*/
/*point.h*/
/*point.h*/
/*đâylàtậptintiêuđềkhaibáolớppointđợcgộpvàotệppoint2.cpp*/
#ifndefpoint_h
#definepoint_h
#include<iostream.h>
NgônngữC++
-49-
classpoint
{
/*khaibáocácthànhphầndữliệuprivate*/
private:
intx,y;
/*khaibáocáchàmthànhphầnpublic*/
public:
/*Địnhnghĩahàmthànhphầnbêntrongkhaibáolớp*/
voidinit(intox,intoy);
voidmove(intdx,intdy);
voiddisplay();
};
#endif
Tệpchơngtrìnhnguồn
/*point2.cpp*/
/*point2.cpp*/
/*point2.cpp*/
/*point2.cpp*/
/*Tậptinchơngtrình,địnhnghĩavàsửdụngcáchàmthànhphầntronglớp
pointđợckhaibáotrongtậptintiêuđềpoint.h*/
#include
point.h
/*chènđịnhnghĩalớppointvàochơngtrình*/
#include<conio.h>
/*địnhnghĩacáchàmthànhphầnbênngoàikhaibáolớp*/
voidpoint::init(intox,intoy)
{
cout<<"Hamthanhphaninit\n";
x=
ox;
y=
oy;
/*
x,ylàcácthànhphầncủađốitợnggọihàmthành
phần
*/
}
voidpoint::move(intdx,intdy)
{
cout<<"Hamthanhphanmove\n";
x
+=
dx;
y
+=
dy;
}
NgônngữC++
-50-
voidpoint::display()
{
cout<<"Hamthanhphandisplay\n";
cout<<"Toado:"<<x<<""<<y<<"\n";
}
voidmain()
{
clrscr();
point
p;
p.init(2,4);
/*gọihàmthànhphầntừđốitợng*/
p.display();
p.move(1,2);
p.display();
getch();
}
Hamthanhphaninit
Hamthanhphandisplay
Toado:24
Hamthanhphanmove
Hamthanhphandisplay
Toado:36
2.1.4
2.1.4
2.1.4
2.1.4
Tham
Tham
Tham
Tham
s
s
s
s
ố
ố
ố
ố
ng
ng
ng
ng
ầ
ầ
ầ
ầ
m
m
m
m
đị
đị
đị
đị
nh
nh
nh
nh
trong
trong
trong
trong
l
l
l
l
ờ
ờ
ờ
ờ
i
i
i
i
g
g
g
g
ọ
ọ
ọ
ọ
i
i
i
i
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
ởđâykhôngnênnhầmlẫnkháiniệmnàyvớilờigọihàmvớithamsố
cógiátrịngầmđịnh.Lờigọihàmthànhphầnluôncómộtvàchỉmộttham
sốngầmđịnhlàđốitợngthựchiệnlờigọihàm.Nhthếcácbiếnx,ytrong
địnhnghĩacủacáchàmpoint::init(),point::display(),haypoint::move()
chínhlàcácbiếnthểhiệncủađốitợngdùnglàmthamsốngầmđịnhtrong
lờigọihàm.Dovậylờigọihàmthànhphần:
p.init(2,4)
sẽgán2chop.xcònp.ysẽcógiátrị4.
NgônngữC++
-51-
Tấtnhiên,theonguyêntắcđónggói,khônggántrịchocácthànhphần
dữliệucủađốitợngmộtcáchtrựctiếp.
p.x
=
2;
p.y
=
4;
Hơnnữa,khôngthểthựchiệnlờigọitớihàmthànhphầnnếukhôngchỉ
rõđốitợngđợcthamchiếu.Chỉthị:
init(5,2);
tronghàm
main
sẽcóthểgâylỗibiêndịchnếutrongchơngtrình
khôngcóhàmtựdovớitên
init
.
2.1.5
2.1.5
2.1.5
2.1.5
Ph
Ph
Ph
Ph
ạ
ạ
ạ
ạ
m
m
m
m
vi
vi
vi
vi
l
l
l
l
ớ
ớ
ớ
ớ
p
p
p
p
Phạmvichỉraphầnchơngtrìnhtrongđócóthểtruyxuấtđếnmộtđối
tợngnàođó.TrongCcóbốnkiểuphạmviliênquanđếncáchthứcvàvịtrí
khaibáobiến:phạmvikhốilệnh,phạmvitệp,phạmvichơngtrìnhvà
phạmvihàmnguyênmẫu,trongđóthờngdùngnhấtlàphạmvitoàncục
(tệp,chơngtrình)vàphạmvicụcbộ(khốilệnh,hàm).Mụcđíchcủaphạm
vilàđểkiểmsoátviệctruyxuấtđếncácbiến/hằng/hàm.
Đểkiểmsoáttruynhậpđếncácthànhphần(dữliệu,hàm)củacáclớp,
C++đarakháiniệmphạmvilớp.Tấtcảcácthànhphầncủamộtlớpsẽ
đợccoilàthuộcphạmvilớp;trongđịnhnghĩahàmthànhphầncủalớpcó
thểthamchiếuđếnbấtkỳmộtthànhphầnnàokháccủacùnglớpđó.Tuân
theoýtởngđónggói,C++coitấtcảcácthànhphầncủamộtlớpcóliênhệ
vớinhau.Ngoàira,C++cònchophépmởrộngphạmvilớpđếncáclớpcon
cháu,bạnbèvàhọhàng(Xemthêmchơng5-Kếthừavàcácmụctiếpsau
đểhiểurõhơn).
2.1.6
2.1.6
2.1.6
2.1.6
T
T
T
T
ừ
ừ
ừ
ừ
kho
kho
kho
kho
á
á
á
á
x
x
x
x
á
á
á
á
c
c
c
c
đị
đị
đị
đị
nh
nh
nh
nh
thu
thu
thu
thu
ộ
ộ
ộ
ộ
c
c
c
c
t
t
t
t
í
í
í
í
nh
nh
nh
nh
truy
truy
truy
truy
xu
xu
xu
xu
ấ
ấ
ấ
ấ
t
t
t
t
Trongphầnnàytanóitớivaitròcủahaitừkhoáprivate
private
private
private
vàpublic
public
public
public
-
dùngđểxácđịnhthuộctínhtruyxuấtcủacácthànhphầnlớp.
Trongđịnhnghĩacủalớptacóthểxácđịnhkhảnăngtruyxuấtthành
phầncủamộtlớpnàođótừbênngoàiphạmvilớp.Tronglớppointcóhai
thànhphầndữliệuvàbathànhphầnhàm.Cácthànhphầndữliệuđợckhai
báovớinhãnlàprivate,
private,
private,
private,
còncáchàmthànhvớinhãnpublic
public
public
public
.private
private
private
private
và
public
public
public
public
làcáctừkhoáxácđịnhthuộctínhtruyxuất.Mọithànhphầnđợc
liệtkêtrongphầnpublic
public
public
public
đềucóthểtruyxuấttrongbấtkỳhàmnào.Những
NgônngữC++
-52-
thànhphầnđợcliệtkêtrongphầnprivate
private
private
private
chỉđợctruyxuấtbêntrong
phạmvilớp,bởichúngthuộcsởhữuriêngcủalớp,trongkhiđócácthành
phầnpublic
public
public
public
thuộcsởhữuchungcủamọithànhphầntrongchơngtrình.
Vớikhaibáolớppointtathấyrằngcácthànhphầnprivate
private
private
private
đợctính
từchỗnóxuấthiệnchođếntrớcnhãnpublic
public
public
public
.Tronglớpcóthểcónhiều
nhãnprivate
private
private
private
vàpublic
public
public
public
.Mỗinhãnnàycóphạmviảnhhởngchođếnkhi
gặpmộtnhãnkếtiếphoặchếtkhaibáolớp.Xemchơngtrình
tamgiac.cpp
sauđây:
NgônngữC++
-53-
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
3.4
3.4
3.4
3.4
/*tamgiac.cpp*/
/*tamgiac.cpp*/
/*tamgiac.cpp*/
/*tamgiac.cpp*/
#include<iostream.h>
#include<math.h>
#include<conio.h>
/*khaibáolớptamgiác*/
classtamgiac{
private:
floata,b,c;
/*độdàibacạnh*/
public:
voidnhap();
/*nhậpvàođộdàibacạnh*/
voidin();
/*inracácthôngtinliênquanđếntamgiác*/
private:
intloaitg();
/*chobiếtkiểucủatamgiác:1-d,2-vc,3-c,4-v,5-t*/
floatdientich();
/*tínhdiệntíchcủatamgiác*/
};
/*địnhnghĩahàmthànhphần*/
voidtamgiac::nhap()
{
/*nhậpvàobacạnhcủatamgiác,cókiểmtrađiềukiệ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);
}
voidtamgiac::in()
{
cout<<"Dodai
ba
canh:"<<a<<""<<b<<""<<c<<"\n";
/*gọihàmthànhphầnbêntrongmộthàmthànhphầnkháccùnglớp*/
Ng«nng÷C++
-54-
cout<<"Dientichtamgiac
:
"<<dientich()<<"\n";
switch(loaitg())
{
case
1:
cout<<"Tamgiacdeu\n";break;
case
2:
cout<<"Tamgiacvuongcan\n";break;
case
3:
cout<<"Tamgiaccan\n";break;
case
4:
cout<<"Tamgiacvuong\n";break;
default:cout<<"Tamgiacthuong\n";break;
}
}
floattamgiac::dientich()
{
return(0.25*sqrt((a+b+c)*(a+b-c)*(a-b+c)*(-a+b+c)));
}
inttamgiac::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;
elsereturn
3;
else
if
(a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b)
return
4;
elsereturn
5;
}
voidmain()
{
clrscr();
tamgiactg;
tg.nhap();
tg.in();
NgônngữC++
-55-
getch();
}
Canha:3
Canhb:3
Canhc:3
Dodaibacanh:333
Dientichtamgiac:3.897114
Tamgiacdeu
Canha:3
Canhb:4
Canhc:5
Dodaibacanh:345
Dientichtamgiac:6
Tamgiacvuong
Cácthànhphầntrongmộtlớpcóthểđợcsắpxếpmộtcáchhếtsứctuỳ
ý.Dođócóthểsắpxếplạicáckhaibáohàmthànhphầnđểchocácthành
phầnprivate
private
private
private
ởtrên,còncácthànhphầnpublic
public
public
public
ởdớitrongkhaibáolớp.
Chẳnghạncóthểđaramộtkhaibáokháccholớptamgiactrong
tamgiac.cppnhsau:
classtamgiac{
private:
floata,b,c;
/*độdàibacạnh*/
intloaitg();
/*chobiếtkiểucủatamgiác:1-d,2-vc,3-c,4-v,5-t*/
floatdientich();
/*tínhdiệntíchcủatamgiác*/
public:
voidnhap();
/*nhậpvàođộdàibacạnh*/
voidin();
/*inracácthôngtinliênquanđếntamgiác*/
};
NgônngữC++
-56-
Ngoàira,còncóthểbỏnhãnprivate
private
private
private
đivìC++ngầmhiểurằngcác
thànhphầntrớcnhãnpublic
public
public
public
đầutiênlàprivate
private
private
private
(ởđâychúngtatạmthời
chabànđếntừkhoáprotected
protected
protected
protected
).Tómlại,khaibáosúctíchnhấtcholớp
tamgiácnhsau:
classtamgiac
{
floata,b,c;
/*độdàibacạnh*/
intloaitg();
/*chobiếtkiểucủatamgiác:1-d,2-vc,3-c,4-v,5-t*/
floatdientich();
/*tínhdiệntíchcủatamgiác*/
public:
voidnhap();
/*nhậpvàođộdàibacạnh*/
voidin();
/*inracácthôngtinliênquanđếntamgiác*/
};
NgônngữC++
-57-
2.1.7
2.1.7
2.1.7
2.1.7
G
G
G
G
ọ
ọ
ọ
ọ
i
i
i
i
m
m
m
m
ộ
ộ
ộ
ộ
t
t
t
t
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
trong
trong
trong
trong
m
m
m
m
ộ
ộ
ộ
ộ
t
t
t
t
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
kh
kh
kh
kh
á
á
á
á
c
c
c
c
Khikhaibáolớp,cóthểgọihàmthànhphầntừmộthàmthànhphần
kháctrongcùnglớpđó.Khimuốngọimộthàmtựdotrùngtênvàdanhsách
thamsốtaphảisửdụngtoántửphạmvi
::
.Bạnđọccóthểkiểmnghiệm
điềunàybằngcáchđịnhnghĩamộthàmtựdotên
loaitg
vàgọinótrong
địnhnghĩacủahàm
tamgiac::in().
Nh
Nh
Nh
Nh
ậ
ậ
ậ
ậ
n
n
n
n
x
x
x
x
é
é
é
é
t
t
t
t
9.Nếutấtcảcácthànhphầncủamộtlớplàpublic
public
public
public
,lớpsẽhoàntoàntơng
đơngvớimộtcấutrúc,khôngcóphạmvilớp.C++cũngchophépkhai
báocáccấutrúcvớicáchàmthànhphần.Haikhaibáosaulàtơng
đơngnhau:
10.Ngoàipublic
public
public
public
vàprivate
private
private
private
,còncótừkhoáprotected
protected
protected
protected
(đợcbảovệ)
dùngđểchỉđịnhtrạngtháicủacácthànhphầntrongmộtlớp.
Trongphạmvicủalớphiệntạimộtthànhphầnprotected
protected
protected
protected
cótính
chấtgiốngnhthànhphầnprivate
private
private
private
.
2.2
2.2
2.2
2.2
Kh
Kh
Kh
Kh
ả
ả
ả
ả
n
n
n
n
ă
ă
ă
ă
ng
ng
ng
ng
c
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
c
c
c
c
á
á
á
á
c
c
c
c
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
2.2.1
2.2.1
2.2.1
2.2.1
Đị
Đị
Đị
Đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
a
a
ch
ch
ch
ch
ồ
ồ
ồ
ồ
ng
ng
ng
ng
c
c
c
c
á
á
á
á
c
c
c
c
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n.
n.
n.
n.
Cáchàmthànhphầncóthểcótrùngtênnhngphảikhácnhauởkiểu
giátrịtrảvề,danhsáchkiểucácthamsố.Hàmthànhphầnđợcphépgọitới
cáchàmthànhphầnkhác,thậmchítrùngtên.Chơngtrình
point3.cpp
sau
đâylàmộtcảibiênmớicủa
point.cpp
:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
3.5
3.5
3.5
3.5
/*point3.cpp*/
structpoint
{
int
x,y;
voidinit(int,int);
voidmove(int,int);
voiddisplay();
};
classpoint
{
public:
int
x,y;
voidinit(int,int);
voidmove(int,int);
voiddisplay();
};
NgônngữC++
-58-
#include<iostream.h>
#include<conio.h>
classpoint
{
intx,y;
public:
/*địnhnghĩachồngcáchàmthànhphầninitvàdisplay*/
voidinit();
voidinit(int);
voidinit(int,int);
voiddisplay();
voiddisplay(char*);
};
voidpoint::init()
{
x=y=0;
}
voidpoint::init(intabs)
{
x=abs;y=0;
}
voidpoint::int(intabs,intord)
{
x=abs;
y=ord;
}
voidpoint::display()
{
cout<<"Toa
do
:
"<<x<<""<<y<<"\n";
}
voidpoint::display(char*mesg)
{
cout<<mesg;
NgônngữC++
-59-
display();
}
voidmain()
{
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();
}
Toado:00
pointb-Toado:50
Hello Toado:312
2.2.2
2.2.2
2.2.2
2.2.2
C
C
C
C
á
á
á
á
c
c
c
c
tham
tham
tham
tham
s
s
s
s
ố
ố
ố
ố
v
v
v
v
ớ
ớ
ớ
ớ
i
i
i
i
gi
gi
gi
gi
á
á
á
á
tr
tr
tr
tr
ị
ị
ị
ị
ng
ng
ng
ng
ầ
ầ
ầ
ầ
m
m
m
m
đị
đị
đị
đị
nh
nh
nh
nh
Giốngnhcáchàmthôngthờng,lờigọihàmthànhphầncóthểsử
dụnggiátrịngầmđịnhchocácthamsố.Giátrịngầmđịnhnàysẽđợckhai
báotrongđịnhnghĩahàmthànhphầnhaytrongkhaibáo(trongkhaibáolớp)
củanó.Chơngtrình
point4.cpp
sauđâyđợccảitiếntừ
point3.cpp
ngắngọnhơnnhngvẫngiữđợctấtcảcáckhảnăngnhtrong
point3.cpp
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
3.6
3.6
3.6
3.6
/*point4.cpp*/
/*point4.cpp*/
/*point4.cpp*/
/*point4.cpp*/
#include<iostream.h>
#include<conio.h>
classpoint
{
intx,y;
Ng«nng÷C++
-60-
public:
voidinit(int=0,int=0);
voiddisplay(char
*=””);
};
voidpoint::int(intabs,intord)
{
x=abs;
y=ord;
}
voidpoint::display(char*mesg)
{
cout<<mesg;
display();
}
voidmain()
{
clrscr();
point
a;
a.init();
/*a.init(0,0)*/
a.display();
/*a.display(
“”
);*/
point
b;
b.init(5);
/*b.init(5,0)*/
b.display("point
b-
");
point
c;
c.init(3,12);
/*c.init(3,12)*/
c.display("Hello ");
getch();
}
Toado:00
pointb-Toado:50
Hello Toado:312
NgônngữC++
-61-
2.2.3
2.2.3
2.2.3
2.2.3
S
S
S
S
ử
ử
ử
ử
d
d
d
d
ụ
ụ
ụ
ụ
ng
ng
ng
ng
đố
đố
đố
đố
i
i
i
i
t
t
t
t
ợ
ợ
ợ
ợ
ng
ng
ng
ng
nh
nh
nh
nh
tham
tham
tham
tham
s
s
s
s
ố
ố
ố
ố
c
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
ởđâyđềcậpđếnkhảnăngmởrộngphạmvilớpđốivớicácđốitợng
họhàng.
2.2.3.1
2.2.3.1
2.2.3.1
2.2.3.1
Truy
Truy
Truy
Truy
nh
nh
nh
nh
ậ
ậ
ậ
ậ
p
p
p
p
đế
đế
đế
đế
n
n
n
n
c
c
c
c
á
á
á
á
c
c
c
c
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
private
private
private
private
trong
trong
trong
trong
đố
đố
đố
đố
i
i
i
i
t
t
t
t
ợ
ợ
ợ
ợ
ng
ng
ng
ng
Hàmthànhphầncóquyềntruynhậpđếncácthànhphầnprivate
private
private
private
của
đốitợnggọinó.Xemđịnhnghĩahàmthànhphầnpoint::init():
voidpoint::int(intabs,intord)
{
x=abs;
y=ord;
}
2.2.3.2
2.2.3.2
2.2.3.2
2.2.3.2
Truy
Truy
Truy
Truy
nh
nh
nh
nh
ậ
ậ
ậ
ậ
p
p
p
p
đế
đế
đế
đế
n
n
n
n
c
c
c
c
á
á
á
á
c
c
c
c
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
private
private
private
private
trong
trong
trong
trong
c
c
c
c
á
á
á
á
c
c
c
c
tham
tham
tham
tham
s
s
s
s
ố
ố
ố
ố
l
l
l
l
à
à
à
à
đố
đố
đố
đố
i
i
i
i
t
t
t
t
ợ
ợ
ợ
ợ
ng
ng
ng
ng
truy
truy
truy
truy
ề
ề
ề
ề
n
n
n
n
cho
cho
cho
cho
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n.
n.
n.
n.
Hàmthànhphầncóquyềntruynhậpđếntấtcảcácthànhphầnprivate
private
private
private
củacácđốitợng,thamchiếuđốitợnghaycontrỏđốitợngcócùngkiểu
lớpkhiđợcdùnglàthamsốhìnhthứccủanó.
classpoint
{
intx,y;
public:
/*Cácđốitợngđợctruyềntheogiátrịcủachúng*/
intcoincide(pointpt)
{return(x==pt.x
&&
y==pt.y);}
/*Cácđốitợngđợctruyềnbằngđịachỉ*/
intcoincide(point*pt)
{return(x==pt->x
&&
y==pt->y);}
/*Cácđốitợngđợctruyềnbằngthamchiếu*/
intcoincide(point&pt)
NgônngữC++
-62-
{return(x==pt.x
&&
y==pt.y);}
}
2.2.3.3
2.2.3.3
2.2.3.3
2.2.3.3
D
D
D
D
ù
ù
ù
ù
ng
ng
ng
ng
đố
đố
đố
đố
i
i
i
i
t
t
t
t
ợ
ợ
ợ
ợ
ng
ng
ng
ng
nh
nh
nh
nh
gi
gi
gi
gi
á
á
á
á
tr
tr
tr
tr
ị
ị
ị
ị
tr
tr
tr
tr
ả
ả
ả
ả
v
v
v
v
ề
ề
ề
ề
c
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
h
h
h
h
à
à
à
à
m
m
m
m
trong
trong
trong
trong
c
c
c
c
ù
ù
ù
ù
ng
ng
ng
ng
l
l
l
l
ớ
ớ
ớ
ớ
p
p
p
p
Hàmthànhphầncóthểtruynhậpđếncácthànhphầnprivate
private
private
private
củacác
đốitợng,contrỏđốitợng,thamchiếuđốitợngđịnhnghĩabêntrongnó.
classpoint
{
intx,y;
public:
pointsymetry()
{
pointres;
res.x=-x;res.y=-y;
returnres;
}
};
2.2.4
2.2.4
2.2.4
2.2.4
Con
Con
Con
Con
tr
tr
tr
tr
ỏ
ỏ
ỏ
ỏ
this
this
this
this
Từkhoáthis
this
this
this
trongđịnhnghĩacủacáchàmthànhphầnlớpdùngđểxác
địnhđịachỉcủađốitợngdùnglàmthamsốngầmđịnhchohàmthànhphần.
Nóicáchkhác,contrỏthis
this
this
this
thamchiếuđếnđốitợngđanggọihàmthành
phần.Nhvậy,cóthểtruynhậpđếncácthànhphầncủađốitợnggọihàm
thànhphầngiántiếpthôngquathis
this
this
this
.Sauđâylàmộtcáchviếtkhácchođịnh
nghĩacủacáchàm
point::coincide()
và
point::display()
:
intpoint::coincide(pointpt)
{return(this->x==pt.x
&&
this->y==pt.y);}
voidpoint::display()
NgônngữC++
-63-
{
cout<<"Diachi
:
"<<this<<"Toa
do
:
"<<x<<""<<y<<"\n";
}
3.
3.
3.
3.
Ph
Ph
Ph
Ph
é
é
é
é
p
p
p
p
g
g
g
g
á
á
á
á
n
n
n
n
c
c
c
c
á
á
á
á
c
c
c
c
đố
đố
đố
đố
i
i
i
i
t
t
t
t
ợ
ợ
ợ
ợ
ng
ng
ng
ng
Cóthểthựchiệnphépgángiữahaiđốitợngcùngkiểu.Chẳnghạn,với
lớppointkhaibáoởtrên:
point
a,b;
a.init(5,2);
b=a;
Vềthựcchấtđólàviệcsaochépgiátrịcácthànhphầndữliệu(x,y)từ
đốitợng
a
sangđốitợng
b
tơngứngtừngđôimột(khôngkểđólàcác
thànhphầnpublic
public
public
public
hayprivate
private
private
private
).
2
y
5
b
a
x
5
2
x
y
NgônngữC++
-64-
Ch
Ch
Ch
Ch
ú
ú
ú
ú
ý
ý
ý
ý
Khicácđốitợngtrongphépgánchứacácthànhphầndữliệuđộng,
việcsaochéplạikhôngliênquanđếncácvùngdữliệuđó(Ngờitanóirằng
đólàsựsaochépbềmặt).Chẳnghạn,nếuhaiđốitơngavàbcùngkiểu,
cócácthànhphầndữliệux,y(tĩnh)vàzlàmộtcontrỏchỉđếnmộtvùng
nhớđợccấpphátđộng.
Phépgán
a=b;
đợcminhhoạnhtrênhìnhvẽ:
Điềunàycóthểítnhiềugâykhókhănchoviệcquảnlýcấpphátđộng.
Thứnhất,vùngnhớđộngtrớcđâytrong
a
(nếucó)bâygiờkhôngthểkiểm
soátđợcnữa.Thứhai,vùngnhớđộngcủa
b
bâygiờsẽđợctruynhậpbởi
cáchàmthànhphầncủacảavàbvànhvậytínhriêngtdữliệucủacác
đốitợngđãbịviphạm.
4.
4.
4.
4.
H
H
H
H
à
à
à
à
m
m
m
m
thi
thi
thi
thi
ế
ế
ế
ế
t
t
t
t
l
l
l
l
ậ
ậ
ậ
ậ
p
p
p
p
(
(
(
(
constructor
constructor
constructor
constructor
)
)
)
)
v
v
v
v
à
à
à
à
h
h
h
h
à
à
à
à
m
m
m
m
hu
hu
hu
hu
ỷ
ỷ
ỷ
ỷ
b
b
b
b
ỏ
ỏ
ỏ
ỏ
(
(
(
(
destructor
destructor
destructor
destructor
)
)
)
)
4.1
4.1
4.1
4.1
H
H
H
H
à
à
à
à
m
m
m
m
thi
thi
thi
thi
ế
ế
ế
ế
t
t
t
t
l
l
l
l
ậ
ậ
ậ
ậ
p
p
p
p
4.1.1
4.1.1
4.1.1
4.1.1
Ch
Ch
Ch
Ch
ứ
ứ
ứ
ứ
c
c
c
c
n
n
n
n
ă
ă
ă
ă
ng
ng
ng
ng
c
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
h
h
h
h
à
à
à
à
m
m
m
m
thi
thi
thi
thi
ế
ế
ế
ế
t
t
t
t
l
l
l
l
ậ
ậ
ậ
ậ
p
p
p
p
Hàmthiếtlậplàmộthàmthànhphầnđặcbiệtkhôngthểthiếuđợc
trongmộtlớp.Nóđợcgọitựđộngmỗikhicómộtđốitợngđợckhaibáo.
Chứcnăngcủahàmthiếtlậplàkhởitạocácgiátrịthànhphầndữliệucủa
đốitợng,xincấpphátbộnhớchocácthànhphầndữliệuđộng.Chơng
trình
point5.cpp
sauđâylàmộtphiênbảnmớicủa
point.cpp
trongđó
thaythếhàmthànhphần
init
bởihàmthiếtlập.
2
y
5
b
a
5
2
vùngdữliệuđộng
z
z
x
y
x