2016-02-15 2 views
-3

Например у меня есть строка кода:
C++ Compiler фон construting объектов

Отредактировано:

MyClass myObject = MyClass(5); 

Здесь конструктор MyClass MyClass() будет вызываться. Он принимает параметр и делает то, что suposed .. Но я этот пример myObject не является ссылкой - это фактический объект. Итак, как это делает компилятор: построить объект по конструктору MyClass, который не знает местоположение фактического объекта (говоря, что я имею в виду адрес в ОЗУ на стеке). же вопрос относится и к другим примерам (MyObject = новый MyClass (5) ;, MyObject (5) и т.д.)

EDIT
1) Почему MyClass myObject = MyClass(i); Это фактически эквивалентно: MyClass myObject(i);
2) Является ли в этом случае «=» является оператором = (перегруженным)?
3) Можете ли вы написать эквивалентный код для генерируемых компилятором операций?
4) Какую роль здесь выполняет копия-конструктор (MyClass myObject = MyClass(i);)?

+0

Это не скомпилируется, поскольку 'myObject' не имеет типа, и ваш вызов c'tor неверен. Если вы идиоматичны, вы должны написать 'MyClass myObject (i);'. – StoryTeller

+4

Этот код является незаконным. Так что код в вашем списке других примеров. Возможно, вы имеете в виду 'int i = 0; MyClass myObject = MyClass (i); 'или что-то еще. Здесь важны детали. Вернитесь к своему компилятору и убедитесь, что код, который вы публикуете, на самом деле является кодом, который вы скомпилировали. –

+1

После того, как вы изменили свой код, он по-прежнему недействителен. Я не уверен, каков ваш вопрос. Компилятор знает, что делать, потому что есть стандарт, и он контролирует, где и когда он выделяет вещи. – TartanLlama

ответ

2
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 эквивалент только правовой если видимый конструктор копирования/перемещения существует.

+1

Все, что сказано, есть * время и место для изучения мелкого шрифта и подробностей всего этого, но, судя по вашему вопросу, я подозреваю, что вы должны придерживаться «он просто работает» на данный момент. Изучите правильный синтаксис, просто * используйте * то, что дает вам язык. Сначала научитесь * ездить * на машине, а что «сцепление» и «коробка передач» на самом деле * делает *, прежде чем пытаться понять, как они на самом деле работают *. Никакое преступление не предназначено, но вы сейчас находитесь в школе вождения; не пытайтесь разобрать все. ;-) – DevSolar

+0

Я был так пропущен. Я работаю со встроенными системами уже пару лет. Кроме того, я изучаю архитектуру ARM и технические спецификации и функции инструментальных средств на глубоком уровне. У меня очень сильный фон в C progr. и теперь я нахожусь на C++. Когда у меня есть свободное время, я стараюсь понять это гораздо глубже, чем просто «он просто работает». Ненавижу, когда отношение людей такое. Я действительно ненавижу это. Мой вопрос был гораздо глубже, чем этот ответ от DevSolar. Моя ошибка заключалась в том, что я поспешил опубликовать сообщение, а не проверять, что я сделал эту простую глупую ошибку в коде, что привело к этому дискомфорту. –

+0

@ KarolisMilieška: Тогда, пожалуйста, улучшите свой вопрос, поэтому я могу улучшить свой ответ. Как бы то ни было, трудно сказать, что вы хотите знать, помимо того, что я написал в своем ответе. Я ненавижу это отношение, я действительно ненавижу его, когда люди не удосуживаются написать * хороший * вопрос, а затем жалуются, если * хороший * ответ на их * плохой вопрос не удовлетворяет, потому что мои навыки чтения хрустального мяча не удались правильно оценивать свой опыт, набор навыков, * и фактический вопрос *. – DevSolar