Après avoir travaillé 15 ans en C++, j'ai constaté que je ne comprenais pas complètement les références...
class TestClass
{
public:
TestClass() : m\_nData(0)
{
}
TestClass(int n) : m\_nData(n)
{
}
~TestClass()
{
cout << "destructor" << endl;
}
void Dump()
{
cout << "data = " << m\_nData << " ptr = 0x" << hex << this << dec << endl;
}
private:
int m\_nData;
};
int main()
{
cout << "main started" << endl;
TestClass& c = TestClass();
c.Dump();
c = TestClass(10);
c.Dump();
cout << "main ended" << endl;
return 0;
}
// prints:
// main started
// data = 0 ptr = 0x0012FF54
// destructor
// data = 10 ptr = 0x0012FF54
// main ended
// destructor
Je comprends de ce test que l'instance de TestClass est créée sur la pile (est-ce correct ?) et initialisée par le premier constructeur de TestClass. Quand cette instance est allouée : quand la fonction principale est chargée, ou quand l'affectation de référence est exécutée ? Quand elle est détruite ?
Après la deuxième affectation de référence, l'adresse de l'objet n'est pas modifiée. Cela signifie-t-il que le destructeur et le constructeur sont appliqués à la même zone de mémoire ? Ou bien la mémoire est désallouée (dynamiquement ? sur la pile ?) et réallouée ?
Je sais tout sur la durée de vie des objets alloués à la pile et au tas, leurs constructeurs et leurs destructeurs. Mais je n'arrive pas à comprendre ce qui se passe exactement dans ce programme.
Edit : Merci à tous. J'ai essayé de reproduire dans ce test le comportement d'un autre programme (plus compliqué). Vos commentaires m'ont aidé à comprendre à la fois mon erreur et un autre programme avec lequel je me bats...
Le code fixe est :
int main()
{
cout << "main started" << endl;
TestClass t;
TestClass& c(t);
c.Dump();
c = TestClass(10);
c.Dump();
cout << "main ended" << endl;
return 0;
}