Сайфиев ж. Ф. С++ тилига кириш услубий қўлланма


Ўзгармас кўрсатгичларни параметр сифатида узатиш


Download 3.45 Mb.
bet77/79
Sana18.10.2023
Hajmi3.45 Mb.
#1707139
1   ...   71   72   73   74   75   76   77   78   79
Bog'liq
cpp buxoro

Ўзгармас кўрсатгичларни параметр сифатида узатиш.




FunctionTwo() функцияси самарадор бўлиши билан бирга айрим камчиликларга ҳам эга. FunctionTwo() функцияси чақирилганда унга узатиладаган SimplеCat синфининг объектини ўзгартиришга ҳуқуқи йўқ эди. Бундай усулда узатиш объектни ўзгартириш имконини очиб беради ва объектни қиймат сифатида узатилишида таъминланган ҳимоясини бекор қилади.
Объектларни қиймат сифатида узатиш музейга ҳақиқий асар фотографиясини топширишга ўхшаган амалдир. Агарда бирор бир бекорчи фотосуратни бузиб қўйса унинг оригиналига ҳеч қандай зарар етмайди. Ҳавола бўйича объектларни узатиш эса музейга ўзингизни уй адресингизни қолдириш ва ўзингизни иштирокингизда қимматбаҳо жиҳозга кўришга ўхшайди.
Бу муаммони функцияга SimplеCat синфининг объектига ўзгармас кўрсатгични узатиш орқали ҳал қилиш мумкин. Бу ғоя 9.11. - листингда намойиш қилинган.
9.11. – листинг. Ўзгармас кўрсатгичларни параметр сифатида узатиш.
// 9.11. – листинг.
// Объектни ўзгармас кўрсаткичларини узатиш

# include < iostream.h >


class SimpleCat


{
public :
SimpleCat();
SimpleCat(Simple Cat&);
~SimpleCat();

int GetAge() const { return itsYosh};


void SetAge(int age) { itsYosh= age ; }

private :


int itsYosh;
};

SimpleCat:: SimpleCat()


{
cout << “Simple CatConstructor …\ n” ;
itsYosh= 1;
}

SimpleCat:: SimpleCat( SimpleCat& )


{
cout<<“SimpleCat Copy Constructor … \n” ;
}

SimpleCat::~SimpleCat()


{
cout<<“SimpleCat Destructor …\n” ;
}

SimpleCat *FuctionTwo(const SimpleCat * const theCat);


int main()


{
cout<< “Making a Cat… \ n”;
SimpleCat Frisky;
cout<<“Frisky is ” ;
cout<< Frisky.GetAge ( );
cout<< “years old \n”;
int age = 5;
Frisky SetAge(age);
cout <<”Frisky is”;
cout <cout << “years old \n”;
cout << “Calling Function Two …\ n”;
FunctionTwo( &Frisky ):
cout << “Frisky is”;
cout << Frisky.GetAge();
cout <<” years old \ n”
return 0;
}
// FunctionTwoга ўзгармас кўрсатгич узатилаяпти.
const SimpleCat* const FunctionTwo (const SimpleCat* const theCat)
{
cout << “Function Two. Returning . . .\n”;
cout << “Frisky is now” << theCat – >GetAge( );
cout << “years old\n”;
// theCat–>SetAge(8); Const!
return theCat
}

НАТИЖА:
Making a Cat…


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() функцияси эълон қилинишида унга узатиладиган параметр ўзгармас объектга ўзгармас кўрсаткич эканлиги айтилган эди. Шунинг учун бу объектнинг функцияси ўзгармас бўлсагина унга ҳавола қилиш мумкин.



Download 3.45 Mb.

Do'stlaringiz bilan baham:
1   ...   71   72   73   74   75   76   77   78   79




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling