Функции преобразования (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 * с помощью функции преобразования, а затем запустить сравнение указателей.
Поскольку отсутствует возможность "более не правильный" меньше другой компилятор не может определить значение выражения сравнения, а также выдает ошибку.