Главная->Інформатика та програмування->Содержание->Передача структурных переменных по ссылке

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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)

Конечно, такой способ является чересчур длинным.

 

21