Đặt vấn đề
Xét ví dụ
Chương tìm số lớn nhất trong 2 số nguyên:
#include <iostream> int max(int a, int b) { if(a > b) return a; else return b; } int main() { int c = max(4, 5); std::cout << "c = " << c; return 0; }
Khi chạy chương trình trên kết quả nhận được là: c = 5
.
Nếu thay dòng int c = max(4, 5)
thành int c = max(4.3, 5.5)
Kết quả nhận được là: c = 5
nhưng kết quả mong muốn là c = 5.5
.
Trong trường hợp này, để có được kết quả mong muốn phải viết hàm mới để tính max
của 2 số thực.
float fmax(float a, float b) { if(a > b) return a; else return b; }
Tương tự cũng sẽ có double
hay char
nếu như cần sử dụng kiểu dữ liệu này.
double dmax(double a, double b) { if(a > b) return a; else return b; }
char cmax(char a, char b) { if(a > b) return a; else return b; }
Như vậy, sẽ có nhiều hàm với các tên gọi khác nhau. Việc sử dụng tên như vậy sẽ gây bất lợi về mặt tổ chức cho người lập trình khi gọi hàm. Nạp chồng hàm ra đời để giải quyết vấn đề trên.
Nạp chồng hàm - Function Overloading
Nạp chồng hàm là một tính năng được hỗ trợ thêm trong C++, tính năng này không tồn tại trong C. Tính năng này cho phép sử dụng cùng một tên gọi cho các hàm giống nhau (có cùng mục đích). Nhưng khác nhau về kiểu dữ liệu tham số hoặc số lượng tham số.
Ví dụ về nạp chồng hàm
Nạp chồng hàm cho phép khai báo và định nghĩa các hàm cùng với một tên gọi nhưng khác tham số:
int max(int a, int b) { if(a > b) return a; else return b; } float max(float a, float b) { if(a > b) return a; else return b; } double max(double a, double b) { if(a > b) return a; else return b; } char max(char a, char b) { if(a > b) return a; else return b; }
Và khi gọi hàm ở bất kỳ dạng nào như:
max(4, 5) max(4.3, 5.5) max('A', 'B')
thì trình biên dịch sẽ tự động nhận dạng và tạo ra lời gọi hàm đến hàm cần thiết dựa vào kiểu dự liệu trong tham số truyền vào hàm.
Diễn giải
- Khi gọi
max(4, 5)
cả 2 tham số đều là kiểuint
nên trình biên dịch sẽ liên kết đến hàmint max(int a, int b)
- Khi gọi
max('A', 'B')
cả 2 tham số đều là kiểuchar
nên trình biên dịch sẽ liên kết đến hàmchar max(char a, char b)
Ngoài ra còn 1 trường hợp khác cũng cho phép khai báo và định nghĩa 2 hàm cùng tên, đó là số lượng tham số của chúng phải khác nhau.
Ví dụ
int max(int a, int b); //tính max 2 số nguyên int max(int a, int b, int c); //tính max 3 số nguyên
Trong trường hợp này khi gọi hàm, chương trình sẽ dựa vào số lượng tham số khi gọi để quyết định gọi hàm tương ứng.
Kết luận
- Có thể nạp chồng hàm nếu như kiểu của tham số trong hàm phải khác nhau hoặc có số lượng các tham số khác nhau.
- Không thể nạp chồng hàm nếu như chỉ khác biệt về kiểu trả về.