Анимация
JavaScript
|
Главная Библионтека не замещает стандартный копирующий конструктор template <class U> MyClass (const MyClass<U>& x): void fC) { MyClass<double> xd: MyClass<double> xd2(xd): Вызывает стандартный копирующий конструктор MyClass<1nt> x1(xd); Вызывает шаблонный конструктор В приведенном примере тип xd2 соответствует типу xd, поэтому объект инициализируется копирующим конструктором по умолчанию, с другой стороны, тип xi отличается от типа xd, поэтому объект инициализируется шаблонным конструктором. Следовательно, если вы определяете шаблонный конструктор, не забудьте также определить собственный копирующий конструктор, если стандартный копирующий конструктор вас не устраивает. Другой пример шаблона, определяемого как член класса, приведен на с. 50. Шаблоны вложенных классов Вложенные классы тоже могут оформляться в виде шаблонов: template <class Т> class MyClass { template <class T2> class NestedClass: Явная инициализация базовых типов При явном вызове конструктора без аргументов базовые типы инициализируются нулями: int 11: Неопределенное значение 1nt 12 - 1ntC); Переменная инициализируется нулем Такая возможность была реализована для того, чтобы вы могли написать код шаблона, в котором величине любого типа заведомо будет присвоено некоторое значение по умолчанию. Например, в следующей функции вызов констрзгктора гарантирует, что для всех базовых типов переменная х будет инициализирована нулем: template <class Т> void fC) Т X = TO: Обработка исключений в стандартной библиотеке С++ применяется механизм обработки исключений. С его помощью можно обрабатывать экстренные ситуации, не «загромождая» интерфейс функции лишними аргументами или возвращаемыми значениями. При возникновении внештатной ситуации обычная последовательность обработки данных прерывается «генерированием исключения»: class Error; void fO if {условие) { throw ErrorO: Создать объект класса Error и передать ) в нем информацию об исключении Команда throw запускает процесс, называемый раскруткой стека. Иначе говоря, программа выходит из всех блоков или функций так, как обычно происходит при выполнении команды return, однако при этом управление никуда не передается. Для всех локальных объектов, объявленных в блоках, из которых выходит программа, вызываются деструкторы. Раскрутка стека продолжается до тех пор, пока не произойдет выход из main() с .завершением программы либо исключение не будет «перехвачено» и обработано секцией catch: int mainC) { try { fO; catch (const Error&) { ... Обработка исключения В этом примере любое исключение типа Error, возникшее в блоке try, будет перехвачено секцией catch Объекты исключений представляют собой стандартные объекты, определяемые в виде обычных классов или базовых типов. Следовательно, вы можете переда- Исключение завершает вызов функции, в которой оно произошло. При этом стороне, вызвавшей функцию, можно вернуть объект в виде аргумента. Тем не менее, возврат управления не может рассматриваться как своего рода «обратный вызов» (снизу, где была обнаружена проблема, наверх, где эта проблема решается). После обработки исключения управление нельзя вернуть обратно и продолжить выполнение функции с того места, где оно было прервано. В этом отношении обработка исключений принципиально отличается от обработки сигналов. Использование идентификатора, входящего в пространство имен josuttis::F11e obj: josuttis: :iTiyGlobalFunc(); вать целые типы, строки или шаблоны, являющиеся частью иерархии классов Обычно в программе создастся некое подобие иерархии специальных классов представляющих разные ошибки. В переменных этих объектов можно передат! любую нужную информацию от места обнаружения ошибки к месту ее обработки Обратите внимание: механизм называется обработкой исключений, а не обра боткой ошибок. Эти два понятия не всегда эквивалентны. Например, ошибки в данных, введенных пользователем, нередко рассматриваются не как исключение, а как вполне типичное явление. Вероятно, в таких случаях ошибки пользовательского ввода стоит обработать локально с использованием традиционные средств обработки ошибок. Чтобы указать, какие исключения могут генерироваться функцией, включите в ее объявление спецификацию исключений: void f() throw(bad alloc): fO генерирует только исключения bad alloc Пустой список означает, что функция вообще не может создавать исключения: void f() throwO; f() не создает исключения При нарушении спецификации исключений программа выполняет специальные действия (см. описание класса bad exception на с. 44), В стандартную библиотеку С-и- включены некоторые обпше средства обработки исключений, в том числе стандартные классы исключений и класс auto j3tr (см, с. 43 и 54). Пространства имен с появлением новых библиотек, модулей и компонентов возрастает вероятность конфликтов имен при их одновременном испо.льзовании. Пространства имен помогают решить эту проблему. Пространство имен объединяет идентификаторы в именованной области видимости. При этом имя пространства является единственным глобальным идентификатором, который может конфликтовать с другими глобальными именами. По аналогии с членами классов идентификаторы, входящие в пространство имен, уточняются именем этого пространства с оператором ::, как показано ниже: Определение идентификаторов в пространстве имен josuttis namespace josuttis { class File; void myGlobalFuncC); 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 |