Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Организация зап... 64601
Создание потоко... 61593
Модуль Forms 61229
Создание отчето... 61174
ТЕХНОЛОГИИ ДОСТ... 57621
Пример работы с... 55124
Имитационное мо... 53014
Реклама
Сейчас на сайте
Гостей: 5
На сайте нет зарегистрированных пользователей

Пользователей: 13,067
новичок: senata7
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных студентов на Delphi (файл записей) + Блок схемы
Обратное размещение элементов ЭВС на Delphi + Пояснительная записка
Моделирование круглосуточного интернет кафе на GPSS + Отчет

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Реализация операции сложения с присваиванием
Единственный вопрос, который пока не ясен: что возвращать в качестве результата. Попробуем возвращать значение. Тогда внешнее определение метода будет таким, как показано в листинге 3.4.

Листинг 3.4. Реализация операции сложения с присваиванием
TMoney TMoney::operator+=(const TMoney &b) { Summa += b.Summa; return *this;
}



В качестве результата возвращается текущий объект. Проверим теперь различные варианты использования операции. Простой однократный вариант, естественно, работает правильно:
TMoney t(2), р(3.12), s; t+=p; t .DisplayMoneyO ;



При выполнении этого фрагмента мы получим на экране сумму t и р. Однако встроенная операция допускает запись следующего вида:
t+=b+=c;



При этом переменной b присваивается сумма переменных b и с, а в переменную t попадает сумма прежнего значения t и нового значения Ь. Проверим нашу операцию на многократность присваивания — оказывается не все так просто. Для сравнения покажем работу встроенной операции с целыми числами:
TMoney t(2.ee). rr(0);
rr+=t+=t; // должно быть t = 4.96, rr = 4.66
rr.DisplayMoneyO; // выводит 4.66
t.DisplayMoneyO; // выводит 4.66
t = 2; rr = 6;
(rr+=t)+=t; // должно быть t = 4.60, rr = 4.66
rr.DisplayMoney(); // выводит 2.66
t.DisplayMoneyO; // выводит 2.66
int a = 6, d = 2;
(a+=d)+=d; // должно быть d = 2,a = 4
cout << a << endl; // выводит 4
cout << d << endl; // выводит 2



Как видим, наша операция выполняется не так, как встроенная: значение самой правой переменной в левую переменную не попадает, если слева стоят скобки. При этом выражение без скобок работает совершенно правильно:
rr+=t+=t; // rr должно стать 4.66



Это и понятно: операция += выполняется справа налево, поэтому сначала вычисляется выражение t+=?t, а потом полученное значение попадает в гг.
Чтобы разобраться в проблеме, вернемся к проблемному выражению:
(rr+=t)+=t;



Давайте перепишем его в функциональной форме:
(rr.operator+=(t)).operator+=(t);



Сначала выполняется операция в скобкахзначение переменной t прибавляется к гг. Результатом операции в скобках является значение, помещаемое в переменную гг. Поэтому создается анонимный временный объект, с которым выполняется правая операция. Чтобы результат попадал в самую левую переменную, результатом операции должна быть ссылка. Таким образом, выражение (а+=Ь) может стоять в левой части другой операции +=. Такие выражения в С++ называются левосторонними значениями, или 1-значениями (1-value). Хотя в стандарте (см. п.- 3.10 в [1]) этому понятию уделено более страницы, нам достаточно понять, что любое выражение, которое может стоять слева от знака любой операции присваивания, называется 1-значением. Соответственно, выражение, которому нельзя присвоить и которое может стоять только справа от знака операции присваивания, называется г-значением (r-vaiue).
Программистам часто нужны качественные принтеры для того что бы распечатывать документацию. Для этого идеально подойдет МФУ Canon PIXMA MP210 с СНПЧ.
Опубликовал Kest September 04 2013 19:00:08 · 0 Комментариев · 2244 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
WinPopup
Алгоритм DES шифр...
Анекдоты с ostrie.ru
ICQ
Библия хакера 2 К...
Swat [Исходник на...
Простой пример ка...
Error mod
Delphi 2005 для .NET
Berg
Binary2XMLDemo (Р...
Использование Lis...
ComboBox97
PHP5. Профессиона...
Электронный магаз...
Библия для програ...
Программа "AutoRu...
FormShape [Исходн...
Распознавание иде...
Изучаем Ассемблер

Топ загрузок
Приложение Клие... 100384
Delphi 7 Enterp... 83516
Converter AMR<-... 20051
GPSS World Stud... 11297
Borland C++Buil... 11233
Borland Delphi ... 8175
Turbo Pascal fo... 6987
Visual Studio 2... 4970
Калькулятор [Ис... 4416
FreeSMS v1.3.1 3516
Случайные статьи
Что такое Thunders...
Перекомпоновка
Методы values() и ...
Класс граничных ре...
Редактирование и у...
Параметры группово...
Множество. Формат
Подсистема STREAMS...
Приобретение товар...
Размер фотографий ...
LOOP (ОРГАНИЗОВАТЬ...
Создание подсетей ...
Самоуправление или...
Выделить добаляему...
RETURN (ВЕРНУТЬ)
клиентов удаленног...
Установка Apache +...
Блоки имеют следую...
Создание таблиц
Виртуальные дестру...
Подписки на новую ...
Вызов хранимых про...
Принципы и програм...
Эмпирическое прави...
Применение протоко...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?