Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
346,3 KB
Nội dung
CHƯƠNG 4: ĐA NĂNG HOÁ TOÁN TỬ (OPERATOR OVERLOADING) Khoa Công Nghệ Thông Tin Truyền Thông Đại học Bách khoa – Đại học Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Nội dung Đa hoá hàm Đa hoá toán tử Giới hạn đa hoá toán tử Chuyển đổi kiểu Đa hoá toán tử xuất () Đa hoá toán tử [], toán tử () Khởi tạo ngầm định - Gán ngầm định Đa hoá toán tử ++ -Đa hoá new delete Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đa hoá hàm Định nghĩa hàm tên Đối số phải khác nhau: Số lượng Thứ tự Kiểu class Time { // long GetTime (void); // số giây tính từ nửa đêm void GetTime (int &hours, int &minutes, int &seconds); }; void main() { int h, m, s; long t = GetTime(); // Gọi hàm ??? GetTime(h, m, s); // Gọi hàm ??? } Có thể dùng đối số mặc định Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đa hoá toán tử Định nghĩa phép tốn đối tượng Các phép tốn tái định nghĩa: Đơn hạng + - new * ! ~ & ++ () -> delete + - * / % & | ^ > = += -= /= %= &= |= ^= = == Nhị hạng ->* != < > = && || [] () , Các phép tốn khơng thể tái định nghĩa: * :: ?: Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng sizeof Giới hạn đa hoá toán tử toán tử gọi hàm () - tốn tử nhiều ngơi Thứ tự ưu tiên tốn tử khơng thể thay đổi đa hóa Tính kết hợp tốn tử khơng thể thay đổi đa hóa Các tham số mặc định khơng thể sử dụng với tốn tử đa hóa Khơng thể thay đổi số toán hạng mà toán tử yêu cầu Khơng thể thay đổi ý nghĩa tốn tử làm việc kiểu có sẵn Khơng thể dùng đối số mặc định Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đa hoá toán tử Khai báo định nghĩa toán tử thực chất không khác với việc khai báo định nghĩa nghĩa loại hàm khác sử dụng tên hàm "operator@" cho toán tử "@" để overload phép "+", ta dùng tên hàm "operator+" Số lượng tham số khai báo phụ thuộc hai yếu tố: Tốn tử tốn tử đơn hay đơi Tốn tử khai báo hàm toàn cục hay phương thức lớp aa@bb @aa aa@ aa.operator@(bb) aa.operator@( ) aa.operator@(int) Là phương thức lớp Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng operator@(aa,bb) operator@(aa) operator@(aa,int) Là hàm toàn cục Đa hố tốn tử Ví dụ: Sử dụng tốn tử "+" để cộng hai đối tượng MyNumber trả kết MyNumber Ta khai báo hàm toàn cục sau MyNumber x(5); MyNumber y(10); z = x + y; const MyNumber operator+(const MyNumber& num1, const MyNumber& num2); "x+y" hiểu "operator+(x,y)" dùng từ khoá const để đảm bảo tốn hạng gốc khơng bị thay đổi Hoặc khai báo toán tử dạng thành viên MyNumber: const MyNumber operator+(const MyNumber& num); đối tượng chủ phương thức hiểu toán hạng thứ toán tử "x+y" hiểu "x.operator+(y)" Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đa hoá toán tử (tt) Bằng hàm thành viên: Khi đa hóa (), [], -> =, hàm đa hóa tốn tử phải khai báo thành viên lớp class Point { public: Point (int x, int y) { Point::x = x; Point::y = y; } Point operator + (Point &p) { return Point(x + p.x,y + p.y); } Point operator - (Point &p) { return Point(x - p.x, y - p.y); } private: int x, y; }; Có tham số (Nếu tốn tử hai ngơi) void main() { Point p1(10,20), p2(10,20); Point p3 = p1 + p2; Point p4 = p1 - p2; Point p5 = p3.operator + (p4); Point p6 = p3.operator – (p4); }; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đa hoá toán tử (tt) Toán tử hàm tồn cục Quay lại với ví dụ phép cộng cho MyNumber, ta khai báo hàm định nghĩa phép cộng mức toàn cục: const MyNumber operator+(const MyNumber& num1, const MyNumber& num2); Khi đó, ta định nghĩa tốn tử sau: const MyNumber operator+(const MyNumber& num1,const MyNumber& num2) { MyNumber result(num1.value + num2.value); return result; } Truy nhập thành viên private value Ở có vấn đề… Giải pháp: dùng hàm friend friend cho phép lớp cấp quyền truy nhập tới phần nội lớp cho số cấu trúc chọn Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đa hoá toán tử (tt) Để khai báo hàm friend lớp, ta phải khai báo hàm bên khai báo lớp đặt từ khoá friend lên đầu khai báo class MyNumber { public: MyNumber(int value = 0); ~MyNumber(); friend const MyNumber operator+(const MyNumber& num1,const MyNumber& num2); }; Lưu ý: khai báo hàm friend đặt khai báo lớp hàm có quyền truy nhập ngang với phương thức lớp, hàm khơng phải phương thức lớp Khơng cần thêm sửa đổi cho định nghĩa hàm khai báo friend Định nghĩa trước phép cộng giữ nguyên const MyNumber operator+(const MyNumber& num1,const MyNumber& num2) { MyNumber result(num1.value + num2.value); return result; } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 10 Đa hoá toán tử (tt) Tại dùng tốn tử tồn cục? Đối với tốn tử khai báo phương thức lớp, đối tượng chủ (xác định trỏ this) hiểu toán hạng (trái nhất) phép toán Nếu muốn dùng cách này, ta phải quyền bổ sung phương thức vào định nghĩa lớp/kiểu toán hạng trái Khơng phải lúc overload toán tử phương thức phép cộng MyNumber int cần hai cách MyNumber + int int + MyNumber cout