list в STL
От: Malokhatko  
Дата: 19.10.04 19:08
Оценка:
Вопрос: при добавлении элемента в список, должно происходить копирование значения
этого эленента, в данном примере, я не описал для класса 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++. Прикладные вопросы' — Павел Кузнецов
Re: list в STL
От: Павел Кузнецов  
Дата: 19.10.04 20:55
Оценка:
Malokhatko:

> Вопрос: при добавлении элемента в список, должно происходить копирование значения этого эленента


С помощью конструктора копирования.

> в данном примере, я не описал для класса MyStruct оператор присваивания,


Его (вместе с конструктором копирования) неявно за тебя определяет компилятор.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: list в STL
От: BacCM Россия  
Дата: 20.10.04 07:26
Оценка: 2 (1)
Здравствуйте, Malokhatko, Вы писали:

M>Вопрос: при добавлении элемента в список, должно происходить копирование значения

M>этого эленента, в данном примере, я не описал для класса MyStruct оператор присваивания,
M>так каким же образом происходит это присваивание, или функция push_back сохраняет
M>имено ссылку на объект? На этот факт и навод мысль что при вызове push_back не
M>происходит вызов конструтора MyStruct.

Удалено избыточное цитирование

Есть такая вещь как конструктор копирования, он генерится компилятором по умолчанию если отсутсвует в классе.
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает
Re[2]: list в STL
От: Malokhatko  
Дата: 20.10.04 07:43
Оценка:
Здравствуйте, BacCM, Вы писали:

BCM>Есть такая вещь как конструктор копирования, он генерится компилятором по умолчанию если отсутсвует в классе.


Не знал, т.е. я описываю свой такой конструктор как MyStruct(const MyStruct& src ), и все о вери велл!!!

напрашивается вопрос, какое default поведение конструктора копирования который сгенерился компилятором?
Копирование просто области памяти?


Thanx.
Re[3]: list в STL
От: Bell Россия  
Дата: 20.10.04 09:01
Оценка: 2 (1)
Здравствуйте, Malokhatko, Вы писали:

M>напрашивается вопрос, какое default поведение конструктора копирования который сгенерился компилятором?

M>Копирование просто области памяти?

Почленное (не путать с побитовым!!!) копирование.
Любите книгу — источник знаний (с) М.Горький
Re[3]: list в STL
От: BacCM Россия  
Дата: 20.10.04 09:17
Оценка:
Здравствуйте, Malokhatko, Вы писали:


M>Не знал, т.е. я описываю свой такой конструктор как MyStruct(const MyStruct& src ), и все о вери велл!!!

Ага

M>напрашивается вопрос, какое default поведение конструктора копирования который сгенерился компилятором?

M>Копирование просто области памяти?
Да, для того он и существует. Если по умолчанию не нравится, но и не хочется его реализовывать, то бывает полезно описать его вместе с оператором присваивания в закрыто блоке private, чтобы не компилялось если есть нежелатеьное копирование
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает
Re[4]: list в STL
От: Bell Россия  
Дата: 20.10.04 09:33
Оценка:
Здравствуйте, BacCM, Вы писали:

M>>напрашивается вопрос, какое default поведение конструктора копирования который сгенерился компилятором?

M>>Копирование просто области памяти?
BCM>Да, для того он и существует.

Опаснейшее заблуждение. Конструктор копирования по умолчанию выполняет почленное копирование (memberwise copy of its subobjects — 12.8/8), и это совсем не то же самое, что и "копирование просто области памяти".
Любите книгу — источник знаний (с) М.Горький
Re[4]: list в STL
От: Malokhatko  
Дата: 20.10.04 09:43
Оценка:
Здравствуйте, Bell, Вы писали:

M>>напрашивается вопрос, какое default поведение конструктора копирования который сгенерился компилятором?

M>>Копирование просто области памяти?

B>Почленное (не путать с побитовым!!!) копирование.


Обозначает ли это что для CString который является членом класса, вызовется его оператор присваивания?

ЗЫЖ Почленое это хорошо, только если есть указатели внутри класса, то прийдется делать их "вумными" (это не вопрос).
Re[5]: list в STL
От: Bell Россия  
Дата: 20.10.04 09:49
Оценка:
Здравствуйте, Malokhatko, Вы писали:

M>Обозначает ли это что для CString который является членом класса, вызовется его оператор присваивания?

В конструкторе копирования по умолчанию для объекта типа CString будет вызван конструктор копирования, а в операторе присваивания по умолчанию — оператор присваивания.
Подробнее можно посмотреть в 12.8.

M>ЗЫЖ Почленое это хорошо, только если есть указатели внутри класса, то прийдется делать их "вумными" (это не вопрос).

Именно так (это не ответ )
Любите книгу — источник знаний (с) М.Горький
Re[5]: list в STL
От: BacCM Россия  
Дата: 20.10.04 13:37
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, BacCM, Вы писали:


M>>>Копирование просто области памяти?

BCM>>Да, для того он и существует.

B>Опаснейшее заблуждение. Конструктор копирования по умолчанию выполняет почленное копирование (memberwise copy of its subobjects — 12.8/8), и это совсем не то же самое, что и "копирование просто области памяти".

Действительно лажу сморозил, именно почленное...
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.