Bài giảng Lập trình hướng đối tượng C++ - Chương 7: Tái định nghĩa tác tử
Bạn đang xem tài liệu "Bài giảng 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 gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_c_chuong_7_tai_dinh_nghi.pdf
Nội dung text: Bài giảng Lập trình hướng đối tượng C++ - Chương 7: Tái định nghĩa tác tử
- Chương 7 TÁI ĐỊNH NGHĨA TÁC TỬ 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; Ta cần có cách public: viết các phép PhanSo(int=0, int=1){ } toán theo dạng void InPs() { } int LonHon (PhanSo x) { gần gũi hơn return (tu*x.mau>mau*x.tu);} PhanSo Cong(PhanSo x) { } }; void main() { if ( b > a ) PhanSo a(4,9), b(3,7); if(b.LonHon(a)) Phan So c = b + a cout<<“PS b lon hon a”; PhanSo c = b.Cong(a); a.InPs(); cout<< “ + ”; b.InPs(); cout << a << “ + ” cout<< “ = ”; c.InPs(); << b << “ = ” << c; } 3
- Giới thiệu (tt) • 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. – 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
- Giới thiệu (tt) • Các tác tử có thể định nghĩa – Số học: +, -, *, /, Tăng giảm: ++, , +=, *=, – So sánh: , >=, >, [], 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 hoán. 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); PhanSo b = operator +(a,10); PhanSo c = a + 20 ; PhanSo d = 20 + a ; 6 }
- 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: 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 PhanSo b = a.operator +(10); viên PhanSo c = a + 20 ; PhanSo d = 20 + a ; // Sai cho trường hợp này } 7
- 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 { void main() { float *ds; Stack s1(100); int soluong, vitri; public: Stack s2(20); void operator=(const Stack& s){ s2 = s1; soluong = s.soluong; vitri = s.vitri; s1 = s2; delete[] ds; } ds = new float[soluong]; for(int i=0; i<vitri; i++) ds[i]= s.ds[i]; } }; 8
- 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 { void main(){ char mssv[9]; char* hoten; SinhVien a, b, c; int namsinh; float diemtb; a.Nhap(); public: c = b = a; //phép gán SinhVien& operator=(const SinhVien d=a; // hxdsc SinhVien& a){ } strcpy(mssv,a.mssv); Phải copy dữ liệu delete[] hoten; hoten = strdup(a.hoten); namsinh = a.namsinh; Xóa vùng nhớ cũ, cấp vùng diemtb = a.diemtb; nhớ mới và copy dữ liệu return *this; } }; 9
- 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 >), xuất ( > (istream& is, PhanSo& p); }; 10
- Tái định nghĩa tác tử xuất – nhập •classVí dụDiem 1 { int x, y; public : friend ostream& operator > (istream& is, Diem& p); }; ostream& operator > (istream& is, Diem& p) { cout > p.x; cout > p.y; return is;} void main() { Diem a(2,10), b; cout >b; cout<< “Gia tri diem B la: ” << b <<endl;} 11
- Tái định nghĩa tác tử xuất – nhập • Ví dụ 2 class SinhVien { #include char mssv[10], *hoten; float diemtb; public : void main() { SinhVien ptcang; friend ostream& operator > ptcang; os > f1.close(); (istream& is, SinhVien& s){ ifstream f2(“MyFile.txt”); is.getline(s.mssv,9); SinhVien a1; is.getline(s.hoten,49); f2>>a1; is >> s.diemtb; cout << “Trong file: ”; return is; } cout <<a1; }; f2.close();} 12