Edit. Sebenarnya, sementara apa yang saya katakan dalam jawaban pertama saya valid, ini adalah alasan sebenarnya .:
Pada awalnya ada C. C tidak berorientasi objek (Anda dapat mengambil pendekatan OO, tetapi tidak membantu Anda atau menegakkan apa pun).
Lalu ada C With Classes, yang kemudian dinamai C ++. C ++ berorientasi objek, dan karena itu mendorong enkapsulasi, dan memastikan invarian objek - setelah konstruksi dan pada awal dan akhir metode apa pun, objek berada dalam keadaan valid.
Hal alami yang harus dilakukan dengan ini, adalah untuk menegakkan bahwa kelas harus selalu memiliki konstruktor untuk memastikannya dimulai dalam keadaan yang valid - jika konstruktor tidak harus melakukan apa pun untuk memastikan ini, maka konstruktor kosong akan mendokumentasikan fakta ini .
Tetapi tujuan dengan C ++ adalah agar kompatibel dengan C sampai pada titik bahwa sebanyak mungkin, semua program C yang valid juga merupakan program C ++ yang valid (tidak lagi sebagai tujuan aktif, dan evolusi C terpisah ke C ++ berarti ia tidak lagi berlaku ).
Salah satu efek dari ini adalah duplikasi fungsi antara struct
dan class
. Yang pertama melakukan hal-hal dengan cara C (semuanya publik secara default) dan yang terakhir melakukan hal-hal dengan cara OO yang baik (semuanya pribadi secara default, pengembang secara aktif membuat publik apa yang mereka inginkan publik).
Lain adalah bahwa agar C struct
, yang tidak bisa memiliki konstruktor karena C tidak memiliki konstruktor, untuk valid dalam C ++, maka harus ada makna untuk ini kepada cara C ++ memandangnya. Jadi, sementara tidak memiliki konstruktor akan bertentangan dengan praktik OO untuk secara aktif memastikan invarian, C ++ menganggap ini berarti bahwa ada konstruktor tanpa parameter default yang bertindak seperti memiliki tubuh kosong.
Semua C structs
sekarang valid C ++ structs
, (yang berarti mereka sama dengan C ++ classes
dengan semuanya - anggota dan warisan - publik) diperlakukan dari luar seolah-olah ia memiliki konstruktor tunggal tanpa parameter.
Namun jika Anda memasukkan konstruktor ke dalam class
atau struct
, maka Anda melakukan hal-hal dengan cara C ++ / OO daripada cara C, dan tidak ada kebutuhan untuk konstruktor default.
Karena berfungsi sebagai singkatan, orang-orang terus menggunakannya bahkan ketika kompatibilitas tidak mungkin terjadi (menggunakan fitur C ++ lainnya yang tidak ada di C).
Oleh karena itu ketika Java muncul (berdasarkan C ++ dalam banyak hal) dan kemudian C # (berdasarkan C ++ dan Java dengan cara yang berbeda), mereka mempertahankan pendekatan ini karena sesuatu yang mungkin sudah digunakan oleh pembuat kode.
Stroustrup menulis tentang ini dalam Bahasa Pemrograman C ++ dan lebih dari itu, dengan lebih fokus pada "mengapa" bahasa dalam Desain dan Evolusi C ++ .
=== Jawaban Asli ===
Katakanlah ini tidak terjadi.
Katakanlah saya tidak ingin konstruktor tanpa parameter, karena saya tidak dapat membuat kelas saya menjadi keadaan yang bermakna tanpa satu. Memang, ini adalah sesuatu yang dapat terjadi dengan struct
di C # (tetapi jika Anda tidak dapat menggunakan semua-nol-dan-nulls yang berarti struct
di C # Anda paling baik menggunakan optimasi yang tidak terlihat oleh publik, dan jika tidak memiliki desain cacat dalam menggunakan struct
).
Untuk membuat kelas saya dapat melindungi invariannya, saya perlu removeDefaultConstructor
kata kunci khusus . Paling tidak, saya harus membuat konstruktor tanpa parameter pribadi untuk memastikan tidak ada kode panggilan yang memanggil default.
Yang menyulitkan bahasa lagi. Lebih baik tidak melakukannya.
Secara keseluruhan, lebih baik tidak menganggap menambahkan konstruktor sebagai menghapus default, lebih baik untuk berpikir tidak memiliki konstruktor sama sekali sebagai gula sintaksis untuk menambahkan konstruktor tanpa parameter yang tidak melakukan apa-apa.