N i dung
• Gi i thi u
Chương 7
• Tái ñ nh nghĩa b ng hàm ñ c l p
TÁI ð NH NGHĨA TÁC T
• Tái ñ nh nghĩa b ng hàm thành viên
• Tái ñ nh nghĩa phép gán (d u =)
• Tái ñ nh nghĩa tác t xu t – nh p
1
Gi i thi u •
T i sao c n tái ñ nh nghĩa tác t ?
2
Gi i thi u (tt)
tt)
• Cơ ch
class PhanSo {
int tu, mau;
public:
PhanSo(int=0, int=1){…}
void InPs() {…}
int LonHon (PhanSo x) {
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();
}
Ta c n có cách
vi t các phép
toán theo d ng
g n gũi hơn
– C++ cho phép ta tái ñ nh nghĩa các tác t (phép
toán).
– Vi c tái ñ nh nghĩa tác t th c hi n tương t như
tái ñ nh nghĩa hàm.
– Cú pháp:
if ( b > a )
operator ( các ñ i s )
Phan So c = b + a
cout << a << “ + ”
<< b << “ = ” << c;
3
– Có 2 cách dùng ñ tái ñ nh nghĩa tác t :
• Dùng hàm ñ c l p
• Dùng hàm thành viên
4
Gi i thi u (tt)
tt)
Tái ñ nh nghĩa b ng hàm ñ c l p
• Các tác t có th ñ nh nghĩa
• Thông thư ng nên khai báo hàm ñ c l p là hàm b n c a
l p ñ có th truy c p các thành ph n private c a l p.
• Tác t sau khi ñ nh nghĩa không có tính giao hoán.
– S h c: +, -, *, /, … Tăng gi m: ++, --, +=, *=, …
– So sánh: <, >, >=, <=, ==, !=
– Phép gán: =
– <<, >>, [], new, delete, …
5
class PhanSo {
int tu,mau;
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);
Ph i ñ nh nghĩa thêm tác t :
PhanSo b = operator +(a,10);
PhanSo operator + (int , PhanSo);
PhanSo c = a + 20 ;
PhanSo d = 20 + a ; // Sai
6
}
Tái ñ nh nghĩa b ng hàm thành viên
Tái ñ nh nghĩa phép gán (d u =)
• ð i s ñ u tiên c a tác t chính là ñ i tư ng ñang xét.
=> Hàm s có s lư ng ñ i s ít hơn so v i hàm ñ c l p.
• C++ m c nhiên s có phép gán (d u = ) b ng cách gán tương
ng t ng thu c tính gi a 2 ñ i tư ng.
• Khi thành ph n d li u có con tr => ph i ñ nh nghĩa “=”.
• Phép gán ph i ñ nh nghĩa b ng hàm thành viên.
class PhanSo {
int tu,mau;
public:
...
PhanSo operator + (int);
};
PhanSo PhanSo::
::operator + (int n)
{ return PhanSo(tu + mau*n, mau);}
void main() {
Không th ñ nh nghĩa thêm
PhanSo a(2,5);
tác t b ng hàm thành viên
PhanSo b = a.operator +(10);
PhanSo c = a + 20 ;
cho trư ng h p này
PhanSo d = 20 + a ; // Sai
7
}
class Stack {
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>), xu t (<<) ph i ñư c ñ nh nghĩa theo
d ng hàm ñ c l p và thư ng khai báo là friend.
• Thao tác v i các dòng (stream) xu t/nh p chu n như:
– Bàn phím, t p tin dùng ñ ñ c, … (istream)
– Màn hình, t p tin dùng ñ ghi, … (ostream)
class SinhVien {
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;
}
};
void main(){
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
xu t – nh p
• class Diem
Ví d 1
Ph i copy d li u
Xóa vùng nh cũ, c p vùng
nh m i và copy d li u
9
{
int x, y;
public :
…
friend ostream& operator << (ostream& os, Diem p);
friend istream& operator >> (istream& is, Diem& p);
};
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 <>b;
11
cout<< “Gia tri diem B la: ” << b <> (istream&
};
Tái ñ nh nghĩa tác t
os, PhanSo p);
is, PhanSo& p);
10
xu t – nh p
• Ví d 2
class SinhVien {
char
mssv[10], *hoten;
float
diemtb;
public :
…
friend ostream& operator <<
(ostream& os, SinhVien s) {
os<>
(istream& is, SinhVien& s){
is.getline(s.mssv,9);
is.getline(s.hoten,49);
is >> s.diemtb;
return is;
}
};
#include
void main() {
SinhVien ptcang;
cout<<“Nhap thong tin: ”;
cin >> ptcang;
cout << “Sinh vien A: ”;
cout << ptcang ;
ofstream f1(“MyFile.txt”);
f1<>a1;
cout << “Trong file: ”;
cout <