Когда вы говорите myObjectsMap [0], вы вызываете конструктор по умолчанию для MyObject. Это потому, что в [0] еще ничего нет, а вы просто получили к нему доступ. Это в руководстве .
Когда вы нажимаете MyObject (); вы создаете временный экземпляр MyObject, используя конструктор по умолчанию.
Поскольку вы позволили компилятору определять ваш конструктор копирования, вы видите больше деструктора, чем сообщений конструктора. (Может быть только один деструктор, но много конструкторов, в отличие от строительства дома.) Если ваш объект никогда не должен копироваться таким образом, то вы, вероятно, захотите объявить частный конструктор копирования и оператор копирования. 1009 *
Вы вызываете конструктор по умолчанию и конструктор копирования дважды каждый с этим кодом:
myObjectsMap[0] = MyObject();
Когда вы делаете это:
myObjectsMap.insert( MyObjectPair(0,MyObject()));
Вы вызываете конструктор по умолчанию один раз, а конструктор копирования 3 раза.
Вы, вероятно, должны использовать указатели в качестве значений карты вместо самих объектов, в частности, я предлагаю посмотреть на shared_ptr.
note: tests were done using GCC 3.4.5 on a Windows NT 5.1 machine.