Анимация
JavaScript
|
Главная Библионтека В тексте приводится слегка усовершенствоваиная версия, в которой исправлены некоторые недочеты стандарта С++ (тип auto ptr ref объявлен глобальным, а также добавлен оператор присваивания auto ptr ref в auto ptr; см. с. 69), Подробное описание класса auto ptr Класс auto ptr объявлен в заголовочном файле <memory>: #include <тетогу> Шаблонный класс atJto ptr достзшен для всех типов в пространстве имен std. Точное объявление auto ptr выглядит так: namespace std { Вспомогательный тип. используемый при копировании и присваивании template <class Y> struct auto ptr ref {}; tempiate<class T> class auto ptr { public: Тип значения typedef T element type: Конструктор explicit auto ptr(T* ptr - 0) throwO; Копирующие конструкторы Сс неявный преобразованием типа) Обратите внимание - параметр обьяелен неконстантным! auto ptr(const auto ptr&) throwC); template<class U> auto ptr(auto ptr<U>&) throwO; Присваивание (с неявным преобразованием типа) Обратите внимание - параметр объявлен неконстантным! auto ptr& operator= (auto ptr&) throwC); tempiate<class U> auo ptr& operator= (auto ptr<U>&) throwO: Деструктор -autoptrO throwO; Обращение no указателю T* getC) const throwO; T& operator*C) const throwC): T* operator->0 const throwO: Освобождение принадлежащего объекта Т * release OthrowC): Повторная инициализация void resetСТ* ptr = 0) throwC); Специальные преобразования. используемые при копировании и присваивании public; auto ptr(auto ptr ref<T>) throwO; auto ptr& operator= Cauto ptr ref<T> rhs) throwC); tempiate<class U> operator auto ptr ref<U>() throwO; tempiate<class U> operator auto ptr <U>() throwO; Ниже приведены подробные описания отдельных членов класса (сокращение auto ptr означает auto ptr<T>). Полный пример реализации класса auto ptr приведен на с. 70. Определения типов avto ptr::element type Тип объекта, владельцем которого является auto ptr. Конструкторы, присваивание и деструкторы autoj?tr; .auto ptг О throwO О Конструктор по умолчанию. О Создает экземпляр auto ptr, не владеющий никаким объектом. О Инициализирует значение auto ptr нулем. explicit dutoj)tr::dutoj>tr (Т* ptr) throwO О Создает экземпляр auto ptr, владеющий объектом, на который ссылается ptr, и указывает на него. О После вызова *this становится владельцем объекта, на который ссылается ptr. Других владельцев быть не должно. О Если указатель ptr не является null-указателем, он должен содержать значение, полученное при вызове new, потому что деструктор auto ptr автоматически вызывает delete для принадлежащего ему объекта. О Конструктор не должен вызываться для значения, полученного при создании массива оператором new []. С массивами следует использовать контейнерные классы STL, представленные иа с. 88. duto ptг.:3>utoj)tг Cauto ptr& ар) throwO tempiate<class U> autoj?tr::auto ptг (auto ptr<U>& ap) throwO О Копирующий конструктор (для неконстантных значений). О Создает экземпляр auto ptr, к которому переходит право владения объектом, принадлежавшим экземпляру ар. О После выполнения операции экземпляр ар перестает быть владельцем объекта, а его значение становится равным пиII-указателю. Таким образом, в отличие от обычных реализаций копирующего конструктора происходит модификация исходного объекта. О Обратите внимание: функция перегружается шаблонной функцией класса (см. с. 28). Тем самым обеспечивается возможность автоматического преобразования типа ар к типу созданного экземпляра auto ptr (например, указателя auto ptr на объект производного класса в указатель autD ptr на объект базового класса). О Передача права владения рассматривается на с. 56. autoj}tr& duto ptr::openator= (auto ptr& ap) throwO template<class U> autoj)trh auto ptr::operator= (auto ptr<U>& ap) throwO О Оператор присваивания (для неконстантных значений). О Удаляет объект, ранее принадлежавший экземпляру, и принимает право владения объектом, ранее принадлежавшим ар. О После выполнения операции экземпляр ар перестает быть владельцем объекта, а его значение становится равным null-указатслю. Таким образом, в отличие от обычных реализаций оператора присваивания происходит модификация исходного объекта. О Объект, на который ссылается экземпляр auto ptr в левой части оператора присваивания (*this), удаляется вызовом delete. О Обратите внимание: функция перегружается шаблонной функцией класса (см. с. 28). Тем самым обеспечивается возможность автоматического преобразования типа ар к типу *thls (например, указателя auto ptr на объект производного класса в указатель auto ptr на объект базового класса). О Передача права владения рассматривается на с. 56. autoj)tr:-butojitr О throwO О Деструктор. О Если экземпляр auto ptr владеет объектом, для этого объекта вызывается delete. Обращение к принадлежащему объекту Т* autoj)tr:-.get С) const throwC) О Возвращает адрес объекта, владельцем которого является auto ptr.- О Если экземпляр auto ptr не владеет объектом, возвращается null-указатель. О Вызов get() не изменяет прав владения. Иначе говоря, после вызова экземпляр auto ptr продолжает владеть тем же объектом, которым он владел до вызова. Т& auto ptr: ioperator* О const throwO О Оператор разыменования. О Возвращает объект, владельцем которого является auto ptr. О Если экземпляр auto ptr не владеет объектом, вызов приводит к непредсказуемым последствиям (папример, аварийному завершению программы). Т* auto ptr::operator-> О const throwO О Оператор используется для обращения к членам объекта, владельцем которого является auto ptr. 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 |