Havola – bu o‘zgaruvchi psevdonimidir. Havola hosil qilinishi bilan biz unga boshqa ob’ekt nomi yordamida uning adresatini o‘zlashtiramiz. SHu vaqtdan boshlab havola joriy ob’ektning alternativ nomi bo‘lib xizmat qiladi va bu havola ustida bajarilgan barcha amallar ushbu ob’ektga tegishli bo‘ladi.
Havolalarni e’lon qilishda adresatdagi ob’ekt tipi, undan keyin havola operatori(&), undan keyin esa havola nomi yoziladi. Havolalarni nomlashda o‘zgaruvchilarni nomlash uchun mumkin bo‘lgan ixtiyoriy nomdan foydalanish mumkin. Lekin ko‘p dasturchilar havola nomlari oldidan «r» perefiksini yozishni lozim deb hisoblashadi. Agarda someInt nomli butun tipli o‘zgaruvchi berilgan bo‘lsa, bu o‘zgaruvchiga havolani tuzish uchun quyidagi yozuvni yozish lozim.
int & rSomeInt = someInt
Agarda havolaning adresini olmoqchi bo‘lsak, u o‘zining adresati adresini qaytaradi. Havola o‘ziga xos tabiati aynan shu holatdir. Havolalar o‘zlarining adresatlarining psevdonimlari hisoblanadilar. YA’ni ular adresatlari bilan bir xil adresga egadirlar.
Havolalar orqali ixtiyoriy ob’ektlarga, shuningdek foydalanuvchi tomonidan aniqlangan ob’ektlarga ham murojaat qilish mumkin. Havolalar sinflar uchun emas, balki ob’ektlar uchun tuziladi. Haqiqatan ham havola quyidagicha e’lon qilinishi mumkin emas.
Havolalar orqali ixtiyoriy ob’ektlarga, shuningdek foydalanuvchi tomonidan aniqlangan ob’ektlarga ham murojaat qilish mumkin. Havolalar sinflar uchun emas, balki ob’ektlar uchun tuziladi. Haqiqatan ham havola quyidagicha e’lon qilinishi mumkin emas.
int & rIntRef = int ; // noto‘g‘ri
rIntRef nomli havolaga butun qiymatli o‘zgaruvchini o‘zlashtirish mumkin. Masalan,
int howBig = 200 ;
int & rIntRef = howBig ;
Agarda ko‘rsatkichga qiymat o‘zlashtirilmagan yoki u bo‘shatilgan bo‘lsa unga nol qiymat (0) berish lozim. Bu holat havolalarga tegishli emas. Umuman, havolalar nol bo‘lmasligi lozim va nol ob’ektlarga havolalarni saqlovchi dastur nokorrekt hisoblanadi. Nokorrekt dasturning ishlash jarayonida turli xatolik paydo bo‘lishi mumkin.
C++ tilida funksiyaga argumentlarni havola ko‘rinishida uzatishda ikki usuldan foydalaniladi. Ular yoki ko‘rsatkichlar yordamida, yoki havolalar yordamida uzatiladi.
C++ tilida funksiyaga argumentlarni havola ko‘rinishida uzatishda ikki usuldan foydalaniladi. Ular yoki ko‘rsatkichlar yordamida, yoki havolalar yordamida uzatiladi.
Ko‘rsatgichning qo‘llanilish sintaksisi havolaning ishlatilish sintaksisidan farq qilishiga qaramay ular yordamida bir xil ish bajariladi. Funksiyaga uning ko‘rinish sohasi chegarasi uchun ob’ektning nusxasi o‘rniga uning o‘zi uzatiladi.
Funksiyaga argument sifatida ko‘rsatkichni uzatishda, biz ob’ektning adresini funksiyaga beramiz va funksiya bu orqali berilgan adresdagi qiymatni o‘zgartirishi mumkin, ya’ni funksiya bevosita o‘ziga parametr qilib uzatiladigan ob’ekt ustida amallar bajaradi. swap() funksiyasi berilgan o‘zgaruvchilarni real qiymatlarini o‘zgartirishi uchun, uni shunday e’lon qilish lozimki, funksiya ikkita butun qiymatga ko‘rsatgichni uzatishi mumkin bo‘lsin. Funksiya ichida ko‘rsatkich adresidagi qiymatlarni olish operatoridan foydalanib x va uuzgaruvchilarning real qiymatlarini almashtiramiz.
Funksiyaga argument sifatida ko‘rsatkichni uzatishda, biz ob’ektning adresini funksiyaga beramiz va funksiya bu orqali berilgan adresdagi qiymatni o‘zgartirishi mumkin, ya’ni funksiya bevosita o‘ziga parametr qilib uzatiladigan ob’ekt ustida amallar bajaradi. swap() funksiyasi berilgan o‘zgaruvchilarni real qiymatlarini o‘zgartirishi uchun, uni shunday e’lon qilish lozimki, funksiya ikkita butun qiymatga ko‘rsatgichni uzatishi mumkin bo‘lsin. Funksiya ichida ko‘rsatkich adresidagi qiymatlarni olish operatoridan foydalanib x va uuzgaruvchilarning real qiymatlarini almashtiramiz.
Qachon havolalarni, qachon esa ko‘rsatgichlarni ishlatish lozim degan savolga men, 2 ta qoida bilan javob topasiz deyman.
1- havolalarga qiymat berish mumkin emas. Bunda Agarda sizga oldin bir, keyin esa boshqa ob’ektni ko‘rsatish lozim bo‘lsa u holda albatta ko‘rsatgichlardan foydalanishga to‘g‘ri keladi.
2- Havolalar nol qiymatni qabul qilmaydi. Bunda qaralayotgan ob’ektning nol bo‘lib qolish ehtimoli mavjud bo‘lsa ham havolalarni ishlatish mumkin emas. Bu holda ham ko‘rsatgichlar ishlatilishi kerak.
Ob’ektlarni qiymat sifatida uzatish muzeyga haqiqiy asar fotografiyasini topshirishga o‘xshagan amaldir. Agarda biror bir bekorchi fotosuratni buzib qo‘ysa uning originaliga hech qanday zarar etmaydi. Havola bo‘yicha ob’ektlarni uzatish esa muzeyga o‘zingizni uy adresingizni qoldirish va o‘zingizni ishtirokingizda qimmatbaho jihozga ko‘rishga o‘xshaydi.