konstruktor w C++

Odpowiedz Nowy wątek
2014-06-16 22:33

Rejestracja: 5 lat temu

Ostatnio: 3 lata temu

0

Cześć :)
Czy konstruktor w C++ jest statyczny

Pozostało 580 znaków

2014-06-16 22:35
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

4

To jest czasem dość sporna kwestia, związana z definicją, ale ja bym powiedział że nie jest, bo pracuje na rzecz obiektu (nawet jeśli dopiero jest on w trakcie tworzenia) i ma dostęp do this.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Czego miałby dotyczyć spór? Konstruktor nie jest statyczny. - Endrju 2014-06-16 23:31
no raczej nie jest? skąd aż +3? ciekawe - gośćabc 2014-06-16 23:45
@Endrju tak jak mówiłem - kwestia definicji. Bo jednak nie pozostawia wątpliwości fakt że konstruktor można wywołać nie posiadając obiektu danej klasy, co jest cechą metod statycznych :) - Shalom 2014-06-17 09:20

Pozostało 580 znaków

2014-06-16 23:20

Rejestracja: 5 lat temu

Ostatnio: 3 lata temu

0

a w JAVIE jest?

Pozostało 580 znaków

2014-06-16 23:22
Moderator

Rejestracja: 15 lat temu

Ostatnio: 5 godzin temu

2

W JAvie ma dostęp do this i może wołać metody niestatyczne, więc statyczny nie jest.
Ale nie można wywołać konstruktora na rzecz istniejącego obiektu.
Dlatego konstruktor to po prostu... konstruktor.

Pozostało 580 znaków

2014-06-16 23:46

Rejestracja: 5 lat temu

Ostatnio: 1 tydzień temu

Lokalizacja: Szczecin

trolololo2
2014-06-19 23:47
trolololo2
0

Zacznijmy najpierw od tego, że konstruktor musi być statyczny, bo jakby go wywołała jakaś inna funkcja? A this jest po prostu w ecx albo na stosie.

2014-06-20 00:43

Rejestracja: 14 lat temu

Ostatnio: 30 sekund temu

0

Cały myk w tym, że najpierw jest alokowana pamięć na obiekt i potem wskaźnik na tę pamięć jest przekazywany jako this do konstruktora, więc konstruktor jest metodą na niezainicjowanym obiekcie.

Statyczny konstruktor to zapewne konstruktor inicjalizujący statyczne pola. W C++ chyba czegoś takiego nie ma, bo i nie ma czegoś takiego jak ładowanie klas. Jest statyczne łączenie plików object, a więc kolejność odpalania statycznych konstruktorów zależałaby od kolejności plików object podanych do linkera. Mało rozsądne rozwiązanie.

W Javie jest coś takiego jak konstruktor statyczny, tzn wypełniający pola typu static. Jest on blokiem kodu opatrzonym słówkiem 'static'.
http://stackoverflow.com/ques[...]11/static-initializer-in-java


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2014-06-20 00:46

Pozostało 580 znaków

2014-06-20 00:44

Rejestracja: 5 lat temu

Ostatnio: 3 lata temu

0

W Javie konstruktor JEST statyczny

Pozostało 580 znaków

2014-06-20 00:54

Rejestracja: 14 lat temu

Ostatnio: 30 sekund temu

0

Taki kod:

public class Main {

    public static void main(String[] args) throws Exception {
        Integer i = new Integer(5);
        System.out.println(i.toString());
    }
}

Po przepuszczeniu przez 'javap -c' daje:

Compiled from "Main.java"
public class Main {
  public Main();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]) throws java.lang.Exception;
    Code:
       0: new           #2                  // class java/lang/Integer
       3: dup           
       4: iconst_5      
       5: invokespecial #3                  // Method java/lang/Integer."<init>":(I)V
       8: astore_1      
       9: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      12: aload_1       
      13: invokevirtual #5                  // Method java/lang/Integer.toString:()Ljava/lang/String;
      16: invokevirtual #6                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      19: return        
}

Instrukcja 'new' tworzy niezainicjowany obiekt na stercie. Instrukcja 'dup' duplikuje najwyższy element na stosie, czyli referencję do tego świeżego niezainicjowanego obiektu. Następnie jest instrukcja 'iconst_5' odkładająca na stos liczbę 5 oraz instrukcja 'invokespecial' która odpala konstruktur, pobierający jako parametry referencję do niezainicjowanego obiektu oraz jeden parametr. Na stosie zostaje referencja do poprzednio utworzonego obiektu, ale teraz jest już zainicjowany przez konstruktor. 'astore_1' zdejmuje tą referencję i wkłada ją w slot numer 1 na zmienne lokalne (ZTCP to maszyna Javy jest w części stosowa a w części rejestrowa).


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2014-06-20 00:56

Pozostało 580 znaków

2014-06-20 00:57

Rejestracja: 5 lat temu

Ostatnio: 3 lata temu

0

tak pisze w Thinkingu in Java. Poza tym, dlaczego uważasz, ze Twój kod oznaczać miałby, że konstruktor jest statyczny/

edytowany 1x, ostatnio: mielony, 2014-06-20 00:59

Pozostało 580 znaków

2014-06-20 00:58

Rejestracja: 14 lat temu

Ostatnio: 30 sekund temu

0

W którym miejscu?

Może pomieszałeś zdanie. Np "jest konstruktor statyczny" zamieniłeś na "konstruktor jest statyczny"? :P

Poza tym, dlaczego uważasz, ze Twój kod oznaczać miałby, że konstruktor jest statyczny/

Bajtkod pokazuje że konstruktor obiektu jest niestatyczny, bo wymaga referencji do niezainicjowanego obiektu. Zresztą jak do tej pory nikt nie sprecyzował co to znaczy 'konstruktor statyczny', więc ciężko się kłócić o takie coś ;]


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 4x, ostatnio: Wibowit, 2014-06-20 01:02
resztą jak do tej pory nikt nie sprecyzował co to znaczy 'konstruktor statyczny' -> http://ideone.com/tq2umM Ale wciaz nijak to sie ma do C++. - n0name_l 2014-06-20 05:06

Pozostało 580 znaków

Odpowiedz

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