Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
OMGHero
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
#1

Почему создаются новые объекты? - C++

19.02.2011, 01:03. Просмотров 1248. Ответов 21
Метки нет (Все метки)

Всем доброго времени суток!
Я не могу понять где создаются новые объекты
Есть у меня простенький класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class data 
{
    char* str;
public:
    data(): str("Hi")
    {}
    data(char* ch): str(ch)
    {}
    void setData(char* ch)
    {
        str = ch;
    }
    void printData()
    {
        cout << str << endl;
    }
    virtual ~data ()
    {
        cout << "data deleted\n";
    }
    data& operator= (data& v)
    {
        str = v.str;
        return *this;
    }
};
Обратите внимение на перегруженный оператор = . Если я возвращаю ссылку на data (как в коде), то при присваивании одго экземпляра класса другому, деструктор ничего не пише мне в консоль. Если я возвращаю просто data
C++
1
2
3
4
5
    data operator= (data& v)
    {
        str = v.str;
        return *this;
    }
то при присваивании в консоле дает о себе знать деструктор.
Зачем компилятор создет еще один экземпляр класса data что бы просто передать *this ?
Если кто понимает, то объясните пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2011, 01:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему создаются новые объекты? (C++):

Создаются одинаковые объекты - C++
Доброго времени суток. Начал изучать ООП и столкнулся с проблемой. Пишу класс работы с матрицами. Имеется такой конструктор: ...

Классы: Не создаются объекты класса Apple - C++
Includes.h #include &lt;stdlib.h&gt; #include &lt;gl\glut.h&gt; #include &lt;math.h&gt; #include&lt;stdio.h&gt; #include&lt;time.h&gt; #include&lt;stdio.h&gt; ...

Объекты каких потоков автоматически создаются при запуске программы - C++
Здраствуйте, могу конечно немного переврать вопрос, но звучит примерно так: Объекты каких потоков автоматически создаются при запуске...

Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса - C++
Цель: Получить практические навыки реализации классов на С ++. Основное содержание работы Написать программу, в которой создаются и...

Написать программу, в которой создаются и уничтожаются объекты класса "Library", определенного пользователем - C++
Здравствуйте. Помогите пожалуйста. Написать программу, в которой создаются и уничтожаются объекты класса, определенного пользователем....

Почему при программировании C++/Win32 создаются элементы старого вида? - C++
И снова всем здравствуйте!!! Я продолжаю грызть гранит программирования на C++ В общем проблема следующая при создании приложения Win32 в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OMGHero
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
19.02.2011, 14:33  [ТС] #16
silent_1991, не могли бы вы дать ссылку на мануал где этот трассировщик в visual studio. я его до этого никогда не использовал. В гугле Ip трассировщики вылазают
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.02.2011, 14:40 #17
OMGHero, вы просто жмёте F10 или F11 и пошагово прогоняете программу. Внизу появится окно трассировки с отображением значений всех переменных, а маркер будет указывать на строку, которая выполняется. При этом F10 - шаг с обходом (например, пропуск функции, т.е. функция фактически будет вызвана и выполнена, но отображено это не будет и произойдёт переход на следующую строку), а F11 - шаг с заходом - подробная трассировка, будет выполнен заход всюду, куда только можно.
0
OMGHero
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
19.02.2011, 14:47  [ТС] #18
Цитата Сообщение от silent_1991 Посмотреть сообщение
вы просто жмёте F10 или F11 и пошагово прогоняете программу. Внизу появится окно трассировки с отображением значений всех переменных, а маркер будет указывать на строку, которая выполняется. При этом F10 - шаг с обходом (например, пропуск функции, т.е. функция фактически будет вызвана и выполнена, но отображено это не будет и произойдёт переход на следующую строку), а F11 - шаг с заходом - подробная трассировка, будет выполнен заход всюду, куда только можно.
а как увидеть какие объекты создаются ? например как увидеть какой объект создается при возврате функцией *this ?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.02.2011, 14:52 #19
OMGHero, ну это ведь временный объект, имени у него нет. Потому он не будет отображаться в списке переменных. Но по-моему и так понятно, что это тот самый временный объект, который возвращается в точку вызова (потому что он удаляется после вызова return, но до выхода из функции).
0
OMGHero
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
19.02.2011, 15:00  [ТС] #20
silent_1991, Вот результат вашего кода у меня. Наверное разница в компиляторах, может мой что-то соптимизировал и не стал создавать еще один объект. Пользуюсь Visual Studio 2010

Код
Hello
World
data deleted
World
World
data deleted
data deleted
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.02.2011, 15:05 #21
OMGHero, хаааа. Переключил сборку на релизную - результат как у вас. Переключился обратно на дебажную - снова дважды вызывается деструктор... Видать для большей информации в дебажной сборке действительно все действия выполняются как надо, а в релизной всё оптимизируется по полной и оказывается, что без чего-то можно обойтись.
1
OMGHero
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
19.02.2011, 15:08  [ТС] #22
даа, переключил на дебажный режим - появилось две строчки =)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2011, 15:08
Привет! Вот еще темы с ответами:

Почему лучше инициализировать объекты класса во время инициализации конструктора? - C++
Имеется класс Rnd: class Rnd { public: Rnd::Rnd(int x); private: int val; };

Список указателей на авторские объекты, я могу воспользоваться только первым его элементом. Почему? - C++
Друзья! Короче создал ПРОСТОЙ класс всего с одним полем и функцией которая выводит значение этого поля. Создал массив из 2-х указателей на...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? - C++
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? - C++
Вопрос прост: как при выходе из функции сохранить объекты, которые были созданы в данной функции (указатели объектов положены в массив)?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.02.2011, 15:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru