swap() функциясига параметр сифатида ҳаволаларни узатиш.
Юқорида келтирилган дастур албатта тўғри ишлайди, лекин ундаги swap() функциясининг синтаксиси бироз мураккаб бўлиб тушуниш учун қийиндир. Биринчидан, swap() функцияси ичида бир неча марта кўрсаткич адресидаги қийматни олиш оператори билан ишлашда хатолик рўй бериши мумкин, бундан ташқари кўрсаткич адресидаги қийматни ўқиш операторида ишлатиш ноқулайдир. Иккинчидан, чақирилаётган функцияга ўзгарувчи адресини бериш зарурияти swap() функцияси бажарилишининг инкапсуляция принципига мувофиқ келмайди.
С++ тилида дастурлашнинг асосий мақсади, функция бажарилишида унинг деталларини фойдаланувчидан яширин ҳолда фойдаланишдир. Кўрсатгич ёрдамида параметрларни узатишда ўзгарувчиларни адресини олиш ўрнига чақириладиган функциянинг танасида ўзгарувчиларнинг адресини олиш ҳам мумкин. Бу масалани бошқачароқ ечими 9.7. – листингда келтирилган.
9.7. – листинг. swap() функциясида ҳаволадан фойдаланиш.
// 9.7. – листинг. Аргументларни ҳавола орқали //мурожаат сифатида узатишга мисол.
# include
void swap( int &x, int &y);
int main( )
{
int x = 5, y = 10;
cout << “Main. Before swap, x:” << x << “y :” <
swap(x,y );
cout<< “Main. After swap, x:” << x << “y :” <
return 0;
}
void swap( int &rx, int ry)
{
int temp;
cout<< “Swap.Before swap, rx:”<
temp = rx;
rx = ry;
ry = temp;
cout << “Swap.After swap, rx:” <
}
НАТИЖА:
Main. Before swap, x: 5, y: 10
Swap. Before swap, rx: 5, ry: 10
Swap. After swap, rx: 10, ry: 5
Main. After swap, x: 10, y:5
ТАҲЛИЛ
Бу листингда худди кўрсатгичлар билан берилган мисолдагидек 6 – сатрда иккита ўзгарувчи эълон қилинаяпти. Уларнинг қиймати эса 7 – сатрда экранга чиқарилаяпти. 8 – сатрда swap() функцияси чақирилаяпти ва унга x ва y ўзгарувчиларнинг адреслари эмас, балки ўзлари параметр сифатида узатилаяпти.
swap() функцияси чақирилгандан кейин дастурнинг бошқаруви 18 – сатрга ўтади. Параметр сифатида узатилган ўзгарувчиларнинг қийматлари 15–сатрда экранга чиқади. Бунда эътибор берган бўлсангиз, уларнинг қийматини экранга чиқариш учун ҳеч қандай махсус оператор талаб этилмайди, чунки биз бу ерда берилган қийматларнинг псевдонимидан фойдаландик.
16– 18 – сатрларда қиймат алмашинуви бажарилди ва улар 19 – сатрда экранга чиқарилди. Дастур бошқаруви swap() функцияси чақирилган жойга ўтди ва 9–сатрда, яъни main() функциясининг ичида бу қийматлар яна экранга чиқарилди.
Демак, биз функция ичида ҳаволаларни ишлатиш орқали янги имкониятларга эга бўлдик, яъни чақирилаётган функция орқали берилган маълумотни ўзгартирдик. Бунда чақирилаётган функция одатдаги функциялардан ҳеч қандай фарқ қилмайди.
Do'stlaringiz bilan baham: |