С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200

Конструкторы и деструкторы функционального объекта

03.07.2010, 12:33. Показов 1406. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Вообщем разбирал задачу, в которой рассматривается алгоритм for_each, я решил добавить отладочный вывод в конструктор и деструктор чтобы посмотреть сколько раз они вызываются и честно говоря результат меня удивил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <algorithm>
 
using namespace std;
 
class display{
private:
    int i;
public:
    display(): i(0){ cout << "Constructor " << endl;}
    ~display(){cout << "Destructor " << endl;}
    void operator()(int x){
        cout << "a[" << i++ << "] = " << x << endl;
    }
};
 
int main(){
    const int N = 4;
    int a[N] = {7, 6, 9, 2};
    for_each(a, a + N, display());
    for_each(a, a + N, display());
    
    return 0;
}
кто-нибудь может объяснить почему вызывается один конструктор и 3 деструктора? (в данном конкретном случае)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.07.2010, 12:33
Ответы с готовыми решениями:

Конструкторы и деструкторы
Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны присутствовать: Для инициализации...

Конструкторы и деструкторы
#include &lt;iostream&gt; #include &lt;Windows.h&gt; class Try { public: void* px; Try() { printf(&quot;Try\n&quot;); px=malloc(12); }; ...

Конструкторы и деструкторы
Помогите, пожалуйста, исправить программу и закончить ее как надо. Необходимо реализовать класс с двумя полями, имеющими имена first и...

6
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
03.07.2010, 17:10
Создаются объекты ещё конструктором копирования.
C++
1
display(const display&) { cout << "Copy Constructor " << endl;}
В g++/Dev-C++ попробовал - 1 создание, 1 копирование, 2 деструктора. Так понимаю, что создаётся в display(), потом копируется первый раз при передаче в функцию for_each по значению, второй раз в return'е из for_each (она же возвращает свой 3-й параметр). Количество вызовов конструкторов/деструкторов при возврате из функции в общем может зависеть от уровня оптимизации. Где тут может появиться ещё одно копирование, точно не знаю.
Далее чисто догадки. Например, если в for_each что-то типа
C++
1
2
3
4
5
6
for_each(,,f)
{
t = f;
for (...) f(...);
return t;
}
то тут может быть копирование в t = f.
Однако, запуск варианта с
C++
1
for_each(a, a + N, display())(999)
и вывод a[2009226388] = 999 О_о подсказывает, что тут что-то интереснее.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
03.07.2010, 17:28
Цитата Сообщение от Somebody Посмотреть сообщение
Количество вызовов конструкторов/деструкторов при возврате из функции в общем может зависеть от уровня оптимизации.
Строго говоря, это неверно. Другое дело, что хороший оптимизатор зачастую довольно хорошо выкидывает ненужные команды из получившейся последовательности вызовов, особенно когда имеем дело с несложными объектами и тривиальными конструкторами-деструкторами.
Тем не менее, если мы определим "стучащие" конструкторы-деструкторы для какого-то объекта, который передаём в функцию по значению, да и вообще проделываем с ним разные интересные манипуляции, то полученный отчёт о последовательности операций не будет отличаться для отладочного варианта, в котором полностью отключена оптимизация, и для релиза, какие настройки оптимизации в нём ни выставляй.
0
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
04.07.2010, 04:24  [ТС]
Добавил конструктор копирования
C++
1
display(display& ) {cout << "Copy constructor" << endl;}
теперь Вызываются 2 конструктора (1 обычный, 1 копирования), и 2 деструктора. Убираю конструктор копирования - вызывается один конструктор и 3 деструктора. Окончательно запутался
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
04.07.2010, 11:59
Цитата Сообщение от Nick Alte Посмотреть сообщение
Тем не менее, если мы определим "стучащие" конструкторы-деструкторы для какого-то объекта, который передаём в функцию по значению, да и вообще проделываем с ним разные интересные манипуляции, то полученный отчёт о последовательности операций не будет отличаться для отладочного варианта, в котором полностью отключена оптимизация, и для релиза, какие настройки оптимизации в нём ни выставляй.
Это почему это? Некоторые копирования при оптимизации можно убрать, это разрешено:
http://www.open-std.org/jtc1/s... class.copy
Whenever a class object is copied and the original object and the copy
have the same type, if the implementation can prove that either the
original object or the copy will never again be used except as the
result of an implicit destructor call (_class.dtor_), an implementa-
tion is permitted to treat the original and the copy as two different
ways of referring to the same object and not perform a copy at all.
In that case, the object is destroyed at the later of times when the
original and the copy would have been destroyed without the
optimization.
И пример
http://en.wikipedia.org/wiki/R... timization
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
04.07.2010, 12:57
Можно убирать копирования, но не вызовы конструктора копирования. То есть, если у нас в конструкторе и деструкторе выполняются какие-то дополнительные действия (например, вывод диагностических сообщений), эти действия будут выполнены в одном и том же порядке независимо от оптимизации. Другое дело, что сами операции копирования при этом успешно могут быть заоптимизированы "в нуль".
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
04.07.2010, 21:37
Цитата Сообщение от Nick Alte Посмотреть сообщение
Можно убирать копирования, но не вызовы конструктора копирования. То есть, если у нас в конструкторе и деструкторе выполняются какие-то дополнительные действия (например, вывод диагностических сообщений), эти действия будут выполнены в одном и том же порядке независимо от оптимизации. Другое дело, что сами операции копирования при этом успешно могут быть заоптимизированы "в нуль".
Хотя, действительно, строчки стандарта какие-то мутные и прямо явно такого не говорят, но тогда на фига в стандарте всё это? Оптимизация с сохранением всех побочных эфеектов и без этого возможна, а здесь как раз говорится, что можно убрать копирование (вместе с конструктором копирования, естественно).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.07.2010, 21:37
Помогаю со студенческими работами здесь

Конструкторы и деструкторы
Создать класс LongLong для работы с целыми числами из 64 бит. Число должно быть представлено двумя полями: long — старшая часть, unsigned...

Конструкторы и деструкторы
Привет. Есть структура, содержащая 7 полей, в которые я ввожу значения с клавиатуры. Нужно используя конструкторы и деструкторы...

Конструкторы и деструкторы
Помогите исправить программу. Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны...

Конструкторы и деструкторы
Прочитал про конструкторы и деструкторы. Пишут что они нужны для инициализации переменных класса. Как они используются я понял, но не понял...

Конструкторы и деструкторы
Напишите простейшие примеры объявления и определения конструкторов и деструкторов. Желательно, чтобы были примеры с различными типами данных


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru