Amallarning ortiqcha yuklanishi
C++ konkret sinf obyektlari bilan foydalanganda berilgan funksiyalarni bajara oladigan qilib ko’pgina amallar ishini qayta aniqlab chiqishga imkon beradi. Bu standart ma’lumotlar tipi kabi o’zining ma’lumotlar tipidan foydalanishga imkon beradi. Xos amallar uchun belgilashlar kiritish mumkin emas.
. .* ?: :: # ## sizeof
lardan tashqari C++ da mavjud ixtiyoriy amallarni ortiqcha yuklash mumkin.
Amallarmi ortiqcha yuklash maxsus ko’rinishdagi usul (funksiya-amallar) yordamida amalga oshiriladi va quyidagi prinsiplarga bo’ysunadi:
amallar ortiqcha yuklanishida standart tipdagi ma’lumotlarda foydalaniladigan argumentlar soni, amallar imtiyozlari va assotsiatsiya qoidalari (o’ngdan chapga yoki chapdan o’ngga) saqlanadi;
standart tipdagi ma’lumotlar uchun amallarni qayta aniqlash mumkin emas;
funksiya-amallar jimlik bo’yicha argumentlarga ega bo’lishi mumkin emas;
funksiya-amallar meros qilinadi (= dan tashqari);
funksiya-amallar static kabi aniqlanishi mumkin emas.
Funksiya-amallarni uchta usul bilan aniqlash mumkin: u singning usuli yoki sinfning do’stona funksiyasi yoki odatdagi funksiya bo’lishi lozim. Oxirgi ikki holda funksiya sinf, ko’rsatgich yoki sinfga murojaat tipiga ega bo’lgan hech bo’lmaganda bitta argumentni qabul qilishi lozim.
Funksiya-amal operator tayanch iborasini o’z ichiga oladi, undan keyin amalni qayta aniqlash ishorasi keladi:
Tip operator operatsiya (parametrlar ro’yxati) {funksiya tanasi}
Unar amallarni qayta yuklash
Unar funksiya-amal sinf ichida aniqlanib parametrlarsiz statik bo’lmagan usul yordamida ifodalanishi lozim, bunda operand bo’lib uni chaqirgan obyekt hisoblanadi, masalan:
class monstr{
…
monstr & operator ++() {++health; return *this;}
};
monstr Vasia;
cout << (++Vasia).get_health();
Agar funksiya sinfdan tashqarida aniqlansa, u sinf tipidagi parametrga ega bo’lishi lozim:
class monstr{
…
friend monstr & operator ++( monstr &M);
};
monstr& operator ++(monstr &M) {++M.health; return M;}
Agar funksiyaning sinf ichida do’stona sifatida tavsiflanmasa, o’zgaruvchi maydonlarga kirish mavjudligini hisobga olish lozim. Berilgan holda health maydonga tashqaridan kirish yo’q, chunki private spetsifikatori bilan tavsiflangan, shuning uchun uni o’zgartirish uchun mos usuldan foydalanish talab etiladi. monstr sinf tavsifiga change_health usulni kiritamiz, u health maydon qiymatini o’zgartirishga imkon beradi.
void change__health(int he){ health = he;}
U holda inkrement amalini sinfdan tashqarida tavsiflangan odatdagi funksiya yordamida qayta yuklash mumkin:
monstr& operator ++(monstr &М){
int h = M.get__health(); h++;
M.change_health(h);
return М;
}
Postfiks inkrement va dekrement int tipidagi birinchi parametrga ega bo’lishi lozim. U ularni forma perifekatsiyasidan farq qilish uchun qo’llaniladi.
class monstr {
…
monstr operator ++(int){
monstr M(*this); health++;
return M;
}
};
monstr Vasia;
cout << (Vasia++).get_health();
Do'stlaringiz bilan baham: |