j'ai écrit le programme suivant pour tester lorsque le constructeur de copie est appelée et lorsque l'opérateur d'affectation est appelé:Les constructeurs de copie et Opérateurs d'affectation
#include
class Test
{
public:
Test() :
iItem (0)
{
std::cout << "This is the default ctor" << std::endl;
}
Test (const Test& t) :
iItem (t.iItem)
{
std::cout << "This is the copy ctor" << std::endl;
}
~Test()
{
std::cout << "This is the dtor" << std::endl;
}
const Test& operator=(const Test& t)
{
iItem = t.iItem;
std::cout << "This is the assignment operator" << std::endl;
return *this;
}
private:
int iItem;
};
int main()
{
{
Test t1;
Test t2 = t1;
}
{
Test t1;
Test t2 (t1);
}
{
Test t1;
Test t2;
t2 = t1;
}
}
Il en résulte la sortie suivante (juste ajouté lignes empy pour le rendre plus compréhensible):
[email protected]:~$ ./test This is the default ctor This is the copy ctor This is the dtor This is the dtor This is the default ctor This is the copy ctor This is the dtor This is the dtor This is the default ctor This is the default ctor This is the assignment operator This is the dtor This is the dtor
le deuxième et le troisième ensemble se comportent comme prévu, mais dans le premier jeu de la copie constru ctor est appelé même si l'opérateur d'affectation est utilisé.
Est-ce une partie de comportement du standard C++ ou tout simplement une optimisation intelligente du compilateur (j'utilise gcc 4.4.1)