Здравствуйте, fin, Вы писали:
fin>Имеется класс:
fin>fin>MyClass::MyClass()
fin>{
fin> printf("MyClass::MyClass()\n");
fin>}
fin>MyClass::~MyClass()
fin>{
fin> printf("MyClass::~MyClass()\n");
fin>}
fin>MyClass::MyClass(const MyClass &obj)
fin>{
fin> printf("MyClass::MyClass(const MyClass &obj)\n");
fin> sName = obj.sName;
fin>}
fin>MyClass MyClass::operator =(const MyClass &obj)
fin>{
fin> printf("MyClass MyClass::operator =(const MyClass &obj)\n");
fin> sName = obj.sName;
fin> return *this; //Третий вызов конструктора
fin>}
fin>
fin>Код в главной функции
fin>fin>CArray <MyClass,MyClass&> arrayMyClasses;
fin>cout << "1" << endl;
fin>MyClass obj; //Первый вызов конструктора
fin>cout <<
"2" << endl;
fin>obj.sName =
"Name";
fin>cout <<
"3" << endl;
fin>arrayMyClasses.Add(obj);
//Второй вызов конструктора
fin>cout <<
"4" << endl;
fin>
fin>И вот такой странный результат на консоли:
fin>fin>1
fin>MyClass::MyClass()
fin>2
fin>3
fin>MyClass::MyClass()
fin>MyClass MyClass::operator =(const MyClass &obj)
fin>MyClass::MyClass(const MyClass &obj)
fin>MyClass::~MyClass()
fin>4
fin>MyClass::~MyClass()
fin>MyClass::~MyClass()
fin>
fin>Почему деструктор вызывается трижды?
Ну все правельно, потому что трижды вызывается конструктор. Кстати на один вызов можно сократить если в операторе присваивания сделать возврат ссылки, тогда вызов конструктора копирования не произойдет(соответсвенно сократится на один и вызов деструктора).
Оставшиеся два вызова конструктора: при создании твоего объекта, и при создании объекта в массиве, ты же там хранишь если так можно сказать копии объектов которые передаешь в функцию Add, если хочешь и этого избежать то сохраняй указатели. Ну соответсвенно тогда получится и деструкторов столько сколько конструкторов(имеется кол-во вызовов конечно).
CArray <MyClass*,MyClass*> arrayMyClasses;