Trong phần trước, ta biết rằng để hàm thực thi, chúng ta cần truyền giá trị cho tham số (parameter) của hàm. Có nhiều phương thức truyền tham số khác nhau có sẵn trong C++, mỗi phương thức đều có ưu điểm và nhược điểm riêng.
Kỹ thuật truyền tham số trong C++
Có 2 phương thức chính mà chúng ta có thể sử dụng để truyền tham số cho hàm trong C++. Đó là:
- Truyền Tham Trị
- Truyền Tham Chiếu
Truyền Tham Trị:
Bây giờ chúng ta xét một ví dụ sau
Đây là code của một chương trình đơn giản:
#include<iostream>
using namespace std;
void my_function(int x) {
x = 50;
cout << "Value of x from my_function: " << x << endl;
}
int main() {
int x = 10;
my_function(x);
cout << "Value of x from main function: " << x;
return 0;
}
Chúng ta khai báo một hàm tên là my_function(). Hàm có một tham số là x và trong hàm, chúng ta gán giá trị là 50 cho x và hàm sẽ in ra giá trị của x.
Trong hàm main(), chúng ta khai báo một biến cũng tên là x và gán cho nó giá trị là 10.
Sau đó ta sẽ truyền giá trị x=10 cho hàm my_function(), hình dung hàm sẽ được gọi tương tự thế này:
my_function(10);
Và hàm my_function() sẽ in ra dòng text: Value of x from my_function: 50. Nhưng lệnh in giá trị x sau khi thực hiện lời gọi hàm my_function() vẫn cho ra kết quả là giá trị x trong main() vẫn là 10. Nói cách khác, cho dù chúng ta có truyền cho tham số x của hàm my_function() là bao nhiêu thì sau khi hàm cũng "hành động", in ra dòng text: Value of x from my_function: 50. Thì giá trị của x trong main() vẫn không hề thay đổi, vẫn là 10.
Nói cách khác, hàm my_function() dù nhận tham số là bao nhiêu, sau khi tham số x "nhảy vào" hàm và hàm "chiên xào, nấu nướng" cho ra kết quả là 50 thì khi "nhảy ra" lại x trong main() vẫn là 10, không thay đổi.
Để hiểu hơn, ta thay biến x trong main() bằng y như sau:
#include<iostream>
using namespace std;
void my_function(int x) {
x = 50;
cout << "Value of x from my_function: " << x << endl;
}
int main() {
int y = 10;
my_function(y);
cout << "Value of x from main function: " << y;
return 0;
}
Chạy thử chương trình, kết quả vẫn giống trước
Tóm lại:
- x là tham số (argument) và y là đối số (argument). Trong hàm main(), ban đầu biến y có giá trị là 10 và đang ở ô nhớ ví dụ 123456 nào đó. Lời gọi hàm my_function(y) tạo nên một bản copy của biến y và nằm tại một ô nhớ tạm khác, ví dụ 987654, Sau khi hàm my_function(y) kết thúc, giá trị của biến y copy tại ô nhớ 987654 sẽ là 50. Trong lúc đó, biến y tại ô nhớ 123456 vẫn giữ nguyên giá trị là 10. Nói chung x và y trong trường hợp này là 2 biến khác nhau, nằm tại những ô nhớ khác nhau.
- Sau khi hàm my_function(y) kết thúc thì giá trị của y vẫn sẽ là 10.
Nếu chúng ta đang xây dựng ứng dụng đa luồng thì chúng ta không phải lo lắng về việc các đối tượng bị các luồng khác sửa đổi khi sử dụng Truyền Tham Trị.
Truyền Tham Chiếu:
Chúng ta giữ nguyên code của chương trình, chỉ thêm đúng một dấu & trước x như sau:
#include<iostream>
using namespace std;
void my_function(int &x) {
x = 50;
cout << "Value of x from my_function: " << x << endl;
}
int main() {
int y = 10;
my_function(y);
cout << "Value of x from main function: " << y;
return 0;
}
Chạy chương trình, ta sẽ thấy sự khác biệt:
- x là tham số và y là đối số và đều cùng một ô nhớ.
- Trong hàm main(). Ban đầu biến y có giá trị là 10 và đang ở ô nhớ ví dụ 123456 nào đó. Sau đó lời gọi hàm my_function(y) thay giá trị của y tại chính ô nhớ 123456 đó và in ra giá trị 50. Sau khi hàm my_function(y) kết thúc, giá trị của y lúc này đã là 50.
Lệnh Truyền Tham Chiếu chủ yếu được sử dụng khi chúng ta muốn thay đổi giá trị của đối số được truyền vào hàm gọi.
Không có nhận xét nào:
Đăng nhận xét