Konu tarihi:
Eski C++ sürümlerinde, tüm sınıf üyeleri ya yapıcı listesinin içeriğinde ya da yapıcının gövdesinde başlatılmak zorundaydı. C++11 ile birlikte, sınıfın statik olmayan üyeleri, tanım yerinde doğrudan başlatılabilmesi mümkün hale geldi — bu, okunabilirliği önemli ölçüde artırdı ve başlatılmamış değişkenlerle ilgili hata olasılığını azalttı.
Sorun:
Varsayılan başlatmanın olmaması, geliştiriciler için çok belirgin olmayan davranışlarla sonuçlandı, özellikle yeni yapıcılar eklenirken. Sınıf üyelerinin her zaman başlatıldığının garantisi yoktu. Bu yaklaşımın güzelliği ve yeniliği, boilerplate kodunun azaltılmasıdır.
Çözüm:
Satır içi başlatma, bir sınıf üyesi, yapıcı liste içinde açıkça başlatılmadıysa, o sınıf üyesi için varsayılan bir değer belirler.
Kod örneği:
class Widget { int value = 42; std::string name{"default"}; public: Widget() {} Widget(int v) : value(v) {} };
Temel özellikler:
Yapıcı listesindeki üye belirtilmişse, satır içi başlatmadan elde edilen değer kullanılacak mı?
Hayır, yapıcı listesinde belirtilen değer kullanılacaktır. Örnek:
class Test { int a = 10; public: Test(int x) : a(x) {} }; Test t(42); // a == 42
Statik sınıf üyeleri satır içi olarak başlatılabilir mi?
Hayır, yalnızca statik olmayanlar. Statik sınıf üyeleri, sınıf dışında ayrı olarak başlatılır.
Sınıf öğelerini satır içi olarak başlatmak için ifadeler kullanılabilir mi?
Basit üyeler için — evet (örneğin, yapıcı çağrısı veya literali). Karmaşık hesaplamalar için, bir fonksiyon ya da yapıcıda başlatma kullanın.
Ekip yeni bir yapıcı ekledi ancak üye değişkenini başlatmayı unuttu. Değeri başlatılmamış kaldı. Değişkenin erişimi sırasında çökme meydana geldi.
Artılar:
Eksiler:
Tüm sınıf alanları için satır içi başlatma uygulandı. Yeni yapıcılarda başlatmayı açıkça belirtmek zorunda kalmadık, boilerplate kodu ve hata sayısı azaldı.
Artılar:
Eksiler: