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

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

Моделирование работы узла коммутации сообщений на GPSS + Пояснительная з...
Расчет размера дохода на одного человека в Turbo Pascal
Моделирование работы участка термической обработки шестерен на 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 Комментариев · 2384 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Пример клиента ФТ...
Java в примерах -...
Исправление проц...
Handles
Comdrv
База игр
Borland Delphi 6....
Калькулятор [Исхо...
VksButton
Abbrevia
MiniTetris [Исход...
AddPage [Исходник...
Керниган Б.В., Ри...
Шейдеры в Delphi
Bitmap [для кнопок]
Использование Lis...
Дешифратор содерж...
PDJXPPack
45 уроков по дельфи
Игра змейка

Топ загрузок
Приложение Клие... 100443
Delphi 7 Enterp... 85594
Converter AMR<-... 20065
GPSS World Stud... 12447
Borland C++Buil... 11522
Borland Delphi ... 8477
Turbo Pascal fo... 7020
Visual Studio 2... 4987
Калькулятор [Ис... 4722
FreeSMS v1.3.1 3533
Случайные статьи
Создать свой сайт ...
Описание абстрактн...
1.3.3. Инструменты...
Задача о коммивояж...
10.4. Методы умень...
Открытие документа
Вложенные таблицы
3.1. Задачи
Натяжные потолки
2-32)
Прямой метод решен...
Где NT хранит пароли
3.1. Дополнительна...
Определение вторич...
Явная загрузка мод...
Просмотр списка до...
Тематические блоги...
Оценка недвижимост...
Контекстно-свободн...
Сегменты, использу...
СТРУКТУРНОЕ ПРОГРА...
Поддержка последов...
Общение в чате
Выработка решенияП...
Штриховкой можно п...
Статистика



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


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