|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Что означают ключевые слова default, delete и зачем они нужны16.01.2017, 13:51. Показов 44002. Ответов 22
Метки нет (Все метки)
Собственно сабж.
Часто встречаю что методу можно присвоить какое то значение, например virtual void method() = 0 означает что этот метод должен быть реализован наследником и у него нет тела в момент объявления. Но что означает default и delete тогда когда они вместо нуля после функции? Искал в тырнете, но плохо понял Прошу пояснить кто знает, хочу знать где этим можно и даже нужно пользоваться И ещё куда происходит присвоение? Метод же это не переменная что бы писать method() = 0 Где то под капотом есть указатель на этот метод и присвоение этого значения происходит именно этому указателю? Добавлено через 1 минуту Заголовок у меня плохой, модераторы, поправьте пожалуйста Что означают ключевые слова default, delete в описании функции и зачем они нужны Думаю так лучше
0
|
|
| 16.01.2017, 13:51 | |
|
Ответы с готовыми решениями:
22
Что за векторы и зачем они нужны
Что такое классы и зачем они нужны? |
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||
| 16.01.2017, 13:52 | ||||
|
1
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 16.01.2017, 13:57 [ТС] | |||
|
1. Предотвратить обращение к методу использование которого не предусмотрено для объектов этого класса 2. Что бы компилятор не добавлял реализацию по умолчанию и исходный код стал меньше? 3. Это касается только тех методов которые компилятор генерирует по умолчанию?
0
|
|||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||
| 16.01.2017, 13:58 | ||
|
Мы определяем явно какой-нибудь конструктор с параметрами. Но при этом хотим оставить конструктор по умолчанию, при этом нас устраивает стандартная его реализация. Мы можем объявить его, добавив на конце = default и всё, тело не нужно описывать явно, вдобавок это повышает вероятность, что читавший поймёт наши намерения. Другой пример. Как нам известно, деструктор, генерируемый компилятором по умолчанию не виртуальный. Но если класс предполагает наследников, нам нужно сделать его виртуальным для правильного полиморфного удаления объекта. В классе не используется динамическая память и нас устраивает то, что компилятор сгенерирует по умолчанию. Мы объявляем деструктор явно, указав что он виртуальный и добавляем на конец = default, подчёркивая тем самым, что единственная причина определения явно - добавление виртуальности.
4
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 16.01.2017, 13:58 [ТС] | |
|
И есть ли ещё ключевые слова для таких вещей кроме как delete default и 0?
0
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
| 16.01.2017, 13:58 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||
| 16.01.2017, 13:59 | ||||||||||
|
никто не запрещает написать тело для чисто-виртуальной функции.
что бы он сам создал реализацию по дефолту например, если нужно запретить конструктор копии. попытка сделать копию будет приводить к ошибке компиляции. просто такой способ обозначить, что функция - чисто-виртуальная.
1
|
||||||||||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||
| 16.01.2017, 14:05 | |||
|
Добавлено через 1 минуту Добавлено через 2 минуты http://en.cppreference.com/w/c... _functions Добавлено через 1 минуту http://en.cppreference.com/w/c... _functions
1
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 16.01.2017, 14:06 [ТС] | ||||||
|
MrGluck, Про default это всмысле когда мы создаем конструктор явно, конструктор по умолчанию не добавляется Но если он нужен просто пишем defaultConstructor() = default и без описания тела просим компилятор его добавить Так? Добавлено через 1 минуту Добавлено через 29 секунд
0
|
||||||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||
| 16.01.2017, 14:12 | ||||
|
Добавлено через 24 секунды Добавлено через 2 минуты Но там говорилось про другое. Чисто виртуальная функция - эта не просто функция, которая не имеет реализацию (как некоторые ошибочно полагают).
1
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 16.01.2017, 14:13 [ТС] | |||
|
MrGluck,
Спасибо что объяснили. ![]() Добавлено через 33 секунды ![]() Добавлено через 37 секунд Так а кода все таки меньше генерируется если использовать delete?
0
|
|||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||||||
| 16.01.2017, 14:20 | |||||||
|
Касаемо ситуации с виртуальным деструктором (на всякий случай хочу разъяснить).
Добавлено через 1 минуту
1
|
|||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 16.01.2017, 14:25 [ТС] | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 16.01.2017, 14:26 | |||
|
виртуальные функции пишутся виртуальными именно в расчете на то, что наследники будут. исходного кода будет ровно столько, сколько вы сами его напишите.
0
|
|||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||
| 16.01.2017, 14:27 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 16.01.2017, 14:30 [ТС] | |||
|
Читал в разных местах что компилятор может выбрасывать то что не нужно Вот и подумал если реализация по умолчанию объявляется delete То выбросит ли компилятор (или просто не сгенерирует) код который генерировал по умолчанию? Добавлено через 2 минуты Память освежаю
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 16.01.2017, 14:31 | |
|
1
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 16.01.2017, 14:56 [ТС] | |
|
MrGluck, hoggy,
Подскажите пожауйлста, где можно посмотреть какие методы компилятор генерирует автоматически и их сигнатуры что бы смотреть на список и исключать то что не нужно c помощью delete? Например для классов которые содержат только простые типы насколько понимаю не нужен конструктор перемещения и хотелось бы не полагаться на то что "компилятор может понять что не нужно его генерировать или не понять" а явно удалить так же и остальными автоматически генерируемыми методами и так понятнее будет выглядеть код
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 16.01.2017, 15:02 | |||
|
все остальное - проблемы компилятора.
1
|
|||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||||
| 16.01.2017, 15:12 | ||||||||
Сообщение было отмечено Undisputed как решение
Решение12 Special member functions Есть, например, правило трёх (начиная с С++11 некоторые ещё определяют правило пяти, с версиями rvalue): Если в классе идёт работа с динамической памятью, в нём необходимо явно определить конструктор копий, оператор присваиваний и деструктор. Для того, чтобы понять нужно ли описывать специальные методы класса явно или хватит реализации по умолчанию, необходимо хорошо понять как устроена реализация по умолчанию. Это и принципы генерации (при каком условии что генерируется, а что нет), указано в стандарте. Добавлено через 7 минут Выдержка из стандарта насчёт генерации специальных методов класса Конструктор по умолчанию:
2
|
||||||||
| 16.01.2017, 15:12 | |
|
Помогаю со студенческими работами здесь
20
Что такое комплекты инициализации и зачем они нужны?
Что такое атрибуты (dir) и зачем они нужны ? Что такое hash-таблицы, и зачем они нужны? Что такое указатели? Зачем они нужны и их практичное применение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|