Главная » Просмотр файлов » С. Мейерс - Эффективный и современный C++

С. Мейерс - Эффективный и современный C++ (1114942), страница 18

Файл №1114942 С. Мейерс - Эффективный и современный C++ (С. Мейерс - Эффективный и современный C++) 18 страницаС. Мейерс - Эффективный и современный C++ (1114942) страница 182019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 18)

Предпочитайте перечиспения с обnастью видимости перечисnениям без таковой81перечисления без области видимости, а именно - при обращении к полям в кортежахC++ l l s t d : : tupl e . Предположим, например, что у нас есть кортеж, содержащий имя,адрес электронной почты и значение репутации пользователя на сайте социальной сети:using Userinfo =std : : tuple<std : : string,std : : s tring,std: : s ize t>//111111Псевдоним типа ; см.

раздел 3 . 3ИмяАдресРепутацияХотя комментарии указывают, что представляет собой каждое поле кортежа, это,вероятно, не слишком полезно, когда вы сталкиваетесь с кодом наподобие следующегов отдельном исходном файле:Userinfo uinfo ;auto val=/ / Объект с типом кортежаstd : : get<l> ( uinfo ) ; / / Получение значения поля 1Как программисту вам приходится отслеживать множество вещей. Вы действительнодолжны помнить, что поле 1 соответствует адресу электронной почты пользователя? Ядумаю, нет.

Использование e nurn без области видимости для сопоставления имен полейс их номерами позволяет избежать необходимости перегружать память:enumUserinfoFields { uiName , uiEmail , ui.Reputation } ;1 1 Как и ранееUserinfo uinfo;auto val=std : : get<uiEmail> (uinfo ) ; / / Значение адресаВсе было бы гораздо сложнее без неявного преобразования значений из Userin foFie ldsв тип st d : : s i ze_t , который является типом, требующимся для s t d : : get.Соответствующий код с применением перечисления с областью видимости сущес­твенно многословнее:enum class UserinfoFields { uiName , uiEma i l , uiReputation } ;Userinfo uinfo ;11 Как и ранееauto valstd: : get<static_cast<std: : size_t> (UserinfoFields : : uiEmail) >(uinfo ) ;Эта многословность может быть сокращена с помощью функции, которая принимаетперечислитель и возвращает соответствующее значение типа s t d : : s i ze_t , но это немно­го сложнее.

s t d : : g e t является шаблоном, так что предоставляемое значение являетсяаргументом шаблона (обратите внимание на применение не круглых, а угловых скобок),так что функция, преобразующая перечислитель в значение s t d : : s i ze_t, должна даватьрезультат во время компиляции. Как поясняется в разделе 3.9, это означает, что нам нуж­на функция, являющаяся constexpr.82Глава 3.

Переход к современному С++Фактически это должен быть соnstехрr-шаблон функции, поскольку он должен рабо­тать с любыми перечислениями. И если мы собираемся делать такое обобщение, то долж­ны обобщить также и возвращаемый тип. Вместо того чтобы возвращать s t d : : s i ze_t,мы должны возвращать базовый тип перечисления. Он доступен с помощью свойстватипа s t d : : unde r l yi ng _ t ype (о свойствах типов рассказывается в разделе 3.3). Наконецмы объявим его как noexcept (см. раздел 3.8), поскольку мы знаем, что он н икогда негенерирует исключений. В результате мы получим шаблон функции t oUType, которыйполучает произвольный перечислитель и может возвращать значение как константу вре­мени компиляции:template<typename Е>constexpr typename std : : underlying_type<E> : : typetoUType ( E enumerator) noexceptreturnstat ic_cast<typenamestd: : underlying_type<E> : : type> ( enumerator) ;В С++ 14 t oUType можно упростить заменой t ypename s t d : : unde r l y ing t ype<E> : : t ypeболее изящным s t d : : unde r l ying_t ype_t (см.

раздел 3.3):template<typename Е>constexpr std : : underlying_type t<E>toUType ( E enumerator) noexcept// С++14return static_cast<std : : underlying_type t<E>> ( enumerato r ) ;Еще более изящный возвращаемый тип auto (см. раздел 1 .3) также корректен в С++ 14:template<typename Е> // С++ 1 4constexpr autotoUType ( E enumerator) noexceptreturn static_cast<std : : underlying_type_t<E>> ( enumerator ) ;Независимо от того, как он написан, шаблон t oUType позволяет нам обратиться к полюкортежа следующим образом:auto val=std: : get<toUТype (UserinfoFielcls : : uiEшail) > (uinfo ) ;Это все же больше, чем достаточно написать при использовании перечисления без об­ласти видимости, но зато позволяет избежать загрязнения пространства имен и непред­намеренных преобразований перечислителей.

Во многих случаях вы можете решить, чтонабор нескольких дополнительных символов является разумной ценой за возможность из­бежать ловушек перечислений, появление которых восходит ко времени, когда вершинойдостижений в цифровых телекоммуникациях был модем со скоростью 2400 бод.3.4. Предпочи тайте перечисления с облас т ью видимости перечислениям без таковой83Следует запомнить•Перечисления в стиле С++98 в настоящее время известны как перечисления безобластей В ИДИ МОСТИ.•Перечислители перечислений с областями видимости видимы только внутри пере­числений. Они преобразуются в другие типы только с помощью явных приведений.•Как перечисления с областями видимости, так и без таковых поддерживают ука­зание базового типа. Базовым типом по умолчанию для перечисления с областьювидимости является i nt . Перечисление без области видимости базового типапо умолчанию не имеет.•Перечисления с областями видимости могут быть предварительно объявлены.

Пе­речисления без областей видимости могут быть предварительно объявлены, толь­ко если их объявление указывает базовый тип.3 . 5 . П редпо ч итайте удапенные функциизакрытым неопредепеннымЕсли вы предоставляете код другим разработчикам и хотите предотвратить вызовими некоторой функции, обычно вы просто ее не объявляете. Нет объявления функ­ции - нечего и вызывать. Но иногда С++ объявляет функции вместо вас, и если вы хо­тите предотвратить вызов таких функций клиентами вашего кода, придется постараться.Эта ситуация возникает только для "специальных функций-членов", т.е. функций­членов, которые при необходимости С++ генерирует автоматически.

В разделе 3. 1 1 этифункции рассматриваются более подробно, а пока что мы будем беспокоиться толькоо копирующем конструкторе и копирующем операторе присваивания. Эта глава во мно­гом посвящена распространенным практикам С++98, для которых есть более эффектив­ная замена в С++ 1 1 , а в С++98, когда вы хотите подавить применение функции-члена,это почти всегда копирующий конструктор, оператор присваивания или они оба.Подход С++98 для предотвращения применения этих функций состоит в объявленииих как private без предоставления определений.

Например, вблизи с основанием иерар­хии потоков ввода-вывода в стандартной библиотеке С++ находится шаблонный классba s i c_ios. Все классы потоков наследуют (возможно, косвенно) этот класс. Копированиепотоков ввода-вывода нежелательно, поскольку не совсем очевидно, что же должна де­лать такая операция. Объект i s t r earn, например, представляет поток входных значений,одни из которых могут уже быть считаны, а другие могут потенциально быть считаныпозже. Если копировать такой поток, то должно ли это повлечь копирование всех счи­танных значений, а также значений, которые будут считаны в будущем� Простейшийспособ разобраться в таких вопросах - объявить их несуществующими.

Именно это де­лает запрет на копирование потоков.Чтобы сделать классы потоков некопируемыми, bas i c_ios в С++98 объявлен следую­щим образом (включая комментарии):84Гnава З . Переход к современному Ctttemplate <class charT, class traitsclass bas ic ios : puЬlic ios basepuЬlic :char traits<charT> >private :/ / Не определенbasic ios ( const basic_ios& ) ;basic ios& operator= ( const basic_ios & ) ; / / Не определен};Объявление этих функций как pri vate предотвращает их вызов клиентами. Умыш­ленное отсутствие их определений означает, что если код, все еще имеющий к ним до­ступ (т.е. функции-члены или друзья класса), ими воспользуется, то компоновка (редак­тирование связей) будет неудачной из-за отсутствия определений функций.В С++ 1 1 имеется лучший способ достичь по сути того же самого: воспользоватьсяконструкцией "= delete': чтобы пометить копирующий конструктор и копирующее при­сваивание как удаленные функции.

Вот та же часть b a s i c ios в С++ 1 1 :_template <class charT, class traitsclass basic ios : puЫic ios basepuЫic :char traits<charT> >basic ios ( const bas ic_ios & ) = delete ;basic ios& operator= ( const basic ios & )delete ;};Отличие удаления этих функций от их объявления как pri vate может показаться большевопросом вкуса, чем чем-то иным, но на самом деле в это заложено больше, чем вы думаете.Удаленные функции не могут использоваться н икоим образом, так что даже код функции­члена или функций, объявленных как friend, не будет компилироваться, если попытаетсякопировать объекты b a s i c_ ios. Это существенное улучшение по сравнению с поведениемС++98, где такое некорректное применение функций не диагностируется до компоновки.По соглашению удаленные функции объявляются как puЫic, а не private. Тому естьпричина.

Характеристики

Тип файла
PDF-файл
Размер
12,67 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6418
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее