C++-Ansage #1

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

C++-Ansage #1

Beitrag von Krishty »

Ein wenig unnützes Wissen:

Wann immer gefragt wird, warum this in C++ ein Zeiger ist – und keine self-Referenz – wird darauf verwiesen, dass this vor Referenzen in C++ eingeführt wurde. Was ich aber nie lese ist, dass eine self-Referenz einen handfesten Nachteil hätte: Da C++ die Überladung des Addressoperators & erlaubt, könnte man mit einer Referenz in Situationen kommen, in denen es unmöglich wäre, die reale Adresse eines Objekts zu bestimmen, sogar von dem Objekt selber aus:

Code: Alles auswählen

class NullAddressObject {
public:
    void * operator & () {
        return nullptr;
    }
};
Jeder Versuch der Klasse, ihre echte Adresse zu erfahren, würde zwangsläufig in einem &self und damit in nullptr münden. In dem konkreten Beispiel ist das Nonsens; es gibt jedoch Situationen – Wrapper seien eine – in denen es sinnvoll ist, & daraufhin zu überladen, die Adresse eines Attributs statt des Objekts selber zurückzugeben. Solche Objekte würden ohne Möglichkeit eines this-Zeigers unantastbar.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: C++-Ansage #1

Beitrag von Krishty »

Ich merke gerade, dass man auch Referenzen casten kann. Ich sollte wirklich mal wieder schlafen.
auto this = reinterpret_cast<NullAddressObject * const>(&reinterpret_cast<char &>(self));

Aber gut, dass wir mal drüber geredet haben m[
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: C++-Ansage #1

Beitrag von Eisflamme »

Ist es nicht auch ein Argument, dass Referenzen nicht nullptr sein können? Wenn man eine Methode eines Objektes aufruft, das nicht existiert, hätte man ja dann Probleme. Wobei MSVC mir auch schon Mal von einer ungültigen Referenz erzählt hat, aber dafür weiß ich zu wenig über Referenzen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: C++-Ansage #1

Beitrag von Krishty »

Eisflamme hat geschrieben:Ist es nicht auch ein Argument, dass Referenzen nicht nullptr sein können? Wenn man eine Methode eines Objektes aufruft, das nicht existiert, hätte man ja dann Probleme.
Laut Standard ist es undefiniert, einen Nullzeiger zu dereferenzieren. Wenn du eine Methode aufrufst, ist -> bereits eine Dereferenzierung. this kann also in einem gültigen C++-Programm nicht nullptr sein.

Nachtrag:
C++0x Draft hat geschrieben:If E1 has the type “pointer to class X,” then the expression E1->E2 is converted to the equivalent form (*(E1)).E2;
x->y gleicht also (*(x)).y, und *x ist eine Indirection, und die ist auf nullptr nicht definiert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: C++-Ansage #1

Beitrag von Eisflamme »

Stimmt. Ok.
Antworten