Bài giảng Lập trình hướng đối tượng với C++ - Chương 13: Toán tử trên lớp

• Chú ý: • Các toán hạng bên trái của các toán tử << và >> là các đối tượng thuộc lớp ostreamvà istreamchứ không phải thuộc lớp SoPhuc nên không thể định nghĩa chồng các toán tử này nhưlà hàm thành phần, mà phải được định nghĩa nhưlà hàm bạn.

pdf12 trang | Chia sẻ: maiphuongtl | Lượt xem: 2666 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Bài giảng Lập trình hướng đối tượng với C++ - Chương 13: Toán tử trên lớp, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 13: TOÁN TỬ TRÊN LỚP • Nội dung Toán tử Hàm toán tử Định nghĩa chồng toán tử gán “=“ Định nghĩa chồng toán tử tăng/giảm ”++“/”—” Định nghĩa chồng toán tử “[]” Định nghĩa chồng toán tử “>” Toán tử  Trong C++, có thể định nghĩa chồng đối với hầu hết các toán tử (một ngôi hoặc hai ngôi) trên các lớp, nghĩa là một trong các toán hạng tham gia phép toán là các đối tượng.  Toán tử được định nghĩa chồng bằng cách định nghĩa một hàm toán tử với tên bao gồm từ khóa operator và theo sau là ký hiệu toán tử cần định nghĩa chồng. • Ví dụ 1: Một số ví dụ về tên hàm toán tử • operator+ định nghĩa phép cộng • operator- định nghĩa phép trừ • operator* định nghĩa phép nhân • operator/ định nghĩa phép chia • operator+= định nghĩa phép cộng bằng • operator!= định nghĩa phép so sánh khác Hàm toán tử • Hàm toán tử có thể là hàm thành phần hoặc hàm bạn của lớp. Khi hàm toán tử là hàm thành phần của lớp thì toán hạng thứ nhất trong hàm toán tử luôn là một đối tượng thuộc lớp đó. Nếu toán hạng thứ nhất trong hàm toán tử không phải là một đối tượng của lớp thì hàm toán tử phải là hàm bạn của lớp. • Ví dụ 2: • class SoPhuc • { • private: • float re, im; //phần thực và phần ảo • public: • SoPhuc(float re = 0; float im = 0); void Xuat(); • //Hàm toán tử cộng hai đối tượng Sophuc • SoPhuc operator+(SoPhuc u); // Hàm thành phần lớp • /*Hàm toán tử cộng một số thực với phần thực của một đối tượng SoPhuc*/ • friend SoPhuc operator+(float x, SoPhuc v); //Hàm bạn • }; • //Định nghĩa các hàm thành phần • SoPhuc::SoPhuc(float im1, float re1) • { • im = im1; re = re1; • } • SoPhuc SoPhuc::oprator+(SoPhuc u) • { • cout << “Goi hàm toán tử thành phần operator+\n”; • SoPhuc res(re + u.re, im + u.im); //Gọi hàm thiết lập hai đối số • return res; • } • void SoPhuc::Xuat() • { • cout = 0 ? “+” : “-”) << fabs(im) << “*i\n”; • } • //Định nghĩa hàm tự do • SoPhuc operator+(float x, SoPhuc u) • { cout << “Goi hàm toán tử tự do operator+\n”; • SoPhuc res(x + u.re, u.im); • return res; • } • //Hàm chính • void main() • { SoPhuc a(-2, 4); • a.Xuat(); SoPhuc b(8, -6); • b.Xuat(); • SoPhuc c = a + b; // CT dịch hiểu c = a.operator+(b) • c.Xuat(); • SoPhuc d = 4 + c; // CT dịch hiểu c = operator+(4, c) • d.Xuat(); • SoPhuc e = a + b + c; // e = (a.operator+(b)).operator+(c) • e.Xuat(); • } Định nghĩa chồng phép gán  Hàm toán tử gán luôn là hàm thành phần của lớp.  Việc định nghĩa chồng phép gán chỉ cần thiết khi các đối tượng có các thành phần dữ liệu động.  Giá trị trả về của hàm toán tử gán được chọn là tham chiếu đến đối tượng đứng bên trái phép gán nhằm giũ hai tính chất quan trong của phép gán: trật tự kết hợp tử bên phải sang bên trái và có thể sử dụng kết quả biểu thức gán trong các biểu thức khác. • Ví dụ 3: • class Vector • { • private: • . . . • public: • . . . • Vector& operator=(Vector &u); • }; • Vector& Vector::operator=(Vector &u) • { • cout <<“goi ham toan tu gan\n”; • if(this != &u) { • delete[]a; /*xóa vùng nhớ động đã có trong đối tượng vế trái*/ • n = u.n; • u.a = new float[n]; /*cấp phát vùng nhớ mới có kích thước như trong u*/ • for(i = 0; i < n; i++) • a[i] = u.a[i]; • } • else cout <<“ Hai doi tuong trong phep gan la mot\n”; • return *this; • } • void main() • { • . . . • Vector b = a; //Gọi hàm thiết lập sao chép • b.Xuat(); • Vector c(0); • c = b; //Gọi hàm toán tử gán • c.Xuat(); • } Định nghĩa chồng toán tử “>” • Việc định nghĩa chồng hai toán tử “>” sẽ cho phép các đối tượng đứng bên phải chúng khi thức hiện các thao tác nhập xuất. • Ví dụ 4: • class SoPhuc • { • private: • float im, re; • public: • // • friend ostream& operator<<(ostream &os, SoPhuc &u); • firend istream& operator>>(istream &is, SoPhuc &u); • }; • //Định nghĩa hàm tự do • ostream& operator<<(ostream &os, SoPhuc &u) • { • cout << “Nhap phan thuc va phan ao:”; • os << u.re << u.im; • } • istream& operator>>(istream &os, SoPhuc &u) • { • is = 0 ? “+” : “-”) << u.im <<“*i\n”; • } • //Hàm chính • void main() • { • SoPhuc a; • cin << a; • cout << a; • } • Chú ý: • Các toán hạng bên trái của các toán tử > là các đối tượng thuộc lớp ostream và istream chứ không phải thuộc lớp SoPhuc nên không thể định nghĩa chồng các toán tử này như là hàm thành phần, mà phải được định nghĩa như là hàm bạn.

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

  • pdfchuong_12_3136.pdf
Tài liệu liên quan