Giới thiệu
Ngôn ngữ C++ thừa kế và mở rộng chức năng của các toán tử trong C, cho phép người Develop overload các toán tử để thích ứng với các class tự định nghĩa. Điều này không chỉ làm mã nguồn logic hơn mà còn tăng tính dễ đọc và dễ sử dụng. Trong bài viết này, chúng ta sẽ tìm hiểu về overloading toán tử và toán tử chuyển đổi, dựa trên nội dung Chương 42 của quyển sách "C++ Primer".
Overloading toán tử
C++ cho phép overload toán tử để định nghĩa cách các class tự định nghĩa xử lý các toán tử. Ví dụ: Chúng ta có thể overload toán tử cộng `+` cho một class phân số để thực hiện phép cộng hai phân số.
Overloading toán tử cho class phân số
Sách sử dụng một class phân số `thuc_rational` để minh họa việc overload toán tử. Class này bao gồm constructor, các hàm truy cập tử số và mẫu số, cùng các hàm overload toán tử. Ví dụ, để overload toán tử nhân `*`:
thuc_rational operator*(const thuc_rational& phan_so) const {
return thuc_rational(tu_so * phan_so.tu_so, mau_so * phan_so.mau_so);
}
Bằng cách này, ta có thể viết `a * b` để nhân hai phân số.
Các vấn đề tiềm ẩn khi overload toán tử
Overloading toán tử mang lại nhiều lợi ích nhưng cũng có thể gây ra các vấn đề không mong muốn. Ví dụ, việc overload các toán tử chuyển đổi ẩn có thể gây ra các chuyển đổi type không mong muốn:
thuc_rational r;
std::cout << r * 2; // Lỗi biên dịch do cách hiểu không mong muốn
Giải pháp là định nghĩa các hàm chuyển đổi rõ ràng hoặc sử dụng các toán tử chuyển đổi explicit:
explicit operator double() const {
return static_cast<double>(tu_so) / mau_so;
}
Toán tử chuyển đổi
Toán tử chuyển đổi cho phép chuyển đổi class sang các kiểu dữ liệu khác. Chúng có thể implicit hoặc explicit, nhưng cần sử dụng thận trọng để tránh các hành vi không mong muốn.
Toán tử chuyển đổi explicit
Toán tử explicit giúp kiểm soát tốt hơn việc chuyển đổi type:
explicit operator double() const {
return static_cast<double>(tu_so) / mau_so;
}
Đối tượng hàm
Đối tượng hàm là các instance của class có overload toán tử gọi hàm `()`. Chúng được sử dụng rộng rãi trong STL, ví dụ như tham số cho các thuật toán.
Sách đã trình bày một ví dụ về vẽ đồ thị hàm số:
ham_duoi_bac_hai f(1, 3, 2);
std::cout << f(2); // In kết quả của f(2)
Qua đó, ta có thể đóng gói kiến thức chuyên sâu vào một đối tượng hàm, làm mã nguồn rõ ràng và dễ hiểu hơn.