Trong C++, có thể truyền đối số vào hàm theo nhiều cách:
- Gọi bởi giá trị (Call by Value)
- Gọi bởi tham chiếu (Call by Reference)
- Gọi bởi địa chỉ (Call by Address)
Đôi khi gọi bởi địa chỉ được gọi là gọi bởi tham chiếu, nhưng trong C++ chúng khác nhau. Gọi bởi địa chỉ dùng biến con trỏ để gửi chính xác địa chỉ bộ nhớ, còn gọi bởi tham chiếu truyền biến tham chiếu (bí danh của biến). Tính năng này không có trong C, nơi phải truyền con trỏ để có hiệu ứng đó. Phần này sẽ xem ưu điểm của gọi bởi tham chiếu so với gọi bởi giá trị, và khi nào dùng.
Gọi bởi giá trị (Call by Value)
Trong gọi bởi giá trị, giá trị thực truyền làm đối số không thay đổi sau khi thực hiện phép toán. Khi dùng gọi bởi giá trị, nó tạo bản sao của biến vào ngăn xếp bộ nhớ. Khi giá trị thay đổi, nó thay đổi bản sao, giá trị thực không đổi.
Ví dụ mã
#include<iostream>
using namespace std;
void my_function(int x) {
x = 50;
cout << "Value of x from my_function: " << x << endl;
}
main() {
int x = 10;
my_function(x);
cout << "Value of x from main function: " << x;
}
Kết quả
Value of x from my_function: 50 Value of x from main function: 10
Gọi bởi tham chiếu (Call by Reference)
Trong gọi bởi tham chiếu, giá trị thực truyền làm đối số thay đổi sau khi thực hiện phép toán. Khi dùng gọi bởi tham chiếu, nó tạo bản sao của tham chiếu biến vào ngăn xếp. Nó dùng tham chiếu để lấy giá trị. Do đó, khi giá trị thay đổi qua tham chiếu, nó thay đổi giá trị biến thực.
Ví dụ mã
#include<iostream>
using namespace std;
void my_function(int &x) {
x = 50;
cout << "Value of x from my_function: " << x << endl;
}
main() {
int x = 10;
my_function(x);
cout << "Value of x from main function: " << x;
}
Kết quả
Value of x from my_function: 50 Value of x from main function: 50
Khi nào dùng gọi bởi tham chiếu?
Gọi bởi tham chiếu chủ yếu dùng khi muốn thay đổi giá trị đối số truyền vào hàm gọi.
Một hàm chỉ trả về một giá trị. Khi cần nhiều giá trị từ hàm, có thể truyền chúng làm đối số đầu ra theo cách này.