แนะนำ, 2024

ตัวเลือกของบรรณาธิการ

ความแตกต่างระหว่างการโทรด้วยมูลค่าและการโทรตามการอ้างอิง

ใน C ++ และ Java มีสองวิธีในการเรียกฟังก์ชันหรือเมธอด ที่แรกก็คือ "โทรตามค่า" และที่สองคือ "โทรโดยอ้างอิง" วิธีการโทรตามค่าจะส่งเฉพาะค่าของตัวแปรไปยังโค้ดฟังก์ชันและหากมีการเปลี่ยนแปลงใด ๆ ในค่าของตัวแปรภายในฟังก์ชันนั้นจะไม่มีผลต่อค่าดั้งเดิมของตัวแปรนั้น ในวิธีการโทรโดยการอ้างอิงเราส่งผ่านตัวแปรในอาร์กิวเมนต์และการเปลี่ยนแปลงค่าของตัวแปรจะมีผลกับค่าเดิมของตัวแปรนั้นด้วย ความแตกต่างที่สำคัญระหว่างทั้งสองวิธีคือการเรียกโดยเมธอดค่าส่งค่าของตัวแปรและการอ้างอิงโดยการส่งผ่านที่อยู่ของตัวแปรนั้น

ตารางเปรียบเทียบ:

พื้นฐานสำหรับการเปรียบเทียบCall_By_Valueโทรตามการอ้างอิง
ขั้นพื้นฐาน
สำเนาของตัวแปรถูกส่งผ่านตัวแปรถูกส่งผ่าน
ผลการเปลี่ยนแปลงในสำเนาของตัวแปรไม่ได้แก้ไขค่าดั้งเดิมของตัวแปรนอกฟังก์ชันการเปลี่ยนแปลงในตัวแปรมีผลต่อค่าของตัวแปรภายนอกฟังก์ชั่นด้วย
พารามิเตอร์การโทรfunction_name (variable_name1, variable_name2, ....);function_name (& variable_name1, & variable_name2, ....));
// ในกรณีของวัตถุ
object.func_name (object);
รับพารามิเตอร์พิมพ์ function_name (ประเภท variable_name1, type variable_name2, ....)
{. . }
พิมพ์ function_name (พิมพ์ * variable_name1, พิมพ์ * variable_name2, ....)) . }
// ในกรณีของวัตถุ
พิมพ์ function_name (class_type object_name)
{. . }
การโทรเริ่มต้นประเภทดั้งเดิมจะถูกส่งผ่านโดยใช้ "การเรียกตามค่า"วัตถุจะถูกส่งผ่านโดยนัยโดยใช้ "การโทรโดยการอ้างอิง"

คำจำกัดความของ Call By Value

หากคุณส่งประเภทข้อมูลดั้งเดิม (จำนวนเต็มตัวอักษรและสตริง) ไปยังฟังก์ชัน / วิธีการจะมีเพียง“ ค่า” เท่านั้นที่ถูกส่งไปยังรหัสฟังก์ชัน ฟังก์ชันคัดลอกค่าของอาร์กิวเมนต์ไปยัง 'พารามิเตอร์ที่เป็นทางการ' ของโค้ดฟังก์ชัน หากมีการดัดแปลงใด ๆ กับพารามิเตอร์ที่เป็นทางการในโค้ดฟังก์ชันมันจะไม่แก้ไขค่าดั้งเดิมของอาร์กิวเมนต์ที่ใช้เรียกฟังก์ชันนั้น

ในคำง่าย ๆ ถ้าฟังก์ชั่น / วิธีการถูกเรียกโดย 'เรียกตามค่า' วิธี ดังนั้นสำเนาของตัวแปรจะถูกส่งไปยังรหัสฟังก์ชัน หากโค้ดฟังก์ชันทำการเปลี่ยนแปลงค่าใด ๆ ในสำเนาของตัวแปรมันจะไม่เปลี่ยนค่าดั้งเดิมของตัวแปร

เรามาดูตัวอย่างเพื่อทำความเข้าใจสั้น ๆ นี้

 // ตัวอย่างในการตรวจสอบคลาส Java {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("ค่าของพารามิเตอร์ภายในฟังก์ชั่น"); system.out.println ("ค่าของ 'i' ซึ่งยอมรับค่าของอาร์กิวเมนต์ 'a'" + i); system.out.println ("ค่าของ 'j' ซึ่งยอมรับค่าของอาร์กิวเมนต์ 'b'" + j); }} คลาส call_by _value {โมฆะสาธารณะคงเป็นโมฆะหลัก (สตริง args []) {int a = 12, b = 20; ตรวจสอบ C = ตรวจสอบใหม่ (); system.out.println ("ค่าของ 'a' และ 'b' ก่อนการเรียกใช้ฟังก์ชัน" + a + "" + b); C.change (A, B); // โทรตามค่า system.out.println ("ค่าของ 'a' และ 'b' หลังจากเรียกใช้ฟังก์ชัน" + a + "" + b); }} // มูลค่าส่งออกของ 'a' และ 'b' ก่อนการเรียกใช้ฟังก์ชัน 12 20 ค่าพารามิเตอร์ภายในค่าฟังก์ชันของ 'i' ซึ่งยอมรับค่าของอาร์กิวเมนต์ 'a' 144 ค่าของ 'j' ซึ่งยอมรับค่าของ อาร์กิวเมนต์ 'b' 10 ค่าของ 'a' และ 'b' หลังจากเรียกใช้ฟังก์ชัน 12 20 

