Düzenle. Aslında, ilk cevabımda söylediğim şey geçerli olsa da, gerçek neden budur .:
Başlangıçta C vardı. Nesne yönelimli değil (bir OO yaklaşımı alabilirsin, ama sana yardım etmiyor ya da hiçbir şeyi zorlamıyor).
Sonra C With Classes vardı, daha sonra C ++ olarak yeniden adlandırıldı. C ++, nesne yönelimlidir ve bu nedenle kapsüllenmeyi teşvik eder ve bir nesnenin değişmez olmasını sağlar - inşaatta ve herhangi bir yöntemin başında ve sonunda, nesne geçerli bir durumdadır.
Bununla yapılacak doğal şey, bir sınıfın geçerli bir durumda başlamasını sağlamak için her zaman bir kurucuya sahip olması gerektiğini zorlamaktır - eğer kurucu bunu sağlamak için herhangi bir şey yapmak zorunda değilse, boş kurucu bu gerçeği belgeleyecektir .
Ancak C ++ ile bir hedef, mümkün olan tüm C programlarının da geçerli C ++ programları olduğu noktaya kadar C ile uyumlu olmaktı (artık aktif bir hedef olarak değil ve C ++ 'dan ayrı olarak C'nin evrimi, artık ).
Bunun bir etkisi arasındaki işlevsellik çoğaltma oldu struct
ve class
. Birincisi C yolunu (varsayılan olarak herkese açıktır) ve ikincisini iyi bir OO yolunda (varsayılan olarak özel olan her şey geliştirici herkese açık olarak kamusal olarak istediklerini yapar) yapar.
Bir diğeri, bir yapıcıya struct
sahip olamayan bir C'nin , C yapıcıları olmadığından, C ++ 'da geçerli olması için, C ++' a bakmanın bunun için bir anlamı olması gerektiğidir. Ve böylece, bir yapıcıya sahip olmamak, bir değişmezi aktif olarak sağlamak için OO uygulamasına karşı çıkarken, C ++ bunu, boş bir gövdeye sahip gibi davranan varsayılan parametresiz bir yapıcı olduğu anlamına geldi.
Tüm C structs
artık geçerli C ++ idi structs
(yani classes
her şey - üyeler ve miras - genel olan C ++ ile aynı oldukları anlamına geliyordu ) dışarıdan tek bir parametresiz yapıcıya sahipmiş gibi muamele gördü.
Bununla birlikte, bir yapıcıyı bir class
veya içine koyduysanız struct
, şeyleri C yolundan ziyade C ++ / OO yolunda yapıyordunuz ve varsayılan bir kurucuya gerek yoktu.
Bir stenografi görevi gördüğü için, uyumluluk mümkün olmadığında bile insanlar kullanmaya devam etti (C'de olmayan diğer C ++ özelliklerini kullandı).
Java (birçok yönden C ++ 'a dayanarak) ve daha sonra C # (farklı şekillerde C ++ ve Java'ya dayanarak) geldiğinde, bu yaklaşımı kodlayıcıların zaten alışkın olabileceği şekilde tuttular.
Stroustrup, C ++ Programlama Dili ve daha da fazlası , C ++ Tasarım ve Evrimi'ndeki dilin "nedenlerine" daha fazla odaklanarak bu konuda yazıyor .
=== Orijinal Cevap ===
Diyelim ki bu olmadı.
Diyelim ki parametresiz bir kurucu istemiyorum, çünkü sınıfımı bir tane olmadan anlamlı bir duruma sokamıyorum. Gerçekten de, bu struct
C # ' da gerçekleşebilecek bir şeydir (ancak C #' daki tüm sıfırlar ve sıfırlardan anlamlı bir şekilde yararlanamıyorsanız, struct
en iyi şekilde herkese görünür olmayan bir optimizasyon kullanırsınız ve aksi takdirde bir tasarım kusurunu kullanarak struct
).
Sınıfımın değişmezlerini koruyabilmesi için özel bir removeDefaultConstructor
anahtar kelimeye ihtiyacım var . En azından, hiçbir arama kodunun varsayılanı çağırmadığından emin olmak için özel bir parametresiz yapıcı oluşturmanız gerekir.
Bu da dili biraz daha zorlaştırıyor. Yapmamak daha iyi.
Sonuçta, bir kurucu eklemeyi varsayılanı kaldırmak olarak düşünmemek en iyisidir, hiçbir şey yapmayan parametresiz bir kurucu eklemek için hiçbir kurucu sözdizimsel şeker olarak düşünmemek daha iyidir.