R Справочное руководство по С++

R.12.3.2 Функции преобразования.

   


Назад  |  Вперёд

Функция-член класса 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) {  // ошибка: неоднозначность
             }
           }

Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.