คำถามติดแท็ก pass-by-value

pass-by-value คือ "การส่งทางเดียว" ดังนั้นการแก้ไขค่าที่ส่งผ่านภายในฟังก์ชันการรับ (หรือเอนทิตีอื่น ๆ เช่นกระบวนการ ฯลฯ ) จะไม่ถูกส่งกลับ

30
Java "ผ่านการอ้างอิง" หรือ "pass-by-value" หรือไม่?
ผมคิดเสมอว่าเป็น Java ผ่านโดยการอ้างอิง อย่างไรก็ตามฉันได้เห็นโพสต์บล็อกสองสามตัวอย่าง (ตัวอย่างเช่นบล็อกนี้ ) ที่อ้างว่าไม่ได้ ฉันไม่คิดว่าฉันเข้าใจความแตกต่างที่พวกเขาทำ คำอธิบายคืออะไร

30
JavaScript เป็นภาษาแบบอ้างอิงหรืออ้างอิงผ่านค่าหรือไม่
ประเภทดั้งเดิม (หมายเลข, สตริง, ฯลฯ ) จะถูกส่งผ่านตามค่า แต่วัตถุไม่เป็นที่รู้จักเพราะพวกเขาสามารถเป็นได้ทั้งผ่านโดยค่า (ในกรณีที่เราพิจารณาว่าตัวแปรถือวัตถุในความเป็นจริงการอ้างอิงถึงวัตถุ ) และการอ้างอิงแบบส่งต่อ (เมื่อเราพิจารณาว่าตัวแปรไปยังวัตถุถือวัตถุเอง) แม้ว่ามันจะไม่สำคัญในตอนท้าย แต่ฉันต้องการที่จะรู้ว่าอะไรคือวิธีที่ถูกต้องในการนำเสนอข้อโต้แย้งผ่านอนุสัญญา มีข้อความที่ตัดตอนมาจากข้อกำหนดของ JavaScript ซึ่งกำหนดสิ่งที่ควรจะเป็นความหมายเกี่ยวกับเรื่องนี้?

15
ความแตกต่างระหว่างการส่งต่อโดยอ้างอิงกับการผ่านตามมูลค่าคืออะไร
อะไรคือความแตกต่างระหว่าง พารามิเตอร์ที่ส่งผ่านโดยการอ้างอิง พารามิเตอร์ผ่านค่าหรือไม่ กรุณายกตัวอย่างให้ฉันหน่อยได้ไหม

12
เหตุใดฉันจึงควรใช้คำว่า“ final” บนพารามิเตอร์ method ใน Java?
ฉันไม่เข้าใจว่าfinalคำหลักนั้นมีประโยชน์จริง ๆเมื่อใช้กับพารามิเตอร์ของวิธี ถ้าเราไม่รวมการใช้คลาสที่ไม่ระบุชื่อการอ่านและการประกาศเจตนานั้นดูเหมือนว่าจะไร้ค่าสำหรับฉัน การบังคับใช้ว่าข้อมูลบางอย่างยังคงไม่คงที่เท่าที่ควร หากพารามิเตอร์เป็นแบบดั้งเดิมมันจะไม่มีผลกระทบเนื่องจากพารามิเตอร์ถูกส่งผ่านไปยังวิธีการเป็นค่าและการเปลี่ยนแปลงมันจะไม่มีผลนอกขอบเขต หากเราส่งพารามิเตอร์โดยการอ้างอิงตัวอ้างอิงเองนั้นเป็นตัวแปรในตัวเครื่องและหากการอ้างอิงนั้นเปลี่ยนจากภายในเมธอดนั่นจะไม่มีผลกระทบใด ๆ จากภายนอกขอบเขตของเมธอด ลองพิจารณาตัวอย่างทดสอบง่ายๆด้านล่าง การทดสอบนี้ผ่านแม้ว่าวิธีการจะเปลี่ยนค่าของการอ้างอิงที่ให้ แต่ก็ไม่มีผลใด ๆ public void testNullify() { Collection<Integer> c = new ArrayList<Integer>(); nullify(c); assertNotNull(c); final Collection<Integer> c1 = c; assertTrue(c1.equals(c)); change(c); assertTrue(c1.equals(c)); } private void change(Collection<Integer> c) { c = new ArrayList<Integer>(); } public void nullify(Collection<?> t) { t = null; …

8
อาร์เรย์ใน PHP ถูกคัดลอกเป็นค่าหรืออ้างอิงถึงตัวแปรใหม่และเมื่อส่งผ่านไปยังฟังก์ชั่นหรือไม่
1) เมื่ออาร์เรย์ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังเมธอดหรือฟังก์ชันมันถูกส่งผ่านโดยการอ้างอิงหรือตามค่าหรือไม่ 2) เมื่อกำหนดอาเรย์ให้กับตัวแปรตัวแปรใหม่อ้างอิงถึงอาเรย์ดั้งเดิมหรือเป็นสำเนาใหม่หรือไม่? เกี่ยวกับการทำสิ่งนี้: $a = array(1,2,3); $b = $a; คือ$bการอ้างอิงถึง$a?


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

7
ผ่านวัตถุโดยการอ้างอิงหรือค่าใน C #
ใน C # ฉันคิดเสมอว่าตัวแปรที่ไม่ใช่ดั้งเดิมถูกส่งผ่านโดยการอ้างอิงและค่าดั้งเดิมที่ส่งผ่านตามค่า ดังนั้นเมื่อผ่านไปยังวิธีการใด ๆ ที่ไม่ใช่วัตถุดั้งเดิมสิ่งที่ทำกับวัตถุในวิธีการจะมีผลต่อวัตถุที่ถูกส่งผ่าน (สิ่ง C # 101) อย่างไรก็ตามฉันได้สังเกตเห็นว่าเมื่อฉันส่งวัตถุ System.Drawing.Image ว่าดูเหมือนจะไม่เป็นเช่นนั้น? ถ้าฉันส่งวัตถุ system.drawing.image ไปยังวิธีอื่นแล้วโหลดรูปภาพไปยังวัตถุนั้นให้ปล่อยให้วิธีนั้นพ้นขอบเขตแล้วกลับไปที่วิธีการเรียกใช้อิมเมจนั้นจะไม่ถูกโหลดบนวัตถุดั้งเดิม? ทำไมนี้

10
มันจะดีกว่าใน C ++ ที่จะผ่านค่าหรือผ่านการอ้างอิงคงที่?
มันจะดีกว่าใน C ++ ที่จะผ่านค่าหรือผ่านการอ้างอิงคงที่? ฉันสงสัยว่าวิธีไหนดีกว่ากัน ฉันรู้ว่าการส่งผ่านโดยการอ้างอิงอย่างต่อเนื่องควรให้ประสิทธิภาพที่ดีขึ้นในโปรแกรมเพราะคุณไม่ได้ทำสำเนาของตัวแปร

10
การใช้ "อ้างอิง" สำหรับตัวแปรประเภทการอ้างอิงใน C # คืออะไร?
ฉันเข้าใจว่าถ้าฉันผ่านค่าประเภท ( int,, structฯลฯ ) เป็นพารามิเตอร์ (โดยไม่มีrefคำหลัก) สำเนาของตัวแปรนั้นจะถูกส่งผ่านไปยังวิธีการ แต่ถ้าฉันใช้refคำหลักการอ้างอิงถึงตัวแปรนั้นจะถูกส่งผ่าน ไม่ใช่ใหม่ แต่ด้วยประเภทการอ้างอิงเช่นคลาสแม้ไม่มีrefคำหลักการอ้างอิงจะถูกส่งผ่านไปยังเมธอดไม่ใช่การคัดลอก ดังนั้นการใช้refคำหลักที่มีประเภทอ้างอิงคืออะไร? ยกตัวอย่างเช่น var x = new Foo(); ข้อแตกต่างระหว่างสิ่งต่อไปนี้คืออะไร? void Bar(Foo y) { y.Name = "2"; } และ void Bar(ref Foo y) { y.Name = "2"; }

7
ทำไม 128 == 128 false แต่ 127 == 127 เป็นจริงเมื่อเปรียบเทียบ Integer wrappers ใน Java
class D { public static void main(String args[]) { Integer b2=128; Integer b3=128; System.out.println(b2==b3); } } เอาท์พุท: false class D { public static void main(String args[]) { Integer b2=127; Integer b3=127; System.out.println(b2==b3); } } เอาท์พุท: true หมายเหตุ: ตัวเลขระหว่าง -128 ถึง 127 เป็นจริง

17
C ++ - ส่งต่อการอ้างอิงไปยัง std :: shared_ptr หรือ boost :: shared_ptr
ถ้าฉันมีฟังก์ชันที่ต้องทำงานร่วมกับ a shared_ptrมันจะไม่มีประสิทธิภาพมากกว่าที่จะส่งต่อการอ้างอิงไปยังมัน (เพื่อหลีกเลี่ยงการคัดลอกshared_ptrวัตถุ) ผลข้างเคียงที่ไม่ดีที่เป็นไปได้คืออะไร? ฉันนึกภาพสองกรณีที่เป็นไปได้: 1) ภายในฟังก์ชันมีสำเนาของอาร์กิวเมนต์เช่นใน ClassA::take_copy_of_sp(boost::shared_ptr<foo> &sp) { ... m_sp_member=sp; //This will copy the object, incrementing refcount ... } 2) ภายในฟังก์ชันจะใช้อาร์กิวเมนต์เท่านั้นเช่นใน Class::only_work_with_sp(boost::shared_ptr<foo> &sp) //Again, no copy here { ... sp->do_something(); ... } ฉันไม่เห็นเหตุผลที่ดีในทั้งสองกรณีที่จะส่งผ่านboost::shared_ptr<foo>ค่าโดยแทนที่จะเป็นการอ้างอิง การส่งผ่านตามค่าจะเพิ่มจำนวนอ้างอิง "ชั่วคราว" เนื่องจากการคัดลอกและลดลงเมื่อออกจากขอบเขตฟังก์ชัน ฉันมองข้ามบางสิ่งไปหรือเปล่า? เพียงเพื่อชี้แจงหลังจากอ่านคำตอบหลาย ๆ ข้อ: ฉันเห็นด้วยอย่างสมบูรณ์เกี่ยวกับข้อกังวลเกี่ยวกับการปรับให้เหมาะสมก่อนเวลาอันควรและฉันมักจะพยายามสร้างจุดเริ่มต้นจากนั้นทำงานบนฮอตสปอต คำถามของฉันมาจากมุมมองของโค้ดทางเทคนิคล้วนๆถ้าคุณรู้ว่าฉันหมายถึงอะไร

8
เป็น Swift Pass By Value หรือ Pass By Reference
ฉันใหม่มากสำหรับ Swift และฉันเพิ่งอ่านว่าคลาสถูกส่งผ่านโดยการอ้างอิงและอาร์เรย์ / สตริง ฯลฯ ถูกคัดลอก pass by reference เป็นแบบเดียวกับใน Objective-C หรือ Java ซึ่งคุณส่งผ่าน "a" reference หรือเปล่าหรือว่า pass by reference ถูกต้อง?

11
การส่งจำนวนเต็มโดยการอ้างอิงใน Python
ฉันจะส่งจำนวนเต็มโดยอ้างอิงใน Python ได้อย่างไร ฉันต้องการแก้ไขค่าของตัวแปรที่ฉันส่งผ่านไปยังฟังก์ชัน ฉันได้อ่านแล้วว่าทุกอย่างใน Python ส่งผ่านค่า แต่ต้องมีเคล็ดลับง่ายๆ ยกตัวอย่างเช่นใน Java คุณสามารถผ่านประเภทอ้างอิงInteger, Longฯลฯ ฉันจะส่งจำนวนเต็มไปยังฟังก์ชันโดยการอ้างอิงได้อย่างไร อะไรคือการปฏิบัติที่ดีที่สุด?

4
ทำไมฟังก์ชั่นค่าสัมบูรณ์ใน C ไม่ยอมรับอินพุต const?
ใน C ต้นแบบสำหรับฟังก์ชันค่าสัมบูรณ์ (ที่ยอมรับการลอย) คือ float fabsf( float ); ทำไมต้นแบบนี้จึงไม่ยอมรับค่าคงที่เช่นนี้ float fabsf( float const ); fabsf จะไม่เปลี่ยนค่าของอินพุตหรือไม่ หากฉันมีฟังก์ชั่นที่รับอินพุตและเรียกใช้ fabsf ฉันต้องบังคับให้หลีกเลี่ยงการระบุอินพุตเป็น const หรือไม่ วิธีที่เหมาะสมในการจัดการกับความถูกต้อง const ในสถานการณ์นี้คืออะไร?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.