36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
||||||
1 | ||||||
При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О28.10.2013, 14:18. Показов 5169. Ответов 27
Метки нет Все метки)
(
Вот такой код
0
|
|
28.10.2013, 14:18 | |
Ответы с готовыми решениями:
27
Конструктор вызывается один раз, а деструктор два раза
Два раза вызывается деструктор
|
46 / 46 / 18
Регистрация: 25.10.2011
Сообщений: 183
|
|
28.10.2013, 14:43 | 3 |
1. Вызывается конструктор А
2. Вызывается конструктор копий С 3. Вызывается деструктор А Что странного?
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
28.10.2013, 14:51 | 4 | |||||
С виртуальностью - 1 скрин, и без виртуальности - 2 скрин.
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
||||||
28.10.2013, 14:51 [ТС] | 5 | |||||
То, что Вы написали, НЕ странно. Странно то, что вызывается 2 раза конструктор для объекта C. На левом скриншоте это выделено
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|||||||||||
28.10.2013, 15:14 [ТС] | 8 | ||||||||||
Тут другого объекта нет. Тут только объект (с). Получается, что создаётся временный объект C(A())), потом от него инициализируется уже (c). Вот я и не понимаю, зачем это нужно, если при первом вызове конструктора объект уже есть... Как я полагаю, конструктор копирования срабатывает при инициализации объекта уже готовым объектом. Но тут получается заранее готового объекта нет. Он создаётся только для того, чтобы вызвать конструктор копирования, зачем это нужно, если при первом вызове конструктора у нас фактически уже есть нужный объект. И потом без виртуальности этого не происходит, т. е. конструктор для (C) вызывается 1 раз, значит в принципе конструктор копирования не нужен здесь, это ведь не не инициализация от готового объекта по сути, это просто инициализация через вызов конструктора. Что такого есть в виртуальности, что компилятор генерирует вызов ещё и конструктора копирования?
Добавлено через 5 минут Зачем это нужно, если можно вызвать конструктор (не копирования) сразу для (С)? Добавлено через 1 минуту Если бы было так, то без виртуальности вывод на левом скриншоте и правом совпадали бы. Тут ключевой момент именно в виртуальности. Без неё конструктор копирования не вызывается. Добавлено через 2 минуты И если передавать класс (A) по ссылке, то и с виртуальностью, и без виртуальности конструктор копирования не вызывается. Значит всё-таки код
0
|
46 / 46 / 18
Регистрация: 25.10.2011
Сообщений: 183
|
|||||||||||
28.10.2013, 15:14 | 9 | ||||||||||
Так зачем писать было
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
||||||
28.10.2013, 15:20 [ТС] | 10 | |||||
A() C(A()) ~A() Добавлено через 2 минуты Так вообще ни какого вывода нет, т. к. вот что: Предупреждение 1 warning C4930: C c(A (__cdecl *)(void)): функция с прототипом не вызвана (предполагалось определение переменной?) D:\documents\Visual Studio 2010\Projects\LSD\LSD\main.cpp 26 1 LSD
0
|
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
|
28.10.2013, 15:22 | 11 |
Вам для полного понимания, надо было бы ещё в A указать ещё конструктор копирования, а то используется конструктор по умолчанию, который ничего не выводит.
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|
28.10.2013, 15:25 [ТС] | 12 |
Всё-таки при определении переменной нужен знак равенства, и при определении переменной, как я понимаю, этот знак равенства эквивалентен не копированию, а созданию "с нуля" переменной, если справа от знака равенства нет уже существующей переменной (которая связана с буквой, её обозначающей).
0
|
шКодер самоучка
|
|
28.10.2013, 15:28 | 13 |
У меня это не компилится %)
Код
max@notebook:~/src/tests$ g++ c.cpp c.cpp: In function ‘int main()’: c.cpp:21:16: error: no matching function for call to ‘C::C(A)’ C c = C(A()); ^ c.cpp:21:16: note: candidates are: c.cpp:16:5: note: C::C(C&) C(C& c){ cout << "C(C &c)" << endl;} ^ c.cpp:16:5: note: no known conversion for argument 1 from ‘A’ to ‘C&’ c.cpp:14:5: note: C::C(A&) C(A &a){cout << "C(A a)" << endl;} ^ c.cpp:14:5: note: no known conversion for argument 1 from ‘A’ to ‘A&’ max@notebook:~/src/tests$ g++ --version g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1
0
|
В астрале
![]() 8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
28.10.2013, 15:35 | 14 | ||||||||||
Без конструктора копирования нужно:
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
||||||
28.10.2013, 15:35 [ТС] | 15 | |||||
У меня нормально компилится
0
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|
28.10.2013, 15:38 [ТС] | 17 |
Так у меня вообще ни какой конструктор не вызывается. И варинг появляется:
Предупреждение 1 warning C4930: C c(A (__cdecl *)(void)): функция с прототипом не вызвана (предполагалось определение переменной?) D:\documents\Visual Studio 2010\Projects\LSD\LSD\main.cpp 27 1 LSD Добавлено через 1 минуту А по-другом вообще конструктор не вызывается.
0
|
В астрале
![]() 8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
28.10.2013, 15:39 | 18 |
Виктор_Сен, На скобки смотрите внимательнее. Точнее на кол-во скобок.
1
|
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|
28.10.2013, 15:42 [ТС] | 19 |
Но без виртуальности вызова конструктора копирования нет. В этом видимо причина.
0
|
В астрале
![]() 8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
28.10.2013, 15:42 | 20 |
А вообще вот, почитайте: Как работает компилятор при создании объекта недавно была тема именно про это.
1
|
28.10.2013, 15:42 | |
28.10.2013, 15:42 | |
Помогаю со студенческими работами здесь
20
Конструктор вызывается 2 раза Когда вызывается деструктор класса? При динамическом создании объекта в классе деструктор не вызывается Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |