Trong C++ hỗ trợ những cách truyền đối số cho hàm là:
- Truyền bằng tham trị (pass by value)
- Truyền bằng địa chỉ (pass by address hoặc pass by pointer)
- Truyền bằng tham chiếu (pass by reference)
Bài này sẽ giới thiệu cách truyền tham trị và tham chiếu. Truyền bằng địa chỉ sẽ học sau ở những bài về con trỏ (pointer). Cuối bài này, chúng ta sẽ xem xét một vấn đề nữa là đối số mặc định của hàm.
1. Đừng nhầm lẫn khái niệm tham số và đối số
Ví dụ, ta có một hàm được định nghĩa như sau:
void foo(int param1, int param2) //param1 and param2 are parameters
{
//do something
}
với param1 và param2 là 2 tham số (parameters) của hàm foo.
Tham số của hàm là những biến được khai báo trong khai báo hàm. Tham số đóng vai trò là giá trị đầu vào cho hàm.
Giả sử, trong hàm main() thực hiện gọi hàm foo:
int main()
{
foo(1, 2); //1 and 2 are arguments
return 0;
}
Lúc này, 1 và 2 là 2 đối số (arguments) của hàm foo. Khi đó, giá trị 1 và 2 sẽ được tiếp nhận và lưu trữ tạm thời trong 2 tham số param1 và param2.
Đối số là giá trị được truyền vào hàm mỗi khi thực hiện lời gọi hàm. Đối số phải có kiểu dữ liệu phù hợp với tham số của hàm.
2. Truyền tham trị cho hàm
Truyền đối số cho hàm ở dạng giá trị. Có thể truyền hằng, biến, biểu thức nhưng tham số của hàm chỉ sẽ nhận giá trị. Truyền tham trị được sử dụng khi không có nhu cầu thay đổi giá trị của tham số sau khi thực hiện hàm.
Chương trình C++ minh họa truyền tham trị
#include <iostream>
using namespace std;
void passByValue(int x){
x++;
}
int main()
{
int a = 10;
passByValue(a); //pass 'a' variable to function
cout<<"Value of 'a' variable is not changed, a = "<<a;
system("pause");
}
Kết quả
Value of 'a' variable is not change, a = 10
Khi sử dụng tham trị:
– Những biến thuộc về hàm sẽ được khởi tạo và lưu trữ giá trị trong quá trình thực thi hàm nên gây tốn thêm vùng nhớ. Những biến thuộc về hàm sẽ được hủy khi hàm thực thi xong.
– Cách duy nhất để lấy được đầu ra (output) từ hàm là thông qua từ khóa return với hàm có kiểu trả về.
3. Truyền tham chiếu cho hàm
Truyền đối số cho hàm ở dạng địa chỉ (con trỏ). Được bắt đầu bằng toán tử & trong khai báo. Khi gọi hàm, phải truyền vào tên biến, không được truyền giá trị cho tham số này. Truyền tham chiếu được sử dụng khi có nhu cầu thay đổi giá trị của tham số sau khi thực hiện hàm.
Chương trình C++ minh họa truyền tham chiếu
#include <iostream>
using namespace std;
void passByValue(int &x){
x++;
}
int main()
{
int a = 10;
passByValue(a);//pass 'a' variable to function
cout<<"Value of 'a' variable is changed, a = "<<a;
system("pause");
}
Kết quả
Value of 'a' variable is changed, a = 11
Khi sử dụng tham chiếu:
– Khi gọi hàm, những biến truyền tham chiếu sẽ không cần khởi tạo và lưu trữ một lần nữa nên tiết kiệm bộ nhớ và hoạt động nhanh hơn.
– Có thể trả về nhiều giá trị trong một lần gọi hàm.
4. Một số lưu ý khi sử dụng tham trị và tham chiếu
– Trong một hàm, các tham số có thể truyền theo nhiều cách.
void HonHop(int x, int &y)
{
x++;
y++;
}
– Sử dụng tham chiếu là một cách để trả về giá trị cho chương trình.
int TinhTong(int x, int y)//không truyền tham chiếu, phải return giá trị
{
return x + y;
}
//biến tong truyền tham trị, sẽ lưu giá trị khi ra
void TinhTong(int x, int y, int &tong)khỏi hàm
{
tong = x + y;
}
void TinhTongHieu(int x, int y, int &tong, int &hieu)//biến tong và hieu truyền tham trị
{
tong = x + y; hieu = x – y;
}
5. Đối số mặc định của hàm
Tham số mặc định là tham số có một giá trị khởi tạo tại thời điểm khai báo.
Khi người dùng không cung cấp đối số cho tham số mặc định, giá trị mặc định sẽ được sử dụng.
Khi người dùng cung cấp đối số cho tham số mặc định, tham số sẽ được gán lại bằng giá trị của đối số được truyền vào.
Cách khai báo tham số mặc định
Để khai báo tham số mặc định cho hàm, sử dụng toán tử gán “=”.
void printValue(int x, int y = 10)
{
cout << "x: " << x << endl;
cout << "y: " << y << endl;
}
Tham số thứ 2 của hàm printValue có giá trị mặc định nên khi gọi hàm, có thể chỉ truyền vào 1 đối số cho tham số x. Hoặc truyền đối số cho cả tham số x và y.
printValue(5);//truyền đối số cho x
printValue(5, 5);//truyền đối số cho cả x và y
Trường hợp khai báo tham số mặc định không hợp lệ
void printValue(int x = 10, int y) //Invalid
{
cout << "x: " << x << endl;
cout << "y: " << y << endl;
}
// Invalid
void add(int a, int b = 3, int c, int d);
// Invalid
void add(int a, int b = 3, int c, int d = 4);
// Valid
void add(int a, int c, int b = 3, int d = 4);
Lưu ý: Mọi tham số mặc định khi khai báo phải đặt phía sau tham số không có giá trị mặc định.