Почему выводится фраза в первом случае три раза, а во втором 1 раз?(Деструктор)
#include <iostream>
using namespace std;
class Myclass{
public:
Myclass(){
ac=1;
bc=5;
dc=12;
get();
};
Myclass(int a, int b, int c){
ac=a;
bc=b;
dc=c;
get();
};
Myclass(const Myclass &myclass):
ac(myclass.ac), bc(myclass.bc), dc(myclass.dc){
cout<<"Copy constructor worked in Myclass!\n";
get();
};
~Myclass(){
cout<<"Destructor worked in class Myclass!\n";
};
private:
int ac;
int bc;
int dc;
void get(){
cout << "A = " << ac << "\n" << "B = " << bc <<"\n"<<"C = "<< dc << endl;
};
};
class Test{
public:
Test(){
name="First";
mas=1;
get();
};
Test(string a, double b){
name=a;
mas=b;
get();
};
Test(const Test &test):
name(test.name), mas(test.mas){
cout<<"Copy constructor worked in class Test!\n";
get();
};
~Test(){
cout<<"Destructor worked in class Test!\n";
};
private:
string name;
double mas;
void get(){
cout << "Name = " << name << "\n" << "Mas = " << mas << endl;
};
};
int main() {
Myclass test1;
Myclass test2(12,13,16);
Myclass copytest2(test2);
Test *first = new Test();
Test *second = new Test("dadad", 12);
Test copyfirst(*second);
return 0;
}
Создаю два класса и в каждом из них создаю по 3 конструктора и по 1 деструктору, не могу понять почему выводится в первом классе три раза: "Destructor worked in class Myclass! Destructor worked in class Myclass! Destructor worked in class Myclass!", а во втором классе только один раз: "Destructor worked in class Test!".
Ответы (1 шт):
Дело в том, что вы создали 3 объекта MyClass с автоматическим временем жизни, грубо — на стеке, и по выходе из функции все три уничтожаются:
Myclass test1;
Myclass test2(12,13,16);
Myclass copytest2(test2);
Но с классом Test ситуация иная: такой объект только один — copyfish, он и уничтожается автоматически. Остальные два объекта динамические, за их уничтожение отвечаете вы сами. При выходе из функции они остаются жить.
Test *first = new Test();
Test *second = new Test("dadad", 12);
Test copyfirst(*second);
Вот если вы добавите их уничтожение руками
delete second;
delete first;
то увидите и здесь три вывода из деструкторов.