Взаимопреобразование объектов двух разных классов с помощью оператора преобразования
Как работает оператор преобразования, определенный в классе B, в следующем коде? Я прочитал все другие статьи, связанные с операторами преобразования при переполнении стека, но не смог найти объяснения взаимопревращения объектов двух разных классов. Любая помощь будет высоко ценится, как я новичок в C++
Для следующего кода:
#include<iostream>
using namespace std;
class A
{
int i;
public:
A(int ii = 0) : i(ii) {}
void show() { cout << i << endl; }
};
class B
{
int x;
public:
B(int xx) : x(xx) {}
operator A() const { return A(x); }
};
void g(A a)
{
a.show();
}
int main()
{
B b(10);
g(b);
g(20);
return 0;
}
Я не могу понять, как работает оператор преобразования и как значение присваивается объекту А. По сути, я не могу понять поток кода, и я хочу знать за кулисами, то есть, как происходит преобразование?
3 ответа
Вот что происходит:
- Вы создаете
b
(тип:B
) - Ты звонишь
g
прохождениеb
как его параметр b
имеет типB
,g
ожидает переменную типаA
,g
ищет способ конвертировать изB
вA
- И то и другое
A
а такжеB
являются классами,B
перегружает "оператор преобразования"operator A()
- Ввод
g
автоматически преобразуется вb.operatorA()
который возвращаетA
g
выполняется сa
являющийсяb.operatorA()
g
вызывает методshow
наa
- Конец
g
В C++ существует такая вещь, как неявные последовательности преобразования во время разрешения перегрузки. Это все время включается, чтобы выбрать наиболее эффективную функцию для вызова.
Для случая:
void g(A a)
{
a.show();
}
int main()
{
B b(10);
g(b);
...
}
У вас есть определенная пользователем последовательность конвертации. Поскольку нет перегрузки функции g
который принимает в любом типе резюме b
, Последовательность конверсии будет для рейтинга. Оказывается, что A
может быть построен из B
из-за оператора преобразования в B
, Это используется.
Отсюда функция преобразования (оператор) в B
будет вызван для производства A
который используется для инициализации аргумента в g
Для случая:
void g(A a)
{
a.show();
}
int main()
{
B b(10);
g(23);
...
}
У вас есть конвертирующий конструктор, который может создать объект типа A
из int
Компилятор должен как-то решить, что делать с вашим g(b)
, Единственный доступный кандидат void g(A)
Таким образом, он проверяет, может ли он использовать это. Если существует способ юридически преобразовать аргумент (b
) для A
тогда это возможно. поскольку B
имеет соответствующий оператор преобразования, это действительно так. На самом деле, это единственная возможность. Итак, де-факто звонок g(b)
становится эквивалентным
g(static_cast<A>(b));
который явно вызывает оператор преобразования.