Вы спросили
, когда я инициализации переменной я делаю это с помощью оператора присваивания?
и сказал
при инициализации переменной мы даем ему новое значение с помощью оператора присваивания
Но, нет, нет. Символ =
используется для инициализации и назначения копий, но инициализация НЕ использует оператор присваивания. Инициализация переменной фактически использует конструктор.
В инициализации копии используется конструктор копирования.
type x = e; // NOT an assignment operator
Первый e
преобразуется в type
, создавая временную переменную, а затем инициализирует type::type(const type&)
x
путем копирования, что временный характер. type::operator=(const type&)
не называется вообще.
Существует также прямая инициализация, которая не использует =
символ:
type x(e);
type x{e}; // since C++11
otherclass::otherclass() : x(e) {} // initialization of member variable
Хотя и инициализация и присваивание дать переменной значение, то два не используют один и тот же код, чтобы сделать это.
Дополнительные детали: С C++ 11, а затем, если есть движение конструктор, копировать инициализации будет использовать его вместо этого, так как результат преобразования является временным. Кроме того, при копировании-инициализации компилятору разрешено пропустить фактически вызов конструктора копирования или перемещения, он может преобразовать инициализатор непосредственно в переменную. Но он все равно должен проверить, что конструктор копирования или перемещения существует и доступен. И конструкторы копирования могут также принимать неконстантную ссылку. Таким образом, это может быть type::type(type&&)
, который используется, или type::type(const type&&)
(очень редко), или type::type(type&)
, который используется, а не type::type(const type&)
. То, что я описал выше, является наиболее распространенным случаем.
* «И я читаю главу о операции присваивания» * Из какой книги/учебника/...? (Но это может быть неактуально ..) – dyp
Когда вы инициализируете переменную, вы обычно вызываете один из различных конструкторов (по умолчанию, copy, explicit и т. Д.). – CoryKramer