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

Возьмите это к примеру:

const Integer operator+(const Integer& left, const Integer& right) {
return Integer(left.i + right.i);
}

(взято со страницы 496 «Мышление в С ++»)

Какая часть после return заявление? бросать (чтобы сделать результат суммы Integer) или звонок в конструктор из class Integer? Или, может быть, что-то еще, что я игнорирую ..

Это конструктор:

Integer(long ll = 0) : i(ll) {}

Редактировать:

i его long int,

1

Решение

Литейное средство «изменение сущности одного типа данных в другой». Тем не менее, вы можете рассмотреть Integer() как актерский состав из long в Integer, так как два типа связаны, и операция переводится в «построить объект типа B, начиная с объекта типа A».

С этим синтаксисом защита от неправильного использования отсутствует, т. Е. Если конструктор принимает только один параметр, этот параметр нельзя использовать для создания объекта, непосредственно представляющего первый (например, каждый QWidget принимает указатель на родителя, но он, очевидно, не представляет своего родителя), и вы ничего не можете сделать, чтобы предотвратить это. Вы можете заблокировать неявная инициализация пометив однопараметрический конструктор как explicit, но не более того.

Синтаксис приведений и конструкторов в старом стиле только с одним параметром одинаков, и это причина, почему новый синтаксис был создан для первого: использовать новый стиль (явный) синтаксис C ++ для приведений, то есть, const_cast, dynamic_cast, static_cast или же reinterpret_cast по мере необходимости.

в слова самого Бьярне Страуструпа, этот подробный синтаксис приведения был введен, чтобы прояснить, когда происходит приведение. Обратите внимание, что наличие четырех форм также позволяет правильно дифференцировать намерения программиста.

В заключение, int() и такие считаются в старом стиле для простых типов (int, longи т. д.) и newvar = (T)oldvar Форма существует только из-за ограничения совместимости с Си.

4

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

Это constructor call,

Создание объекта в с ++ будет 2 способами,

Integer* i = new Integer(args); //A Pointer i , pointing to the object created at a memory location.

или же

Integer i = Integer(args); //Object i

Ваш случай — второй, но инициализированный объект не назначен i. Скорее это передается как есть.

Более того,
Приведение может быть тривиальным, если это (DataType) value., В этом случае это был бы, безусловно, актерский состав.

Но в случае DataType(value) если это примитивный тип, это будет приведение, но если это не примитивный тип, то это будет вызов конструктора.

0

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