Pour autant que je sache, un constructeur de copie est invoqué dans les cas suivants:C++ copie invocation constructeur
1) Pass by value
2) Return by value
3) When you create and initialize a new object with an existing object
Voici le programme:
#include <iostream>
using namespace std;
class Example
{
public:
Example()
{
cout << "Default constructor called.\n";
}
Example(const Example &ob1)
{
cout << "Copy constructor called.\n";
}
Example& operator=(const Example &ob1)
{
cout << "Assignment operator called.\n";
return *this;
}
~Example()
{
cout<<"\nDtor invoked"<<endl;
}
int aa;
};
Example funct()
{
Example ob2;
ob2.aa=100;
return ob2;
}
int main()
{
Example x;
cout << "Calling funct..\n";
x = funct();
return 0;
}
La sortie est:
Constructeur par défaut appelé.
Calling fonct ..
constructeur par défaut appelé.
Opérateur d'assignation appelé.
dtor invoqué
dtor invoqué
S'il vous plaît me corriger, IIRC la séquence d'appels doit se produire suivant:
1) Constructor de x est appelé
2) Constructeur de ob2 est appelé
3) La fonction renvoie et donc le constructeur de copie i s invoqué (pour copier OB2 pour la variable temporaire anonyme ie funct())
4) Destructeur de OB2 appelé
5) Affecter la variable temporaire sans nom x
6) Détruire la variable temporaire à-dire invoquer son destructor
7) Destroy x x Invoke-à-dire de la destructor
Mais alors pourquoi constructeur de copie n'est pas appelé et aussi seulement 2 appels à dtors sont là alors que j'attendre 3.
Je sais que le compilateur peut faire des optimisations, mais est-ce que ma compréhension est correcte?
Merci beaucoup :)
Cordialement
lali
Voici un article intéressant sur ce sujet: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ –
Il n'y a pas de vraie question ici ... Vérifiez la documentation de votre compilateur , parce que Copy-const peut être optimisé (comme vous nous l'avez déjà dit) – jpinto3912
Yup, le comportement est dû à l'optimisation de la valeur de retour, merci beaucoup de le signaler. Le programme se comporte comme prévu lorsqu'il est compilé avec -fno-elide-constructors sur gcc. Merci à UncleBens pour cela :) – ghayalcoder