Bài giảng Lập trình Hướng đối tượng - Chương 4: Định nghĩa toán tử trên lớp - Lê Đức Thịnh

ppt 25 trang hoanguyen 3850
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình Hướng đối tượng - Chương 4: Định nghĩa toán tử trên lớp - Lê Đức Thịnh", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptbai_giang_lap_trinh_huong_doi_tuong_chuong_4_dinh_nghia_toan.ppt

Nội dung text: Bài giảng Lập trình Hướng đối tượng - Chương 4: Định nghĩa toán tử trên lớp - Lê Đức Thịnh

  1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG LÊ ĐỨC THỊNH
  2. Chương IV: ĐỊNH NGHĨA TOÁN TỬ TRÊN LỚP 1. Giới thiệu chung 2. Ví dụ trên lớp số phức 3. Khả năng và giới hạn của định nghĩa chồng toán tử 4. Chiến lược sử dụng hàm toán tử 5. Một số ví dụ tiêu biểu 6. Chuyển đổi kiểu
  3. 1. Giới thiệu chung ◼ Có thể định nghĩa chồng đối với hầu hết các phép toán trên các lớp. ◼ Một trong số các toán hạng tham gia là các đối tượng. ◼ Định nghĩa hoạt động của từng phép toán giống như định nghĩa một hàm, ở đây gọi là hàm toán tử. ◼ Tên của hàm toán tử: operator ◼ Hàm toán tử có thể là hàm thành phần hoặc là hàm tự do (hàm bạn).
  4. 2. Ví dụ trên lớp số phức 2.1 Hàm toán tử là hàm thành phần class complex { complex operator+(complex b) { complex c; c.real = real + b.real; c.image = image + b.image; return c; } }
  5. void main() { complex a(-2, 5), b(3, 4), c; c = a+b; //a.operator+(b) }
  6. 2.2 Hàm toán tử là hàm bạn class complex { complex operator+(complex b) { } //hàm tự do operator+ định nghĩa phép toán + giữa một số thực và một đối tượng số phức friend complex operator+(float x, complex b); }
  7. complex operator+(float x, complex b) { complex c; c.real = x + b.real; c.image = b.image; return c; }
  8. 3. Khả năng và giới hạn của định nghĩa chồng toán tử 3.1 Phần lớn toán tử trong C++ đều có thể định nghĩa chồng void main() { complex a(-2, 5), b(3, 4), c, d; c = a+b; //a.operator+(b) d = 3+a; //operator+(3, a) } ◼ a+3.5 khác với 3.5+a
  9. ◼ Một trong các toán hạng phải là đối tượng. ◼ Hàm toán tử phải: ◼ hoặc là hàm thành phần, khi đó hàm đã có một tham số ngầm định chính là đối tượng gọi hàm. ◼ hoặc là hàm tự do, khi đó, phải có một tham số có kiểu lớp. ◼ phép =, [] phải được định nghĩa là thành phần. ◼ phép > dùng với cin, cout phải được định nghĩa là hàm bạn. ◼ phép toán ++, có thể sử dụng theo 2 cách: dạng hậu tố a++, b và dạng hậu tố ++a, b.
  10. 3.2 Trường hợp các toán tử ++ và ◼ Dạng tiền tố ◼ operator++() ◼ operator () ◼ Dạng hậu tố ◼ operator++(int) ◼ operator (int)
  11. 4. Chiến lược sử dụng hàm toán tử ◼ Tránh lạm dụng ◼ Các phép toán một ngôi ◼ Các phép toán 2 ngôi ◼ Các phép gán ◼ Toán tử truy nhập thành phần “->” ◼ Toán tử truy nhập thành phần theo chỉ số ◼ Toán tử gọi hàm
  12. 5. Một số ví dụ tiêu biểu 5.1 Định nghĩa chồng phép gán “=“ 5.2 Định nghĩa chồng phép “[]” 5.3 Định nghĩa chồng > 5.4 Định nghĩa chồng các toán tử new và delete 5.5 Phép nhân ma trận vectơ
  13. 6. Chuyển đổi kiểu ◼ 2 cách thức định nghĩa phép chuyển kiểu: ngầm định và tường minh. ◼ Phép chuyển kiểu ngầm định được định nghĩa bằng một hàm thiết lập chuyển kiểu. ◼ Phép chuyển kiểu tường minh được xác định thông qua toán tử ép kiểu. class A { operator B() // ép kiểu A thành B { } }
  14. 6.1 Hàm toán tử chuyển kiểu ép buộc class complex { complex(float r) // hàm thiết lập đóng vai trò một hàm toán tử chuyển kiểu tự động { real=r; image=0; } operator float() // Hàm toán tử chuyển kiểu ép buộc { return real; } };
  15. void main() { complex a(-2, 5), b(3, 4), d, e; d = 3+c; e = complex(3)+c; } ◼ lệnh 2: chuyển c thành số thực rồi thực hiện phép cộng 2 số thực ◼ lệnh 3: phép cộng 2 số phức
  16. 6.2 Hàm toán tử chuyển đổi kiểu cơ sở sang kiểu lớp. complex e=10; ◼ Tạo ĐT tạm kiểu complex (thực =10, ảo = 0), rồi sao chép sang ĐT e. complex a; a=1; ◼ Tạo ĐT tạm kiểu complex (thực =1, ảo =0), rồi gán cho a. fct(complex); //khai báo fct(4); //lời gọi ◼ 4 được chuyển thành ĐT tạm kiểu complex để truyền cho hàm fct().
  17. 6.2.1 Hàm thiết lập trong các chuyển đổi kiểu liên tiếp complex a; a=2; //xảy ra chuyển kiểu liên tiếp int → float → complex ◼ 2 từ int sẽ được chuyển thành float, rồi float thành complex.
  18. 6.2.2 Lựa chọn giữa hàm thiết lập và phép toán gán class complex { complex(float r) //hàm thiết lập chuyển kiểu { real=r; image=0; } complex& operator=(complex& b) //toán tử gán complex→complex { real=b.real; image=b.image; } complex& operator=(float x) //toán tử gán float→complex { real=x; image=0; } };
  19. void main() { complex a; a=12; //chuyển kiểu 12 thành complex rồi gán complex→complex hay gán trực tiếp float→complex } ◼ Lớp complex có hàm thiết lập chuyển kiểu complex(float), 2 toán tử gán operator=(complex) và operator=(float) ◼ Quy tắc: Các chuyển đổi do người sử dụng định nghĩa chỉ được thực hiện khi cần thiết. ◼ Toán tử gán operator=(float) sẽ được ưu tiên hơn. ➔ Gán trực tiếp float→complex
  20. 6.2.3 Sử dụng hàm thiết lập để mở rộng ý nghĩa một phép toán class complex { complex(float r) //hàm thiết lập chuyển kiểu { real=r; image=0; } friend complex operator+(complex a, complex b); //toán tử cộng là hàm bạn }; complex operator+(complex a, complex b) { complex c(0,0); c.real = a.real+b.real; c.image = a.image+b.image; return c; }
  21. void main() { complex a(3, 4), b(9, 4); a = b+5; //OK: chuyển 5 thành complex trước khi cộng a = 2+b; //OK: chuyển 2 thành complex trước khi cộng } ◼ Lớp complex có hàm thiết lập chuyển kiểu complex(float), toán tử operator+(complex, complex) là hàm bạn. ◼ Trong main(), phép cộng float và complex, complex và float, complex và complex đều thực hiện được.
  22. 6.3 Chuyển đổi kiểu từ lớp này sang một lớp khác 6.3.1 Hàm toán tử chuyển kiểu bắt buộc class point { operator complex(); //chuyển đổi point → complex }; class complex { friend point::operator complex(); }; point::operator complex() { complex r(x, y); return r; }
  23. void main() { point a(2, 5); complex c; c=a; //a chuyển tự động thành complex trước khi gán } ◼ Lớp point có toán tử ép kiểu complex. ◼ Toán tử này là hàm bạn của hàm complex để có thể truy xuất các thành phần của lớp complex. ◼ Trong main(), lệnh 2: a bị ép kiểu sang complex, lệnh 4: b được chuyển kiểu tự động từ point thành complex trước khi gán.
  24. 6.3.2 Hàm thiết lập dùng làm hàm toán tử class point; //khai báo trước lớp complex class complex { complex(point); }; class point { friend complex::complex(); }; complex::complex(point p) { real = p.x; image = p.y; }
  25. void main() { point a(3, 5); complex c=a; } ◼ Lớp complex có hàm thiết lập một tham số complex(point). ◼ Hàm này là hàm bạn của lớp point để có thể truy xuất vào các thành phần của lớp point. ◼ Trong hàm main(), lệnh 2: ĐT c được tạo ra bằng hàm thiết lập complex(point).