9.10. – листинг. Кўрсатгичлар ёрдамида объектларни ҳавола кўринишда узатиш.
//9.10. – листинг.
// Объектга кўрсатгичларни узатилиши
#include
class SimpleCat
{
public:
SimpleCat(); //конструктор
SimpleCat(Simple Cat&);//кўчирувчи- конструктор
~SimpleCat(); //деструктор
}
SimpleCat: : SimpleCat()
{
cout << “ Simple CatConstructor … \ n” ;
}
SimpleCat::SimpleCat(SimpleCat& )
{
cout<<“Simple CatCopy Constructor…\ n” ;
}
SimpleCat::~SimpleCat( )
{
cout << “SimpleCat Destructor …\ n” ;
}
SimpleCat FunctionOne (SimpleCat theCat) ;
SimpleCat* FunctionTwo (SimpleCat *theCat) ;
int main()
{
cout <<“Making a Cat…\ n” ;
SimpleCat Frisky ;
cout<< “Calling FunctionOne…\ n” ;
FunctionOne(Frisky) ;
cout<<“Calling FunctionTwo …\ n” ;
FunctionTwo(&Frisky)
return 0;
}
//FinctionOne функциясига қиймат сифатида узатилаяпти
SimpleCatFunctionOne ( SimpleCat theCat)
{
cout << “FunctionOne Returning …\ n” ;
return theCat;
} ;
//FinctionTwo функциясига ҳавола сифатида узатилаяпти
SimpleCat* FunctionTwo ( SimpleCat* theCat)
{
сout << “ Function Two. Returning …\ n” ;
return tneCat;
}
HАТИЖА:
Making a Cat…
Simple CatConstructor …
Calling FunctionOne …
Simple CatCopy Constructor …
FunctionOne returning …
Simple CatCopy Constructor …
Simple CatDestructor …
Simple CatDestructor …
Calling FunctionTwo …
FunctionTwo Returning …
Simple CatDestructor …
ТАҲЛИЛ
6 – 12 – сатрларда жуда ҳам соддалаштирилган SimpleCat синфи эълон қилинаяпти. Синфнинг барча компонентлари – конструктор, конструктор – кўчирувчи ва деструкторлар таналарида экранга ахборот чиқарувчи фрагмент аниқланган бўлиб, бу орқали улар қачон чақирилганини билиб олиш мумкин бўлади.
34–сатрда main() функцияси ўзининг биринчи ахборотини экранга чиқаради. 35–сатрда эса SimpleCat синфининг экземпляри тузилади. Бу эса ўз навбатида SimpleCat синфининг конструкторини чақиради. Конструктор чақирилганда бу ҳақида экранга ахборот чиқарилади.
36 – сатрда main() функцияси FunctionOne функцияси чақирилганлиги ҳақида хабар чиқаради. FunctionOne() функциясига SimpleCat синфи объекти қиймат сифатида узатилади ва бунинг натижасида чақириладиган функция учун локал бўлган SimpleCat объекти нусхаси стекда жойлаштирилади. Бу ҳолда кўчирувчи конструктор чақирилади.
Дастурнинг бошқаруви чақирилган функцияни танаси ҳисобланган 46 – сатрга ўтади. Кейин эса бу функция чақирган функцияга бошқарувни беради ва SimpleCat синфи объекти яна қиймат сифатида қайтарилади. Бу ҳолда конструктор–кўчирувчини чақириш орқали яна битта объект нусхаси тузилади ва экранга навбатдаги хабар чиқарилади.
FunctionOne() функцияси қайтарган қиймат бирор бир объектга ўзлаштирилмайди ва функциянинг қиймат қайтариш механизмининг реализациясида ҳосил қилинган вақтинчалик объект умуман фойдаланилмасдан ўчирилади. Чунки FunctionOne() функцияси ишини тугатиши билан унинг локал объектлари хотирадан ўчирилади.
Дастурнинг бошқаруви яна main() функциясига қайтгандан сўнг FunctionTwo() функцияси чақирилади. Унга параметр ҳавола кўринишида узатилади. Шунинг учун унинг ишлаши давомида объектнинг ҳеч қандай нусхаси ҳосил бўлмайди ва ўз навбатида конструктор – кўчирувчи ҳам, деструктор ҳам чақирилмайди.
Ушбу дастурнинг ишини таҳлил қилсак, FunctionOne() функцияси чақирилганда кўчирувчи – конструкторга икки марта, деструкторга икки марта ҳавола қилинади, агарда объект ҳавола кўринишида узатилса бундай мурожаатлар бўлмас экан.
Do'stlaringiz bilan baham: |