Copiar construtores e operadores de atribuição
Eu escrevi o seguinte programa para testar quando o construtor de cópia é chamado e quando o operador de atribuição é chamado:
#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;
}
}
Isso resulta na seguinte saída (acabou de adicionar linhas empy para torná-lo mais compreensível):
doronw@DW01:~$ ./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
O segundo e terceiro conjunto se comportam como esperado, mas no primeiro conjunto o construtor de cópia é chamado mesmo que o operador de atribuição seja usado.
É este comportamento parte do padrão C ++ ou apenas uma otimização inteligente do compilador (estou usando o gcc 4.4.1)