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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Перемещение элемента http://www.cyberforum.ru/cpp-beginners/thread990454.html
Подскажите, пожалуйста, с помощью каких функций можно задать перемещение (по кругу например) нарисованного элемента в picturebox?
C++ Последовательность целых чисел Вводится последовательность челых чисел,0-конец последовательности.Для каждого числа последовательности найти сумму его простых делителей(функцией оформить определения суммы простых делителей числа). Добавлено через 3 часа 13 минут Подскажите пожалуйста http://www.cyberforum.ru/cpp-beginners/thread990447.html
C++ Вычисление логарифма с помощью ряда Тейлора. Программа не работает, не могу понять где ошибся
Как я понимаю, программа где-то зацикливается, но вот где именно не могу понять, подскажите, где я ошибся или что-то упустил. Суть задания таково: нужно написать программу, которая высчитывает функцию которая равна ln((X+1)/(X-1)), и вычисление её с помощью ряда Тейлора 1/(2n+1)*X2n-1, с точностью e. #include "stdafx.h" #include "iostream" #include "conio.h" #include "math.h" using...
C++ Ошибка при вызове деструктора
Всем привет ! Есть класс class building { private: string *location_street; unsigned int *number_of_building; public : building() { location_street = new string("Default");
C++ Изменение фокуса клавиатуры http://www.cyberforum.ru/cpp-beginners/thread990416.html
Доброго времени суток. Вожусь тут с одной интересной мне задачей. Обсуждал ее в этой ветке форума. http://www.cyberforum.ru/windows7/thread990204.html#post5247288 Вопрос по С++. Можно ли создать такую программу, которая перехватывала бы событие с клавиатуры, сравнивала его с списком разрешенных символов (к примеру кнопки ZXCVB), если событие было вызвано одной из этих кнопок, то программа бы...
C++ Вывести новый массив состоящий из элементов начального массива в заданной зависимости 1.Нужно ввести размерность начального одномерного массива c клавиатуры. Элементы заполняются с помощью rand(); #include <time.h> #include <iostream> #include <iomanip> void main() { int n; cin>>n; int *mass=new int; for (int i=0; n<i; i++) подробнее

Показать сообщение отдельно
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 01.08.2011
Сообщений: 176
28.10.2013, 15:14  [ТС]     При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Цитата Сообщение от alsav22 Посмотреть сообщение
С виртуальностью - 1 скрин, и без виртуальности - 2 скрин.
Цитата Сообщение от alsav22 Посмотреть сообщение
При инициализации объекта (с) другим объектом (созданным с помощью C(A())), вызывается конструктор копирования.
Тут другого объекта нет. Тут только объект (с). Получается, что создаётся временный объект C(A())), потом от него инициализируется уже (c). Вот я и не понимаю, зачем это нужно, если при первом вызове конструктора объект уже есть... Как я полагаю, конструктор копирования срабатывает при инициализации объекта уже готовым объектом. Но тут получается заранее готового объекта нет. Он создаётся только для того, чтобы вызвать конструктор копирования, зачем это нужно, если при первом вызове конструктора у нас фактически уже есть нужный объект. И потом без виртуальности этого не происходит, т. е. конструктор для (C) вызывается 1 раз, значит в принципе конструктор копирования не нужен здесь, это ведь не не инициализация от готового объекта по сути, это просто инициализация через вызов конструктора. Что такого есть в виртуальности, что компилятор генерирует вызов ещё и конструктора копирования?

Добавлено через 5 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Что в этом странного? Первый раз просто конструктор: C(A()), второй раз конструктор копирования, для инициализации этим, созданным объектом, объекта c
Зачем это нужно, если можно вызвать конструктор (не копирования) сразу для (С)?

Добавлено через 1 минуту
Цитата Сообщение от Cra3y Посмотреть сообщение
C++
1
2
3
4
5
6
// код
C c = C(A());
// равносилен
A a;
C temp(a);
C c(temp);
Если бы было так, то без виртуальности вывод на левом скриншоте и правом совпадали бы. Тут ключевой момент именно в виртуальности. Без неё конструктор копирования не вызывается.

Добавлено через 2 минуты
И если передавать класс (A) по ссылке, то и с виртуальностью, и без виртуальности конструктор копирования не вызывается. Значит всё-таки код
C++
1
C c = C(A());
и
C++
1
2
3
A a;
C temp(a);
C c(temp);
не равносильны.
 
Текущее время: 22:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru