Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 1
ĐA NĂNG HO
ĐA NĂNG HOÁ
ÁTO
TOÁ
ÁN T
N T
CHƯƠNG
CHƯƠNG 4:
4:
(
(OPERATOR OVERLOADING
OPERATOR OVERLOADING)
)
Khoa Công NghThông Tin và Truyn Thông
Đạihc Bách khoa ĐạihcĐàNng
Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 2
N
N
i
idung
dung
Đanăng hoá hàm.
Đanăng hoá toán t.
Giihncađanăng hoá toán t
Chuynđổikiu.
Đanăng hoá toán txut(<<)–nhp (>>)
Đanăng hoá toán t[], toán t()
Khitongmđịnh - Gán ngmđịnh.
Đanăng hoá toán t++ và --
Đanăng hoá new và delete
Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 3
Đa
Đanăng
năng ho
hoá
áh
hà
àm
m
Định nghĩa các hàm cùng tên
Đốisphi khác nhau:
class Time
Time {
//...
long GetTime (void); // sgiây tính tnađêm
void GetTime (int &hours,
int &minutes,
int &seconds);
};
Slượng Kiu
thdùng đốismcđịnh.
void main() {
int h, m, s;
long t = GetTime(); // Gihàm???
GetTime(h, m, s); // Gihàm???
}
Tht
Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 4
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
t
Định nghĩa các phép toán trên đốitượng.
Các phép toán thtái định nghĩa:
,()[]||&&>=<=><!===
>>=<<=
^=|=&=%=/=-=+==
>><<^|&%/*-+
Nh
hng
deletenew
->*->()--++&~!*-+
Đơn
hng
Các phép toán không thtái định nghĩa:
..*::?:sizeof
Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 5
Gi
Gi
i
ih
h
n
nc
c
a
ađa
đanăng
năng ho
hoá
áto
toá
án
nt
t
toán tgi hàm () - mt toán tnhiu ngôi.
Thtựưutiêncamt toán tkhông thểđưc
thay đổibiđanăng hóa.
Tính kếthpcamt toán tkhông thểđưc thay
đổibiđanăng hóa. Các tham smcđịnh không
thsdng vimt toán tửđanăng hóa.
Không ththay đổiscác toán hng mt toán
tyêu cu.
Không ththay đổi ý nghĩacamt toán tlàm
victrêncáckiucósn.
Không thdùng đốismcđịnh.
Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 6
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
t
Khai báo định nghĩa toán tthccht không khác vi
vic khai báo định nghĩanghĩamtloi hàm btk
nào khác
sdng tên hàm "operator@" cho toán t"@"
để overload phép "+", ta dùng tên hàm "operator+"
Slượng tham sti khai báo phthuc hai yếut:
Toán t toán tửđơnhay đôi
Toán tửđưc khai báo hàm toàn cchay phương thc
calp
aa@bb aa.operator@(bb) hocoperator@(aa,bb)
@aa aa.operator@( ) hocoperator@(aa)
aa@ aa.operator@(int) hocoperator@(aa,int)
phương thccalp hàm toàn cc
Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 7
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
t
d: Sdng toán t"+" để cng hai đốitượng
MyNumber trvkếtqu mtMyNumber
Ta có thkhai báo hàm toàn ccsau
const MyNumber operator+(const MyNumber& num1,
const MyNumber& num2);
"x+y" sẽđưchiu "operator+(x,y)"
dùng tkhoá const để đảmbo các toán hng gc không b
thay đổi
Hoc khai báo toán tdướidng thành viên caMyNumber:
const MyNumber operator+(const MyNumber& num);
đốitượng chcaphương thcđượchiulàtoánhng thnhtca
toán t.
"x+y" sẽđưchiu "x.operator+(y)"
MyNumber x(5);
MyNumber y(10);
...
z = x + y;
Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 8
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
t
(
(tt
tt)
)
Bng hàm thành viên:
Khi đanăng a (), [], -> hoc=, hàm đanăng hóa toán tphiđược
khai báo nhưmt thành viên lp
class Point
Point {
public:
Point (int x, int y) { Point::x = x; Point::y = y; }
Point operator + (Point &p) { return Point(x + p.x,y + p.y); }
Point operator - (Point &p) { return Point(x - p.x, y - p.y); }
private:
int x, y;
};
void main() {
Point p1(10,20), p2(10,20);
Point p3 = p1 +p2; Point p4 = p1 -p2;
Point p5 = p3.operator + (p4); Point p6 = p3.operator (p4);
};
1 tham s
(Nếulàtoánthai ngôi)
Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 9
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
t
(
(tt
tt)
)
Toán t hàm toàn cc
Quay livivídvphép cng cho MyNumber, ta
thkhai báo hàm định nghĩa phép cng timc
toàn cc:
const MyNumber operator+(const MyNumber& num1, const MyNumber& num2);
Khi đó, ta thểđnh nghĩa toán tửđónhưsau:
const MyNumber operator+(const MyNumber& num1,const MyNumber& num2) {
MyNumber result(num1.value + num2.value);
return result;
}
Ởđây vnđề….
Gii pháp: dùng hàm friend
friend cho phép mtlpcp quyntruynhpticác
phnnibcalpđóchomtscutrúcđược
chn
Truy nhpcácthànhviênprivate value
Khoa Công Ngh Thông Tin - Đại Hc Bách khoa ĐàNng 10
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
t
(
(tt
tt)
)
Để khai báo mt hàm friend camtlp, ta phi khai báo hàm đó bên trong
khai báo lpvàđặttkhoá friend lên đầu khai báo.
Lưu ý: tuy khai báo ca hàm friend đượcđặt trong khai báo lpvàhàmđócó
quyntruynhp ngang vicácphương thccalp, hàm đókhông phi
phương thccalp
Không cnthêmsađổigìchođịnh nghĩaca hàm đãđược khai báo
friend.
Định nghĩatrướcca phép cng vnginguyên
class MyNumber {
public:
MyNumber(int value = 0);
~MyNumber();
...
friend const MyNumber operator+(const MyNumber& num1,const MyNumber& num2);
...
};
const MyNumber operator+(const MyNumber& num1,const MyNumber& num2) {
MyNumber result(num1.value + num2.value);
return result;
}