Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Создания временных объектов.  (Прочитано 13845 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mongol
Гость
« : 01-02-2010 14:29 » 

Заинтересовался что происходит при выполнении вот такого кода.
MyClass object = MyClass();
MyClass object2 = MyClass(value);
MyClass object3 = MyClass(object);
Конструктор по умолчанию (с параметрами,  копирования) создает временный объект, после чего создается объект с именем object (2, 3)и на следующем шаге выполняется метод  object.operator=(tempObject);?

Для проверки написал код:
Код:
#include <iostream>
#include <string>

class MyClass
{
    public:
MyClass()
: _name("default object")
{
    cout << "Object \'" << _name << "\' was created." << endl;
}
MyClass(string name)
: _name(name)
{
    cout << "Object \'" << _name << "\' was created." << endl;
}

~MyClass()
{
    cout << "Object \'" << _name << "\' was destroyed." << endl;
}

MyClass(const MyClass& val)
{
    cout << "Copy of object \'" << val._name << "\' was created." << endl;
    _name = "Copy of " + val._name;
}

MyClass& operator=(const MyClass& val)
{
    cout << "Object \'" << val._name << "\' was assigned to object " << _name << endl;
    _name = val._name;
    return *this;
}

    private:
string _name;
};

int main(int argc, char** argv)
{
    cout << "----------------------------------------------------------------------------" << endl;
    {
MyClass object1 = MyClass();
cout << "----------------------------------------------------------------------------" << endl;
MyClass object2 = MyClass("object2");
cout << "----------------------------------------------------------------------------" << endl;
MyClass object3 = MyClass(object1);
cout << "----------------------------------------------------------------------------" << endl;
    }
    cout << "----------------------------------------------------------------------------" << endl;
    cout << "           Creating an temporary object and assigning it to other object." << endl;
    cout << "----------------------------------------------------------------------------" << endl;
    {
MyClass temp("temp");
cout << "----------------------------------------------------------------------------" << endl;
MyClass temp2("temp2");
cout << "----------------------------------------------------------------------------" << endl;
temp2 = MyClass(temp);
    }
   
    return 0;
}


Код:
----------------------------------------------------------------------------
Object 'default object' was created.                                       
----------------------------------------------------------------------------
Object 'object2' was created.                                               
----------------------------------------------------------------------------
Copy of object 'default object' was created.
----------------------------------------------------------------------------
Object 'Copy of default object' was destroyed.
Object 'object2' was destroyed.
Object 'default object' was destroyed.

----------------------------------------------------------------------------
           Creating an temporary object and assigning it to other object.
----------------------------------------------------------------------------
Object 'temp' was created.
----------------------------------------------------------------------------
Object 'temp2' was created.
----------------------------------------------------------------------------
Copy of object 'temp' was created.
Object 'Copy of temp' was assigned to object temp2
Object 'Copy of temp' was destroyed.
Object 'Copy of temp' was destroyed.
Object 'temp' was destroyed.

Объясните почему предположения о временном объект не подтвердились
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 01-02-2010 17:28 » 

Код:
MyClass object = MyClass();
происходит вот что:
Код:
MyClass object(MyClass());


Код:
MyClass object2 = MyClass(value); 
происходит вот что:
Код:
MyClass object2(MyClass(value)); 

Код:
MyClass object3 = MyClass(object); 
происходит вот что:
Код:
MyClass object3(MyClass(object)); 

Улыбаюсь

А оператор = тут не был задействован вообще.
(хотя, вру, был, вот в этой строчке
Код:
_name = "Copy of " + val._name;
)
« Последнее редактирование: 01-02-2010 17:29 от Алексей1153++ » Записан

Mongol
Гость
« Ответ #2 : 01-02-2010 17:59 » 

Почему в таком случае конструктор не вызываеТСя по два раза?
« Последнее редактирование: 01-02-2010 18:08 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 01-02-2010 18:17 » 

вызываются разные конструкторы же -

Код:
   MyClass object(MyClass());

сначала дефолтный

MyClass::MyClass()

затем копирования

MyClass::MyClass(const MyClass& val)


Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 01-02-2010 18:25 » 

со случаем
MyClass object = MyClass();
я слегка наврал, это означает просто вызов дефолтного конструктора для объекта. То есть инициализация и всё.

Записан

Mongol
Гость
« Ответ #5 : 01-02-2010 21:03 » 

Цитата
вызываются разные конструкторы же -
Это имееться в виду при ?
Код:
MyClass object2 = MyClass(value);
MyClass object3 = MyClass(object);
Если отввет да, то это как раз то что я не могу понять,. Ведь программа выводит информацию о срабатывании только одного конструктора для каждого случая
----------------------------------------------------------------------------
Object 'default object' was created. 
----------------------------------------------------------------------------
Object 'object2' was created. --->> MyClass object2(MyClass(value));
----------------------------------------------------------------------------
Copy of object 'default object' was created. --->> MyClass object3(MyClass(object));
----------------------------------------------------------------------------

Код:
MyClass object = MyClass(); 
  аналогично
Код:
MyClass object;
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 01-02-2010 22:22 » 

Код:
MyClass object = MyClass(); 
 аналогично
Код:
MyClass object;
точно Улыбаюсь

Во второй строке вызывается ctor по умолчанию - что-то ведь надо вызвать. А в первой строчке ты явно указываешь, какой именно ctor надо вызвать для инициализации объекта.

Конструктор всегда вызывается один раз для объекта (и деструктор тоже).
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 02-02-2010 04:58 » 

ИМХО, компилятор может опустить все временные объекты и свести всё это к:
Код:
MyClass object;
MyClass object2(value);
MyClass object3(object);

Mongol, что за компилятор?

у меня в VS2003 вот такой результат:
Код:
----------------------------------------------------------------------------
Object 'default object' was created.
----------------------------------------------------------------------------
Object 'object2' was created.
Copy of object 'object2' was created.
Object 'object2' was destroyed.
----------------------------------------------------------------------------
Copy of object 'default object' was created.
----------------------------------------------------------------------------
Object 'Copy of default object' was destroyed.
Object 'Copy of object2' was destroyed.
Object 'default object' was destroyed.
----------------------------------------------------------------------------
           Creating an temporary object and assigning it to other object.
----------------------------------------------------------------------------
Object 'temp' was created.
----------------------------------------------------------------------------
Object 'temp2' was created.
----------------------------------------------------------------------------
Copy of object 'temp' was created.
Object 'Copy of temp' was assigned to object temp2
Object 'Copy of temp' was destroyed.
Object 'Copy of temp' was destroyed.
Object 'temp' was destroyed.
Записан

Странно всё это....
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 02-02-2010 06:20 » 

g++ 4.4.1:
Код:
----------------------------------------------------------------------------
Object 'default object' was created.
----------------------------------------------------------------------------
Object 'object2' was created.
----------------------------------------------------------------------------
Copy of object 'default object' was created.
----------------------------------------------------------------------------
Object 'Copy of default object' was destroyed.
Object 'object2' was destroyed.
Object 'default object' was destroyed.
----------------------------------------------------------------------------
           Creating an temporary object and assigning it to other object.
----------------------------------------------------------------------------
Object 'temp' was created.
----------------------------------------------------------------------------
Object 'temp2' was created.
----------------------------------------------------------------------------
Copy of object 'temp' was created.
Object 'Copy of temp' was assigned to object temp2
Object 'Copy of temp' was destroyed.
Object 'Copy of temp' was destroyed.
Object 'temp' was destroyed.
Записан
Mongol
Гость
« Ответ #9 : 02-02-2010 08:24 » 

Цитата
у меня в VS2003 вот такой результат:
Код:
Object 'object2' was created.
Copy of object 'object2' was created.
Object 'object2' was destroyed.
Цитата
g++ 4.4.1:
Код:
Object 'object2' was created.
1. Получается что g++  оптимизирует эту операцию и вместо вызова 2х конструкторов срабатывает только один?
2. Как отключить оптимизацию?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 02-02-2010 08:44 » 

а зачем? обычно её включают Улыбаюсь
-O0 если мы говорим о gcc, если билдер, то поищи в настройках проекта
Записан

Странно всё это....
Mongol
Гость
« Ответ #11 : 02-02-2010 08:52 » 

Хочу отключить  и убедиться что будут вызываться по два конструктора.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #12 : 02-02-2010 11:49 » 

Mongol, собери в дебаге, там точно отключена
Записан

Странно всё это....
Mongol
Гость
« Ответ #13 : 02-02-2010 14:23 » 

в дебаге, это как?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #14 : 03-02-2010 05:05 » 

в дебаге, это как?
Улыбаюсь)

если мы говорим про gcc, то:
1. включить включение отладочной инфы в код
-g0 - нет инфы
-g1 - по минимуму
-g2 - еще немного
-g3 - по максимуму

2. отключить опции оптимизации

в билдере, где должен быть пункт для выбора режима сборки (последний раз запускал 6-й билдер уже не помню как и чего)
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 04-02-2010 10:13 » new

в билдере, где должен быть пункт для выбора режима сборки (последний раз запускал 6-й билдер уже не помню как и чего)

В настройках проекта (Ctrl+Shift+F11) - две большие кнопки преднастроек: Debug и Release.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines