Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
 Аватар для Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187

Порядок вызова конструкторов при присваивании объектов одного класса

25.08.2016, 23:30. Показов 4444. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется код ниже.
C++
1
Wein dres = rom;
Где dres и rom объекты класса Wein. Класс Wein имеет все конструкторы по умолчанию. Rom определен выше, это не имеет разницы. Расскажите, при подобном операторе какие конструкторы и деструкторы вызываются явно и не явно.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.08.2016, 23:30
Ответы с готовыми решениями:

Порядок вызова конструкторов при множественном наследовании
Здравствуйте, меня интересует вопрос, как изменить последовательность вызова конструкторов базовых классов во время создания объекта класса...

Порядок вызова конструкторов
Всем доброго дня. Наткнулся в коде на интересные грабли: test.cpp #include "test.h" Test test; Test::Test() {

Порядок вызова конструкторов
Есть классы First и Second. Класс Second наследуется от First. Я имею ввиду: class Second: public First { //... };

51
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
26.08.2016, 13:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Книга, глава, страница?
Скрина недостаточно? "Язык программирования С++. Лекции и упражнения". Если издание 2011 года, то глава 12, 602-603 стр.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
26.08.2016, 13:45
nd2, Из книги Прата:
C++
1
Stock stock2 = Stock ("Boffo Objects", 2, 2.0);
...
The second way is to allow the call to the constructor to create a temporary object that is then copied to stock2.
Добавлено через 1 минуту
Цитата Сообщение от nd2 Посмотреть сообщение
Скрина недостаточно?
На скрине не видно где это всё находится. И тем более там для простого типа - указателя.
Да и контекст здесь скорее объясняющий поведение, а не конкретные операции.
Ну а если нет, то это ошибка. В оригинале тоже присваивание написано (6-е издание).
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.08.2016, 13:50
Сейчас бы беспрекословно верить книге 2011 переведённую очередным гуманитарием в 2016 году, когда стандарт уже правился несколько раз. Эх.......
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
26.08.2016, 13:51
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
И тем более там для простого типа - указателя.
Для какого указателя? Смотри внимательно, разговор идёт о двух средних примерах.
Миниатюры
Порядок вызова конструкторов при присваивании объектов одного класса  
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
26.08.2016, 14:00
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Сейчас бы беспрекословно верить книге 2011 переведённую очередным гуманитарием в 2016 году, когда стандарт уже правился несколько раз. Эх.......
Подождём DrOffset, или TheCalligrapher, может прояснят: ошибка это или что.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.08.2016, 14:00
Цитата Сообщение от nd2 Посмотреть сообщение
Как тогда та, возможная, реализация, о которой пишет Прата?
Он пишет по сути о том, что инициализация через =, называется copy-initialization. Т.е. компилятор b будет пытаться преобразовать к A посредством преобразования через копирование. Т.е. эта запись эквивалентна такой:
C++
1
A a(A(b));
Это все справедливо в случае, если b - имеет другой тип (не A и не тип наследника от A). В случае же, когда типы совпадают, я не припомню в стандарте необходимости выполнять конвертацию (которая следом порождает временный объект).
8.5/17.6.1
If the initialization is direct-initialization, or if it is copy-initialization where the cv-unqualified
version of the source type is the same class as, or a derived class of, the class of the destination,
constructors are considered. The applicable constructors are enumerated (13.3.1.3), and the best
one is chosen through overload resolution (13.3). The constructor so selected is called to initialize
the object, with the initializer expression or expression-list as its argument(s).
А вот про случай, когда типы разные, написано как раз про возможный временный объект:
Otherwise (i.e., for the remaining copy-initialization cases), user-defined conversion sequences
that can convert from the source type to the destination type or (when a conversion function
is used) to a derived class thereof are enumerated as described in 13.3.1.4, and the best one is
chosen through overload resolution (13.3). If the conversion cannot be done or is ambiguous, the
initialization is ill-formed. The function selected is called with the initializer expression as its
argument; if the function is a constructor, the call initializes a temporary of the cv-unqualified
version of the destination type. The temporary is a prvalue.
The result of the call (which is the
temporary for the constructor case) is then used to direct-initialize, according to the rules above,
the object that is the destination of the copy-initialization. In certain cases, an implementation
is permitted to eliminate the copying inherent in this direct-initialization by constructing the
intermediate result directly into the object being initialized
; see 12.2, 12.8.
Курсивом выделил то, о чем говорил Прата.
Насколько я помню, в С++03 в этом отношении было все так же.
Пока что для меня его пример (именно только пример кода) не коррелирует с тем, что написано в стандарте.
1
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
26.08.2016, 14:02
Цитата Сообщение от nd2 Посмотреть сообщение
разговор идёт о двух средних примерах.
Еще раз:
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Ну а если нет, то это ошибка. В оригинале тоже присваивание написано (6-е издание).
Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Пока что для меня его пример (именно только пример кода) не коррелирует с тем, что написано в стандарте.
В оригинале также, т.е. это не переводчики:
Depending on the implementation, the middle two declarations may use a copy constructor directly to create metoo and also, or they may use a copy constructor to generate temporary objects whose contents are then assigned to metoo and also.The last example initializes an anonymous object to motto and assigns the address of the new object to the pstring pointer.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
26.08.2016, 14:03
Найти бы реализацию, где будут, в таком коде, создаваться временные объекты и посмотреть.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.08.2016, 14:04
Цитата Сообщение от nd2 Посмотреть сообщение
ошибка это или что.
Насчет использования термина "присваивание" в этом контексте - однозначно ошибка. Оригинал не читал, возможно это перевод подвел.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
26.08.2016, 14:06
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Еще раз:
Это ты потом добавил, сначала только про указатель было.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
26.08.2016, 14:07
Цитата Сообщение от nd2 Посмотреть сообщение
Найти бы реализацию, где будут, в таком коде, создаваться временные объекты и посмотреть.
Ок. Применим "волшебный" -fno-elide-constructors
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
 
struct Test
{
    Test() { std::cout << "Test::ctor" << std::endl; }
    ~Test() { std::cout << "Test::dtor" << std::endl; }
    Test(const Test&) { std::cout << "Test::cctor" << std::endl; }
    Test& operator=(const Test&) { std::cout << "Test::assign" << std::endl; }
};
 
int main()
{
    Test t = Test();
}
http://rextester.com/JROHFF64304
Test::ctor
Test::cctor
Test::dtor
Test::dtor
Видите присваивание? Поведение соответствует стандарту, а не Прата.
В следующий раз проверьте сами или, хотя бы, загляните в стандарт, прежде чем спорить о том, подтверждения чего Вы нашли только в книге для новичков от писателя.
Добавлено через 27 секунд
Цитата Сообщение от nd2 Посмотреть сообщение
сначала только про указатель было.
Сначала я только на него и посмотрел. Потом дописал.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.08.2016, 14:13
Я встречал ситуации, когда в книгах были описаны некоторые особенности С++ черновиков до официальной стандартизации. А потом при переизданиях эти описания переносились без изменений, не смотря на то, что в стандарте уже были закрыты ошибочные положения соответствующими дефект-репортами. Поэтому, чтобы узнать причину почему так в книге, надо поискать соответвующие репорты насчет этого и все встанет на свои места. Если репорт был, значит Прата просто "забыл", убрать старое описание из своей книги при переиздании.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
26.08.2016, 14:16
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Применим "волшебный" -fno-elide-constructors
Уважаемый, ты смотришь в книгу? Думаешь, я не проверял так? Написано же на двух языках: "В ЗАВИСИМОСТИ ОТ РЕАЛИЗАЦИИ" !!!
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Depending on the implementation
Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Если репорт был, значит Прата просто "забыл", убрать старое описание из своей книги при переиздании.
Возможно и так.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
26.08.2016, 14:16
Цитата Сообщение от nd2 Посмотреть сообщение
Написано же
тебе уже стандарт привели, ты всё в Прата смотришь. Разговор окончен. Не интересно.

DrOffset, в исправленном (6-ом издании), много косяков исправили, но это так и осталось. В любом случае книга для новичков, может он посчитал что так понятнее.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
26.08.2016, 14:21
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому, чтобы узнать причину почему так в книге,
Нужно у Прата спросить. Он за слова (тем более, написанные), вообще, собирается отвечать.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
26.08.2016, 14:28
И в дополнение к посту DrOffset
The form of initialization (using parentheses or =) is generally insignificant, but does matter when the initializer or the entity being initialized has a class type; see below. If the entity being initialized does not have class type, the expression-list in a parenthesized initializer shall be a single expression.
The initialization that occurs in the form
C++
1
T x = a;
as well as in argument passing, function return, throwing an exception (15.1), handling an exception (15.3), and aggregate member initialization (8.5.1) is called copy-initialization. [ Note: Copy-initialization may invoke a move (12.8). — end note ]
0
26.08.2016, 14:35

Не по теме:

Цитата Сообщение от nd2 Посмотреть сообщение
Он за слова (тем более, написанные), вообще, собирается отвечать.
Ты предлагаешь мне спросить? :)


