const short int k = 3; //const o'zgaruvchi - konstanta cout << rd << endl; printInt(j); printInt(crj); return (0); } void printInt(const int &i) //...int& i... deb yozish ham mumkin; { //kirish argumenti const dir cout << i << endl; return; } Ekranda: 3.999 10 Ko'rganimizdek, rd ko'rsatkichimiz d o'zgaruvchi qiymatini ekranga bosib
chiqarish imkonini beradi. Ko'rsatkich o'rqali o'zgaruchining qiymatini ham
o'zgartirsa bo'ladi. &-ko'rsatkichning asosiy hususiyati shundaki mahsus
sintaksis - & belgisining qo'yilishi faqat ko'rsatkich e'lonida qo'llaniladi
halos. Dastur davomida esa oddiy o'zgaruvchi kabi ishlov ko'raveradi. Bu juda
qulaydir, albatta. Lekin ko'rsatkich ishlatilganda ehtiyot bo'lish kerak,
chunki, masalan, funksiya tanasi ichida argumentning nushasi bilan emas, uning
o'zi bilan ish bajarilayatganligi esdan chiqishi mumkin.
const (o'zgarmas) ifodasiga kelaylik. Umuman olganda bu nisbatan yangi
ifodadir. Masalan C da ishlagan dasturchilar uni ishlatishmaydi ham.
const ni qo'llashdan maqsad, ma'lum bir identefikatorni o'zgarmas holga
keltirishdir. Masalan, o'zgaruvchi yoki argument const bilan sifatlantirilsa,
ularning qiymatini o'zgartirish mumkin emas. Lekin boshqa amallarni bajarish
mumkin. Ularni ekranga chiqarish, qiymatlarini boshqa o'zgaruvchiga berish
ta'qiqlanmaydi. const ifodasisiz ham dasturlash mumkin, ammo const yordamida
tartibli, chiroyli va eng muhimi kam hatoli dasturlashni amalga oshirsa
bo'ladi. const ning ta'siri shundaki, const qilingan o'zgaruvchilar kerakmas
joyda o'zgarolmaydilar. Agar funksiya argumenti const deb belgilangan bo'lsa,
ushbu argumentni funksiya tanasida o'zgartirilishga harakat qilinsa,
kompilyator hato beradi. Bu esa o'zgaruvchining himoyasini oshirgan bo'ladi.
const ning qo'llanilish shakli ko'pdir. Shulardan asosiylarini ko'rib chiqsak.
Yuqoridagi misoldagi
const int &crj = j;
amali bilan biz &-ko'rsatkichni e'lon va initsalizatsiya qildik. Ammo crj
ko'rsatkichimiz const qilib belgilandan, bu degani crj ko'rsatkichi orqali
j o'zgaruvchisining qiymatini o'zgartira olmaymiz. Agar const ifodasi
qo'llanilmaganda edi, masalan yuqoridagi
double &rd = d;
ifodadagi rd ko'rsatkichi yordamida d ning qiymatini qiyinchiliksiz
o'zgartirishimiz mumkin. d ning qiymatini 1 ga oshirish uchun
d++;
yoki
rd++;
deb yozishimiz kifoyadir.
Yana bir marta qaytarib o'taylikki, &-ko'rsatkichlar e'lon vaqtida
initsalizatsiya qilinishi shartdir. Yani quyidagi ko'rinishdagi bir misol
hatodir:
int h = 4;
int &k; // hato!
k = h; // bu ikki satr birga qo'shilib yoziladi: int &k = h;
Ba'zi bir dasturchilar &-ko'rsatkich e'londa & belgisini o'zgaruvchi tipi
bilan birga yozadilar. Bunining sababi shuki, & belgisining C/C++ dagi
ikkinchi vazifasi o'zgaruvchi yoki ob'ektning adresini qaytarishdir. Unda
& ni o'zgaruvchiga yopishtirib yozish shartdir. Demak, & tipga yopishtirib
yozish & ning qo'llanishlarini bir-biridan farqlab turadi. Lekin & ni
ko'rsatkich e'lonida qo'llaganda, uning qanday yozilishining ahamiyati yo'q.
Adres olish amalini biz keyinroq ko'rib chiqamiz.
...
int H = 4;
int F;
int &k = H;
int& d = F; // yuqoridagi e'lon bilan aynidir
void foo(long &l);
void hoo(double& f); // yuqoridagi protopip bilan aynidir
...
Bir necha ko'rsatkichni e'lon qilish uchun:
int a, b , c;
int &t = a, &u = b, &s = c;
Bu yerda & operatori har bir o'zgaruvchi oldida yozilishi shart.
&-ko'rsatkich ko'rsatayotdan hotira sohasining adresini o'zgartirib bo'lmaydi.
Masalan:
int K = 6;
int &rK = K;
K ning hotiradagi adresi 34AD3 bolsin, rK ko'rsatkichning adresi esa 85AB4.
K ning qiymati 6, rK ning qiymati ham 6 bo'ladi.
Biz rK ga qaytadan boshqa o'zgaruvchini tenglashtirsak, rK yangi o'zgaruvchiga
ko'rsatmaydi, balki yangi o'zgaruvchining qiymatini K ning adresiga
yozib qo'yadi.
Masalan yangi o'zgaruvchi N bo'lsin, uning adresi 456F2, qiymati esa 3
bo'lsin. Agar biz
rK = N;
desak, rK N ga ko'rsatmaydi, balki K ning adresi - 34AD3 bo'yicha N ning
qiymatini - 3 ni yozadi. Yani K ning qiymati 6 dan 3 ga o'zgaradi.
Yuqoridagi dasturda:
const short int k = 3;
deb yozdik. Bu const ning ikkinchi usulda qo'llanilishidir. Agar o'zgaruvchi
tipi oldidan const qo'llanilsa, o'zgaruvchi konstantaga aylanadi, dastur
davomida biz uning qiymatini o'zgartira olmaymiz. Bu usul bilan biz Pascaldagi
kabi konstantalarni e'lon qilishimiz mumkin. Bu yerda bitta shart bor,
const bilan sifatlantirilgan o'zgaruvchilar e'lon davrida initsalizatsiya
qilinishlari shart. Umuman olganda bu qonun const ning boshqa joylarda
qo'llanilganida ham o'z kuchini saqlaydi. Albatta, faqat funksiya argumentlari
bilan qo'llanilganda bu qonun ishlamaydi. C/C++ da yana # define ifodasi
yordamida ham simvolik konstantalarni e'lon qilish mumkin. Ushbu usulni keyin
ko'rib chiqamiz. Undan tashqari enum strukturalari ham sonli kostantalarni
belgilaydi.
Dasturimizda printInt() funksiyamizga kiradigan int& tipidagi argumentimizni
const deya belgiladik. Buning ma'nosi shuki, funksiya ichida ushbu argument
o'zgartirilishga harakat qilinsa, kompilyator hato beradi. Yani funksiya
const bo'lib kirgan argumentlarni (hoh ular o'zgaruvchi nushalari bo'lsin,
hoh o'zgaruvchilarga ko'rsatkich yoki pointer bo'lsin) qiymatlarini o'zgartira
olmaydilar.
Funksiya faqat bitta qiymat qaytaradi dedik. Bu qaytgan qiymatni biz
o'zgaruvchiga berishimiz mumkin. Agar bittadan ko'proq o'zgaruvchini
o'zgartirmoqchi bo'lsak, o'zgaradigan ob'ektlarni ko'rsatkich yoki pointer
sifatida kiruvchi argument qilib funksiyaga berishimiz mumkin. Bundan tashqari
biz funksiyadan &-ko'rsatkichni qaytarishimiz mumkin. Lekin bu yersa ehtiyot
bo'lish zarur, ko'rsatkich funksiya ichidagi static o'zgaruvchiga ko'rsatib
turishi lozim. Chunki oddiy o'zgaruvchilar avtomatik ravishda funksiya
tugaganida hotiradan olib tashlanadi. Buni misolda ko'raylik.
...
int& square(int k){
static int s = 0; //s static sifatiga ega bo'lishi shart;
int& rs = s;
s = k * k;
return (rs);
}
...
int g = 4;
int j = square(g); // j = 16
...