C++11 standartından önce, farklı parametrelere sahip birden fazla konstrüktör yazmak gerektiğinde, her birinde başlatma kodunun tekrarı yapılması gerekiyordu, çünkü sınıfın içindeki başka bir konstrüktörü çağırma imkanı yoktu.
Zaten mevcut olan başlatma mantığını diğer konstrüktörlerde kullanamamak, kodun tekrarlanmasına ve başlatma mantığındaki değişikliklerde hatalara yol açıyordu: bir konstrüktörü güncellediğinizde, diğerlerini unutmak kolaydı.
C++11 ile birlikte, bir sınıfın bir konstrüktörünün, o sınıfın başka bir konstrüktörünü başlatma listesindeki sözdizimiyle çağırmasına olanak tanıyan "delegasyon konstrüktörleri" mekanizması geldi.
Kod örneği:
class Widget { public: Widget() : Widget(0, "default") {} Widget(int n) : Widget(n, "user") {} Widget(int n, std::string name) : size(n), label(name) {} private: int size; std::string label; };
Artık tüm ortak mantık bir "ana" konstrüktörde toplanmıştır ve diğerleri çağrıyı delegasyon ediyor.
Anahtar özellikler:
Başka bir konstrüktörü, konstrüktör gövdesi içindeki bir fonksiyonu çağırarak delegasyonla çağırmak mümkün mü?
Hayır. Başka bir konstrüktörü çağırmak yalnızca başlatma listesi aracılığıyla mümkündür, konstrüktör gövdesi içinde değil. Eğer fonksiyonu konstrüktör gövdesinden çağırırsanız, nesne üyeleri zaten başlatılmış olacaktır.
Konstrüktörler arasında bir "döngü" delegasyonu oluşturulursa ne olur?
Döngüsel delegasyon (örneğin, A, B'ye; B ise A'ya delegasyon yapıyorsa) C++ derleme hatasına yol açar: Konstrüktörler arasında sonsuz özyineleme olamaz.
Bir türetilmiş sınıfın delegasyon konstrüktörü ile temel sınıfın konstrüktörünü çağırmak mümkün mü?
Hayır. Delegasyon konstrüktörleri yalnızca bir sınıfın içinde çalışır. Temel konstrüktörü çağırmak için ayrı bir sözdizimi kullanılır:
class Base { public: Base(int) {} }; class Derived : public Base { public: Derived() : Base(42) {} };
Üç konstrüktör, her biri açıkça alanları başlatır, mantık senkronize değildir — yalnızca bir konstrüktörde değişiklik adımına girin, diğer ikisi hatalıdır.
Artılar:
Eksiler:
Bir ana konstrüktör, diğerleri ona delegasyon yapar, tüm başlatma mantığı merkezileştirilmiştir.
Artılar:
Eksiler: