Анимация
JavaScript


Главная  Библионтека 

0 1 [ 2 ] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

Дело в том, что стандарт создавался не какой-нибудь компанией с излишками средств и свободного времени. Люди, занимающиеся стандартизацией, за свою работу получают очень мало или не получают вообще ничего. Следовательно, если специалист не работает на компанию, заинтересованную в появлении стандарта, он работает просто для собственного удовольствия. К счастью, в мире еще встречаются энтузиасты, у которых хватает свободного времени и денег.

Стандарт С++ появился не на пустом месте. За основу был взят язык С++ в том виде, в котором он был описан Бьярном Страуструпом, создателем С++. Однако у специализированной библиотеки не было прототипа в виде книги или существующей библиотеки. В библиотеку были включены готовые реализации классов Из-за этого библиотека ползилась недостаточно однородной. В разных компонентах применяются разные архитектурные принципы. В качестве примера можно привести различия между строковыми классами и STL, набором структур данных и алгоритмов.

О Проектировщики строковых классов стремились сделать их как можно более надежными и удобными. По этой причине интерфейс строковых классов почти не требует пояснений и выявляет многие ошибки в параметрах.

О Основной целью проектирования STL было объединение разных структур данных с разными алгоритмами при обеспечении оптимального быстродействия. В результате удобство работы с STL оставляет желать лучшего, а многие логические ошибки не проверяются реализациями. Чтобы извлечь максимум пользы из широты возможностей и замечательного быстродействия STL, необходимо знать основные принципы и внимательно применять их на практике.

Все эти компоненты являются частью одной библиотеки. Проектировщики постарались хотя бы отчасти согласовать их, но в целом каждый компонент сохранил свою базовую философию проектирования.

Один из компонентов библиотеки считался фактическим стандартом еще до начала официальной стандартизации; это библиотека lOStream. Разработанная в 1984 году, она была реализована заново с частичной переработкой архитектуры в 1989 году. Библиотека уже использовалась во многих программах, поэтому ее общая концепция была сохранена для обеспечения обратной совместимости.

Итоговый стандарт (язык и библиотека) стал результатом обсуждения и участия многих сотен людей со всего мира. Например, японцы внесли ряд полезных предложений из области интернационализации. В процессе обсуждения совершались ошибки, а участники нередко расходились во мнениях. Всем казалось, что в 1994 году стандарт уже близится к завершению, однако включение STL кардинально изменило всю библиотеку. Но чтобы проект все же когда-нибудь завершился, разработчики постепенно перестали принимать новые предложения, какими бы полезными они ни были. Из-за этого в стандарт не была включена такая распространенная структура данных, как хэш-таблица.

Появление стандарта не означает, что эволюция С++ завершена. В стандарте будут исправляться ошибки и несоответствия; вполне вероятно, что лет через пять появится его следующая версия. Тем пе менее на ближайшие годы у про-

Воз.можно, вас интересует, почему в процессе стандартизации библиотека не была спроектирована .заново? Дело в том, что основной целью стандартизации является не изобретение или разработка чего-либо, а согласование уже готовых решений.



граммистов С++ имеется стандарт, а вместе с ним - и возможность написания универсального кода, переносимого на разные платформы.

Новые языковые возможности

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

Современный язык С++ заметно отличается от С++ пятилетней давности. Если вы не следили за его развитием, возможно, некоторые новые конструкции, используемые в библиотеке, окажзтся для вас неожиданностью. В этом разделе приводится краткий обзор новых возможностей языка. За подробностями обращайтесь к специализированным учебникам.

На момент написания книги новые язьпсовые конструкции не поддерживались некоторыми компиляторами. Автор надеется (и не без оснований), что ситуация скоро изменится, тем более что многие разработчики компиляторов участвовали в процессе стандартизации. Тем не менее отдельные случаи несовместимости могут ограничивать использование библиотеки. В переносимых версиях библиотеки обычно учитывается, какие возможности реализованы в конкретной среде (обычно для определения поддерживаемых возможностей запускаются тестовые программы, а затем по результатам проверки настраиваются препро-цессорпые директивы). Наиболее характерные и важные ограничения будут упоминаться в сносках.

В следующих подразделах рассматриваются основные языковые возможности, важные для стандартной библиотеки С++.

Шаблоны

Практически все составляющие стандартной библиотеки оформлены в виде шаблонов. Без поддержки шаблонов использовать стандартную библиотеку невозможно. Более того, для функционирования библиотеки была нужна поддержка некоторых специальных свойств шаблонов, о которых будет рассказано после краткого обзора.

Шаблонами называются функции или классы, определяемые без указания одного или нескольких типов. При использовании шаблона эти типы передаются в виде аргументов, явно или косвенно. Рассмотрим типичный пример - функцию, которая возвращает большее из двух значений:

template <class Т>

Inline const Т& max (const Т& a. const T& b)

Если a<b, вернуть b: иначе вернуть a. return a < b ? b : a:



В первой строке Т определяется как произвольный тип данных, который должен передаваться при вызове функции, В качестве имени параметра может использоваться произвольный идентификатор, но имя Т встречается настолько часто, что почти стало стандартным обозначением. Хотя перед формальным параметром шаблона стоит ключевое слово class , он вовсе не обязан быть классом. Допускается любой тип данных, который поддерживает операции, используемые шаблоном.

По тому же принципу классы «параметризуются» для произвольных типов. Параметризация особенно удобна для контейнерных классов, поскольку она позволяет определять операции с элементами контейнера для произвольного типа элементов. Стандартная библиотека С++ содержит многочисленные шаблоны контейнеров (за примерами обращайтесь к главам 6 и 10). Впрочем, шаблоны используются и для других целей. Например, строковые классы параметризуются по типу символов и свойствам кодировки (см. главу И),

Не стоит полагать, что шаблон компилируется только один раз, а в результате компиляции строится код, подходящий для любого типа. В действительности шаблон компилируется для каждого типа или комбинации типов, с которыми он используется. Отсюда следует важная проблема, связанная с практическим применением шаблонов; реализация шаблонной функции должна быть доступна к моменту вызова, чтобы функцию можно было откомпилировать для конкретного типа. Следовательно, в настоящее время единственный переносимый способ использования шаблонов основан на их определении в заголовочных файлах с применением подставляемых (inline) функций.

Полноценная реализация стандартной библиотеки С++ должна поддерживать не только шаблоны, но и многие стандартизированные свойства шаблонов. Некоторые из этих свойств рассматриваются ниже.

Нетипизованные параметры шаблонов

Кроме параметров-типов в шаблонах допускается использование нетипизованных параметров. В этом случае нетипизованный параметр считается частью определения типа. Например, аргумент шаблона стандартного класса bitseto (см. с. 444) содержит количество битов. В следующем фрагменте определяются два битовых поля, состоящих из 32 и 50 бит:

b1tset<32> flags32: Битовое поле из 32 бит bitset<50> flagsSO; Битовое поле из 50 бит

Эти битовые поля относятся к разным типам, потому что при их определении задаются разные аргументы шаблонов. Следовательно, их нельзя присваи-

Ключевое слово class было выбрано для того, чтобы избежать введения нового ключевого слова при использовании шаблонов. Тем не менее в современной версии С++ появилось новое ключевое слово typename, которое также может использоваться при объявлении шаблонов (см. с. 27).

Для решения проблемы с обязательным определением шаблонов в заголовочных файлах в стандарт была включена модель компиляции шаблонов с ключевым словом export. Впрочем, на момент написания книги она еще нигде не была реализована.



0 1 [ 2 ] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239