ฉันรู้ว่าชื่อฟังดูคุ้นหูเพราะมีคำถามคล้าย ๆ กันหลายอย่าง แต่ฉันขอปัญหาที่แตกต่าง (ฉันรู้ถึงความแตกต่างระหว่างการมีสิ่งของในกองซ้อน
ใน Java ฉันสามารถกลับไปอ้างอิงถึงวัตถุ "ท้องถิ่น"
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
ใน C ++ เพื่อทำสิ่งที่คล้ายกันฉันมี 2 ตัวเลือก
(1) ฉันสามารถใช้การอ้างอิงเมื่อใดก็ตามที่ฉันต้องการ "ส่งคืน" วัตถุ
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
จากนั้นใช้มันเช่นนี้
Thing thing;
calculateThing(thing);
(2) หรือฉันสามารถคืนค่าตัวชี้ไปยังวัตถุที่ถูกจัดสรรแบบไดนามิก
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
จากนั้นใช้มันเช่นนี้
Thing* thing = calculateThing();
delete thing;
การใช้วิธีแรกฉันจะไม่ต้องเพิ่มหน่วยความจำด้วยตนเอง แต่สำหรับฉันมันทำให้โค้ดอ่านยาก ปัญหาเกี่ยวกับแนวทางที่สองคือฉันต้องจำไว้delete thing;
ซึ่งไม่ได้ดูดีนัก ฉันไม่ต้องการคืนค่าที่คัดลอกเพราะไม่มีประสิทธิภาพ (ฉันคิดว่า) ดังนั้นคำถามมาที่นี่
- มีวิธีที่สาม (ไม่ต้องการคัดลอกค่า) หรือไม่
- มีปัญหาใดไหมถ้าฉันติดกับวิธีแก้ปัญหาแรก?
- ฉันควรใช้โซลูชันที่สองเมื่อใดและเพราะเหตุใด