Maison >développement back-end >C++ >Quand C ignore-t-il le constructeur de copie ?

Quand C ignore-t-il le constructeur de copie ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-21 08:10:10252parcourir

When Does C   Skip the Copy Constructor?

Optimisation du constructeur de copie en C

En C , dans des circonstances spécifiques, le constructeur de copie peut ne pas être invoqué, ce qui soulève des questions sur l'optimisation du compilateur ou les fonctionnalités non documentées de la langue.

Considérez ce qui suit code :

class A
{
public:
    A(int value) : value_(value)
    {
        cout << "Regular constructor" << endl;
    }

    A(const A& other) : value_(other.value_)
    {
        cout << "Copy constructor" << endl;
    }

private:
    int value_;
};

int main()
{
    A a = A(5);
}

On pourrait s'attendre à ce que la sortie inclue à la fois les messages "Constructeur régulier" et "Constructeur de copie". Cependant, dans ce cas, le constructeur de copie n'est jamais appelé.

Ce comportement n'est ni une optimisation du compilateur ni une fonctionnalité non documentée de C . Au lieu de cela, il est explicitement spécifié dans la norme C (§12.8.15) que les affectations comme T = x ; peut être interprété comme T(x);, éliminant efficacement le T interne lorsqu'une copie n'est pas nécessaire.

Dans ce cas particulier, le compilateur reconnaît que construire un objet A puis le copier est redondant et omet donc l'appel du constructeur de copie.

Pour appliquer l'invocation du constructeur de copie, on peut créer explicitement le premier objet A :

A a; // Construct an empty A object
a = A(5); // Copy-initialize it with another A object

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!

Déclaration:
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