ความหมายของการโทรโดยอ้างอิง

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

ใน C ++ และ Java มันเป็นเรื่องธรรมดามากที่จะส่งผ่านวัตถุไปยังฟังก์ชัน / วิธีการและวัตถุจะถูกส่งผ่านโดยการอ้างอิงเสมอ การเปลี่ยนแปลงที่ทำกับวัตถุภายในฟังก์ชั่น / วิธีส่งผลกระทบต่อวัตถุที่ใช้ในการเรียกใช้ฟังก์ชั่น / วิธีการที่

ส่วนต่อไปนี้แสดงวิธีที่ถูกต้องในการ 'โทรโดยการอ้างอิง'

 // ตัวอย่างในการแลกเปลี่ยนคลาส C ++ {void swap (int * x, int * y) {int temp; อุณหภูมิ = * x; * * * * * * * * x = Y; * y = อุณหภูมิ; }} int หลัก {int a = 10, b = 20; ศาล << "ค่าของ a, b ก่อนการเรียกใช้ฟังก์ชัน" << a << "" < 

ตอนนี้ขอหารือ 'โทรโดยการอ้างอิง' โดยผ่าน 'วัตถุ' เป็นอาร์กิวเมนต์ซึ่งถูกส่งผ่านโดยนัยโดยวิธีการ 'โทรโดยการอ้างอิง'

 ตรวจสอบชั้นเรียน {int a, b; ตรวจสอบ (int x, int b) {// วัตถุเริ่มต้นผ่านข้อ จำกัด นี้ a = x; ข y =; } การแลกเปลี่ยนเป็นโมฆะ (ตรวจสอบ ob) {ob.a = a * 2; ob.b = b / 2; }} คลาส main_class {โมฆะสาธารณะคงที่หลัก (สตริง args []) {ตรวจสอบ C = ตรวจสอบใหม่ (20, 40); // การเริ่มต้นวัตถุ system.out.println ("ค่าของ 'ob.a' และ 'ob.b' ก่อนเรียกใช้ฟังก์ชัน" + ob.a + "" + ob.b); C.exchange (C); // โทรโดยอ้างอิง system.out.println ("ค่าของ 'ob.a' และ 'ob.b' ก่อนเรียกใช้ฟังก์ชัน" + ob.a + "" + ob.b); }} // มูลค่าส่งออกของ 'ob.a' และ 'ob.b' ก่อนการเรียกใช้ฟังก์ชัน 20 40 ค่าของ 'ob.a' และ 'ob.b' หลังจากเรียกใช้ฟังก์ชัน 40 20 

ความแตกต่างที่สำคัญระหว่างการโทรตามมูลค่าและการโทรโดยการอ้างอิง

  1. การส่งผ่านข้อโต้แย้งโดยใช้วิธีการ 'เรียกใช้โดยค่า' จะส่งเฉพาะสำเนาของตัวแปรนั้นเท่านั้นดังนั้นการเปลี่ยนแปลงที่เกิดขึ้นกับค่าในการคัดลอกตัวแปรนั้นจะไม่ส่งผลต่อค่าดั้งเดิมของตัวแปรนั้น ในแนวทาง 'การโทรโดยการอ้างอิง' ตัวแปรจะถูกส่งผ่านเป็นอาร์กิวเมนต์ดังนั้นการเปลี่ยนแปลงจะแก้ไขค่าของตัวแปรดั้งเดิม
  2. หากอาร์กิวเมนต์ที่ส่งผ่านเป็นประเภทข้อมูลดั้งเดิมพวกเขาเพียง 'เรียกตามค่า' แต่ถ้าการอ้างอิง / ที่อยู่ของอาร์กิวเมนต์หรือวัตถุถูกส่งผ่านฟังก์ชันจะถูกเรียกโดยเมธอด 'call by reference'
  3. ใน 'call by value approach' อาร์กิวเมนต์ที่ส่งผ่านเป็นเพียงชื่อของตัวแปรในขณะที่วิธีการ 'call by Reference' อาร์กิวเมนต์ที่ส่งผ่านคือชื่อตัวแปรตามเครื่องหมาย '&' หรือวัตถุที่ถูกส่งผ่านโดยชื่อของมัน
  4. การรับพารามิเตอร์ของอาร์กิวเมนต์ในวิธีการ 'เรียกใช้โดยค่า' เป็นชื่อตัวแปรพร้อมกับชนิดข้อมูล ในแนวทาง 'การโทรโดยการอ้างอิง' พารามิเตอร์การรับจะเป็นตัวแปรตัวชี้พร้อมกับชนิดข้อมูลเสมอและในกรณีของวัตถุจะเป็นชื่อวัตถุพร้อมกับประเภทคลาส

สรุป:

C ++ และ Java ใช้ทั้งสองวิธีขึ้นอยู่กับสิ่งที่ส่งผ่าน ถ้าคุณต้องการส่งผ่านค่าของตัวแปร use'call ตามค่า 'วิธีการและถ้าคุณต้องการดูการเปลี่ยนแปลงในค่าดั้งเดิมของตัวแปรให้ใช้วิธี' call by reference '

Top