Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> vector как массив классов, поясните ситуацию 
:(
    Опции темы
Folk
Дата 25.5.2008, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Всем доброго времени суток.

Прошу пояснить некоторую ситуацию. Я использую VS 2005, хотя думаю это непринципиально.

Есть такой простой класс:

Код

class A
{
public:
    A() 
    {
        std::cout << "First constructor." << std::endl;
    };

    A(int val) 
    {
        std::cout << "Second constructor." << std::endl;
        b = val;
    };

    ~A() 
    {
        std::cout << "Destructor." << std::endl;
    }

    void print_b() const 
    {
        std::cout << b << std::endl;
    }

private:
    int b;
};


Если сделать так:

Код

std::vector<A> ar;

ar.push_back(0);
ar[0].print_b();

std::cout << ar.size() << std::endl;

return 0;


то в консоли увидим:

Цитата

Second constructor.
Destructor.
Destructor.
0
1
Destructor.


Откуда взялись два вызова дуструктора после создания объекта? 

И ещё, если сделать так:

Код

std::vector<A> ar;

ar.assign(5, 0);
ar[0].print_b();

std::cout << ar.size() << std::endl;

return 0;


То в консоли видим:

Цитата

Second constructor.
Destructor.
Destructor.
Destructor.
0
5
Destructor.
Destructor.
Destructor.
Destructor.
Destructor.


Тут два вопроса:

1. Почему конструктор вызван единожды?
2. Опять же, откуда 3 вызова дектрукторов сразу после создания объектов?

Заранее спасибо.
PM MAIL   Вверх
anatox91
Дата 25.5.2008, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: 1
Всего: 13



по-моему это разрушается еще и временный объект


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
mes
Дата 25.5.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Folk @  25.5.2008,  08:14 Найти цитируемый пост)
1. Почему конструктор вызван единожды?
2. Опять же, откуда 3 вызова дектрукторов сразу после создания объектов?


Не забываем про то, что бывают конструкторы по умолчанию и для подобных тестов их надо перегрузить :

Код

class A
{
public:
    A()
    {
        std::cout << "First constructor." << std::endl;
    };

    A(int val)
    {
        std::cout << "Second constructor." << std::endl;
        b = val;
    };

    A(const A& a)
    {
        std::cout << "Copy constructor." << std::endl;
        b=a.b;
    }
    ~A()
    {
        std::cout << "Destructor." << std::endl;
    }

    void print_b() const
    {
        std::cout << b << std::endl;
    }

private:
    int b;
};


Это сообщение отредактировал(а) mes - 25.5.2008, 10:41


--------------------
PM MAIL WWW   Вверх
Folk
Дата 25.5.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Цитата(mes @  25.5.2008,  10:41 Найти цитируемый пост)
Не забываем про то, что бывают конструкторы по умолчанию и для подобных тестов их надо перегрузить :


Ага, тогда с твоим вариантом класса и таким вот кодом:

Код

    std::vector<A> ar;

    ar.push_back(0);
    ar[0].print_b();
    std::cout << ar.size() << std::endl;

    return 0;


Получаем вот это:

Цитата

Second constructor.
Copy constructor.
Copy constructor.
Destructor.
Destructor.
0
1
Destructor.


Стало быть при добавлении нового элемента в вектор внутри создаётся ещё две рабочие копии исходного объекта. А если у меня массивные объекты, жрут много памяти и при копировании объекта требуется выполнение множества операций, то при одном добавлении такого объекта в вектор я получу огромную потерю просто из-за того, что он создаёт две временные копии? 
PM MAIL   Вверх
Daevaorn
Дата 25.5.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Цитата(Folk @  25.5.2008,  12:08 Найти цитируемый пост)
А если у меня массивные объекты, жрут много памяти и при копировании объекта требуется выполнение множества операций, то при одном добавлении такого объекта в вектор я получу огромную потерю просто из-за того, что он создаёт две временные копии?  

Да. Поэтому надо хранить указатели в каких-то обертках.
PM MAIL WWW   Вверх
Folk
Дата 25.5.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Цитата(Daevaorn @  25.5.2008,  12:37 Найти цитируемый пост)
Да. Поэтому надо хранить указатели в каких-то обертках.


Например? У меня как раз сейчас класс хранит в себе два достаточно больших массива. А массив этих классов хранится в векторе, 
PM MAIL   Вверх
mes
Дата 25.5.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Folk @  25.5.2008,  13:40 Найти цитируемый пост)
У меня как раз сейчас класс хранит в себе два достаточно больших массива.

храни в классе указатель на динамический  массив с подсчетом ссылок
или в вектор запихивай указатель на свой класс


Это сообщение отредактировал(а) mes - 25.5.2008, 13:58


--------------------
PM MAIL WWW   Вверх
Folk
Дата 25.5.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Спасибо всем за ответы, теперь стало ясно! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.