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

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

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 (2.51 MB, 62 trang )

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

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

×