Вопрос: при добавлении элемента в список, должно происходить копирование значения
этого эленента, в данном примере, я не описал для класса MyStruct оператор присваивания,
так каким же образом происходит это присваивание, или функция push_back сохраняет
имено ссылку на объект? На этот факт и навод мысль что при вызове push_back не
происходит вызов конструтора MyStruct.
И еще, если список хранит ссылку, то подобная конструкция не имеет права на жизнь,
т.к. MyStruct s локально выделяется и удаляется, но ЭТО РАБОТАЕТ, ниче не понимаю,
так как же происходит присваивание объекта?
class MyStruct
{
public:
MyStruct()
{
static int mmm = 100;
y = mmm--;
x = mmm--;
}
int x;
int y;
};
void main()
{
list <MyStruct> MyList;
for (int i=0; i<10; i++)
{
MyStruct s;
MyList.push_back( s );
}
list <MyStruct>::iterator MyIterator = MyList.begin();
while (MyIterator != MyList.end())
{
TRACE( "x:%d y:%d\n", (*MyIterator).x, (*MyIterator).y);
MyIterator ++;
}
}
20.10.04 19:39: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Здравствуйте, Malokhatko, Вы писали:
M>Вопрос: при добавлении элемента в список, должно происходить копирование значения M>этого эленента, в данном примере, я не описал для класса MyStruct оператор присваивания, M>так каким же образом происходит это присваивание, или функция push_back сохраняет M>имено ссылку на объект? На этот факт и навод мысль что при вызове push_back не M>происходит вызов конструтора MyStruct.
Удалено избыточное цитирование
Есть такая вещь как конструктор копирования, он генерится компилятором по умолчанию если отсутсвует в классе.
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает
Здравствуйте, Malokhatko, Вы писали:
M>напрашивается вопрос, какое default поведение конструктора копирования который сгенерился компилятором? M>Копирование просто области памяти?
M>Не знал, т.е. я описываю свой такой конструктор как MyStruct(const MyStruct& src ), и все о вери велл!!!
Ага
M>напрашивается вопрос, какое default поведение конструктора копирования который сгенерился компилятором? M>Копирование просто области памяти?
Да, для того он и существует. Если по умолчанию не нравится, но и не хочется его реализовывать, то бывает полезно описать его вместе с оператором присваивания в закрыто блоке private, чтобы не компилялось если есть нежелатеьное копирование
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает
Здравствуйте, BacCM, Вы писали:
M>>напрашивается вопрос, какое default поведение конструктора копирования который сгенерился компилятором? M>>Копирование просто области памяти? BCM>Да, для того он и существует.
Опаснейшее заблуждение. Конструктор копирования по умолчанию выполняет почленное копирование (memberwise copy of its subobjects — 12.8/8), и это совсем не то же самое, что и "копирование просто области памяти".
Здравствуйте, Bell, Вы писали:
M>>напрашивается вопрос, какое default поведение конструктора копирования который сгенерился компилятором? M>>Копирование просто области памяти?
B>Почленное (не путать с побитовым!!!) копирование.
Обозначает ли это что для CString который является членом класса, вызовется его оператор присваивания?
ЗЫЖ Почленое это хорошо, только если есть указатели внутри класса, то прийдется делать их "вумными" (это не вопрос).
Здравствуйте, Malokhatko, Вы писали:
M>Обозначает ли это что для CString который является членом класса, вызовется его оператор присваивания?
В конструкторе копирования по умолчанию для объекта типа CString будет вызван конструктор копирования, а в операторе присваивания по умолчанию — оператор присваивания.
Подробнее можно посмотреть в 12.8.
M>ЗЫЖ Почленое это хорошо, только если есть указатели внутри класса, то прийдется делать их "вумными" (это не вопрос).
Именно так (это не ответ )
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, BacCM, Вы писали:
M>>>Копирование просто области памяти? BCM>>Да, для того он и существует.
B>Опаснейшее заблуждение. Конструктор копирования по умолчанию выполняет почленное копирование (memberwise copy of its subobjects — 12.8/8), и это совсем не то же самое, что и "копирование просто области памяти".
Действительно лажу сморозил, именно почленное...
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает