Есть, например, класс CClass. Если я делаю так: "std::vector<CClass>clazzz;"
Нужно ли мне перегружать operator= для CClass, если захочу потом воспользоваться clazzz.push_back?
[C++] Если у тебя будет хоть один конструктор29.10.03 11:07 Автор: amirul <Serge> Статус: The Elderman
> Есть, например, класс CClass. Если я делаю так: > "std::vector<CClass>clazzz;" > Нужно ли мне перегружать operator= для CClass, если захочу > потом воспользоваться clazzz.push_back? Компилятор сам скажет, что тебе надо. То бишь при наличии хоть одного (любого) конструктора, конструкторы побитового копирования не создаются. Насколько я понимаю, побитовое присвоение тоже не производится
[C++] А вот неправда твоя (iirc)29.10.03 18:54 Автор: Ktirf <Æ Rusakov> Статус: Elderman
> Компилятор сам скажет, что тебе надо. То бишь при наличии > хоть одного (любого) конструктора, конструкторы побитового > копирования не создаются. При наличии любого объявленного конструктора не создается конструктор по умолчанию. А чтобы не создался конструктор копирования, нужно специально его объявить, но не определить. То же самое относится и к оператору присваивания.
[C++] Действительно моя29.10.03 19:36 Автор: amirul <Serge> Статус: The Elderman
> При наличии любого объявленного конструктора не создается > конструктор по умолчанию. А чтобы не создался конструктор > копирования, нужно специально его объявить, но не > определить. То же самое относится и к оператору > присваивания. Нет мне оправдания - пойду штудировать страуструпа. :-)
[C++] как правильно делать std::vector::push_back?29.10.03 10:26 Автор: alien <Андрей> Статус: Member
> Есть, например, класс CClass. Если я делаю так: > "std::vector<CClass>clazzz;" > Нужно ли мне перегружать operator= для CClass, если захочу > потом воспользоваться clazzz.push_back? Думаю, что здесь необходима перегрузка конструктора копирования (если конечно есть необходимость в копировании данных, который этот класс размещает в динамической памяти).
Вот, кстати, код:
template <class _T1>
inline void
_Construct(_T1* __p)
// здесь вызывается конструктор копирования
{ new (static_cast<void*>(__p)) _T1(); }
...
...
void
push_back(const _Tp& __x)
{
if (_M_finish != _M_end_of_storage) {
_Construct(_M_finish, __x);
++_M_finish;
}
else
_M_insert_aux(end(), __x); // здесь тоже используется _Construct
}
Короче оператор присваивания в данном случае не используется, так что перегружать его нет необходимости.