Я просматривал «Использование Карт в качестве ассоциативных массивов» Джозуттиса (из Стандартная библиотека C ++ - Учебное пособие и справочник, 2-е издание ) и наткнулся на Использование std :: map в качестве ассоциативный массив при переполнении стека. Теперь у меня есть еще вопросы по конструкторам, которые вызываются при вставке в карту.
Вот мой пример программы (не использует лучшие практики кодирования; прошу прощения за это):
class C
{
public:
string s;
C() { cout << "default " << endl;}
C(const string& p) : s(p)
{ cout << "one param" << endl;}
C(const C& obj)
{
if (this != &obj)
{
s = obj.s;
}
cout << "copy constr" << endl;
}
C& operator = (const C& obj)
{
if (this != &obj)
{
s = obj.s;
}
cout << "copy initializer" << endl;
return *this;
}
};
int main()
{
map<int,C> map1;
C obj("test");
cout << "Inserting using index" << endl;
map1[1] = obj;
cout << "Inserting using insert / pair" << endl;
map1.insert(make_pair(2,obj));
}
Выходные данные для этой программы:
one param
Inserting using index
default
copy constr
copy constr
copy initializer
Inserting using insert / pair
copy constr
copy constr
copy constr
copy constr
Я предполагал, что при инициализации карты по индексу должен вызываться конструктор по умолчанию, за которым следует оператор присваивания.
Но выполнение map1[1] = obj
создает следующий вывод;
Inserting using index
default
copy constr
copy constr
copy initializer
Может кто-нибудь помочь мне лучше понять инициализацию?