Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 5
На сайте нет зарегистрированных пользователей

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

Моделирование интернет кафе на GPSS + Отчет
Моделирование регулировочного участка цеха на GPSS + Пояснительная записка
Информационная система - продуктовый магазин на Turbo Pascal (База данны...

Реализация операции сложения с присваиванием
Единственный вопрос, который пока не ясен: что возвращать в качестве результата. Попробуем возвращать значение. Тогда внешнее определение метода будет таким, как показано в листинге 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 15:00:08 · 0 Комментариев · 3928 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
PBFoldder
PDF
Мод "проверочный ...
Базы данных в Инт...
AID антивирус
Illusion
CoolControls v3.0...
DS_Group
Синтаксический ан...
Blib [Исходник на...
DateEdit
39 статьи по Delphi
База предприятий ...
Цветной Grid
PDJXPPack
Assembler. Учебни...
Применение фильтр...
около 291 статьи ...
iComm v.6.1 - выв...
Averaging [Исходн...

Топ загрузок
Приложение Клие... 100791
Delphi 7 Enterp... 97987
Converter AMR<-... 20293
GPSS World Stud... 17047
Borland C++Buil... 14217
Borland Delphi ... 10359
Turbo Pascal fo... 7387
Калькулятор [Ис... 6070
Visual Studio 2... 5228
Microsoft SQL S... 3673
Случайные статьи
Декартовое произве...
Команды библиотеки...
Форум на вашем сер...
Введение в PowerShell
Настройте коммутир...
Инфраструктуры для...
Построение графиче...
Функционирование в...
Протоколы и интерф...
Функции абстракции
Описание игры в иг...
СТАТИЧЕСКИЙ ИЛИ ВИ...
Xbox открыта и Вы ...
Пример кода програ...
Программа содержит...
Собственная страни...
В какую объединенн...
Средства обработки...
Игровый клуб Super...
Оставшиеся проблем...
Класс граничных ре...
Установка операци...
Программирование: ...
Ван Вайк решил про...
Файл AndroidManife...
Статистика



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


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