Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка оператора присваивания, Теоретический вопрос по примеру из книги 
:(
    Опции темы
Artem7
Дата 18.10.2012, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 18.10.2012

Репутация: нет
Всего: нет



Добрый вечер ! Нужна помощь по небольшому теоретико-практическому вопросу. Опять же вопрос по примеру из книги Шилдта С++ Базовый курс. Пример: Перегружаем операторы присваивания:

Код

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. Здесь его нет ( в книге Шилдт тоже не использовал практически его в примерах), но как я понимаю запись:
Код

strcpy(string, str.string);
      return *this;


эквивалентна записи:

Код
strcpy(this->string, str.string);
      return *this;


Таким образом, по первому случаю (1.Присваиваем один объект типа str_type другому) у меня вопросов нет, здесь член str.string копируется в вызвавший функцию левый параметр с помощью указателя this. До этого так и переружали во всех примерах оператор "=". 

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

return temp;


(Результат аналогичный например операции сложения а+б=с)
Внимание уточненные вопросы ::

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

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

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


 Заранее огромное спасибо за ответы!!!!!!
PM MAIL   Вверх
bsa
Дата 18.10.2012, 20:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Честно говоря, пример несколько некорректен. Так как в первом случае тоже неявно создается временный объект перед вызовом оператора присваивания. Правильно делать только один оператор присваивания - объекта того же типа, что и присваивающий. А присваивание остальных реализовать через соответствующие конструкторы. Хотя, из правила могут быть исключения, например, в тех случаях когда операция собственно присваивания довольно затратная по ресурсам (например, копирования строки, как в твоем случае). Короче, код должен выглядеть примерно так:
Код
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;
}

PM   Вверх
volatile
Дата 19.10.2012, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Artem7 @  18.10.2012,  20:18 Найти цитируемый пост)
str_type str_type::operator=(char *str)
{
      str_type temp;
 
      strcpy(string, str);
      strcpy(temp.string, str);
      return temp;
}

Это кто Шилдт такую шнягу предлагает? smile 
Лучше бы он длину строки проверил, а не морочил новичкам голову с временными объектами... 

(впрочем вероятно это не Шилдт, а собсвенная версия ТС.)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.