Trong C, ta có thể truyền tham số theo hai cách: truyền theo giá trị (call by value) và truyền theo địa chỉ (call by address). Trong C++, có thêm kỹ thuật thứ ba: truyền theo tham chiếu (call by reference). Hãy xem hiệu quả và cách hoạt động của từng kỹ thuật.
1. Truyền theo giá trị (Call by Value)
Với kỹ thuật này, tham số được sao chép vào đối số của hàm. Do đó, nếu có sửa đổi, chỉ giá trị bản sao bị thay đổi, không ảnh hưởng đến giá trị gốc.
Ví dụ
#include <iostream>
using namespace std;
void my_swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a = 10, b = 40;
cout << "(a,b) = (" << a << ", " << b << ")\n";
my_swap(a, b);
cout << "(a,b) = (" << a << ", " << b << ")\n";
return 0;
}
Kết quả
(a,b) = (10, 40) (a,b) = (10, 40)
2. Truyền theo địa chỉ (Call by Address)
Kỹ thuật này truyền địa chỉ của biến vào hàm. Khi hàm cập nhật giá trị tại địa chỉ đó, giá trị thực tế sẽ được cập nhật tự động.
Ví dụ
#include <iostream>
using namespace std;
void my_swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
int main() {
int a = 10, b = 40;
cout << "(a,b) = (" << a << ", " << b << ")\n";
my_swap(&a, &b);
cout << "(a,b) = (" << a << ", " << b << ")\n";
return 0;
}
Kết quả
(a,b) = (10, 40) (a,b) = (40, 10)
3. Truyền theo tham chiếu (Call by Reference) - Chỉ có trong C++
Tương tự truyền theo địa chỉ, nhưng dùng biến tham chiếu. Chỉ cần thêm ký hiệu & trước tên biến ở định nghĩa hàm.
Ví dụ
#include <iostream>
using namespace std;
void my_swap(int &x, int &y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a = 10, b = 40;
cout << "(a,b) = (" << a << ", " << b << ")\n";
my_swap(a, b);
cout << "(a,b) = (" << a << ", " << b << ")\n";
return 0;
}
Kết quả
(a,b) = (10, 40) (a,b) = (40, 10)