Xem mẫu

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 < nguon tai.lieu . vn