Bài giảng môn Lập trình hướng đối tượng - chương 7: Tái định nghĩa tác tử

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 toá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)

pdf3 trang | Chia sẻ: nguyenlam99 | Lượt xem: 1000 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Bài giảng môn Lập trình hướng đối tượng - 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 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 ñể 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 hoá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 toá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:

  • pdftran_quang_hai_bangchapter7_7509.pdf