C # i Java różnią się od C ++ na dwa interesujące sposoby. Po pierwsze, próbują ujednolicić typy pierwotne z typami obiektów (i struct) (abyś mógł mówić o instancji int), podczas gdy C ++ nie. Po drugie, w języku C # i Javie zmienne typów obiektów są domyślnie odniesieniami do instancji (klas) w stercie, a także, że nie mówimy o wskaźnikach do obiektów, podczas gdy w C ++, jak odpowiedź @ coredump, lokalne zmienne typów obiektów są powiązaniami instancji na stosie i wyraźnie rozróżniamy obiekty od wskaźników do obiektów.
Erik Eidt
Odpowiedzi:
8
O ile mi wiadomo, prawidłowe jest wywoływanie wartości instancji typów pierwotnych tego typu (patrz na przykład „System typów C ++” z podręcznika Visual Studio, ale wciąż szukam innego źródła), chociaż uważam, że ten termin to najczęściej używany podczas omawiania przedmiotów. Obiekt jest instancją klasy C, jeśli został zbudowany z konstruktora zdefiniowanego w klasie C lub jednej z jego podklas.
Zmienna w C ++ nie jest pojęciem środowiska wykonawczego. Istnieje w twoim kompilatorze jako leksykalne powiązanie między nazwą zmiennej a abstrakcyjną (zmienną, jeśli nie stałą) lokalizacją. Po kompilacji programu zmiennych już nie ma. Zamiast tego dane są odczytywane i zapisywane w rejestrach, pamięci itp.
„ Wartości typów pierwotnych zwykle nie są uważane za instancje tego typu; są zastrzeżone dla obiektów i klas. ” To wcale nie jest prawda. Nigdzie w standardzie nie ma wartości typów pierwotnych, które nie są uważane za obiekty. Definicja zmiennej nie zmienia się w żaden sposób w zależności od tego, czy jest to klasa zdefiniowana przez użytkownika, czy typ pierwotny.
Nicol Bolas,
@NicolBolas Nigdy nie słyszałem, aby ktokolwiek mówił o liczbach całkowitych jako przykładach czegoś w kontekście C ++, i jestem prawie pewien, że słusznie jest powiedzieć, że nie są to przypadki, nawet jeśli standard nie mówi wprost o tym. Jeśli nie, jakie są ich wystąpienia? Nie widzę też, gdzie ta odpowiedź twierdzi, że definicja zmiennej zmienia się pomiędzy typami pierwotnymi i obiektami; wydaje się (afaik poprawnie) twierdzić, że „instancje” po prostu nie mają nic wspólnego z definicją zmiennej.
Ixrec,
2
@Ixrec: „ Jeśli nie, jakie są ich wystąpienia? ” Typ int. Standard C ++ nie rozróżnia typów pierwotnych i typów innych niż pierwotne, mówiąc o tym, co robią deklaracje zmiennych. T t;Deklaruje więc obiekt typu T, bez względu na to, jaki typ się Tstanie.
Nicol Bolas,
1
@Ixrec: Zauważ, że literały to coś innego. Literały są rodzajem wartości. Ale nie można tworzyć literalnych zmiennych, więc to inna dyskusja.
Nicol Bolas,
5
A może „instancja czegoś” jest ściśle związana z klasami i przedmiotami? Jeśli tak, to jak zdefiniowałbyś pojęcie „zmiennej”, jeśli chodzi o C ++?
Mówiąc tak zwięźle, jak to możliwe dla C ++
Zmienna jest nazwa (na kodzie) na miejscu w pamięci , aby ustalić w czasie wykonywania.
Przykład jest obiekt , który znajduje się w pamięci, w czasie wykonywania.
Żeby było jasne:
Nie wszystkie obszary pamięci zawierają obiekty. Na przykład niektóre obszary pamięci mogą zawierać wartości „śmieci”.
Nie wszystkie obiekty przechowujące pamięć otrzymają nazwę w kodzie. Obiekty mogą znajdować się w obszarach un nazwie pamięci, takich jak pozycja w tablicy, albo gdzieś na Heap wskazywanego przez wskaźnik.
Kiedy obszar pamięci zawiera śmieci, zwykle dzieje się tak dlatego, że żaden obiekt nie został zainicjowany w tym miejscu lub dlatego, że jakiś wcześniej istniejący obiekt został zniszczony.
POD są obiektami w C ++. Nie wszystkie regiony pamięci są obiektami, ale POD nie są tylko regionami pamięci.
Nicol Bolas,
1
Po drugie NicolBolas: POD są obiektami. Masz malloc()jednak rację , mówiąc o nowo utworzonym , ale niezainicjowanym buforze: jest to obszar pamięci, który nie jest jeszcze obiektem. Podobnie obiekt, który został jawnie zniszczony: jest to obszar pamięci, który nie jest już obiektem.
cmaster
@NicolBolas uczciwy komentarz, nieznacznie zmieniłem to sformułowanie
Ben Cottrell,
1
Co znaczy „poprawne”?
Jeśli chcemy być wobec tego bardzo surowi, musimy rozróżnić:
Składnia strona: wyrażenia mają (statyczne) rodzaje
Semantyka strona: obiekty są przypadki z klas
Tak więc zmienna samopoczucie wyrazem, by mieć typ. Jego wartość - obiekt, do którego się odnosi - byłaby instancją jakiejś klasy. I zauważ, że typ zmiennej i klasa obiektu nie są zasadniczo tym samym - typ statyczny zmiennej nakłada górną granicę na klasy środowiska wykonawczego obiektów, więc klasy muszą być podtypem klasy, która odpowiada typowi.
Czy chcesz cały czas powtarzać ten duży kęs? Na pewno nie. To, jak ściśle i luźno chcemy rozmawiać, zależy od kontekstu. Tak często nie ma problemu ze stwierdzeniem, że „zmienna jest instancją tego typu”. Tak naprawdę dzieje się tak, że używamy zmiennej i typu metonimicznie w odniesieniu do obiektu i nadklasy jego klasy wykonawczej.
Chyba że chcesz spędzić całe życie w puryzmie i sofizmie ... tak.
Za każdym razem, gdy przechowujesz coś, co jest jednoznacznie zidentyfikowane, wykorzystujesz do tworzenia innych niepowtarzalnie identyfikowalnych rzeczy, które wykonujesz.
Projekt tworzy się w produkty
Źródło tworzy się w plikach wykonywalnych
Szablon tworzy się w typy.
Typ tworzy się w zmienne.
Niektóre z tych instancji mogą mieć dokładniejsze nazwy, ale ogólnie to działa.
Wiele osób rezerwuje „instancję” na instancje zajęć. Jeśli zrobisz to wtedy w C ++, zmienna może być instancją klasy, referencją do instancji, wskaźnikiem do instancji lub typem prymitywnym (prawdopodobnie w tym kontekście struktury są liczone jako klasy, są prawie całkowicie to samo). W Javie lub Objective-C zmienne nigdy nie byłyby instancjami, ale prawdopodobnie byłyby odwołaniami do instancji.
Zapomniałem: przez krótki czas wskaźnik C ++ może być wskaźnikiem do surowej pamięci, na przykład „to”, zanim konstruktor zacznie działać. W tym momencie prawdopodobnie nie nazwałbyś tego * instancją.
Odpowiedzi:
O ile mi wiadomo, prawidłowe jest wywoływanie wartości instancji typów pierwotnych tego typu (patrz na przykład „System typów C ++” z podręcznika Visual Studio, ale wciąż szukam innego źródła), chociaż uważam, że ten termin to najczęściej używany podczas omawiania przedmiotów. Obiekt jest instancją klasy C, jeśli został zbudowany z konstruktora zdefiniowanego w klasie C lub jednej z jego podklas.
Zmienna w C ++ nie jest pojęciem środowiska wykonawczego. Istnieje w twoim kompilatorze jako leksykalne powiązanie między nazwą zmiennej a abstrakcyjną (zmienną, jeśli nie stałą) lokalizacją. Po kompilacji programu zmiennych już nie ma. Zamiast tego dane są odczytywane i zapisywane w rejestrach, pamięci itp.
źródło
int
. Standard C ++ nie rozróżnia typów pierwotnych i typów innych niż pierwotne, mówiąc o tym, co robią deklaracje zmiennych.T t;
Deklaruje więc obiekt typuT
, bez względu na to, jaki typ sięT
stanie.Mówiąc tak zwięźle, jak to możliwe dla C ++
Żeby było jasne:
źródło
malloc()
jednak rację , mówiąc o nowo utworzonym , ale niezainicjowanym buforze: jest to obszar pamięci, który nie jest jeszcze obiektem. Podobnie obiekt, który został jawnie zniszczony: jest to obszar pamięci, który nie jest już obiektem.Co znaczy „poprawne”?
Jeśli chcemy być wobec tego bardzo surowi, musimy rozróżnić:
Tak więc zmienna samopoczucie wyrazem, by mieć typ. Jego wartość - obiekt, do którego się odnosi - byłaby instancją jakiejś klasy. I zauważ, że typ zmiennej i klasa obiektu nie są zasadniczo tym samym - typ statyczny zmiennej nakłada górną granicę na klasy środowiska wykonawczego obiektów, więc klasy muszą być podtypem klasy, która odpowiada typowi.
Czy chcesz cały czas powtarzać ten duży kęs? Na pewno nie. To, jak ściśle i luźno chcemy rozmawiać, zależy od kontekstu. Tak często nie ma problemu ze stwierdzeniem, że „zmienna jest instancją tego typu”. Tak naprawdę dzieje się tak, że używamy zmiennej i typu metonimicznie w odniesieniu do obiektu i nadklasy jego klasy wykonawczej.
źródło
Chyba że chcesz spędzić całe życie w puryzmie i sofizmie ... tak.
Za każdym razem, gdy przechowujesz coś, co jest jednoznacznie zidentyfikowane, wykorzystujesz do tworzenia innych niepowtarzalnie identyfikowalnych rzeczy, które wykonujesz.
Niektóre z tych instancji mogą mieć dokładniejsze nazwy, ale ogólnie to działa.
źródło
Wiele osób rezerwuje „instancję” na instancje zajęć. Jeśli zrobisz to wtedy w C ++, zmienna może być instancją klasy, referencją do instancji, wskaźnikiem do instancji lub typem prymitywnym (prawdopodobnie w tym kontekście struktury są liczone jako klasy, są prawie całkowicie to samo). W Javie lub Objective-C zmienne nigdy nie byłyby instancjami, ale prawdopodobnie byłyby odwołaniami do instancji.
Zapomniałem: przez krótki czas wskaźnik C ++ może być wskaźnikiem do surowej pamięci, na przykład „to”, zanim konstruktor zacznie działać. W tym momencie prawdopodobnie nie nazwałbyś tego * instancją.
źródło