Việc tồn tại hai hoặc nhiều hơn các hàm có cùng tên nhưng khác số lượng đối số được gọi là nạp chồng hàm (Function Overloading). Trong bài này, bạn sẽ học về nạp chồng hàm có kèm theo ví dụ.
Hàm được dùng để chỉ một đoạn mã nguồn được nhóm lại nhằm thực thi một tác vụ nhất định.
Trong lập trình C++, hai hàm có thể có cùng tên nếu số lượng và/hoặc kiểu đối số truyền vào là khác nhau.
Các hàm có số lượng hoặc kiểu (hoặc cả hai) đối số khác nhau đó được gọi là các hàm bị nạp chồng. Ví dụ:
int test() { }
int test(int a) { }
float test(double a) { }
int test(int a, double b) { }
Ở đây, toàn bộ 4 hàm đều là hàm bị nạp chồng vì đối số truyền vào các hàm đó là khác nhau.
Lưu ý rằng, kiểu trả về của toàn bộ 4 hàm là không giống nhau. Hàm bị nạp chồng có thể có hoặc không có kiểu trả về khác nhau, nhưng nó nên có số lượng đối số khác nhau.
//mã nguồn không hợp lệ
int test(int a) { }
double test(int b){ }
Số lượng và kiểu của các đối số được truyền vào hai hàm trên là giống nhau mặc dù kiểu trả về là khác nhau. Vì vậy trình biên dịch sẽ báo lỗi.
Ví dụ 1: Nạp chồng hàm
#include <iostream>
using namespace std;
void display(int);
void display(float);
void display(int, float);
int main() {
int a = 5;
float b = 5.5;
display(a);
display(b);
display(a, b);
return 0;
}
void display(int var) {
cout << "Integer number: " << var << endl;
}
void display(float var) {
cout << "Float number: " << var << endl;
}
void display(int var1, float var2) {
cout << "Integer number: " << var1;
cout << " and float number:" << var2;
}
Đầu ra
Integer number: 5 Float number: 5.5 Integer number: 5 and float number: 5.5 |
Ở đây, hàm display() được gọi 3 lần với các kiểu và số lượng đối số khác nhau.
Kiểu trả về của cả ba hàm này là giống nhau, nhưng điều này là không cần thiết.
Ví dụ 2: Nạp chồng hàm
// Chương trình để tính giá trị tuyệt đối
// Dùng được với cả số nguyên và số thực
#include <iostream>
using namespace std;
int absolute(int);
float absolute(float);
int main() {
int a = -5;
float b = 5.5;
cout << "Absolute value of " << a << " = " << absolute(a) << endl;
cout << "Absolute value of " << b << " = " << absolute(b);
return 0;
}
int absolute(int var) {
if (var < 0)
var = -var;
return var;
}
float absolute(float var){
if (var < 0.0)
var = -var;
return var;
}
Đầu ra
Absolute value of -5 = 5
Absolute value of 5.5 = 5.5 |
Trong ví dụ trên, hai hàm absoluate() đã được nạp chồng.
Cả hai hàm đều nhận vào một đối số duy nhất. Tuy nhiên, một hàm nhận số nguyên làm đối số trong khi hàm còn lại nhận đối số là số thực.
Khi hàm absolute() được gọi với số nguyên là đối số, hàm này sẽ được gọi:
int absolute(int var) {
if (var < 0)
var = -var;
return var;
}
Khi hàm absolute() được gọi với đối số là số thực, hàm này sẽ được gọi:
float absolute(float var){
if (var < 0.0)
var = -var;
return var;
}