Tải bản đầy đủ (.pdf) (85 trang)

Giáo trình C++ Đại Học Bách Khoa (phần 5) pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.21 MB, 85 trang )

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

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

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

×