ProgramlamaBackend Geliştirici

C++'da statik ve dinamik sınıf üyeleri nedir? Özellikleri, başlatma yöntemleri ve kullanım kuralları nelerdir?

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

Cevap.

Konunun Tarihçesi

C++'da sınıflar, statik ve dinamik üyelere (değişkenler ve fonksiyonlar) sahip olabilir. Bu, ortak verileri desteklemek ve belirli bir örneğin durumuna erişim gerektirmeyen fonksiyonlar için oluşturulmuştur.

Problemler

Statik ve dinamik üyeleri ayırt etmek önemlidir çünkü onların yaşam döngüleri, görünürlük alanları ve başlatma kuralları farklıdır. Sık karşılaşılan hatalar arasında yanlış tanım, örnek ve statik üyelerin aynı anda kullanılması, header dosyalarında tekrar tanımlar bulunmaktadır.

Çözüm

Sınıfın statik değişkenleri, sınıf içinde "static" olarak tanımlanır, ancak sınıf dışında ayrıca tanımlanmalıdır (C++17'den önce). Tek bir örnekte var olurlar. Statik fonksiyonlar, açık bir belirti olmaksızın dinamik (örnek) üyelere erişemez.

Kod örneği:

class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;

Anahtar Özellikler:

  • Statik üyeler, sınıfın tüm örnekleri arasında durumu paylaşır
  • Sınıfın bir örneği olmadan statik üyeler kullanılabilir
  • Statik değişkenlerin başlatılması, sınıf tanımından dışarıda yapılmalıdır (C++17'den önce)

Aksak Sorular.

Statik bir sınıf değişkenini doğrudan sınıf içinde başlatmak mümkün mü (C++17'den önce)?

Hayır, C++17'den önce bir statik üye için sınıf dışında bir tanım verilmesi gerekir. C++17 ve üzeri için inline static tanım doğrudan sınıf içinde mümkündür.

// C++17 class Foo { inline static int counter = 0; };

Statik sınıf fonksiyonu, this veya dinamik üyelere erişim sağlıyor mu?

Hayır, statik üyeler dinamik üyelere veya this'e erişim sağlamaz, sınıf örnekleri oluşturulmuş olsa bile. Erişim için açıkça bir nesne iletilmelidir.


Statik sınıf üyesi her sınıf örneği için mi oluşturulur?

Hayır, statik üyeler, nesnelerin sayısından bağımsız olarak sınıf için tek bir örnekte mevcuttur.

Tipik Hatalar ve Anti-Model

  • Statik üyeler, sınıf dışında tanımlanmamıştır (eski standartlarda)
  • Her bir nesneye bağlı verileri saklamak için statik üyelerin kullanımı
  • Küresel statik değişkenlerle kapsülleme ihlali

Gerçek Hayattan Bir Örnek

Olumsuz Durum

Bir geliştirici sınıfta static int tanımlar ancak sınıf dışında tanımlamaz. Bağlayıcı, statik üyenin başlatılmadığı için undefined symbol hatası verir.

Artılar:

  • Derleyici, derlemede bir hata vermez.

Eksiler:

  • Bağlama hataları
  • Değişken başlatmadan önce kullanıldığında gizemli çalışma zamanı hataları

Olumlu Durum

Statik üye sınıfta tanımlanmış, sınıf dışında tanımlanmış ve oluşturulan nesnelerin sayacısı olarak kullanılmıştır.

Artılar:

  • Durum için tek depolama alanı
  • Şeffaf başlatma ve düzgün çalışma

Eksiler:

  • Çoklu iş parçacığı ortamında koşul yarışı durumu olabilir (ek koruma gereklidir).