Bu eğitimde, örnekler yardımıyla C ++ 'da arkadaş işlevleri ve arkadaş sınıfları oluşturmayı öğreneceğiz.
Veri gizleme, nesne yönelimli programlamanın temel bir konseptidir. Özel üyelerin sınıf dışından erişimini kısıtlar.
Benzer şekilde, korumalı üyelere yalnızca türetilmiş sınıflar tarafından erişilebilir ve dışarıdan erişilemez. Örneğin,
class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )
Ancak, C ++ 'da bu kuralı bozan ve sınıf dışından üye işlevlerine erişmemize izin veren arkadaş işlevleri adı verilen bir özellik vardır .
Benzer şekilde, bu eğitimde daha sonra öğreneceğimiz bir arkadaş sınıfı da var.
C ++ 'da arkadaş işlevi
Bir arkadaş işlevi , bir sınıfın özel ve korumalı verilerine erişebilir . friend
Sınıfın gövdesinin içindeki anahtar kelimeyi kullanarak bir arkadaş işlevi ilan ederiz .
class className (… friend returnType functionName(arguments);… )
Örnek 1: Arkadaşın Çalışması Fonksiyonu
// C++ program to demonstrate the working of friend function #include using namespace std; class Distance ( private: int meter; // friend function friend int addFive(Distance); public: Distance() : meter(0) () ); // friend function definition int addFive(Distance d) ( //accessing private members from the friend function d.meter += 5; return d.meter; ) int main() ( Distance D; cout << "Distance: " << addFive(D); return 0; )
Çıktı
Mesafe: 5
Burada, addFive()
hem erişebilir arkadaş fonksiyonudur özel ve kamu veri üyeleri.
Bu örnek bize arkadaş işlevi kavramı hakkında bir fikir verse de anlamlı bir kullanım göstermiyor.
Daha anlamlı bir kullanım, iki farklı sınıftaki nesneler üzerinde çalışmak olacaktır. İşte o zaman arkadaş işlevi çok yardımcı olabilir.
Örnek 2: İki Farklı Sınıfın Üyelerini Ekleme
// Add members of two different classes using friend functions #include using namespace std; // forward declaration class ClassB; class ClassA ( public: // constructor to initialize numA to 12 ClassA() : numA(12) () private: int numA; // friend function declaration friend int add(ClassA, ClassB); ); class ClassB ( public: // constructor to initialize numB to 1 ClassB() : numB(1) () private: int numB; // friend function declaration friend int add(ClassA, ClassB); ); // access members of both classes int add(ClassA objectA, ClassB objectB) ( return (objectA.numA + objectB.numB); ) int main() ( ClassA objectA; ClassB objectB; cout << "Sum: " << add(objectA, objectB); return 0; )
Çıktı
Toplam: 13
Bu programda ClassA
ve arkadaş fonksiyonu olarak ClassB
ilan etmiş bulunmaktayız add()
. Böylece, bu işlev her iki sınıfın özel verilerine erişebilir .
Burada dikkat edilmesi gereken bir şey arkadaşı fonksiyonu içindedir ClassA
kullanıyor ClassB
. Ancak ClassB
bu noktada tanımlamadık .
// inside classA friend int add(ClassA, ClassB);
Bunun işe yaraması ClassB
için programımızda ileriye dönük bir beyana ihtiyacımız var .
// forward declaration class ClassB;
C ++ arkadaş sınıfı
C ++ 'da bir arkadaş sınıfını friend
anahtar kelimeyi kullanarak da kullanabiliriz . Örneğin,
class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )
Bir sınıf bir arkadaş sınıfı olarak bildirildiğinde, arkadaş sınıfının tüm üye işlevleri arkadaş işlevleri haline gelir.
Yana classB
arkadaş sınıftır, biz tüm üyelerini erişebilir classA
içeriden classB
.
Ancak üyelerine ClassB
içeriden erişemiyoruz classA
. Bunun nedeni, C ++ 'da arkadaş ilişkisinin yalnızca verilmiş olması, alınmamasıdır.
Örnek 3: C ++ arkadaş Sınıfı
// C++ program to demonstrate the working of friend class #include using namespace std; // forward declaration class ClassB; class ClassA ( private: int numA; // friend class declaration friend class ClassB; public: // constructor to initialize numA to 12 ClassA() : numA(12) () ); class ClassB ( private: int numB; public: // constructor to initialize numB to 1 ClassB() : numB(1) () // member function to add numA // from ClassA and numB from ClassB int add() ( ClassA objectA; return objectA.numA + numB; ) ); int main() ( ClassB objectB; cout << "Sum: " << objectB.add(); return 0; )
Çıktı
Toplam: 13
Burada ClassB
bir arkadaş sınıfı var ClassA
. Yani, ClassB
üyelerine erişimi var classA
.
İçinde ClassB
, add()
numA ve numB toplamını döndüren bir fonksiyon oluşturduk .
Yana ClassB
arkadaş sınıftır, biz nesneleri oluşturabilir ClassA
iç ClassB
.