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

механизм присваивания в С++ - C++

Восстановить пароль Регистрация
 
2048tb
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 4
19.03.2013, 16:08     механизм присваивания в С++ #1
Доброго времени суток всем.
Объясните почему при присвоении создается копия присваиваемого объекта.
C++
1
2
3
Cat Frisky(1,2);
Cat Tom(2,5);
Frisky = Tom;
вывод программы:

calling ctor
calling ctor
calling operator =
calling copy ctor
calling dctor
calling dctor
calling dctor


реализация класса
Кликните здесь для просмотра всего текста

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
27
28
29
30
31
32
33
34
35
36
37
Cat(int age, int weight): itsAge(new int(age)), itsWeight(new int(weight))
{cout << "calling ctor" << endl;}
 
Cat::Cat(const Cat & rhs)
{
    cout << "calling copy ctor" << endl;
    itsAge = new int;
    itsWeight = new int;
    *itsAge = rhs.getAge();
    *itsWeight = rhs.getWeight();
}
Cat Cat:: operator=(const Cat &rhs )
{
    cout << "calling operator =" << endl;
    /*
        if(this == rhs )
        {
            return *this;
        }
    */
    delete itsAge;
    delete itsWeight;
    itsAge = new int;
    itsWeight = new int;
    *itsAge = rhs.getAge();
    *itsWeight = rhs.getWeight();
    return *this;
}
 
Cat::~Cat(void)
{
    cout << "calling dctor " << endl;
    delete itsAge;
    itsAge = 0;
    delete itsWeight;
    itsWeight =0;
}


З.ы

чем отличается this от *this
ссылка и сам оъбект?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2013, 16:08     механизм присваивания в С++
Посмотрите здесь:

C++ Механизм перегрузки
Механизм прерывания ввода C++
механизм перегрузки функций C++
C++ Механизм замещения
C++ Механизм перегрузки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.03.2013, 16:10     механизм присваивания в С++ #2
Цитата Сообщение от 2048tb Посмотреть сообщение
почему при присвоении создается копия присваиваемого объекта.
потому что у тебя из operator=() объект возвращается по значению, т.е. копируется.

Добавлено через 26 секунд
Цитата Сообщение от 2048tb Посмотреть сообщение
чем отличается this от *this
ссылка и сам оъбект?
указатель и разыменованный указатель (т.е. сам объект).
2048tb
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 4
19.03.2013, 16:12  [ТС]     механизм присваивания в С++ #3
спасибо буду разбираться. Надо перерыв сделать.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.03.2013, 16:13     механизм присваивания в С++ #4
зря закоментировал
C++
1
2
3
4
5
6
    /*
        if(this == rhs )
        {
            return *this;
        }
    */
это нужная проверка. Только сравнивать надо адрес rhs с this, а не объект с указателем.
2048tb
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 4
19.03.2013, 16:23  [ТС]     механизм присваивания в С++ #5
я знаю но сначала нужно перегрузить ==
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.03.2013, 16:31     механизм присваивания в С++ #6
Цитата Сообщение от 2048tb Посмотреть сообщение
я знаю но сначала нужно перегрузить ==
нет, в данном случае нужно проверять адреса
C++
1
2
3
4
if(this == &rhs )
{
    return *this;
}
вот так будет правильно и перегрузка опреатора == в данном случае не нужна.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2013, 20:05     механизм присваивания в С++
Еще ссылки по теме:

Конструкторы и механизм return C++
C++ Механизм сообщений в QNX
C++ Механизм виртуальных функций

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

Или воспользуйтесь поиском по форуму:
2048tb
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 4
19.03.2013, 20:05  [ТС]     механизм присваивания в С++ #7
Спасибо большое.
Я еще ни как не могу привыкнуть к ссылкам и указателям.

Я изменил реализацию класса. Он теперь возвращает ссылку, а не значение. Разбираюсь что это даст.

C++
1
Cat &Cat:: operator=(const Cat &rhs )
Добавлено через 17 минут
Очевидно все таки при присвоении следует возвращать ссылку. Лишний конструктор не вызывается, да и без ссылки не возможно множественное присвоение - а = б =с.
Yandex
Объявления
19.03.2013, 20:05     механизм присваивания в С++
Ответ Создать тему
Опции темы

Текущее время: 09:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru