Который выводит на экран следующее:
mainmap[0]
MainClass()
~MainClass()
~MainClass()
mainmap[0].print()
MainClass()
~MainClass()
~MainClass()
value = 0
return 0
~MainClass()
Вопрос такой: откуда берутся дестркуторы после вызовов mainmap[0] и mainmap[0].print(), почему их по 2? И вообще, почему количество деструкторов != количеству конструкторов?!
Здравствуйте, alander, Вы писали:
A>Есть следующий код:
A>#include <iostream> A>#include <map>
A>class MainClass A>{ A> public: A> MainClass():val(0) { std::cerr << "MainClass()\n"; }; A> ~MainClass() { std::cerr << "~MainClass()\n"; };
A> void print() { std::cerr << "value = " << val << "\n"; };
A> int val; A>};
A>int main(int argc, char **argv) A>{ A> std::map<int,MainClass> mainmap;
A> std::cerr << "mainmap[0]\n"; A> mainmap[0]; A> std::cerr << "mainmap[0].print()\n"; A> mainmap[0].print(); A> std::cerr << "return 0\n"; A> return 0; A>}
A>Который выводит на экран следующее: A>mainmap[0] A>MainClass() A>~MainClass() A>~MainClass() A>mainmap[0].print() A>MainClass() A>~MainClass() A>~MainClass() A>value = 0 A>return 0 A>~MainClass()
A>Вопрос такой: откуда берутся дестркуторы после вызовов mainmap[0] и mainmap[0].print(), почему их по 2? И вообще, почему количество деструкторов != количеству конструкторов?!
А ты добавь в MainClass вот это:
Здравствуйте, alander, Вы писали:
A> ...
A>Вопрос такой: откуда берутся дестркуторы после вызовов mainmap[0] и mainmap[0].print(), почему их по 2? И вообще, почему количество деструкторов != количеству конструкторов?!
Объекты класса MainClass создаются не только через конструктор по умолчанию (который ты явно определил), но и через конструктор копирования (который ты явно не определил, но который тем не менее определен не явно компилятором). Для того, чтобы увидеть работу конструктора копирования, ты должен явно переопределить его в своем классе.
Ну, про конструктор копирования уже ответили, так что я попробую ответить на вот этот вопрос: A>Вопрос такой: откуда берутся дестркуторы после вызовов mainmap[0] и mainmap[0].print(), почему их по 2?
Дело в том, что operator[] в std::map реализован следующим образом: