Kann eine Referenz nicht NULL sein oder NULL sein?
Habe ich gelesen, die aus der Wikipedia:
"Referenzen darf nicht null sein, während die Zeiger können; jede Referenz bezieht sich auf einen Gegenstand, obwohl es möglicherweise oder möglicherweise nicht gültig."
Aber ich glaube nicht, weil der folgende code, an, der compiler gibt keinen Fehler:
class person
{
public:
virtual void setage()=0;
};
int main()
{
person *object=NULL;
person &object1=*object;
}
Bitte erläutern Sie diesen Punkt.
- Der Artikel sollte wohl sagen: "Jede Referenz, die in ein wohlgeformtes Programm bezieht sich auf ein Objekt." Die Dereferenzierung eines null-Zeiger ist natürlich schlecht ausgebildet.
- Ich denke was Sie meinte war
person &object1=object;
, die in der Tat zu einem compiler-Fehler (nicht übereinstimmende Typen). - Und lasst uns nicht alle zu vergessen unsere Lieblings-Geschichte über null-Referenzen: gotw.ca/conv/002.htm
- Die Dereferenzierung eines null-Zeiger führt zu undefiniertem Verhalten; Undefiniertes Verhalten bedeutet nicht, jedoch, machen ein Programm ill-formed.
- Hoppla, du hast Recht. Besser wäre "...Referenz in einem gut definierten Programm... ist natürlich nicht definiert."?
- Das klingt besser für mich. Und I LOLed auf den verlinkten GOTW. "Ich kann ihn lehren; er wird gezogen, um Undefiniertes Verhalten:" leider, ich habe Menschen kennen gelernt, wie das.
- Natürlich, das Programm ist schlecht ausgebildet. Vor allem wegen der fehlenden
int
. - Nicht schon wieder... eine null-Referenz Diskussion... standard explizit Staaten (8.3.2/4) 'ein null-Verweis kann nicht existieren, in einem gut definierten Programm'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sagen
person &object1=*object
ist nicht das gleiche wie von selbstperson &object1=NULL
. Vermutlich ist der compiler einfach nicht schlau genug, um herauszufinden, dass Sie die Dereferenzierung von null-Zeiger ist, aber Sie erhalten einen Laufzeitfehler, sowieso. So sind Sie wahr immer noch 😉In Ihrem code:
du dereference einen NULL-Zeiger, so erhalten Sie ein Undefiniertes Verhalten. Und um Ihre Frage zu beantworten, es gibt keine solche Sache wie ein NULL-Verweis.
Und den anderen Teil Ihrer Frage, nur weil ein Programm kompiliert wird, gibt es keine Garantie, dass es richtig ist, oder, dass es funktionieren wird. C++ - Compiler sind nicht erforderlich, sogar zu versuchen, zu diagnostizieren, die Art des Fehlers enthält Ihr code.
Können Sie eine null-Referenz, nicht sicher, warum jemand würde sonst sagen, es ist eine unangenehme Nebenwirkung, die bei einigen Operationen. Sie können einfach nicht schaffen direkt.
&ref == NULL
- by-doing-selbst-Initialisierung:int& ref = ref;
(das Ergebnis kann alles sein, einschließlich NULL, nehme ich an). - Ich glaube nicht, es wäre etwas falsch Abdeckung der pragmatische Aspekt des Problems, aber Ihre Antwort ist vage, informative und argumentative ("trotz allem, was jeder sagt, [etwas Kauderwelsch Punkt hier]").die zum Absturz Ihres Programms. Haben Sie versucht, läuft es?
tun *Objekt Ehrerbietung einen null-Zeiger, so dass in der Tat Ihre Referenz nie zugewiesen bekommt.
Gut, Sie können tun, was Sie wollen in C++. Ein weiteres Beispiel:
Werden Sie den Aufruf einer undefinierten Verhalten im oben genannten Fall, neben dem Fall, den Sie erwähnt!
reinterpret_cast
zu einemstatic_cast
? (Sie Verhalten sich in diesem Fall natürlich.)clang 3.5 warnt sogar auf eine mögliche spätere NULL-check eines Referenz:
gcc8 geben eine Warnung über es:
Eine kleine demo:
Kompilieren und ausführen Ausgabe: