Search…

Nạp Chồng Hàm (Function Overloading)

22/09/20203 min read
Hướng dẫn nạp chồng hàm - function overloading trong C++.

Đặ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ểu int nên trình biên dịch sẽ liên kết đến hàm int max(int a, int b)
  • Khi gọi max('A', 'B') cả 2 tham số đều là kiểu char nên trình biên dịch sẽ liên kết đến hàm char 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ề.
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024