STDIO
Tìm kiếm gần đây

    Nội dung

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

    04/02/2015
    29/06/2020
    Để 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.

    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ài viết liên quan

    Overloading Method - Nạp Chồng Hàm Trong Java

    Giới thiệu về cơ chế hoạt động nạp chồng hàm trong Java.

    Trương Diễm Hương17/08/2015

    template Trong C++

    Template là từ khóa trong C++, chúng ta có thể hiểu rằng là nó một kiểu dữ liệu trừu tượng, đặc trưng cho các kiểu dữ liệu cơ bản. Khi học về lập trình hướng đối tượng ...

    Trung Nguyễn21/09/2014

    Anonymous Function - Hàm Nặc Danh Và Hàm Nặc Danh Trong JavaScript

    Anonymous Function - function(){}; hay hàm nặc danh được sử dụng rất nhiều trong JavaScript (ngoài ra nó còn được xây dựng trong nhiều ngôn ngữ khác như C++11+, C#, Java, ...

    La Kiến Vinh15/09/2014

    Inline Functions Trong C++

    Bài viết giới thiệu về Inline function (hàm nội tuyến) trong ngôn ngữ lập trình C/C++. Có phải chăng inline functions là một loại function và được cải tiến hơn? Cùng đọc ...

    Amy Lê10/06/2015

    Ngôn Ngữ C++ - Lịch Sử Hình Thành Và Phát Triển

    C++ là một ngôn ngữ lập trình đa dụng – ta có thể dùng C++ để lập trình cho các hệ thống lớn, lập trình hệ điều hành cho đến các ứng dụng, game hay thậm chí ta có thể ...

    Vũ Quang Huy27/09/2014

    Function Objects Hay Functor Với C++

    Giới thiệu, cách sử dụng và ứng dụng Function Objects hay còn được gọi là Functor trong C++. Function Objects cũng khá lạ với điều này, function objects được hiện thực để ...

    La Kiến Vinh18/07/2014

    Khai Báo Hàm Với C/C++

    Hàm (Function) là một khái niệm vô cùng quen thuộc đối với lập trình viên. Vậy muốn sử dụng nó thì có bao nhiêu kiểu khai báo? Và khai báo như thế nào? Bài viết này sẽ ...

    Amy Lê29/06/2015

    Hàm Trong PHP

    Trong một chương trình, người ta thường chia chương trình thành những đoạn nhỏ được gọi là hàm. Việc xây dựng hàm để tránh rườm rà và mất thời gian, mỗi hàm thực hiện một ...

    Phạm Hoài Nguyên08/10/2016

    Con Trỏ Hàm Trong C/C++

    Tương tự Windows Form, trong những game được lập trình bằng C++ cũng có những Button, và để tạo ra chúng thì không đơn giản. Vì ngoài việc xử lý hình ảnh, ...

    Tuấn Trần18/08/2015

    Function Prototype

    Bài viết nhằm giúp cho các bạn hiểu rõ hơn về Function Prototype tron ngôn ngữ C/C++ và cách sử dụng của nó. Qua đó, bạn có thể tránh mắc phải những lỗi không đáng có ...

    Amy Lê04/07/2015

    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
    [email protected]

    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 - 2020