ใน C++ เราสามารถส่ง arguments ให้ฟังก์ชันได้หลายวิธี วิธีเหล่านี้คือ -
- Call by Value
- Call by Reference
- Call by Address
บางครั้ง Call by Address ถูกอ้างว่าเป็น Call by Reference แต่ใน C++ พวกมันต่างกัน ใน Call by Address เราใช้ตัวแปร pointer เพื่อส่งที่อยู่หน่วยความจำที่แน่นอน แต่ใน Call by Reference เราส่งตัวแปร reference (alias ของตัวแปรนั้น) ฟีเจอร์นี้ไม่มีใน C ที่นั่นเราต้องส่ง pointer เพื่อให้ได้ผลลัพธ์แบบนั้น ในส่วนนี้เราจะดูข้อดีของ Call by Reference เทียบกับ Call by Value และเมื่อไหร่ควรใช้
Call by Value
ใน Call by Value ค่าจริงที่ส่งเป็น argument ไม่เปลี่ยนแปลงหลังจากดำเนินการบางอย่าง เมื่อใช้ Call by Value จะสร้าง copy ของตัวแปรนั้นในส่วน stack ของหน่วยความจำ เมื่อค่าเปลี่ยน จะเปลี่ยนค่าของ copy นั้น ค่าจริงยังคงเดิม
ตัวอย่างโค้ด
#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;
}
ผลลัพธ์
Value of x from my_function: 50 Value of x from main function: 10
Call by Reference
ใน Call by Reference ค่าจริงที่ส่งเป็น argument จะเปลี่ยนแปลงหลังจากดำเนินการบางอย่าง เมื่อใช้ Call by Reference จะสร้าง copy ของ reference ของตัวแปรนั้นในส่วน stack ของหน่วยความจำ ใช้ reference เพื่อเข้าถึงค่า ดังนั้นเมื่อค่าเปลี่ยนโดยใช้ reference จะเปลี่ยนค่าของตัวแปรจริง
ตัวอย่างโค้ด
#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;
}
ผลลัพธ์
Value of x from my_function: 50 Value of x from main function: 50
เมื่อไหร่ควรใช้ Call by Reference?
Call by Reference ใช้หลักเมื่อเราต้องการเปลี่ยนค่าของ argument ที่ส่งเข้าไปในฟังก์ชันที่เรียก
ฟังก์ชันหนึ่งสามารถคืนค่าได้เพียงค่าเดียว เมื่อเราต้องการค่ามากกว่าหนึ่งค่าจากฟังก์ชัน เราสามารถส่งพวกมันเป็น output argument แบบนี้ได้