2014-09-25 2 views
1

Я изучаю язык программирования C++, и я читаю главу о операции присваивания (=). При инициализации и присваивании C++ операции настолько схожи, что мы можем использовать одну и ту же запись.Оператор присваивания и инициализация

Но мой вопрос: когда я инициализирую переменную, я делаю это с оператором присваивания? Когда я назначаю переменную, я делаю это с оператором присваивания? Я думаю, что единственная разница между инициализацией и присваиванием, поскольку, когда мы инициализируем переменную, мы придаем ей новое значение с помощью оператора assignmnet, когда мы назначаем переменную, мы заменяем старое значение этой переменной новым значением, используя оператор присваивания. Это правильно ?

+1

* «И я читаю главу о операции присваивания» * Из какой книги/учебника/...? (Но это может быть неактуально ..) – dyp

+0

Когда вы инициализируете переменную, вы обычно вызываете один из различных конструкторов (по умолчанию, copy, explicit и т. Д.). – CoryKramer

ответ

0

Ваша мысль верна. С конструктором вы выделяете новый объект такого типа, который имеет свои собственные накладные расходы.

Когда вы копируете назначение переменной, вместо этого вы не хотите создавать новый объект, так как у вас его уже есть. Вам просто нужно установить соответствующие переменные-члены левой стороны объекта присваивания в нужный размер.

Например:

MyClass object = MyClass(10); // here the constructor is called 
MyClass other = MyClass(5); // here another constructor is called 
object = other // here the copy assignment operator is called, you don't need to build any new object, just setting fields 

Кроме того, существует еще одна ситуация, которая вызывает конструктор копирования, который является следующим:

MyClass other2 = MyClass(object); 

Здесь специальный конструктор вызывается, который в основном делает то же работу операция присваивания копии, но с новым объектом, а не с существующим.

+0

IMO вы должны сделать более четкое различие между «конструктором копирования» и «копированием», а также тем, что использование '=' не всегда переводится в операцию присваивания. –

3

Вы спросили

, когда я инициализации переменной я делаю это с помощью оператора присваивания?

и сказал

при инициализации переменной мы даем ему новое значение с помощью оператора присваивания

Но, нет, нет. Символ = используется для инициализации и назначения копий, но инициализация НЕ использует оператор присваивания. Инициализация переменной фактически использует конструктор.

В инициализации копии используется конструктор копирования.

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&). То, что я описал выше, является наиболее распространенным случаем.

+0

«Первый' e' преобразован в 'type' 'не всегда true,' e' может быть аргументом для другого неявного конструктора с 1 параметром. –

+0

@ E_net4: Это преобразование. Один конструктор аргументов называется конструктором преобразования. –

+0

Хорошо, я стою исправлено. Моя линия мысли была слишком практичной. –