Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14

Здесь есть возможность читать онлайн «Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2016, ISBN: 2016, Издательство: Вильямс, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Эффективный и современный С++
В книге рассматриваются следующие темы. Освоение С++11 и С++14 — это больше, чем просто ознакомление с вводимыми этими стандартами возможностями (например, объявлениями типов
, семантикой перемещения, лямбда-выражениями или поддержкой многопоточности). Вопрос в том, как использовать их эффективно, чтобы создаваемые программы были корректны, эффективны и переносимы, а также чтобы их легко можно было сопровождать. Именно этим вопросам и посвящена данная книга, описывающая создание по-настоящему хорошего программного обеспечения с использованием C++11 и С++14 — т.е. с использованием современного С++.
■ Преимущества и недостатки инициализации с помощью фигурных скобок, спецификации
, прямой передачи и функций
интеллектуальных указателей
■ Связь между
,
, rvalue-ссылками и универсальными ссылками
■ Методы написания понятных, корректных,
лямбда-выражений
■ Чем
отличается от
, как они используются и как соотносятся с API параллельных вычислений С++
■ Какие из лучших методов “старого” программирования на С++ (т.е. С++98) должны быть пересмотрены при работе с современным С++
Более чем 20 лет книги
серии
являются критерием уровня книг по программированию на С++. Понятное пояснение сложного технического материала принесло ему всемирную известность. Он всегда самый желанный гость на международных конференциях, а его услуги консультанта широко востребованы во всем мире.
Скотт Мейерс Эффективный и современный С++, После изучения основ С++ я перешел к изучению того, как применять С++ в промышленном программировании, с помощью серии книг Скотта Мейерса Эффективный С++. Эффективный и современный С++ — наиболее важная из книг серии, предлагающая ключевые рекомендации, стили и идиомы, позволяющие эффективно использовать современный С++. Вы еще не купили эту книгу? Сделайте это прямо сейчас. Герб Саттер,
глава Комитета ISO по стандартизации С++, специалист в области архитектуры программного обеспечения на С++ в Microsoft

Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

К счастью, мы можем написать функцию pow, которая нам нужна. Как это сделать, я покажу чуть позже, но сначала давайте взглянем, каким образом эта функция может быть объявлена и использована:

constexpr // pow является constexpr

int pow(int base, int exp) noexcept // Не генерирует исключений

{

// Ее реализация - ниже

}

constexpr auto numConds = 5; // Количество условий

std::arraypow(3, numConds)> // results содержит

results; // 3^numConds элементов

Вспомним, что constexprперед powне говорит о том, что powвозвращает константное значение; оно говорит, что если baseи expявляются константами времени компиляции, то результат powможет быть использован как константа времени компиляции. Если baseи/или expне являются константами времени компиляции, то результат powбудет вычисляться во время выполнения. Это означает, что powможет быть вызвана не только для вычисления во время компиляции таких вещей, как размер std::array, но и в контексте времени выполнения, как здесь:

auto base = readFromDB("base"); // Эти значения получаются

auto exp = readFromDB("exponent"); // во время компиляции

auto baseToExp = pow(base, exp); // Вызов функции pow

// во время выполнения

Поскольку функции constexprдолжны быть способны возвращать результаты во время компиляции при вызове со значениями времени компиляции, на их реализации накладываются ограничения. Эти ограничения различны в C++11 и С++14.

В С++11 функции constexprмогут содержать не более одной выполнимой инструкции — return. Это выглядит более ограничивающим, чем является на самом деле, поскольку для повышения выразительности constexpr-функций можно использовать две хитрости. Во-первых, можно применять условный оператор “ ?:” вместо инструкции if-else, а во-вторых, вместо циклов можно использовать рекурсию. Таким образом, функция pow может быть реализована следующим образом:

constexpr int pow(int base, int exp) noexcept {

return (exp == 0 ? 1 : base * pow(base, exp - 1));

}

Этот код работает, но только очень непритязательный функциональный программист сможет назвать его красивым. В С++ 14 ограничения на constexpr-функции существенно слабее, так что становится возможной следующая реализация:

constexpr int pow(int base, int exp) noexcept // С++14

{

auto result = 1;

for (int i = 0; i < exp; ++i) result *= base;

return result;

}

Функции constexprограничены приемом и возвратом только литеральных типов (literal types), которые, по сути, означают типы, могущие иметь значения, определяемые во время компиляции. В С++11 к ним относятся все встроенные типы за исключением void, но литеральными могут быть и пользовательские типы, поскольку конструкторы и прочие функции-члены также могут являться constexpr:

class Point {

public:

constexprPoint(double xVal = 0, double yVal = 0) noexcept

: x(xVal), y(yVal) {}

constexprdouble xValue() const noexcept { return x; }

constexprdouble yValue() const noexcept { return y; }

void setX(double newX) noexcept { x = newX; }

void setY(double newY) noexcept { y = newY; }

private:

double x, y;

};

Здесь конструктор Pointможет быть объявлен как constexpr, поскольку, если переданные ему аргументы известны во время компиляции, значения членов-данных созданного Pointтакже могут быть известны во время компиляции. А значит, инициализированный таким образом объект Pointможет быть constexpr:

constexprPoint p1(9.4, 27.7); // OK, во время компиляции

// работает constexpr конструктор

constexprPoint p2(28.8, 5.3); // То же самое

Аналогично функции доступа xValueи yValueмогут быть constexpr, поскольку если они вызываются для объекта Pointсо значением, известным во время компиляции (например, объект constexpr Point), значения членов-данных xи yмогут быть известны во время компиляции. Это делает возможным написать constexpr-функции, которые вызывают функции доступа Pointи инициализируют constexpr-объекты результатами вызовов этих функций:

constexpr

Point midpoint(const Points p1, const Points p2) noexcept {

return {(p1. xValue()+p2. xValue()) / 2, // Вызов constexpr

(p1. yValue()+p2. yValue()) / 2}; // функции-члена

}

constexprauto mid = midpoint(p1, p2); // Инициализация

// constexpr объекта результатом constexpr-функции

Это очень интересно. Это означает, что объект midможет быть создан в памяти, предназначенной только для чтения, несмотря на то что его инициализация включает вызовы конструкторов, функций доступа и функции, не являющейся членом! Это означает, что вы можете использовать выражение наподобие mid.xValue() * 10в аргументе шаблона или в выражении, определяющем значение перечислителя [10] Поскольку P oint::xValue возвращает double , типом mid.xValue() * 10 также является double . Типы с плавающей точкой не могут использоваться для инстанцирования шаблонов или для указания значений перечислений, но они могут быть использованы как части больших выражений, дающих интегральные типы. Например, для инстанцирования шаблона или для указания значения перечислителя может использоваться выражение static_cast(mid.xValue() * 10) . ! Это означает, что традиционно довольно строгая граница между работой во время компиляции и работой во время выполнения начинает размываться, и некоторые вычисления, традиционно являющиеся вычислениями времени выполнения, могут перейти на стадию компиляции. Чем больший код участвует в таком переходе, тем быстрее будет работать ваша программа. (Однако компилироваться она может существенно дольше.)

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14»

Представляем Вашему вниманию похожие книги на «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14»

Обсуждение, отзывы о книге «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x