|
Заблокирован
|
|
Контруктор по умолчанию01.12.2011, 00:34. Показов 1781. Ответов 17
Метки нет (Все метки)
В учебнике (Дейтла, Как программировать на C++, параграф 3.7 стр. 162) сказано следующее:
Класс получает конструктор по умолчанию в двух случаях: Первый случай вроде понятен 2. Программист явным образом определяет конструктор, не принимающий аргументов. Такой конструктор будет производить инициализацию, специфицированную программистом, и вызовет конструктор по умолчанию для каждого элемента данных, являющегося объектом другого класса. Тут возникает два следующих вопроса: 1) Следует ли это понимать так, что элемент данных, относящийся к базовому типу, должен инициализироваться явно (если это, конечно нужно), а элемент данных, являющийся классом, инициализируется всегда безусловно и принудительно? 2) Что проиходит в том случае, когда для элемента данных, являющегося класом, не предусмотрено контруктора по умолчанию?
0
|
|
| 01.12.2011, 00:34 | |
|
Ответы с готовыми решениями:
17
Почему, С++ ругается на контруктор?
Создать функцию с двумя аргументами, имеющими значение по умолчанию; вывести на экран значения по умолчанию |
|
Заблокирован
|
||||||||||||||||
| 01.12.2011, 00:55 | ||||||||||||||||
|
thick_int,
Запутанное изложение, поэтому у меня сразу же возникает отрицательное отношение к этой книге, хотя я ее не читал. Оставим в стороне эту книгу, и обсудим, что на самом деле имеет место. Первый важный момент. Конструктор по умочанию - это конструктор, который может быть вызван без аргументов. Это совершенно не означает, тчто конструктор не должен иметь параметров. Это означает, что если он имеет параметры, то все его параметры имеют аргументы по умолчанию. Например, конструктор
Второе. В конструкторе по умолчанию вы можете вызывать конструкторы с аргументами для его базовых классов и для подобъектов, имеющих тип класса. Например,
Другое дело, если программсит сам не объявил конструктор по умолчанию. В этом случае компилятор сам за него генерирует конструктор по умолчанию, который имеет вид
И еще я хотел бы добавить, так как вам здесь уже успели сообщить глупость, что в своем конструкторе по умочанию, вы не обязаны явно вызывать конструкторы базовых классов! Они будут вызваны автоматически, если имеются таковые конструкторы по умолчанию для базовых классов!
0
|
||||||||||||||||
|
Заблокирован
|
|
| 01.12.2011, 02:00 [ТС] | |
|
To Сыроежка:
Вы просто немного не поняли. Я имел в виду случай, когда элементом данных является класс, то есть речь шла не о наследовании, а о композиции (или агрегировании). Добавлено через 11 минут Кстати из этого я так понял, что экземпляр класса, вообще никогда не может находитья в неинициализированном состоянии. То есть он либо создается и так или иначе инициализируетя, либо вообще не создается Правильно ли это?
0
|
|
|
Заблокирован
|
|||||||
| 01.12.2011, 02:06 | |||||||
|
2. Если у него будит отсутствовать конструктор по дефолту, то его придётся инициализировать явно в списках инициализации конструктора-хозяина. Иначе - ошибка компиляции. Добавлено через 4 минуты thick_int, вам кстати, Сыроежка толкнул очень подробную речь, которая раскрывает всю эту тему. В том числе - композицию "агрегат - агрегируемый" Он вам привел иллюстрирующий код, где у агрегируемомго объекта отсуствует конструктор по дефолту. Ещё раз посмотрите на код Сыроежки. Я его немножко изменил (он теперь не компилируется) , и оставил комментарий.
0
|
|||||||
|
Заблокирован
|
||
| 01.12.2011, 02:08 | ||
|
Если он сконструирован, то в любом случае с помощью какого то конструктора. А если он не сконструирован, значит его "как бы не существует"
1
|
||
|
Заблокирован
|
|
| 01.12.2011, 02:21 [ТС] | |
|
0
|
|
|
Заблокирован
|
||
| 01.12.2011, 02:31 | ||
|
То же мне, умник нашелся, который удаляет сообщения специалистов, а вместо этого всякий бред несет!
0
|
||
|
Заблокирован
|
|
| 01.12.2011, 02:31 [ТС] | |
|
Ну и из вего этого можно ли вывестии следующее правило:
Всякий объект, если он не является простым или составным объектом базового типа или функцией или указателем на функцию, должен быть проинициализирован. При отсутствии соответствующего инициализатора (или схемы инициализации) компилятор генерирует сообщение об ошибке. Простые или составные объекты базовых типов инициализируются тоже, но мусором.
0
|
|
|
Заблокирован
|
||
| 01.12.2011, 02:37 | ||
|
0
|
||
|
Заблокирован
|
||||||
| 01.12.2011, 02:57 | ||||||
|
thick_int, В этой теме присутствуют как минимум два момента, о которых я сам ни разу ни в одной книге для новичков не видел.
Сам я до этого дошёл лишь на личном опыте, и то - когда обжегся, и несколько часов искал ошибки, силясь понять, что за мистика творится с этим кодом. Поэтому, обращаю ваше внимание на материал, которого скорее всего нет в вашей книге. Момент первый: когда начинается тело конструктора хозяина, все данные члены уже построены! Момент второй: избегай как огня данных-членов, которые зависят друг друга Что бы это понять, внимательно изучите представленный ниже код:
Сами объекты данные-члены конструируются в том порядке, в каком они объявлены в классе. В CSome1 объект a не зависит от объекта b, и поэтому он конструируется корректно. Но в тот момент, когда конструируется объект b, объекта а ещё не существует!!! Поэтому, объект b конструируется мусором. Хотя в списках инициализации он вроде как на втором месте. Ошибка совершенно не очевидная. Если не знаешь - можно долго втыкать, и думать: да что не так то????? Если я не прав - пусть Сыроежка меня поправит. /зы избегай как огня подобных зависимостей данных членов друг от друга. Ничайно поменять местами объявление a и b можно запросто. А вот искать причину, почему вроде бы рабочий класс вдруг начал тупить не по деццки будит ой как не просто. Случай из жизни: Я тогда только только начал ощущать "вкус жизни, или множественное наследование". И вовсю начал юзать списки инициализации, и вызывать базовые конструкторы классов. Класс уже являлся частью довольно крупной архитектуры. При том, был полностью проверен. Потом я сделал несколько модификаций в классе, и решил подправить код класса, что бы он красивее (читабельнее) смотрелся. Ну и по не знанию поменял данные-члены местами. Никаких предупреждений, никаких ошибок компиляции. Просто иногда программа вела себя не корректно. Вместо нормального отчета выводила в файл такую ахинею.... А потом я несколько часов сидел в отладчике, безуспешно пытаясь понять: что не так?
0
|
||||||
|
Заблокирован
|
|
| 01.12.2011, 03:05 | |
|
Bers,
Вообще-то, в хороших книжках пишут, что сначала конструируются базовые классы в том порядке, в котором они перечислены в заголовке класса (за исключением виртуальных классов), а затем конструируются объекты класса в том порядке, в котором они объявлены внутри класса. Проблема лишь в том, что когда начинающие изучать язык С++ читают эти утверждения, они не заостряют на них внимание, а потому быстро забывают. И вспомниают о них лишь тогда, когда на собственном опыте столкнулись со своим некорректным объявлением класса.
0
|
|
|
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
|
||||||||
| 01.12.2011, 03:06 | ||||||||
Я же новичок, а где-то уже вычитал В теле конструктора идёт проверка вводимых данных. Можно написать так:
0
|
||||||||
|
Заблокирован
|
||
| 01.12.2011, 03:16 | ||
|
А то мало ли.. может это на усмотрение компиляторов?
0
|
||
|
Заблокирован
|
||||
| 01.12.2011, 03:39 | ||||
|
Есть три вида инициализации: 1. Инициализация нулем 2. Инициализация по умолчанию 3. Инициализация значением. Добавлено через 11 минут Добавлено через 5 минут
1
|
||||
|
Заблокирован
|
||||||
| 01.12.2011, 03:54 [ТС] | ||||||
|
Мне почему то кажется, что было бы очень хорошо, если бы вообще такая инициализация
Иными словами, интуитивно кажется весьма опасным инициализировать одни члены, полагаясь лишь на то, что другие члены уже проинициализированы. Кажется, что если придерживаться этого правила, тогда и голову не придется ломать над правильным порядком членов класса.
0
|
||||||
| 01.12.2011, 03:54 | |
|
Помогаю со студенческими работами здесь
18
Значение полей по умолчанию : "нет значения поля по умолчанию"; "Null";"0" Значение по умолчанию: "0"; "Null"; "нет значения по умолчанию" БД по умолчанию Масштаб по умолчанию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|