Accès aux membres de classe sur un pointeur NULL
Bien qu'elle ait été déclarée comme pointeur vers une instance de type Foo, la variable foo est initialisée à 0, ce qui en fait un pointeur nul. Cela peut sembler contre-intuitif, car l'accès aux membres d'un pointeur nul est généralement un comportement indéfini. Cependant, certaines circonstances autorisent ce comportement.
Invocation de méthode non virtuelle
La méthode non virtuelle say_hi() est invoquée avec succès malgré le pointeur nul car elle n'est pas une méthode virtuelle. Les méthodes virtuelles nécessitent un objet valide pour déterminer quelle fonction appeler en fonction du type de l'objet. Les méthodes non virtuelles, en revanche, ont une adresse de fonction prédéterminée que le compilateur utilise pour générer une instruction d'appel de fonction directe.
Plus précisément, le compilateur génère un code équivalent au suivant :
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
Puisque la fonction say_hi() ne fait pas référence au pointeur this, elle évite le besoin de déréférencer un pointeur potentiellement nul. pointeur.
Allocation d'objet
La variable foo est une variable locale au sein de la fonction principale, elle est donc allouée sur la pile de la fonction. En tant que variable de pointeur, l'objet réel vers lequel elle pointe n'est pas alloué ici. La valeur nulle indique que le pointeur ne fait pas référence à un objet valide.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!