ProgramlamaC++ backend geliştirici

Sınıf içindeki static üyelerin (değişkenler ve fonksiyonlar) çalışması hakkında konuşun. Static üyeler nasıl başlatılır, tanımlanması ve kullanımı ile ilgili hangi zorluklar ortaya çıkar ve static üyeler sınıfın normal üyelerinden nasıl farklıdır?

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

Cevap

Sınıfın static üyeleri sınıf için tek bir örnekte mevcut olup, tüm nesneler için ortak bir değerdir.

  • static-değişkenler sınıfın dışında, genellikle cpp dosyasında, sınıfın dışında başlatılır (int Foo::count = 0;). Sınıf içinde bildiriyoruz, ancak tanımlıyoruz dışında.
  • static-fonksiyonlar hem sınıf üzerinden hem de nesne üzerinden çağrılabilir. Belirli bir örneğin üyelerine (this) erişimleri yoktur, yalnızca diğer static üyelere erişebilirler.

Örnek kod

class Counter { public: static int count; static void increment() { ++count; } }; int Counter::count = 0; int main() { Counter::increment(); Counter c1, c2; c1.increment(); // count == 2 }

İncelikli Soru

«Static bir üyenin tanımı başlık dosyasında olabilir mi? Hangi riskler ortaya çıkar?»

Cevap: Evet, tanım (int Foo::value = 0;) başlık dosyası içinde teknik olarak mümkündür, ancak bu başlık birden çok çeviri birimine dahil edilecek olursa, çoğaltma (multiple definition) ile sonuçlanır ve bu da bağlantı hatalarına neden olur. Bu nedenle, static üyelerin yalnızca bir cpp dosyasında tanımlanması gerekir.


Konuyla ilgili ince detaylara dair gerçek hata örnekleri.


Hikaye

Kütüphane kodunda bir static üye doğrudan başlık dosyasında tanımlandı. Çoklu dahil etme, bağlantı hatalarına neden oldu: "multiple definition of ...". Tanımın ayrı bir cpp dosyasına taşınmasıyla sorun ortadan kalktı.


Hikaye

Eğitim projesinde bir static üye bildirildi, ancak onu dış cpp dosyasında tanımayı unuttular. Başlık dosyalarında hata olmamasına rağmen, bağlantıda unresolved external symbol hatası ortaya çıktı. Kayıp tanımı bulmak ve eklemek gerekiyordu.


Hikaye

Büyük bir gömülü sistemde hesaplanan bir değerle static üyenin başlatılmasında hata yapıldı (kod yürütülmesini gerektiren bir ifade ile başlatmaya çalıştılar). Mantığı ayrı bir başlatma fonksiyonuna ayırdılar, ancak dikkat eksikliği nedeniyle, bu fonksiyonu ilk erişimden önce çağırmayı unuttular — sonuç, başlatılmamış değişkenler ve erratic behaviordur.