Nein, es ist nur erforderlich, es auf nicht virtuellen nicht statischen Elementfunktionen zu aktivieren.
Auf statischen Elementen ist this
verboten, also ok.
Auf nicht-virtuelle nicht-statische Elemente, wie Anrufe vom Compiler dann ein Aufruf wie ptr->f()
statisch bestimmt werden kann wie f(ptr)
etwas übersetzt werden, so dass Sie einen null this
haben kann! Seltsam aber möglich. Du kannst es also behaupten.
Auf virtuelle Mitglieder, wie Anrufe dynamisch berechnet werden, kann dies nie passieren. Um die Funktion zu finden, ist es notwendig, den Zeiger zu dereferenzieren (konsultiere die vtable über den Zeiger), so dass die Maschine zu diesem Zeitpunkt abstürzt (Dereferenzierung eines Nullzeigers stürzt immer ab), kurz bevor du eine Chance hast, den effektiven Aufruf zu machen .
Experiment mit diesem:
#include <iostream>
using namespace std;
struct foo {
int bar;
void baz() { bar = 1; }
void barf() { int i = 5; cout << "barf" << this << endl;}
virtual void barf2() { int i = 5; cout << "barf2" <<this << endl;}
};
int main() {
struct foo * crash = 0;
crash->barf(); // do not crash
crash->barf2(); // crash
//crash->baz(); // crash
}
'struct foo {int bar; Leere baz() {bar = 1; }} * Absturz = 0; crash-> baz(); 'Hey presto,' this' ist NULL. –
@ JonathanPotter ist es? :) Ich sage, dass 'crash-> baz()' ein undefiniertes Verhalten ist, also kann alles danach passieren. –
@ JonathanPotter: Hey presto, 'this' wurde in einen köstlichen Käseklumpen verwandelt. –