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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
#1

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

18.10.2012, 20:26. Просмотров 2063. Ответов 6
Метки нет (Все метки)

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

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 минуты
Сможет кто-нибудь помочь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2012, 20:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора присваивания (C++):

Перегрузка оператора присваивания - C++
Добрый вечер. Есть задание: Нужно так перегрузить оператор =, чтобы можно было элементу одного класса, присваивать значение элемента...

Перегрузка оператора присваивания - C++
Задание простое: по заданному классу составить простую программу с использованием динамической памяти. class Cow { char name; ...

Перегрузка оператора присваивания - C++
Вот есть такой класс template<typename TT> class Matrix { public: ...

Перегрузка оператора присваивания - C++
Доброго времени суток всем! Никак не могу правильно написать перегрузку оператора присваивания. При создании одного нового элемента...

Перегрузка оператора присваивания - C++
Доброго времени суток! Возник вопрос по поводу перегрузки оператора присваивания. Пример перегрузки по канону: class Integer { ...

Перегрузка оператора присваивания - C++
MyArray& operator=( MyArray &arrInt2 ) //Зачем писать MyArray& operator?А почему не MyArray operator ? { delete ...

6
Croessmah
Эксперт CЭксперт С++
13411 / 7562 / 855
Регистрация: 27.09.2012
Сообщений: 18,612
Записей в блоге: 3
Завершенные тесты: 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);
1
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2012, 04:07 #3
Цитата Сообщение от Артем Смирнов Посмотреть сообщение
Нужна помощь по небольшому теоретико-практическому вопросу.
не вижу в приведенном коде ни одного правильного оператора присваивания, если этот код полностью и без изменений взят из книги то рекомендую сменить книгу
1
Croessmah
Эксперт CЭксперт С++
13411 / 7562 / 855
Регистрация: 27.09.2012
Сообщений: 18,612
Записей в блоге: 3
Завершенные тесты: 1
19.10.2012, 04:09 #4
Цитата Сообщение от Jupiter Посмотреть сообщение
не вижу в приведенном коде ни одного правильного оператора присваивания, если этот код полностью и без изменений взят из книги то рекомендую сменить книгу
Присоединяюсь.
1
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
19.10.2012, 06:59  [ТС] #5
Как сменить ? я ее прочел уже , осталось 50 стр.)) Это же Шилдт Г. (издание свежее-2010 г.) , ее всем советуют; у нас в вузе ее по ПЯВУ рекомендовали, вот я и читал ( ее в том числе ). Вот сканы страниц прикладываю , но я пример вроде правильно перепечатал. То есть я мог получить что ли больше вреда, прочитав ее?
0
Миниатюры
Перегрузка оператора присваивания   Перегрузка оператора присваивания  
Артем Смирнов
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;
}
Он корректен?
0
Croessmah
Эксперт CЭксперт С++
13411 / 7562 / 855
Регистрация: 27.09.2012
Сообщений: 18,612
Записей в блоге: 3
Завершенные тесты: 1
19.10.2012, 14:32 #7
В данном примере хватит конструктора по умолчанию.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2012, 14:32
Привет! Вот еще темы с ответами:

Перегрузка оператора присваивания - C++
При перегрузке оператора присвоения выдает ошибки cpp(58) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider...

Перегрузка оператора присваивания - C++
мне надо было реализовать конструкторы, деструктор, оператор присваивания, функции ввода / вывода объектов; кто сможет дописать...

Перегрузка оператора присваивания - C++
Приветствую всех. Не могли бы подсказать как переопределить оператор присваивания. То что искал, так там написано в общем о...

Перегрузка оператора присваивания в строке - C++
Всем привет, задание в вузе дали, пытаюсь понять правильно ли я сделал его Ввести с клавиатуры строку  символов . Признак окончания...


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

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

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