Программирование >>  Операторы преобразования типа 

1 ... 14 15 16 [ 17 ] 18 19 20 ... 239


О Обратите внимание: функция перегружается шаблонной функцией класса (см. с. 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, В представленной версии зти ошибки исправлены, однако на момент написания книги вопрос о внесении изменений в стандарт еще обсуждался.



1 ... 14 15 16 [ 17 ] 18 19 20 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика