Giáo trình Lập trình hướng đối tượng với C++ - Chương 4: Định nghĩa toán tử trên lớp
Ch-¬ng 4
®Þnh nghÜa to¸n tö trªn líp
(class operators)
Môc ®Ých ch-¬ng nµy :
1. C¸ch ®Þnh nghÜa c¸c phÐp to¸n cho kiÓu d÷ liÖu líp vµ cÊu tróc
2. C¸c to¸n tö chuyÓn kiÓu ¸p dông cho kiÓu d÷ liÖu líp
1. Giíi thiÖu chung
Thùc ra, vÊn ®Ò ®Þnh nghÜa chång to¸n tö ®· tõng cã trong C, vÝ dô trong
biÓu thøc:
a + b
ký hiÖu + tuú theo kiÓu cña a vµ b cã thÓ biÓu thÞ:
3. phÐp céng hai sè nguyªn,
4. phÐp céng hai sè thùc ®é chÝnh x¸c ®¬n (float)
5. phÐp céng hai sè thùc chÝnh x¸c ®«i (double)
6. phÐp céng mét sè nguyªn vµo mét con trá.
Trong C++, cã thÓ ®Þnh nghÜa chång ®èi víi hÇu hÕt c¸c phÐp to¸n (mét
ng«i hoÆc hai ng«i) trªn c¸c líp, nghÜa lµ mét trong sè c¸c to¸n h¹ng tham
gia phÐp to¸n lµ c¸c ®èi t-îng. §©y lµ mét kh¶ n¨ng m¹nh v× nã cho phÐp
x©y dùng trªn c¸c líp c¸c to¸n tö cÇn thiÕt, lµm cho ch-¬ng tr×nh ®-îc viÕt
ng¾n gän dÔ ®äc h¬n vµ cã ý nghÜa h¬n. Ch¼ng h¹n, khi ®Þnh nghÜa mét líp
complex ®Ó biÓu diÔn c¸c sè phøc, cã thÓ viÕt trong C++: a+b, a-b,
a*b, a/b víi a,b lµ c¸c ®èi t-îng complex.
§Ó cã ®-îc ®iÒu nµy, ta ®Þnh nghÜa chång c¸c phÐp to¸n +, -, * vµ
/ b»ng c¸ch ®Þnh nghÜa ho¹t ®éng cña tõng phÐp to¸n gièng nh- ®Þnh nghÜa
mét hµm, chØ kh¸c lµ ®©y lµ hµm to¸n tö (operator function). Hµm to¸n tö cã
tªn ®-îc ghÐp bëi tõ kho¸ operator vµ ký hiÖu cña phÐp to¸n t-¬ng øng.
B¶ng 4.1 ®-a ra mét sè vÝ dô vÒ tªn hµm to¸n tö.
Hµm to¸n tö cã thÓ dïng nh- lµ mét hµm thµnh phÇn cña mét líp hoÆc
lµ hµm tù do; khi ®ã hµm to¸n tö ph¶i ®-îc khai b¸o lµ b¹n cña c¸c líp cã
c¸c ®èi t-îng mµ hµm thao t¸c.
-109-
§Þnh nghÜa to¸n tö trªn líp
Tªn hµm
operator+
operator*
operator/
operator+=
operator!=
Dïng ®Ó
®Þnh nghÜa phÐp +
®Þnh nghÜa phÐp nh©n *
®Þnh nghÜa phÐp chia /
®Þnh nghÜa phÐp tù céng +=
®Þnh nghÜa phÐp so s¸nh kh¸c
nhau
B¶ng 4.1 Mét sè tªn hµm to¸n tö quen thuéc
2. VÝ dô trªn líp sè phøc
2.1 Hµm to¸n tö lµ hµm thµnh phÇn
Trong ch-¬ng tr×nh complex1.cpp to¸n tö + gi÷a hai ®èi t-îng
complex ®-îc ®Þnh nghÜa nh- mét hµm thµnh phÇn. Hµm to¸n tö thµnh phÇn
cã mét tham sè ngÇm ®Þnh lµ ®èi t-îng gäi hµm nªn chØ cã mét tham sè
t-êng minh.
VÝ dô 4.1
/*complex1.cpp*/
#include <iostream.h>
#include <conio.h>
#include <math.h>
class complex {
float real, image;
public:
complex(float r=0, float i =0) {
real = r; image = i;
}
void display() {
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl ;
}
-110-
§Þnh nghÜa to¸n tö trªn líp
/*hµm operator+ ®Þnh nghÜa phÐp to¸n + hai ng«i trªn líp sè phøc
complex*/
complex operator+(complex b) {
complex c;
c.real = a.real+b.real;
c.image =a.image+b.image;
return c;
}
};
void main() {
clrscr();
complex a(-2,5);
complex b(3,4);
cout<<"Hai so phuc:\n";
a.display();
b.display();
cout<<"Tong hai so phuc:\n";
complex c;
c=a+b;//a.operator+(b)
c.display();
getch();
}
Hai so phuc:
-2+j*5
3+j*4
Tong hai so phuc:
1+j*9
ChØ thÞ
-111-
§Þnh nghÜa to¸n tö trªn líp
c =a+b;
trong vÝ dô trªn ®-îc ch-¬ng tr×nh dÞch hiÓu lµ:
c =a.operator+(b);
NhËn xÐt
7. Thùc ra c¸ch viÕt a+b chØ lµ mét quy -íc cña ch-¬ng tr×nh dÞch cho phÐp
ng-êi sö dông viÕt gän l¹i, nhê ®ã c¶m thÊy tù nhiªn h¬n.
8. Hµm to¸n tö operator+ ph¶i cã thuéc tÝnh public v× nÕu kh«ng ch-¬ng
tr×nh dÞch kh«ng thÓ thùc hiÖn ®-îc nã ë ngoµi ph¹m vi líp.
9. Trong lêi gäi a.operator+(b), a ®ãng vai trß cña tham sè ngÇm ®Þnh cña
hµm thµnh phÇn vµ b lµ tham sè t-êng minh. Sè tham sè t-êng minh
cho hµm to¸n tö thµnh phÇn lu«n Ýt h¬n sè ng«i cña phÐp to¸n lµ 1
v× cã mét tham sè ngÇm ®Þnh lµ ®èi t-îng gäi hµm to¸n tö.
10. Ch-¬ng tr×nh dÞch sÏ kh«ng thÓ hiÓu ®-îc biÓu thøc 3+a v× c¸ch viÕt
t-¬ng øng 3.operator(a) kh«ng cã ý nghÜa. §Ó gi¶i quyÕt t×nh huèng
nµy ta dïng hµm b¹n ®Ó ®Þnh nghÜa hµm to¸n tö.
2.2 Hµm to¸n tö lµ hµm b¹n
Ch-¬ng tr×nh complex2.cpp ®-îc ph¸t triÓn tõ complex1.cpp b»ng c¸ch thªm
hµm to¸n tö céng thªm mét sè thùc float vµo phÇn thùc cña mét ®èi t-îng
complex, ®-îc biÓu thÞ bëi phÐp céng víi sè thùc float lµ to¸n h¹ng thø nhÊt,
cßn ®èi t-îng complex lµ to¸n h¹ng thø hai. Trong tr-êng hîp nµy kh«ng thÓ
dïng phÐp céng nh- hµm thµnh phÇn v× tham sè thø nhÊt cña hµm to¸n tö
kh«ng cßn lµ mét ®èi t-îng.
VÝ dô 4.2
/*complex2.cpp*/
#include <iostream.h>
#include <conio.h>
#include <math.h>
class complex {
float real, image;
public:
complex(float r=0, float i =0) {
real = r; image = i;
-112-
§Þnh nghÜa to¸n tö trªn líp
}
void display() {
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl ;
}
/*hµm thµnh phÇn operator+ ®Þnh nghÜa phÐp to¸n + hai ng«i trªn líp sè
phøc complex*/
complex operator+(complex b) {
cout<<”Goi toi complex::operator+(float, complex)\n”;
complex c;
c.real = real+b.real;
c.image =image+b.image;
return c;
}
/*hµm tù do operator+ ®Þnh nghÜa phÐp to¸n + gi÷a mét sè thùc vµ mét ®èi
t-îng sè phøc*/
friend complex operator+(float x, complex b);
};
complex operator+(float x, complex b) {
cout<<”Goi toi operator+(float, complex)\n”;
complex c;
c.real = x+b.real;
c.image = b.image;
return c;
}
void main() {
clrscr();
complex a(-2,5);
complex b(3,4);
cout<<"Hai so phuc:\n";
-113-
§Þnh nghÜa to¸n tö trªn líp
cout<<"a = ";
a.display();
cout<<"b = ";
b.display();
cout<<"Tong hai so phuc:\n";
complex c;
c=a+b; //a.operator+(b);
cout<<"c = ";
c.display();
cout<<"Tang them phan thuc cua a 3 don vi\n";
complex d;
d=3+a; //operator+(3,a);
cout<<"d = ";
d.display();
getch();
}
Hai so phuc:
a = -2+j*5
b = 3+j*4
Tong hai so phuc:
Goi toi complex::operator+(complex)
c = 1+j*9
Tang them phan thuc cua a 3 don vi
Goi toi operator+(float, complex)
d = 1+j*5
Trong ch-¬ng tr×nh trªn, biÓu thøc a+b ®-îc ch-¬ng tr×nh hiÓu lµ lêi gäi
hµm thµnh phÇn a.operator+(b), trong khi ®ã víi biÓu thøc 3+a, ch-¬ng
tr×nh dÞch sÏ thùc hiÖn lêi gäi hµm tù do operator+(3,a).
-114-
§Þnh nghÜa to¸n tö trªn líp
Sè tham sè trong hµm to¸n tö tù do operator+(...) ®óng b»ng sè
ng«i cña phÐp + mµ nã ®Þnh nghÜa. Trong ®Þnh nghÜa cña hµm to¸n tö tù do,
tham sè thø nhÊt cã thÓ cã kiÓu bÊt kú chø kh«ng nhÊt thiÕt ph¶i cã kiÓu líp
nµo ®ã.
Víi mét hµm operator+ nµo ®ã chØ cã thÓ thùc hiÖn ®-îc phÐp + t-¬ng
øng gi÷a hai to¸n h¹ng cã kiÓu nh- ®· ®-îc m« t¶ trong tham sè h×nh thøc,
nghÜa lµ muèn cã ®-îc phÐp céng “v¹n n¨ng” ¸p dông cho mäi kiÓu to¸n
h¹ng ta ph¶i ®Þnh nghÜa rÊt nhiÒu hµm to¸n tö operator+ (®Þnh nghÜa
chång c¸c hµm to¸n tö).
VÊn ®Ò b¶o toµn c¸c tÝnh chÊt tù nhiªn cña c¸c phÐp to¸n kh«ng ®-îc
C++ ®Ò cËp, mµ nã phô thuéc vµo c¸ch cµi ®Æt cô thÓ trong ch-¬ng tr×nh dÞch
C++ hoÆc b¶n th©n ng-êi sö dông khi ®Þnh nghÜa c¸c hµm to¸n tö. Ch¼ng
h¹n, phÐp g¸n:
c = a+b;
®-îc ch-¬ng tr×nh dÞch hiÓu nh- lµ: c = a.operator+(b); trong khi
®ã víi phÐp g¸n:
d = a+b+c;
ng«n ng÷ C++ kh«ng ®-a ra diÔn gi¶i nghÜa duy nhÊt. Mét sè ch-¬ng
tr×nh biªn dÞch sÏ t¹o ra ®èi t-îng trung gian t:
t=a.operator+(b);
vµ
d=t.operator+(c);
Ch-¬ng tr×nh complex3.cpp sau ®©y minh ho¹ lý gi¶i nµy:
-115-
§Þnh nghÜa to¸n tö trªn líp
VÝ dô 4.3
/*complex3.cpp*/
#include <iostream.h>
#include <conio.h>
#include <math.h>
class complex {
float real, image;
public:
complex(float r=0, float i =0) {
cout<<"Tao doi tuong :"<<this<<endl;
real = r; image = i;
}
void display() {
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl ;
}
complex operator+(complex b) {
cout<<"Goi toi complex::operator+(complex)\n";
cout<<this<<endl;
complex c;
c.real=real+b.real;
c.image=image+b.image;
return c;
}
friend complex operator+(float x, complex b);
};
complex operator+(float x, complex b) {
cout<<"Goi toi operator+(float, complex)\n";
complex c;
-116-
§Þnh nghÜa to¸n tö trªn líp
c.real = x+b.real;
c.image = b.image;
return c;
}
void main() {
clrscr();
cout<<"so phuc a \n";
complex a(-2,5);
cout<<"so phuc b \n";
complex b(3,4);
cout<<"Hai so phuc:\n";
cout<<"a = ";
a.display();
cout<<"b = ";
b.display();
complex c(2,3);
cout<<"Cong a+b+c\n";
cout<<"so phuc 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();
}
so phuc a
-117-
§Þnh nghÜa to¸n tö trªn líp
Tao doi tuong :0xffee
so phuc b
Tao doi tuong :0xffe6
Hai so phuc:
a = -2+j*5
b = 3+j*4
Tao doi tuong :0xffde
Cong a+b+c
so phuc d
Tao doi tuong :0xffd6
Goi toi complex::operator+(complex)
0xffee
Tao doi tuong :0xffa0
Goi toi complex::operator+(complex)
0xffce
Tao doi tuong :0xffa8
a = -2+j*5
b = 3+j*4
c = 2+j*3
d = a+b+c : 3+j*12
Còng cã thÓ lµm nh- sau: trong ®Þnh nghÜa cña hµm to¸n tö, ta tr¶ vÒ
tham chiÕu ®Õn mét trong hai ®èi t-îng tham gia biÓu thøc (ch¼ng h¹n a).
Khi ®ã a+b+c ®-îc hiÓu lµ a.operator+(b) vµ sau ®ã lµ
a.operator+(c). TÊt nhiªn trong tr-êng hîp nµy néi dung cña ®èi t-îng a
bÞ thay ®æi sau mçi phÐp céng. XÐt ch-¬ng tr×nh sau:
VÝ dô 4.4
/*complex4.cpp*/
#include <iostream.h>
#include <conio.h>
-118-
§Þnh nghÜa to¸n tö trªn líp
#include <math.h>
class complex {
float real, image;
public:
complex(float r=0, float i =0) {
cout<<"Tao doi tuong :"<<this<<endl;
real = r; image = i;
}
void display() {
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl ;
}
complex & operator+(complex b) {
cout<<"Goi toi complex::operator+(complex)\n";
cout<<this<<endl;
real+=b.real;
image+=b.image;
return *this;
}
friend complex operator+(float x, complex b);
};
complex operator+(float x, complex b) {
cout<<"Goi toi operator+(float, complex)\n";
complex c;
c.real = x+b.real;
c.image = b.image;
return c;
}
void main() {
-119-
§Þnh nghÜa to¸n tö trªn líp
clrscr();
cout<<"so phuc a \n";
complex a(-2,5);
cout<<"so phuc b \n";
complex b(3,4);
cout<<"Hai so phuc:\n";
cout<<"a = ";
a.display();
cout<<"b = ";
b.display();
cout<<"so phuc c \n";
complex c;
c=a+b; //a.operator+(b);
cout<<"c = a+b: ";
c.display();
cout<<"a = ";
a.display();
cout<<"Cong a+b+c\n";
cout<<"so phuc 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();
}
-120-
§Þnh nghÜa to¸n tö trªn líp
so phuc a
Tao doi tuong :0xffee
so phuc b
Tao doi tuong :0xffe6
Hai so phuc:
a = -2+j*5
b = 3+j*4
so phuc c
Tao doi tuong :0xffde
Goi toi complex::operator+(complex)
0xffee
c = a+b: 1+j*9
a = 1+j*9
Cong a+b+c
so phuc d
Tao doi tuong :0xffd6
Goi toi complex::operator+(complex)
0xffee
Goi toi complex::operator+(complex)
0xffee
a = 5+j*22
b = 3+j*4
c = 1+j*9
d = a+b+c : 5+j*22
Trong hai vÝ dô trªn, viÖc truyÒn c¸c ®èi sè vµ gi¸ trÞ tr¶ vÒ cña hµm
to¸n tö ®-îc thùc hiÖn b»ng gi¸ trÞ. Víi c¸c ®èi t-îng cã kÝch th-íc lín,
ng-êi ta th-êng dïng tham chiÕu ®Ó truyÒn ®èi cho hµm.
complex operator+(float , complex &);
-121-
§Þnh nghÜa to¸n tö trªn líp
Tuy nhiªn viÖc dïng tham chiÕu nh- lµ gi¸ trÞ tr¶ vÒ cña hµm to¸n tö, cã
nhiÒu ®iÒu ®¸ng nãi. BiÓu thøc n»m trong lÖnh return b¾t buéc ph¶i tham
chiÕu ®Õn mét vïng nhí tån t¹i ngay c¶ khi thùc hiÖn xong biÓu thøc tøc lµ
khi hµm to¸n tö kÕt thóc thùc hiÖn. Vïng nhí Êy cã thÓ lµ mét biÕn ®-îc cÊp
tÜnh static (c¸c biÕn toµn côc hay biÕn côc bé static), mét biÕn thÓ hiÖn
(mét thµnh phÇn d÷ liÖu) cña mét ®èi t-îng nµo ®ã ë ngoµi hµm. B¹n ®äc cã
thÓ xem ch-¬ng tr×nh vecmat3.cpp trong ch-¬ng 3 ®Ó hiÓu râ h¬n. VÊn ®Ò
t-¬ng tù còng ®-îc ®Ò cËp khi gi¸ trÞ tr¶ vÒ cña hµm to¸n tö lµ ®Þa chØ; trong
tr-êng hîp nµy, mét ®èi t-îng ®-îc t¹o ra nhê cÊp ph¸t ®éng trong vïng
nhí heap dïng ®éc lËp víi vïng nhí ng¨n xÕp dïng ®Ó cÊp ph¸t biÕn, ®èi
t-îng côc bé trong ch-¬ng tr×nh, do vËy vÉn cßn l-u l¹i khi hµm to¸n tö kÕt
thóc c«ng viÖc.
Hµm to¸n tö còng cã thÓ tr¶ vÒ kiÓu void khi ¶nh h-ëng chØ t¸c ®éng
lªn mét trong c¸c to¸n h¹ng tham gia biÓu thøc. Xem ®Þnh nghÜa cña hµm
®¶o dÊu sè phøc trong vÝ dô sau:
VÝ dô 4.5
/*complex5.cpp*/
#include <iostream.h>
#include <conio.h>
#include <math.h>
class complex {
float real, image;
public:
complex(float r=0, float i =0) {
real = r; image = i;
}
void display() {
cout<<real<<(image>=0?'+':'-')<<"j*"<<fabs(image)<<endl ;
}
/*Hµm ®¶o dÊu chØ t¸c ®éng lªn to¸n h¹ng, kh«ng sö dông ®-îc trong c¸c
biÓu thøc */
void operator-() {
-122-
§Þnh nghÜa to¸n tö trªn líp
real = -real;
image = -image;
}
complex operator+(complex b) {
complex c;
c.real=real+b.real;
c.image=image+b.image;
return c;
}
friend complex operator+(float x, complex b);
};
complex operator+(float x, complex b) {
cout<<"Goi toi operator+(float, complex)\n";
complex c;
c.real = x+b.real;
c.image = b.image;
return c;
}
void main() {
clrscr();
cout<<"so phuc a \n";
complex a(-2,5);
cout<<"so phuc b \n";
complex b(3,4);
cout<<"Hai so phuc:\n";
cout<<"a = ";
a.display();
cout<<"b = ";
-123-
§Þnh nghÜa to¸n tö trªn líp
b.display();
complex c;
-a;
cout<<"a = ";a.display();
getch();
}
so phuc a
so phuc b
Hai so phuc:
a = -2+j*5
b = 3+j*4
a = 2-j*5
Chó ý:
C©u lÖnh
complex c;
c=-a+b
sÏ g©y lçi v× -a cã gi¸ trÞ void.
3. Kh¶ n¨ng vµ giíi h¹n cña ®Þnh nghÜa chång to¸n
tö
PhÇn lín to¸n tö trong C++ ®Òu cã thÓ ®Þnh nghÜa chång
Ký hiÖu ®øng sau tõ kho¸ operator ph¶i lµ mét trong sè c¸c ký hiÖu to¸n
tö ¸p dông cho c¸c kiÓu d÷ liÖu c¬ së, kh«ng thÓ dïng c¸c ký hiÖu míi. Mét
sè to¸n tö kh«ng thÓ ®Þnh nghÜa chång (ch¼ng h¹n to¸n tö truy nhËp thµnh
phÇn cÊu tróc“.”, to¸n tö ph¹m vi “::”, to¸n tö ®iÒu kiÖn “? :”) vµ cã mét sè
to¸n tö ta ph¶i tu©n theo c¸c rµng buéc sau:
(i) phÐp =, [] nhÊt ®Þnh ph¶i ®-îc ®Þnh nghÜa nh- hµm thµnh phÇn cña
líp.
(ii)phÐp << vµ >> dïng víi cout vµ cin ph¶i ®-îc ®Þnh nghÜa nh- hµm
b¹n.
-124-
§Þnh nghÜa to¸n tö trªn líp
(iii) hai phÐp to¸n ++ vµ -- cã thÓ sö dông theo hai c¸ch kh¸c nhau øng
víi d¹ng tiÒn tè ++a, --b vµ d¹ng hËu tè a++, b--. §iÒu nµy ®ßi hái
hai hµm to¸n tö kh¸c nhau.
C¸c to¸n tö ®-îc ®Þnh nghÜa chång ph¶i b¶o toµn sè ng«i cña chÝnh to¸n
tö ®ã theo c¸ch hiÓu th«ng th-êng, vÝ dô: cã thÓ ®Þnh nghÜa to¸n tö “-” mét
ng«i vµ hai ng«i trªn líp t-¬ng øng víi phÐp ®¶o dÊu (mét ng«i) vµ phÐp trõ
sè häc (hai ng«i), nh-ng kh«ng thÓ ®Þnh nghÜa to¸n tö g¸n mét ng«i, cßn ++
l¹i cho hai ng«i. NÕu lµm vËy, ch-¬ng tr×nh dÞch sÏ hiÓu lµ t¹o ra mét ký
hiÖu phÐp to¸n míi.
Khi ®Þnh nghÜa chång to¸n tö, ph¶i tu©n theo nguyªn t¾c lµ Mét trong sè
c¸c to¸n h¹ng ph¶i lµ ®èi t-îng. Nãi c¸ch kh¸c, hµm to¸n tö ph¶i :
(iv) hoÆc lµ hµm thµnh phÇn, khi ®ã, hµm ®· cã mét tham sè ngÇm ®Þnh
cã kiÓu líp chÝnh lµ ®èi t-îng gäi hµm. Tham sè ngÇm ®Þnh nµy
®ãng vai trß to¸n h¹ng ®Çu tiªn(®èi víi phÐp to¸n hai ng«i) hay to¸n
h¹ng duy nhÊt (®èi víi phÐp to¸n mét ng«i). Do vËy, nÕu to¸n tö lµ
mét ng«i th× hµm to¸n tö thµnh phÇn sÏ kh«ng chøa mét tham sè
nµo kh¸c. Ng-îc l¹i khi to¸n tö lµ hai ng«i, hµm sÏ cã thªm mét ®èi
sè t-êng minh.
(v)hoÆc lµ mét hµm tù do. Trong tr-êng hîp nµy, Ýt nhÊt tham sè thø
nhÊt hoÆc tham sè thø hai (nÕu cã) ph¶i cã kiÓu líp.
H¬n n÷a, mçi hµm to¸n tö chØ cã thÓ ¸p dông víi kiÓu to¸n h¹ng nhÊt
®Þnh; cÇn chó ý r»ng c¸c tÝnh chÊt vèn cã, ch¼ng h¹n tÝnh giao ho¸n cña to¸n
tö kh«ng thÓ ¸p dông mét c¸ch tuú tiÖn cho c¸c to¸n tö ®-îc ®Þnh nghÜa
chång. VÝ dô:
a+3.5
kh¸c víi
3.5+a
ë ®©y a lµ mét ®èi t-îng complex nµo ®ã.
CÇn l-u ý r»ng kh«ng nªn ®Þnh nghÜa nh÷ng hµm hµm to¸n tö kh¸c nhau
cïng lµm nh÷ng c«ng viÖc gièng nhau v× dÔ x¶y ra nhËp nh»ng. Ch¼ng h¹n,
®· cã mét hµm operator+ lµ mét hµm thµnh phÇn cã tham sè lµ ®èi t-îng
complex th× kh«ng ®-îc ®Þnh nghÜa thªm mét hµm operator+ lµ mét hµm
tù do cã hai tham sè lµ ®èi t-îng complex.
Tr-êng hîp c¸c to¸n tö ++ vµ --
-125-
§Þnh nghÜa to¸n tö trªn líp
Hµm cho d¹ng tiÒn tè
operator++()
Hµm cho d¹ng hËu tè
operator++(int)
operator--(int)
operator--()
L-u ý r»ng tham sè int trong d¹ng hËu tè chØ mang ý nghÜa t-îng tr-ng
(dump type)
-126-
§Þnh nghÜa to¸n tö trªn líp
Lùa chän gi÷a hµm thµnh phÇn vµ hµm b¹n
Ph¶i tu©n theo c¸c quy t¾c sau ®©y:
(vi) L-u ý ®Õn h¹n chÕ cña ch-¬ng tr×nh dÞch, xem d¹ng nµo ®-îc phÐp.
NÕu ®èi sè ®Çu tiªn lµ mét ®èi t-îng, cã thÓ mét trong hai d¹ng.
Ng-îc l¹i ph¶i dïng hµm b¹n.
(vii)
(viii)
Tr¸i l¹i, ph¶i dïng hµm b¹n.
4. ChiÕn l-îc sö dông hµm to¸n tö
VÒ nguyªn t¾c, ®Þnh nghÜa chång mét phÐp to¸n lµ kh¸ ®¬n gi¶n, nh-ng
viÖc sö dông phÐp to¸n ®Þnh nghÜa chång l¹i kh«ng ph¶i dÔ dµng vµ ®ßi hái
ph¶i c©n nh¾c bëi lÏ nÕu bÞ l¹m dông sÏ lµm cho ch-¬ng tr×nh khã hiÓu.
Ph¶i lµm sao ®Ó c¸c phÐp to¸n vÉn gi÷ ®-îc ý nghÜa trùc quan nguyªn
thuû cña chóng. Ch¼ng h¹n kh«ng thÓ ®Þnh nghÜa céng “+” nh- phÐp trõ “-”
hai gi¸ trÞ. Ph¶i x¸c ®Þnh tr-íc ý nghÜa c¸c phÐp to¸n tr-íc khi viÕt ®Þnh
nghÜa cña c¸c hµm to¸n tö t-¬ng øng.
C¸c phÐp to¸n mét ng«i
C¸c phÐp to¸n mét ng«i lµ:
*, &, ~, !, ++, --, sizeof (kiÓu)
C¸c hµm to¸n tö t-¬ng øng chØ cã mét ®èi sè vµ ph¶i tr¶ vÒ gi¸ trÞ cïng
kiÓu víi to¸n h¹ng, riªng sizeof cã gi¸ trÞ tr¶ vÒ kiÓu nguyªn kh«ng dÊu vµ
to¸n tö (kiÓu) dïng ®Ó tr¶ vÒ mét gi¸ trÞ cã kiÓu nh- ®· ghi trong dÊu ngoÆc.
C¸c phÐp to¸n hai ng«i
C¸c phÐp to¸n hai ng«i nh-:
*,/,%,+,-,<<,>>,<,>,<=,>=,==,!=,&,|,^,&&,||
Hai to¸n h¹ng tham gia c¸c phÐp to¸n kh«ng nhÊt thiÕt ph¶i cïng kiÓu,
mÆc dï trong thùc tÕ sö dông th× th-êng lµ nh- vËy. Nh- vËy chØ cÇn mét
trong hai ®èi sè cña hµm to¸n tö t-¬ng øng lµ ®èi t-îng lµ ®ñ.
C¸c phÐp g¸n
C¸c to¸n tö g¸n gåm cã:
=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=
-127-
§Þnh nghÜa to¸n tö trªn líp
Do c¸c to¸n tö g¸n ®-îc ®Þnh nghÜa d-íi d¹ng hµm thµnh phÇn, nªn chØ
cã mét tham sè t-êng minh vµ kh«ng cã rµng buéc g× vÒ kiÓu ®èi sè vµ kiÓu
gi¸ trÞ tr¶ vÒ cña c¸c phÐp g¸n.
To¸n tö truy nhËp thµnh phÇn “->”
PhÐp to¸n nµy ®-îc dïng ®Ó truy xuÊt c¸c thµnh phÇn cña mét cÊu tróc
hay mét líp vµ cÇn ph©n biÖt víi nh÷ng c¸ch sö dông kh¸c ®Ó tr¸nh dÉn ®Õn
sù nhÇm lÉn. Cã thÓ ®Þnh nghÜa phÐp to¸n lÊy thµnh phÇn gièng nh- ®èi víi
c¸c phÐp to¸n mét ng«i.
To¸n tö truy nhËp thµnh phÇn theo chØ sè
To¸n tö lÊy thµnh phÇn theo chØ sè ®-îc dïng ®Ó x¸c ®Þnh mét thµnh
phÇn cô thÓ trong mét khèi d÷ liÖu ( cÊp ph¸t ®éng hay tÜnh ). Th«ng th-êng
phÐp to¸n nµy ®-îc dïng víi m¶ng, nh-ng còng cã thÓ ®Þnh nghÜa l¹i nã khi
lµm viÖc víi c¸c kiÓu d÷ liÖu kh¸c. Ch¼ng h¹n víi kiÓu d÷ liÖu vector cã
thÓ ®Þnh nghÜa phÐp lÊy theo chØ sè ®Ó tr¶ vÒ mét thµnh phÇn to¹ ®é nµo ®ã
vector. Vµ ph¶i ®-îc ®Þnh nghÜa nh- hµm thµnh phÇn cã mét ®èi sè t-êng
minh.
To¸n tö gäi hµm
§©y lµ mét phÐp to¸n thó vÞ nh-ng nãi chung rÊt khã ®-a ra mét vÝ dô
cô thÓ.
5. Mét sè vÝ dô tiªu biÓu
§Þnh nghÜa chång phÐp g¸n “ =”
5.1
ViÖc ®Þnh nghÜa chång phÐp g¸n chØ cÇn khi c¸c ®èi t-îng cã c¸c thµnh
phÇn d÷ liÖu ®éng (ch-¬ng 3 ®· ®Ò cËp vÊn ®Ò nµy). Chóng ta xÐt vÊn ®Ò nµy
qua ph©n tÝch ®Þnh nghÜa chång phÐp g¸n “=” ¸p dông cho líp vector.
§iÓm ®Çu tiªn cÇn l-u ý lµ hµm operator= nhÊt thiÕt ph¶i ®-îc ®Þnh
nghÜa nh- lµ hµm thµnh phÇn cña líp vector. Nh- vËy hµm operator=
sÏ chØ cã mét tham sè t-êng minh (to¸n h¹ng bªn ph¶i dÊu =).
Gi¶ sö a vµ b lµ hai ®èi t-îng thuéc líp vector, khi ®ã
a=b;
®-îc hiÓu lµ
a.operator=(b);
-128-
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình hướng đối tượng với C++ - Chương 4: Định nghĩa toán tử trên lớp", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
giao_trinh_lap_trinh_huong_doi_tuong_voi_c_chuong_4_dinh_ngh.pdf

