Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236

Параметры по-умолчанию в виртуальных функциях

15.11.2016, 20:37. Показов 3630. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, это ведь UB ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
class Base {
    int a;
 
public:
    Base() : a(1) {}
    explicit Base(const int aa) : a(aa) {}
 
    virtual void foo(int a = 42) {
        int c = a;
        std::cout << c << "\n";
    }
 
};
 
class Derived : public Base {
    int b;
 
public:
    Derived() : b(2) {}
    explicit Derived(const int bb) : b(bb) {}
 
    void foo(int b = 666) override {
        int c = b;
        std::cout << c << "\n";
    }
 
};
 
int main () {
    Base *derived = new Derived;
    derived->foo();
    return EXIT_SUCCESS;
}

Я понимаю, что при пустом foo() сработал бы вариант из Derived, но вот с добавлением значений по умолчанию хз.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2016, 20:37
Ответы с готовыми решениями:

О виртуальных функциях
Читаю у Страуструпа 3 издание по с++ 12.2.6. Виртуальные функции и не много не догоняю что он имеет ввиду процитирую: &quot;Для того...

Значение по умолчанию в функциях
Пишу int __fastcall TFMain::Tets(int x=2) { return x; } Компилятор выдает: Default argument value redeclared for parameter 'x'...

Значения по умолчанию в функциях С++
Возникла проблема на пустом месте, а именно с параметрами по умолчанию, чтобы не передавать в функцию &quot;лишнии&quot; значения. Имеем...

42
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
16.11.2016, 02:26  [ТС]
Студворк — интернет-сервис помощи студентам
Мне бы так не уметь)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.11.2016, 02:29
Цитата Сообщение от Croessmah Посмотреть сообщение
Надеюсь, тебе стало чуть понятнее.
Извини, но объяснять - это не моё.
Нормально объясняешь.
Я удивлен этой "дыркой" с параметрами по умолчанию.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.11.2016, 02:37
IGPIGP, нет ничего идеального, ну, кроме Brainfuck, конечно.

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Нормально объясняешь.
Ты это осилил? Я сомневаюсь, что сам бы понял эту писанину. :D



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Kant Посмотреть сообщение
Мне бы так не уметь
Зачем не уметь? =-O

1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.11.2016, 02:40
Цитата Сообщение от Croessmah Посмотреть сообщение
Конечно, можно было организовать и позднее связывание параметров,
но для этого пришлось бы городить еще один огород с таблицами.
В том-то и дело, что я до сих пор не понимаю аргумента по умолчанию, выходит. Понимаешь, я считал, что если где-то пишу void foo(int a=123){...}, то это синтаксический сахар сокращающий запись, за которым скрывается генерирование кода такого, как будто я написал две функции: void foo(){int a=123; ...} и void foo(int a){...}
Если бы это было бы так, то виртуальных функций было бы по две в любом случае и не было бы проблемы, но это не так. Еще одна ловушка.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.11.2016, 02:50
Цитата Сообщение от IGPIGP Посмотреть сообщение
то это синтаксический сахар сокращающий запись
Но сокращает он не код генерации функций,
а код вызова этих функций.
Цитата Сообщение от IGPIGP Посмотреть сообщение
за которым скрывается генерирование кода такого, как будто я написал две функции
Нет, нет, нет. Функция будет одна.
Это лишь влияет на возможность
вызова без указания этого параметра,
т.е. чтобы компилятор в месте
вызова поставил значение автоматически.
Если бы генерировались разные реализации,
то, например, было бы валидным и такое:
C++
1
2
3
4
5
6
7
void foo(int x, SomeType y = SomeType(), int z);//параметр по-умолчанию не последний.
//было бы сгенерировано две функции:
void foo(int x, int z);
//и
void foo(int x, SomeType y, int z);
 
foo(10, 10);
Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Еще одна ловушка.
Это не есть ловушка в этом смысле.
Просто у тебя неправильное мнение
было о параметрах по-умолчанию.
Зная как они работают (концептуально),
проблем не должно было бы возникнуть.
Надеюсь, что помог немного разобраться.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.11.2016, 02:57
Цитата Сообщение от Croessmah Посмотреть сообщение
Это лишь влияет на возможность
вызова без указания этого параметра,
т.е. чтобы компилятор в месте
Жаль. Не единообразие логики это всё-таки плата. И за что? За экономию памяти на коде реализации метода?
Теряется возможность сделать
Цитата Сообщение от Croessmah Посмотреть сообщение
валидным и такое
.
Но всё-таки профит виден. Это не дань лени, - а возможность сэкономить память. Для очень больших функций с большим количеством параметров по умолчанию, экономия может быть ощутима. На каких-нибудь системах это может оказаться важным, наверное.
Цитата Сообщение от Croessmah Посмотреть сообщение
Надеюсь, что помог немного разобраться.
Спасибо!
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
16.11.2016, 10:09
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
После компиляции нету уже понятия тип и
только адрес и операции.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
при работе с вирт методами будет механизм позднего связывания
Т.е. думаете, что врут в стандарте про динамические типы?
А позднее связывание не на типах разве основано?

Добавлено через 9 минут
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
P.S. Пишу как hoggy, спорю со всеми как hoggy,
вот бы еще знаний и опыта как у него)
Ну, данного товарища частенько заносит во всех смыслах, так что не стоит ему в этом подражать.
Как говорил Исаак Сирин, награда дается не за добродетели, которые стяжает человек, а за смирение, которое приобретается в этих добродетелях.
0
16.11.2016, 14:14

Не по теме:

Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, данного товарища частенько заносит во всех смыслах, так что не стоит ему в этом подражать.
Разве не это самое порождает интересную дискуссию на разные темы с++, что полезно почитать начинающим программистам в том числе мне?

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.11.2016, 14:19
Цитата Сообщение от IGPIGP Посмотреть сообщение
Получается, что параметр по умолчанию, это грабли для ленивых?
да.
в некоторых компаниях запрещено использовать параметры по умолчанию для виртуальных функций-членов.
потому что многие балбесы ребята стреляли в голову.
1
16.11.2016, 14:28

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
в некоторых компаниях запрещено использовать параметры по умолчанию для виртуальных функций-членов.
Я спалил длинную строчку у hoggy. :D

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
16.11.2016, 14:35
Цитата Сообщение от hoggy Посмотреть сообщение
в некоторых компаниях запрещено использовать параметры по умолчанию для виртуальных функций-членов.
Как я писал уже выше, дам мороженое за must-have пример использования параметра
по умолчанию вопреки перегрузке и делигирования. Нужно в целом в компаниях
запрещать параметр по умолчанию).
0
16.11.2016, 14:40

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Разве не это самое порождает интересную дискуссию на разные темы с++, что полезно почитать начинающим программистам в том числе мне?
Ну, у меня, например, врожденная грамотность, а для таких людей читать безграмотную писанину - это пытка.
К тому же у меня аллергия на людей, не умеющих культурно себя вести, таковые у меня токмо в игноре обретаются.
Так что лучше учите грамотешку и оттачивайте навыки культуры общения, авось за воспитанного и образованного сойдете, чего ж на маргиналов всяких ориентироваться.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.11.2016, 16:30
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Как я писал уже выше, дам мороженое за must-have пример использования параметра
по умолчанию
таких примеров не существует
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.11.2016, 16:32
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Как я писал уже выше, дам мороженое
Угу. От Вас дождёшься! - Держи карман с кульком для мороженного шире.
hoggy, же пишет, что для виртуальных функций. И добавляет - членов, чтобы не перепутать.
Вспомнился рецепт живительной настойки от древних викингов ( их "не древних" не бывает как и виртуальных "не членов", но так принято))
:
В чистую эмалированную посуду, влейте 0,5 л водки,
В неё тонкой струйкой и бережно, влейте ещё 0, 25 л водки и тщательно перемешайте.
Вставьте соломинку из молодого камыша. Край миски украсьте сочным мухомором.

rikimaru2013, если какой-то контроллер со слабеньким камушком и памятью загрузить софтом в котором куча больших функций и вместо параметров по умолчанию реализовать явные перегрузки, то придётся не только памяти докупить. Камень с большей разрядностью по шине может понадобиться. То есть:
1. Гнобление параметра по умолчанию, - ущемление естественных свобод всего живого!
2. Де марожено?!
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.11.2016, 16:36
Цитата Сообщение от Mr.X Посмотреть сообщение
А позднее связывание не на типах разве основано?
нет, не на типах ))
на адресах.

к сожалению не нашел оригинальную статью:
http://blog.fandim.ru/2013/05/blog-post.html
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
16.11.2016, 16:36
IGPIGP, вас послушать и уже представляю тему на хабре "Ограничиваем количество методов/функций в программе" или "Объединяем маленькие методы в один большой - экономьте память"
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.11.2016, 16:41
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
IGPIGP, вас послушать и уже представляю тему на хабре "Ограничиваем количество методов/функций в программе" или "Объединяем маленькие методы в один большой - экономьте память"
У Вас середины нет ни в чём. То есть, кроме как в обещанном мороженном, умеренность везде отсутствует как таковая. Вам или запретить или - даешь, но везде и сразу.
Видели сколько инструментов у хирурга? Хотя иногда он пользуется и пилой и молотком с зубилом.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.11.2016, 16:44
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Объединяем маленькие методы в один большой - экономьте память
Особенно когда видишь ошибку, что памяти не хватило при заливке программы в микруху.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.11.2016, 16:50
Цитата Сообщение от Croessmah Посмотреть сообщение
Особенно когда видишь ошибку, что памяти не хватило при заливке программы в микруху.
Да! По пол кило. Пломбира. Ка-ждо-му.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
16.11.2016, 16:56
Цитата Сообщение от IGPIGP Посмотреть сообщение
У Вас середины нет ни в чём.
Это вы так сказали)) Я вижу за всю программу - ну до 30 вариантов с применением перегрузки. И меня всё устраивает. А вы уверяете что это плохо впадая в крайности, что я сжираю 1ГБ памяти на устройстве. Кто с нас еще впадает в крайности)) Мороженое пришлю курьером, в одном же городе живём, вот только его сперва надо заслужить, я так и не увидел аргумента must-have!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2016, 16:56
Помогаю со студенческими работами здесь

Формальные и фактические параметры в процедурах и функциях
Здравствуйте, я сейчас, наверное, задам один из глупых вопросов, но я никак не могу понять. У меня в скором времени экзамен по...

Как в JavaScript передаются параметры в функциях? По ссылке или по значению.
Как в JavaScript передаются параметры в функциях? По ссылке или по значению. И каков синтаксис в каждом из случаев. Сам ответ не...

Параметры функции: параметры по умолчанию
помогите пожалуйста понять. void foo(int a, int b, int c=1){std::cout &lt;&lt; a &lt;&lt; &quot;\t&quot; &lt;&lt; b &lt;&lt; &quot;\t&quot; &lt;&lt; c &lt;&lt; '\t';} int main(){ ...

Параметры по умолчанию в С.
Всем привет! Захотел воспользоватся параметрами по умолчанию в си-шном проекте. И получил следующие ошибки: Действительно данный...

Параметры по умолчанию в функции
Всем привет. Есть такой класс: template &lt;typename T&gt; class MyClass { public: MyClass(T *_beg, T *_en):beg(_beg),en(_en) {} ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru