|
|
Функция-член класса X, имя которой имеет вид,
имя-функции-преобразования:
operator имя-типа-преобразования
имя-типа-преобразования:
список-спецификаций-типа opt операция-ptr opt
задает преобразование из типа X в тип, определяемый конструкцией
имя-типа-преобразования. Такие функции-члены называются функциями
преобразования. В конструкции список-спецификаций-типа нельзя
описывать классы, перечисления и имена-typedef, а также нельзя
задавать типы формальных параметров и тип возвращаемого значения.
Приведем пример:
class X { // ... public: operator int(); }; void f(X a) { int i = int(a); i = (int)a; i = a; }
Здесь во всех трех операторах присваиваемое значение будет преобразовываться с помощью функции X::operator int(). Пользовательские преобразования не ограничиваются только использованием в присваивании и инициализации, например:
void g(X a, X b) { int i = (a) ? 1+a : 0; int j = (a&&b) ? a+b : i; if (a) { // ... } }
Операции преобразования наследуются. Функции преобразования
могут быть виртуальными.
К данному значению неявно применяется не более одного
пользовательского преобразования (с помощью конструктора или функции
преобразования), например:
class X { // ... public: operator int(); }; class Y { // ... public: operator X(); }; Y a; int b = a; // недопустимо: преобразование // a.operator X().operator int() не применяется int c = X(a); // нормально: a.operator X().operator int()
Пользовательские преобразования осуществляются неявно только при условии их однозначности. Функция преобразования производного класса не закрывает функцию преобразования базового класса, если только они не преобразуют к одному и тому же типу, например:
class X { public: // ... operator int(); }; class Y : public X { public: // ... operator void*(); }; void f(Y& a) { if (a) { // ошибка: неоднозначность } }
| |