int a = b;
или
int a; a = b;
Проходил конструкторы копирования , и выяснил что при одном из них конструктор копии работает , а при другом нет! В чем же разница ?
В случае
int a = b;
объявляется переменная a, которая сразу же инициализируется путём копирования значения переменной b.
В случае
int a; a = b;
объявляется переменная a, происходит инициализация по умолчанию. Для типа данных int инициализация по умолчанию означает, что у объекта будет некое неопределённое значение.
Уже после этого переменной a присваивается значение переменной b.
Конструктор вызывается при создании нового объекта, причём конструктор копирования будет вызван, когда объект инициализируется значением другого объекта такого же типа. Когда объект инициализируется без какого-либо значения, то вызывается конструктор по умолчанию:
T a; // вызывается конструктор по умолчанию.
T b; // вызывается конструктор по умолчанию.
T c = a; // вызывается конструктор копирования.
c = b; // конструктор не вызывается
int a{} - это value initialization, а int a; - default initialization.
– αλεχολυτ
Dec 11 '19 at 11:01
int это скалярный тип, для работы с данными типами предопределены операторы =,+,- и т.д и ни каких конструкторов... В данном случае оператор = выполняет операцию копирования - значения RVALUE (b) в левую часть LVALUE (a). В вашем вопросе разнице ни какой нет, ниже будет пример, почему. В обоих случаях будет вызывать один и тот же оператор копирования =.
Для справки и тем кто минусует, про RValue. Берем вырезку из стандарта "2012 - Standarts for C++ - Drafts - N3337 - Finall 11" про RVALUE из раздела 3.10 Lvalues and rvalues:
An rvalue (so called, historically, because rvalues could appear on the right-hand side of an assignment expression) is an xvalue, a temporary object (12.2) or subobject thereof, or a value that is not associated with an object.
Теперь перевод google translate:
Rvalue (исторически так называемое, потому что rvalue может появляться в правой части присваивания expression) - это xvalue, временный объект (12.2) или подобъект или значение, которое не связано с объектом.
Вывод:
Когда пишем int a = b, 1е говорим компилятору, что хотим в стеке выделить 4 байта под тип int и 2е даем компилятору команду копирования "=", что по указанному адресу записать значение b (RValue).
и на закуску... есть онлайн решение, которое переводит Ваш код в asm, https://godbolt.org/
Вот как выглядит для компилятора Ваши объявления: к примеру:
int square(int b) {
int a;
a = b;
}
square(int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], edi
mov eax, DWORD PTR [rbp-20]
mov DWORD PTR [rbp-4], eax
nop
pop rbp
ret
и следующий вариант кода:
// Type your code here, or load an example.
int square(int b) {
int a = b;
}
square(int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], edi
mov eax, DWORD PTR [rbp-20]
mov DWORD PTR [rbp-4], eax
nop
pop rbp
ret
найдите отличия? Всегда надо смотреть что написано в стандарте и разбираться, как Ваш код воспринимает и обрабатывает компилятор!
T a = b; никакого вызова operator= нет. Хотя для встроенных типов это вообще странно упоминать. Ну и b не является rvalue, почитайте, например, тут.
– αλεχολυτ
Dec 11 '19 at 09:05
int, у которого никаких "конструкторов" нет и быть не может? – AnT stands with Russia Dec 11 '19 at 01:59