Warum funktioniert folgendes?
-
Ausgabe:
Foo(const int& a)
123~Foo()Ist das Foo das gier erstellt wird kein temporäres Object? Wenn nein, was is es dann und was ist dann ein temp. obj.?
-
codetester schrieb:
Ausgabe:
Foo(const int& a)
123~Foo()Ist das Foo das gier erstellt wird kein temporäres Object? Wenn nein, was is es dann und was ist dann ein temp. obj.?
Ich bezog mich auf die Frage "Oder wird da nochmals ein temporäres Objekt vom Typ Foo erzeugt", und die ist nein. Es wird genau einmal ein Objekt erzeugt und wieder freigegeben (und nicht zusätzlich noch ein weiteres Temporäres).
Ein temporäres Objekt ist ein Objekt das nur für eine Zwischenumwandlung/Zuweisung... existiert und nicht einer Variablen zugewiesen wird. Nach dieser Definition gibt es hier kein solches.
cu André
-
es wird eins erzeugt, auf die die referenz verweist, ohne die das "&" hätte man zwei objekte;)
-
BorisDieKlinge schrieb:
es wird eins erzeugt, auf die die referenz verweist, ohne die das "&" hätte man zwei objekte;)
Auch falsch, warum sollten dann 2 Objekte erzeugt werden?
Foo a(1); // Ist identisch mit... Foo b = 1; // ...nämlich beides ein einfacher Konstruktoraufruf Foo c = b; // Ist ein Kopierkonstruktor c = a; // Dies eine Zuweisung
cu André
-
ohne das "const " gehts nich.. wieso???
-
frage const schrieb:
ohne das "const " gehts nich.. wieso???
Weil eine Referenz nur auf ein Objekt verweisen kann. Eine const Referenz verhält sich hierbei anders - Das an die const Referenz gebundene fungiert in etwa wie ein normales Objekt und bleibt auch für die Funktion erhalten.
Foo& a = 1;
funktioniert deshalb nicht weil 1 kein gültiges Fooobjekt ist, das auch noch nach der Zuweisung erhalten bleibt.
const Foo& a = 1;
funktioniert, da bei einer const Referenz das Objekt tatsächlich bestehen bleibt. Wobei hier eh fragwürdig ist warum man an dieser Stelle nicht mit einem Objekt statt einer Referenz arbeitet.
cu André
-
Vielen Dank für die Antworten
-
const Foo& Test = 123;
ne referenz von foo. vll. hat dich das verwirrt, also das & bei der initialisierung ^^ normalerweise sieht man ja nur *
der unterschied ist einfach das du bei ner referenz den wert ( sprich die adresse ( siehe pointer, adressen, referenzen ) ) nicht verändern kannst.
-
asc irrt sich hier doch total, ich bitte camper darum, ihn mal zurecht zu weisen!
-
Bei so einer Zuweisung wird ein temporäres Objekt erzeugt, und an die Referenz gebunden. Normalerweise lebt so ein temporäres Objekt nur bis zum Ende des definierenden Audrucks:
Foo(10); //in dieser Zeile wird Foo geboren und es stirbt auch wieder.
Dadurch, dass man es an eine Referenz hängt, wird seine Lebensdauer aber auf die Lebensdauer der Referenz ausgedehnt.
{ Foo& foo = 10; //hier wird foo geboren } //und hier stirbt es zusammen mit der Referenz.
So wird durch denn Compiler sichergestellt, dass es keine hängenden Referenzen gibt. Dies darf per Definition nicht passieren.
Achso, und da der Standard verbietet, dass man nicht constante Referenzen auf temporäre Objekte anlegt, meckert der Compiler, wenn man das const weglässt.
-
asc mit IP-Hash: AF3DD625 schrieb:
...
asc@ausgeloggt mit IP-Hash: AF3DD625 schrieb:
...
Warum schreibst du einmal ein und einmal ausgeloggt, wenn du immer die gleiche IP hast? Hast du zwei Rechner und loggst dich nur bei einem ein?
-
forum_dev schrieb:
asc mit IP-Hash: AF3DD625 schrieb:
...
asc@ausgeloggt mit IP-Hash: AF3DD625 schrieb:
...
Warum schreibst du einmal ein und einmal ausgeloggt, wenn du immer die gleiche IP hast? Hast du zwei Rechner und loggst dich nur bei einem ein?
Ich sage nur 2 dumme 1 gedanke. Ich hab jetzt auch mal angefangen die Welt der IP hashs zu erforschen. (mein hash ist auch bei 1 monat alten Posts noch derselbe, quasi-statische IP!)
-
const Foo& Test = 123;
Hier entstehen zwei temporäre Objekte.
Die Referenz Test kann nicht direkt an das durch den initialisierenden Ausdruck bezeichnete Objekt gebunden werden, da der Ausdruck 123 kein Objekt bezeichnet. Weil die Referenz Test aber eine Referenz auf nicht-volatile const Foo ist, kann sie auch durch Konvertierung des initialisierenden Ausdrucks nach const Foo (was die Erstellung eines temporären Objektes des Typs const Foo impliziert) initialisiert werden. 123 ist keine Klasse, folglich existiert dafür auch kein Konvertierungsoperator nach Foo. Foo besitzt allerdings einen Konstruktor, der eine Referenz auf const int als Parameter hat. Dieser Konstruktor kann genutzt werden:
123 ist kein Objekt und kann folglich nicht direkt an den Refernzparameter gebunden werden. Weil dieser Referenzparameter aber vom Typ nicht-volatile const int& ist und eine Standardkonvertierungssequenz von int nach const int existiert, wird ein temporäres Objekt des Typs const int mit dem Wert 123 erzeugt und der Konstruktorparameter daran gebunden.Das temporäre Objekte des Typs const int wird an einen Funktionsparameter gebunden - damit lebt es solange wie der vollständige Ausdruck, der den Funktionsaufruf enthält (unabhängig davon, dass dieser Aufruf implizit erfolgt). Der vollständige Ausdruck ist hier
const Foo& Test = 123;
Das ist zwar kein Ausdruck im grammatikalischen Sinne, aber der Begriff "vollständiger Ausdruck" ist umfassender definiert (1.9/12). Das temporäre int-Objekt wird also erst zerstört, nachdem Test initialisiert wurde (das ist nur eine formale Angelegenheit, da die Erzeugung und Zerstörung solcher skalarer Objekte ohnehin nicht beobachtbar ist).
Das durch den Konstruktoraufruf erzeugte const Foo-Objet wird an eine Referenz gebunden und lebt daher (da keine der spezielleren Regeln anzuwenden ist) solange wie die Refernz es tut; wird also erst beim Verlassen des Blocks zerstört.
-
forum_dev schrieb:
asc mit IP-Hash: AF3DD625 schrieb:
...
asc@ausgeloggt mit IP-Hash: AF3DD625 schrieb:
...
Warum schreibst du einmal ein und einmal ausgeloggt, wenn du immer die gleiche IP hast? Hast du zwei Rechner und loggst dich nur bei einem ein?
Rätsel über Rätsel
Nein, auf dem Rechner werden keine Cookies gespeichert, und ich bin manchmal zu faul auf Login zu klicken, bzw. vergesse es nachdem ich meine Antwort schon am tippen bin. Ist es aber nicht eigentlich Wurst (Ich brauche meinen Counter ja nicht immer zu erhöhen ;p )?
cu André