45 / 90

C++ Friend Function & Friend Classes

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,

example.cpp
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.

dost C++ da funksiyasi

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.

example.cpp
class className {
    ... .. ...
    friend returnType functionName(arguments);
    ... .. ...
}

1-misol: Do'stning ishlashi

example.cpp
// 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

kod
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.

2-misol: Ikki xil sinf a'zolarini qo'shing

example.cpp
// 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

kod
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.

example.cpp
// sinf ichida
friend int add(ClassA, ClassB);

Buning ishlashi uchun dasturimizda ClassB ning oldingi deklaratsiyasi kerak.

example.cpp
// oldinga deklaratsiya
class ClassB;

C++ tilidagi do'st sinfi

friend kalit so'zidan foydalanib, biz C++ da do'st sinfidan foydalanishimiz mumkin. Masalan,

example.cpp
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.

3-misol: C++ do‘st sinfi

example.cpp
// 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

kod
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: