пятница, 18 марта 2011 г.

47. Для чего нужны функции преобразования? Как объявить такую функцию в классе?

Я уверен, что имеется в виду "оператор преобразования".
Допустим, мы хотим реализовать некоторую цепочку преобразований для объектов классов A, B, C:
ABC
Во-первых, можно написать функции преобразования (ну это понятно).
Во-вторых, использовать конструктор (см. вопрос 46). Для этого нужно добавить конструкторы B::B(A) и C::C(B) и преобразовывать на здоровье. Хоть явно, хоть неявно, как в примере:
struct A{
};

struct B{
  B(const A&){};
};

struct C{
  C(const B&){};
};

int main() {
  A a;
  B b = a;
  C c = b;
}

Я не добавлял никаких операций в класс A, так как B сам преобразовывает AB. Преобразованием BC, занимается C. Но часто оказывается так, что нежелательно или невозможно добавить операцию в C, зато B знает как преобразовать себя в C. Тогда нужно использовать оператор преобразования.
struct A{
};

struct C{
};

struct B{
  B(const A&){};
  operator C(){};
};

int main() {
  A a;
  B b = a;
  C c = b;
}

Итак, мини-шпаргалка:
T → B        используем конструктор B::B(T)
    B → T    используем B::operator T()

1 комментарий:

  1. Перегрузить операцию преобразования значений типа Dollars в тип int. Делается это следующим образом:
    class Dollars
    {
    private:
    int m_dollars;
    public:
    Dollars(int dollars=0)
    {
    m_dollars = dollars;
    }

    // Перегрузка операции преобразования значений типа Dollars в значения типа int
    operator int() { return m_dollars; }

    int getDollars() { return m_dollars; }
    void setDollars(int dollars) { m_dollars = dollars; }
    };

    https://ravesli.com/urok-140-peregruzka-operatsij-preobrazovaniya-tipov-dannyh/

    ОтветитьУдалить

Можно использовать теги <b>, <i>