C++’ta sınıf üyelerinin başlangıç sırası her zaman sınıfın tanımında bildirildiği sırayla gerçekleşir, yapıcının başlangıç listesinde belirtilen sıraya bağlı değildir.
Örnek:
struct Foo { int a; int b; Foo() : b(2), a(b) {} };
Bu örnekte, öncelikle a tanımsız b değişkeninin değeriyle başlatılacaktır, çünkü önce a, sonra b başlatılır; bu, başlangıç listesinin sırasından bağımsızdır. Sonuç olarak, a 2'ye eşit olmayacaktır.
Doğru yaklaşım: Başlatma sırasında yalnızca yukarıda bildirilen üyelere veya sabitlere atıfta bulunmaktır.
Sınıf üyeleri, yapıcının başlangıç listesinde başlangıç sırası bildirildiği durumlarda hangi sırayla başlatılacaktır?
Cevap: Her zaman, sınıfta ilk bildirilen üye ilk olarak başlatılır; bu, yapıcının başlangıç listesinde belirtilen sıraya bağlı değildir. Bu, sınıf üyeleri arasındaki karşılıklı bağımlılık durumlarında hatalara yol açabilir.
Hikaye
Karmaşık bir sınıfta, başka bir üye ile referans başlatılırken, diğer üye başlatılmamıştı. Başlangıç listesinin sırasının bir önemi olmadığını anlamış oldular ve başlatılmamış bellek kullanımı ortaya çıktı. Yazılım sadece belirli derleyiciler ve ayarlarla çöktü.
Hikaye
Sınıfa yeni bir üye eklenirken, baştan bağımlı üyelerin başlangıç sırasının düzeltilmemesi hatasıyla karşılaşıldı ve bu yalnızca statik kod analizi sırasında ortaya çıktı. Değişken, eski bildirim sırasından geçersiz bir değer aldı.
Hikaye
Kütüphanenin yeni bir sürümü, sınıfın kaynak kodunu değiştirdi ve üyelerin sırasını değiştirdi fakat yapıcıyı değiştirmedi. Sonuç olarak, uygulamadaki değerler geçersiz verilerle çalıştı: mühendis nedenini anlayana kadar uzun süre bekledi, derleyicinin başlangıç sırası hakkında uyarısını görene kadar.