Słowo newkluczowe 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 newjest 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 ++, newsł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 newsł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 newJava? 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 newsłowo kluczowe? To samo pytanie można zadać dla Javascript. W języku C #, który jestem znacznie mniej obeznany, myślę, że newmoż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” newsł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 newnależy używać języków zarządzanych przez pamięć inspirowanych C ++, takich jak Java, JavaScript i C #, ale nie Python?
fznaczy, kiedy nie ucieka z funkcji, przydziel miejsce na stosie.
fpo powrocie funkcji zamykającej.
newsł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().