MyClass myObject = MyClass(int i);
Это синтаксическая ошибка, незаконная смесь декларации и использования. Вы, вероятно, имел в виду:
int i = 42;
MyClass myObject = MyClass(i);
Это фактически эквивалентно (*) для:
MyClass myObject(i);
Объявляет MyClass
объект с локальной областью («на стек»), а затем инициализирует память с помощью MyClass
конструктор.
myObject = new MyClass(int i);
Опять же, это недопустимое сочетание объявления и синтаксиса использования. Вы, вероятно, имел в виду:
int i = 42;
MyClass * myObject = new MyClass(i);
Это выделяет динамическую память («в куче») и строит MyClass
объект там.
Указатель на эту память/объект затем назначается myObject
, который имеет тип указателя к MyClass
.
В обоих случаях, конструктор инициализирует MyClass
объект в {некоторые ячейки памяти}. Какое местоположение зависит от контекста, в котором вызывается конструктор. Компилятор знает этот контекст и знает (как получить) адрес памяти во время выполнения.
Отвечая на добавленные вопросы (которые, собственно, должны быть отдельные вопросы):
1) Почему MyClass myObject = MyClass(i);
Это фактически эквивалентно: MyClass myObject(i);
Это выглядит как вызов конструктора, создающий временный объект MyClass
w hich затем назначается (operator=()
) на myObject
.
Но это не так, потому что это было бы просто глупо.
С myObject
- объект присвоенного - это создано этим утверждением, и временно не будет существовать после этого заявления, стандарт C++ позволяет «временный» MyClass
объект должен быть создан на месте от myObject
от конструктора (*), избегая дублирования усилий по строительству/назначению/разрушению временного.
(. Механик, что C++ 11 расширен до любого вида временных, таким образом, с пришествием "двигаться" семантика и &&
RValue ссылки)
Рассмотрим:
#include <iostream>
class MyClass
{
public:
MyClass(int i) : member(i) { std::cout << "const\n"; }
~MyClass() { std::cout << "dest\n"; }
MyClass & operator=(MyClass const & other) { std::cout << "assign\n"; }
private:
int member;
};
int main()
{
MyClass x = MyClass(42);
}
Это будет печатать:
не
const
dest
Существует нет задницы ignment.
2) В этом случае «=» является оператором = (перегруженным)?
Нет. Как я уже говорил, это конкретное заявление эквивалентно MyClass myObject(i)
- никакого назначения не происходит, просто на месте строительства.
3) Не могли бы вы написать эквивалентный код для генерируемых компилятором операций?
Я не думаю, что вы узнаете многое, посмотрев на разборку. И вообще, ваш компилятор лучше, чем я. (Или вы находитесь.)
4) Какую роль выполняет копия-конструктор (MyClass myObject = MyClass (i);)?
Роль? Я понятия не имею, что вы имеете в виду.
(*): Как RICi правильно указал, что делает этот copy elision эквивалент только правовой если видимый конструктор копирования/перемещения существует.
Это не скомпилируется, поскольку 'myObject' не имеет типа, и ваш вызов c'tor неверен. Если вы идиоматичны, вы должны написать 'MyClass myObject (i);'. – StoryTeller
Этот код является незаконным. Так что код в вашем списке других примеров. Возможно, вы имеете в виду 'int i = 0; MyClass myObject = MyClass (i); 'или что-то еще. Здесь важны детали. Вернитесь к своему компилятору и убедитесь, что код, который вы публикуете, на самом деле является кодом, который вы скомпилировали. –
После того, как вы изменили свой код, он по-прежнему недействителен. Я не уверен, каков ваш вопрос. Компилятор знает, что делать, потому что есть стандарт, и он контролирует, где и когда он выделяет вещи. – TartanLlama