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

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

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

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

Более того, этиответы не зависят от платформы и соответствуют стандарту. Это книга о переносимом С++.Разделы книги представляют собой рекомендации, а не жесткие правила, посколькурекомендации имеют исключения. Наиболее важной частью каждого раздела являетсяне предлагаемая в нем рекомендация, а ее обоснование. Прочитав раздел, вы сможетесами определить, оправдывают ли обстоятельства вашего конкретного проекта отходот данной рекомендации. Истинная цель книги не в том, чтобы рассказать вам, как надопоступать или как поступать не надо, а в том, чтобы обеспечить вас более глубоким по­ниманием, как та или иная концепция работает в С++ 1 1 и С++ 1 4.Терминоnо r ия и соrnашенияЧтобы мы правильно понимали друг друга, важно согласовать используемую терми­нологию, начиная, как ни странно это звучит, с термина "С++".

Есть четыре официаль­ные версии С++, и каждая именуется с использованием года принятия соответствующегостандарта ISO: С++98, С++ОЗ, C++l 1 и С++14. С+ +98 и С++ОЗ отличаются один от друго­го только техническими деталями, так что в этой книге обе версии я называю как С++98.Говоря о С++ 1 1 , я подразумеваю и С++ 1 1 , и С++ 1 4, поскольку С++ 14 является надмно­жеством С++ 1 1 . Когда я пишу "С++ 1 4': я имею в виду конкретно С++ 14. А если я простоупоминаю С++, я делаю утверждение, которое относится ко всем версиям языка.Использованный терминПодразумеваемая версия(++Все(++98с++98ис++03(++11(++11и(++14(++14(++14В результате я мог бы сказать, что в С++ придается большое значение эффективности(справедливо для всех версий), в С++98 отсутствует поддержка параллелизма (справед­ливо только для С++98 и С++ОЗ), С++ 1 1 поддерживает лямбда-выражения (справедливодля C++l l и С++14) и С++14 предлагает обобщен ный вывод возвращаемого типа функ­ции (справедливо только для С++ 1 4).Наиболее важной особенностью С++ 1 1 , вероятно, является семантика перемещения,а основой семантики перемещения является отличие rvа/ие-выражени й от /vа/uе-выра­жений.

Поэтому rvalue указывают объекты, которые могут быть перемещены, в то времякак lvalue в общем случае перемещены быть не могут. Концептуально (хотя и не всегдана практике), rvalue соответствуют временным объектам, возвращаемым из функций,в то время как lvalue соответствуют объектам, на которые вы можете ссылаться по име­ни, следуя указателю или lvalue-ccылкe.Полезной эвристикой для выяснения, является ли выражение lvalue, является ответна вопрос, можно ли получить его адрес.

Если можно, то обычно это lvalue. Если нет, этообычно rvalue. Приятной особенностью этой эвристики является то, что она помогаетпомнить, что тип выражения не зависит от того, является ли оно lvalue или rvalue. Иначеговоря, для данного типа Т можно иметь как lvalue типа Т, так и rvalue типа Т.

Особенноважно помнить это, когда мы имеем дело с параметром rvalue ссылочного типа, посколь­ку сам по себе параметр является lvalue:class Widget {puЫ i c :Widget (Widqet&& rhs); // rhs является lvalue, хотя/ / и имеет ссьu�очный тип rvalue};16ВведениеЗдесь совершенно корректным является взятие адреса rhs в перемещающем конструкто­ре Widget, так что rhs представляет собой lvalue, несмотря на то что его тип - ссылкаrvalue. (По сходным причинам все параметры являются lvalue.)Этот фрагмент кода демонстрирует несколько соглашений, которым я обычно следую.•Имя класса - Widget.

Я использую слово Widget, когда хочу сослаться на произ­вольный пользовательский тип. Если только мне не надо показать конкретные дета­ли класса, я использую имя Widget, не объявляя его.•Я использую имя параметра rhs ("right-hand side'; правая сторона). Это предпочи­таемое мною имя параметра для операций перемещения (например, перемещающегоконструктора и оператора перемещающего присваивания) и операций копирования(например, копирующего конструктора и оператора копирующего присваивания). Ятакже использую его в качестве правого параметра бинарных операторов:Matrix operator+ ( const Matrix& lhs , const Matrix& rhз);Я надеюсь, для вас не станет сюрпризом, что lhs означает "left-hand side" (леваясторона).•использую специальное форматирование для частей кода или частей комментари­ев, чтобы привлечь к ним ваше внимание.

В перемещающем конструкторе Widgetвыше я подчеркнул объявление rhs и часть комментария, указывающего, что rhsпредставляет собой lvalue. Выделенный код сам по себе не является ни плохим, нихорошим. Это просто код, на который вы должны обратить внимание.•Я использую ".. . '; чтобы указать "здесь находится прочий код': Такое "узкое" трое­точие отличается от широкого ... ·; используемого в исходных текстах шаблоновс переменным количеством параметров в С++ 1 1 . Это кажется запутанным, но на са­мом деле это не так. Вот пример.Я"template<t ypename .

. . Ts>void processVal s ( const Ts& . . . params )1111111111Эти троеточияв исходномтексте С++Это троеточие означае т как ой -то кодОбъявление processVals показывает, что я использую ключевое слово typenameпри объявлении параметров типов в шаблонах, но это просто мое л ичноепредпочтение; вместо него можно использовать ключевое слово class. В техслучаях, когда я показываю код, взятый из стандарта С++, я объявляю параметрытипа с использованием ключевого слова class, поскольку так делает стандарт.Когда объект инициализирован другим объектом того же типа, новый объект яв­ляется копией инициализирующего объекта, даже если копия создается с помощью пе­ремещающего конструктора. К сожалению, в С++ нет никакой терминологии, котораяпозволяла бы различать объекты, созданные с помощью копирующих и перемещающихконструкторов:Введение17void someFunc ( Widget w) ;/ / Параметр w функции someFunc11 передается по значениюWidget wid;11 wid - объект класса WidgetsomeFunc ( wid) ;11 В этом вызове someFunc w/ / является копией wid , созданной/ / копирующим конструкторомsomeFunc ( st d : : move ( wid) ) ; / / В этом вызове SomeFunc w/ / является копией wid, созданной/ / перемещающим конструкторомКопии rvalue в общем случае конструируются перемещением, в то время как копииlvalue обычно конструируются копированием.

Следствием является то, что если вы зна­ете только то, что объект является копией друrого объекта, то невозможно сказать, на­сколько дорогостоящим является создание копии. В приведенном выше коде, например,нет возможности сказать, насколько дорогостоящим является создание параметра w, беззнания того, какое значение передано функции someFuncrvalue или lvalue.

(Вы такжедолжны знать стоимости перемещения и копирования Widget.)В вызове функции выражения, переданные в источнике вызова, являются аргумен­тами функции. Эти аргументы используются для инициализации параметров функции.В первом вызове someFunc, показанном выше, аргументом является wid. Во втором вы­зове аргументом является std ::move ( w i d) . В обоих вызовах параметром является w.Разница между аргументами и параметрами важна, поскольку параметры являются lvalue,но аргументы, которыми они инициализируются, могут быть как rvalue, так и lvalue.

Этоособенно актуально во время прямой передачи, при которой аргумент, переданный функ­ции, передается другой функции так, что при этом сохраняется его "правосторонность"или "левосторонность". (Прямая передача подробно рассматривается в разделе 5.8.)Хорошо спроектированные функции безопасны с тачки зрения исключений, что озна­чает, что они обеспечивают как минимум базовую гарантию, т.е. гарантируют, что, дажеесли будет сгенерировано исключение, инварианты программы останутся нетронутыми(т.е. не будут повреждены структуры данных) и не будет никаких утечек ресурсов. Функ­ции, обеспечивающие строгую гарантию, гарантируют, что, даже если будет сгенериро­вано исключение, состояние программы останется тем же, что и до вызова функции.Говоря о функциональном объекте, я обычно имею в виду объект типа, поддержи­вающего функцию-член operator ().

Другими словами, это объект, действующий, какфункция. Иногда я использую термин в несколько более общем смысле для обозначениячего уrодно, что может быть вызвано с использованием синтаксиса вызова функции, неявляющейся членом (т.е. function Name (arguments) ). Это более широкое определе­ние охватывает не только объекты, поддерживающие operator (), но и функции и ука­затели на функции в стиле С.

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

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

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

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