new
คำหลักในภาษาเช่น Java, JavaScript, และ C # สร้างตัวอย่างใหม่ของชั้นเรียน
ดูเหมือนว่าไวยากรณ์นี้จะได้รับการสืบทอดมาจาก C ++ ซึ่งnew
มีการใช้เฉพาะเพื่อจัดสรรอินสแตนซ์ใหม่ของคลาสบนฮีปและส่งกลับตัวชี้ไปยังอินสแตนซ์ใหม่ ใน C ++ นี่ไม่ใช่วิธีเดียวในการสร้างวัตถุ คุณยังสามารถสร้างวัตถุบนสแต็กโดยไม่ต้องใช้new
- และในความเป็นจริงวิธีการสร้างวัตถุนี้เป็นเรื่องธรรมดามากใน C ++
ดังนั้นมาจากพื้นหลัง C ++ new
คำสำคัญในภาษาเช่น Java, Javascript และ C # ดูเป็นธรรมชาติและชัดเจนสำหรับฉัน จากนั้นฉันก็เริ่มเรียนรู้ Python ซึ่งไม่มีnew
คำหลัก ใน Python อินสแตนซ์ถูกสร้างโดยการเรียกนวกรรมิกเช่น:
f = Foo()
ในตอนแรกสิ่งนี้ดูจะยากสำหรับฉันจนกว่ามันจะเกิดขึ้นกับฉันว่า Python ไม่มีเหตุผลnew
เพราะทุกอย่างเป็นวัตถุดังนั้นจึงไม่จำเป็นต้องแยกแยะระหว่างไวยากรณ์ตัวสร้างต่าง ๆ
แต่แล้วฉันก็คิดว่า - จุดประสงค์new
ใน Java คืออะไร? ทำไมเราควรจะพูดว่าObject o = new Object();
? ทำไมไม่เป็นเช่นนั้นObject o = Object();
? ใน C ++ มีความจำเป็นอย่างแน่นอนnew
เนื่องจากเราจำเป็นต้องแยกแยะระหว่างการจัดสรรฮีปและการปันส่วนบนสแต็ก แต่ใน Java วัตถุทั้งหมดถูกสร้างบนฮีปดังนั้นทำไมถึงมีnew
คำหลักด้วย? คำถามเดียวกันสามารถถามจาวาสคริปต์ได้ ใน C # ซึ่งฉันคุ้นเคยน้อยกว่าฉันคิดว่าnew
อาจมีจุดประสงค์บางประการในแง่ของการแยกแยะความแตกต่างระหว่างชนิดของวัตถุและประเภทของค่า แต่ไม่แน่ใจ
ดูเหมือนว่าฉันจะมีหลายภาษาที่มาหลังจาก C ++ เพียงแค่ "สืบทอด" new
คำหลัก - โดยไม่จำเป็นต้องใช้มันจริงๆ มันเกือบจะเหมือนคำหลักร่องรอย ดูเหมือนว่าเราจะไม่ต้องการมันด้วยเหตุผลใดก็ตาม แต่มันก็อยู่ที่นั่น
คำถาม:ฉันถูกต้องเกี่ยวกับเรื่องนี้หรือไม่? หรือมีเหตุผลที่น่าสนใจบางอย่างที่new
ต้องอยู่ใน C ++ - ภาษาที่ได้รับแรงบันดาลใจจากการจัดการหน่วยความจำเช่น Java, Javascript และ C # แต่ไม่ใช่ Python?
f
ไม่หนีฟังก์ชันจัดสรรพื้นที่สแต็ค
f
เมื่อฟังก์ชันปิดล้อมส่งคืน
new
คำหลัก แน่นอนฉันต้องการสร้างตัวแปรใหม่คอมไพเลอร์โง่! ดีภาษาในความคิดของฉันจะมีไวยากรณ์เช่น,f = heap Foo()
f = auto Foo()