Lập trình hướng đối tượng & C++ - Chương 7: Tái định nghĩa tác tử

Tài liệu Lập trình hướng đối tượng & C++ - Chương 7: Tái định nghĩa tác tử: TÁI ðỊNH NGHĨA TÁC TỬ Chương 7 1 Nội dung • Giới thiệu • Tỏi ủịnh nghĩa bằng hàm ủộc lập • 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 2 Giới thiệu • Tại sao cần 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 cần cú cỏch viết cỏc phộp toỏn theo dạng gần gũi hơn 3 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). – 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. Giới thiệu (tt) – Cỳ phỏp: operator ( cỏc ủối số ) – Cú 2 cỏch dựng ủể...

pdf3 trang | Chia sẻ: putihuynh11 | Lượt xem: 662 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Lập trình hướng đối tượng & C++ - Chương 7: Tái định nghĩa tác tử, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
TÁI ðỊNH NGHĨA TÁC TỬ Chương 7 1 Nội dung • Giới thiệu • Tái định nghĩa bằng hàm độc lập • 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 2 Giới thiệu • Tại sao cần 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 cần cĩ cách viết các phép tốn theo dạng gần gũi hơn 3 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 tố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. Giới thiệu (tt) – Cú pháp: operator ( các đối số ) – 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 • Các tác tử cĩ thể định nghĩa – Số học: +, -, *, /, Tăng giảm: ++, --, +=, *=, – So sánh: , >=, <=, ==, != – Phép gán: = Giới thiệu (tt) – >, [], new, delete, 5 Tái định nghĩa bằng hàm độc lập • 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 hốn. class PhanSo { int tu,mau; public: 6 ... 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 } Phải định nghĩa thêm tác tử: PhanSo operator + (int , PhanSo); Tái định nghĩa bằng hàm thành viên • ðố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. class PhanSo { int tu,mau; public: 7 ... 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ử bằng hàm thành viên cho trường hợp này Tái định nghĩa phép gán (dấu =) • 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 Stack { float *ds; void main() { Stack s1(100); 8 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 s2(20); s2 = s1; s1 = s2; } Tái định nghĩa phép gán (dấu =) • Phân biệt giữa phép gán và hàm xây dựng sao chép: – Phép gán: đối tượng đã tồn tại (cĩ vùng nhớ) – Hàm xây dựng sao chép: đối tượng chưa cĩ • Trị trả về của phép gán cĩ thể là chính đối tượng đĩ. class SinhVien { char mssv[9]; char* hoten; void main(){ SinhVien a, b, c; 9 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; } }; Phải copy dữ liệu Xĩa vùng nhớ cũ, cấp vùng nhớ mới và copy dữ liệu 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 • Dùng để xuất nhập trực tiếp đối tượng qua cin, cout: VD: PhanSo a(2,5); cout << a << endl; • Các phép tốn nhập (>>), xuất (<<) phải được định nghĩa theo dạng hàm đc lp 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) 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ử xuất – nhập • Ví dụ 1class 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 { os << “(” << p.x << “,” << p.y <<“)”; return os; } istream& operator >> (istream& is, Diem& p) { cout > p.x; cout > p.y; return is;} void main() { Diem a(2,10), b; cout<< “Gia tri diem A la: ” << a <<endl; cout>b; cout<< “Gia tri diem B la: ” << b <<endl;} Tái định nghĩa tác tử xuất – nhập • Ví dụ 2 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 12 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; } }; 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();}

Các file đính kèm theo tài liệu này:

  • pdfchapter7_6677_1993468.pdf