Friend Classes ve Functions: Özel Verilere Dışarıdan Erişim İzni

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16

Friend Yapısı: Kapsüllemeyi Güvenle Esnetmek​


Bir sınıf, başka bir fonksiyonu veya sınıfı friend olarak ilan ederse, ona tüm private ve protected kapılarını açmış olur. Bu, "Sen benim arkadaşımsın, benden gizlin saklın yok" demektir.



1. Friend Functions (Arkadaş Fonksiyonlar)​


Sınıfın bir üyesi (member) olmadığı halde, sınıfın özel verilerine erişebilen global fonksiyonlardır. Genellikle iki farklı sınıfın verilerini karşılaştırmak veya operatör aşırı yükleme (operator overloading) işlemlerinde kullanılır.

C++:
class Kumbaram {
private:
int bakiye = 500;

public:
// Arkadas fonksiyon bildirimi
friend void bankaMufettisi(Kumbaram k);
};

void bankaMufettisi(Kumbaram k) {
// k.bakiye private olmasina ragmen erisebilir
cout << "Mufettis bakiyeyi kontrol ediyor: " << k.bakiye << endl;
}



2. Friend Classes (Arkadaş Sınıflar)​


Eğer bir sınıfın tüm fonksiyonlarının, başka bir sınıfın özel verilerine erişmesini istiyorsanız, sınıfın tamamını friend yaparsınız.

C++:
class AkilliEv {
private:
string kapiSifresi = "1234";

// TeknikServis sinifi artik tum verilere ulasabilir
friend class TeknikServis;

};

class TeknikServis {
public:
void sifreSifirla(AkilliEv& ev) {
ev.kapiSifresi = "0000"; // Private veriye direkt müdahale
}
};



3. Bilmeniz Gereken Altın Kurallar​



  • []Arkadaşlık Karşılıklı Değildir: A sınıfı B'nin arkadaşıysa, bu B'nin de A'nın arkadaşı olduğu anlamına gelmez. İzin tek taraflıdır.
    []Arkadaşlık Kalıtsal Değildir: Babanızın arkadaşı, sizin de arkadaşınız olmak zorunda değildir. Üst sınıfın arkadaşları alt sınıfa (derived class) otomatik olarak geçmez.
  • Arkadaşlık Verilmelidir, Alınamaz: Bir fonksiyon "Ben senin arkadaşınım" diyerek içeri dalamaz. İzin mutlaka hedef sınıfın içinde friend anahtar kelimesiyle verilmelidir.



4. Neden Kullanılır?​


DurumNeden Friend Kullanılmalı?
Operatör Overloading<< veya >> gibi operatörleri sınıfa özel tanımlarken.
Sıkı İlişkili SınıflarÖrneğin bir LinkedList sınıfı ile onun Node (Düğüm) yapısı arasındaki iletişimde.
PerformansGetter/Setter fonksiyonlarının ek yükünden kurtulup doğrudan veriye ulaşmak gerektiğinde.



Sonuç​


Friend yapısı, kapsülleme ilkesini tamamen yıkmak için değil, kontrollü bir şekilde esnetmek için tasarlanmıştır. Fazla kullanımı kodun güvenliğini ve sürdürülebilirliğini zayıflatabilir ("Spaghetti Code" riski). Bu yüzden sadece gerçekten gerekli olduğu durumlarda başvurulması önerilir.
 
Geri
Üst