Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 4

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

19.03.2013, 16:08. Показов 840. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем.
Объясните почему при присвоении создается копия присваиваемого объекта.
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
ссылка и сам оъбект?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.03.2013, 16:08
Ответы с готовыми решениями:

Механизм перегрузки
Ребят помогите. Нужно создать две версии функции, используя механимз перегрузки, заголовки у которых должны быть такими: №1 float F(float...

Механизм замещения
Привет ребят! Пишу наследование. Есть базовый абстрактный класс и два производных. Написала всего одну функцию print и не получается...

механизм наследования
Есть такой код: #include &lt;iostream&gt; using namespace std; class base { protected: int i, j; // private to base, but...

6
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
19.03.2013, 16:10
Цитата Сообщение от 2048tb Посмотреть сообщение
почему при присвоении создается копия присваиваемого объекта.
потому что у тебя из operator=() объект возвращается по значению, т.е. копируется.

Добавлено через 26 секунд
Цитата Сообщение от 2048tb Посмотреть сообщение
чем отличается this от *this
ссылка и сам оъбект?
указатель и разыменованный указатель (т.е. сам объект).
1
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 4
19.03.2013, 16:12  [ТС]
спасибо буду разбираться. Надо перерыв сделать.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
19.03.2013, 16:13
зря закоментировал
C++
1
2
3
4
5
6
    /*
        if(this == rhs )
        {
            return *this;
        }
    */
это нужная проверка. Только сравнивать надо адрес rhs с this, а не объект с указателем.
1
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 4
19.03.2013, 16:23  [ТС]
я знаю но сначала нужно перегрузить ==
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
19.03.2013, 16:31
Цитата Сообщение от 2048tb Посмотреть сообщение
я знаю но сначала нужно перегрузить ==
нет, в данном случае нужно проверять адреса
C++
1
2
3
4
if(this == &rhs )
{
    return *this;
}
вот так будет правильно и перегрузка опреатора == в данном случае не нужна.
1
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 4
19.03.2013, 20:05  [ТС]
Спасибо большое.
Я еще ни как не могу привыкнуть к ссылкам и указателям.

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

C++
1
Cat &Cat:: operator=(const Cat &rhs )
Добавлено через 17 минут
Очевидно все таки при присвоении следует возвращать ссылку. Лишний конструктор не вызывается, да и без ссылки не возможно множественное присвоение - а = б =с.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.03.2013, 20:05
Помогаю со студенческими работами здесь

Механизм перегрузки
Здравствуйте, помогите решить задачу. С помощью механизма перегрузки функций организовать сложение: а) числа с самим собой (один...

Механизм итерирования
доброго времени суток. наткнулся на такое задание, и ничего по нему не нашел, либо не то ищу. есть шаблонный класс реализующий множество на...

Операция присваивания
Чем отличается операция присваивания &quot;/=&quot; от &quot;=&quot; ?

Операция присваивания (=)
Добрый день, интересует вот что: правильно ли я считаю, что в int x = .0 + 1F + 4L; 1) Сперва все операнды сложения (по правую...

оператор присваивания
Привет всем ! Каким образом вызывается оператор присваивания, например, здесь: a = &quot;I &quot;; если в аргументе char*, а в...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ документа "ВыдачаОборудованияНаСпецтехнику" в. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru