
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 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 NghệThông Tin và Truyền Thông
Đạihọc Bách khoa – ĐạihọcĐàNẵng
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 2
N
Nộ
ội
idung
dung
Đanăng hoá hàm.
Đanăng hoá toán tử.
Giớihạncủađanăng hoá toán tử
Chuyểnđổikiểu.
Đanăng hoá toán tửxuất(<<)–nhập (>>)
Đanăng hoá toán tử[], toán tử()
Khởitạongầmđịnh - Gán ngầmđịnh.
Đanăng hoá toán tử++ và --
Đanăng hoá new và delete

Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 3
Đa
Đanăng
năng ho
hoá
áh
hà
àm
m
Định nghĩa các hàm cùng tên
Đốisốphải khác nhau:
class Time
Time {
//...
long GetTime (void); // sốgiây tính từnửađêm
void GetTime (int &hours,
int &minutes,
int &seconds);
};
Sốlượng Kiểu
Có thểdùng đốisốmặcđịnh.
void main() {
int h, m, s;
long t = GetTime(); // Gọihàm???
GetTime(h, m, s); // Gọihàm???
}
Thứtự
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 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 có thểtái định nghĩa:
,()[]||&&>=<=><!===
>>=<<=
^=|=&=%=/=-=+==
>><<^|&%/*-+
Nhị
hạng
deletenew
->*->()--++&~!*-+
Đơn
hạng
Các phép toán không thểtái định nghĩa:
..*::?:sizeof

Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 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 tửgọi hàm () - là một toán tửnhiều ngôi.
Thứtựưutiêncủamột toán tửkhông thểđược
thay đổibởiđanăng hóa.
Tính kếthợpcủamột toán tửkhông thểđược thay
đổibởiđanăng hóa. Các tham sốmặcđịnh không
thểsửdụng vớimột toán tửđanăng hóa.
Không thểthay đổisốcác toán hạng mà một toán
tửyêu cầu.
Không thểthay đổi ý nghĩacủamột toán tửlàm
việctrêncáckiểucósẵn.
Không thểdùng đốisốmặcđịnh.
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 6
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
tử
ử
Khai báo và định nghĩa toán tửthựcchất không khác với
việc khai báo và định nghĩanghĩamộtloại hàm bấtkỳ
nào khác
sửdụng tên hàm là "operator@" cho toán tử"@"
để overload phép "+", ta dùng tên hàm "operator+"
Sốlượng tham sốtại khai báo phụthuộc hai yếutố:
Toán tửlà toán tửđơnhay đôi
Toán tửđược khai báo là hàm toàn cụchay phương thức
củalớp
aa@bb aa.operator@(bb) hoặcoperator@(aa,bb)
@aa aa.operator@( ) hoặcoperator@(aa)
aa@ aa.operator@(int) hoặcoperator@(aa,int)
Là phương thứccủalớpLà hàm toàn cục

Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 7
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
tử
ử
Ví dụ: Sửdụng toán tử"+" để cộng hai đốitượng
MyNumber và trảvềkếtquảlà mộtMyNumber
Ta có thểkhai báo hàm toàn cụcsau
const MyNumber operator+(const MyNumber& num1,
const MyNumber& num2);
"x+y" sẽđượchiểu là "operator+(x,y)"
dùng từkhoá const để đảmbảo các toán hạng gốc không bị
thay đổi
Hoặc khai báo toán tửdướidạng thành viên củaMyNumber:
const MyNumber operator+(const MyNumber& num);
đốitượng chủcủaphương thứcđượchiểulàtoánhạng thứnhấtcủa
toán tử.
"x+y" sẽđượchiểu là "x.operator+(y)"
MyNumber x(5);
MyNumber y(10);
...
z = x + y;
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 8
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
tử
ử(
(tt
tt)
)
Bằng hàm thành viên:
Khi đanăng hóa (), [], -> hoặc=, hàm đanăng hóa toán tửphảiđược
khai báo nhưmột thành viên lớp
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);
};
Có 1 tham số
(Nếulàtoántửhai ngôi)

Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 9
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
tử
ử(
(tt
tt)
)
Toán tửlà hàm toàn cục
Quay lạivớivídụvềphép cộng cho MyNumber, ta
có thểkhai báo hàm định nghĩa phép cộng tạimức
toàn cục:
const MyNumber operator+(const MyNumber& num1, const MyNumber& num2);
Khi đó, ta có 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 có vấnđề….
Giải pháp: dùng hàm friend
friend cho phép mộtlớpcấp quyềntruynhậptớicác
phầnnộibộcủalớpđóchomộtsốcấutrúcđược
chọn
Truy nhậpcácthànhviênprivate value
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 10
Đa
Đanăng
năng ho
hoá
áto
toá
án
nt
tử
ử(
(tt
tt)
)
Để khai báo một hàm là friend củamộtlớp, ta phải khai báo hàm đó bên trong
khai báo lớpvàđặttừkhoá friend lên đầu khai báo.
Lưu ý: tuy khai báo của hàm friend đượcđặt trong khai báo lớpvàhàmđócó
quyềntruynhập ngang vớicácphương thứccủalớp, hàm đókhông phải
phương thứccủalớp
Không cầnthêmsửađổigìchođịnh nghĩacủa hàm đãđược khai báo là
friend.
Định nghĩatrướccủa phép cộng vẫngiữnguyê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;
}

