C++'da varsayılan yapıcı, parametre almayan veya tümü varsayılan değerleri olan parametrelerle tanımlanan bir yapıcıdır. Eğer bir sınıfta hiçbir yapıcı tanımlanmamışsa, derleyici otomatik olarak public varsayılan yapıcı üretecektir. Ancak, eğer en az bir farklı yapıcı (örneğin, parametreli bir yapıcı) tanımlanmışsa, derleyici tarafından otomatik olarak sağlanan varsayılan yapıcı artık üretilmeyecektir. Böyle bir sınıfta varsayılan yapıcıya ihtiyaç duyulursa, açıkça tanımlanması gerekir (örneğin, ClassName() = default; kullanarak).
class Foo { public: Foo(int x) {} // Kullanıcı tanımlı yapıcı // Artık derleyici varsayılan Foo() üretmeyecek! }; Foo f; // Derleme hatası — varsayılan yapıcı yok!
Varsayılan yapıcıyı açıkça oluşturmak için:
class Foo { public: Foo() = default; Foo(int x) {} };
«Eğer yalnızca bir parametreli yapıcı varsa, bu sınıfın nesnelerini parametre olmadan oluşturmak mümkün mü? Neden?»
Cevap: Hayır! Çünkü, eğer herhangi bir yapıcı tanımlanmışsa, derleyici otomatik olarak varsayılan yapıcı eklemiyor. Parametresiz nesne oluşturmak için varsayılan yapıcıyı tanımak gerekir.
Hikaye
Büyük bir projede veri seri hale getirme için bir sınıf hiyerarşisi yazılmıştı, burada tüm “alt” sınıfların yalnızca özel bir parametreli yapıcıları vardı. Yeniden yapılandırma sırasında, bu sınıflarla STL konteynerlerini (örneğin, std::vector) kullanırken hata alındı: konteynerin varsayılan yapıcıya ihtiyacı vardı, ancak bu yoktu. Sorun sadece varsayılan yapıcının açıkça tanımlanmasıyla çözüldü.
Hikaye
Şablon kullanımıyla bir projede, bir adaptör sınıfı kaynakları iletmek için yalnızca parametreli yapıcıyı tanımladı. Ancak, bir kütüphane düzgün çalışması için varsayılan yapıcıya ihtiyaç duyuyordu (şablon türleri üzerinden geçici nesneler yaratıyordu). Açıklanamayan gizemli bağlantı hataları ortaya çıktı, ta ki varsayılan yapıcı açıkça tanımlanana kadar.
Hikaye
Kodda C++98'den C++11'e geçiş sırasında, varsayılan yapıcıyı açıkça tanımlamak için “= default” kullanılmaya çalışıldı. Eski derleyicilerde hatalar verildi veya yeni sözdizim yapıları göz ardı edildi. Bu durum, tüm geliştiricilerin açıkça tanımlanmış varsayılan yapıcı, derleyici tarafından üretilen yapıcı ve yeni “= default” sözdizimi arasındaki farkı anlamadıklarını ortaya koydu.