Навигация
Главная
Поиск
Форум
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
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
ТЕХНОЛОГИИ ДОСТ... 63078
Имитационное мо... 58363
Реклама
Сейчас на сайте
Гостей: 4
На сайте нет зарегистрированных пользователей

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

Изменения контуров и сортировка в двумерном массиве чисел на Turbo Pasca...
Движение шарика в эллиптическои параболоиде на Delphi [OpenGL] + Блок схемы
Моделирование работы участка термической обработки шестерен на 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 Комментариев · 2460 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Профессиональное ...
PHP/MySQL для нач...
Защита от спама ...
Обучение Borland ...
Averaging [Исходн...
C++ Стандартная б...
oTextrackBar
Искусство програм...
Измерение тактово...
Adapter (пример D...
Dynamic Titles дл...
Эффект лампы на р...
Иллюстрированный ...
Основы программир...
PHP: обучение на ...
Язык программиров...
Песочные часы
Domen Name IP
Переработанный пл...
Swat [Исходник на...

Топ загрузок
Приложение Клие... 100481
Delphi 7 Enterp... 87901
Converter AMR<-... 20082
GPSS World Stud... 13568
Borland C++Buil... 12072
Borland Delphi ... 8676
Turbo Pascal fo... 7048
Visual Studio 2... 5005
Калькулятор [Ис... 4912
FreeSMS v1.3.1 3545
Случайные статьи
Регулярные выражения
Терминология СС/РР
Как представить чи...
TEST (ПРОВЕРИТЬ)
Можно объявлять пе...
Шифрование алгорит...
Бесплатный игровой...
Вложенные таблицы
Возможности имитац...
Политика отключения
В среде с постоянн...
Элементарные типы
Процесс подъема но...
ОСНОВНЫЕ ПОНЯТИЯ СМО
8 веских причин сд...
Сохранение проекта
FRAD, удовлетворяю...
В-Frames
Блог на мобильном ...
Однострочные функции
Определение длины ...
Подготовка програм...
Детская стоматолог...
Упорядочивание по ...
Ограничение проток...
Статистика



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


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