FunctionTwo() функцияси самарадор бўлиши билан бирга айрим камчиликларга ҳам эга. FunctionTwo()функцияси чақирилганда унга узатиладаган SimplеCat синфининг объектини ўзгартиришга ҳуқуқи йўқ эди. Бундай усулда узатиш объектни ўзгартириш имконини очиб беради ва объектни қиймат сифатида узатилишида таъминланган ҳимоясини бекор қилади.
Объектларни қиймат сифатида узатиш музейга ҳақиқий асар фотографиясини топширишга ўхшаган амалдир. Агарда бирор бир бекорчи фотосуратни бузиб қўйса унинг оригиналига ҳеч қандай зарар етмайди. Ҳавола бўйича объектларни узатиш эса музейга ўзингизни уй адресингизни қолдириш ва ўзингизни иштирокингизда қимматбаҳо жиҳозга кўришга ўхшайди.
Бу муаммони функцияга SimplеCatсинфининг объектига ўзгармас кўрсатгични узатиш орқали ҳал қилиш мумкин. Бу ғоя 9.11. - листингда намойиш қилинган.
9.11. – листинг. Ўзгармас кўрсатгичларни параметр сифатида узатиш. // 9.11. – листинг.
Simple CatConstructor…
Frisky is 1 years old
Frisky is 3 years old
Calling FunctionTwo…
FunctonTwo. Returning…
Frisky is now 5 years old
Frisky is 5 years old
Simple CatDestructor.
ТАҲЛИЛ
SimpleCat синфига иккита функция ва битта ўзгарувчи –аъзо (itsAge) қўшилди. Функциялардан бири ўзгармас (GetAge), иккинчиси эса ўзгармас функция эмас (SetAge).
Дастурда конструктор, конструктор–кўчирувчи ва деструктор худди олдинги листингдагидек аниқланган. Лекин натижалардан бирор марта конструктор – кўчирувчи чақирилмаганлигини кўриб турибмиз. Бунинг сабаби объект ҳавола кўринишида узатиляпти ва бунинг натижасида унинг нусхаси тузилмаяпти. 41–сатрда бошланғич берилган қийматдаги ёш билан тузилди. Бу қиймат 42 – сатрда экранга чиқарилди.
46–сатрда SetAge() методи ёрдамида itsYosh ўзгарувчисининг қиймати ўзгартирилди, унинг натижаси эса 47 – сатрда экранга чиқарилди. Бу дастурда FunctionOne() функцияси ишлатилмаяпти, лекин FunctionTwo() функциясининг озгина ўзгартирилгани чақирилаяпти. Унинг эълон қилиниши 36 – сатрда келтирилган. Бу сафар унинг параметри ҳам, қайтарадиган қиймати ҳам ўзгармас объектга ўзгармас кўрсатгич сифатида аниқланган.
Параметр ҳам, қайтариладиган қиймат ҳам ҳавола сифатида аниқланганлиги учун ҳеч қандай нусха тузилмайди ва кўчирувчи – конструктор ҳам чақирилмайди. Фақатгина FunctionTwo() функциясининг кўрсатгичлари энди ўзгармасдир, ва ўз навбатида у орқали ўзгармас бўлмаган методни (SetAge()ни ) ишлатиб бўлмайди. Агарда 64 – сатрдаги SetAge() методига ҳавола изоҳга олинмаса эди, дастурнинг компиляция жараёни амалга ошмас эди.
main() функцияси ичида тузилган объект ўзгармас эмас эди ва Frisky объекти SetAge() методини чақира олар эди. Бу оддий объектнинг адреси FunctionTwo() функциясига берилди. FunctionTwo() функцияси эълон қилинишида унга узатиладиган параметр ўзгармас объектга ўзгармас кўрсаткич эканлиги айтилган эди. Шунинг учун бу объектнинг функцияси ўзгармас бўлсагина унга ҳавола қилиш мумкин.