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

Перегрузка оператора присваивания - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
18.10.2012, 20:26     Перегрузка оператора присваивания #1
Добрый вечер ! Нужна помощь по небольшому теоретико-практическому вопросу. Опять же вопрос по примеру из книги Шилдта С++ Базовый курс. Пример: Перегружаем операторы присваивания:

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
class str_type {
     char string[80];
public: 
      //...........
      str_type operator=( char *str); // Присваиваем строку с завершающим нулем объекту типа str_type
      str_stype operator=(str_stype str); // Присваиваем один объект типа str_type другому
};
//........Собственно их код
 
// 1.Присваиваем один  объект типа str_type другому
 
str_type str_type::operator=(str_type str)
{
      strcpy(string, str.string);
      return *this;
}
 
// 2.Присваиваем строку с завершающим нулем объекту типа str_type
 
str_type str_type::operator=(char *str)
{
      str_type temp;
 
      strcpy(string, str);
      strcpy(temp.string, str);
      return temp;
}

Развернутый вопрос:
Что я знаю об операторе присваивания: Оператор присваивания должен модифицировать один из своих аргументов. Так как у нас ф-ия operator=() вызывается объектом левостоящим от оператора "=", значит он и должен модифицироваться в результате операции. То есть у нас левостоящий объект вызывает функцию , и передается ей неявно через указатель this. Здесь его нет ( в книге Шилдт тоже не использовал практически его в примерах), но как я понимаю запись:
C++
1
2
strcpy(string, str.string);
      return *this;
эквивалентна записи:
C++
1
2
strcpy(this->string, str.string);
      return *this;
Таким образом, по первому случаю (1.Присваиваем один объект типа str_type другому) у меня вопросов нет, здесь член str.string копируется в вызвавший функцию левый параметр с помощью указателя this. До этого так и переружали во всех примерах оператор "=".

Но вот во 2-ом варианте перегрузки оператора "=" (2.Присваиваем строку с завершающим нулем объекту типа str_type) все не очень понятно)). Получается, что здесь мы создаем временный объект , который и возвращаем. Получается , что в итоге этот (2 вариант перегрузки) не будет модифицировать левостоящий параметр (в чем собственно суть присваивания), а просто мы получим результат операции
C++
1
return temp
. (результат аналогичный например операции сложения а+б=с)

Внимание уточненные вопросы ::

1) Зачем мы создаем (в случае 2-ого варианта перегрузки оператора "=" ) временный объект temp;

2)Действительно ли этот 2-ой вариант перегрузки оператора "=" не будет модифицировать значение левостоящего параметра;

3)Почему 2-ой вариант перегрузки оператора "=" нельзя было сделать по аналогии с 1-ым вариантом перегрузки оператора "=";


Заранее огромное спасибо за ответы!!!!!!

Добавлено через 34 минуты
Сможет кто-нибудь помочь?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
19.10.2012, 03:37     Перегрузка оператора присваивания #2
C++
1
2
3
4
5
6
7
str_type str_type::operator=(char *str)
{
      str_type temp; 
      strcpy(string, str);
      strcpy(temp.string, str);
      return temp;
}
Сначала создастся объект temp, в который будет скопирована строка str
Теперь о главном.
При выполнении
C++
1
return temp;
будет вызван конструктор копирования и новый объект будет сделан по образу и подобию объекта temp.
После чего объект temp выйдет из области видимости.

Добавлено через 55 минут
А в этой стречке, собственно изменяется объект this
C++
1
strcpy(string, str);
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2012, 04:07     Перегрузка оператора присваивания #3
Цитата Сообщение от Артем Смирнов Посмотреть сообщение
Нужна помощь по небольшому теоретико-практическому вопросу.
не вижу в приведенном коде ни одного правильного оператора присваивания, если этот код полностью и без изменений взят из книги то рекомендую сменить книгу
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
19.10.2012, 04:09     Перегрузка оператора присваивания #4
Цитата Сообщение от Jupiter Посмотреть сообщение
не вижу в приведенном коде ни одного правильного оператора присваивания, если этот код полностью и без изменений взят из книги то рекомендую сменить книгу
Присоединяюсь.
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
19.10.2012, 06:59  [ТС]     Перегрузка оператора присваивания #5
Как сменить ? я ее прочел уже , осталось 50 стр.)) Это же Шилдт Г. (издание свежее-2010 г.) , ее всем советуют; у нас в вузе ее по ПЯВУ рекомендовали, вот я и читал ( ее в том числе ). Вот сканы страниц прикладываю , но я пример вроде правильно перепечатал. То есть я мог получить что ли больше вреда, прочитав ее?
Миниатюры
Перегрузка оператора присваивания   Перегрузка оператора присваивания  
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
19.10.2012, 07:18  [ТС]     Перегрузка оператора присваивания #6
Croessmah, А ну да , действительно почему в этом примере нет конструктора копии тогда, если ф-ия возвращает объект (до этого в этой книге они использовались).

А если такой вариант сделать:
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
class str_type {
     char string[80];
public: 
      //...........
      str_type& operator=(const char *str); // Присваиваем строку с завершающим нулем объекту типа str_type
      str_type& operator=(const str_stype &str); // Присваиваем один объект типа str_type другому
};
//........Собственно их код
 
// 1.Присваиваем один  объект типа str_type другому
 
str_type& str_type::operator=(const str_type &str) //обрати внимание на const и на & в возвращаемом значении
{
      strcpy(string, str.string);
      return *this;
}
 
// 2.Присваиваем строку с завершающим нулем объекту типа str_type
 
str_type& str_type::operator=(const char *str) //обрати внимание на const и на & в возвращаемом значении
{
      strcpy(string, str);
      return *this;
}
Он корректен?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2012, 14:32     Перегрузка оператора присваивания
Еще ссылки по теме:

C++ Перегрузка оператора присваивания
Конструктор копирования и перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания = (найти ошибку в коде)

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
19.10.2012, 14:32     Перегрузка оператора присваивания #7
В данном примере хватит конструктора по умолчанию.
Yandex
Объявления
19.10.2012, 14:32     Перегрузка оператора присваивания
Ответ Создать тему
Опции темы

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