
TÁI ðNH NGHĨA TÁC TTÁI ðNH NGHĨA TÁC T
Chương 7
1
Ni dungNi dung
• Gii thiu
• Tái ñnh nghĩa bng hàm ñc lp
• Tái ñnh nghĩa bng hàm thành viên
•
Tái ñnh nghĩa phép gán (du =)
•
Tái ñnh nghĩa phép gán (du =)
• Tái ñnh nghĩa tác t xut – nhp
2
Gii thiuGii thiu•Ti sao cn tái ñnh nghĩa tác t?
class PhanSo {
int tu, mau;
public:
PhanSo(int=0, int=1){…}
void InPs() {…}
int LonHon (PhanSo x) {
return
(
tu
*
x.mau
>
mau
*
x.tu
);}
Ta cn có cách
vit các phép
toán theo dng
gn gũi hơn
3
return
(
tu
*
x.mau
>
mau
*
x.tu
);}
PhanSo Cong(PhanSo x) {…}
};
void main() {
PhanSo a(4,9), b(3,7);
if(b.LonHon(a))
cout<<“PS b lon hon a”;
PhanSo c = b.Cong(a);
a.InPs(); cout<< “ + ”; b.InPs();
cout<< “ = ”; c.InPs();
}
if ( b > a )
Phan So c = b + a
cout << a << “ + ”
<< b << “ = ” << c;
•Cơch
– C++ cho phép ta tái ñnh nghĩa các tác t(phép
toán).
– Vic tái ñnh nghĩa tác tthc hin tương tnhư
tái
ñnh
nghĩa
hàm
.
GiiGii thiuthiu ((tttt))
tái
ñnh
nghĩa
hàm
.
– Cú pháp:
<Kiu trv> operator <tác t> ( các ñi s)
– Có 2 cách dùng ñ tái ñnh nghĩa tác t:
• Dùng hàm ñc lp
• Dùng hàm thành viên 4

•Các tác tcó th ñnh nghĩa
– Shc: +, -, *, /, … Tăng gim: ++, --, +=, *=, …
– So sánh: <, >, >=, <=, ==, !=
– Phép gán: =
GiiGii thiuthiu ((tttt))
– <<, >>, [], new, delete, …
5
Tái ñnh nghĩa bng hàm ñc lpTái ñnh nghĩa bng hàm ñc lp
• Thông thưng nên khai báo hàm ñc lp là hàm bn ca
lpñ có thtruy cp các thành phn private ca lp.
• Tác tsau khi ñnh nghĩa không có tính giao hoán.
class PhanSo {
int tu,mau;
public
:
6
public
:
...
friend PhanSo operator + (PhanSo,int);
};
PhanSo operator + (PhanSo x, int n)
{ return PhanSo(x.tu + x.mau*n, x.mau);}
void main() {
PhanSo a(2,5);
PhanSo b = operator +(a,10);
PhanSo c = a + 20 ;
PhanSo d = 20 + a ; // Sai
}
Phi ñnh nghĩa thêm tác t:
PhanSo operator +(int , PhanSo);
Tái ñnh nghĩa bng hàm thành viênTái ñnh nghĩa bng hàm thành viên
•ði s ñu tiên ca tác tchính là ñi tưng ñang xét.
=> Hàm scó slưng ñi sít hơn so vi hàm ñc lp.
class PhanSo {
int tu,mau;
public
:
7
public
:
...
PhanSo operator + (int);
};
PhanSo PhanSo::::operator + (int n)
{ return PhanSo(tu + mau*n, mau);}
void main() {
PhanSo a(2,5);
PhanSo b = a.operator +(10);
PhanSo c = a + 20 ;
PhanSo d = 20 + a ; // Sai
}
Không th ñnh nghĩa thêm
tác t bng hàm thành viên
cho trưng hp này
Tái ñnh nghĩa phép gán (du =)Tái ñnh nghĩa phép gán (du =)
• C++ mc nhiên scó phép gán (du = ) bng cách gán tương
ng tng thuc tính gia 2 ñi tưng.
• Khi thành phn dliu có con tr=> phiñnh nghĩa “=”.
• Phép gán phiñnh nghĩa bng hàm thành viên.
class Stack {
float
*
ds
;
void main() {
Stack
s1(100);
8
float
*
ds
;
int soluong, vitri;
public:
...
void operator=(const Stack& s){
soluong = s.soluong;
vitri = s.vitri;
delete[] ds;
ds = new float[soluong];
for(int i=0; i<vitri; i++)
ds[i]= s.ds[i]; }
};
Stack
s1(100);
…
Stack s2(20);
…
s2 = s1;
…
s1 = s2;
}

