Взаимопреобразование объектов двух разных классов с помощью оператора преобразования

Как работает оператор преобразования, определенный в классе 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 ответа

Вот что происходит:

  1. Вы создаете b (тип: B)
  2. Ты звонишь g прохождение b как его параметр
  3. b имеет тип B, g ожидает переменную типа A, g ищет способ конвертировать из B в A
  4. И то и другое A а также B являются классами, B перегружает "оператор преобразования" operator A()
  5. Ввод g автоматически преобразуется в b.operatorA() который возвращает A
  6. g выполняется с a являющийся b.operatorA()
  7. g вызывает метод show на a
  8. Конец 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));

который явно вызывает оператор преобразования.

Другие вопросы по тегам