friend anahtar kelimesi, belirli bir fonksiyonun veya diğer bir sınıfın, friend olarak tanımlandığı sınıfın özel ve korumalı üyelerine erişmesine izin verir. Friend fonksiyonları hem global olabilir hem de diğer sınıfların metotları olarak tanımlanabilir. Bu yapı, sınıfın iç durumuna erişim gerektiren, ancak bu sınıfın arayüzü ile mantıksal olarak ilgili olmayan fonksiyonların gerçekleştirilmesine olanak tanır.
Friend kullanımını öneriyoruz:
Dikkat:
Örnek:
class Box { int width; public: Box(int w): width(w) {} friend void printWidth(const Box &b); }; void printWidth(const Box &b) { std::cout << b.width << std::endl; }
Soru: Friend fonksiyonu sanal olabilir mi?
Sık cevaben: Evet, çünkü friend — bir fonksiyon modifikatörüdür.
Doğru cevap: Hayır, friend fonksiyonlar sanal olamaz, çünkü sınıfın üyeleri değillerdir!
Örnek:
class Example { friend virtual void foo(); // Derleme hatası: virtual friend'e uygulanmaz };
Hikaye: Matris kütüphanesi tasarlanırken, tüm aritmetik operatörler hızlandırmak için friend fonksiyonları olarak oluşturuldu, ancak değişkenliğin desteklenmesi unutuldu ve özel üyelere gereksiz yere erişim açıldı. Daha sonra, projede diğer fonksiyonlar yanlışlıkla Matrix'in iç durumunu değiştirdi.
Hikaye: Kurumsal sistemde, yardımcı sınıflar özel üyelerine erişim paylaşmak için birbirlerine friend yapıldılar. Bu döngüsel bağımlılıklara neden oldu — yeni bir özellik eklemek, tüm bağlantılı sınıfları değiştirmeyi gerektiriyordu. Sonra gelen yeniden yapılandırma haftalar sürdü.
Hikaye: Kapalı testler için, test sınıfının üretim sınıfına friend yapılmasına karar verildi. Birkaç birim test seti ortaya çıktığında, hangi özel metodların gerçekten kullanıldığını takip etmek imkansız hale geldi — testler, iç uygulamaya bağımlı hale geldi ve bu da kodun karmaşık bir şekilde bakımını zorlaştırdı.