Tái ñnh nghĩa phép gán (du =)Tái ñnh nghĩa phép gán (du =)
• Phân bit gia phép gán và hàm xây dng sao chép:
– Phép gán: ñi tưng ñã t n ti (có vùng nh)
– Hàm xây dng sao chép: ñi tưng chưa có
• Trtrvca phép gán có thlà chính ñi tưng ñó.
class SinhVien {
char
mssv
[9
];
char
*
hoten
;
void main(){
SinhVien
a, b, c;
9
char
mssv
[9
];
char
*
hoten
;
int namsinh; float diemtb;
public:
...
SinhVien& operator=(const
SinhVien& a){
strcpy(mssv,a.mssv);
delete[] hoten;
hoten = strdup(a.hoten);
namsinh = a.namsinh;
diemtb = a.diemtb;
return *this; }
};
Phi copy dliu
Xóa vùng nh cũ, cp vùng
nh mi và copy d liu
SinhVien
a, b, c;
a.Nhap();
c = b = a; //phép gán
SinhVien d=a; // hxdsc
}
Tái ñnh nghĩa tác t xut Tái ñnh nghĩa tác t xut –– nhpnhp
• Dùng ñ xut nhp trc ti!pñi tưng qua cin, cout:
VD: PhanSo a(2,5); cout << a << endl;
• Các phép toán nhp (>>), xut (<<) phiñưcñnh nghĩa theo
dng hàm ñc lpvà thưng khai báo là friend.
• Thao tác vi các dòng (stream) xut/nhp chu"n như:
–
Bàn
phím
,
tp
tin
dùng
ñ
ñc
, … (
istream
)
–
Bàn
phím
,
tp
tin
dùng
ñ
ñc
, … (
istream
)
– Màn hình, tp tin dùng ñ ghi, … (ostream)
10
class PhanSo {
int tu, mau;
public :
…
friend ostream& operator << (ostream& os, PhanSo p);
friend istream& operator >> (istream& is, PhanSo& p);
};
Tái ñnh nghĩa tác t xut Tái ñnh nghĩa tác t xut –– nhpnhp
•Ví d1
class Diem {
int x, y;
public :
…
friend ostream& operator << (ostream& os, Diem p);
friend istream& operator >> (istream& is, Diem& p);
};
ostream
&
operator
<<
(
ostream
&
os
,
Diem
p)
11
ostream
&
operator
<<
(
ostream
&
os
,
Diem
p)
{ os << “(” << p.x << “,” << p.y <<“)”; return os; }
istream& operator >> (istream& is, Diem& p) {
cout << “Nhap hoanh do: ”; is >> p.x;
cout << “Nhap tung do: ”; is >> p.y;
return is;}
void main() {
Diem a(2,10), b;
cout<< “Gia tri diem A la: ” << a <<endl;
cout<< “Nhap gia tri cho diem B: ”<<endl; cin>>b;
cout<< “Gia tri diem B la: ” << b <<endl;}
Tái ñnh nghĩa tác t xut Tái ñnh nghĩa tác t xut –– nhpnhp
•Ví d2
class SinhVien {
char mssv[10], *hoten;
float diemtb;
public :
…
friend ostream& operator <<
(
ostream
&
os
,
SinhVien
s) {
void main() {
SinhVien ptcang;
cout<<“Nhap thong tin: ”;
cin
>>
ptcang
;
#include <fstream.h>
12
(
ostream
&
os
,
SinhVien
s) {
os<<s.mssv<<endl;
os<<s.hoten<<endl;
os<< s.diemtb<<endl;
return os; }
friend istream& operator >>
(istream& is, SinhVien& s){
is.getline(s.mssv,9);
is.getline(s.hoten,49);
is >> s.diemtb;
return is; }
};
cin
>>
ptcang
;
cout << “Sinh vien A: ”;
cout << ptcang ;
ofstream f1(“MyFile.txt”);
f1<<ptcang;
f1.close();
ifstream f2(“MyFile.txt”);
SinhVien a1;
f2>>a1;
cout << “Trong file: ”;
cout <<a1;
f2.close();}