Поделиться через


Функции преобразования (C++)

При преобразовании конструкторами, описанными в предыдущем разделе, объектов одного типа могут быть неявно преобразованы к определенному типу класса.Этот раздел описывает означает, что можно реализовать явное преобразование из заданного типа класса другой тип.Преобразование из типа класса часто достигается с помощью функции преобразования.Функции преобразования используйте следующий синтаксис:

Грамматика

  • преобразование-функция-имя.
    Оператор преобразование-тип-имя ()

  • преобразование-тип-имя.
    ptr-оператор тип-описатель-спискаOpt

В следующем примере определяется функция преобразования, что преобразование типа Money печать double.

// spec1_conversion_functions1.cpp
struct Money {
   operator double() { return _amount; }

private:
    double _amount;
};

int main() {
   Money Account;
   double CashOnHand = Account;
}

Инициализация CashOnHand с Account вызывает преобразование из типа Account печать double.

Функции преобразования часто называются "операторов приведения", поскольку они (вместе с конструкторами), вызываемые функции, если приведение будет использоваться.В следующем примере с помощью функции cast или явное преобразование, чтобы напечатать текущее значение объекта типа Money.

cout << (double)Account << endl;

Функции преобразования наследуются в производных классах.Операторы преобразования скрывают только операторы преобразования базового класса, которые преобразуют к точному тот тип.Следовательно, определенные пользователем Оператор int нет скрывает определяемое пользователем функция Оператор short функцию в базовом классе.

Применяется только одна определяемая пользователем функция преобразования при выполнении неявного преобразования.В случае отсутствия явно указанная функция преобразования, компилятор не будет искать промежуточные типы, в которые можно преобразовать объект.

Если необходимо преобразование, которое приводит к неоднозначности, формируется ошибка.Неоднозначности возникают, когда несколько определенное пользователем преобразование доступно или если определенное пользователем преобразование и встроенное преобразование существует.

Пример

В следующем примере показано объявление класса с возможной неоднозначностью:

// spec1_conversion_functions2.cpp
#include <string.h>
#include <stdio.h>

struct String {
   // Define constructor that converts from type char *.
   String( char *szBuffer ) {
      strcpy_s( _text, szBuffer );
   }

   // Define conversion to type char *.
   operator char *() {
      return _text;
   }

   int operator==( const String &s )  {
      return !strcmp( _text, s._text );
   }

private:
   char _text[80];
};

int main() {
   String s( "abcd\0" );
   char *ch = "efgh";

   // Cause the compiler to select a conversion.
   return s == ch; // C2666
}

в выражении s == chкомпилятор не имеет 2 и никаких способов указания выбора правильного.Он может преобразовать ch к объекту типа String использование конструктора и затем выполнить сравнение с помощью определяемого пользователем operator==.Или может преобразовать s к указателю типа char * с помощью функции преобразования, а затем запустить сравнение указателей.

Поскольку отсутствует возможность "более не правильный" меньше другой компилятор не может определить значение выражения сравнения, а также выдает ошибку.

См. также

Ссылки

Преобразования