Về đa Năng Hóa Hàm Và đa Năng Hóa Toán Tử | Facebook

FacebookTham gia hoặc đăng nhập Facebook   Email hoặc điện thoạiMật khẩuBạn quên tài khoản ư?Đăng nhậpBạn có muốn tham gia Facebook không?Đăng kýĐăng kýVề đa năng hóa hàm và đa năng hóa toán tửVũ Tuấn Hải·Thứ Bảy, 6 tháng 4, 2019·Nhóm công khai#StudyWithMe #OOPBài viết trước đó:Một vài chú ý nhỏ để học Lập trình hướng đối tượng tốt hơn Về constructor & destructorLàm thế nào để cùng một hàm nhưng chúng ta có thể sử dụng với nhiều kiểu dữ liệu khác nhau, làm thế nào để chương trình hiểu được việc thực hiện các toán tử giữa chúng? Đa năng hóa toán tử ^& đa năng hóa hàm là gì, tất cả sẽ được giới thiệu trong bài viết này.
  1. Đa năng hóa hàm là gì?
Đa năng hóa hàm (function overloading) là thao tác định nghĩa lại một hàm nhưng với tham số khác, tức là cùng một mục đích, cùng một công việc nhưng sẽ có cách xử lý khác nhau với mỗi loại đối tượng. Ví dụ: một người bán hàng thực hiện hành động là bán hàng, nhưng cách thức bán hàng sẽ khác nếu đối tượng mua là trẻ em hay người lớn.
Ví dụ:class A { public: void Xuat(); void Xuat(const &A);}Tại sao phải dùng hàm đa năng?Có sử dụng hàm đa năng hay không thực sự không ảnh hướng đến việc chương trình có thực hiện được việc đó hay không mà liên quan đến việc bạn có code được hay không nhiều hơn. Giả sử bạn có 1 class bao gồm 10 phương thức, nhưng mỗi phương thức lại có 5 kiểu tham số khác nhau nên bạn phải viết thêm ... 40 hàm có tên gọi khác 😰. Lúc này bạn cần phải nhớ tên hàm này tương ứng với chức năng nào, tham số nào. Khi nào hàm đa năng không phải là đa năng?
  • Hàm đa năng phải được khai báo cùng phạm vị (tầm vực), bởi nếu không, cách gọi giữa chúng sẽ có sự khác biệt, do đó không đúng với mục tiêu đề ra cho lắm.
  • Không định nghĩa lại hàm đa năng cùng tham số đã được định nghĩa, mặc dù khác tên tham số (Khác tên không có ý nghĩa). Ví dụ: void foo (int A) và void foo (int B)
  • Không định nghĩa lại hàm đa năng khác kiểu trả về. Ví dụ: void foo () và int foo()
2. Đa năng hóa toán tử là gì?Đa năng hóa toán tử thực ra cũng là đa năng hóa hàm, chỉ khác biệt một chút về cú pháp thôi. Ví dụ: void TangMotGiay (int Giay) (đa năng hóa hàm) int operator ++ (int Giay) (đa năng hóa toán tử).Tại sao phải đa năng hóa toán tử?Đa năng hóa toán tử không là gì khác ngoài giúp code của chúng ta clean hơn.Ví dụ: bạn muốn thực hiện phép toán cộng 4 phân số, bạn phải gọi hàm ps1. CongPhanSo(ps2). CongPhanSo(ps3). CongPhanSo(ps4) .... trong rất cồng kềnh phải không nào? Nếu đã ovẻloading operator, ta chỉ cần gõ: ps = ps1 + ps2 + ps3 + ps4 Điểm đặc biệt:
  • Tên của đa năng hóa toán tử theo công thức: operator + ký hiệu toán tử, ví dụ: operator+, operator>>, ...
  • Tham số truyền vào sẽ quyết định toán tử được overload đó được sử dụng cho đối tượng nào
  • Kiểu trả về của hàm bắt buộc phải tương ứng với toán tử overload, ví dụ PhanSo operator+ (PhanSo ps1, PhanSo ps2), ...
Toán tử nhập xuất: Nhập xuất là toán tử đặc biệt vì nó liên quan đến đối tượng istream và ostream. Khi overload toán tử này, có một số điểm khác biệt như sau:istream& operator>> (istream& is, Date& dt){ is >> dt.mo >> dt.da >> dt.yr; // Có thể thêm các dòng cout xen giữa return is;}Có thêm đối tượng istream và kiểu trả về là istream. Istream là gì? Nói về nó khá dài nên mình sẽ nói về nó ở bài viết sau, nhưng mà trước mắt thì chúng ta cần ghi nhớ thứ này.Tương tự với toán tử <<ostream& operator<<(ostream& os, const Date& dt){ os << dt.mo << '/' << dt.da << '/' << dt.yr; return os;}Một lưu ý là khi khai báo, chúng ta phải thêm từ khóa friend để đánh dấu là lớp khác có thể sử dụng được, nguyên do là đối tượng trực tiếp sử dụng toán tử này không phải là đối tượng thuộc class khai báo nó mà là cin/cout (đối tượng thuộc lớp i/ostream)Phân biệt giữa phương thức khởi tạo sao chép và toán tử gán =Khi một đối tượng được khởi tạo bằng chính đối tượng đó (PhanSo ps1(ps2)) thì phương thức khởi tạo sao chép mặc định sẽ được, copy từng byte dữ liệu của ps2 sang cho ps1, điều này cực kì nguy hiểu nếu đối tượng của chúng ta có chứa pointer, 2 đối tượng mà xài chung 1 pointer thì bug tiềm tàng rất lớn. Đối với toán tử gán, tình trạng tương tự cũng xảy ra, nếu chúng ta không overload lại. Kết quả thực hiện của cả hai là đều trả về giá trị của con trỏ this (*this).Mục đích của 2 thứ kể trên có vẻ giống nhau nhưng mục đích lại khác.
  • Toán tử gắn thay thế toàn bộ nội dung của đối tượng đã tồn tại
  • Hàm khởi tạo sao chép sẽ tạo ra một đối tượng mới
Ví dụ:PhanSo ps1 (ps2); // Copy constructor được gọiPhanSo ps1 = ps2; // Copy constructor được gọips1 = ps2; // Toán tử = được gọiNhững toán tử không thể overloadNhững toán tử này bản thân chúng không nhận vào tham số hoặc khi overload làm mâu thuẫn nội tại nên chúng ta không thể overload. Danh sách bao gồm toán tử truy cập thành viên ., toán tử phạm vi ::, ...
Ví dụ:class Y {public: void f();};class X { Y* p; Y& operator.() { return *p; } void f();};void g(X& x){ x.f(); // Chương trình biết gọi f() của class X hay f() của class Y?}Như vậy bài viết thứ tư trong series OOP về function overloading & operator overloading đã kết thúc, mong các bạn vận dụng những kiến thức này để làm những bài tập về OOP dễ dàng hơn. Cảm ơn các bạn đã theo dõi, BHT Đoàn khoa Công Nghệ Phần Mềm chúc các bạn học tốt và có một buổi tối vui vẻ! 😁 Tài liệu tham khảo: 1. Tài liệu hướng dẫn Lập trình hướng đối tượng, ĐH CNTT, ĐHQG TPHCM.2. StackOverflowTài liệu học & đề thi: https://tinyurl.com/a3vg6aQGroup để các bạn thoải mái hỏi đáp: https://www.facebook.com/groups/bht.cnpm.uit/
  • Tiếng Việt
  • English (UK)
  • 中文(台灣)
  • 한국어
  • 日本語
  • Français (France)
  • ภาษาไทย
  • Español
  • Português (Brasil)
  • Deutsch
  • Italiano
  • Đăng ký
  • Đăng nhập
  • Messenger
  • Facebook Lite
  • Video
  • Địa điểm
  • Trò chơi
  • Marketplace
  • Meta Pay
  • Cửa hàng trên Meta
  • Meta Quest
  • Ray-Ban Meta
  • Meta AI
  • Instagram
  • Threads
  • Chiến dịch gây quỹ
  • Dịch vụ
  • Trung tâm thông tin bỏ phiếu
  • Chính sách quyền riêng tư
  • Trung tâm quyền riêng tư
  • Nhóm
  • Giới thiệu
  • Tạo quảng cáo
  • Tạo Trang
  • Nhà phát triển
  • Tuyển dụng
  • Cookie
  • Lựa chọn quảng cáo
  • Điều khoản
  • Trợ giúp
  • Tải thông tin liên hệ lên & đối tượng không phải người dùng
  • Cài đặt
  • Nhật ký hoạt động
Meta © 2024

Từ khóa » Toán Tử Istream