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 đủ
pdf 62 trang Thùy Anh 16340 Free
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:

  • pdfgiao_trinh_lap_trinh_huong_doi_tuong_voi_c_chuong_4_dinh_ngh.pdf