Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ความแตกต่างระหว่าง pass by value และ pass by reference ใน C++


ใน C ++ เราสามารถส่งอาร์กิวเมนต์ไปยังฟังก์ชันได้หลายวิธี วิธีต่างๆ เหล่านี้คือ −

  • โทรตามมูลค่า
  • โทรโดยอ้างอิง
  • โทรตามที่อยู่

บางครั้งการโทรตามที่อยู่จะเรียกว่าการโทรโดยการอ้างอิง แต่จะแตกต่างกันใน C ++ ในการเรียกตามที่อยู่ เราใช้ตัวแปรตัวชี้เพื่อส่งที่อยู่หน่วยความจำที่แน่นอน แต่ในการเรียกโดยการอ้างอิง เราจะส่งตัวแปรอ้างอิง (นามแฝงของตัวแปรนั้น) คุณลักษณะนี้ไม่มีอยู่ใน C เราต้องผ่านตัวชี้เพื่อให้ได้เอฟเฟกต์นั้น ในส่วนนี้เราจะมาดูกันว่าอะไรคือข้อดีของการโทรโดยอ้างอิงมากกว่าการโทรตามมูลค่า และจะใช้ที่ใด

โทรตามมูลค่า

ในการเรียกตามค่า ค่าจริงที่ส่งผ่านเป็นอาร์กิวเมนต์จะไม่เปลี่ยนแปลงหลังจากดำเนินการบางอย่างกับค่านั้น เมื่อใช้การเรียกตามค่า มันจะสร้างสำเนาของตัวแปรนั้นลงในส่วนสแต็กในหน่วยความจำ เมื่อค่ามีการเปลี่ยนแปลง ค่าของสำเนานั้นจะเปลี่ยน ค่าจริงยังคงเหมือนเดิม

โค้ดตัวอย่าง

#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

โทรโดยอ้างอิง

ในการเรียกโดยการอ้างอิง ค่าจริงที่ส่งผ่านเมื่ออาร์กิวเมนต์เปลี่ยนไปหลังจากดำเนินการบางอย่างกับค่านั้น เมื่อใช้การเรียกโดยการอ้างอิง มันจะสร้างสำเนาของการอ้างอิงของตัวแปรนั้นลงในส่วนสแต็กในหน่วยความจำ คือใช้การอ้างอิงเพื่อรับค่า ดังนั้นเมื่อค่าถูกเปลี่ยนโดยใช้ข้อมูลอ้างอิง ค่าของตัวแปรจริงจะเปลี่ยนไปตาม

โค้ดตัวอย่าง

#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

จะใช้การโทรโดยการอ้างอิงได้ที่ไหน

  • การเรียกโดยการอ้างอิงส่วนใหญ่จะใช้เมื่อเราต้องการเปลี่ยนค่าของอาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชันผู้เรียกใช้

  • ฟังก์ชันหนึ่งสามารถคืนค่าได้เพียงค่าเดียวเท่านั้น เมื่อเราต้องการค่ามากกว่าหนึ่งค่าจากฟังก์ชัน เราสามารถส่งผ่านเป็นอาร์กิวเมนต์เอาต์พุตได้ในลักษณะนี้