Существует ли функция явного преобразования по умолчанию для определенного пользователем класса (c ++)?

Могу ли я конвертировать совместимые не указательные объекты без фактического определения оператора приведения? Так что, если B наследует от A:

A a;
B b;

Будет (A)b компилировать, если я не предоставлю свой собственный оператор приведения?

Редактировать: кажется, для компиляции. Это потому, что существует оператор приведения преобразования по умолчанию или компилятор распознает совместимость и использует конструктор копирования по умолчанию или оператор присваивания, например, в присваиваниях?

1

Решение

Да, это компилируется (http://ideone.com/CXbeh0)

По умолчанию A копируемый Конструктор копирования имеет подпись A::A(A const &), С момента появления B неявно конвертируется в A const &, бросок будет решен с помощью AКопируй конструктор.

Преобразование в ссылку также применяется к (также неявно сгенерированному) оператору присваивания копии, поэтому a = b снова компилируется с помощью A &A::operator=(A const &),

Имейте в виду, что новый объект имеет тип A, а не B, поэтому он не содержит никакой дополнительной информации, которую сделал первоначальный экземпляр B. Это редко то, что вы хотите.

Напомним, что в C ++ рекомендуется забыть о существовании приведения в стиле C и использовать более конкретные типы приведения C ++:

  • Приведение в стиле функции для явного запроса на создание временного целевого типа с использованием соответствующего конструктора; также позволяет использовать многопараметрические конструкторы.
  • static_castТолько для совместимых типов.
  • dynamic_cast для перемещения указателей / ссылок во время выполнения
    проверять.
  • const_cast обрабатывать только конст.
  • А также reinterpret_cast если вам действительно нужно играть с указателями, но остерегайтесь правил наложения имен.
3

Другие решения

Никакие определяемые пользователем конструкторы или операторы не определены, тогда:

(A)b

будет реализовано так, как если бы:

A(b) //Calls A copy-constructor: A::A(const A&)

То есть он создаст временную конструкцию A из аргумента.

Это называется сращивание объектов и обычно это плохая идея, потому что вы копируете одни поля B, но не копируете другие. YMMV.

0

По вопросам рекламы [email protected]