Po co komu `new` w językach programowania?

0

Jeśli jesteś programistą C++ i spadłeś z krzesła czytając tytuł -> nie przejmuj się. Mówiąc o językach programowania nie mówiłem o C++.

Jeśli jesteś programistą C#/Java/JavaScript/Itd/Etc i spadłeś z krzesła czytając tytuł... No właśnie. Po co nam słowo kluczowe new?
Rozumiem konieczność new w C++ - służy do tworzenia obiektu dynamicznie, to znaczy mając klasę

class Foo { }

Możemy stworzyć jej obiekt na heap w taki sposób:

Foo *f = new Foo()

Tylko że równie dobrze (a często lepiej) możemy stworzyć (na stosie) tak:

Foo f = Foo()

Do czego zmierzam -> w C#/Javie/JavaScripcie/Itd/Etc nie da się stworzyć obiektu inaczej niż dynamicznie. A nawet jeśli (np. struktury w C#), i tak należy użyć new. Byłby ktoś w stanie mi wytłumaczyć po co? Po co mam pisać dodatkowo cztery znaki (['n', 'e', 'w', ' ']) za każdym razem kiedy wykonuję najczęstszą rzecz w obiektowym języku programowania?

Jeśli jesteś programistką C++/C#/Java/JavaScript/Itd/Etc/Whatever i spadłaś z krzesła czytając tytuł -> specjalnego podpunktu nie napisałem jako że w społeczności programistów znajdujesz się w granicy błędu statystycznego.

PS. A tak poza tym -> wesołego nowego roku (jeśli ktoś czyta ten temat przed pierwszym stycznia rano -> gratuluję braku życia ;) )

0

Też trzeźwy sylwester przed kompem ;p ? Może nie spadłem z krzesła, ale jako programista c++ rzuciłem kur**, a potem zastanawiałem się jaki cwaniak taki temat napisał ... potem przypomniało mi się, że zmieniłeś nick, a potem czytając temat już się zorientowałem o co chodzi. Piszę w C++ i zaczynam lizać C#, ale kompletnie nie znam się na tych nowych językach ;p. Może kwestia tego, że bez new pamieć alokowana jest w momencie uruchomienia programu, a z new dopiero przy wykonywaniu się danej części tego programu ?

0

Imho ma sens w takim kształcie jak to wygląda. Chociaż rzeczywiście sensowne wydawałoby się wywalenie new jako takiego. Zamiast tego dodać & lub * jako referencję.
W końcu zapis Foo a = new Foo(); Foo b = a jakoś trzeba by realizować: Foo a; Foo &b = a;

P.S. pozdrawiam no life'ów :D

0

W Javie jeszcze nie można tworzyć obiektów na stosie (oprócz typów prostych). Ale już niedługo :] (czy przypadkiem ten ficzer nie miał być w wersji 7?). Tak więc uzasadnienie jest.

0

@lukas -> przykro mi że wyprowadziłem cię z równowagi, ale mam tendencję do zakładania średnio normalnych tematów z głupimi nazwami :)
Faktycznie, czytając swój post sam bym się nie domyślił o co chodzi... Cóż, zaczynam rozumieć (niektórych) zadających pytania w dziale newbie którzy piszą trzy nieskładne zdania i oczekują od innych mocy jasnowidztwa (może to te opary alkoholowe z ulicy...?). Sorry dla tych którzy zmarnowali czas starając się mnie zrozumieć.

--> Tak więc ERRATA, WYJAŚNIENIE POSTA <--
Chodzi mi o składnię. W C++ new ma głęboki sens i do C++ nic nie mam -> jego użycie zmienia sposób tworzenia obiektu ze statycznego (stos) na dynamiczny (sterta).
W C#/Java/JavaScript/Itd new w sumie nie wiadomo skąd i po co się bierze. Nie mamy wyboru statyczny/dynamiczny bo zawsze jest dynamicznie. Czyli to 'new' jest nadmiarowe. Tak jakby zamiast pisać

void foo() {}
void baz() {}
void bar()
{
    foo();
    baz();
}

trzeba było pisać

void foo() {}
void baz(int i) {}
void bar()
{
    call foo(); // kompletnie do niczego nieprzydatne hipotetyczne słowo kluczowe call
    call baz(2); // które trzeba dodawać przed każdym wywołaniem metody.
    // ma to sens? Nieszczególnie. A dokładnie tak samo jest z new przed konstruktorem.
}

