|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Что означают ключевые слова default, delete и зачем они нужны16.01.2017, 13:51. Показов 43909. Ответов 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-таблицы, и зачем они нужны? Что такое указатели? Зачем они нужны и их практичное применение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|