|
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
|
|
Что возвращает конструктор?31.10.2019, 23:35. Показов 13581. Ответов 69
Метки нет (Все метки)
Что возвращает конструктор?
Читал что если написать myclass() ; (myclass это созданный класс), то создаётся безымянный объект, но как-то странно звучит, если это правда можно подробнее?
0
|
|
| 31.10.2019, 23:35 | |
|
Ответы с готовыми решениями:
69
Что возвращает конструктор? Конструктор Shader() возвращает null Определить конструктор без параметров, конструктор с одним параметром, конструктор с двумя параметрами, деструктор |
|
Комп_Оратор)
|
||||||||||||||||||||||
| 01.11.2019, 16:13 | ||||||||||||||||||||||
Сообщение было отмечено Vanconts как решение
Решение
Добавлено через 13 минут Vanconts, синтаксис и смысл связаны достаточно непрямо. Всё придёт с практикой. Незачем силою мысли пытаться понять, что возвращает MyClass в таком вот выражении:
0
|
||||||||||||||||||||||
|
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
|
||||||
| 01.11.2019, 18:48 [ТС] | ||||||
|
IGPIGP, странно почему не срабатывает оператор ,если просто написать
0
|
||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
|||||
| 01.11.2019, 20:18 | |||||
Сообщение было отмечено IGPIGP как решение
РешениеТак что максимум, что вам дозволено - это просто "иметь в виду" конструктор. А уже вызывать его будете не вы, а компилятор за вас, откуда-то из недр процесса инициализации. () должен пользоваться именно вашим конструктором по умолчанию. Именно это и иллюстрирует ваш пример.В классе S, который я приводил в своем примере ранее, конструктор по умолчанию тоже есть (хотя бы на концептуальном уровне). Однако он объявлен не мной, а неявно компилятором. Это принципиально меняет дело. В такой ситуации инициализатор вида () не будет пользоваться этим конструктором по умолчанию, а будет вместо этого выполнять value-initialization посторонними (бесконструкторными) методами.Как я уже говорил выше, все зависит от специфики инициализируемого типа и формата использованного инициализатора. (Конечно, делегирующие конструкторы в С++11 уже вплотную подошли к этому. И, возможно, делегацию конструктора уже можно смело назвать прямым "вызовом конструктора". Но это совсем другая тема.) Многие со времен С привыкли к тому что кря() - это синтаксис вызова функции, именно и только вызова функции, и забетонировали в своих головах эту интерпретацию. Теперь всегда, когда они видят кря(), они пытаются всеми правдами и неправдами рассматривать только интерпретации, в которых кря() фигурирует именно и только как вызов функции. И даже то, что в myclass() слева от () стоит совсем не имя функции, а имя типа, их надолго не останавливает: сказав "Хмм..." и немного подумав, они вдруг восклицают "Ага! Так это ж имя конструктора!".Тот факт, что у конструкторов в принципе нет имен ("11.4.4.1 Constructors 1 [...] Constructors do not have names. [...]") их нисколько не смущает. На самом деле же дела обстоят совсем по-другому. В С++ с начала времен существует принципиально новый синтаксис T(...) с именем типа T перед (...), который хоть внешне и выглядит, как вызов функции и даже иногда покрякивает, как вызов функции, но на самом деле не является вызовом функции и, формально, никакого отношения к вызову функции не имеет. Это синтаксис преобразования типа в функциональной нотации. Да, преобразование типа в С++ может вызывать конструкторы. А может вызывать и перегруженные операторы приведения типа. А может и вообще ничего не вызывать. Конструкторы во всей этой смеси никак не выделяются среди остальных возможных вариантов поведения.
6
|
|||||
|
Комп_Оратор)
|
||
| 01.11.2019, 20:43 | ||
|
TheCalligrapher, спасибо) Очень круто и полно. Значит имя типа и скобки таки могут иметь отношение к вызову конструктора. Ну и как всё в плюсах - кроме нюансов и исключений. Но это не принципиально. Главное вы рассказали о принципиальных отличиях вызова конструктора и выражения Type_name(), как и о отличиях вызова функций и вызовов конструкторов. Тут есть нюансы которых я не знал. Спасибо, ещё раз.
кря() ? Там же нет параметра. И никто не может заставить конструктор вернуть (условно говоря "вернуть", - то есть ввернуть в место вызова как лампочку ) значение иного типа. Если нет оператора преобразования и выражения которое вынуждает его без возможных ограничений. То есть, не понимаю как конструктор по умолчанию преобразует. А объект создать вызовом можно. Функтор на временном объекте (или любое публичное поле) можно вызвать. Functor_T()(/*params if any*/); ![]() То есть, где-то по сути и духу я говорил нечто похожее о магии, контексте и логике чудес. Но языком менее строгим и точным. Vanconts, вот видите как черепахи падают? Они не бухаются на проггера. Они падают на противоположную сторону грабель. Это называется промежуточным уровнем коссвенности в сочетании с неявным вызовом (тяжких телесных). А утка это то приспособление, куда проггер будет ходить пока не выздоровеет. Тут без практики никак. Продолжая зоо-аналогии в нашем волшебном лесу: - Медведем можно стать не только поцеловав принцессу. Можно достичь мощи и мохнатости насобирав нужное количество шишек. Берегите голову, собирайте осторожно и постепенно. Много маленьких шишек легче заживают чем одна большая. Это я вам как практик говорю.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 01.11.2019, 20:54 | |
|
TheCalligrapher,
Если создать объект без вызова конструктора, то как тогда этим объектом пользоваться? Ведь его лайфтайм не начался (в случае объектов для начала лайфтайма вроде как должен быть вызван конструктор)
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 01.11.2019, 21:16 | ||||||
|
IGPIGP,
Ещё как то раз спрашивал тут, определено ли поведение в том случае когда память под структуру/класс выделаем через маллок, и кастим результат маллок к типу класса/структуры. В этом случае конструктор так же не вызывается, но тем не менее такой код часто используется особенно для служебных структур которые нужны для работы с сокетами. Но тогда конкретного ответа вроде не получил Добавлено через 2 минуты Первый пример это вроде агрегатный тип, и так походу можно делать
0
|
||||||
|
Комп_Оратор)
|
||
| 01.11.2019, 21:24 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 01.11.2019, 21:25 | |
|
IGPIGP,
А чем отличается конструктор сгенеренный по умолчанию от такого же но записанного явно? Если определить конструктор без параметров явно, то код выше не компилируется так как это уже не агрегатный тип. Как проверить ваши утверждения? А насчёт структур для работы с сокетами, они POD-ы, для них лайфтайм считается по другому принципу. Память выделили - получили лайфтайм, память освободили - получили финиш лайфтайма. И опять никаких конструкторов нет. https://stackoverflow.com/ques... ey-special
0
|
|
|
Комп_Оратор)
|
||
| 01.11.2019, 21:27 | ||
0
|
||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||
| 01.11.2019, 21:28 | ||
|
Лайфтайм объекта начинается тогда, когда успешно закончилась его инициализация (http://eel.is/c++draft/basic.life#1.2). А участвует в этой инициализации "вызов конструктора" или не участвует - вопрос совершенно побочный. Еще раз: о каких "вызовах конструкторов" может вообще идти речь, если в системе типов языка С++ присутствует огромное количество не-класс типов, у которых в принципе не может быть никаких "конструкторов". О каком еще "вызове конструктора" может идти речь для объектов типа, например, int?
0
|
||
|
Комп_Оратор)
|
|||
| 01.11.2019, 21:31 | |||
|
0
|
|||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||
| 01.11.2019, 21:38 | ||
a нет такого конструктора. Откуда он возьмется?В данном случае мы имеем дело с агрегатом и с list-инициализацией, которая выливается в классическую агрегатную инициализацию. Никаких конструкторов тут не замешано вообще.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 01.11.2019, 21:39 | |
|
IGPIGP,
Так дело в том что если записать конструктор явно и забить в него cout, то не компилируется так как идёт Попытка вызвать конструктор T(int), которого нет. TheCalligrapher, Я имел ввиду объекты классового типа, а не все доступные типы
0
|
|
|
Комп_Оратор)
|
|||||||||||||
| 01.11.2019, 21:40 | |||||||||||||
![]() А вот тут нет:
Добавлено через 1 минуту
0
|
|||||||||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||||||||
| 01.11.2019, 21:44 | ||||||||
|
Никакой неявной генерации такого конструктора с параметром типа int в С++ нет и никогда не было. Язык С++ умеет неявно генерировать только умолчательные и копирующие/перемещающие конструкторы. Больше никаких конструкторов С++ неявно генерировать никогда не будет.
1
|
||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 01.11.2019, 21:46 | |
|
IGPIGP, IGPIGP,
Выше ведь я привёл код, на rextester. Можете раскомментировать конструктор и скомпилировать
0
|
|
|
Комп_Оратор)
|
||
| 01.11.2019, 21:48 | ||
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 01.11.2019, 21:49 | |
|
TheCalligrapher,
А, я понял. Есть инициализация и она может быть разной. Если скажем конструктор тоже является частью инициализации и если он бросит исключение, то лайфтайм не начнётся потому что процесс инициализации не был успешным, а не потому что конструктор не отработал до конца
0
|
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||
| 01.11.2019, 21:53 | ||
|
Мне же ничего доказывать не нужно: я лишь излагаю стандартную спецификацию процесса инициализации.
1
|
||
| 01.11.2019, 21:53 | |
|
Что можно сделать, что бы конструктор вызывался один раз при агрегировании? Определить, что за параметр передается функции и что она возвращает Что означает запись в скобках и что возвращает return Что тут метод, а что конструктор? Что делает конструктор? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|