Maison > développement back-end > C++ > le corps du texte

Pouvez-vous transmettre un objet C dans son propre constructeur ?

Linda Hamilton
Libérer: 2024-11-13 15:00:04
original
166 Les gens l'ont consulté

Can You Pass a C   Object into Its Own Constructor?

Passer des objets C dans leurs propres constructeurs

En C , cela peut paraître contre-intuitif mais il est en effet légal de passer un objet C dans son propre constructeur. Considérez l'extrait de code suivant :

#include <iostream>

struct Foo {
    Foo(Foo& bar) {
        std::cout << &bar << std::endl;
    }
};

int main(int argc, char** argv) {
    Foo foo(foo); // Surprising, yet valid
    std::cout << &foo << std::endl;
}
Copier après la connexion

Dans cet exemple, nous transmettons l'adresse de l'objet Foo construit (&foo) dans son propre constructeur. Cela peut ressembler à une définition circulaire, mais ce n'est pas considéré comme un comportement indéfini par les normes C.

Explication

La norme nous permet d'utiliser des objets non initialisés de manière limitée avant leur initialisation complète. En particulier, il est permis d'y lier une référence ou de prendre son adresse. Ceci est défini dans le rapport de défauts 363 et la section 3.8 du projet de norme C 14.

Cela signifie que dans le code ci-dessus, nous ne violons aucune contrainte fixée par le langage. Nous utilisons simplement l'objet foo non initialisé dans le constructeur d'une manière conforme à la norme.

Avertissement de Clang

Cependant, il convient de noter que certains compilateurs comme Clang peut émettre un avertissement concernant les variables non initialisées. En effet, la production de valeurs indéterminées à partir de variables automatiques non initialisées est généralement considérée comme un comportement indéfini. Dans ce cas, cependant, nous n'introduisons pas d'indétermination puisque nous lions uniquement une référence et prenons l'adresse au sein du constructeur.

Limitations

Il est important de souligner que même si ce comportement est autorisé par la norme, il ne doit pas être considéré comme une bonne pratique ni avoir de cas d'utilisation pratique. L'intention première de cette discussion est de mettre en lumière un aspect moins connu de la sémantique du langage C.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal