-109-
Ch
Ch
Ch
Ch
ơ
ơ
ơ
ơ
ng
ng
ng
ng
4
4
4
4
đị
đị
đị
đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ê
ê
ê
ê
n
n
n
n
l
l
l
l
ớ
ớ
ớ
ớ
p
p
p
p
(class
(class
(class
(class
operators)
operators)
operators)
operators)
Mụcđíchchơngnày:
1.Cáchđịnhnghĩacácphéptoánchokiểudữliệulớpvàcấutrúc
chung
chung
chung
Thựcra,vấnđềđịnhnghĩachồngtoántửđãtừngcótrongC,vídụtrong
biểuthức:
a+b
kýhiệu+tuỳtheokiểucủaavàbcóthểbiểuthị:
3.phépcộnghaisốnguyên,
4.phépcộnghaisốthựcđộchínhxácđơn(float
float
float
float
)
5.phépcộnghaisốthựcchínhxácđôi(
double
double
double
double
)
6.phépcộngmộtsốnguyênvàomộtcontrỏ.
TrongC++,cóthểđịnhnghĩachồngđốivớihầuhếtcácphéptoán(một
ngôihoặchaingôi)trêncáclớp,nghĩalàmộttrongsốcáctoánhạngtham
giaphéptoánlàcácđốitợng.Đâylàmộtkhảnăngmạnhvìnóchophép
xâydựngtrêncáclớpcáctoántửcầnthiết,làmchochơngtrìnhđợcviết
ngắngọndễđọchơnvàcóýnghĩahơn.Chẳnghạn,khiđịnhnghĩamộtlớp
complex
đểbiểudiễncácsốphức,cóthểviếttrongC++:a+b,a-b,
a*b,a/bvớia,blàcácđốitợng
complex
.
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
tr
tr
tr
tr
ê
ê
ê
ê
n
n
n
n
l
l
l
l
ớ
ớ
H
H
H
H
à
à
à
à
m
m
m
m
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
Trongchơngtrình
complex1.cpp
toántử+giữahaiđốitợng
complexđợcđịnhnghĩanhmộthàmthànhphần.Hàmtoántửthànhphần
cómộtthamsốngầmđịnhlàđốitợnggọihàmnênchỉcómộtthamsố
tờngminh.
V
V
V
V
í
í
í
í
image
=
i;
}
voiddisplay()
{
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl
;
}
T
T
T
T
ê
ê
ê
ê
n
n
n
n
h
h
h
h
à
à
à
à
m
địnhnghĩaphépnhân*
operator
operator
operator
operator
/
địnhnghĩaphépchia/
operator
operator
operator
operator
+=
địnhnghĩaphéptựcộng+=
operator
operator
operator
operator
!=
địnhnghĩaphépsosánhkhác
nhau
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-111-
/*hàmoperator+địnhnghĩaphéptoán+haingôitrênlớpsốphức
complex*/
c.display();
getch();
}
Haisophuc:
-2+j*5
3+j*4
Tonghaisophuc:
1+j*9
Chỉthị
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-112-
c
=
a+b;
trongvídụtrênđợcchơngtrìnhdịchhiểulà:
c
=
a.operator+(b);
Nh
Nh
Nh
Nh
ậ
ậ
,
a
đóngvaitròcủathamsốngầmđịnhcủa
hàmthànhphầnvà
b
làthamsốtờngminh.Sốthamsốtờngminh
chohàmtoántửthànhphầnluôníthơnsốngôicủaphéptoánlà1
vìcómộtthamsốngầmđịnhlàđốitợnggọihàmtoántử.
10.Chơngtrìnhdịchsẽkhôngthểhiểuđợcbiểuthức
3+a
vìcáchviết
tơngứng
3.operator(a)
khôngcóýnghĩa.Đểgiảiquyếttìnhhuống
nàytadùnghàmbạnđểđịnhnghĩahàmtoántử.
2.2
2.2
2.2
2.2
H
H
H
H
à
à
à
à
m
m
m
h
h
h
à
à
à
à
m
m
m
m
b
b
b
b
ạ
ạ
ạ
ạ
n
n
n
n
Chơngtrình
complex2.cpp
đợcpháttriểntừ
complex1.cpp
bằngcáchthêm
hàmtoántửcộngthêmmộtsốthực
float
ụ
ụ
4.2
4.2
4.2
4.2
/*complex2.cpp*/
/*complex2.cpp*/
/*complex2.cpp*/
/*complex2.cpp*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
classcomplex
{
floatreal,image;
public:
complex(floatr=0,float
i
=0)
{
real
=
r;
image
=
i;
Địnhngh
ĩ
atoán
tợngsốphức*/
friendcomplexoperator+(float
x,
complexb);
};
complexoperator+(float
x,
complex
b)
{
cout<<
Goitoioperator+(float,complex)\n
;
complex
c;
c.real
=
x+b.real;
c.image
=
b.image;
return
c;
}
voidmain()
{
clrscr();
complexa(-2,5);
complexb(3,4);
cout<<"Tangthemphanthuccua
a3
donvi\n";
complex
d;
d=3+a;
//operator+(3,a);
cout<<"d
=
";
d.display();
getch();
}
Haisophuc:
a=-2+j*5
b=3+j*4
Tonghaisophuc:
Goitoicomplex::operator+(complex)
c=1+j*9
Tangthemphanthuccuaa3donvi
Goitoioperator+(float,complex)
d=1+j*5
Trongchơngtrìnhtrên,biểuthức
a+b
đợcchơngtrìnhhiểulàlờigọi
hàmthànhphần
a.operator+(b),
trongkhiđóvớibiểuthức
3+a,
chơng
c=
a+b;
đợcchơngtrìnhdịchhiểunhlà:
c=
a.operator+(b);
trongkhi
đóvớiphépgán:
d=
a+b+c;
ngônngữC++khôngđaradiễngiảinghĩaduynhất.Mộtsốchơng
trìnhbiêndịchsẽtạorađốitợngtrunggiant:
t=a.operator+(b);
và
d=t.operator+(c);
Chơngtrình
complex3.cpp
sauđâyminhhoạlýgiảinày:
§Þnhngh
Ü
ato¸n
t
ötrªn
l
íp
-116-
V
V
V
V
Ý
cout<<"Taodoituong:"<<this<<endl;
real
=
r;
image
=
i;
}
voiddisplay()
{
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl
;
}
complexoperator+(complex
b)
{
cout<<"Goitoicomplex::operator+(complex)\n";
cout<<this<<endl;
complex
c;
c.real=real+b.real;
c.image=image+b.image;
return
c;
}
friendcomplexoperator+(float
x,
complexb);
};
complexoperator+(float
complexa(-2,5);
cout<<"sophuc
b
\n";
complexb(3,4);
cout<<"Hai
so
phuc:\n";
cout<<"a
=
";
a.display();
cout<<"b
=
";
b.display();
complexc(2,3);
cout<<"Conga+b+c\n";
cout<<"sophuc
d
\n";
complex
d;
d=
a+b+c;
cout<<"a
=
";a.display();
cout<<"b
=
Taodoituong:0xffd6
Goitoicomplex::operator+(complex)
0xffee
Taodoituong:0xffa0
Goitoicomplex::operator+(complex)
0xffce
Taodoituong:0xffa8
a=-2+j*5
b=3+j*4
c=2+j*3
d=a+b+c:3+j*12
Cũngcóthểlàmnhsau:trongđịnhnghĩacủahàmtoántử,tatrảvề
thamchiếuđếnmộttronghaiđốitợngthamgiabiểuthức(chẳnghạna).
Khiđó
a+b+c
đợchiểulà
a.operator+(b)
vàsauđólà
a.operator+(c)
.Tấtnhiêntrongtrờnghợpnàynộidungcủađốitợnga
bịthayđổisaumỗiphépcộng.Xétchơngtrìnhsau:
V
V
V
V
í
í
í
í
d
complex(floatr=0,float
i
=0)
{
cout<<"Taodoituong:"<<this<<endl;
real
=
r;
image
=
i;
}
voiddisplay()
{
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl
;
}
complex
&
operator+(complex
b)
{
cout<<"Goitoicomplex::operator+(complex)\n";
cout<<this<<endl;
real+=b.real;
image+=b.image;
return*this;
}
friendcomplexoperator+(float
x,
cout<<"sophuc
a
\n";
complexa(-2,5);
cout<<"sophuc
b
\n";
complexb(3,4);
cout<<"Hai
so
phuc:\n";
cout<<"a
=
";
a.display();
cout<<"b
=
";
b.display();
cout<<"sophuc
c
\n";
complex
c;
c=a+b;
//a.operator+(b);
cout<<"c
=
a+b:
";
}
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-121-
sophuca
Taodoituong:0xffee
sophucb
Taodoituong:0xffe6
Haisophuc:
a=-2+j*5
b=3+j*4
sophucc
Taodoituong:0xffde
Goitoicomplex::operator+(complex)
0xffee
c=a+b:1+j*9
a=1+j*9
Conga+b+c
sophucd
Taodoituong:0xffd6
Goitoicomplex::operator+(complex)
0xffee
Goitoicomplex::operator+(complex)
0xffee
a=5+j*22
(cácbiếntoàncụchaybiếncụcbộstatic),
static),
static),
static),
mộtbiếnthểhiện
(mộtthànhphầndữliệu)củamộtđốitợngnàođóởngoàihàm.Bạnđọccó
thểxemchơngtrình
vecmat3.cpp
trongchơng3đểhiểurõhơn.Vấnđề
tơngtựcũngđợcđềcậpkhigiátrịtrảvềcủahàmtoántửlàđịachỉ;trong
trờnghợpnày,mộtđốitợngđợctạoranhờcấpphátđộngtrongvùng
nhớheapdùngđộclậpvớivùngnhớngănxếpdùngđểcấpphátbiến,đối
tợngcụcbộtrongchơngtrình,dovậyvẫncònlulạikhihàmtoántửkết
thúccôngviệc.
Hàmtoántửcũngcóthểtrảvềkiểuvoidkhiảnhhởngchỉtácđộng
lênmộttrongcáctoánhạngthamgiabiểuthức.Xemđịnhnghĩacủahàm
đảodấusốphứctrongvídụsau:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
{
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl
;
}
/*Hàmđảodấuchỉtácđộnglêntoánhạng,khôngsửdụngđợctrongcác
biểuthức*/
voidoperator-()
{
§Þnhngh
Ü
ato¸n
t
ötrªn
l
íp
-123-
real
=
-real;
image
=
-image;
}
complexoperator+(complex
b)
{
complex
c;
c.real=real+b.real;
c.image=image+b.image;
complexa(-2,5);
cout<<"sophuc
b
\n";
complexb(3,4);
cout<<"Hai
so
phuc:\n";
cout<<"a
=
";
a.display();
cout<<"b
=
";
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-124-
b.display();
complex
c;
-a;
cout<<"a
=
";a.display();
void
void
.
3.
3.
3.
3.
Kh
Kh
Kh
Kh
ả
ả
ả
ả
n
n
n
n
ă
ă
ă
ă
ng
ng
ng
ng
v
v
v
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
đị
đị
đị
đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
a
ử
ử
ử
Ph
Ph
Ph
Ph
ầ
ầ
ầ
ầ
n
n
n
n
l
l
l
l
ớ
ớ
ớ
ớ
n
n
n
n
to
to
to
u
u
u
c
c
c
c
ó
ó
ó
ó
th
th
th
th
ể
ể
ể
ể
đị
đị
đị
đị
nh
nh
nh
nh
ngh
ngh
ngh
toántửtaphảituântheocácràngbuộcsau:
(i)phép=,[]nhấtđịnhphảiđợcđịnhnghĩanhhàmthànhphầncủa
lớp.
(ii)phép<<và>>dùngvớicout
cout
cout
cout
vàcin
cin
cin
cin
phảiđợcđịnhnghĩanhhàm
bạn.
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-125-
(iii)haiphéptoán++và cóthểsửdụngtheohaicáchkhácnhauứng
vớidạngtiềntố++a, bvàdạnghậutốa++,b Điềunàyđòihỏi
haihàmtoántửkhácnhau.
Cáctoántửđợcđịnhnghĩachồngphảibảotoànsốngôicủachínhtoán
tửđótheocáchhiểuthôngthờng,vídụ:cóthểđịnhnghĩatoántử-một
ngôivàhaingôitrênlớptơngứngvớiphépđảodấu(mộtngôi)vàphéptrừ
sốhọc(haingôi),nhngkhôngthểđịnhnghĩatoántửgánmộtngôi,còn++
lạichohaingôi.Nếulàmvậy,chơngtrìnhdịchsẽhiểulàtạoramộtký
hiệuphéptoánmới.
á
á
á
c
c
c
c
to
to
to
to
á
á
á
á
n
n
n
n
h
h
h
h
ạ
ạ
ạ
ạ
ng
ng
ng
t
t
t
ợ
ợ
ợ
ợ
ng.
ng.
ng.
ng.
Nóicáchkhác,hàmtoántửphải:
(iv)hoặclàhàmthànhphần,khiđó,hàmđãcómộtthamsốngầmđịnh
cókiểulớpchínhlàđốitợnggọihàm.Thamsốngầmđịnhnày
đóngvaitròtoánhạngđầutiên(đốivớiphéptoánhaingôi)haytoán
hạngduynhất(đốivớiphéptoánmộtngôi).Dovậy,nếutoántửlà
mộtngôithìhàmtoántửthànhphầnsẽkhôngchứamộtthamsố
nàokhác.Ngợclạikhitoántửlàhaingôi,hàmsẽcóthêmmộtđối
sốtờngminh.
(v)hoặclàmộthàmtựdo.Trongtrờnghợpnày,ítnhấtthamsốthứ
nhấthoặcthamsốthứhai(nếucó)phảicókiểulớp.
Hơnnữa,mỗihàmtoántửchỉcóthểápdụngvớikiểutoánhạngnhất
định;cầnchúýrằngcáctínhchấtvốncó,chẳnghạntínhgiaohoáncủatoán
tửkhôngthểápdụngmộtcáchtuỳtiệnchocáctoántửđợcđịnhnghĩa
chồng.Vídụ:
a+3.5
khácvới
3.5+a
ởđây
a
h
ợ
ợ
ợ
ợ
p
p
p
p
c
c
c
c
á
á
á
á
c
c
c
c
to
to
to
to
á
á
á
á
n
t
ửtrên
l
ớp
-126-
Luýrằngthamsốinttrongdạnghậutốchỉmangýnghĩatợngtrng
(dumptype)
H
H
H
H
à
à
à
à
m
m
m
m
cho
cho
cho
cho
d
d
d
d
ạ
ạ
ạ
à
à
à
m
m
m
m
cho
cho
cho
cho
d
d
d
d
ạ
ạ
ạ
ạ
ng
ng
ng
ng
h
h
h
h
ậ
ậ
ậ
operator
operator
operator
++(int)
++(int)
++(int)
++(int)
operator
operator
operator
operator
(int)
(int)
(int)
(int)
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-127-
L
L
L
L
ự
ự
ự
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ạ
ạ
ạ
n
n
n
n
Phảituântheocácquytắcsauđây:
(vi)Luýđếnhạnchếcủachơngtrìnhdịch,xemdạngnàođợcphép.
(vii)
Nếuđốisốđầutiênlàmộtđốitợng,cóthểmộttronghaidạng.
Ngợclạiphảidùnghàmbạn.
(viii)Tráilại,phảidùnghàmbạn.
4.
4.
4.
4.
Chi
Chi
Chi
Chi
ế
ế
ế
ế
n
n
n
n
l
ng
h
h
h
h
à
à
à
à
m
m
m
m
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
p
p
p
p
to
to
to
to
á
á
á
á
n
n
n
n
m
m
m
m
ộ
ộ
ộ
ộ
t
t
t
t
ng
ng
á
á
á
á
c
c
c
c
ph
ph
ph
ph
é
é
é
é
p
p
p
p
to
to
to
to
á
á
á
á
n
n
á
c
c
c
c
ph
ph
ph
ph
é
é
é
é
p
p
p
p
g
g
g
g
á
á
á
á
n
n
n
n
Cáctoántửgángồmcó:
ử
ử
truy
truy
truy
truy
nh
nh
nh
nh
ậ
ậ
ậ
ậ
p
p
p
p
th
th
th
th
à
à
à
à
nh
nh
nh
nh
n
n
n
t
t
t
t
ử
ử
ử
ử
truy
truy
truy
truy
nh
nh
nh
nh
ậ
ậ
ậ
ậ
p
p
p
p
th
th
th
ỉ
ỉ
ỉ
s
s
s
s
ố
ố
ố
ố
Toántửlấythànhphầntheochỉsốđợcdùngđểxácđịnhmộtthành
phầncụthểtrongmộtkhốidữliệu(cấpphátđộnghaytĩnh).Thôngthờng
phéptoánnàyđợcdùngvớimảng,nhngcũngcóthểđịnhnghĩalạinókhi
làmviệcvớicáckiểudữliệukhác.Chẳnghạnvớikiểudữliệuvectorcó
thểđịnhnghĩaphéplấytheochỉsốđểtrảvềmộtthànhphầntoạđộnàođó
vector.Vàphảiđợcđịnhnghĩanhhàmthànhphầncómộtđốisốtờng
minh.
To
To
To
To
á
á
á
á
n
n
n
n
m
m
Đâylàmộtphéptoánthúvịnhngnóichungrấtkhóđaramộtvídụ
cụthể.
5.
5.
5.
5.
M
M
M
M
ộ
ộ
ộ
ộ
t
t
t
t
s
s
s
s
ố
ố
ố
ố
v
v
ể
ể
ể
ể
u
u
u
u
5.1
5.1
5.1
5.1
Đị
Đị
Đị
Đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
á
á
á
á
n
n
n
n
=
=
=
=
Việcđịnhnghĩachồngphépgánchỉcầnkhicácđốitợngcócácthành
phầndữliệuđộng(chơng3đãđềcậpvấnđềnày).Chúngtaxétvấnđềnày
quaphântíchđịnhnghĩachồngphépgán=ápdụngcholớpvector.
Điểmđầutiêncầnluýlàhàmoperator=nhấtthiếtphảiđợcđịnh
nghĩanhlàhàmthànhphầncủalớpvector.Nhvậyhàmoperator=
sẽchỉcómộtthamsốtờngminh(toánhạngbênphảidấu=).
Giảsửavàblàhaiđốitợngthuộclớpvector,khiđó
a=b;
đợchiểulà
a.operator=(b);
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
h
h
h
ợ
ợ
ợ
ợ
p
p
p
p
1
1
1
1
a=a;
Vớihaitoánhạnglàmột.Trongtrờnghợpnàyhàmoperator=
khônglàmgì,ngoàiviệctrảvềthamchiếuđếna.
Tr
Tr
Tr
Tr
ờ
ờ
ờ
ờ
ng
ng
ng
ng
í
d
d
d
d
ụ
ụ
ụ
ụ
4.6
4.6
4.6
4.6
/*vector4.cpp*/
/*vector4.cpp*/
/*vector4.cpp*/
/*vector4.cpp*/
#include<iostream.h>
#include<conio.h>
classvector{
int
n;
//sốtoạđộcủavector
float*v;
//contrỏtớivùngnhớtoạđộ
§Þnhngh
Ü
ato¸n
t
ötrªn
thuc
tai"<<v<<endl;
for(i=0;i<n;i++)
{
cout<<"Toa
do
thu"<<i+1<<"
:
";
cin>>v[i];
}
}
vector::vector(intsize)
{
int
i;
cout<<"Sudunghamthietlap
1
thamso\n";
cout<<"Taodoituongtai"<<this<<endl;
n=size;
§Þnhngh
Ü
ato¸n
t
ötrªn
l
íp
-131-
cout<<"Sochieu:"<<size<<endl;
newfloat[n];
cout<<"Xincapphatvung
bo
nho"<<n<<"
so
thuc
tai"<<v<<endl;
for(i=0;i<n;i++)
v[i]
=
a[i];
}
vector::vector(vector&b)
{
int
i;
cout<<"Sudunghamthietlapsaochep\n";
cout<<"Taodoituongtai"<<this<<endl;
v=
newfloat[n=b.n];
cout<<"Xincapphatvung
bo
nho"<<n<<"
so
thuc
tai"<<v<<endl;
for(i=0;i<n;i++)
Địnhngh
ĩ
atoán
/*cấpphátvùngnhớmớicókíchthớcnhtrongb*/
v=newfloat[n=b.n];
cout<<"capphatvungnhodongmoi"<<v<<"trong
"<<this<<endl;
for(inti=0;i<n;i++)v[i]=b.v[i];
}
/*khihaiđốitợnggiốngnhau,khônglàmgì*/
elsecout<<"Haidoituong
la
mot\n";
return*this;
}
voidvector::display()
{
int
i;
cout<<"Doituongtai:"<<this<<endl;
cout<<"Sochieu:"<<n<<endl;
for(i=0;i<n;i++)cout<<v[i]<<"
";
cout<<"\n";
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-133-
}
Doituongtai:0xffee
Sochieu:3
232
Sudunghamthietlap1thamso