|
Программирование >> Операторы преобразования типа
Вспомогательные средства в этой главе описаны вспомогательные средства стандартной библиотеки С++: О простые компактные классы и функции для решения распространенных задач; О типы общего назначения; О важные функции С; О числовые пределы. Многие (хотя и не все) из этих средств описаны в секции 20 стандарта С++, посвященной основным утилитам, а их определения находятся в заголовочном файле <utility>. Остальные рассматриваются при описании какого-либо из более сложных компонентов библиотеки либо потому, что рассчитаны в основном на работу с этим компонентом, либо по чисто историческим причинам. Например, некоторые вспомогательные функции общего назначения определяются в заголовочном файле <algorithm>, хотя оии не являются алгоритмами в интерпретации STL (эта тема рассматривается в главе 5). Некоторые вспомогательные средства также применяются в стандартной библиотеке С++. Например, во всех случаях, когда две величины обрабатываются как единое целое (например, если функция должна вернуть сразу две величины), используется тип pair. Пары Тип pair позволяет работать с двумя величинами как с единым целым. Он неоднократно встречается в стандартной библиотеке С++. В частности, классы контейнеров тар и multimap используют тип pair при выполнении операции с элементами, которые представляют собой пары ключ/значение (см. с. 210). Другой распространенный пример - функция, возвращающая два значения. Вообще гоноря, числоные пределы пранильнее было бы рассматривать и главе 12, посвященной работе с числовымя данными, однако они используются в других частях библиотеки и поэтому описаны здесь. Обратите внимание: тин объявляется с ключевым словом struct вместо class, а все его члены объявляются открытыми. Следовательно, для любой нары значений возможны прямые обращения к отдельным компонентам. Конструктор но умолчанию создает пару значений, инициализируемых конструкторами но умолчанию соответствующих типов. Согласно правилам языка, явный вызов конструктора по умолчанию также инициализирует базовые тины Структура pair определяется d заголовочном файле <utility> следующим образом: namespace std { template <class Tl, class T2> struct pair { Имена типов компонентов typedef Tl fIrstType; typedef T2 secondType: Компоненты Tl first; T2 second: /* Конструктор no умолчанию - вызовы Т1() и Т2() * обеспечивают инициализацию базовых типов */ ра1г() : f1rst(Tl()). second(T2()) ( } Конструктор с двумя значениями pa1r(const Т1& а, const Т2& b) : firstCa). second(b) { Копирующий конструктор с автоматическими преобразованиями template<class U. class V> pa1r(const pair<U. V> &p) : f1rst(p.first). second(p.second) { Сравнения template <class Tl, class T2> bool operator== (const pair<Tl.T2>&. const pa1r<Tl.T2>&); template <class Tl. class T2> bool operator< (const pair<Tl.T2>&. const pair<Tl.T2>&): ... И Т.Д для !=. <=. >. >= template <class Tl. class T2> pair<Tl. T2> make pair(const T1&, const T2&): данных (такие, как int), поэтому следуюцее объявление инициализирует компоненты р конструкторами int() и float(), что приводит к обнулению обеих переменных: std;:pair<int.float> р; р.first и р.second инициализируются нулями Инициализация базовых типов вызовом конструктора по умолчанию описана на с. 30. Шаблонная версия конструктора используется в ситуациях, требующих автоматического преобразования типов. При копировании объекта типа pair вызывается стандартный копирующий конструктор, сгенерированный по обычным правилам. Пример: void f(std::pa1r<1nt.const char*>); void g(std::pair<const int.std::String>): void foo { std::pair<int.const char*> p(42, hello ): f(p): OK: вызывается стандартный копирующий конструктор g(p): OK: вызывается шаблонный конструктор Парные сравнения Для сравнения двух пар в стандартную библиотеку С++ включены обычные операторы сравнения. Две пары считаются равными при совпадении отдельных компонентов: namespace std { template <class Tl, class T2> bool operator== (const pair<Tl,T2>& x. const pair<TlJ2>& y) ( return X.first == y.first && x.second == y.second: При сравнении пар первый компонент обладает более высоким приоритетом. Если первые компоненты пар различны, то результат их сравнения (больше или меньше) определяет результат сравнения для пар в целом. Если первые компоненты равны, то результат сравнения пар определяется сравнением вторых компонентов: namespace std { template <class Tl. class T2> bool operator< (const pair<Tl.T2>& x. const pair<Tl,T2>& y) { return X,first < y.first (!(y.first <x.first) && X.second < y.second): Остальные операторы сравнения определяются аналогично. Шабломпып конструктор не замещает стандартный копирующий конструктор. Дополнительная информация по этому вопросу приведена на с. 29.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |