Кўрсаткичларни эълон қилишда const калитли сўзини ишлатилиши.
Кўрсаткичларни эълон қилишда const калитли сўзи тип спецификаторидан ёки олдин, ёки кейин ёзилади. Масалан, уларнинг қуйидаги вариантларда эълон қилиниши тўғридир:
const int *pOne;
int * const pTwo;
const int * сonst pThree;
Бу мисолда pOne кўрсаткичи int типидаги ўзгармасни адресини ўзида сақлайди. Шунинг учун у кўрсатаётган қийматни ўзгартириш мумкин эмас.
pTwo кўрсаткичи int типи кўрсаткич бўлган ўзгармасдир. Бу ҳолда кўрсаткич адресида ёзилган қийматни ўзгартириш мумкин, лекин адреснинг ўзини ўзгартириб бўлмайди.
Ниҳоят, pThree кўрсаткичи int типидаги ўзгармасни адресини ўзида сақловчи ўзгармас бўлган кўрсаткичдир. У хотиранинг битта ва фақат битта адресини ўзида сақлайди ва бу адресдаги қиймат ҳам ўзгармасдир.
Биринчи навбатда қандай қиймат ўзгармас деб эълон қилинаётганлигини билишимиз керак. Кўрсаткични ўзими ёки унда сақланаётган қийматми? Агарда const калитли сўзи ўзгарувчининг типидан олдин ёзилган бўлса, демак аниқланган ўзгарувчимиз ўзгармас бўлади. Агарда const калитли сўзи ўзгарувчи типидан кейин қўйилган бўлса, у ҳолда кўрсаткичнинг ўзи ўзгармасдир. Қуйидаги мисолларни қараймиз.
const int * p1 // int типли ўзгармасга кўрсаткич.
int *const p2 // ўзгармас кўрсаткич,
//яъни доимо хотирадаги бир соҳани кўрсатиб туради.
Функция аъзоларга кўрсаткичларни эълон қилишда const калитли сўзини қўлланилиши.
Олдинги мавзуларда синф функция – аъзоларини аниқлашда const калитли сўзини қўлланилишини кўриб чиққан эдик. Агарда функция ўзгармас деб эълон қилинса, компилятор у орқали жорий объектнинг маълумотларини ўзгартирилишини чеклар эди.
Агарда объектга кўрсаткич ўзгармас деб эълон қилинган бўлса, биз ундан фақатгина cоnst спецификатори билан аниқланган методларни чақириш учунгина фойдалана оламиз. Бу 8.10. - листингда кўрсатиб ўтилган.
8.10. – листинг. Ўзгармас объектларга кўрсаткичлар.
//8.10. – листинг
//Кўрсаткичёрдамида константа методларини //чақирилиши
# inсlude < iostream.h>
class Turtburchak
{
public:
Turtburchak();
~ Turtburchak();
void SetLength(int Length){ itsLength = Length;}
int GetLength() const {returu itsLength; }
void SetWidth(int width) {itsWidth = width; }
int GetWidth() const { return itsWidth}
private:
int itsLength;
int itsWidth;
};
Turtburchak :: Turtburchak ( )
{
its Width = 5;
its Length = 10;
}
Turtburchak :: ~Turtburchak ( )
{ }
int main()
{
Turtburchak *pRect = new Turtburchak;
const Turtburchak *pConstRect=new Turtburchak;
Turtburchak* const pConstPtr = new Turtburchak;
cout<<“pRect width:”<
GetWidth()
<<“meters \n”;
cout<<“pConstRect width:”
<
GetWidth()
cout <<” meters\n”;
cout << “pConstPtr width:”
<
GetWidth()
cout << “meters\n”;
Prect–> SetWidth (10);
//PconstRect –> SetWidth(10);
PconstPtr –> SetWidth(10);
cout<< “pRect width:”<
GetWidth()
cout<<“ meters\n”;
cout<<“pConstRect width:”
<<“pConstRect–>GetWidth()
cout<< “meters\n”;
cout<<“pConstPtr width:”<
GetWidth()
cout<< “meters \n”;
return 0;
}
HАТИЖА:
pRect width: 5 meters.
pConstRect width: 5 meters
pConstPtr width : 5 meters
pRect width: 10 meters
pConstRect width: 5 meters
pConstPtr width: 10 meters.
ТАҲЛИЛ
5 – 17 – сатрларда Turtburchak cинфининг тавсифи берилган. 13 – сатрда ёзилган, сonst спецификаторига эга бўлган GetWidth() методига эътиборимизни қаратамиз.
27 – сатрда Turtburchak cинфи объектига кўрсаткич эълон қилинаяпти. 28 – сатрда худди шу синфнинг ўзгармас объектига кўрсаткич эълон қилинаяпти. Ўзгармас кўрсаткич эса 29 – сатрда эълон қилинаяпти.
pRect кўрсаткичи томонидан чақирилган SetWidth() методи объектнинг кенглигини ўрнатаяпти. 39 – сатрда pConstRect кўрсаткичи орқали синф методи чақирилишига мисол келтирилган. Лекин pConstRect кўрсаткичи ўзгармас объектга кўрсаткич бўлиб, у орқали сonst спецификатори бўлмаган методларни чақириб бўлмайди. Шунинг учун бу сатр изоҳга айлантирилган. 40 – сатрда эса SetWidth() методи pConstPtr кўрсаткичи орқали чақирилаяпти. Бу кўрсаткич ўзгармас ва фақат хотиранинг бир соҳасига мурожаат қилиши мумкин. Лекин, у мурожаат қилаётган объект константа эмас, шунинг учун бу операция тўғридир.
Do'stlaringiz bilan baham: |