Call by value, call by reference
-
blub85 schrieb:
Aber worin liegen da die genauen Unterschiede/Vorteile?
Eine C++ Referenz ist der Aliasname für ein konkretes gültiges Objekt, das Objekt kannst du bei einer Referenz nicht tauschen, ebenso muss es ein gültiges Objekt sein (NULL ist unzulässig). Das liegt alleine schon an der Tatsache das eine Referenz theoretisch keinen Speicherplatz zur Laufzeit einnehmen muss (es aber in der Regel dennoch tut, das ist aber Situations- und Compilerabhängig).
Eine C++ Zeiger kann jederzeit auf ein anderes Objekt verweisen, da er nur eine Speicheradresse ist, die beliebig geändert werden kann. Somit ist auch ein NULL-Wert zulässig.
Von der Benutzung her sind Referenzen meist angenehmer. Ich kenne viele die Zeiger nur dann verwenden, wenn NULL-Werte zulässig sind, und ansonsten Referenzen verwenden.
-
Eine C++ Referenz ist der Aliasname für ein konkretes gültiges Objekt, das Objekt kannst du bei einer Referenz nicht tauschen, ebenso muss es ein gültiges Objekt sein (NULL ist unzulässig).
int& ri = *reinterpret_cast<int*>(0);
-
Ethon schrieb:
int& ri = *reinterpret_cast<int*>(0);
Speicherzugriffsfehler.
EDIT: Scheinbar doch nicht:
include <iostream> int main() { int& ri = *reinterpret_cast<int*>(0); std::cout << (&ri == 0) << std::endl; }Ausgabe:
1

-
pyhax schrieb:
Ethon schrieb:
int& ri = *reinterpret_cast<int*>(0);
Speicherzugriffsfehler.
Nö, wieso?
-
Ätsch.
http://ideone.com/DbrWn
-
Aber ist das erlaubt? Nicht UB oder IB?
-
pyhax schrieb:
Aber ist das erlaubt? Nicht UB oder IB?
Doch UB, aber das heißt ja gerade nicht, dass der Compiler unbedingt dafür sorgen muss, dass normalerweise harmloser Code plötzlich Speicherfehler erzeugen muss.
-
Bashar schrieb:
pyhax schrieb:
Aber ist das erlaubt? Nicht UB oder IB?
Doch UB, aber das heißt ja gerade nicht, dass der Compiler unbedingt dafür sorgen muss, dass normalerweise harmloser Code plötzlich Speicherfehler erzeugen muss.
So meinte ich das auch gar nicht. Ich dachte nur, es würde einen Speicherfehler verursachen, weil (int)(0) ja einen Nullpointer dereferenziert. Und als es dann keinen Speicherfehler gab, wollte ich wissen, ob es vlt irgend eine Klausel im Standard gibt, dass die Dereferenzierung eines Nullpointers bei der Initialisierung eine Referenz erlaubt ist.
-
Es ist keine richtige Dereferenzierung, da ja auf niedrigerer Ebene eine Referenz nichts anderes als ein Zeiger ist. Unter der Haube wurde da eigentlich nur der Wert eines Zeigers in eine Referenz kopiert.
Dereferenziert muss erst werden, sobald auf den Wert zugegriffen wird. Und da hättes BUMM gemacht:
int& ri = *static_cast<int*>(0); std::cout << ri + 7; // BUMM
-
Es ist natürlich trotzdem undefiniert ohne Ende, nicht dass hier ein falscher Eindruck entsteht. Eine Referenz muss nicht durch Pointer implementiert sein, sie muss nicht einmal eine Adresse oder überhaupt irgendeine Art von Wert haben. Und das gezeigte ist auch keine echte Nullreferenz, da es bei der kleinsten Berührung explodiert, sondern einfach ein bisschen Klugscheißen und zum Denken anregen.