ProgramlamaC++ geliştirici

C++'da varsayılan yapıcı (default constructor) nasıl çalışır? Eğer bir sınıfta hiçbir yapıcı tanımlanmazsa ya da diğer yapıcılar açıkça tanımlanırsa ama varsayılan yapıcı tanımlanmazsa ne olur?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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).

Kod Örneği

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) {} };

Kandırmaca Sorusu

«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.


Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


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.