Hãy xem ví dụ sau →
1 2 3 4 5 |
void PlayWithNumber(int x) { … } void PlayWithNumber(float x) { … } : PlayWithNumber(1); : |
Cố gắng trả lời câu hỏi này: có hai hàm overloaded, vậy hàm nào là ứng cử viên tốt nhất cho lời gọi hàm ở trên ? Vâng, bạn đang hoàn toàn đúng (hy vọng thế 😆) – đó là hàm đầu tiên, với khai báo tham số là int x
Bây giờ chúng tôi thay đổi đoạn code trên một chút →
1 2 3 4 5 |
void PlayWithNumber(int x) { … } void PlayWithNumber(float x) { … } : PlayWithNumber(1.0); : |
Bây giờ hàm nào là ứng cử viên tốt nhất ? Bạn muốn nói rằng đó là hàm thứ hai phải không ? Xin lỗi, bạn đã sai. Không có ứng cử viên tốt cho việc gọi hàm như trên – tại sao ?
Vì 1.0 không phải là kiểu float, đó là kiểu double. Trình biên dịch ngôn ngữ C ++ cố gắng chuyển đổi kiểu dữ liệu cho tham số đầu vào nếu không tìm thấy tham số hàm có kiểu trùng khớp 100%. Và thật không may (thật ra, may mắn thay) việc chuyển đổi kiểu dữ liệu này chỉ chuyển từ kiểu dữ liệu độ chính xác thấp đến độ chính xác cao hơn hướng chứ không phải ngược lại. Điều đó có nghĩa là kiểu float có thể được chuyển thành kiểu double nhưng kiểu double thì không được chuyển thành kiểu float.
Trong trường hợp của chúng ta, trình biên dịch sẽ thông báo cho bạn rằng nó không thể tìm thấy ứng cử viên cho lời gọi hàm và biên dịch sẽ báo lỗi
Bạn có hai lựa chọn để xử lý:
- Viết thêm một hàm có tên là PlayWithNumber có một tham số kiểu double
- Cho trình biên dịch biết rằng số mà bạn truyền vào hàm là kiểu float; bạn có thể làm điều đó bằng cách thêm hậu tố f vào số, như sau:
1 |
PlayWithNumber(1.0f); |
Lúc này trình biên dịch sẽ không chửi bạn nữa.