Słowo new
kluczowe w językach takich jak Java, JavaScript i C # tworzy nowe wystąpienie klasy.
Wydaje się, że ta składnia została odziedziczona z C ++, gdzie new
jest używana specjalnie do przydzielenia nowej instancji klasy na stercie i zwrócenia wskaźnika do nowej instancji. W C ++ nie jest to jedyny sposób na zbudowanie obiektu. Możesz także zbudować obiekt na stosie, bez użycia new
- i w rzeczywistości ten sposób konstruowania obiektów jest znacznie bardziej powszechny w C ++.
Tak więc, pochodzące z języka C ++, new
słowo kluczowe w językach takich jak Java, JavaScript i C # wydawało mi się naturalne i oczywiste. Potem zacząłem uczyć się języka Python, który nie ma new
słowa kluczowego. W Pythonie instancja jest budowana po prostu przez wywołanie konstruktora, na przykład:
f = Foo()
Na początku wydawało mi się to trochę dziwne, dopóki nie przyszło mi do głowy, że Python nie ma powodu new
, ponieważ wszystko jest przedmiotem, więc nie trzeba rozróżniać różnych składni konstruktorów.
Ale potem pomyślałem - jaki jest sens new
Java? Dlaczego powinniśmy powiedzieć Object o = new Object();
? Dlaczego nie tylko Object o = Object();
? W C ++ zdecydowanie jest taka potrzeba new
, ponieważ musimy rozróżnić między alokacją na stosie a alokacją na stosie, ale w Javie wszystkie obiekty są konstruowane na stercie, więc po co w ogóle new
słowo kluczowe? To samo pytanie można zadać dla Javascript. W języku C #, który jestem znacznie mniej obeznany, myślę, że new
może mieć jakiś cel pod względem rozróżniania typów obiektów i typów wartości, ale nie jestem pewien.
Niezależnie od tego wydaje mi się, że wiele języków, które pojawiły się po C ++, po prostu „odziedziczyło” new
słowo kluczowe - tak naprawdę go nie potrzebując. To prawie jak szczątkowe słowo kluczowe . Wydaje się, że nie potrzebujemy go z żadnego powodu, a jednak już istnieje.
Pytanie: Czy mam rację? A może jest jakiś ważny powód, dla którego new
należy używać języków zarządzanych przez pamięć inspirowanych C ++, takich jak Java, JavaScript i C #, ale nie Python?
f
znaczy, kiedy nie ucieka z funkcji, przydziel miejsce na stosie.
f
po powrocie funkcji zamykającej.
new
słowo kluczowe. Oczywiście chcę stworzyć nową zmienną, głupi kompilator! Dobrym językiem moim zdaniem mają składnię jakf = heap Foo()
,f = auto Foo()
.