Bài viết này giải thích toán tử chuyển đổi (conversion operator) trong C++. C++ hỗ trợ lập trình hướng đối tượng, cho phép tạo lớp mô phỏng đối tượng thực tế như các kiểu dữ liệu cụ thể.
Tại sao cần toán tử chuyển đổi?
Đôi khi cần chuyển đối tượng của một lớp sang kiểu khác hoặc kiểu nguyên thủy. Toán tử chuyển đổi cho phép định nghĩa cách ép kiểu ngầm (implicit conversion) tự động xảy ra khi gán hoặc truyền đối tượng vào ngữ cảnh mong đợi kiểu đích.
Ví dụ: Lớp số phức
Lớp My_Complex lưu phần thực và ảo. Toán tử operator double() trả về độ lớn (magnitude) khi đối tượng được dùng ở nơi cần double.
Mã nguồn
#include <iostream>
#include <cmath>
using namespace std;
class My_Complex {
private:
double real, imag;
public:
My_Complex(double re = 0.0, double img = 0.0) : real(re), imag(img) {}
double mag() { return getMagnitude(); }
operator double() { return getMagnitude(); } // Toán tử chuyển đổi
private:
double getMagnitude() { return sqrt(real*real + imag*imag); }
};
int main() {
My_Complex complex(10.0, 6.0);
cout << "Magnitude using normal function: " << complex.mag() << endl;
cout << "Magnitude using conversion operator: " << complex << endl;
return 0;
}
Kết quả
Magnitude using normal function: 11.6619 Magnitude using conversion operator: 11.6619
Cơ chế hoạt động
- Cú pháp:
operator kiểu_đích() { ... }– không khai báo kiểu trả về, không tham số. - Khi trình biên dịch gặp biểu thức cần kiểu
doublemà có đối tượngMy_Complex, nó tự động gọioperator double(). - Ví dụ:
double d = complex;hoặccout << complex(nạp chồngoperator<<chodouble).
Cảnh báo & Thực hành tốt (C++11 trở đi)
- Toán tử chuyển đổi ngầm có thể gây lỗi khó tìm (ví dụ: chuyển sang
booldẫn đến logic sai). - Dùng
explicitđể buộc ép kiểu tường minh:explicit operator double() { return getMagnitude(); }Khi đó:double d = static_cast<double>(complex);– ép kiểu ngầm bị cấm. - Ưu tiên cung cấp hàm thành viên có tên rõ nghĩa (
magnitude(),toDouble()) thay vì toán tử chuyển đổi ngầm.