ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн
Передача структурных переменных по ссылке
Вы можете применять механизм передачи по ссылке не только к переменным стандартных типов, но и к структурным переменным. Следующая программа, REFERST, производит масштабирование значений типа Distance. Масштабирование представляет собой умножение нескольких длин на один и тот же коэффици- ент. Так, если исходная длина равна 6'-8", а коэффициент масштабирования ра- вен 0.5, то длина, получаемая в результате масштабирования, равна 3'-4". Мас- штабирование .можно применить, например, к трем измерениям помещения, что приведет к изменению размеров этого помещения с одновременным сохранением его пропорций.
// referst.cpp
// передача структурной переменной по ссылке #include <iostream> using namespace std; //////////////////////////////////////////////////////////
struct Distance // длина в английской системе
{
int feet; float inches;
};
////////////////////////////////////////////////////////// void scale( Distance&, float ); // прототипы функций void engldisp( Distance );
int main()
{
Distance d1 = { 12, 6.5 }; //инициализация d1 и d2
Distance d2 = { 10, 5.5 };
cout << "d1 = "; engldisp(d1); //вывод исходных значений d1 и d2 cout << "\nd2 = "; engldisp(d2);
scale(d1, 0.5); // масштабирование d1 и d2
scale(d2, 0.25);
cout << "\nd1 = "; engldisp(d1); // вывод новых значений d1 и d2 cout << "\nd2 = "; engldisp(d2); cout << endl; return 0;
}
//-- функция scale()---масштабирование значения типа Distance ---------------
void scale( Distance& dd, float factor ) {
float inches = (dd.feet*12 + dd.inches)*factor; //перевод футов в дюймы и ум- dd.feet = static_cast<int>(inches/12); //ножение на коэффициент dd.inches = inches - dd.feet *12;
}
//------------------------------------------------------------------------
// функция engldisp()
// отображает значение типа Distance на экране
void engldisp( Distance dd ) // параметр dd типа Distance
{
cout << dd.feet << "\'-" << dd.inches <<"\"";
}
Программа инициализирует две переменные типа Distance, d1 и d2, и выводит их значения на экран. Затем вызывается функция scale(), которая производит умножение длины d1 на коэффициент 0.5, а длины d2 — на коэффициент 0.25. После этого на экран выводятся новые значения d1 и d2:
d1 = 12'-6.5" d2 = 10'-5.5" d1 = 6'-3.25" d2 = 2'-7.375"
Вызовы функции scale() в программе выглядят следующим образом:
scalе(d1, 0.5); scale(d2, 0.25);
Первый вызов производит масштабирование с коэффициентом 0.5, а второй — с коэффициентом 0.25. Обратите внимание на то, что значения d1 и d2, переда- ваемые по ссылке, изменяются непосредственно в функции; никакого значения функция при этом не возвращает. Поскольку изменяется только один аргумент, можно было бы модифицировать функцию scale(), передавая ей этот аргумент по значению и возвращая масштабируемую величину с помощью оператора return. В этом случае вызов функции выглядел бы так:
d1 = scale(d1, 0.5)
Конечно, такой способ является чересчур длинным.
12 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 28 29 30 31 32 33 34 35 36 37 38 39
