Д. Стефенс - C++. Сборник рецептов

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Д. Стефенс - C++. Сборник рецептов краткое содержание

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать
Решение

Используйте шаблон класса numeric_castBoost. Он выполняет проверки, которые при переполнениях переменной, принимающей значение, или других ошибках выбрасывают исключение типа bad_numeric_cast. Пример 3.8 показывает, как это выполняется.

Пример 3.8. Безопасное преобразование чисел

#include

#include

using namespace std;

using boost::numeric_cast;

using boost::bad_numeric_cast;

int main() {

// Целые типы

try {

int i = 32767;

short s = numeric_cast(i);

cout << "s = " << s << endl;

i++; // Теперь i выходит за диапазон (если sizeof(short) равен 2)

s = numeric__cast(i);

} catch (bad_numeric_cast& e) {

cerr << e.what() << endl;

}

try {

int i = 300;

unsigned int ui = numeric_cast(i);

cout << ui << endl; // Прекрасно

i *= -1;

ui = numeric_cast(i); // i отрицателен!

} catch (bad_numeric_cast& e) {

cerr << e.what() << endl;

}

try {

double d = 3.14.

int i = numeric_cast(d);

i = numeric_cast(d); // Это отрезает 0.14!

cout << i << endl; // i = 3

} catch (bad_numeric_cast& e) {

cerr << e.what( ) << endl;

}

}

Обсуждение

Вы, вероятно, знаете, что базовые типы C++ имеют различные размеры. Стандарт C++ содержит жесткие указания по относительному размеру типов: intвсегда не короче, чем short int, но он не указывает абсолютных размеров. Это означает, что если взять long intи попытаться записать его значение в shortили попытаться поместить intв unsigned int, то информация о значении переменной-источника, такая как знак или даже часть числового значения, может быть потеряна.

Только знания, что это может привести к проблемам, не достаточно. Вы можете быть ограничены жесткими требованиями по объему и не захотите использовать четыре байта для long, когда можно обойтись двумя байтами для short(если ваша платформа на самом деле использует такие размеры, что очень распространено, но не гарантируется). Из-за ограничений по объему может возникнуть желание попробовать хранить значения в наименьших возможных типах. Если вы любите приключения, но вам нужна страховка, для перехвата потерь данных при работе программы используйте numeric_castиз Boost.

Синтаксис numeric_castочень прост. Это шаблон функции, объявленный следующим образом.

template

inline Target numeric_cast(Source arg)

Если вы уже прочли рецепты 3.1 и 3.3, он аналогичен lexical_cast. У него имеется два параметра шаблона — Targetи Source, — которые представляют типы оригинального и результирующего значений. Так как это шаблон функции, компилятор может догадаться о типе аргумента Source, так что требуется указать только Target, как здесь.

int i = 32767;

short s = numeric_cast(i);

short— это аргумент, передаваемый в шаблон как параметр Target. Компилятор догадывается, что Sourceимеет тип intпотому, что iимеет тип int.

В этом случае я впихиваю intв short. В моей системе (Windows XP) int имеет длину четыре байта, a short— два. shortимеет знак, это означает, что для представления числа в нем используется 15 бит и, следовательно, максимальным допустимым положительным значением для него является 32 767. Приведенный выше фрагмент кода работает молча, но когда я увеличиваю iна единицу, она выходит за диапазон short.

s = numeric_cast(i); // Ох!

Вы уже догадались, что выбрасывается исключение bad_numeric_cast. Смотри остальную часть примера 3.8: numeric_cast также перехватывает потери знака, возникающие при присвоении отрицательного значения со знаком типу без знака.

Но numeric_castне решает всех проблем. Если попытаться поместить значение с плавающей точкой в тип без плавающей точки, то будет потеряно все, что находится справа от десятичной точки, так? numeric_castв этой ситуации не спасает, так что не думайте, что он сможет уберечь вас от всех рискованных предприятий. Например, рассмотрим такой фрагмент кода из примера 3.8:

double a = 3.14;

int i = numeric_cast(d); // Ох!

Здесь не будет выброшено никаких исключений. Но это произойдет, если попробовать такое:

double d = -3.14;

unsigned int ui = numeric_cast(d);

Потому что, несмотря на то что происходит потеря всего, что находится справа от десятичной точки, происходит потеря знака, а это очень плохо.

Смотри также

Рецепты 3.1 и 3.3.

3.7. Получение минимального и максимального значений числового типа

Проблема

Требуется узнать наибольшее и наименьшее значения, представляемые на данной платформе числовым типом, таким как intили double.

Решение

Чтобы среди прочего получить максимальное и минимальное допустимые значения числового типа, используйте шаблон класса numeric_limitsиз заголовочного файла (см. пример 3.9).

Пример 3.9. Получение числовых ограничений

#include

#include

using namespace std;

template

void showMinMax() {

cout << "min: " << numeric_limits::min() << endl;

cout << "max: " << numeric_limits::max() << endl;

cout << endl;

}

int main() {

cout << "short:" << endl;

showMinMax();

cout << "int:" << endl;

showMinMax();

cout << "long:" << endl;

showMinMax();

cout << "float:" << endl;

showMinMax();

cout << "double:" << endl;

showMinMax();

cout << "long double:" << endl;

showMinMax();

cout << "unsigned short:" << endl;

showMinMax();

cout << "unsigned int:" << endl;

showMinMax();

cout << "unsigned long:" << endl;

showMinMax();

}

Вот что я получил в Windows XP, используя Visual C++ 7.1.

short:

min: -32768

max: 32767

int:

min: -2147483648

max: 2147483647

long:

min -2147483648

max 2147483647

float:

min: 1.17549e-038

max: 3.40282e-038

double:

min: 2.22507e-308

max: 1.79769e+308

long double:

min: 2.22507e-308

max: 1.79769e+308

unsigned short:

min: 0

max: 65535

unsigned int:

min: 0

max: 4294967295

unsigned long:

min: 0

max: 4294967295

Обсуждение

Пример 3.9 показывает простой пример получения минимального и максимального значений встроенных числовых типов. Шаблон класса numeric_limitsимеет специализации для всех встроенных типов, включая как числовые, так и нечисловые типы. Стандарт требует, чтобы все типы, которые я использовал в примере 3.9, а также перечисленные далее, имели свою специализацию numeric_limits.

bool

char

signed char

unsigned char

wchar_t

minи max— это функции-члены numeric_limitsтипа static, которые возвращают наименьшее и наибольшее значения для типа переданного им параметра.

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

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C++. Сборник рецептов отзывы


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x