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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 14:18     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О #1
Вот такой код
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 раза, затем вызывается деструктор о_О  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 14:18     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Посмотрите здесь:

C++ Не вызывается конструктор базового класса
Два раза вызывается деструктор C++
Не вызывается нужный конструктор базового класса C++
Когда вызывается деструктор класса? C++
this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 15:47  [ТС]     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О #21
Цитата Сообщение от ForEveR Посмотреть сообщение
На скобки смотрите внимательнее. Точнее на кол-во скобок.
Всё, понятно. То есть с двойными скобками конструктор вызывается и в одном количестве. А я всё время писал через знак равенства, т. к. на скобки компилятор выводил варинг. Но оказывается двойные скобки решают эту проблему
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 15:48     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О #22
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Если посмотреть в отладчике, то видно, что конструктор C() вызывается 2 раза, причём второй раз конструктор копирования. Я понимаю, если бы это было с конструктором A(), т. к. A() передаётся по значению. Но ни могу понять почему именно конструктор C(). Причём если деструктор класса A сделать не виртуальным, то конструктор класса C() будет вызываться 1 раз. С чем это связано?
Я может и ошибусь, но просто оптимизации применяются разные. Если без virtual ~C компилятор ваше выражение С с = С(A()) приводит к виду С с(A), то с virual ~C он страхуется от каких-то случаев или же просто не прописан так делать и поэтому оставляет всё как есть. Скорее всего, чтобы код был одинаков вам просто нужно отключить оптимизации.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 15:51     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О #23
Если прописать явно для класса А конструктор копирования то виртуальный будет деструктор для класса А или нет результат будет один и тот же:
А()
С(A a)
~A()
C(C& c)
~C()
Если этого не сделать выводится два деструктора для А.... так и не понял откуда второй деструктор..
Цитата Сообщение от Cra3y Посмотреть сообщение
У меня это не компилится %)
Смотрите ссылку, что дал ForEveR там поясняется в чем причина и что нужно делать (передать аргумент в конструкторе копирования как const)
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 15:56  [ТС]     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О #24
Shtirliz72, "внутренний" К. О. мне подсказывает, что на практике вообще лучше не пользоваться передачей классов и структур по значению, и чтобы уж синтаксис не менять, то использовать передачу по ссылке. Там такой проблемы не возникает. Просто тут хотелось разобраться именно с передачей по значению, как говорится "дело принципа"
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:04     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О #25
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Shtirliz72, "внутренний" К. О. мне подсказывает, что на практике вообще лучше не пользоваться передачей классов и структур по значению, и чтобы уж синтаксис не менять, то использовать передачу по ссылке. Там такой проблемы не возникает. Просто тут хотелось разобраться именно с передачей по значению, как говорится "дело принципа"
Это хорошо. Вы знакомы с const? Если не знакомы - почитайте. Очень хорошая тема, которая существенно помогает в программировании. И более того - подсказывает компилятору, какие оптимизации можно провести.
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 16:04  [ТС]     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О #26
Цитата Сообщение от Ilot Посмотреть сообщение
Если прописать явно для класса А конструктор копирования то виртуальный будет деструктор для класса А или нет результат будет один и тот же
Это верно.
Цитата Сообщение от Ilot Посмотреть сообщение
Если этого не сделать выводится два деструктора для А.... так и не понял откуда второй деструктор..
Тут без конструктора копирования для A сначала вызывается коструктор для A, потом вызывается конструктор копирования для А по умолчанию, потом 2 раза вызывается деструктор для А, но конструктор копирования по умолчанию ни чего не выводит
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 16:13     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О #27
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Тут без конструктора копирования для A сначала вызывается коструктор для A, потом вызывается конструктор копирования для А по умолчанию, потом 2 раза вызывается деструктор для А, но конструктор копирования по умолчанию ни чего не выводит
Вот в этом то и вопрос. Каким образом вызывается конструктор копирования для А? Для чего он вызывается? Явное задание конструктора копирования для А теоретически ничего менять не должно...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 16:16     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Еще ссылки по теме:

Конструктор вызывается один раз, а деструктор два раза C++
Не вызывается деструктор при работе с классом C++
Конструктор вызывается 2 раза C++

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

Или воспользуйтесь поиском по форуму:
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 16:16  [ТС]     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О #28
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Вы знакомы с const?
Конечно, только не особо использую. Но это уже другая тема.
Yandex
Объявления
28.10.2013, 16:16     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Ответ Создать тему
Опции темы

Текущее время: 21:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru