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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Как вставить элемент в массив? Код написал, но не до конца) http://www.cyberforum.ru/cpp-beginners/thread674446.html
Как вставить элемент в массив? Код написал, но не до конца) #include <iostream> #include <locale.h> using namespace std; int main() { setlocale(LC_ALL,"ukrainian"); int n, a, x; cout << "Введiть розмiр масива: "; cin >> n; cout << endl;
C++ в общих чертах представляю,но как это реализовать? Ввести строку, заменить интервалы между словами на 2 пробела. http://www.cyberforum.ru/cpp-beginners/thread674439.html
C++ Ошибка в коде, по массивам
#include <iostream> #include <string> #include <cstring> using namespace std; int main() { char array1; char array2; int lenghtArray1; int number=0; cout<<"Enter the your message\n";
Составить регулярное выражение, пропускающее строки, являющиеся целыми числами в заданном диапазоне C++
Ребя помогите пожалуйста. Я ничего не понимаю из того что ниже написано, а лабораторную по теории автоматов сдать надо! Для каждого из заданий необходимо подобрать по 10 примеров - удовлетворяющих условию и не удовлетворяющих. Примеры можно поместить в текстовый файлик, и программа должна будет его зачитать. Рекомендуется использовать для каждой строки функцию Regex.IsMatch(“^(…)$”) – где...
C++ Поменять местами первый и последний элемент массива (исправить код) http://www.cyberforum.ru/cpp-beginners/thread674412.html
Почему массив не не меняет первый и последний элемент местами? #include <iostream> #include <locale.h> using namespace std; int main() { setlocale(LC_ALL,"ukrainian"); int n, a, x; cout << "Введiть розмiр масива: ";
C++ Предупреждения компилятора об использовании неинициализированных переменных #include <stdio.h> #include <conio.h> #include <time.h> #include <stdlib.h> #define n 5 #define m 5 #define p 5 #define q 5 const int N = 20; подробнее

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

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 минуты
Сможет кто-нибудь помочь?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 14:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru