ProgramlamaC++ geliştirici

C++'ta 'friend' nedir? Hangi durumlarda friend fonksiyonları veya sınıflarının kullanılmasını önerirsiniz ve bu durumlarda güvenlik ve tasarım ile ilgili hangi incelikler ortaya çıkar?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Karşılaştırma operatörleri, matematiksel operatörler (operator<<, operator== vb.) uygulanmak istendiğinde, fonksiyonların aynı anda iki nesnenin özel üyelerine erişmesi gerektiğinde.
  • Dış bir fonksiyonun mantıken sınıfın metodu olmaması, ancak sınıfın davranışının bir kısmını gerçekleştirmesi gerektiğinde.
  • Birbirleriyle sıkı bir ilişki içinde olan çalışan sınıflar için (örneğin, komşu iç nesnelerin özel verilere erişimi).

Dikkat:

  • Friend fonksiyonların atanması, özel verilere erişim sağlar ve enkapsülasyonu ihlal eder.
  • Friend'nin kötüye kullanılması, kodda bağımlılığın artmasına ve güvenliğin zayıflamasına neden olabilir.

Ö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; }

Kandıra Sorusu

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 };

Konuyla ilgili inceliklerin bilinmemesinden kaynaklanan gerçek hata örnekleri


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