C++'in ilk versiyonlarında, sınıf üyeleri yapıcı içinde atama yoluyla başlatılıyordu. Sonrasında, yapıcı gövdesine girmeden sınıf üyelerinin başlatılmasını sağlayan başlangıç listesi (initializer list) kullanma imkanı ortaya çıktı ki bu durum sabit (const) üyeler, referanslar ve performans için kritik öneme sahiptir.
Bazı sınıf üyeleri (örneğin, const alanlar veya referanslar) yapıcı gövdesinin içinde atama yoluyla başlatılamaz — bunlar oluşturulurken belirlenmelidir. Ayrıca, atama kullanıldığında önce varsayılan yapıcı çağrılır, sonra atama yapılır (iki eylem), bu da karmaşık nesneler için maliyetli olabilir:
class Example { const int x; std::string str; public: Example(int val, const std::string& s) : x(val), str(s) {} };
Sınıf üyelerini anında başlatmak için başlangıç listesi kullanın. Bu, sabitler, referanslar, varsayılan yapıcıya sahip olmayan üye sınıfları için özellikle önemlidir ve STL sınıfları ile büyük yapılar üzerinde çalışırken performans için kritik öneme sahiptir.
Kod örneği:
class Point { const int x; int& y; public: Point(int val, int& ref) : x(val), y(ref) {} };
Anahtar özellikler:
Sınıf üyelerinin başlatma sırasını yapıcı başlangıç listesi ile değiştirmek mümkün müdür?
Hayır! Sınıf üyeleri her zaman sınıfta tanımlandıkları sıraya göre başlatılır, başlangıç listesinde belirtilen sıraya göre değil. Bu kuralın göz ardı edilmesi başlatma sırası hatalarına yol açar.
Eğer referans üyesi başlangıç listesinde değil, sadece yapıcı gövdesinde başlatılırsa ne olur?
Derleme hatası! Referans, const alanlar gibi yalnızca başlangıç listesinde başlatılabilir — yapıcı gövdesine girmeden önce bir değer almalıdırlar.
Başlangıç listesinde const üye başlatıldıktan sonra onu yapıcı gövdesinde değiştirmek mümkün müdür?
Hayır, sabit bir üye başlatıldıktan sonra değiştirilemez — bu tür bir alanı değiştirme girişimi derleme hatasına yol açar.
Yapıcıda, sınıf üyesi yapıcı gövdesinin içinde başlatılıyor. Karmaşık nesneler için varsayılan yapıcı çağrısı, ardından atama ve nihayetinde geçici nesnenin imhası için kaynaklar harcanıyor.
Artılar:
Eksiler:
Tüm üyeler hemen başlangıç listesinde başlatılıyor, gereksiz işlemler ve değiştirilemez alanlarla ilgili sorunlar olmuyor.
Artılar:
Eksiler: