|
Программирование >> Операторы преобразования типа
О Обратите внимание: функция перегружается шаблонной функцией класса (см. с. 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. Спасибо Биллу Гиббонсу (Bill Gibbons) за предоставленный материал. Термины г-зиачение* и 1-значение: происходят от конструкции присваивания выражение 1выражение2, в которой левосторонний операнд выражение1 должен представлять собой (модифицируемое) 1-значение. Тем не менее, 1-значение правильнее представлять как значение определителя обьекта, то есть выражение, определяющее объект по имени или адресу (указателю или ссылке). Эти значения не обязаны быть модифицируемыми; например, имя константного объекта является немодифицируемым 1-зна-чением. Все выражения, не относящиеся к 1-значениям, являются г-значениями. В частности, временные объекты, создаваемые явно (Т()) или в результате вызова функции, являются г-значениями. О Если экземпляр auto ptr не владеет объектом, вызов приводит к непредсказуемым последствиям (например, аварийному завершению программы). Модификация принадлежащего объекта Т* auto ptr:: release О throwO О Экземпляр auto ptr перестает быть владельцем объекта. О Возврашает адрес объекта, принадлежавшего auto ptr перед вызовом (если он был). О Если перед вызовом экземпляр auto ptr не владел объектом, возврашается null-указатель. void autoj?tr:: reset (Т* ptr = 0) throwO О Заново инициализирует экземпляр auto ptr по переданному указателю ptr. О Вызывает delete для объекта, принадлежавшего экземпляру auto ptr до вызова. О После вызова объект, на который ссылается ptr, принадлежит *this. Другого владельца быть не должно. О Если указатель ptr не является null-указателем, он должен содержать значение, полученное при вызове new, потому что деструктор auto ptr автоматически вызывает delete для принадлежащего объекта. О При вызове resetO не должно передаваться значение, полученное при создании массива оператором new []. С массивами следует использовать контейнерные классы STL, представленные па с. 88. Преобразования Прочие члены класса auto ptr (вспомогательный тип auto ptr ref и использующие его функции) реализуют довольно хитрые преобразования, позволяющие выполнять операции копирования и присваивания только с неконстантными экземплярами auto ptr (подробности приведены на с. 60). Ниже приводится краткое пояснение. Необходимо обеспечить выполнение двух требований. О Объекты auto ptr должны передаваться функциям и приниматься от них в виде г-значений. Поскольку тип auto ptr является классом, это должно делаться с применением конструктора. О При копировании auto ptr исходный указатель должен лишаться права владения объектом, для чего копия должна модифицировать исходный экземпляр auto ptr. Обычный копирующий конструктор может скопировать г-значение, но для этого его параметр должен быть объявлен в виде ссылки на константный объект. В случае использования обычного конструктора для копирования auto ptr нам придется объявить переменную класса, содержащую фактический указатель, из-мешемой, чтобы ее можно было модифицировать в копирующем конструкторе. Но тогда вы сможете написать код, который копирует объекты auto ptr, объявленные константными; передача права владения противоречит объявлению этих объектов константными. Возможен и другой вариант - найти механизм, который бы позволял преобразовать г-зиачение в 1-значение. Простая операторная функция преобразования к ссылочному типу не подойдет, поскольку такие функции никогда не вызываются для преобразования объекта к его собственному типу (вспомните, что атрибут *ссылочности не является частью типа). По этой причине был введен класс auto ptr ref, обеспечивающий механизм преобразования в 1-значение, Работа этого механизма основана на различиях между перегрузкой (overloading) и правилах идентификации аргументов в шаблонах. Эти различия слишком тонки, чтобы использовать их в качестве общего инструмента программирования, но в данном случае они обеспечивают правильную работу класса auto ptr. Не удивляйтесь, если ваш компилятор еще не различает константные и неконстантные объекты auto ptr. Также учтите, что в этом случае работа с auto ptr требует еще большей осторожности - малейшая невнимательность легко приводит к непредвиденной передаче прав владения. Пример реализации класса auto ptr Ниже приведен пример реализации класса auto ptr, отвечающей требованиям стандарта util/autoptr.hpp /* Класс auto ptr - усовершенствованная реализация, * соответствующая стандарту. */ namespace std { Вспомогательный тип. используемый при копировании и присваивании (теперь является глобальным) tempiate<class Y> struct auto ptr ref { Y* yp; auto ptr ref (Y* rhs) : yp(rhs) { template<class T> class auto ptr { Спасибо Грегу Колвину (Greg Colwin) за эту реализацию auto ptr. Учтите, что код не полностью соответствует стандарту. Оказалось, что спецификация стандарта содержит ошибки в описании специальных преобразований, выполняемых при использовании auto ptr ref, В представленной версии зти ошибки исправлены, однако на момент написания книги вопрос о внесении изменений в стандарт еще обсуждался.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |