275 / 152 / 52
Регистрация: 30.06.2011
Сообщений: 1,700
|
||||||
1 | ||||||
Инициализация полей класса25.09.2017, 19:24. Просмотров 6015. Ответов 18
Метки нет Все метки)
(
Приветствую всех. Не в одной книге по С++ сказано, что поля класса желательно инициализировать в списке инициализации конструктора этого класса. В противном случае, а именно в случае инициализации поля в теле конструктора, поле сначала будет инициализировано нулем, а потом ему присвоится значение в теле конструктора, то есть двойная работа. Решив это проверить я написал такой код:
x в теле конструктора инициализирован нулем. Далее я запустил RAD Studio 10.1, создал консольное приложение и выполнил этот же код. В результате увидел, что x перед сохранением в нем числа 7 хранит не 0. Почему так происходит? Компилятор отступает от стандарта?
0
|
|
25.09.2017, 19:24 | |
Инициализация полей класса при наследовании Инициализация полей класса через vector<> Инициализация полей во время объявления класса Инициализация вещественных статических константных полей класса С++ |
|
275 / 152 / 52
Регистрация: 30.06.2011
Сообщений: 1,700
|
|||||||||||
25.09.2017, 19:44 [ТС] | 3 | ||||||||||
Это не я решил. Это так в книге написано: Джефф Элджер Библиотека программиста, 34-35 страница:
Кликните здесь для просмотра всего текста
Списки инициализации членов
Чтобы избавиться от этой проблемы, в C++ находится очередное применение символу : — для создания списков инициализации членов. Так называется список спецификаций конструкторов, разделенных занятыми и расположенных между сигнатурой конструктора и его телом.
0
|
Don't worry, be happy
|
|
25.09.2017, 20:14 | 4 |
Это еще может зависеть от способа инициализации объекта.
http://en.cppreference.com/w/c... ta_members
0
|
1365 / 588 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
25.09.2017, 23:47 | 5 |
Не нулём. Это ошибка, относительно стандартного требования к
конструктору int без параметров . Нет такого требования.А вот то, что этот код даёт неочевидный результат, это мне, например, интересно. Почему на сайте один порядок работы конструктора: конструкторский cout выводит значение, полученное из конструктора int (ещё не изменённое значение копированием), - а в clang, например, конструкторский cout даёт уже изменённое копированием значение?
0
|
daslex
|
25.09.2017, 23:53
#7
|
Не по теме: ред
0
|
Croessmah
|
25.09.2017, 23:53
#8
|
0
|
1365 / 588 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
25.09.2017, 23:59 | 9 |
В смысле примеры. Подождите немного, сделаю скрины. Так наглядно будет.
0
|
daslex
|
26.09.2017, 00:12
#10
|
Не по теме: "ред". я пишу, если время на поправку вышло, но шанс исправить неточности есть, когда никто ничего написать не успел, можно исправить опечатки даже после 5 мин. Вы своей просьбой лишили меня надежды. Скринов два. Они выложены, если что. Мало ли отчёта ждёте, что готово.
0
|
Don't worry, be happy
|
|
26.09.2017, 00:17 | 11 |
daslex, при сборке clang и правда выводит 7.
http://rextester.com/UXD76586 С volatile int x; выводит 0.
0
|
1365 / 588 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
26.09.2017, 00:21 | 12 |
Вопрос автор темы задал неверно, но он хотел узнать то, что я показал. Неверно спросил из-за плохого перевода книги скорее всего, а то, что именно об этом хочет узнать, по-моему сейчас очевидно. Я тоже хочу об этом узнать.
0
|
Don't worry, be happy
|
|
26.09.2017, 00:33 | 13 |
daslex, использование не инициализированных переменных - undefined behavior (точную формулировку в стандарте нужно посмотреть).
А с UB компилятор может делать всё что угодно. А clang - вообще монстр в этом деле, так что я не удивлен. Но за точными сведениями лучше залезть в стандарт. Это я так, отсебятины нагородил.
0
|
1365 / 588 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
26.09.2017, 00:44 | 14 |
Зато в vc++ volatile
Добавлено через 8 минут Вот и всё. А пример вот он, прям в этой теме.
0
|
1365 / 588 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
26.09.2017, 00:49 | 16 |
Я знаю, что необязателен. Просто Вы так выразились сначала, что можно будет подумать, что volatile спасает. Поэтому я написал, что написал.
Добавлено через 1 минуту В clang это не мусор, а исключительно подкланговская фишка. Неспецифицированное поведение (Unspecified behavior).
0
|
Don't worry, be happy
|
|
26.09.2017, 00:49 | 17 |
1
|
1365 / 588 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
26.09.2017, 01:15 | 18 |
Убедили. Мусор. Оптимизаторы шалуны.
0
|
Тематические курсы и обучение профессиям онлайн Профессия Разработчик на C++ (Skillbox) Архитектор ПО (Skillbox) Профессия Тестировщик (Skillbox) |
Mournful Max
|
26.09.2017, 02:28
Инициализация полей класса
#19
|
Не по теме: Croessmah, видели бы Вы мое лицо...) Нормальная такая оптимизация)))
0
|
26.09.2017, 02:28 | |
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
|
26.09.2017, 02:28 |
Привет! Вот еще темы с ответами:
19
Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса) Инициализация экземпляра класса, как поле другого класса
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |