![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
wowka19 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Один из Qt:
В чем смысл строчки "enum { Type = 2 };" ? почему бы не сразу вернуть 2? Для чего локальный, никому неизвестный (внешне), безымянный, enum, да еще из одного элемента? Второй:
Встречал подобный код не раз. Разве в императивном C++ так можно? Разве p->ok() не выполнится в любом случае, независимо от p == 0 ? ошибка же? или нет? Это сообщение отредактировал(а) wowka19 - 29.4.2014, 02:34 |
||||
|
|||||
BlackSpace |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.4.2014 Репутация: 1 Всего: 1 |
wowka19, про enum это весело, я тоже как-то в недоумении был
![]() в Книге Лафоре Роберта Объектно-ориентированное программирование в C++ 4-е издание 2004 года я встречал пояснение про такое использование enum. В главе 7 Массивы и строки есть раздел Массивы как члены классов. В данном разделе есть пример класса stack, где и используется в таком виде enum, после чего идет пояснение такого использования. На самом деле таким образом внутри класса определяется просто константа, общая для всех объектов класса. Это обходной путь чтобы не использовать static const nameType nameField = value. Просто не так давно ( лет 10-15 назад, судя по году издания книги ) по утверждениям того же Лафоре Роберта, не все компиляторы поддерживали конструкцию static const nameType nameField = value. Приведу простой пример.
Ну а что касается логического оператора &&, то в следующей ситуации выражение1 && выражение2 выражение2 вычисляется только в случае, когда выражение1 вернет истину. Вот простой пример.
Тут OK выводится один раз, когда проверяется условие с участием ptr2. Это сообщение отредактировал(а) BlackSpace - 29.4.2014, 04:05 |
||||
|
|||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Спасибо.
Кароч странный enum - для совместимости с древними компиляторами. А условия в if() вычисляются пока есть смысл это делать (до достижения определенности). Кстати - это стандартом определено? Это сообщение отредактировал(а) wowka19 - 29.4.2014, 05:06 |
|||
|
||||
k0rvin |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 24.1.2010 Репутация: нет Всего: 5 |
Да:
Это сообщение отредактировал(а) k0rvin - 29.4.2014, 05:49 -------------------- “Object-oriented design is the roman numerals of computing.” — Rob Pike All software sucks |
||||
|
|||||
BlackSpace |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.4.2014 Репутация: 1 Всего: 1 |
wowka19, enum - ничего не странный, а обычный
![]() Логический оператор AND работает действительно так - вычисляются выражения пока есть смысл в этом. Если в моем примере выражение1 вернет false, то выражение2 вычислять не имеет смысла уже. Приведу ссылку на Черновик стандарта C++ документ 2005 года Здесь внизу 101 страницы можно прочитать о логическом операторе AND. Также приведу ссылку на более свежий Черновик стандарта C++, документ 2013 года. Здесь логический оператор AND описан на страницах 121-122. |
|||
|
||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
странным я его называю, потому что он безымянный:
Просто как-то нелепо выглядит - создается впечатление, что конструкция enum используется не по назначению. Что мешает использовать int Type ? |
|||
|
||||
BlackSpace |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.4.2014 Репутация: 1 Всего: 1 |
wowka19, а int Type будет общим для всех объектов класса и будет возможность обращаться к нему не создавая ни одного объекта класса?
|
|||
|
||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
понятно.
тогда получается "безымянный" enum - автоматом становится типом int ? |
|||
|
||||
BlackSpace |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.4.2014 Репутация: 1 Всего: 1 |
wowka19, в enum есть перечеслители. Им при инициализации либо значение по умолчанию определяется, либо разработчик может сам задать.
Используемое для инициализации перечеслителя выражение должно быть константным выражением. Константное выражение - это выражение, в результате вычисления которого компилятором во время компиляции получается значение целочисленного типа. Значение перечислителя изменить нельзя. Как следствие, сам перечислитель является константным выражением и может применяться везде, где необходимо константное выражение. |
|||
|
||||
NoviceF |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: 2 Всего: 2 |
Есть нюанс, не знаю как сейчас реализовано, но в книжках начала двухтысячных упоминается (по-моему это было в "Шаблоны C++"), что только перечисления являются "истиными" константами, т.к. под
компилятор может выделить место в памяти, т.к. у этой константы можно взять адрес, в то время как у
взять адрес нельзя. Этот факт используется где-то в шаблонах, более точную аргументацию, к сожалению, не помню и что-то быстро она не гуглится ![]() |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
wowka19, самое обыкновенное обявление константы. А enum делает ее константой времени компиляции. Можно использовать для специализаций в шаблонах.
В новом стандарте C++ добавили constexpr, но до него использовался вот такой метод.
Нет. Он начнет выполняться в любом случае, если перегрузить оператор && (потому кстати это не рекомендуется), а так у него своя специфика работы. Это сообщение отредактировал(а) azesmcar - 29.4.2014, 10:34 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |