STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ
    Nội dung
    0
    0
    Chia sẻ

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

    Hướng dẫn nạp chồng hàm - function overloading trong C++.
    04/02/2015 22/09/2020 3 phút đọc
    Nạp Chồng Hàm (Function Overloading)

    Đặ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ề.
    0 Bình luận
    Modern C++

    Modern C++

    STDIO Training - Đào Tạo Lập Trình C++.

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021