Nạp chồng hàm trong C++ và cách thay thế trong C
Trong bài học này, bạn sẽ dùng nạp chồng hàm (function overloading) trong C++ để cùng một tên hàm làm việc với nhiều kiểu dữ liệu, rồi so sánh với cách làm trong C.
Giới thiệu
Nạp chồng hàm (function overloading) cho phép nhiều hàm có cùng tên nhưng khác kiểu tham số. Khi gọi hàm, trình biên dịch C++ tự chọn phiên bản phù hợp dựa trên kiểu của đối số. C không hỗ trợ tính năng này, nên mỗi hàm phải có một tên riêng.
Những điểm quan trọng
- Hiểu cách làm trong C trước khi học các công cụ trừu tượng của C++.
- Dùng RAII và ngữ nghĩa giá trị (value semantics) để thể hiện quyền sở hữu tài nguyên.
- Ưu tiên các công cụ an toàn kiểu của C++ thay vì macro và ép kiểu.
Code ví dụ bằng C và C++
#include <stdio.h>
int max_int(int left, int right) {
return left > right ? left : right;
}
double max_double(double left, double right) {
return left > right ? left : right;
}
int main(void) {
printf("%d %.1f\n", max_int(3, 8), max_double(4.5, 2.0));
}
8 4.5
#include <iostream>
int maximum(int left, int right) {
return left > right ? left : right;
}
double maximum(double left, double right) {
return left > right ? left : right;
}
int main() {
std::cout << maximum(3, 8) << ' '
<< maximum(4.5, 2.0) << '\n';
}
8 4.5
So sánh C và C++
Trong C, hai hàm max_int và max_double phải ghi rõ kiểu dữ liệu trong tên. Trong C++, cả hai đều tên là maximum, và trình biên dịch chọn đúng phiên bản dựa trên đối số là int hay double. Việc lựa chọn này diễn ra lúc biên dịch nên không làm chương trình chạy chậm hơn.
C dùng quy ước đặt tên, callback, macro và struct chứa ngữ cảnh.
C++ có sẵn các công cụ trừu tượng có phạm vi rõ ràng, an toàn kiểu và thường không tốn thêm chi phí khi chạy.
Bài tập mở rộng
Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.
- Tự viết cơ chế bằng C trước, rồi mới dùng tính năng tương ứng của C++.
- Thay việc giải phóng tài nguyên thủ công bằng RAII.
- Kiểm tra xem tính năng có phát sinh cấp phát bộ nhớ hoặc lời gọi hàm ảo hay không.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
Tất cả thử thách