Các new
từ khóa trong các ngôn ngữ như Java, Javascript, và C # tạo ra một thể hiện mới của một lớp.
Cú pháp này dường như đã được kế thừa từ C ++, nơi new
được sử dụng cụ thể để phân bổ một thể hiện mới của một lớp trên heap và trả về một con trỏ cho thể hiện mới. Trong C ++, đây không phải là cách duy nhất để xây dựng một đối tượng. Bạn cũng có thể xây dựng một đối tượng trên ngăn xếp mà không cần sử dụng new
- và trên thực tế, cách xây dựng các đối tượng này phổ biến hơn nhiều trong C ++.
Vì vậy, đến từ nền tảng C ++, new
từ khóa trong các ngôn ngữ như Java, Javascript và C # có vẻ tự nhiên và rõ ràng đối với tôi. Sau đó, tôi bắt đầu học Python, vốn không có new
từ khóa. Trong Python, một cá thể được xây dựng đơn giản bằng cách gọi hàm tạo, như:
f = Foo()
Lúc đầu, điều này có vẻ hơi khó chịu với tôi, cho đến khi tôi nhận ra rằng không có lý do gì để Python có new
, bởi vì mọi thứ đều là một đối tượng nên không cần phải phân biệt giữa các cú pháp của hàm tạo khác nhau.
Nhưng sau đó tôi nghĩ - ý nghĩa thực sự của new
Java là gì? Tại sao chúng ta nên nói Object o = new Object();
? Tại sao không chỉ Object o = Object();
? Trong C ++ chắc chắn cần phải có new
, vì chúng ta cần phân biệt giữa phân bổ trên heap và phân bổ trên stack, nhưng trong Java tất cả các đối tượng được xây dựng trên heap, vậy tại sao thậm chí còn có new
từ khóa? Câu hỏi tương tự có thể được yêu cầu cho Javascript. Trong C #, điều mà tôi ít quen thuộc hơn, tôi nghĩ new
có thể có một số mục đích trong việc phân biệt giữa các loại đối tượng và loại giá trị, nhưng tôi không chắc chắn.
Bất kể, đối với tôi, dường như nhiều ngôn ngữ xuất hiện sau C ++ chỉ đơn giản là "kế thừa" new
từ khóa - mà không thực sự cần nó. Nó gần giống như một từ khóa di tích . Chúng tôi dường như không cần nó vì bất kỳ lý do gì, nhưng nó vẫn ở đó.
Câu hỏi: Tôi có đúng về điều này không? Hoặc có một số lý do thuyết phục new
cần phải có trong C ++ - các ngôn ngữ được quản lý bộ nhớ lấy cảm hứng như Java, Javascript và C # nhưng không phải là Python?
f
không thoát khỏi chức năng, phân bổ không gian ngăn xếp.
f
khi hàm kèm theo trả về.
new
từ khóa. Tất nhiên tôi muốn tạo một biến mới, trình biên dịch ngu ngốc! Một tốt ngôn ngữ sẽ theo ý kiến của tôi có một cú pháp nhưf = heap Foo()
,f = auto Foo()
.