OOP4 operatoroverloading new

47 0 0
OOP4 operatoroverloading new

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

OOP4 OperatorOverloading new 0 ĐA NĂNG HOÁ TOÁN TỬ CHƯƠNG 4 (OPERATOR OVERLOADING) Khoa Công Nghệ Thông Tin và Truyền Thông Đại học Bách khoa – Đại học Đà Nẵng CHƯƠNG 4 Khoa Công Nghệ Thông Tin Đại Họ.

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 CHƯƠNG Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Nội dung n Đa hoá hàm n Đa hoá toán tử n Giới hạn đa hoá toán tử n Chuyển đổi kiểu n Đa hoá toán tử xuất () n Đa hoá toán tử [], toán tử () n Khởi tạo ngầm định - Gán ngầm định n Đa hoá toán tử ++ n Đ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 n Đối số phải khỏc nhau: n ă n S lng ă Th t ¨ Kiểu liệu Có thể dùng đối số mặc định long GetTime (void); // số giây tính từ nửa đêm void GetTime (int &hours=0, int &minutes=0, int &seconds=0); void main() { int h, m, s; long t = GetTime(); // Gọi hàm ??? GetTime(h, m, s); // Gọi hàm ??? } Từng cặp hàm sau đa hóa hàm void HV(int a, int b); Cặp hàm (1,2) void HV(int *a, int *b); Cặp hàm (2,3) void HV(int &a, int &b); 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 toán đối tượng n Các phép tốn tái định nghĩa: n Đơn hạng Nhị hạng n + - new * ! ~ & ++ () -> ->* delete + - * / % & | ^ > = += -= /= %= &= |= ^= = == != < > = && || [] () , 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ử n n n n n n 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ố tốn hạng mà tốn tử u cầu Khơng thể thay đổi ý nghĩa toá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ử n n n 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 yu t: ă Toỏn t l toỏn t n hay ụi ă Toỏn t c khai bỏo l hm 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ử n Ví dụ: Sử dụng toán tử "+" để cộng hai đối tượng lớp Complex trả kết Complex Complex x(5); Complex y(10); z = x + y; Ta khai báo hàm tồn cục sau const Complex operator+(const Complex& num1, const Complex& num2); ă "x+y" s hiểu "operator+(x,y)" n 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 Complex: const Complex operator+(const Complex& num); n n n đố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ử hàm thành viên n n Khi đa hóa (), [], -> =, hàm toán tử phải khai báo hàm thành viên lớp Toán tử ngơi hàm khơng có tham số, tốn tử ngơi hàm có tham số 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ử hàm thành viên a @ b: a.operator @(b) n x @ b: với x thuộc kiểu float, int, … không thuộc kiểu lớp ang nh ngha n ă operator @ (x, b) Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đa hố tốn tử hàm tồn cục n Nếu toán hạng cực trái toán tử đối tượng thuộc lớp khác thuộc kiểu liu cú sn ă thng khai bỏo friend class Point { public: Point (int x, int y) { Point::x = x; Point::y = y; } friend Point operator + (Point &p, Point &q); friend Point operator - (Point &p, Point &q) ; private: int x, y; }; Point operator + (Point &p, Point &q) {return Point(p.x + q.x,p.y + q.y); } Point operator - (Point &p, Point &q) {return Point(p.x - q.x,p.y - q.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 =operator + (p3, p4); Point p6 = operator – (p3, p4); }; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đa hoá toán tử ++ & -n Phép tăng ++ ă giỏ n n tr tr v tng trc ++num ă tr v tham chiu (MyNumber &) ă giỏ trị trái - lvalue (có thể gán trị) tăng sau num++ ă tr v giỏ tr (giỏ tr c trc tng) ă tr v i tng tm thi cha giỏ tr c ă giỏ tr phi - rvalue (khụng th lm ớch ca phộp gỏn) ă prototype n n tăng trước: MyNumber& MyNumber::operator++() tăng sau: const MyNumber MyNumber::operator++(int) Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 32 Đa hoá toán tử ++ & -n n Nhớ lại phép tăng trước tăng giá trị trước trả kết quả, phép tăng sau trả lại giá trị trước tăng Ta định nghĩa phiên phép tăng sau: MyNumber& MyNumber::operator++() { // Prefix this->value++; // Increment value return *this; // Return current MyNumber } const MyNumber MyNumber::operator++(int) { // Postfix MyNumber before(this->value); // Create temporary MyNumber // with current value this->value++; // Increment value return before; // Return MyNumber before increment } before đối tượng địa phương phương thức chấm dứt tồn lời gọi hàm kết thúc Khi đó, tham chiếu tới trở thành bất hợp lệ Khoa Cơng Nghệ Thơng Tin - Đại Học Bách khoa Đà Nẵng Không thể trả tham chiếu 33 Tham số kiểu trả n Cũng overload hàm khác, overload tốn tử, ta có nhiều lựa chọn v vic truyn tham s v kiu tr v ă có hạn chế tham số phải thuộc kiểu người dùng tự định nghĩa n Ở đây, ta có số lời khuyên lựa chọn Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 34 Tham số kiểu tr v n Cỏc toỏn hng: ă Nờn s dng tham chiếu (đặc biệt lm vic vi cỏc i tng ln) ă Luụn luụn sử dụng tham số tham chiếu đối số không bị sửa đổi bool String::operator==(const String &right) const n Đối với toán tử phương thức, điều có nghĩa ta nên khai báo tốn tử thành viên toán hạng khơng bị sửa đổi n Phần lớn tốn tử (tính tốn so sánh) khơng sửa đổi tốn hạng nó, ta hay dùng đến tham chiếu Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 35 Tham số kiu tr v n Giỏ tr tr v ă khụng có hạn chế kiểu trả tốn tử overload, nên cố gắng tuân theo tinh thần cài đặt có sẵn tốn tử n Ví dụ, phép so sánh (==, !=…) thường trả giá trị kiểu bool, nên phiên overload cng nờn tr v bool ă l tham chiu (tới đối tượng kết toán hng) hay mt vựng lu tr mi ă Hng hay Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 36 Tham số kiểu tr v n Giỏ tr tr v ă Cỏc tốn tử sinh giá trị cần có kết trả giá trị (thay tham chiếu), const (để đảm bảo kết bị sửa đổi l-value) n n Hầu hết phép toán số học sinh giá trị ta thấy, phép tăng sau, giảm sau tuõn theo hng dn trờn ă Cỏc toỏn t trả tham chiếu tới đối tượng ban đầu (đã bị sửa đổi), chẳng hạn phép gán phép tăng trước, nên trả tham chiếu n để kết tiếp tục sửa đổi thao tác const MyNumber MyNumber::operator+(const MyNumber& right) const MyNumber& MyNumber::operator+=(const MyNumber& right) Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 37 Tham số kiểu trả n Xem lại cách ta dùng để trả kết toán tử: const MyNumber MyNumber::operator+(const MyNumber& num) Gọi constructor để tạo đối tượng result { MyNumber result(this->value + num.value); return result; Gọi copy-constructor để tạo } dành cho giá trị trả hàm thoát Gọi destructor để huỷ đối tượng result n Cách không sai, C++ cung cấp cách hiệu const MyNumber MyNumber::operator+(const MyNumber& num) { return MyNumber(this->value + num.value); } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 38 Tham số kiểu trả return MyNumber(this->value + num.value); n n n n n Cú pháp ví dụ trước tạo đối tượng tạm thời (temporary object) Khi trình biên dịch gặp đoạn mã này, hiểu đối tượng tạo nhằm mục đích làm giá trị trả về, nên tạo thẳng đối tượng bên (để trả về) - bỏ qua việc tạo huỷ đối tượng bên lời gọi hàm Chỉ có lời gọi đến constructor MyNumber (khơng phải copy-constructor) thay dãy lời gọi trước Quá trình gọi tối ưu hố giá trị trả Ghi nhớ: q trình khơng áp dụng tốn tử → sử dụng tạo đối tượng để trả Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 39 Đa hoá new & delete n Hàm new delete mặc định ngơn ngữ: Nếu đối tượng kích thước nhỏ, gây nhiều khối nhỏ => chậm ¨ Khơng đáng kể đối tượng có kích thước ln ă n => Toỏn t new v delete ớt tái định nghĩa Có cách đa hóa tốn tử new delete đa hóa cách toàn cục nghĩa thay hẳn toỏn t new v delete mc nh ă a nng hóa tốn tử new delete với tư cách hàm thành viên lớp muốn toán tử new delete áp dụng lớp ¨ n Khi dùng new delete lớp đó, trình biên dịch kiểm tra xem new delete có định nghĩa riêng cho lớp hay khơng; khơng dùng new delete tồn cục (có thể đa hóa) Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 40 Đa hoá new & delete n Hàm tốn tử tốn tử new delete có prototype sau: void * operator new(size_t size); void operator delete(void * ptr); ă Trong ú tham s kiu size_t trình biên dịch hiểu kích thước kiểu liệu trao cho tốn tử new n Ví d: ă a nng húa toỏn t new v delete ton cc ă a nng húa toỏn t new v delete cho lớp Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 41 Bài tập n Bài tập 4.1: Bổ sung vào lớp phân số phương thức sau: (Nhóm tạo hủy) n Khởi tạo mặc định phân số = n Khởi tạo với tử mẫu cho trước n Khởi tạo từ giá trị nguyên cho trước n Khởi tạo từ phân số khác (Nhóm tốn tử) n Tốn tử số học: +, -, *, /, =, +=, -= n Toán tử so sánh: >, =, >, , =, >, , =, >, , =, >, >, chậm ¨ Khơng đáng kể đối tượng có kích thước ln ă n => Toỏn t new v delete ớt... dịch kiểm tra xem new delete có định nghĩa riêng cho lớp hay khơng; khơng dùng new delete tồn cục (có thể đa hóa) Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 40 Đa hoá new & delete n Hàm

Ngày đăng: 05/12/2022, 19:27

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan