Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
#1

for_each и деструкторы - C++

08.03.2011, 17:32. Просмотров 510. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <algorithm>
 
using namespace std;
 
class display {
public:
    display() : i(0) { cout << "display cnonstructor...\n"; }
    ~display() { cout << "display destructor...\n"; }
    void operator() ( int x )
    {   cout << "a[" << i++ << "] = " << x << endl;
    }
private:
    int i;
};
 
int main()
{   const int N = 4;
    int a[N] = 
        {1234, 5432, 8943, 3346};
    for_each (a, a+N, display());
    return 0;
}
Почему вызывается 3 деструктора ?! Один, понятно, а еще два ? для каких обьектов они вызываются и вообще как можно создать объект не вызывая конструктора?
0
Миниатюры
for_each и деструкторы  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2011, 17:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос for_each и деструкторы (C++):

For_each - C++
С помощью for_each, найти колличество иксов в массиве |{xi|xi&lt;3}| (Visual C++ 2005)

Метод в for_each - C++
Привет всем. Есть класс и структурка: struct Foo { Foo(): name(&quot;nx&quot;), val(9) {} string name; int...

c++ for_each и вызов функции - C++
for(microbe &amp;i : microbes) { i.set_speed(diapozon_speed * rand() /RAND_MAX + min_speed ); // установка скорости ...

Опять непонятки с for_each - C++
Недавно создавал тему на проблему реализации for_each.Теперь для моей программы нужно добавить еще одну функцию:• Вывод на экран студентов,...

Заменить все for на for_each - C++
Добрый вечер! Столкнулся с такой проблеммой. Нужно заменить все циклы for на for_each для реализации данных алгоритмов: Перестановка...

Написание функции для for_each - C++
Хочу распечатать список list через свою функцию используя for_each, но я не могу понять как заставить эту for_each работать с моей...

6
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.03.2011, 17:48 #2
Цитата Сообщение от [Freeman
и вообще как можно создать объект не вызывая конструктора?
никак
0
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
08.03.2011, 17:50  [ТС] #3
Тогда почему сообщение о вызове конструктора вывелось только один раз?
В массиве же 4 элемента...
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
08.03.2011, 17:50 #4
Создать объект, не вызывая конструктора - нельзя. На то он и конструктор....
А в примере все законно. Добавь в класс display копирующий конструктор (copy ctor) и убедись, что число вызовов конструкторов будет точно соответствовать числу вызовов деструкторов.
Hint: алгоритмы STL могут размножать переданный функтор (в данном случае - display()) копированием. Поэтому есть такое требование: функторы не должны иметь состояния, - что в твоей программе нарушено.
1
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
08.03.2011, 18:23  [ТС] #5
Добавлено через 25 минут
CheshireCat
Кажется я начинаю понимать, то есть в моем примере функтор может быть например в состоянии когда его вызвали 3 раза и тогда переменная i == 3, а может в состоянии когда его вызвали 5 раз и
тогда i == 5, я правильно понимаю?
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2011, 18:40 #6
[Freeman], крому обычного конструктора два раза вызываются конструктор копирования при
1) передаче внутрь for_each
2) если прочтете спецификацию, то for_each возвращает переданный в него функтор, те после выполнения вызывается еще один конструктор

к каждому конструктору вызовется деструктор, итого один обычный и два для конструктора копирования

если вы хотите получить состояние функтора после выполнения, то напишите нормальный конструктор копирования и получайте значения из возвращенного функтора
0
Mr.X
Эксперт С++
3050 / 1695 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
08.03.2011, 19:25 #7
Цитата Сообщение от CheshireCat Посмотреть сообщение
Hint: алгоритмы STL могут размножать переданный функтор (в данном случае - display()) копированием. Поэтому есть такое требование: функторы не должны иметь состояния, - что в твоей программе нарушено.
В Стандарте нет запрета иметь функторам состояния. Страуструп наоборот подчеркивает это как их достоинство. А алгоритм for_each именно для того и возвращает объект функтора, которым мы пробежались по контейнеру, чтобы можно было извлечь из него накопившуюся в нем информацию.
0
08.03.2011, 19:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2011, 19:25
Привет! Вот еще темы с ответами:

Почему for_each() не выводит кирилицу - C++
Вот такой код: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; void show(const std::string &amp; s); ...

STL библиотека. Ф-ция for_each - C++
При изучении STL, столкнулся со странным поведением ф-ции for_each библиотеки algorithm void Library::Func(int n) { cout &lt;&lt; &quot;n...

Как использовать инструкцию for_each ? - C++
Не могу понять как использовать std::for_each (например для вектора) std::vector&lt;int&gt; v; // создан вектор for (int i = 1; i&lt;10; i++) ...

For_each, итераторы, каррирование, шаблоны - C++
Прошу объяснить доступным языком либо дать ссылку на соответствующий материал. 1. Как реализовать алгоритм for_each? 2. Как написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru