Đặt vấn đề
Xét ví dụ sau:
#include <iostream> int sum(int a, int b, int c, int d) { return (a + b + c + d); } int main() { int s = sum(1, 3, 4, 5); std::cout << "Tong la: " << s; return 0; }
Hàm sum
trong chương trình trên thực hiện việc tính tổng 4 số nguyên. Tuy nhiên, chỉ cần tính tổng của 2 hay 3 số nguyên mà không phải là 4 số nguyên. Vấn đề được giải quyết khi viết thêm một hàm tính 2 số nguyên và 3 số nguyên khác. Hoặc cũng có thể gọi hàm với giá trị có tham số bằng 0 như sau:
int s = sum(1, 2, 0, 0);
Lời gọi hàm như vậy sẽ giúp tính được tổng 2 số nguyên một và 2 từ hàm tính tổng 4 số nguyên ở trên. Một vấn đề khác được đặt ra khi trong chương trình có quá nhiều lần hàm được gọi để tính tổng 2 số nguyên. Như vậy, cứ mỗi lần gọi hàm, lúc nào cũng phải viết thêm 2 tham số ngầm định giá trị 0 ở sau.
Đó là trường hợp với ví dụ trên. Trong thực tế, hãy thử tưởng tượng nếu một hàm được gọi nhiều lần với nhiều tham số có giá trị ngầm định (không thay đổi giá trị qua các lần gọi). Mỗi lần như vậy lúc nào cũng phải viết thêm một danh sách dài các tham số có giá trị giống nhau. Đó thật sự là một công việc không mấy thú vị. Từ đó hàm có tham số với giá trị ngầm định được C++ mở rộng ra (so với C) để giải quyết vấn đề này.
Hàm có tham số với giá trị ngầm định
Cú pháp
<Kiểu hàm> <Tên hàm> (t/s1, t/s2, ..,t/sn, t/smd1 = gt1, t/smd2 = gt2,…, t/smdn = gtn);
Trong đó
-
t/s1
,t/s2
,…,t/sn
là các tham số được khai báo bình thường. Tức là gồm có kiểu dữ liệu và tên tham số. -
Các tham số ngầm định
t/smd1
,t/smd2
, ..,t/smdn
có gán thêm các giá trị ngầm địnhgt1
,gt2
,…,gtn
.
Một lời gọi bất kỳ đến hàm này đều phải có đầy đủ các tham số ứng với t/s1
,…, t/sn
(không phải tham số ngầm định). Nhưng có thể có hoặc không các tham số ngầm định ứng với t/smd1
,…,t/smdn
. Nếu tham số nào không có thì nó sẽ tự động gán với giá trị ngầm định đã khai báo.
Ví dụ
Xét hàm tính lũy thừa
int exponential(int x, int n = 2);
Hàm này có một tham số có giá trị ngầm định là số mũ n
. Nếu lời gọi hàm bỏ qua số mũ này thì chương trình sẽ hiểu là n = 2
và tính bình phương của x
.
Khi gọi int e = exponential(4, 3);
chương trình sẽ tính e = 43
Khi gọi int e = exponential(4);
chương trình sẽ tính e = 42
Xét hàm tính tổng 4 số nguyên
int sum(int a, int b, int c = 0, int d = 0);
Có thể
- tính tổng của 4 số nguyên: 1, 2, 3, 4 bằng cách gọi hàm
sum(1, 2, 3, 4)
- tính tổng 3 số nguyên 1, 2, 3 bằng cách gọi
sum(1, 2, 3)
- tính tổng 2 số nguyên 1, 2 bằng cách gọi
sum(1, 2)
Lưu ý
Các tham số với giá trị ngầm định phải được khai báo liên tục và xuất hiện cuối cùng trong danh sách tham số.
Ví dụ
int sum(int a, int b = 0, int c, int d = 0);
Trường hợp này sai vì các tham số có giá trị ngầm định không liên tục.
int sum(int a, int b = 0, int c = 0, int d);
Trường hợp này sai vì tham số có giá trị ngầm định không ở cuối.
int sum(int a, int b, int c = 0, int d = 0);
Trường hợp này đúng vì thỏa điều kiện.