Ở đây chỉ có 2 loại ngôn ngữ: 1 là người phàn nàn và 1 là người không ai sử dụng. Edsger W. Dijkstra
STDIO Để tiếp tục cho loạt bài viết về chương trình tự học ngôn ngữ lập trình của STDIO, bài viết hôm nay tôi sẽ giới thiệu về nạp chồng hàm. Vậy nạp chồng hàm là gì? Cách để sử dụng nó ra sao? Các bạn sẽ được biết điều đó ngay sau khi kết thúc bài viết này.
Nội dung bài viết

Giới thiệu

Nạp chồng hàm là gì? Cách để sử dụng nó ra sao? Các bạn sẽ được biết điều đó ngay sau khi kết thúc bài viết này.

Đặ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 (Đúng như mong muốn).

Vậy nếu thay dòng lệnh

int c = max(4, 5);

thành

int c = max(4.3, 5.5);

Kết quả nhận được lúc này là: c = 5 (Mong muốn là c = 5.5).

Trong trường hợp này, để có được kết quả mong muốn chúng ta 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ự ta cũng sẽ có:

double dmax(double a, double b)
{
      if(a > b) return a;
      else return b;
}

Hay

char cmax(char a, char b)
{
      if(a > b) return a;
      else return b;
}

Như vậy, ta 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 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

Nạp chồng hàm (Function Overloading) là một kiến thức khá mới mẻ đối với các bạn mới bắt đầu làm quen với C++. Bởi vì kiến thức này không hề tồn tại trong C mà chỉ có ở C++. Kỹ thuật 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ố.

Quay về với ví dụ trên

Nạp chồng hàm cho phép ta khai báo  và định nghĩa các hàm trên cùng với một tên gọi. Khi đó ta sẽ được:

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’)

đều được đáp ứng. Chương trình sẽ dựa vào kiểu của các tham số khi gọi để quyết định  chạy hàm tương ứng.

Ví dụ

Khi gọi max(4, 5) cả hai tham số đều là kiểu nguyên nên chương trình sẽ gọi hàm

int max(int a, int b);

Tương tự khi gọi max(‘A’, ‘B’) chương trình sẽ gọi.

char max(char a, char b);

Dễ dàng nhận ra rằng trong nạp chồng hàm, khi muốn khai báo 2 hàm cùng tên thì ít nhất trong danh sách tham số của chúng phải có một cặp tham số có kiểu khác nhau.

Ngoài ra còn một 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 chạy 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ề.

Tham khảo

  • http://en.wikipedia.org/wiki/Function_overloading
  • https://msdn.microsoft.com/en-us/library/5dhe1hce.aspx

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG