Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
 Аватар для Виктор_Сен
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О

28.10.2013, 14:18. Показов 6866. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
public:
    A(){}
    virtual ~A(){}
};
 
class C
{
public:
    C(A a){}
    ~C(){}
    C(C& c){}
};
 
int main()
{
    C c=C(A());
 
    system("pause");
    return 0;
}
Если посмотреть в отладчике, то видно, что конструктор C() вызывается 2 раза, причём второй раз конструктор копирования. Я понимаю, если бы это было с конструктором A(), т. к. A() передаётся по значению. Но ни могу понять почему именно конструктор C(). Причём если деструктор класса A сделать не виртуальным, то конструктор класса C() будет вызываться 1 раз. С чем это связано?
Миниатюры
При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2013, 14:18
Ответы с готовыми решениями:

Конструктор вызывается один раз, а деструктор два раза
Программа для обработки исключений. Вообщем если ввести два числа и второе будет 0, то конструктор будет вызван 1 раз, а деструктор 2...

Почему при помещении объекта в list вызывается конструктор и деструктор?
Нужна помощь опытного программиста. Не могу понять почему при помещение объекта в list вызывается конструктор и деструктор. #include...

Два раза вызывается деструктор
Создал класс, в процессе выполнения программы вызвал деструктор, но когда программа завершается, деструктор вызывается повторно и вылетает...

27
 Аватар для Виктор_Сен
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 15:47  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ForEveR Посмотреть сообщение
На скобки смотрите внимательнее. Точнее на кол-во скобок.
Всё, понятно. То есть с двойными скобками конструктор вызывается и в одном количестве. А я всё время писал через знак равенства, т. к. на скобки компилятор выводил варинг. Но оказывается двойные скобки решают эту проблему
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 15:48
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Если посмотреть в отладчике, то видно, что конструктор C() вызывается 2 раза, причём второй раз конструктор копирования. Я понимаю, если бы это было с конструктором A(), т. к. A() передаётся по значению. Но ни могу понять почему именно конструктор C(). Причём если деструктор класса A сделать не виртуальным, то конструктор класса C() будет вызываться 1 раз. С чем это связано?
Я может и ошибусь, но просто оптимизации применяются разные. Если без virtual ~C компилятор ваше выражение С с = С(A()) приводит к виду С с(A), то с virual ~C он страхуется от каких-то случаев или же просто не прописан так делать и поэтому оставляет всё как есть. Скорее всего, чтобы код был одинаков вам просто нужно отключить оптимизации.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,655
Записей в блоге: 6
28.10.2013, 15:51
Если прописать явно для класса А конструктор копирования то виртуальный будет деструктор для класса А или нет результат будет один и тот же:
А()
С(A a)
~A()
C(C& c)
~C()
Если этого не сделать выводится два деструктора для А.... так и не понял откуда второй деструктор..
Цитата Сообщение от Cra3y Посмотреть сообщение
У меня это не компилится %)
Смотрите ссылку, что дал ForEveR там поясняется в чем причина и что нужно делать (передать аргумент в конструкторе копирования как const)
1
 Аватар для Виктор_Сен
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 15:56  [ТС]
Shtirliz72, "внутренний" К. О. мне подсказывает, что на практике вообще лучше не пользоваться передачей классов и структур по значению, и чтобы уж синтаксис не менять, то использовать передачу по ссылке. Там такой проблемы не возникает. Просто тут хотелось разобраться именно с передачей по значению, как говорится "дело принципа"
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:04
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Shtirliz72, "внутренний" К. О. мне подсказывает, что на практике вообще лучше не пользоваться передачей классов и структур по значению, и чтобы уж синтаксис не менять, то использовать передачу по ссылке. Там такой проблемы не возникает. Просто тут хотелось разобраться именно с передачей по значению, как говорится "дело принципа"
Это хорошо. Вы знакомы с const? Если не знакомы - почитайте. Очень хорошая тема, которая существенно помогает в программировании. И более того - подсказывает компилятору, какие оптимизации можно провести.
0
 Аватар для Виктор_Сен
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 16:04  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Если прописать явно для класса А конструктор копирования то виртуальный будет деструктор для класса А или нет результат будет один и тот же
Это верно.
Цитата Сообщение от Ilot Посмотреть сообщение
Если этого не сделать выводится два деструктора для А.... так и не понял откуда второй деструктор..
Тут без конструктора копирования для A сначала вызывается коструктор для A, потом вызывается конструктор копирования для А по умолчанию, потом 2 раза вызывается деструктор для А, но конструктор копирования по умолчанию ни чего не выводит
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,655
Записей в блоге: 6
28.10.2013, 16:13
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Тут без конструктора копирования для A сначала вызывается коструктор для A, потом вызывается конструктор копирования для А по умолчанию, потом 2 раза вызывается деструктор для А, но конструктор копирования по умолчанию ни чего не выводит
Вот в этом то и вопрос. Каким образом вызывается конструктор копирования для А? Для чего он вызывается? Явное задание конструктора копирования для А теоретически ничего менять не должно...
0
 Аватар для Виктор_Сен
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 16:16  [ТС]
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Вы знакомы с const?
Конечно, только не особо использую. Но это уже другая тема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.10.2013, 16:16

Виртуальный деструктор вызывается два раза
Здравствуйте, у меня есть базовый и производный классы с динамическими массивами, я создаю массив указателей на базовый класс пытаюсь...

Почему деструктор вызывается два раза
Всем привет. Есть код, для примера #include <vector> using namespace std; struct AA { int n; AA() :n(0) { cout <<...

Конструктор вызывается 2 раза
Помогите пожалуйста найти ошибку. Конструктор вызывается 2 раза. #include <iostream> #include <stdio.h> #include...

Когда вызывается деструктор класса?
Вопрос собственно в том, когда происходит освобождение памяти, занимаемой объектом класса? Допустим имеем #include <iostream> ...

При динамическом создании объекта в классе деструктор не вызывается
Добрый день еще раз. Помогите заполнить пробелы в ООП) Есть три класса: // Вспомогательный класс class Object { public: ...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru