C++ friend funksiyasi va sinflari
Ma'lumotlarni yashirish object-oriented programming ning asosiy tushunchasidir. Bu sinfdan tashqaridagi shaxsiy a'zolarning kirishini cheklaydi.
Xuddi shunday, himoyalangan a'zolarga faqat olingan sinflar orqali kirish mumkin va tashqaridan kirish mumkin emas. Masalan,
class MyClass {
private:
int member1;
}
int main() {
MyClass obj;
// Xato! Bu yerdan shaxsiy aʼzolarga kira olmaysiz.
obj.member1 = 5;
}
Biroq, C++ da bu qoidani buzadigan va sinfdan tashqaridagi a'zolar funksiyalariga kirishga imkon beruvchi do'st funksiyalari deb ataladigan xususiyat mavjud.
Xuddi shunday, do'stlar sinfi ham bor, biz ushbu qo'llanmada keyinroq bilib olamiz.
Do'st funksiyasi sinfning shaxsiy va himoyalangan ma'lumotlariga kirishi mumkin. Biz sinfning asosiy qismidagi friend kalit so'zidan foydalanib, do'st funksiyasini e'lon qilamiz.
class className {
... .. ...
friend returnType functionName(arguments);
... .. ...
}
// Do'st funksiyasining ishlashini ko'rsatish uchun C++ dasturi
#include <iostream>
using namespace std;
class Distance {
private:
int meter;
// do'st funksiyasi
friend int addFive(Distance);
public:
Distance() : meter(0) {}
};
// do'st funksiyasi ta'rifi
int addFive(Distance d) {
// do'st funksiyasidan shaxsiy a'zolarga kirish
d.meter += 5;
return d.meter;
}
int main() {
Distance D;
cout << "Distance: " << addFive(D);
return 0;
}
Chiqish
Distance: 5
Bu erda addFive() ham shaxsiy, ham umumiy ma'lumotlar a'zolariga kirishi mumkin bo'lgan do'st funksiyasidir.
Garchi bu misol bizga doʻst funksiyasi tushunchasi haqida tushuncha bergan boʻlsa-da, u hech qanday mazmunli foydalanishni koʻrsatmaydi.
Ikki xil sinfdagi objects da yanada mazmunli foydalanish mumkin. O'shanda do'st funksiyasi juda foydali bo'lishi mumkin.
// Doʻst funksiyalaridan foydalangan holda ikki xil sinf aʼzolarini qoʻshing
#include <iostream>
using namespace std;
// oldinga deklaratsiya
class ClassB;
class ClassA {
public:
// numA ni 12 ga ishga tushirish uchun konstruktor
ClassA() : numA(12) {}
private:
int numA;
// do'st funksiyasi deklaratsiyasi
friend int add(ClassA, ClassB);
};
class ClassB {
public:
// numB ni 1 ga ishga tushirish uchun konstruktor
ClassB() : numB(1) {}
private:
int numB;
// do'st funksiyasi deklaratsiyasi
friend int add(ClassA, ClassB);
};
// ikkala sinf a'zolariga kirish
int add(ClassA objectA, ClassB objectB) {
return (objectA.numA + objectB.numB);
}
int main() {
ClassA objectA;
ClassB objectB;
cout << "Sum: " << add(objectA, objectB);
return 0;
}
Chiqish
Sum: 13
Ushbu dasturda ClassA va ClassB add() ni do'st funksiyasi sifatida e'lon qildi. Shunday qilib, ushbu funksiya ikkala sinfning shaxsiy ma'lumotlariga kirishi mumkin.
Bu erda diqqat qilish kerak bo'lgan narsa ClassA ichidagi do'st funksiyasi ClassB dan foydalanishdir. Biroq, biz hozircha ClassB ni aniqlamadik.
// sinf ichida
friend int add(ClassA, ClassB);
Buning ishlashi uchun dasturimizda ClassB ning oldingi deklaratsiyasi kerak.
// oldinga deklaratsiya
class ClassB;
friend kalit so'zidan foydalanib, biz C++ da do'st sinfidan foydalanishimiz mumkin. Masalan,
class ClassB;
class ClassA {
// ClassB bu ClassA sinfining do'st sinfidir
friend class ClassB;
... .. ...
}
class ClassB {
... .. ...
}
Agar sinf do'st sinf deb e'lon qilingan bo'lsa, do'st sinfining barcha a'zo funksiyalari do'st funksiyalariga aylanadi.
ClassB do'st sinfi bo'lgani uchun biz ClassA ning barcha a'zolariga ClassB ichidan kirishimiz mumkin.
Biroq, biz ClassB a'zolariga ClassA ichidan kira olmaymiz. Buning sababi, C++ da do'stlik munosabatlari faqat berilgan, olinmaydi.
// Do'stlar sinfining ishini ko'rsatish uchun C++ dasturi
#include <iostream>
using namespace std;
// oldinga deklaratsiya
class ClassB;
class ClassA {
private:
int numA;
// do'st sinf deklaratsiyasi
friend class ClassB;
public:
// numA ni 12 ga ishga tushirish uchun konstruktor
ClassA() : numA(12) {}
};
class ClassB {
private:
int numB;
public:
// numB ni 1 ga ishga tushirish uchun konstruktor
ClassB() : numB(1) {}
// numA qo'shish uchun a'zo funksiyasi
// A sinfidan va B sinfidan numB
int add() {
ClassA objectA;
return objectA.numA + numB;
}
};
int main() {
ClassB objectB;
cout << "Sum: " << objectB.add();
return 0;
}
Chiqish
Sum: 13
Bu erda ClassB ClassA ning do'st sinfidir. Shunday qilib, ClassB classA a'zolariga kirish huquqiga ega.
ClassB da biz numA va numB yig'indisini qaytaruvchi add() funksiyasini yaratdik.
ClassB do'st sinfi bo'lgani uchun biz ClassB ichida ClassA ob'ektlarini yaratishimiz mumkin.
Shuningdek o'qing: