Панель управления
Оплаченные ссылки
Главная » C++ энциклопедия » О » Операторы преобразования
Категория: C++ энциклопедия » О
- 0
Автор: admin
Оператор преобразования — особый случай. Если конструктор представляет собой отображение аргументов на домен вашего класса, то оператор преобразования делает прямо противоположное: по экземпляру вашего класса он создает другой тип данных.
long x = s; // Вызывается функция operator long()
Операторы преобразования должны быть функциями класса. Как видно из показанного фрагмента, операторы преобразования хороши тем, что компилятор обычно сам может определить, когда они должны вызываться. Если ему понадобится длинное целое, он ищет оператор long(). Если ему понадобится объект Foo, он ищет в классе Foo либо конструктор с аргументом String, либо operator Foo(). Возникает интересный вопрос: если оператор преобразования делает фактически то же, что и конструктор, почему бы не обойтись чем-нибудь одним? Преимущество конструкторов состоит в том, что они обеспечивают инкапсуляцию результирующего класса. Чтобы сконструировать объект другого класса, оператор преобразования должен очень много знать о нем. Вот почему для перехода от одного типа к другому обычно используются конструкторы. А если осуществляется переход к базовому типу вроде int? Вряд ли вы будете требовать, чтобы компилятор создавал для int
новые конструкторы, которые знают о существовании ваших пользовательских типов. А если и будете, то не рискнете признаться в этом вслух. Только оператор преобразования может автоматически перейти к базовому типу. Даже если результирующий тип не является базовым, он может быть частью готовой библиотеки, которую нежелательно модифицировать. И снова оператор преобразования справляется с задачей.
Операторы преобразования можно объявлять для любых типов данных. Они вызываются без аргументов, а тип возвращаемого значения определяется по имени оператора. Операторы преобразования, как и все остальные операторы, бывают константными или неконстантными. Часто определяется как константная, так и неконстантная версии одного оператора. Как правило, константная версия работает более эффективно, поскольку неконстантная версия обычно выполняет копирование данных.
Клиентский код, использующий неконстантную версию, должен взять на себя ответственность за удаление дубликата.
class String {
private:
char* s ;
public:
operator l ong(); // И спользует atol для преобразования к типу long
};
String::operator long()
{
// В ероятно, здесь следует проверить, что строка
// п редставляет собой число, принадлежащее к диапазону длинных целых
return a toll(s);
}
String s(“1234”); long x = s; // Вызывается функция operator long()
Операторы преобразования должны быть функциями класса. Как видно из показанного фрагмента, операторы преобразования хороши тем, что компилятор обычно сам может определить, когда они должны вызываться. Если ему понадобится длинное целое, он ищет оператор long(). Если ему понадобится объект Foo, он ищет в классе Foo либо конструктор с аргументом String, либо operator Foo(). Возникает интересный вопрос: если оператор преобразования делает фактически то же, что и конструктор, почему бы не обойтись чем-нибудь одним? Преимущество конструкторов состоит в том, что они обеспечивают инкапсуляцию результирующего класса. Чтобы сконструировать объект другого класса, оператор преобразования должен очень много знать о нем. Вот почему для перехода от одного типа к другому обычно используются конструкторы. А если осуществляется переход к базовому типу вроде int? Вряд ли вы будете требовать, чтобы компилятор создавал для int
новые конструкторы, которые знают о существовании ваших пользовательских типов. А если и будете, то не рискнете признаться в этом вслух. Только оператор преобразования может автоматически перейти к базовому типу. Даже если результирующий тип не является базовым, он может быть частью готовой библиотеки, которую нежелательно модифицировать. И снова оператор преобразования справляется с задачей.
Операторы преобразования можно объявлять для любых типов данных. Они вызываются без аргументов, а тип возвращаемого значения определяется по имени оператора. Операторы преобразования, как и все остальные операторы, бывают константными или неконстантными. Часто определяется как константная, так и неконстантная версии одного оператора. Как правило, константная версия работает более эффективно, поскольку неконстантная версия обычно выполняет копирование данных.
class String {
private:
char* s ;
public:
operator const char*() const { return s; }
operator c har*():
};
String::operator char*()
{
char* newStr = new char[strlen(s) + 1];
strcpy(newStr, s );
return n ewStr;
} Клиентский код, использующий неконстантную версию, должен взять на себя ответственность за удаление дубликата.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
