Xem mẫu

  1. Chương 7 TÁI ĐỊNH NGHĨA TÁC TỬ 1
  2. 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
  3. 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
  4. 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
  5. 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: , >=,
  6. 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 }
  7. 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 }
  8. 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
  9. 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 };
  10. 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 (
  11. Tái định nghĩa tác tử xuất – nhập • class Ví dụDiem 1 { int x, y; public : … friend ostream& operator > (istream& is, Diem& p); }; ostream& operator
  12. 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
nguon tai.lieu . vn