- from alpha to omega 4 Trả về giá trị của hàm (returning value from functions)
6. Quá tải hàm (function overloading)
C++ cho phép nhiều hàm trùng tên nhau trong cùng một phạm vi, miễn là danh sách tham số của chúng khác nhau (khác về số lượng tham số hoặc nếu cùng số lượng thì các tham số ở những vị trí tương ứng phải khác kiểu). Khả năng này được gọi là “quá tải hàm” (function overloading). Giả sử một hàm có tênoverloaded_func được quá tải thành tầm chục cái hàm cùng tên thì khi bắt gặp lời gọi hàm overloaded_func, compiler sẽ xem xét qua chục hàm này để tìm ra hàm phù hợp nhất dựa vào việc so sánh các đối số truyền vào với danh sách tham số ở header hàm (về số lượng cũng như kiểu ở các vị trí tương ứng). Ví dụ như chương trình sau:
C++ Code:
Lựa chọn code | Ẩn/Hiện code
#include <iostream>
using namespace std;
// khai báo ba hàm cùng tên
int min(int, int);
int min(int, int, int);
double min(double, double);
// hàm tính min 2 số nguyên
int min(int a, int b){
cout << "Call function 1: int min(int a, int b)" << endl; int minimum=a; if(b<minimum){ return b; } return minimum; } // hàm tính min 3 số nguyên
int min(int a, int b, int c){
cout << "Call function 2: int min(int a, int b, int c)" << endl; int minimum=a; if(b<minimum){ minimum=b; } if(c<minimum){ minimum=c; } return minimum; }
// hàm tính min hai số double
double min(double a, double b){
cout << "Call function 3: double min(double a, double b)" << endl; float minimum=a; if(b<minimum){ return b; } return minimum; }
// hàm main
int main(){
// gọi hàm thứ nhất
int x=min(2,5);
cout << x << endl << endl; // gọi hàm thứ hai
int y=min(2, 3, -1);
cout << y << endl << endl;
// gọi hàm thứ ba
double z=min(2.4, 5.2); cout << z << endl << endl;
return 0; }
Kết quả như sau: Trích dẫn:
Call function 1: int min(int a, int b) 2
Call function 2: int min(int a, int b, int c) -1
Call function 3: double min(double a, double b) 2.4
Khi quá tải hàm có tham số mặc định thì cần phải hết sức chú ý bởi vì rất dễ dẫn đến sự nhập nhằng. Ví dụ ta có hàm min được quá tải thành hai hàm như sau:
C++ Code:
Lựa chọn code | Ẩn/Hiện code
int min(int a, int b);
int min(int a, int b, int c=0);
nếu bắt gặp câu lệnh C++ Code:
Lựa chọn code | Ẩn/Hiện code
x=min(4, 6);
thì compiler không biết phải gọi hàm nào vì xét cả hai hàm đều hòan toàn hợp lệ. Nếu gọi hàm thứ nhất, min sẽ được truyền đủ 2 đối số và kết quả z=4. Còn nếu gọi hàm thứ hai, đối thứ 3 bị khuyết và được mặc định là 0, kết quả z=0. Điều này gây ra lỗi biên dịch.
Hết bài 7b
__________________
Vấn đề không phải là bước nhanh, mà là luôn luôn bước luôn bước
Đã được chỉnh sửa lần cuối bởi first_pace : 08-03-2011 lúc 03:20 PM.
07-03-2011, 09:00 PMfirst_pace first_pace Thành viên chính thức Ngày gia nhập: 02 2011 Nơi ở: Hà Nội Bài viết: 67 Hàm trong C++