C # und Java unterscheiden sich in zwei interessanten Punkten von C ++. Zunächst versuchen sie, die primitiven Typen mit den Objekt- (und Struktur-) Typen zu vereinheitlichen (damit Sie über eine Instanz von int sprechen können), während dies in C ++ nicht der Fall ist. Zweitens sind Variablen von Objekttypen in C # und Java implizit Verweise auf Instanzen (von Klassen) im Heap und auch, dass wir nicht über Zeiger auf Objekte sprechen, während in C ++, wie die Antwort von @ coredump, lokale Variablen von Objekttypen sind Bindungen an Instanzen auf dem Stapel, und wir unterscheiden explizit zwischen Objekten und Zeigern auf Objekte.
Erik Eidt
Antworten:
8
Soweit ich weiß, ist es richtig, Werte von Instanzen primitiver Typen dieses Typs aufzurufen (siehe zum Beispiel "C ++ Type System" aus dem Visual Studio-Handbuch, aber ich suche immer noch nach einer anderen Quelle), obwohl ich glaube, dass dies der Fall ist Wird meistens bei der Diskussion von Objekten verwendet. Ein Objekt ist eine Instanz einer Klasse C, wenn es aus einem Konstruktor erstellt wurde, der entweder in Klasse C oder einer seiner Unterklassen definiert ist.
Eine Variable in C ++ ist kein Laufzeitkonzept. Es existiert in Ihrem Compiler als lexikalische Bindung zwischen dem Namen der Variablen und einem abstrakten (veränderlichen, wenn nicht konstanten) Speicherort. Sobald ein Programm kompiliert ist, sind keine Variablen mehr vorhanden. Stattdessen werden Daten in Registern, Speicher usw. gelesen und geschrieben.
" Werte primitiver Typen werden im Allgemeinen nicht als Instanzen dieses Typs bezeichnet. Sie sind Objekten und Klassen vorbehalten. " Das stimmt überhaupt nicht. Nirgendwo im Standard werden Werte primitiver Typen nicht als Objekte betrachtet. Die Definition einer Variablen ändert sich auch nicht in Abhängigkeit davon, ob es sich um eine benutzerdefinierte Klasse oder einen primitiven Typ handelt.
Nicol Bolas
@NicolBolas Ich habe noch nie gehört, dass jemand Ganzzahlen als Instanzen von etwas im Kontext von C ++ bezeichnet, und ich bin mir ziemlich sicher, dass es richtig ist zu sagen, dass sie keine Instanzen von irgendetwas sind, auch wenn der Standard dies nicht ausdrücklich erwähnt. Wenn nicht, wovon sind sie? Ich sehe auch nicht, wo diese Antwort behauptet, dass sich die Definition einer Variablen zwischen primitiven Typen und Objekten ändert; es scheint (afaik richtig) zu behaupten, dass "Instanzen" einfach nichts mit der Definition einer Variablen zu tun haben.
Ixrec
2
@Ixrec: " Wenn nicht, von welchen Instanzen sind sie? " Der Typ int. Der C ++ - Standard unterscheidet nicht zwischen primitiven und nicht primitiven Typen, wenn es darum geht, was Variablendeklarationen tun. So T t;erklärt ein Objekt vom Typ T, egal welche Art Tsein geschieht.
Nicol Bolas
1
@Ixrec: Beachten Sie, dass Literale etwas anderes sind. Literale sind eine Art Wert. Sie können jedoch keine wörtlichen Variablen erstellen. Das ist also eine andere Diskussion.
Nicol Bolas
5
Oder ist 'Instanz von etwas' eng mit Klassen und Objekten verbunden? Wenn ja, wie würden Sie das Konzept der 'Variablen' in Bezug auf C ++ definieren?
Um es für C ++ so kurz wie möglich zu halten
Eine Variable ist ein Name (im Code) für einen Speicherort im Speicher , der zur Laufzeit bestimmt wird.
Eine Instanz ist ein Objekt, das sich zur Laufzeit im Speicher befindet .
Nur um das klar zu stellen:
Nicht alle Speicherbereiche enthalten Objekte. Beispielsweise können einige Speicherbereiche "Müll" -Werte enthalten.
Nicht allen speicherspeichernden Objekten wurde im Code ein Name zugewiesen. Objekte können sich in nicht benannten Speicherbereichen befinden, z. B. an einer Position in einem Array oder irgendwo auf dem Heap , auf den ein Zeiger verweist.
Wenn ein Speicherbereich Müll enthält, liegt dies normalerweise entweder daran, dass an diesem Ort kein Objekt initialisiert wurde, oder daran, dass ein zuvor vorhandenes Objekt zerstört wurde.
PODs sind Objekte in C ++. Nicht alle Speicherbereiche sind Objekte, aber PODs sind nicht nur Speicherbereiche.
Nicol Bolas
1
Ich zweite NicolBolas: PODs sind Objekte. Sie haben jedoch einen Punkt, an dem Sie über einen neu erstellten malloc(), aber nicht initialisierten Puffer sprechen : Es ist ein Speicherbereich, der noch kein Objekt ist. Ebenso ein Objekt, das explizit zerstört wurde: Es ist ein Speicherbereich, der kein Objekt mehr ist.
cmaster
@NicolBolas fairer Kommentar, ich habe diesen Wortlaut leicht geändert
Ben Cottrell
1
Was bedeutet "richtig"?
Wenn wir sehr streng sein wollen, müssen wir unterscheiden zwischen:
Die Syntaxseite : Ausdrücke haben (statische) Typen
Die semantische Seite: Objekte sind Instanzen von Klassen
So dann ein variabler ist ein Ausdruck-würde haben einen Typ. Sein Wert - das Objekt, auf das er sich bezieht - wäre eine Instanz einer Klasse. Beachten Sie, dass der Variablentyp und die Objektklasse im Allgemeinen nicht identisch sind. Der statische Typ der Variablen legt eine Obergrenze für die Laufzeitklassen der Objekte fest, sodass die Klassen ein Untertyp der Klasse sein müssen, die dem Typ entspricht.
Möchten Sie diesen großen Schluck die ganze Zeit wiederholen? Mist nein. Wie streng oder locker wir reden wollen, hängt vom Kontext ab. So oft ist es wirklich kein Problem zu sagen, dass "die Variable eine Instanz dieses Typs ist". Was dort wirklich passiert, ist, dass wir die Variable und den Typ metonymisch verwenden, um auf das Objekt und eine Oberklasse seiner Laufzeitklasse zu verweisen.
Es sei denn, Sie möchten Ihr ganzes Leben in Purismus und Sophismus verbringen ... ja.
Jedes Mal, wenn Sie etwas behalten, das eindeutig identifiziert wurde, können Sie andere eindeutig identifizierbare Dinge fälschen , die Sie instanziieren.
Ein Projekt instanziiert in Produkte
Eine Quelle instanziiert in ausführbare Dateien
Eine Vorlage instanziiert in Typen.
Ein Typ instanziiert in Variablen.
Einige dieser Instanziierungen haben möglicherweise genauere Namen, aber im Allgemeinen funktioniert dies.
Viele Leute reservieren "Instanz" für Instanzen von Klassen. Wenn Sie dies dann in C ++ tun, kann eine Variable eine Instanz einer Klasse, ein Verweis auf eine Instanz, ein Zeiger auf eine Instanz oder ein primitiver Typ sein (Sie würden in diesem Kontext wahrscheinlich Strukturen als Klassen zählen, das sind sie fast ganz das gleiche). In Java oder Objective-C wären Variablen niemals Instanzen, sondern möglicherweise Verweise auf Instanzen.
Vergessen: Für kurze Zeit kann ein C ++ - Zeiger ein Zeiger auf den Rohspeicher sein, z. B. "this", bevor der Konstruktor mit der Ausführung beginnt. Sie würden * dies zu diesem Zeitpunkt wahrscheinlich noch nicht als Instanz bezeichnen.
Antworten:
Soweit ich weiß, ist es richtig, Werte von Instanzen primitiver Typen dieses Typs aufzurufen (siehe zum Beispiel "C ++ Type System" aus dem Visual Studio-Handbuch, aber ich suche immer noch nach einer anderen Quelle), obwohl ich glaube, dass dies der Fall ist Wird meistens bei der Diskussion von Objekten verwendet. Ein Objekt ist eine Instanz einer Klasse C, wenn es aus einem Konstruktor erstellt wurde, der entweder in Klasse C oder einer seiner Unterklassen definiert ist.
Eine Variable in C ++ ist kein Laufzeitkonzept. Es existiert in Ihrem Compiler als lexikalische Bindung zwischen dem Namen der Variablen und einem abstrakten (veränderlichen, wenn nicht konstanten) Speicherort. Sobald ein Programm kompiliert ist, sind keine Variablen mehr vorhanden. Stattdessen werden Daten in Registern, Speicher usw. gelesen und geschrieben.
quelle
int
. Der C ++ - Standard unterscheidet nicht zwischen primitiven und nicht primitiven Typen, wenn es darum geht, was Variablendeklarationen tun. SoT t;
erklärt ein Objekt vom TypT
, egal welche ArtT
sein geschieht.Um es für C ++ so kurz wie möglich zu halten
Nur um das klar zu stellen:
quelle
malloc()
, aber nicht initialisierten Puffer sprechen : Es ist ein Speicherbereich, der noch kein Objekt ist. Ebenso ein Objekt, das explizit zerstört wurde: Es ist ein Speicherbereich, der kein Objekt mehr ist.Was bedeutet "richtig"?
Wenn wir sehr streng sein wollen, müssen wir unterscheiden zwischen:
So dann ein variabler ist ein Ausdruck-würde haben einen Typ. Sein Wert - das Objekt, auf das er sich bezieht - wäre eine Instanz einer Klasse. Beachten Sie, dass der Variablentyp und die Objektklasse im Allgemeinen nicht identisch sind. Der statische Typ der Variablen legt eine Obergrenze für die Laufzeitklassen der Objekte fest, sodass die Klassen ein Untertyp der Klasse sein müssen, die dem Typ entspricht.
Möchten Sie diesen großen Schluck die ganze Zeit wiederholen? Mist nein. Wie streng oder locker wir reden wollen, hängt vom Kontext ab. So oft ist es wirklich kein Problem zu sagen, dass "die Variable eine Instanz dieses Typs ist". Was dort wirklich passiert, ist, dass wir die Variable und den Typ metonymisch verwenden, um auf das Objekt und eine Oberklasse seiner Laufzeitklasse zu verweisen.
quelle
Es sei denn, Sie möchten Ihr ganzes Leben in Purismus und Sophismus verbringen ... ja.
Jedes Mal, wenn Sie etwas behalten, das eindeutig identifiziert wurde, können Sie andere eindeutig identifizierbare Dinge fälschen , die Sie instanziieren.
Einige dieser Instanziierungen haben möglicherweise genauere Namen, aber im Allgemeinen funktioniert dies.
quelle
Viele Leute reservieren "Instanz" für Instanzen von Klassen. Wenn Sie dies dann in C ++ tun, kann eine Variable eine Instanz einer Klasse, ein Verweis auf eine Instanz, ein Zeiger auf eine Instanz oder ein primitiver Typ sein (Sie würden in diesem Kontext wahrscheinlich Strukturen als Klassen zählen, das sind sie fast ganz das gleiche). In Java oder Objective-C wären Variablen niemals Instanzen, sondern möglicherweise Verweise auf Instanzen.
Vergessen: Für kurze Zeit kann ein C ++ - Zeiger ein Zeiger auf den Rohspeicher sein, z. B. "this", bevor der Konstruktor mit der Ausführung beginnt. Sie würden * dies zu diesem Zeitpunkt wahrscheinlich noch nicht als Instanz bezeichnen.
quelle