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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
#1

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

28.10.2013, 14:18. Просмотров 1354. Ответов 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 раз. С чем это связано?
0
Миниатюры
При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 14:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О (C++):

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

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

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

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

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

Не вызывается конструктор базового класса - C++
Доброго времени суток. У меня проблема:в производном классе не вызывается конструктор базового класса. Думаю описывать класс не стоит,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2013, 15:36 #16
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Получается, что создаётся временный объект C(A())), потом от него инициализируется уже (c). Вот я и не понимаю, зачем это нужно, если при первом вызове конструктора объект уже есть...
Потому что код так написан. Спросите у того, кто его писал, зачем он так сделал.
0
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 15:38  [ТС] #17
Цитата Сообщение от ForEveR Посмотреть сообщение
Без конструктора копирования нужно:
Код C++
1
C c((A()));
Так у меня вообще ни какой конструктор не вызывается. И варинг появляется:
Предупреждение 1 warning C4930: C c(A (__cdecl *)(void)): функция с прототипом не вызвана (предполагалось определение переменной?) D:\documents\Visual Studio 2010\Projects\LSD\LSD\main.cpp 27 1 LSD

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Потому что код так написан. Спросите у того, кто его писал, зачем он так сделал.
А по-другом вообще конструктор не вызывается.
0
ForEveR
В астрале
Эксперт С++
7973 / 4735 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
28.10.2013, 15:39 #18
Виктор_Сен, На скобки смотрите внимательнее. Точнее на кол-во скобок.
1
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 15:42  [ТС] #19
Но без виртуальности вызова конструктора копирования нет. В этом видимо причина.
0
ForEveR
В астрале
Эксперт С++
7973 / 4735 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
28.10.2013, 15:42 #20
А вообще вот, почитайте: Как работает компилятор при создании объекта недавно была тема именно про это.
1
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 15:47  [ТС] #21
Цитата Сообщение от ForEveR Посмотреть сообщение
На скобки смотрите внимательнее. Точнее на кол-во скобок.
Всё, понятно. То есть с двойными скобками конструктор вызывается и в одном количестве. А я всё время писал через знак равенства, т. к. на скобки компилятор выводил варинг. Но оказывается двойные скобки решают эту проблему
0
Shtirliz72
201 / 161 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 15:48 #22
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Если посмотреть в отладчике, то видно, что конструктор C() вызывается 2 раза, причём второй раз конструктор копирования. Я понимаю, если бы это было с конструктором A(), т. к. A() передаётся по значению. Но ни могу понять почему именно конструктор C(). Причём если деструктор класса A сделать не виртуальным, то конструктор класса C() будет вызываться 1 раз. С чем это связано?
Я может и ошибусь, но просто оптимизации применяются разные. Если без virtual ~C компилятор ваше выражение С с = С(A()) приводит к виду С с(A), то с virual ~C он страхуется от каких-то случаев или же просто не прописан так делать и поэтому оставляет всё как есть. Скорее всего, чтобы код был одинаков вам просто нужно отключить оптимизации.
1
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 15:51 #23
Если прописать явно для класса А конструктор копирования то виртуальный будет деструктор для класса А или нет результат будет один и тот же:
А()
С(A a)
~A()
C(C& c)
~C()
Если этого не сделать выводится два деструктора для А.... так и не понял откуда второй деструктор..
Цитата Сообщение от Cra3y Посмотреть сообщение
У меня это не компилится %)
Смотрите ссылку, что дал ForEveR там поясняется в чем причина и что нужно делать (передать аргумент в конструкторе копирования как const)
1
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 15:56  [ТС] #24
Shtirliz72, "внутренний" К. О. мне подсказывает, что на практике вообще лучше не пользоваться передачей классов и структур по значению, и чтобы уж синтаксис не менять, то использовать передачу по ссылке. Там такой проблемы не возникает. Просто тут хотелось разобраться именно с передачей по значению, как говорится "дело принципа"
0
Shtirliz72
201 / 161 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:04 #25
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Shtirliz72, "внутренний" К. О. мне подсказывает, что на практике вообще лучше не пользоваться передачей классов и структур по значению, и чтобы уж синтаксис не менять, то использовать передачу по ссылке. Там такой проблемы не возникает. Просто тут хотелось разобраться именно с передачей по значению, как говорится "дело принципа"
Это хорошо. Вы знакомы с const? Если не знакомы - почитайте. Очень хорошая тема, которая существенно помогает в программировании. И более того - подсказывает компилятору, какие оптимизации можно провести.
0
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 16:04  [ТС] #26
Цитата Сообщение от Ilot Посмотреть сообщение
Если прописать явно для класса А конструктор копирования то виртуальный будет деструктор для класса А или нет результат будет один и тот же
Это верно.
Цитата Сообщение от Ilot Посмотреть сообщение
Если этого не сделать выводится два деструктора для А.... так и не понял откуда второй деструктор..
Тут без конструктора копирования для A сначала вызывается коструктор для A, потом вызывается конструктор копирования для А по умолчанию, потом 2 раза вызывается деструктор для А, но конструктор копирования по умолчанию ни чего не выводит
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 16:13 #27
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Тут без конструктора копирования для A сначала вызывается коструктор для A, потом вызывается конструктор копирования для А по умолчанию, потом 2 раза вызывается деструктор для А, но конструктор копирования по умолчанию ни чего не выводит
Вот в этом то и вопрос. Каким образом вызывается конструктор копирования для А? Для чего он вызывается? Явное задание конструктора копирования для А теоретически ничего менять не должно...
0
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 16:16  [ТС] #28
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Вы знакомы с const?
Конечно, только не особо использую. Но это уже другая тема.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 16:16
Привет! Вот еще темы с ответами:

Не вызывается нужный конструктор базового класса - C++
Здравствуйте. Я пока в процессе изучения С++. Имеется следующая структура классов: Базовый: Person, расширяющие его: Student и...

Не вызывается деструктор при работе с классом - C++
Здравствуйте! Не подскажете почему при работе с классом Деструктор не вызывается???? Вот код: #define _CRTDBG_MAP_ALLOC ...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -> i = i; } }; Конструктор Test::Test всегда вызывается...

Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? - C++
class A { char * v; A(); ~A(); A(const A &obj); } ///////////////////// A::A() {


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.10.2013, 16:16
Ответ Создать тему
Опции темы

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