Przyszła mi do głowy zresztą jeszcze jedna rzecz - minimalistyczny w kwestii ilości tokenów Python obchodzi się jakoś bez new - czyli się da.

P.S. pozdrawiam no life'ów :D

Pozdrawiam, pozdrawiam.

0

Escape Analysis w Javie to 100 % automat, nic nie trzeba ręcznie oznaczać. ZTCP w Javie 6 było to w fazie eksperymentalnej, a w Javie 7 jako standard, czy jakoś tak. W każdym razie działa i już kiedyś pokazywałem na forum, że działa.

Wracając do tematu: new jest w ogólności zbędne w językach zarządzanych (no chyba, że służy do innych rzeczy niż rozróżnianie pomiędzy alokacją na stercie i stosie). Taka np Scala pozwala omijać "new" w przypadku case classes.

Jakimś minimalnym wytłumaczeniem dla obecności new'a mógłby być kod:

public class Main {

    public static void main(String[] args) {
        Main main = Main();
        System.out.println(main);
    }

    static Main Main() {
        return new Main();
    }
}

Wydaje mi się jednak, że najprawdopodobniej new w Javie jest po to, żeby Java była łatwiejsza do zrozumienia dla C++owców. Kulawa jak na dzisiejsze czasy składnia Javy jest właśnie spowodowana chęcią przyciągnięcia leniwych i ograniczonych umysłowo (tzn. przede wszystkim tej części spośród ogółu) programistów C++ - sam Gosling przyznał, że gdyby miał czas i nie miał parcia na przyciągnięcie owych programistów to język Java przypominałby bardziej dzisiejszą Scalę. Składnia pierwszej wersji Javy była raczej robiona na szybko (nota bene: z wersji na wersję czas debat nad ulepszeniami języka kosmicznie się wydłuża, jest to dobitna wada projektowania rzeczy na szybko). W C# new jest generalnie dlatego, bo C# zaczynał jako marna kopia Javy. A na JavaScripcie się nie znam, ale tam chyba słówko function służy zarówno do deklarowania funkcji jak i konstruktorów i trzeba jakoś rozróżnić pomiędzy tworzeniem obiektu, a wywoływaniem funkcji i słówko new właśnie temu służy, czyż nie?

0

Czy ja wiem czy tak ograniczonych programistów C++, chyba, że mówimy o "programistach", którzy w porywach mogą napisać bardziej rozbudowany hello world i nie mają pojęcia co tak naprawdę w tym się dzieje - takich nie ma po co przyciągać.
C# ma struktury, więc tu jeszcze można jakoś wytłumaczyć to new(kulawo)

Pozdrawiam następnego no life'a :D

0

Fajerwerki z dymem poszły, do przyziemnych zajęć można wracać.
Jako że wypiłem sporo, wybaczcie jeśli bełkoczę bzdury jakieś ;-)

Przyznam, że nad new się specjalnie nie zastanawiałem, chociaż dziwnie mi się go pisze w C# w przypadku struktur.
Ażeby było trudniej, w C++/CLI można zainicjować zmienną klasy zarządzanej z pominięciem new, co ma sugerować tworzenie jej na stosie, tyle że… nie jest na stosie, tylko jak zawsze na stercie, tyle że niejawnie.

Bardziej przeszkadza mi w językach C++-podobnych podwójne pisanie typu w tej samej linijce:

JakasKlasa zmienna = new JakasKlasa();

Czyż to nie nadmiarowa informacja?

Na szczęście w C# w pewnym momencie złapano się za głowę i odtąd można użyć słowa var zamiast pierwszej nazwy typu:

var zmienna = new JakasKlasa();

co da dokładnie taki sam efekt jak pełna linijka powyżej. Oczekiwałem tego w C++, i oto jest w C++11, tyle że ze słowem auto:

auto zmienna = new JakasKlasa();
0

Imo to nie jest nadmiarowa informacja tylko uściślenie, że robisz to co rzeczywiście chcesz. Może przecież być w cpp podobnych taka konstrukcja JakaKlasaT zmienna = new JakaśPochodnaOdT();

0

Żeby się debile nie myliły. Czyli tania siła robocza z trzeciego świata. Przypominam o break w switchu w c#...

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0