Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Временные объекты, когда и где они создаются 
:(
    Опции темы
Mongol17
Дата 1.2.2010, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.11.2008

Репутация: нет
Всего: нет



Когда то, в некой статье встретил рядом с сточкой:
MyClass* ptrObject = new MyClass; 
//здесь, если я ничего не путаю, сначала выделяется память под объект MyClass,
//затем этот объект создается и затем адрес выделенной памяти сохраняется в указателе.
вот такую запись:
MyClass Object_1 =  MyClass(value);
из комментария следовало что в данном случаи будет создан временный объект, который будет скопирован в Object_1.
Для  проверки этого утверждения написал код:
Код

#include <iostream>

class MyClass 
{
public:
    MyClass()
    {
    std::cout << "MyClass::MyClass()" << std::endl;
    }
};

int main(int argc, char** argv) 
{
    std::cout << "--temp object--" << std::endl;
    MyClass();
    std::cout << "---------------" << std::endl;
    
    std::cout << "----object1----" << std::endl;
    MyClass object1;
    std::cout << "---------------" << std::endl;
    
    std::cout << "----object2----" << std::endl;
    MyClass object2 = MyClass();
    std::cout << "---------------" << std::endl;
}


и вот вывод программы...
Код

--temp object--
MyClass::MyClass()
---------------
----object1----
MyClass::MyClass()
---------------
----object2----
MyClass::MyClass()
---------------


прокомментируйте пожалуйста, создается ли при этом все таки временный объект или нет?
P.S. Что бы не отвлекать честной народ всякими такими мелочами, хотел бы посмотреть ассемблерный код. Но вот не знаю как это сделать(компилятор g++)
Думаю что и литература имеется, вопрос этот освещающая. Хотел бы имена авторов узнать
За ответы заранее все спасибо.
PM MAIL   Вверх
bsa
Дата 1.2.2010, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Создание ассемблерного кода:
Код
g++ -c -o file.s file.cpp
Твой пример толком не смотрел.
Когда ты не указываешь ключевое слово explicit у конструктора копирования, то операция MyClass s = MyClass(123); эквивалентна MyClass s(123). Так как ты не создал свой собственный конструктор копирования, то компилятор подставил стандартный, который пропускает создание временного объекта. Да и потом, когда ты пишешь MyClass s = MyClass(123), то вызывается конструктор копирования, а ты об этом даже и не узнаешь, так как он отработает молча. Короче, создай свой конструктор копирования и поэкспериментируй с explicit (указывается перед декларацией конструктора).
PM   Вверх
Mongol17
Дата 1.2.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.11.2008

Репутация: нет
Всего: нет



Код
g++ -c -o file.s file.cpp

в file.s -- формат отображения не читабельный.
Код

MyClass(const MyClass& other) : value(other.value)
{
    std::cout << "MyClass::MyClass(const MyClass&)" << std::endl;
}

Этот код я убрал с первого листинка так как он все равно не отрабатывался.  Пробовал добавлять explicit, видимых изменений не обнаружил.


Это сообщение отредактировал(а) Mongol17 - 1.2.2010, 10:21
PM MAIL   Вверх
mes
Дата 1.2.2010, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Mongol17 @  31.1.2010,  23:37 Найти цитируемый пост)
Думаю что и литература имеется, вопрос этот освещающая.

http://std.dkuug.dk/jtc1/sc22/open/n2356/special.html
->  12.2  Temporary objects 


--------------------
PM MAIL WWW   Вверх
bsa
Дата 1.2.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Mongol17 @  1.2.2010,  09:54 Найти цитируемый пост)
в file.s -- формат отображения не читабельный.
Попробуй добавить ключ -S.
Цитата(Mongol17 @  1.2.2010,  09:54 Найти цитируемый пост)
Пробовал добавлять explicit, видимых изменений не обнаружил.
Что-то я стормозил. конструктор копирования не нужно делать explicit. Иначе компилироваться не будет. Попробуй сделать два класса A и B, причем так, что B можно сконструировать из A. Затем выполни B b = A(). И поэкспериментируй с explicit у конструктора B(const A&). Кстати, не забудь определить оператор присваивания для класса B.
PM   Вверх
Леопольд
Дата 1.2.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(bsa @  1.2.2010,  12:26 Найти цитируемый пост)
Кстати, не забудь определить оператор присваивания для класса B. 

Не уверен что он нужен...


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
bsa
Дата 1.2.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Леопольд, он нужен для того, чтобы видеть, когда работает конструктор, а когда копирование через присваивание.
PM   Вверх
Mongol17
Дата 1.2.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.11.2008

Репутация: нет
Всего: нет



bsaМожно подробней, что кого, куда?
PM MAIL   Вверх
bsa
Дата 1.2.2010, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
class A
{
//...
};

class B
{
   B(){}
   explicit B(const A&);
   B& operator=(const B&);
};

int main()
{
   B b = A();
}

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0560 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.