Не по теме:

Добавлено через 1 минуту
Дефект репорта, кстати, я не нашел. В стандарте всегда разграничивали варианты когда типы совпадают и когда типы разные.

0
26.08.2016, 14:44

Не по теме:

Цитата Сообщение от nord_v Посмотреть сообщение
А хотелось бы...
Гораздо лучше спросить на конференции comp.lang.c++.moderated.
Хотя последний раз, когда я ее упомянул, мне намекнули, что нельзя призывать переносить дискуссию на другую площадку.
На всякий случай скажу, что я никого не призываю :)

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.08.2016, 14:49
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.е. эта запись эквивалентна такой:
Нет xD http://rextester.com/ONFB84572

P.S. Я не тролю вас DrOffset, - просто хочу получить лайк от самого DrOffset
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.08.2016, 15:01
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
P.S. Я не тролю вас DrOffset
Уверен?
Да, в том примере будет неоднозначность синтаксиса, которая разрешится в пользу декларации функции.
Исправить можно так:
C++
1
A a( (A)( b ) ); // prevent most vexing parse
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.08.2016, 15:01

Порядок вызова конструкторов
на срр-reference нашёл тему про виртуальный деструктор, но я так и не понял (да там и не объясняется), почему именно конструктор класса...

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

Классы, наследование, порядок вызова конструкторов
допустим у меня эсть два класса class a { publc: char *n; a() { n= new char ; } ~a()

Очерёдность вызова конструкторов класса
У меня есть 2 класса, к примеру Base и Mod. Mod является наследником Base. Классу Mod соответствует такой конструктор: Mod(int _id, int...

Странный порядок вызова конструкторов и передача временного обьекта в функцию в качестве неконстантной ссылки
Есть код //g++ 5.4.0 #include &lt;iostream&gt; struct foo { foo(int){std::cout &lt;&lt; &quot;int ctor&quot; &lt;&lt; std::endl;} foo()...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru