Возьмите это к примеру:
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
,
Литейное средство «изменение сущности одного типа данных в другой». Тем не менее, вы можете рассмотреть Integer()
как актерский состав из long
в Integer
, так как два типа связаны, и операция переводится в «построить объект типа B, начиная с объекта типа A».
С этим синтаксисом защита от неправильного использования отсутствует, т. Е. Если конструктор принимает только один параметр, этот параметр нельзя использовать для создания объекта, непосредственно представляющего первый (например, каждый QWidget
принимает указатель на родителя, но он, очевидно, не представляет своего родителя), и вы ничего не можете сделать, чтобы предотвратить это. Вы можете заблокировать неявная инициализация пометив однопараметрический конструктор как explicit
, но не более того.
Синтаксис приведений и конструкторов в старом стиле только с одним параметром одинаков, и это причина, почему новый синтаксис был создан для первого: использовать новый стиль (явный) синтаксис C ++ для приведений, то есть, const_cast
, dynamic_cast
, static_cast
или же reinterpret_cast
по мере необходимости.
в слова самого Бьярне Страуструпа, этот подробный синтаксис приведения был введен, чтобы прояснить, когда происходит приведение. Обратите внимание, что наличие четырех форм также позволяет правильно дифференцировать намерения программиста.
В заключение, int()
и такие считаются в старом стиле для простых типов (int
, long
и т. д.) и newvar = (T)oldvar
Форма существует только из-за ограничения совместимости с Си.
Это 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)
если это примитивный тип, это будет приведение, но если это не примитивный тип, то это будет вызов конструктора.