| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Пара непонятных примеров кода |
| Автор: wowka19 29.4.2014, 02:32 | ||||
Один из Qt:
В чем смысл строчки "enum { Type = 2 };" ? почему бы не сразу вернуть 2? Для чего локальный, никому неизвестный (внешне), безымянный, enum, да еще из одного элемента? Второй:
Встречал подобный код не раз. Разве в императивном C++ так можно? Разве p->ok() не выполнится в любом случае, независимо от p == 0 ? ошибка же? или нет? |
| Автор: BlackSpace 29.4.2014, 03:58 | ||||
| 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. |
| Автор: wowka19 29.4.2014, 05:06 |
| Спасибо. Кароч странный enum - для совместимости с древними компиляторами. А условия в if() вычисляются пока есть смысл это делать (до достижения определенности). Кстати - это стандартом определено? |
| Автор: BlackSpace 29.4.2014, 06:07 |
| wowka19, enum - ничего не странный, а обычный Логический оператор AND работает действительно так - вычисляются выражения пока есть смысл в этом. Если в моем примере выражение1 вернет false, то выражение2 вычислять не имеет смысла уже. Приведу ссылку на http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf Здесь внизу 101 страницы можно прочитать о логическом операторе AND. Также приведу ссылку на более свежий http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf. Здесь логический оператор AND описан на страницах 121-122. |
| Автор: wowka19 29.4.2014, 06:57 | ||
странным я его называю, потому что он безымянный:
Просто как-то нелепо выглядит - создается впечатление, что конструкция enum используется не по назначению. Что мешает использовать int Type ? |
| Автор: BlackSpace 29.4.2014, 07:14 |
| wowka19, а int Type будет общим для всех объектов класса и будет возможность обращаться к нему не создавая ни одного объекта класса? |
| Автор: wowka19 29.4.2014, 07:19 |
| понятно. тогда получается "безымянный" enum - автоматом становится типом int ? |
| Автор: BlackSpace 29.4.2014, 07:36 |
| wowka19, в enum есть перечеслители. Им при инициализации либо значение по умолчанию определяется, либо разработчик может сам задать. Используемое для инициализации перечеслителя выражение должно быть константным выражением. Константное выражение - это выражение, в результате вычисления которого компилятором во время компиляции получается значение целочисленного типа. Значение перечислителя изменить нельзя. Как следствие, сам перечислитель является константным выражением и может применяться везде, где необходимо константное выражение. |
| Автор: NoviceF 29.4.2014, 09:27 | ||||
Есть нюанс, не знаю как сейчас реализовано, но в книжках начала двухтысячных упоминается (по-моему это было в "Шаблоны C++"), что только перечисления являются "истиными" константами, т.к. под
компилятор может выделить место в памяти, т.к. у этой константы можно взять адрес, в то время как у
взять адрес нельзя. Этот факт используется где-то в шаблонах, более точную аргументацию, к сожалению, не помню и что-то быстро она не гуглится |
| Автор: azesmcar 29.4.2014, 10:32 | ||
| wowka19, самое обыкновенное обявление константы. А enum делает ее константой времени компиляции. Можно использовать для специализаций в шаблонах. В новом стандарте C++ добавили constexpr, но до него использовался вот такой метод.
Нет. Он начнет выполняться в любом случае, если перегрузить оператор && (потому кстати это не рекомендуется), а так у него своя специфика работы. |
| Автор: baldina 29.4.2014, 14:17 |
ну он как-бы public, так что возможно: QGraphicsPathItem::Type |