-109-
Ch
Ch
Ch
Ch
ơ
ơ
ơ
ơ
ng
ng
ng
ng
4
4
4
4
đị
đị
đị
đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
a
a
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
tr
tr
tr
tr
ê
ê
ê
ê
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
2.Cáctoántửchuyểnkiểuápdụngchokiểudữliệulớp
1.
1.
1.
1.
Gi
Gi
Gi
Gi
ớ
ớ
ớ
ớ
i
i
i
i
thi
thi
thi
thi
ệ
ệ
ệ
ệ
u
u
u
u
chung
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
.
Đểcóđợcđiềunày,tađịnhnghĩachồngcácphéptoán+,-,*và
/bằngcáchđịnhnghĩahoạtđộngcủatừngphéptoángiốngnhđịnhnghĩa
mộthàm,chỉkháclàđâylàhàmtoántử(operatorfunction).Hàmtoántửcó
tênđợcghépbởitừkhoá
operator
operator
operator
operator
vàkýhiệucủaphéptoántơngứng.
Bảng4.1đaramộtsốvídụvềtênhàmtoántử.
Hàmtoántửcóthểdùngnhlàmộthàmthànhphầncủamộtlớphoặc
làhàmtựdo;khiđóhàmtoántửphảiđợckhaibáolàbạncủacáclớpcó
cácđốitợngmàhàmthaotác.
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-110-
Bảng4.1Mộtsốtênhàmtoántửquenthuộc
2.
2.
2.
2.
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
tr
tr
tr
tr
ê
ê
ê
ê
n
n
n
n
l
l
l
l
ớ
ớ
ớ
ớ
p
p
p
p
s
s
s
s
ố
ố
ố
ố
ph
ph
ph
ph
ứ
ứ
ứ
ứ
c
c
c
c
2.1
2.1
2.1
2.1
H
H
H
H
à
à
à
à
m
m
m
m
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
l
l
l
l
à
à
à
à
h
h
h
h
à
à
à
à
m
m
m
m
th
th
th
th
à
à
à
à
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
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
4.1
4.1
4.1
4.1
/*complex1.cpp*/
/*complex1.cpp*/
/*complex1.cpp*/
/*complex1.cpp*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
classcomplex
{
floatreal,image;
public:
complex(floatr=0,float
i
=0)
{
real
=
r;
image
=
i;
}
voiddisplay()
{
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl
;
}
T
T
T
T
ê
ê
ê
ê
n
n
n
n
h
h
h
h
à
à
à
à
m
m
m
m
D
D
D
D
ù
ù
ù
ù
ng
ng
ng
ng
để
để
để
để
operator
operator
operator
operator
+
địnhnghĩaphép+
operator
operator
operator
operator
*
đị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*/
complexoperator+(complex
b)
{
complex
c;
c.real
=
a.real+b.real;
c.image=a.image+b.image;
return
c;
}
};
voidmain()
{
clrscr();
complexa(-2,5);
complexb(3,4);
cout<<"Hai
so
phuc:\n";
a.display();
b.display();
cout<<"Tonghai
so
phuc:\n";
complex
c;
c=a+b;
//a.operator+(b)
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
ậ
ậ
ậ
ậ
n
n
n
n
x
x
x
x
é
é
é
é
t
t
t
t
7.Thựcracáchviếta+bchỉlàmộtquyớccủachơngtrìnhdịchchophép
ngờisửdụngviếtgọnlại,nhờđócảmthấytựnhiênhơn.
8.Hàmtoántử
operator+
phảicóthuộctínhpublic
public
public
public
vìnếukhôngchơng
trìnhdịchkhôngthểthựchiệnđợcnóởngoàiphạmvilớp.
9.Tronglờigọi
a.operator+(b)
,
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
m
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
l
l
l
l
à
à
à
à
h
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
float
float
float
vàophầnthựccủamộtđốitợng
complex
,đợcbiểuthịbởiphépcộngvớisốthực
float
float
float
float
làtoánhạngthứnhất,
cònđốitợng
complex
làtoánhạngthứhai.Trongtrờnghợpnàykhôngthể
dùngphépcộngnhhàmthànhphầnvìthamsốthứnhấtcủahàmtoántử
khôngcònlàmộtđốitợng.
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
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
ửtrên
l
ớp
-113-
}
voiddisplay()
{
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl
;
}
/*hàmthànhphầnoperator+địnhnghĩaphéptoán+haingôitrênlớpsố
phứccomplex*/
complexoperator+(complex
b)
{
cout<<
Goitoicomplex::operator+(float,complex)\n
;
complex
c;
c.real
=
real+b.real;
c.image=image+b.image;
return
c;
}
/*hàmtựdooperator+địnhnghĩaphéptoán+giữamộtsốthựcvàmộtđối
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<<"Hai
so
phuc:\n";
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-114-
cout<<"a
=
";
a.display();
cout<<"b
=
";
b.display();
cout<<"Tonghai
so
phuc:\n";
complex
c;
c=a+b;
//a.operator+(b);
cout<<"c
=
";
c.display();
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
trìnhdịchsẽthựchiệnlờigọihàmtựdo
operator+(3,a)
.
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-115-
Sốthamsốtronghàmtoántửtựdo
operator+( )
đúngbằngsố
ngôicủaphép+mànóđịnhnghĩa.Trongđịnhnghĩacủahàmtoántửtựdo,
thamsốthứnhấtcóthểcókiểubấtkỳchứkhôngnhấtthiếtphảicókiểulớp
nàođó.
Vớimộthàm
operator+
nàođóchỉcóthểthựchiệnđợcphép+tơng
ứnggiữahaitoánhạngcókiểunhđãđợcmôtảtrongthamsốhìnhthức,
nghĩalàmuốncóđợcphépcộngvạnnăngápdụngchomọikiểutoán
hạngtaphảiđịnhnghĩarấtnhiềuhàmtoántử
operator+
(địnhnghĩa
chồngcáchàmtoántử).
Vấnđềbảotoàncáctínhchấttựnhiêncủacácphéptoánkhôngđợc
C++đềcập,mànóphụthuộcvàocáchcàiđặtcụthểtrongchơngtrìnhdịch
C++hoặcbảnthânngờisửdụngkhiđịnhnghĩacáchàmtoántử.Chẳng
hạn,phépgán:
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
Ý
Ý
Ý
Ý
d
d
d
d
ô
ô
ô
ô
4.3
4.3
4.3
4.3
/*complex3.cpp*/
/*complex3.cpp*/
/*complex3.cpp*/
/*complex3.cpp*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
classcomplex
{
floatreal,image;
public:
complex(floatr=0,float
i
=0)
{
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
x,
complex
b)
{
cout<<"Goitoioperator+(float,complex)\n";
complex
c;
§Þnhngh
Ü
ato¸n
t
ötrªn
l
íp
-117-
c.real
=
x+b.real;
c.image
=
b.image;
return
c;
}
voidmain()
{
clrscr();
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();
complexc(2,3);
cout<<"Conga+b+c\n";
cout<<"sophuc
d
\n";
complex
d;
d=
a+b+c;
cout<<"a
=
";a.display();
cout<<"b
=
";b.display();
cout<<"c
=
";c.display();
cout<<"d
=
a+b+c
:
";
d.display();
getch();
}
sophuca
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-118-
Taodoituong:0xffee
sophucb
Taodoituong:0xffe6
Haisophuc:
a=-2+j*5
b=3+j*4
Taodoituong:0xffde
Conga+b+c
sophucd
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
d
d
d
ụ
ụ
ụ
ụ
4.4
4.4
4.4
4.4
/*complex4.cpp*/
/*complex4.cpp*/
/*complex4.cpp*/
/*complex4.cpp*/
#include<iostream.h>
#include<conio.h>
§Þnhngh
Ü
ato¸n
t
ötrªn
l
íp
-119-
#include<math.h>
classcomplex
{
floatreal,image;
public:
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,
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()
{
§Þnhngh
Ü
ato¸n
t
ötrªn
l
íp
-120-
clrscr();
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:
";
c.display();
cout<<"a
=
";
a.display();
cout<<"Conga+b+c\n";
cout<<"sophuc
d
\n";
complex
d;
d=
a+b+c;
//a.operator+(b);a.operator+(c);
cout<<"a
=
";a.display();
cout<<"b
=
";b.display();
cout<<"c
=
";c.display();
cout<<"d
=
a+b+c
:
";
d.display();
getch();
}
Đị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
b=3+j*4
c=1+j*9
d=a+b+c:5+j*22
Tronghaivídụtrên,việctruyềncácđốisốvàgiátrịtrảvềcủahàm
toántửđợcthựchiệnbằnggiátrị.Vớicácđốitợngcókíchthớclớn,
ngờitathờngdùngthamchiếuđểtruyềnđốichohàm.
complexoperator+(float
,
complex&);
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-122-
Tuynhiênviệcdùngthamchiếunhlàgiátrịtrảvềcủahàmtoántử,có
nhiềuđiềuđángnói.Biểuthứcnằmtronglệnh
return
return
return
return
bắtbuộcphảitham
chiếuđếnmộtvùngnhớtồntạingaycảkhithựchiệnxongbiểuthứctứclà
khihàmtoántửkếtthúcthựchiện.Vùngnhớấycóthểlàmộtbiếnđợccấp
tĩnhstatic
static
static
static
(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
ụ
ụ
ụ
ụ
4.5
4.5
4.5
4.5
/*complex5.cpp*/
/*complex5.cpp*/
/*complex5.cpp*/
/*complex5.cpp*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
classcomplex
{
floatreal,image;
public:
complex(floatr=0,float
i
=0)
{
real
=
r;
image
=
i;
}
voiddisplay()
{
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;
return
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();
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
=
";
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-124-
b.display();
complex
c;
-a;
cout<<"a
=
";a.display();
getch();
}
sophuca
sophucb
Haisophuc:
a=-2+j*5
b=3+j*4
a=2-j*5
Ch
Ch
Ch
Ch
ú
ú
ú
ú
ý
ý
ý
ý
:
:
:
:
Câulệnh
complex
c;
c=-a+b
sẽgâylỗivì-acógiátrịvoid
void
void
void
.
3.
3.
3.
3.
Kh
Kh
Kh
Kh
ả
ả
ả
ả
n
n
n
n
ă
ă
ă
ă
ng
ng
ng
ng
v
v
v
v
à
à
à
à
gi
gi
gi
gi
ớ
ớ
ớ
ớ
i
i
i
i
h
h
h
h
ạ
ạ
ạ
ạ
n
n
n
n
c
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
đị
đị
đị
đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
a
a
ch
ch
ch
ch
ồ
ồ
ồ
ồ
ng
ng
ng
ng
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
Ph
Ph
Ph
Ph
ầ
ầ
ầ
ầ
n
n
n
n
l
l
l
l
ớ
ớ
ớ
ớ
n
n
n
n
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
trong
trong
trong
trong
C++
C++
C++
C++
đề
đề
đề
đề
u
u
u
u
c
c
c
c
ó
ó
ó
ó
th
th
th
th
ể
ể
ể
ể
đị
đị
đị
đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
a
a
ch
ch
ch
ch
ồ
ồ
ồ
ồ
ng
ng
ng
ng
Kýhiệuđứngsautừkhoá
operator
operator
operator
operator
phảilàmộttrongsốcáckýhiệutoán
tửápdụngchocáckiểudữliệucơsở,khôngthểdùngcáckýhiệumới.Một
sốtoántửkhôngthểđịnhnghĩachồng(chẳnghạntoántửtruynhậpthành
phầncấutrúc.,toántửphạmvi::,toántửđiềukiện?:)vàcómộtsố
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.
Khiđịnhnghĩachồngtoántử,phảituântheonguyêntắclà
M
M
M
M
ộ
ộ
ộ
ộ
t
t
t
t
trong
trong
trong
trong
s
s
s
s
ố
ố
ố
ố
c
c
c
c
á
á
á
á
c
c
c
c
to
to
to
to
á
á
á
á
n
n
n
n
h
h
h
h
ạ
ạ
ạ
ạ
ng
ng
ng
ng
ph
ph
ph
ph
ả
ả
ả
ả
i
i
i
i
l
l
l
l
à
à
à
à
đố
đố
đố
đố
i
i
i
i
t
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
làmộtđốitợng
complex
nàođó.
Cầnluýrằngkhôngnênđịnhnghĩanhữnghàmhàmtoántửkhácnhau
cùnglàmnhữngcôngviệcgiốngnhauvìdễxảyranhậpnhằng.Chẳnghạn,
đãcómộthàm
operator
+làmộthàmthànhphầncóthamsốlàđốitợng
complex
thìkhôngđợcđịnhnghĩathêmmộthàm
operator
+làmộthàm
tựdocóhaithamsốlàđốitợng
complex
.
Tr
Tr
Tr
Tr
ờ
ờ
ờ
ờ
ng
ng
ng
ng
h
h
h
h
ợ
ợ
ợ
ợ
p
p
p
p
c
c
c
c
á
á
á
á
c
c
c
c
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
++
++
++
++
v
v
v
v
à
à
à
à
Địnhngh
ĩ
atoá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
ạ
ạ
ạ
ạ
ng
ng
ng
ng
ti
ti
ti
ti
ề
ề
ề
ề
n
n
n
n
t
t
t
t
ố
ố
ố
ố
H
H
H
H
à
à
à
à
m
m
m
m
cho
cho
cho
cho
d
d
d
d
ạ
ạ
ạ
ạ
ng
ng
ng
ng
h
h
h
h
ậ
ậ
ậ
ậ
u
u
u
u
t
t
t
t
ố
ố
ố
ố
operator
operator
operator
operator
++()
++()
++()
++()
operator
operator
operator
operator
()
()
()
()
operator
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
ự
ự
ự
ự
a
a
a
a
ch
ch
ch
ch
ọ
ọ
ọ
ọ
n
n
n
n
gi
gi
gi
gi
ữ
ữ
ữ
ữ
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
v
v
v
v
à
à
à
à
h
h
h
h
à
à
à
à
m
m
m
m
b
b
b
b
ạ
ạ
ạ
ạ
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
l
l
l
ợ
ợ
ợ
ợ
c
c
c
c
s
s
s
s
ử
ử
ử
ử
d
d
d
d
ụ
ụ
ụ
ụ
ng
ng
ng
ng
h
h
h
h
à
à
à
à
m
m
m
m
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
Vềnguyêntắc,địnhnghĩachồngmộtphéptoánlàkháđơngiản,nhng
việcsửdụngphéptoánđịnhnghĩachồnglạikhôngphảidễdàngvàđòihỏi
phảicânnhắcbởilẽnếubịlạmdụngsẽlàmchochơngtrìnhkhóhiểu.
Phảilàmsaođểcácphéptoánvẫngiữđợcýnghĩatrựcquannguyên
thuỷcủachúng.Chẳnghạnkhôngthểđịnhnghĩacộng+nhphéptrừ-
haigiátrị.Phảixácđịnhtrớcýnghĩacácphéptoántrớckhiviếtđịnh
nghĩacủacáchàmtoántửtơngứng.
C
C
C
C
á
á
á
á
c
c
c
c
ph
ph
ph
ph
é
é
é
é
p
p
p
p
to
to
to
to
á
á
á
á
n
n
n
n
m
m
m
m
ộ
ộ
ộ
ộ
t
t
t
t
ng
ng
ng
ng
ô
ô
ô
ô
i
i
i
i
Cácphéptoánmộtngôilà:
*,&,~,!,
++, ,
sizeof
sizeof
sizeof
sizeof
(kiểu)
Cáchàmtoántửtơngứngchỉcómộtđốisốvàphảitrảvềgiátrịcùng
kiểuvớitoánhạng,riêng
sizeof
sizeof
sizeof
sizeof
cógiátrịtrảvềkiểunguyênkhôngdấuvà
toántử(kiểu)dùngđểtrảvềmộtgiátrịcókiểunhđãghitrongdấungoặc.
C
C
C
C
á
á
á
á
c
c
c
c
ph
ph
ph
ph
é
é
é
é
p
p
p
p
to
to
to
to
á
á
á
á
n
n
n
n
hai
hai
hai
hai
ng
ng
ng
ng
ô
ô
ô
ô
i
i
i
i
Cácphéptoánhaingôinh:
*,/,%,+,-,<<,>>,<,>,<=,>=,==,!=,&,|,^,&&,||
Haitoánhạngthamgiacácphéptoánkhôngnhấtthiếtphảicùngkiểu,
mặcdùtrongthựctếsửdụngthìthờnglànhvậy.Nhvậychỉcầnmột
tronghaiđốisốcủahàmtoántửtơngứnglàđốitợnglàđủ.
C
C
C
C
á
á
á
á
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ó:
=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=
Địnhngh
ĩ
atoán
t
ửtrên
l
ớp
-128-
Docáctoántửgánđợcđịnhnghĩadớidạnghàmthànhphần,nênchỉ
cómộtthamsốtờngminhvàkhôngcóràngbuộcgìvềkiểuđốisốvàkiểu
giátrịtrảvềcủacácphépgán.
To
To
To
To
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
truy
truy
truy
truy
nh
nh
nh
nh
ậ
ậ
ậ
ậ
p
p
p
p
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
->
->
->
->
Phéptoánnàyđợcdùngđểtruyxuấtcácthànhphầncủamộtcấutrúc
haymộtlớpvàcầnphânbiệtvớinhữngcáchsửdụngkhácđểtránhdẫnđến
sựnhầmlẫn.Cóthểđịnhnghĩaphéptoánlấythànhphầngiốngnhđốivới
cácphéptoánmộtngôi.
To
To
To
To
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
truy
truy
truy
truy
nh
nh
nh
nh
ậ
ậ
ậ
ậ
p
p
p
p
th
th
th
th
à
à
à
à
nh
nh
nh
nh
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
theo
theo
theo
theo
ch
ch
ch
ch
ỉ
ỉ
ỉ
ỉ
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
t
t
t
t
ử
ử
ử
ử
g
g
g
g
ọ
ọ
ọ
ọ
i
i
i
i
h
h
h
h
à
à
à
à
m
m
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
v
v
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
ti
ti
ti
ti
ê
ê
ê
ê
u
u
u
u
bi
bi
bi
bi
ể
ể
ể
ể
u
u
u
u
5.1
5.1
5.1
5.1
Đị
Đị
Đị
Đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
a
a
ch
ch
ch
ch
ồ
ồ
ồ
ồ
ng
ng
ng
ng
ph
ph
ph
ph
é
é
é
é
p
p
p
p
g
g
g
g
á
á
á
á
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
-129-
dođó
b
đợctruyềnchohàmdớidạngthamtrịhoặcthamchiếu.Việc
truyềnbằngthamtrịđòihỏisựcómặtcủahàmthiếtlậpsaochép,hơnthế
nữasẽlàmchochơngtrìnhchạychậmvìmấtthờigiansaochépmộtlợng
lớndữliệu.Vìvậy,
b
sẽđợctruyềnchohàmoperator=dớidạngtham
chiếu.
Giátrịtrảvềcủahàmoperator=phụthuộcvàomụcđíchsửdụng
củabiểuthứcgán.Chúngtachọngiảipháptrảvềthamchiếucủađốitợng
đứngbêntráidấubằngnhằmgiữhaitínhchấtquantrongcủabiểuthứcgán:
(i)trậttựkếthợptừbênphảisangtrái,(ii)cóthểsửdụngkếtquảbiểuthức
gántrongcácbiểuthứckhác.Ngoàiragiảiphápnàycũnghạnchếviệcsao
chépdữliệutừnơinàyđinơikháctrongbộnhớ.
Chúngtaphânbiệthaitrờnghợp:
Tr
Tr
Tr
Tr
ờ
ờ
ờ
ờ
ng
ng
ng
ng
h
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
h
h
h
h
ợ
ợ
ợ
ợ
p
p
p
p
2
2
2
2
a=b;
khihaiđốitợngthamgiabiểuthứcgánhoàntoànkhácnhau,việcđầu
tiênlàphảigiảiphóngvùngnhớđộngchiếmgiữtrớcđótronga,trớckhi
xincấpphátmộtvùngnhớđộngkhácbằngkíchthớcvùngnhớđộngcó
trongb,cuốicùngsaochépnộidungtừvùngnhớđộngtrongbsanga.Và
khôngquênsaochépgiátrịcủacácthànhphầnkhôngđộngcònlại.
Taxétchơngtrìnhminhhoạ.
V
V
V
V
í
í
í
í
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
l
íp
-130-
public:
vector();
//hµmthiÕtlËpkh«ngthamsè
vector(intsize);
//hµmthiÕtlËp1thamsè
vector(intsize,float*a);
vector(vector&);
vector
&
operator=(vector
&
b);
~vector();
voiddisplay();
};
vector::vector()
{
int
i;
cout<<"Taodoituongtai"<<this<<endl;
cout<<"Sochieu:";cin>>n;
v=
newfloat[n];
cout<<"Xincapphatvung
bo
nho"<<n<<"
so
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;
v=
newfloat[n];
cout<<"Xincapphatvung
bo
nho"<<n<<"
so
thuc
tai"<<v<<endl;
for(i=0;i<n;i++)
{
cout<<"Toa
do
thu"<<i+1<<"
:
";
cin>>v[i];
}
}
vector::vector(intsize,float
*a
){
int
i;
cout<<"Sudunghamthietlap
2
thamso\n";
cout<<"Taodoituongtai"<<this<<endl;
n=size;
cout<<"Sochieu:"<<n<<endl;
v=
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
t
ửtrên
l
ớp
-132-
v[i]
=
b.v[i];
}
vector::~vector()
{
cout<<"Giaiphong"<<v<<"cuadoituongtai"<<this<<endl;
delete
v;
}
vector
&
vector::operator=(vector
&
b)
{
cout<<"Goioperator=()cho"<<this<<"
va
"<<&b<<endl;
if
(this!=&b){
/*xoávùngnhớđộngđãcótrongđốitợngvếtrái*/
cout<<"xoavungnhodong"<<v<<"trong"<<this<<endl;
delete
v;
/*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-
}
voidmain()
{
clrscr();
vectors1;
//gọihàmthiếtlậpkhôngthamsố
s1.display();
vector
s2
=
s1;
//gọihàmthiếtlậpsaochép
s2.display();
vectors3(0);
s3=s1;
//gọihàmtoántửvector::operator=( )
s1=s1;
getch();
}
Taodoituongtai0xfff2
Sochieu:3
Xincapphatvungbonho3sothuctai0x148c
Toadothu1:2
Toadothu2:3
Toadothu3:2
Doituongtai:0xfff2
Sochieu:3
232
Sudunghamthietlapsaochep
Taodoituongtai0xffee
Xincapphatvungbonho3sothuctai0x149c
Doituongtai:0xffee
Sochieu:3
232
Sudunghamthietlap1thamso