Passer un objet C dans son propre constructeur : est-ce légal ?
Il peut paraître surprenant de découvrir que construire un objet à partir de lui-même dans C est en effet autorisé. Le code suivant démontre ce comportement inattendu :
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main(int argc, char** argv) { Foo foo(foo); // This works! std::cout << &foo << std::endl; // And this works too... }
Dans ce code, un objet de type Foo est passé en argument à son propre constructeur. Cela peut sembler être une définition circulaire, mais les normes C le permettent en réalité.
Bien que l'objet foo ne soit pas initialisé, le code le manipule d'une manière autorisée par la norme. Plus précisément, avant qu'un objet ne soit complètement initialisé, il est autorisé de lui lier une référence ou de prendre son adresse.
Ce comportement est expliqué plus en détail dans le rapport de défaut 363, qui conclut que les références sont valides et qu'il est permis de prendre l'adresse d'un objet de classe avant qu'il ne soit complètement initialisé et la fournir comme paramètre de référence.
Bien qu'il puisse être inhabituel ou peu pratique d'utiliser ce comportement, il donne un aperçu du fonctionnement interne des classes et des moyens limités dans lequel un objet non initialisé peut être manipulé.
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!